vercel 60.1.1 → 61.0.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 (133) hide show
  1. package/dist/chunks/{add-D6D2J6ID.js → add-I5N2DAIP.js} +1 -1
  2. package/dist/chunks/{add-QBCRXMR3.js → add-KKZS2KRG.js} +1 -1
  3. package/dist/chunks/{add-JKIDAH7K.js → add-NLTAYU5Z.js} +1 -1
  4. package/dist/chunks/{build-PP4JOW2C.js → build-V6DQKDOO.js} +1 -1
  5. package/dist/chunks/chunk-23NBYS6R.js +36 -0
  6. package/dist/chunks/{chunk-C6QYMZ3S.js → chunk-2JRC4QJO.js} +1 -1
  7. package/dist/chunks/{chunk-H4IUDU5W.js → chunk-2VAKGA3F.js} +1 -1
  8. package/dist/chunks/{chunk-77WAICTF.js → chunk-2XUWYQ5P.js} +1 -1
  9. package/dist/chunks/{chunk-YMLWTVT5.js → chunk-4GA73K74.js} +1 -1
  10. package/dist/chunks/{chunk-3KQRJYBJ.js → chunk-4KJZA5JH.js} +1 -1
  11. package/dist/chunks/{chunk-LNOX5GIA.js → chunk-57DOAKMY.js} +1 -1
  12. package/dist/chunks/{chunk-CD4FLZED.js → chunk-5BQ25PMQ.js} +1 -1
  13. package/dist/chunks/{chunk-KOOED3TJ.js → chunk-6FHZ2IVO.js} +2 -2
  14. package/dist/chunks/{chunk-YG6LPJFT.js → chunk-7QVVD3WT.js} +1 -1
  15. package/dist/chunks/{chunk-2TBUMUHF.js → chunk-BFHLAM7O.js} +1 -1
  16. package/dist/chunks/{chunk-VVWALKUM.js → chunk-BN3XAVPG.js} +1 -1
  17. package/dist/chunks/{chunk-JMNAVONO.js → chunk-DT3EUC6S.js} +2 -2
  18. package/dist/chunks/{chunk-WUH5HYCX.js → chunk-EMDAZAWN.js} +1 -1
  19. package/dist/chunks/{chunk-KTB75ID3.js → chunk-FYRK4GX7.js} +1 -1
  20. package/dist/chunks/{chunk-ZWYU5SBC.js → chunk-GBWSLOL5.js} +1 -1
  21. package/dist/chunks/chunk-GIIG5KNF.js +7 -0
  22. package/dist/chunks/{chunk-SGU7YIY3.js → chunk-HQZXUIZY.js} +1 -1
  23. package/dist/chunks/chunk-IMN3Z3VV.js +9 -0
  24. package/dist/chunks/{chunk-STO2JRII.js → chunk-JS5WLQ6E.js} +1 -1
  25. package/dist/chunks/{chunk-7JAKGIQ6.js → chunk-KEVHEKQZ.js} +1 -1
  26. package/dist/chunks/{chunk-RB3NPNPD.js → chunk-KRQNSFGI.js} +1 -1
  27. package/dist/chunks/{chunk-M6UYGRPW.js → chunk-OEICO6OI.js} +1 -1
  28. package/dist/chunks/{chunk-IXN5A5WZ.js → chunk-OTP26MC7.js} +1 -1
  29. package/dist/chunks/{chunk-Q5VLP2LY.js → chunk-OVOQNHSJ.js} +1 -1
  30. package/dist/chunks/{chunk-G77TCKNI.js → chunk-P33CQ5CD.js} +1 -1
  31. package/dist/chunks/{chunk-TTMLSKF7.js → chunk-Q5CKKVCX.js} +1 -1
  32. package/dist/chunks/{chunk-LUVIR6F2.js → chunk-QFXHS36S.js} +1 -1
  33. package/dist/chunks/{chunk-URI72S7J.js → chunk-RAQCLWCR.js} +1 -1
  34. package/dist/chunks/{chunk-GK5C5TE5.js → chunk-RBJ4IMRF.js} +1 -1
  35. package/dist/chunks/{chunk-4OKKSZVX.js → chunk-ROQLVSZT.js} +1 -1
  36. package/dist/chunks/{chunk-3CQQXHDI.js → chunk-S3ZJ6ZBN.js} +1 -1
  37. package/dist/chunks/{chunk-GZBSABCA.js → chunk-SCNNUBUE.js} +1 -1
  38. package/dist/chunks/{chunk-7HT5KIFA.js → chunk-SIRSBEOT.js} +1 -1
  39. package/dist/chunks/{chunk-4S6WFNRF.js → chunk-SZJLH6TE.js} +2 -2
  40. package/dist/chunks/{chunk-MSLHCYBD.js → chunk-TB4CAJ7K.js} +2 -2
  41. package/dist/chunks/{chunk-6A6LV2S2.js → chunk-TDR4D3EL.js} +3 -3
  42. package/dist/chunks/{chunk-RLCFE3MK.js → chunk-TKNV5ONT.js} +3 -3
  43. package/dist/chunks/{chunk-H4FTGLWV.js → chunk-USSZAG2L.js} +1 -1
  44. package/dist/chunks/chunk-W26LLGQV.js +7 -0
  45. package/dist/chunks/{chunk-WH6M54KF.js → chunk-WOFE2X43.js} +3 -3
  46. package/dist/chunks/{chunk-HMB4MZOB.js → chunk-XF4GWZT2.js} +1 -1
  47. package/dist/chunks/{chunk-2ZIWDSUX.js → chunk-Y7TY3VO2.js} +3 -3
  48. package/dist/chunks/{chunk-CVKB54WW.js → chunk-YBXO6YRZ.js} +1 -1
  49. package/dist/chunks/{chunk-DPH3CQXE.js → chunk-YTUFUBDL.js} +7 -5
  50. package/dist/chunks/{clear-TQFWNYKK.js → clear-FP53TC7K.js} +1 -1
  51. package/dist/chunks/{compile-vercel-config-YY3CODZP.js → compile-vercel-config-EVBLB7VS.js} +1 -1
  52. package/dist/chunks/{config-4FCRR7C5.js → config-5Q37O5JW.js} +1 -1
  53. package/dist/chunks/{config-VZQLRHHA.js → config-L2HMQKZN.js} +1 -1
  54. package/dist/chunks/config-validator.mjs +1 -1
  55. package/dist/chunks/{delete-L45TA4WK.js → delete-F75LDVGB.js} +1 -1
  56. package/dist/chunks/{delete-MPLEIGYN.js → delete-UAJRL4OB.js} +1 -1
  57. package/dist/chunks/{detect-projects-3AFQ2AC5.js → detect-projects-325QE23N.js} +1 -1
  58. package/dist/chunks/{detect-services-7QL6RPKV.js → detect-services-XZEOFBIS.js} +1 -1
  59. package/dist/chunks/{disable-WY6N4R7I.js → disable-F22ULQBR.js} +1 -1
  60. package/dist/chunks/{discard-3VYFSUTH.js → discard-RTIHE562.js} +1 -1
  61. package/dist/chunks/{edit-FCPWK252.js → edit-A2YLMFJY.js} +1 -1
  62. package/dist/chunks/{edit-VOZ4IKZI.js → edit-OQYEMSTW.js} +1 -1
  63. package/dist/chunks/{enable-IJ7UEQ3G.js → enable-PQE7IYLJ.js} +1 -1
  64. package/dist/chunks/{export-L4D4GCJI.js → export-MXCHIXRP.js} +1 -1
  65. package/dist/chunks/{future-IGDV62BF.js → future-EJDVAUMH.js} +1 -1
  66. package/dist/chunks/{generate-cert-for-deploy-GSWBCLZX.js → generate-cert-for-deploy-CORREIMU.js} +1 -1
  67. package/dist/chunks/{image-ORGBK7MR.js → image-IWWMC6OL.js} +1 -1
  68. package/dist/chunks/{import-builders-N4XIYEW5.js → import-builders-ZBNF3EDI.js} +1 -1
  69. package/dist/chunks/{inspect-F4OENUQT.js → inspect-BRSK7FWE.js} +1 -1
  70. package/dist/chunks/{inspect-GTALMRKE.js → inspect-CQAFY6OA.js} +1 -1
  71. package/dist/chunks/{inspect-V6IX3MOJ.js → inspect-L6XPIN4I.js} +1 -1
  72. package/dist/chunks/{inspect-377IAEIY.js → inspect-PCDAOGYE.js} +1 -1
  73. package/dist/chunks/{inspect-2EMBEQHZ.js → inspect-QPEB2PYJ.js} +1 -1
  74. package/dist/chunks/{list-57XWFXDW.js → list-HBPNOZ36.js} +1 -1
  75. package/dist/chunks/{list-GKXJQRX6.js → list-MHFZCZLT.js} +1 -1
  76. package/dist/chunks/{list-5ZBTU324.js → list-UNOHMSYJ.js} +1 -1
  77. package/dist/chunks/{login-MQXAAFBP.js → login-4RTE52M4.js} +1 -1
  78. package/dist/chunks/{login-X3KPMMEP.js → login-GZEBYAAZ.js} +1 -1
  79. package/dist/chunks/{logs-ZYELN5F2.js → logs-OCIAVVYS.js} +1 -1
  80. package/dist/chunks/{ls-AAU7AKS7.js → ls-4IBSWNBN.js} +1 -1
  81. package/dist/chunks/{ls-LMHRMNKE.js → ls-CDMZQWTZ.js} +1 -1
  82. package/dist/chunks/{ls-POKSXYZU.js → ls-CR7MEDCH.js} +1 -1
  83. package/dist/chunks/{ls-ADATML6R.js → ls-GCIPXWXQ.js} +1 -1
  84. package/dist/chunks/{ls-VYEJT272.js → ls-KYR3NKYY.js} +1 -1
  85. package/dist/chunks/{ls-GD6LB7IE.js → ls-MZV54WLV.js} +1 -1
  86. package/dist/chunks/{ls-NX3EMRFH.js → ls-XI2PIZR4.js} +1 -1
  87. package/dist/chunks/{mutate-QMU5QHF3.js → mutate-KROV5RBJ.js} +1 -1
  88. package/dist/chunks/{notifications-OYUKYMU7.js → notifications-5CF5744G.js} +1 -1
  89. package/dist/chunks/{open-SNN3JPON.js → open-JSSJIIAC.js} +1 -1
  90. package/dist/chunks/{openapi-7JUPKBWV.js → openapi-SEMT6PBJ.js} +1 -1
  91. package/dist/chunks/{permissions-5LSKNTW7.js → permissions-OIMJWVL6.js} +1 -1
  92. package/dist/chunks/{prompt-missing-credentials-PPUSNDNC.js → prompt-missing-credentials-QCUYKCHH.js} +1 -1
  93. package/dist/chunks/{publish-FIHJARRJ.js → publish-LY3THAIP.js} +1 -1
  94. package/dist/chunks/{pull-2M2BJYAS.js → pull-CULSXHFY.js} +1 -1
  95. package/dist/chunks/{purchase-domain-if-available-VKWKDDUD.js → purchase-domain-if-available-FFNNBECE.js} +1 -1
  96. package/dist/chunks/{push-VN6BPT3B.js → push-YEQRRX7B.js} +1 -1
  97. package/dist/chunks/{query-P35ZTMXV.js → query-IRNHCI3O.js} +1 -1
  98. package/dist/chunks/{reauthenticate-DIFJZWC5.js → reauthenticate-7HYVS7DU.js} +1 -1
  99. package/dist/chunks/{reorder-L4L2V3MZ.js → reorder-DSBV4PC7.js} +1 -1
  100. package/dist/chunks/{reply-XIJ54B7U.js → reply-WEUR5QKT.js} +1 -1
  101. package/dist/chunks/{resolve-W2O6M4GH.js → resolve-KEPX7J5A.js} +1 -1
  102. package/dist/chunks/{resolve-deployment-framework-preset-XF3NJIDS.js → resolve-deployment-framework-preset-QEPJNWVF.js} +1 -1
  103. package/dist/chunks/{restore-OZPJHXTE.js → restore-YW2G6UVL.js} +1 -1
  104. package/dist/chunks/{rm-2YDLXDCB.js → rm-6TV3ABUA.js} +1 -1
  105. package/dist/chunks/{rm-OYSWVVSJ.js → rm-CYZTYWOW.js} +1 -1
  106. package/dist/chunks/{rm-HM7V26WX.js → rm-NUUHW6XI.js} +1 -1
  107. package/dist/chunks/{rm-4EUHQZ7U.js → rm-RJ7FOO54.js} +1 -1
  108. package/dist/chunks/{rm-IM7VAVCG.js → rm-TP5O3DFW.js} +1 -1
  109. package/dist/chunks/{rule-inspect-75RUPIVB.js → rule-inspect-OVUBNDW6.js} +1 -1
  110. package/dist/chunks/{rules-PKOTTFKG.js → rules-B2XF44SN.js} +1 -1
  111. package/dist/chunks/{schema-NJC47D5M.js → schema-5XTHUY2F.js} +1 -1
  112. package/dist/chunks/{schema-EPUGS3PX.js → schema-O7WKXTFS.js} +1 -1
  113. package/dist/chunks/{set-GESKJPQA.js → set-JQ5LDT2W.js} +1 -1
  114. package/dist/chunks/{setup-and-link-PM46H7GU.js → setup-and-link-NEEWO4NE.js} +1 -1
  115. package/dist/chunks/{tags-MBJR7IQW.js → tags-M6DJBEV4.js} +1 -1
  116. package/dist/chunks/{types-UYIFBCCL.js → types-F6SLL27E.js} +1 -1
  117. package/dist/chunks/{update-TNUYPCS3.js → update-YP44NRTW.js} +1 -1
  118. package/dist/chunks/vlt-builder-importer-W63QEXYX.js +11 -0
  119. package/dist/commands/build/index.js +1 -1
  120. package/dist/commands/deploy/index.js +9 -9
  121. package/dist/commands/dev/index.js +5 -5
  122. package/dist/commands/env/index.js +1 -1
  123. package/dist/commands/link/index.js +1 -1
  124. package/dist/commands/list/index.js +1 -1
  125. package/dist/commands-bulk.js +41 -31
  126. package/dist/index.js +2 -2
  127. package/dist/version.mjs +1 -1
  128. package/package.json +59 -59
  129. package/dist/chunks/chunk-6PFC3KWQ.js +0 -7
  130. package/dist/chunks/chunk-KK4AJES5.js +0 -36
  131. package/dist/chunks/chunk-N5AIKGEO.js +0 -9
  132. package/dist/chunks/chunk-VHTNAYWA.js +0 -7
  133. package/dist/chunks/vlt-builder-importer-6DGKK72W.js +0 -11
@@ -4,7 +4,7 @@ import { dirname as __dirname_ } from 'node:path';
4
4
  const require = __createRequire(import.meta.url);
5
5
  const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __dirname_(__filename);
7
- import{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope}from"./chunks/chunk-2TBUMUHF.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-3RV2B7D3.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-2R6NQXTQ.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-6OI6SRHZ.js";import{ALL_ACTION_CHOICES,MAX_CONDITIONS,MAX_DESCRIPTION_LENGTH,MAX_NAME_LENGTH,REDIRECT_STATUS_CODES,VALID_SYNTAXES,collectActionDetails,collectHeadersAndTransforms,collectInteractiveConditions,convertRouteToCurrentRoute,extractTransformFlags,generateRoute,generatedRouteToAddInput,parseConditions,populateRouteEnv,printGeneratedRoutePreview,runInteractiveEditLoop,stripQuotes,validateActionFlags}from"./chunks/chunk-CD4FLZED.js";import{getRouteVersions}from"./chunks/chunk-BVH2AEFE.js";import{TRANSFORM_TYPE_LABELS,findVersionById,formatCondition,formatTransform,getRouteTypeLabel,getRoutes,getSrcSyntaxLabel,isTargetTransform,offerAutoPromote,parsePosition,parseSubcommandArgs,parseSubcommandArguments,requireProjectContext,validateRequiredArguments,withGlobalFlags as withGlobalFlags2}from"./chunks/chunk-SGU7YIY3.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-6PFC3KWQ.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs}from"./chunks/chunk-G77TCKNI.js";import{require_format}from"./chunks/chunk-WRILLB46.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-LUVIR6F2.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-77WAICTF.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-FA6O7FPC.js";import{api,tryOpenApiFallback}from"./chunks/chunk-WH6M54KF.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-TTMLSKF7.js";import{dump,load,main}from"./chunks/chunk-7HT5KIFA.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-4MZK6JT6.js";import{selectOrg}from"./chunks/chunk-3B4P7YHO.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeNativeSelfUpdate,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-2ZIWDSUX.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-AP36GAOG.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-Q5VLP2LY.js";import{require_semver}from"./chunks/chunk-KKS7XWEX.js";import{readJSONFile}from"./chunks/chunk-LNOX5GIA.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-DPH3CQXE.js";import"./chunks/chunk-IXN5A5WZ.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-XQQGQ55A.js";import"./chunks/chunk-2H77IRPI.js";import{require_dist as require_dist3}from"./chunks/chunk-MSLHCYBD.js";import"./chunks/chunk-OHDEHZLX.js";import"./chunks/chunk-M2W3HKV3.js";import"./chunks/chunk-PHW54NU5.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-6A6LV2S2.js";import"./chunks/chunk-TRTEXGVN.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-T52FMXWC.js";import"./chunks/chunk-V6MR45PD.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-COQGD2EI.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-ZDX75YNZ.js";import{formatTable,strlen}from"./chunks/chunk-UED2PPFP.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-MBL6TXEJ.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-MKY5IBKK.js";import{require_execa}from"./chunks/chunk-HWWHR7H3.js";import{isGuidanceEnabled}from"./chunks/chunk-DQ2KI6FO.js";import{stamp_default}from"./chunks/chunk-XPXOV5UO.js";import"./chunks/chunk-2I64AYHG.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ZXE4XYIV.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-LQBC5QPO.js";import{validateLsArgs}from"./chunks/chunk-Z4VR6CQ2.js";import{elapsed}from"./chunks/chunk-JZRMH5UA.js";import{require_ms}from"./chunks/chunk-QTKJC2O5.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{require_dist2}from"./chunks/chunk-JMNAVONO.js";import"./chunks/chunk-3KQRJYBJ.js";import"./chunks/chunk-P2O5DOYE.js";import"./chunks/chunk-L3JDEHCQ.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-M6UYGRPW.js";import{resolveProjectContext}from"./chunks/chunk-ZWYU5SBC.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-H4FTGLWV.js";import{require_open}from"./chunks/chunk-ULLWCOYC.js";import"./chunks/chunk-N6CNMMSZ.js";import{getTeams}from"./chunks/chunk-I46LFJJG.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-OI263FBO.js";import{ensureLink}from"./chunks/chunk-STO2JRII.js";import"./chunks/chunk-GK5C5TE5.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS}from"./chunks/chunk-WUH5HYCX.js";import{require_frameworks}from"./chunks/chunk-KK4AJES5.js";import{CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,PROJECT_GRANT_POLICY_KIND,PROJECT_MEMBER_ROLES,STORAGE_PROVIDERS,SUPPORTED_ADDON_NAMES,SUPPORTED_CREDIT_TYPES,abortSubcommand,acceptTermsSubcommand,accessGroupsSubcommand,accessSummarySubcommand,activateKeySubcommand,addGrantSubcommand,addKeySubcommand,addSubcommand,addSubcommand10 as addSubcommand9,addSubcommand11,addSubcommand12,addSubcommand2,addSubcommand3,addSubcommand4,addSubcommand5,addSubcommand6,addSubcommand7,addSubcommand9 as addSubcommand8,addToGroupSubcommand,addonSubcommand,agentCommand,agentRunsCommand,aiGatewayCommand,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,aliasCommand,analyzeSubcommand,apiKeysSubcommand,approveSubcommand,archiveSubcommand,attachSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,autoRenewSubcommand,autoupdateSubcommand,backupsSubcommand,balanceSubcommand,bisectCommand,blobCommand,botManagementSubcommand,budgetCommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buildersCommand,buyCommand,buySubcommand,cacheCommand,categoriesSubcommand,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand14,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand5,inspectSubcommand4 as inspectSubcommand6,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand20,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand26,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand7,listSubcommand6 as listSubcommand8,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-KOOED3TJ.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-DKV4IVH5.js";import{tracesConfigCommand}from"./chunks/chunk-IVWPQYIH.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand25,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-65JYSI26.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-YMVDWVMO.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-O7G3CZ42.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-N3N5UHIL.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-WUZD4KBL.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand12,listSubcommand as listSubcommand19,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QFPCR4NL.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand4,listSubcommand as listSubcommand6,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-5ENY7DSN.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-UTVDFSQS.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-SW7MNF4H.js";import{logsCommand}from"./chunks/chunk-MEAY2K5Z.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-EQ52F4LH.js";import"./chunks/chunk-CVKB54WW.js";import"./chunks/chunk-JKTQV2QJ.js";import"./chunks/chunk-Y7PHTVZ6.js";import"./chunks/chunk-WSZHNPA6.js";import"./chunks/chunk-FAW6NBLQ.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-5UOVEMYX.js";import"./chunks/chunk-SOJCELXH.js";import{param}from"./chunks/chunk-SXUEGVWB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-6BZCSVH6.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-5U25FWD5.js";import{table}from"./chunks/chunk-6TAQ6OWD.js";import"./chunks/chunk-R3B67TKQ.js";import{getDeployment,toHost}from"./chunks/chunk-C5KVTG2O.js";import{mapCertError}from"./chunks/chunk-6NPXWN5F.js";import"./chunks/chunk-WPS6JZF6.js";import"./chunks/chunk-ZKYS7EAB.js";import{detectExplicitScope,getScope,persistAuthConfig,readLocalConfig,writeToConfigFile}from"./chunks/chunk-4OKKSZVX.js";import{getGlobalPathConfig}from"./chunks/chunk-JSKGZLE4.js";import{TelemetryClient}from"./chunks/chunk-A5VLP25I.js";import"./chunks/chunk-RCTYVKM5.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-7T6TL3GQ.js";import"./chunks/chunk-GHM7V3GG.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-5XJNPXQK.js";import{printError}from"./chunks/chunk-N5AIKGEO.js";import{parseArguments}from"./chunks/chunk-WWB66KP5.js";import{fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{VERCEL_CONFIG_EXTENSIONS,getGitConfigPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-RLCFE3MK.js";import"./chunks/chunk-F2ZWW2IO.js";import"./chunks/chunk-B4ATVYZW.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import"./chunks/chunk-BRK4OB4B.js";import{require_strip_ansi}from"./chunks/chunk-OSCCYU74.js";import{argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,exitWithNonInteractiveError,mentionsObservabilityPlus,observabilityPlusPurchaseFix,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeAgentError}from"./chunks/chunk-KCARCOP5.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,stripSensitiveAuthArgs}from"./chunks/chunk-JAJW3P42.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-YMM3VY3J.js";import{getUser}from"./chunks/chunk-SM5JI6QM.js";import{getTeamByIdOrSlug}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPurchasePending,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-RINZXCDJ.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-FI772UVH.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-EWWFNMPZ.js";import{require_dist}from"./chunks/chunk-QGIQK47P.js";import{pkg_default}from"./chunks/chunk-AVSPFBLM.js";import"./chunks/chunk-XCJDGQO7.js";import"./chunks/chunk-YPTLSODC.js";import"./chunks/chunk-7HL2RPUO.js";import{require_source}from"./chunks/chunk-U7KCDTCH.js";import"./chunks/chunk-N3ZZ7FHQ.js";import"./chunks/chunk-GU6VIFR5.js";import{__require,__toESM}from"./chunks/chunk-6L236MNA.js";var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
7
+ import{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope}from"./chunks/chunk-BFHLAM7O.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-3RV2B7D3.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-2R6NQXTQ.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-6OI6SRHZ.js";import{ALL_ACTION_CHOICES,MAX_CONDITIONS,MAX_DESCRIPTION_LENGTH,MAX_NAME_LENGTH,REDIRECT_STATUS_CODES,VALID_SYNTAXES,collectActionDetails,collectHeadersAndTransforms,collectInteractiveConditions,convertRouteToCurrentRoute,extractTransformFlags,generateRoute,generatedRouteToAddInput,parseConditions,populateRouteEnv,printGeneratedRoutePreview,runInteractiveEditLoop,stripQuotes,validateActionFlags}from"./chunks/chunk-5BQ25PMQ.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-HQZXUIZY.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-W26LLGQV.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs}from"./chunks/chunk-P33CQ5CD.js";import{require_format}from"./chunks/chunk-WRILLB46.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-QFXHS36S.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-2XUWYQ5P.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-FA6O7FPC.js";import{api,tryOpenApiFallback}from"./chunks/chunk-WOFE2X43.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-Q5CKKVCX.js";import{dump,load,main}from"./chunks/chunk-SIRSBEOT.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-4MZK6JT6.js";import{selectOrg}from"./chunks/chunk-3B4P7YHO.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readActivePointer,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-Y7TY3VO2.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-AP36GAOG.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-OVOQNHSJ.js";import{require_semver}from"./chunks/chunk-KKS7XWEX.js";import{readJSONFile}from"./chunks/chunk-57DOAKMY.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-YTUFUBDL.js";import"./chunks/chunk-OTP26MC7.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-XQQGQ55A.js";import"./chunks/chunk-2H77IRPI.js";import{require_dist as require_dist3}from"./chunks/chunk-TB4CAJ7K.js";import"./chunks/chunk-OHDEHZLX.js";import"./chunks/chunk-M2W3HKV3.js";import"./chunks/chunk-PHW54NU5.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-TDR4D3EL.js";import"./chunks/chunk-TRTEXGVN.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-T52FMXWC.js";import"./chunks/chunk-V6MR45PD.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-COQGD2EI.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-ZDX75YNZ.js";import{formatTable,strlen}from"./chunks/chunk-UED2PPFP.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-MBL6TXEJ.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-MKY5IBKK.js";import{require_execa}from"./chunks/chunk-HWWHR7H3.js";import{isGuidanceEnabled}from"./chunks/chunk-DQ2KI6FO.js";import{stamp_default}from"./chunks/chunk-XPXOV5UO.js";import"./chunks/chunk-2I64AYHG.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ZXE4XYIV.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-LQBC5QPO.js";import{validateLsArgs}from"./chunks/chunk-Z4VR6CQ2.js";import{elapsed}from"./chunks/chunk-JZRMH5UA.js";import{require_ms}from"./chunks/chunk-QTKJC2O5.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{require_dist2}from"./chunks/chunk-DT3EUC6S.js";import"./chunks/chunk-4KJZA5JH.js";import"./chunks/chunk-P2O5DOYE.js";import"./chunks/chunk-L3JDEHCQ.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-OEICO6OI.js";import{resolveProjectContext}from"./chunks/chunk-GBWSLOL5.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-USSZAG2L.js";import{require_open}from"./chunks/chunk-ULLWCOYC.js";import"./chunks/chunk-N6CNMMSZ.js";import{getTeams}from"./chunks/chunk-I46LFJJG.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-OI263FBO.js";import{ensureLink}from"./chunks/chunk-JS5WLQ6E.js";import"./chunks/chunk-RBJ4IMRF.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS}from"./chunks/chunk-EMDAZAWN.js";import{require_frameworks}from"./chunks/chunk-23NBYS6R.js";import{CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,PROJECT_GRANT_POLICY_KIND,PROJECT_MEMBER_ROLES,STORAGE_PROVIDERS,SUPPORTED_ADDON_NAMES,SUPPORTED_CREDIT_TYPES,abortSubcommand,acceptTermsSubcommand,accessGroupsSubcommand,accessSummarySubcommand,activateKeySubcommand,addGrantSubcommand,addKeySubcommand,addSubcommand,addSubcommand10 as addSubcommand9,addSubcommand11,addSubcommand12,addSubcommand2,addSubcommand3,addSubcommand4,addSubcommand5,addSubcommand6,addSubcommand7,addSubcommand9 as addSubcommand8,addToGroupSubcommand,addonSubcommand,agentCommand,agentRunsCommand,aiGatewayCommand,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,aliasCommand,analyzeSubcommand,apiKeysSubcommand,approveSubcommand,archiveSubcommand,attachSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,autoRenewSubcommand,autoupdateSubcommand,backupsSubcommand,balanceSubcommand,bisectCommand,blobCommand,botManagementSubcommand,budgetCommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buildersCommand,buyCommand,buySubcommand,cacheCommand,categoriesSubcommand,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand14,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand5,inspectSubcommand4 as inspectSubcommand6,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand20,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand26,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand7,listSubcommand6 as listSubcommand8,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-6FHZ2IVO.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-DKV4IVH5.js";import{tracesConfigCommand}from"./chunks/chunk-IVWPQYIH.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand25,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-65JYSI26.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-YMVDWVMO.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-O7G3CZ42.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-N3N5UHIL.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-WUZD4KBL.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand12,listSubcommand as listSubcommand19,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QFPCR4NL.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand4,listSubcommand as listSubcommand6,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-5ENY7DSN.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-UTVDFSQS.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-SW7MNF4H.js";import{logsCommand}from"./chunks/chunk-MEAY2K5Z.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-EQ52F4LH.js";import"./chunks/chunk-YBXO6YRZ.js";import"./chunks/chunk-JKTQV2QJ.js";import"./chunks/chunk-Y7PHTVZ6.js";import"./chunks/chunk-WSZHNPA6.js";import"./chunks/chunk-FAW6NBLQ.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-5UOVEMYX.js";import"./chunks/chunk-SOJCELXH.js";import{param}from"./chunks/chunk-SXUEGVWB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-6BZCSVH6.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-5U25FWD5.js";import{table}from"./chunks/chunk-6TAQ6OWD.js";import"./chunks/chunk-R3B67TKQ.js";import{getDeployment,toHost}from"./chunks/chunk-C5KVTG2O.js";import{mapCertError}from"./chunks/chunk-6NPXWN5F.js";import"./chunks/chunk-WPS6JZF6.js";import"./chunks/chunk-ZKYS7EAB.js";import{detectExplicitScope,getScope,persistAuthConfig,readLocalConfig,writeToConfigFile}from"./chunks/chunk-ROQLVSZT.js";import{getGlobalPathConfig}from"./chunks/chunk-JSKGZLE4.js";import{TelemetryClient}from"./chunks/chunk-A5VLP25I.js";import"./chunks/chunk-RCTYVKM5.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-7T6TL3GQ.js";import"./chunks/chunk-GHM7V3GG.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-5XJNPXQK.js";import{printError}from"./chunks/chunk-IMN3Z3VV.js";import{parseArguments}from"./chunks/chunk-WWB66KP5.js";import{fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{VERCEL_CONFIG_EXTENSIONS,getGitConfigPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-TKNV5ONT.js";import"./chunks/chunk-F2ZWW2IO.js";import"./chunks/chunk-B4ATVYZW.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import"./chunks/chunk-BRK4OB4B.js";import{require_strip_ansi}from"./chunks/chunk-OSCCYU74.js";import{argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,exitWithNonInteractiveError,mentionsObservabilityPlus,observabilityPlusPurchaseFix,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeAgentError}from"./chunks/chunk-KCARCOP5.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,stripSensitiveAuthArgs}from"./chunks/chunk-JAJW3P42.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-YMM3VY3J.js";import{getUser}from"./chunks/chunk-SM5JI6QM.js";import{getTeamByIdOrSlug}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPurchasePending,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-RINZXCDJ.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-FI772UVH.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-EWWFNMPZ.js";import{require_dist}from"./chunks/chunk-QGIQK47P.js";import{pkg_default}from"./chunks/chunk-AVSPFBLM.js";import"./chunks/chunk-XCJDGQO7.js";import"./chunks/chunk-YPTLSODC.js";import"./chunks/chunk-7HL2RPUO.js";import{require_source}from"./chunks/chunk-U7KCDTCH.js";import"./chunks/chunk-N3ZZ7FHQ.js";import"./chunks/chunk-GU6VIFR5.js";import{__require,__toESM}from"./chunks/chunk-6L236MNA.js";var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
8
8
 
9
9
  These defaults are optimized for AI coding agents (and humans) working on apps that deploy to Vercel.
10
10
 
@@ -55,7 +55,7 @@ ${table(subagentRows,{hsep:3})}`)}return`${sections.join(`
55
55
  `),0;let projectList=asArray(data.projects??data.items);if(projectList.length===0)return output_manager_default.log("No projects with Agent Runs activity found."),0;output_manager_default.log(`Projects with Agent Runs under ${import_chalk5.default.bold(scope.contextName)} ${fetchStamp()}`);let rows=[["Project","Runs","Avg Duration"].map(header=>import_chalk5.default.bold(import_chalk5.default.cyan(header))),...projectList.map(project=>[import_chalk5.default.bold(readString(project,"projectName","name","project","projectId","id")??"-"),formatCount(readNumber(project,"runs","runCount","totalRuns")),import_chalk5.default.gray(formatDurationMs(readNumber(project,"avgDurationMs","averageDurationMs","avgDuration")))])];return client.stdout.write(`
56
56
  ${table(rows,{hsep:3}).replace(/^/gm," ")}
57
57
 
58
- `),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg=>!arg.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),2):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),2):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-UYIFBCCL.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-5ZBTU324.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);async function listApiKeys(client){let{apiKeys:apiKeys2}=await client.fetch("/v1/api-keys?purpose=ai-gateway",{method:"GET"});return apiKeys2??[]}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let matches=(await listApiKeys(client)).filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},1),output_manager_default.error(message),1}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},1),output_manager_default.error(message),1}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},1),output_manager_default.error(message),1}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
58
+ `),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg=>!arg.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),2):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),2):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-F6SLL27E.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-UNOHMSYJ.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);async function listApiKeys(client){let{apiKeys:apiKeys2}=await client.fetch("/v1/api-keys?purpose=ai-gateway",{method:"GET"});return apiKeys2??[]}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let matches=(await listApiKeys(client)).filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},1),output_manager_default.error(message),1}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},1),output_manager_default.error(message),1}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},1),output_manager_default.error(message),1}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},1),output_manager_default.error(message),1}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
59
59
  `),output_manager_default.success(`API key ${import_chalk6.default.bold(result.apiKey.name)} (${result.apiKey.id}) created ${createStamp()}`),output_manager_default.log(budget2!==void 0?`Spend on this key also counts toward any user and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`:`No key budget set. Spend still counts toward any API key default, user, and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk7=__toESM(require_source(),1);async function ensureTeam(client){if(client.config.currentTeam)return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function renderResource(client,{asJson,spinnerText,fetch:fetch3,toJSON,isEmpty,emptyMessage,header,renderTable:renderTable2,notFoundMessage}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch3()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&&notFoundMessage?notFoundMessage:err.message),1;throw err}return output_manager_default.stopSpinner(),json?(client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
60
60
  `),0):isEmpty(data)?(output_manager_default.log(emptyMessage),0):(output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),0)}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function setBudget(client,input){return client.fetch("/ai-gateway/budgets",{method:"PUT",body:input})}async function removeBudget(client,scopeType,opts={}){let params=new URLSearchParams({scopeType});opts.projectId&&params.set("projectId",opts.projectId),opts.userId&&params.set("userId",opts.userId),await client.fetch(`/ai-gateway/budgets?${params.toString()}`,{method:"DELETE"})}var BUDGET_DEFAULT_SCOPE_TYPES=["project","api-key","user"],BUDGET_DEFAULT_COVERED={project:"Projects","api-key":"API keys",user:"Team members"},BUDGET_DEFAULT_APPLIES_TO={project:"every project without its own budget","api-key":"every API key without its own budget",user:"every team member without their own budget"};function parseBudgetDefaultScope(args){let[scopeArg,...rest]=args;return scopeArg?BUDGET_DEFAULT_SCOPE_TYPES.includes(scopeArg)?rest.length>0?{error:`Unexpected argument "${rest[0]}".`}:{scopeType:scopeArg}:{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_DEFAULT_SCOPE_TYPES.join(", ")}.`}:{error:`Expected a scope. Specify ${BUDGET_DEFAULT_SCOPE_TYPES.join(" or ")}.`}}async function listScopeBudgetDefaults(client){let{defaults}=await client.fetch("/ai-gateway/budgets/defaults/list",{method:"GET"});return defaults??[]}async function upsertScopeBudgetDefault(client,input){return client.fetch("/ai-gateway/budgets/defaults",{method:"PUT",body:input})}async function deleteScopeBudgetDefault(client,scopeType){let params=new URLSearchParams({scopeType});await client.fetch(`/ai-gateway/budgets/defaults?${params.toString()}`,{method:"DELETE"})}async function list3(client,argv){let telemetry2=new AiGatewayApiKeysListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts}=parsedArgs;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}return renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch:()=>listApiKeys(client),toJSON:apiKeys2=>({apiKeys:apiKeys2}),isEmpty:apiKeys2=>apiKeys2.length===0,emptyMessage:`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`,header:()=>"API keys",renderTable:apiKeys2=>printApiKeysTable(apiKeys2,keyDefault)})}function printApiKeysTable(apiKeys2,keyDefault){return`${table([["id","name","key","budget","spend","refresh","created"].map(header=>import_chalk7.default.gray(header)),...apiKeys2.map(apiKey=>[apiKey.id,apiKey.name||import_chalk7.default.gray("\u2013"),apiKey.partialKey?`\u2026${apiKey.partialKey}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.limitAmount}`:keyDefault?`$${keyDefault.limitAmount} ${import_chalk7.default.gray("(default)")}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.currentSpend}`:import_chalk7.default.gray("\u2013"),apiKey.quota?.refreshPeriod??keyDefault?.refreshPeriod??import_chalk7.default.gray("\u2013"),apiKey.createdAt?new Date(apiKey.createdAt).toLocaleDateString():import_chalk7.default.gray("\u2013")])],{align:["l","l","l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
61
61
 
@@ -102,14 +102,14 @@ Example: {"sort": "cost"} or {"providerOptions": {"anthropic": {"effort": "high"
102
102
  `):output_manager_default.success(`Virtual model ${import_chalk22.default.bold(slug)} restored ${restoreStamp()}. Call it as ${import_chalk22.default.bold(`vmc/${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayVirtualModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandRestore(actual){this.trackCliSubcommand({subcommand:"restore",value:actual})}};var COMMAND_CONFIG7={create:getCommandAliases(virtualModelsCreateSubcommand),list:getCommandAliases(virtualModelsListSubcommand),inspect:getCommandAliases(virtualModelsInspectSubcommand),edit:getCommandAliases(virtualModelsEditSubcommand),remove:getCommandAliases(virtualModelsRemoveSubcommand),restore:getCommandAliases(virtualModelsRestoreSubcommand)};async function virtualModels(client){let telemetry2=new AiGatewayVirtualModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(virtualModelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:virtualModelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsCreateSubcommand),2):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create2(client,args));case"list":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsListSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list7(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsInspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect4(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsEditSubcommand),2):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),edit2(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRemoveSubcommand),2):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove5(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRestoreSubcommand),2):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),restore(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG7)),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk28=__toESM(require_source(),1);import{homedir}from"node:os";import{existsSync as existsSync2}from"node:fs";import{dirname as dirname6,resolve as resolve2}from"node:path";var import_chalk23=__toESM(require_source(),1);import{dirname,join as join2,resolve}from"node:path";var METADATA_FILE=".aider.model.metadata.json",SETTINGS_FILE=".aider.model.settings.yml";function aiderModelId(gatewayModelId){return`openai/${gatewayModelId}`}function chatModels(ctx){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&m.context_window)}function costPerToken(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelMetadata(models3){let entries={};for(let model of models3){let input=costPerToken(model.pricing?.input),output=costPerToken(model.pricing?.output);entries[aiderModelId(model.id)]={max_input_tokens:model.context_window,...model.max_tokens?{max_output_tokens:model.max_tokens,max_tokens:model.max_tokens}:{},...input===void 0?{}:{input_cost_per_token:input},...output===void 0?{}:{output_cost_per_token:output},litellm_provider:"openai",mode:"chat"}}return entries}function modelSettings(models3){return models3.map(model=>({name:aiderModelId(model.id),settings:{edit_format:"diff",use_repo_map:!0}}))}function asObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertNamedYamlList(current,entries){let loaded=current?.trim()?load(current):[];if(loaded!=null&&!Array.isArray(loaded))throw new Error("existing file is not a YAML list");let list30=Array.isArray(loaded)?[...loaded]:[],indexByName=new Map;list30.forEach((item,i)=>{let name=asObject(item).name;name!==void 0&&!indexByName.has(name)&&indexByName.set(name,i)});for(let{name,settings}of entries){let index=indexByName.get(name);index===void 0?(indexByName.set(name,list30.length),list30.push({name,...settings})):list30[index]={name,...asObject(list30[index]),...settings}}return dump(list30,{lineWidth:120})}var aider={id:"aider",displayName:"Aider",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return await pathExists(join2(home,".aider"))||pathExists(join2(home,".aider.conf.yml"))},configPath(ctx){return ctx.overrides?.aider??join2(ctx.home,".aider.conf.yml")},buildPlan(ctx){let model=aiderModelId(ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL),path3=this.configPath(ctx),dir=dirname(path3),metadataPath=join2(dir,METADATA_FILE),settingsPath=join2(dir,SETTINGS_FILE),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=chatModels(ctx),needsExplicitPaths=models3.length>0&&resolve(dir)!==resolve(ctx.home);return{fileChanges:[{path:path3,label:"Aider config",format:"yaml",transform:current=>{let config=asObject(load(current??"")??{});return config["openai-api-base"]=base,config.model=model,needsExplicitPaths&&(config["model-metadata-file"]=metadataPath,config["model-settings-file"]=settingsPath),dump(config,{lineWidth:120})}},...models3.length?[{path:metadataPath,label:"Aider model metadata",format:"json",transform:current=>mergeJson(current,modelMetadata(models3))},{path:settingsPath,label:"Aider model settings",format:"yaml",transform:current=>upsertNamedYamlList(current,modelSettings(models3))}]:[]],envExports:[{name:"AIDER_OPENAI_API_KEY",value:ctx.apiKey}],notes:[`Aider will use the gateway with ${model}; switch with \`aider --model openai/<gateway-model-id>\` or /model in a session.`,...models3.length?[`${models3.length} gateway models are registered in ${METADATA_FILE}; re-run setup to pick up models added since.`]:[],"Open a new terminal first so AIDER_OPENAI_API_KEY is loaded."]}}};import{join as join3}from"node:path";var cline={id:"cline",displayName:"Cline",needsTopModels:!0,async detect(home){return pathExists(join3(home,".cline"))},configPath(ctx){return ctx.overrides?.cline??join3(ctx.home,".cline","data","settings","providers.json")},buildPlan(ctx){let path3=this.configPath(ctx),defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,keepUpdatedAt=current=>{try{let providers2=JSON.parse(current)?.providers?.["vercel-ai-gateway"],settings=providers2?.settings;if((ctx.apiKey===KEY_PLACEHOLDER||settings?.apiKey===ctx.apiKey)&&settings?.provider==="vercel-ai-gateway"&&settings?.model===defaultModel&&providers2?.tokenSource==="manual"&&typeof providers2?.updatedAt=="string")return providers2.updatedAt}catch{}};return{fileChanges:[{path:path3,label:"Cline providers",format:"json",mode:384,transform:current=>{let isNew=!current||!current.trim(),updatedAt=(current&&keepUpdatedAt(current))??new Date().toISOString();return mergeJson(current,{...isNew?{version:1}:{},lastUsedProvider:"vercel-ai-gateway",providers:{"vercel-ai-gateway":{settings:{provider:"vercel-ai-gateway",apiKey:ctx.apiKey,model:defaultModel},updatedAt,tokenSource:"manual"}}})}}],envExports:[],notes:[`Cline will use its native Vercel AI Gateway provider with ${defaultModel}; switch models in-session or with \`cline auth -p vercel-ai-gateway -m <gateway-model-id>\`.`,"In the VS Code extension, pick the Vercel AI Gateway provider under Settings \u2192 API Provider."]}}};import{join as join5}from"node:path";import{createHash,randomUUID}from"node:crypto";import{v5 as uuidv5,validate as uuidValidate}from"uuid";import{createReadStream,createWriteStream}from"node:fs";import*as fs from"node:fs/promises";import{basename,dirname as dirname2,join as join4}from"node:path";import{pipeline}from"node:stream/promises";var ROLLOUT_PATTERN=/^rollout-.*\.jsonl(?:\.zst)?$/,MAX_METADATA_BYTES=1024*1024;function hasCode(error,code2){return error.code===code2}async function readMeta(path3,gateway=!1){let handle=await fs.open(path3,"r"),buffer=new Uint8Array(MAX_METADATA_BYTES+1),length=0,newline=-1;try{for(;length<buffer.length&&newline<0;){let start=length,read=await handle.read(buffer,start,buffer.length-start,start);if(read.bytesRead===0)break;length+=read.bytesRead,newline=buffer.indexOf(10,start)}}finally{await handle.close()}if(newline<0&&length>MAX_METADATA_BYTES)throw new Error(`${basename(path3)} metadata exceeds 1 MiB`);let lineEnd=newline<0?length:newline,carriageReturn=buffer[lineEnd-1]===13,record;try{record=JSON.parse(new TextDecoder().decode(buffer.subarray(0,carriageReturn?lineEnd-1:lineEnd)))}catch{return null}let payload=record.payload,id=typeof payload?.id=="string"?payload.id:typeof payload?.session_id=="string"?payload.session_id:"";return record.type!=="session_meta"||!payload||!uuidValidate(id)||typeof payload.session_id=="string"&&payload.session_id!==id||payload.originator!=="Codex Desktop"&&!(payload.originator==null&&payload.source==="vscode")||(gateway?payload.model_provider!=="vercel":payload.model_provider==="vercel")?null:{record,payload,id,delimiter:newline<0?"":carriageReturn?`\r
103
103
  `:`
104
104
  `,restOffset:newline<0?length:newline+1}}function codeSpan(value){return`\`${value.replace(/[`\r\n]/g,"")}\``}async function findRollouts(root){let files=[];async function visit(directory){let entries;try{entries=await fs.readdir(directory,{withFileTypes:!0})}catch(error){if(hasCode(error,"ENOENT"))return;throw error}for(let entry2 of entries){let path3=join4(directory,entry2.name);entry2.isDirectory()?await visit(path3):entry2.isFile()&&ROLLOUT_PATTERN.test(entry2.name)&&files.push(path3)}}return await visit(root),files}async function planCopy(path3,root){let metadata=await readMeta(path3),filename=basename(path3);if(!metadata||!filename.toLowerCase().includes(metadata.id.toLowerCase()))return null;let destinationId=uuidv5(`vercel-ai-gateway/codex/${metadata.id.toLowerCase()}/vercel`,uuidv5.URL),destination=join4(dirname2(path3),filename.replace(new RegExp(metadata.id,"i"),destinationId)),item={source:path3,destination,sourceId:metadata.id,destinationId,bytes:(await fs.stat(path3)).size,root};try{return await fs.stat(destination),await validateDestination(item),null}catch(error){if(!hasCode(error,"ENOENT"))throw error}return item}async function bodyHash(path3,start){let hash=createHash("sha256");return await pipeline(createReadStream(path3,{start}),hash),hash.digest("hex")}async function validateDestination(item){let[source,destination]=await Promise.all([readMeta(item.source),readMeta(item.destination,!0)]),bodies=await Promise.all([bodyHash(item.source,source?.restOffset??0),bodyHash(item.destination,destination?.restOffset??0)]);if(!(source&&destination?.id===item.destinationId&&bodies[0]===bodies[1]))throw new Error(`Existing destination ${basename(item.destination)} is invalid`)}async function copySession(item){let metadata=await readMeta(item.source);if(!metadata)throw new Error("Codex session metadata is no longer valid");if(metadata.id!==item.sourceId)throw new Error("Codex session metadata changed after planning");let updated={...metadata.record,payload:{...metadata.payload,id:item.destinationId,session_id:item.destinationId,model_provider:"vercel"}},temporary=`${item.destination}.tmp-${process.pid}-${randomUUID()}`;try{return await fs.writeFile(temporary,`${JSON.stringify(updated)}${metadata.delimiter}`,{flag:"wx",mode:384}),await pipeline(createReadStream(item.source,{start:metadata.restOffset}),createWriteStream(temporary,{flags:"a",mode:384})),await fs.chmod(temporary,384),await publishNoClobber(temporary,item.destination)?!0:(await validateDestination(item),!1)}finally{await fs.unlink(temporary).catch(error=>{if(!hasCode(error,"ENOENT"))throw error})}}async function planCodexSessionMigration(home){let codexHome=process.env.CODEX_HOME||join4(home,".codex"),roots=["sessions","archived_sessions"].map(root=>join4(codexHome,root)),files=[];for(let root of roots)files.push(...(await findRollouts(root)).map(path3=>({path:path3,root})));if(files.some(file=>file.path.endsWith(".jsonl.zst")))throw new Error("Found compressed Codex sessions; decompress them first, or pass --no-session-migration to leave them unchanged");let copies=[];for(let file of files){let copy3=await planCopy(file.path,file.root);copy3&&copies.push(copy3)}if(copies.length===0)return null;let sourceRoots=[...new Set(copies.map(copy3=>copy3.root))];return{label:"Codex Desktop sessions",itemCount:copies.length,totalBytes:copies.reduce((total,copy3)=>total+copy3.bytes,0),sourceRoots,destinationRoots:sourceRoots,prompt:[`Before changing the provider, copy the ${copies.length} top-level Codex Desktop rollout${copies.length===1?"":"s"} with a non-\`vercel\` provider under ${sourceRoots.map(codeSpan).join(", ")}. Do not copy subagent rollouts whose \`session_id\` differs from \`id\`.`,"For each copy, derive a deterministic UUID v5 using the URL namespace `6ba7b811-9dad-11d1-80b4-00c04fd430c8` and name `vercel-ai-gateway/codex/<source-id>/vercel`. Replace the filename UUID and `session_meta.payload.id`/`session_id`, set `model_provider` to `vercel`, and preserve every later JSONL byte.","Use atomic, no-clobber writes with mode 0600; skip an existing deterministic destination only after validating its metadata and body. Never move, edit, delete, or overwrite an original session file."],async apply(){let copied=0,skipped=0,errors=[];for(let item of copies)try{await copySession(item)?copied++:skipped++}catch(error){errors.push(`${basename(item.source)}: ${error instanceof Error?error.message:String(error)}`)}return{copied,skipped,errors}}}}function codexDir(home){let dir=process.env.CODEX_HOME;return dir&&dir.trim()?dir:join5(home,".codex")}var codex={id:"codex",displayName:"Codex",sessionMigration:{plan:({home})=>planCodexSessionMigration(home)},async detect(home){return pathExists(codexDir(home))},configPath(ctx){return ctx.overrides?.codex??join5(codexDir(ctx.home),"config.toml")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"Codex config",format:"toml",transform:current=>mergeToml(current,{model_provider:"vercel",model_providers:{vercel:{name:"Vercel AI Gateway",base_url:resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODEX_BASE_URL),env_key:GATEWAY_API_KEY_ENV,wire_api:"responses"}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:["Codex now defaults to the Vercel AI Gateway; pick a model with --model or in config.",`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, or run: export ${GATEWAY_API_KEY_ENV}=<key>`]}}};import{dirname as dirname3,join as join6}from"node:path";function agenticModels(ctx,opts={}){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&(m.tags??[]).includes("tool-use")&&!m.deprecated_at&&(!opts.requireContextWindow||!!m.context_window)&&(!opts.requireMaxTokens||!!m.max_tokens))}function defaultFirst(models3){let rest=models3.filter(m=>m.id!==GATEWAY_DEFAULT_MODEL).sort((a,b)=>a.id.localeCompare(b.id)),preferred=models3.find(m=>m.id===GATEWAY_DEFAULT_MODEL);return preferred?[preferred,...rest]:rest}function shortlistModels(ctx,opts={}){let{creator,creatorLimit=5,overallLimit=10,ensureDefault}=opts,eligible=agenticModels(ctx,opts),byId=new Map(eligible.map(m=>[m.id,m])),picked=[],take=m=>{m&&!picked.includes(m)&&picked.push(m)};if(creator){let rank=new Map((ctx.topModels??[]).map((t,i)=>[t.id,i])),unranked=Number.MAX_SAFE_INTEGER;eligible.filter(m=>m.id.startsWith(`${creator}/`)).sort((a,b)=>(rank.get(a.id)??unranked)-(rank.get(b.id)??unranked)||(b.released??b.created??0)-(a.released??a.created??0)||a.id.localeCompare(b.id)).slice(0,creatorLimit).forEach(take)}let overallStart=picked.length,room=()=>picked.length-overallStart<overallLimit;if(ensureDefault&&take(byId.get(GATEWAY_DEFAULT_MODEL)),ctx.topModels)for(let top of ctx.topModels){if(!room())break;take(byId.get(top.id))}else for(let m of defaultFirst(eligible)){if(!room())break;take(m)}return picked}var FALLBACK_MODELS=[GATEWAY_DEFAULT_MODEL];function chatModelIds(ctx){let ids=shortlistModels(ctx).map(m=>m.id);return ids.length?ids:FALLBACK_MODELS}var ONBOARDING_MARKER=".onboarding_complete",SECRET_REF="${{ secrets.AI_GATEWAY_API_KEY }}";function asObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var continueCli={id:"continue",displayName:"Continue CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join6(home,".continue"))},configPath(ctx){return ctx.overrides?.continue??join6(ctx.home,".continue","config.yaml")},buildPlan(ctx){let apiBase=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,configPath=this.configPath(ctx),modelIds=chatModelIds(ctx);return{fileChanges:[{path:configPath,label:"Continue config",format:"yaml",transform:current=>{let config=asObject2(load(current??"")??{});typeof config.name!="string"&&(config.name="Local Config"),typeof config.version!="string"&&(config.version="1.0.0"),typeof config.schema!="string"&&(config.schema="v1");let models3=Array.isArray(config.models)?[...config.models]:[],writtenIds=new Set(modelIds),kept=models3.filter(entry2=>{let e2=asObject2(entry2);return!(e2.apiKey===SECRET_REF||writtenIds.has(e2.name))}),entries=modelIds.map(id=>({...asObject2(models3.find(m=>asObject2(m).name===id)),name:id,provider:"openai",model:id,apiBase,apiKey:SECRET_REF}));return config.models=[...kept,...entries],dump(config,{lineWidth:120})}},{path:join6(dirname3(configPath),ONBOARDING_MARKER),label:"Continue onboarding marker",format:"text",transform:current=>current??`${new Date().toISOString()}
105
- `}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[modelIds.length>1?`Continue CLI will use the gateway with ${modelIds[0]}; /model lists the top ${modelIds.length} gateway models -- re-run setup to refresh the list.`:`Continue CLI will use the gateway with ${GATEWAY_DEFAULT_MODEL}; the gateway catalogue could not be fetched, so /model lists only that model until setup is re-run.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded, then run \`cn\`.`,`If \`cn\` ever asks for an Anthropic API key, ${ONBOARDING_MARKER} is missing next to the config -- re-run setup rather than answering the prompt, which would overwrite the gateway models.`]}}};import{join as join7}from"node:path";function copilotDir(home){let dir=process.env.COPILOT_HOME;return dir&&dir.trim()?dir:join7(home,".copilot")}var copilot={id:"copilot",needsTopModels:!0,displayName:"GitHub Copilot CLI",async detect(home){return pathExists(copilotDir(home))},configPath(ctx){return ctx.overrides?.copilot??copilotDir(ctx.home)},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[],envExports:[{name:"COPILOT_PROVIDER_BASE_URL",value:resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),plain:!0},{name:"COPILOT_PROVIDER_API_KEY",value:ctx.apiKey},{name:"COPILOT_MODEL",value:defaultModel,plain:!0}],notes:[`Copilot CLI will use the gateway with ${defaultModel}; set COPILOT_MODEL (or pass --model) to any gateway model id to switch.`,"Open a new terminal so the COPILOT_* variables are loaded; GitHub sign-in is not required in this mode."]}}};import{isAbsolute,join as join8}from"node:path";var SMALL_MODEL="anthropic/claude-haiku-4.5";function crushConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute(xdg)?xdg:join8(home,".config");return join8(base,"crush")}var crush={id:"crush",needsTopModels:!0,displayName:"Crush",async detect(home){return await pathExists(crushConfigDir(home))||pathExists(join8(home,".local","share","crush"))},configPath(ctx){return ctx.overrides?.crush??join8(crushConfigDir(ctx.home),"crush.json")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,base=ctx.baseUrlOverride?.trim();return{fileChanges:[{path:this.configPath(ctx),label:"Crush config",format:"json",transform:current=>mergeJson(current,{providers:{vercel:{api_key:`$${GATEWAY_API_KEY_ENV}`,...base?{base_url:base}:{}}},models:{large:{provider:"vercel",model:defaultModel},small:{provider:"vercel",model:SMALL_MODEL}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Crush will use its native Vercel AI Gateway provider with ${defaultModel} (${SMALL_MODEL} for small tasks); switch models in-session with ctrl+p.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join9}from"node:path";var cursor={id:"cursor",displayName:"Cursor",async detect(home){return pathExists(join9(home,".cursor"))},configPath(ctx){return ctx.overrides?.cursor??join9(ctx.home,".cursor")},buildPlan(ctx){return{fileChanges:[],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:["Cursor keeps its API-key settings in the app itself, so finish the setup there:","1. Open Cursor \u2192 Settings (Cmd+Shift+J) \u2192 Models.",`2. Under OpenAI API Key: paste your gateway key, then enable "Override OpenAI Base URL" and set it to ${ctx.baseUrlOverride??GATEWAY_CURSOR_BASE_URL}`,'3. Copy the key from a new terminal without echoing it: printf %s "$AI_GATEWAY_API_KEY" | pbcopy','4. Use "Add model" to add gateway model ids you want in the picker (e.g. anthropic/claude-fable-5, openai/gpt-5.6-sol).',"While the override is on, Cursor's built-in non-OpenAI models stop working \u2014 use gateway model ids for everything, or toggle the override off to go back.","Cursor chats are stored by its backend, so there are no local sessions to migrate.","Cursor limitations: Tab completions never use custom keys, and Agent/Auto modes may bypass the override."]}}};import{join as join10}from"node:path";var PROVIDER_KEY="vercel-ai-gateway";function profiles(models3){let out={};for(let model of models3)out[model.id]={name:model.name,...model.context_window?{max_input_tokens:model.context_window}:{},...model.max_tokens?{max_output_tokens:model.max_tokens}:{}};return out}var deepagents={id:"deepagents",displayName:"Deep Agents CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join10(home,".deepagents"))},configPath(ctx){return ctx.overrides?.deepagents??join10(ctx.home,".deepagents","config.toml")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx),ids=models3.length?models3.map(m=>m.id):[GATEWAY_DEFAULT_MODEL];return{fileChanges:[{path:this.configPath(ctx),label:"Deep Agents config",format:"toml",transform:current=>mergeToml(current,{models:{default:`${PROVIDER_KEY}:${ids[0]}`,providers:{[PROVIDER_KEY]:{display_name:"Vercel AI Gateway",api_key_env:"AI_GATEWAY_API_KEY",base_url:baseUrl,class_path:"langchain_openai:ChatOpenAI",models:ids,...models3.length?{profile:profiles(models3)}:{},params:{use_responses_api:!1}}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Deep Agents (dcode) will default to ${PROVIDER_KEY}:${ids[0]}.`,...models3.length?[`The top ${models3.length} gateway models are in the /model switcher, which filters as you type. Any other gateway id also works directly: /model ${PROVIDER_KEY}:<gateway-model-id>.`]:[],"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{join as join11}from"node:path";var PROVIDER_KEY2="vercel-ai-gateway",DEFAULT_MODEL="deepseek/deepseek-v4-flash";function asObject3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function dshDir(home){let dir=process.env.DSH_HOME;return dir&&dir.trim()?dir:join11(home,".dsh")}var deepseek={id:"deepseek",displayName:"DeepSeek Harness",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(dshDir(home))},configPath(ctx){return ctx.overrides?.deepseek??join11(dshDir(ctx.home),"settings.yaml")},buildPlan(ctx){let path3=this.configPath(ctx),models3=shortlistModels(ctx,{creator:"deepseek"}).map(m=>({id:m.id,name:m.name})),defaultId=models3[0]?.id??DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"DeepSeek Harness settings",format:"yaml",transform:current=>{let config=asObject3(load(current??"")??{}),llm=asObject3(config["llm-pi-ai"]),providers2=asObject3(llm.providers),entry2=asObject3(providers2[PROVIDER_KEY2]);return delete entry2.api,delete entry2.baseURL,delete entry2.models,providers2[PROVIDER_KEY2]={...entry2,apiKeyEnv:GATEWAY_API_KEY_ENV,...models3.length?{models:models3}:{}},llm.providers=providers2,config["llm-pi-ai"]=llm,config["agent-default-model"]={provider:PROVIDER_KEY2,model:defaultId},dump(config,{lineWidth:120})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[models3.length?`DeepSeek Harness will default to ${PROVIDER_KEY2}/${defaultId}; the shortlist in settings.yaml is the picker \u2014 add any gateway model id there.`:`DeepSeek Harness will default to ${PROVIDER_KEY2}/${DEFAULT_MODEL}; every gateway model pi-ai ships is selectable with /model \u2014 no per-model config needed.`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, then run \`dsh\` \u2014 headless runs use the gateway route too.`]}}};import{join as join12}from"node:path";var API_KEY_REF="${AI_GATEWAY_API_KEY}",PROVIDER="generic-chat-completion-api",FALLBACK_MAX_OUTPUT_TOKENS=64e3;function gatewayEntries(ctx,baseUrl){let models3=shortlistModels(ctx,{requireMaxTokens:!0});return models3.length?models3.map(m=>entry(m.id,baseUrl,m.max_tokens)):[entry(GATEWAY_DEFAULT_MODEL,baseUrl,FALLBACK_MAX_OUTPUT_TOKENS)]}function entry(model,baseUrl,maxOutputTokens){return{model,displayName:model,baseUrl,apiKey:API_KEY_REF,provider:PROVIDER,maxOutputTokens}}function isOurs(value){return value?.apiKey===API_KEY_REF}function mergeCustomModels(current,entries){let existing;try{existing=current?.trim()?JSON.parse(current):{}}catch(err){throw new Error(`existing file is not valid JSON (${err.message})`)}let currentModels=existing.customModels,kept=Array.isArray(currentModels)?currentModels.filter(m=>!isOurs(m)):[];return mergeJson(current,{customModels:[...kept,...entries]})}var droid={id:"droid",displayName:"Factory Droid",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join12(home,".factory"))},configPath(ctx){return ctx.overrides?.droid??join12(ctx.home,".factory","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,entries=gatewayEntries(ctx,baseUrl);return{fileChanges:[{path:this.configPath(ctx),label:"Factory Droid settings",format:"json",transform:current=>mergeCustomModels(current,entries)}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[entries.length>1?`The top ${entries.length} gateway models are in Droid's /model picker, leaderboard order -- re-run setup to refresh the list.`:`Factory Droid gets ${GATEWAY_DEFAULT_MODEL}; pick it with /model in a session or \`droid exec -m ${GATEWAY_DEFAULT_MODEL}\`.`,`\`droid exec\` defaults to a Factory-hosted model this key cannot use -- always pass \`-m ${entries[0]?.model??GATEWAY_DEFAULT_MODEL}\` (or another gateway model above).`]}}};import{dirname as dirname4,join as join13}from"node:path";import{parse as tomlParse,stringify as tomlStringify}from"smol-toml";var PROVIDER_ID="vercel-ai-gateway";function asObject4(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertById(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
+ `}],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)}
106
106
  `}},{path:join13(dirname4(configPath),".credentials.json"),label:"ForgeCode credentials",format:"json",mode:384,transform:current=>{let parsed=current?.trim()?JSON.parse(current):[];if(!Array.isArray(parsed))throw new Error("existing file is not a JSON array");return JSON.stringify(upsertById(parsed,existing=>({...existing,auth_details:{...asObject4(existing.auth_details),api_key:ctx.apiKey}})))}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`ForgeCode will use the gateway with ${defaultModel}; switch models in-session with :config-model (the picker fills from the gateway catalog).`,"Current ForgeCode reads the key from ~/.forge/.credentials.json (0600), not the environment, so the key is stored there."]}}};import{join as join14}from"node:path";var fx={id:"fx",displayName:"fx",async detect(home){return pathExists(join14(home,".fx"))},configPath(ctx){return ctx.overrides?.fx??join14(ctx.home,".fx","settings.json")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"fx settings",format:"json",transform:current=>mergeJson(current,{credential_source:"ai_gateway_api_key"})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`fx will authenticate with ${GATEWAY_API_KEY_ENV}; open a new terminal so it is loaded, then confirm with fx status.`,"Pick a model with /model or browse the catalog with /models \u2014 the whole gateway catalog is available."]}}};import{dirname as dirname5,join as join15}from"node:path";var PROVIDER_ID2="vercel_ai_gateway";function contextLimits(ctx){return defaultFirst(agenticModels(ctx,{requireContextWindow:!0})).map(m=>({name:m.id,context_limit:m.context_window}))}function asObject5(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function gooseConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join15(home,".config");return join15(base,"goose")}var goose={id:"goose",needsTopModels:!0,displayName:"Goose",needsModelCatalogue:!0,async detect(home){return pathExists(gooseConfigDir(home))},configPath(ctx){return ctx.overrides?.goose??join15(gooseConfigDir(ctx.home),"config.yaml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=contextLimits(ctx);return{fileChanges:[{path:configPath,label:"Goose config",format:"yaml",transform:current=>{let config=asObject5(load(current??"")??{});return config.GOOSE_PROVIDER=PROVIDER_ID2,config.GOOSE_MODEL=defaultModel,dump(config,{lineWidth:120})}},{path:join15(dirname5(configPath),"custom_providers",`${PROVIDER_ID2}.json`),label:"Goose provider",format:"json",transform:current=>mergeJson(current,{name:PROVIDER_ID2,engine:"openai",display_name:"Vercel AI Gateway",api_key_env:GATEWAY_API_KEY_ENV,base_url:`${base}/chat/completions`,...models3.length?{models:models3}:{}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Goose will use the gateway with ${defaultModel}; switch models with GOOSE_MODEL in config.yaml or \`goose configure\` (the picker fills from the gateway catalog).`,...models3.length?[`Context limits for ${models3.length} gateway models are recorded in custom_providers/${PROVIDER_ID2}.json; without them Goose sizes most models at 128k. Re-run setup to refresh.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{isAbsolute as isAbsolute2,join as join16}from"node:path";import{isDeepStrictEqual}from"node:util";import{parse as tomlParse2,stringify as tomlStringify2}from"smol-toml";var PROVIDER_NAME="vercel-ai-gateway";function isTable(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function gptmeConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute2(xdg)?xdg:join16(home,".config");return join16(base,"gptme")}var gptme={id:"gptme",needsTopModels:!0,displayName:"gptme",async detect(home){return pathExists(gptmeConfigDir(home))},configPath(ctx){return ctx.overrides?.gptme??join16(gptmeConfigDir(ctx.home),"config.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path:path3,label:"gptme config",format:"toml",transform:current=>{let doc={};if(current&&current.trim())try{doc=tomlParse2(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=Array.isArray(doc.providers)?[...doc.providers]:[],entry2={name:PROVIDER_NAME,base_url:baseUrl,api_key_env:GATEWAY_API_KEY_ENV,default_model:defaultModel},index=providers2.findIndex(value=>isTable(value)&&value.name===PROVIDER_NAME);index===-1?providers2.push(entry2):providers2[index]={...providers2[index],...entry2};let desired={...doc,providers:providers2,models:{...isTable(doc.models)?doc.models:{},default:`${PROVIDER_NAME}/${defaultModel}`}};return current&&isDeepStrictEqual(doc,desired)?current:`${tomlStringify2(desired)}
107
107
  `}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`gptme will default to ${PROVIDER_NAME}/${defaultModel}; run other gateway models with -m ${PROVIDER_NAME}/<gateway-model-id>.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join17}from"node:path";var MODEL_KEY="vercel-ai-gateway",DEFAULT_MODEL2="xai/grok-4.6",GROK_KEY_ENV="GROK_CODE_XAI_API_KEY";function grokDir(home){let dir=process.env.GROK_HOME;return dir&&dir.trim()?dir:join17(home,".grok")}var grok={id:"grok",displayName:"Grok Build",async detect(home){return pathExists(grokDir(home))},configPath(ctx){return ctx.overrides?.grok??join17(grokDir(ctx.home),"config.toml")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path:path3,label:"Grok Build config",format:"toml",transform:current=>mergeToml(current,{endpoints:{models_base_url:baseUrl},models:{default:MODEL_KEY},model:{[MODEL_KEY]:{model:DEFAULT_MODEL2,base_url:baseUrl,name:"Grok 4.6 (Vercel AI Gateway)",env_key:GATEWAY_API_KEY_ENV,context_window:5e5}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey},{name:GROK_KEY_ENV,value:ctx.apiKey}],notes:[`Grok Build will default to ${DEFAULT_MODEL2} through the gateway; Ctrl+M (or /model) lists the full catalog \u2014 open a new terminal first so ${GROK_KEY_ENV} is loaded for those models.`,"If you previously ran `grok login`, run `grok logout` so the stored xAI session does not shadow the gateway key."]}}};import{join as join18}from"node:path";var PROVIDER_KEY3="vercel-ai-gateway";function asObject6(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var hermes={id:"hermes",displayName:"Hermes",needsTopModels:!0,async detect(home){return pathExists(join18(home,".hermes"))},configPath(ctx){return ctx.overrides?.hermes??join18(ctx.home,".hermes","config.yaml")},buildPlan(ctx){let path3=this.configPath(ctx),api2=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"Hermes config",format:"yaml",transform:current=>{let config=asObject6(load(current??"")??{}),providers2=asObject6(config.providers);return providers2[PROVIDER_KEY3]={...asObject6(providers2[PROVIDER_KEY3]),api:api2,key_env:"AI_GATEWAY_API_KEY",transport:"chat_completions",discover_models:!0},config.providers=providers2,config.model={...asObject6(config.model),provider:`custom:${PROVIDER_KEY3}`,default:defaultModel},dump(config,{lineWidth:120})}}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Hermes will use the gateway with ${defaultModel}; switch models in-session with /model custom:${PROVIDER_KEY3}:<gateway-model-id>.`,"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{isAbsolute as isAbsolute3,join as join19}from"node:path";var PROFILE_NAME="vercel-ai-gateway",MODEL_PROFILE_PREFIX="vercel-",PROVIDER_LABEL="Vercel AI Gateway";function junieHome(home){let env=process.env.JUNIE_HOME;return env&&isAbsolute3(env)?env:join19(home,".junie")}function profileId(modelId){return`${MODEL_PROFILE_PREFIX}${modelId.replace(/[^a-zA-Z0-9._-]+/g,"-")}`}var junie={id:"junie",displayName:"Junie CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(junieHome(home))},configPath(ctx){return ctx.overrides?.junie??join19(junieHome(ctx.home),"models",`${PROFILE_NAME}.json`)},buildPlan(ctx){let baseUrl=`${(ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL).replace(/\/+$/,"")}/chat/completions`,configPath=this.configPath(ctx),models3=shortlistModels(ctx),stableId=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,stableModel=models3.find(m=>m.id===stableId),changes=[{path:configPath,label:"Junie model profile",format:"json",transform:current=>{let isNew=!current||!current.trim();return mergeJson(current,{...isNew?{id:stableId,providerName:PROVIDER_LABEL,...stableModel?{displayName:stableModel.name,...stableModel.context_window?{maxContextLength:stableModel.context_window}:{}}:{}}:{},baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}"})}}];for(let model of models3)changes.push({path:join19(configPath,"..",`${profileId(model.id)}.json`),label:`Junie model profile (${model.id})`,format:"json",transform:current=>mergeJson(current,{id:model.id,displayName:model.name,providerName:PROVIDER_LABEL,baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}",...model.context_window?{maxContextLength:model.context_window}:{}})});return{fileChanges:changes,envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Run \`junie --model custom:${PROFILE_NAME}\` or pick the model with /model in a session; the profile defaults to ${stableId} \u2014 change its \`id\` to any gateway model.`,...models3.length?[`The top ${models3.length} gateway models are also written as their own \`custom:${MODEL_PROFILE_PREFIX}<model-id>\` profiles, grouped under ${PROVIDER_LABEL} in /model after the built-in providers \u2014 re-run setup to refresh the shortlist; profiles from earlier runs stay in place. Junie prices custom profiles at 0; it has no config hook for real rates.`]:[],`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded \u2014 Junie resolves it when the profile loads and errors if it is unset.`]}}};import{join as join20}from"node:path";function kiloConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join20(home,".config");return join20(base,"kilo")}var kilo={id:"kilo",displayName:"Kilo Code",async detect(home){return pathExists(kiloConfigDir(home))},configPath(ctx){return ctx.overrides?.kilo??join20(kiloConfigDir(ctx.home),"kilo.json")},buildPlan(ctx){let path3=this.configPath(ctx),baseURL=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path:path3,label:"Kilo Code config",format:"json",transform:current=>mergeJson(current,{provider:{"openai-compatible":{options:{apiKey:"{env:AI_GATEWAY_API_KEY}",baseURL}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:["Kilo Code lists the gateway catalog automatically \u2014 pick a model with /models in a session (ids look like openai-compatible/anthropic/claude-fable-5).","If you keep your Kilo config in kilo.jsonc instead of kilo.json, merge the new provider block into it manually."]}}};import{join as join21}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";import{parse as tomlParse3,stringify as tomlStringify3}from"smol-toml";var PROVIDER_KEY4="vercel-ai-gateway",PREFERRED_MODEL="moonshotai/kimi-k3";function isTable2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function kimiDir(home){let dir=process.env.KIMI_SHARE_DIR;return dir&&dir.trim()?dir:join21(home,".kimi")}function shortlist(ctx){return shortlistModels(ctx,{creator:"moonshotai",requireContextWindow:!0})}function defaultModelKey(models3){return models3[0]?.id??PREFERRED_MODEL}var kimi={id:"kimi",displayName:"Kimi CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(kimiDir(home))},configPath(ctx){return ctx.overrides?.kimi??join21(kimiDir(ctx.home),"config.toml")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=shortlist(ctx),defaultKey=defaultModelKey(models3);return{fileChanges:[{path:path3,label:"Kimi CLI config",format:"toml",mode:384,transform:current=>{let doc={};if(current&&current.trim())try{doc=tomlParse3(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=isTable2(doc.providers)?doc.providers:{},keptModels=Object.fromEntries(Object.entries(isTable2(doc.models)?doc.models:{}).filter(([,value])=>!(isTable2(value)&&value.provider===PROVIDER_KEY4))),ours={};for(let model of models3)ours[model.id]={provider:PROVIDER_KEY4,model:model.id,max_context_size:model.context_window,display_name:model.name};models3.length||(ours[defaultKey]={provider:PROVIDER_KEY4,model:defaultKey,max_context_size:128e3});let desired={...doc,default_model:defaultKey,providers:{...providers2,[PROVIDER_KEY4]:{...isTable2(providers2[PROVIDER_KEY4])?providers2[PROVIDER_KEY4]:{},type:"openai_legacy",base_url:baseUrl,api_key:ctx.apiKey}},models:{...keptModels,...ours}};return current&&isDeepStrictEqual2(doc,desired)?current:`${tomlStringify3(desired)}
108
108
  `}}],envExports:[],notes:[`Kimi CLI will use the gateway with ${defaultKey}; switch with /model.`,...models3.length?[`A shortlist of ${models3.length} gateway models is declared in config.toml; re-run setup to refresh it.`]:[],"Kimi CLI lets OPENAI_API_KEY/OPENAI_BASE_URL env vars override this provider \u2014 unset them if requests fail with auth errors."]}}};import{join as join22}from"node:path";function ompDir(home){let dir=process.env.PI_CODING_AGENT_DIR;if(dir&&dir.trim())return dir;let name=process.env.PI_CONFIG_DIR;return join22(home,name&&name.trim()?name.trim():".omp")}var omp={id:"omp",displayName:"omp",async detect(home){return pathExists(ompDir(home))},configPath(ctx){return ctx.overrides?.omp??ompDir(ctx.home)},buildPlan(ctx){return{fileChanges:[],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`omp's native Vercel AI Gateway provider reads ${GATEWAY_API_KEY_ENV} \u2014 pick a gateway model with /model or launch with --model vercel-ai-gateway/<model-id> (the picker lists the gateway catalog).`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, or run: export ${GATEWAY_API_KEY_ENV}=<key>`]}}};import{join as join23}from"node:path";var PROVIDER_KEY5="vercel-ai-gateway",STARTER_MODELS=[{id:"anthropic/claude-fable-5",name:"Claude Fable 5"},{id:"anthropic/claude-opus-4.8",name:"Claude Opus 4.8"},{id:"anthropic/claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"openai/gpt-5.6-sol",name:"GPT-5.6 Sol"},{id:"google/gemini-3.6-flash",name:"Gemini 3.6 Flash"}];function entryFor(model){return{id:model.id,name:`${model.name} (Gateway)`}}function existingModels(current){if(!current?.trim())return[];try{let models3=JSON.parse(current)?.models?.providers?.[PROVIDER_KEY5]?.models;return Array.isArray(models3)?models3.filter(m=>typeof m?.id=="string"&&m.id.length>0):[]}catch{return[]}}function mergeModels(ranked,existing){let merged=[],seen=new Set;for(let model of[...ranked,...existing])seen.has(model.id)||(seen.add(model.id),merged.push(model));return merged}var openclaw={id:"openclaw",displayName:"OpenClaw",needsTopModels:!0,async detect(home){return pathExists(join23(home,".openclaw"))},configPath(ctx){return ctx.overrides?.openclaw??join23(ctx.home,".openclaw","openclaw.json")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,ranked=(ctx.topModels??STARTER_MODELS).map(entryFor),primaryModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"OpenClaw config",format:"json",transform:current=>mergeJson(current,{models:{providers:{[PROVIDER_KEY5]:{baseUrl,apiKey:"${AI_GATEWAY_API_KEY}",api:"openai-completions",models:mergeModels(ranked,existingModels(current))}}},agents:{defaults:{model:{primary:`${PROVIDER_KEY5}/${primaryModel}`}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`OpenClaw will default to ${PROVIDER_KEY5}/${primaryModel}; the model list is in openclaw.json \u2014 add any gateway model id there.`,"Restart the OpenClaw gateway process so the new provider loads."]}}};import{isAbsolute as isAbsolute4,join as join24}from"node:path";function defaultConfigPath(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute4(xdg)?xdg:join24(home,".config");return join24(base,"opencode","opencode.json")}var opencode={id:"opencode",displayName:"OpenCode",async detect(home){return pathExists(defaultConfigPath(home))},configPath(ctx){return ctx.overrides?.opencode??defaultConfigPath(ctx.home)},buildPlan(ctx){let vercel=ctx.useKeychain?{}:{options:{apiKey:ctx.apiKey}},envExports=ctx.useKeychain?[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}]:[],notes=["OpenCode can now use the Vercel AI Gateway; pick a model like vercel/<creator>/<model>."];return ctx.useKeychain&&notes.push(`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded (Keychain-backed).`),{fileChanges:[{path:this.configPath(ctx),label:"OpenCode config",format:"json",transform:current=>mergeJson(current,{provider:{vercel}})}],envExports,notes}}};import{join as join25}from"node:path";function persistenceDir(home){let dir=process.env.OPENHANDS_PERSISTENCE_DIR;return dir&&dir.trim()?dir:join25(home,".openhands")}function hasCondenserLlm(current){if(!current||!current.trim())return!1;try{return!!JSON.parse(current)?.condenser?.llm}catch{return!1}}function costPerToken2(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelPricing(models3,id){let model=models3?.find(m=>m.id===id),input=costPerToken2(model?.pricing?.input),output=costPerToken2(model?.pricing?.output);return input===void 0||output===void 0?{}:{input_cost_per_token:input,output_cost_per_token:output}}var openhands={id:"openhands",displayName:"OpenHands",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(persistenceDir(home))},configPath(ctx){return ctx.overrides?.openhands??join25(persistenceDir(ctx.home),"agent_settings.json")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,pinned=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,model=`openai/${pinned}`;return{fileChanges:[{path:path3,label:"OpenHands agent settings",format:"json",mode:384,transform:current=>{let llm={model,api_key:ctx.apiKey,base_url:baseUrl,...modelPricing(ctx.gatewayModels,pinned)};return mergeJson(current,{llm:{...llm,usage_id:"agent"},...hasCondenserLlm(current)?{condenser:{llm}}:{}})}}],envExports:[],notes:[`OpenHands will use the gateway with ${model}; switch models in /settings with openai/<gateway-model-id>.`,"Headless runs pick this up automatically \u2014 no --override-with-envs needed."]}}};import{join as join26}from"node:path";function piAgentDir(home){let dir=process.env.PI_CODING_AGENT_DIR;return dir&&dir.trim()?dir:join26(home,".pi","agent")}var pi={id:"pi",displayName:"Pi",async detect(home){let dir=process.env.PI_CODING_AGENT_DIR;return pathExists(dir&&dir.trim()?dir:join26(home,".pi"))},configPath(ctx){return ctx.overrides?.pi??join26(piAgentDir(ctx.home),"auth.json")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"Pi auth",format:"json",mode:384,transform:current=>mergeJson(current,{"vercel-ai-gateway":{type:"api_key",key:ctx.apiKey}})}],envExports:[],notes:["Pi will use the Vercel AI Gateway provider; pick a model with /model or --model."]}}};import{join as join27}from"node:path";var PREFERRED_MODEL2="alibaba/qwen3-coder-plus";function defaultModelId(models3){return models3[0]?.id??PREFERRED_MODEL2}function providerEntries(models3,baseUrl){return models3.map(m=>({id:m.id,name:m.name,baseUrl,envKey:GATEWAY_API_KEY_ENV,...m.context_window?{generationConfig:{contextWindowSize:m.context_window}}:{}}))}function isOurs2(value,writtenIds){if(typeof value!="object"||value===null)return!1;let entry2=value;return entry2.envKey===GATEWAY_API_KEY_ENV?!0:typeof entry2.id=="string"&&writtenIds.has(entry2.id)}var qwen={id:"qwen",displayName:"Qwen Code",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join27(home,".qwen"))},configPath(ctx){return ctx.overrides?.qwen??join27(ctx.home,".qwen","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx,{creator:"alibaba"}),defaultId=defaultModelId(models3),entries=models3.length?providerEntries(models3,baseUrl):[{id:defaultId,name:defaultId,baseUrl,envKey:GATEWAY_API_KEY_ENV}];return{fileChanges:[{path:this.configPath(ctx),label:"Qwen Code settings",format:"json",transform:current=>{let writtenIds=new Set(entries.map(e2=>e2.id)),kept=[];try{let existing=JSON.parse(current??"").modelProviders?.openai;Array.isArray(existing)&&(kept=existing.filter(e2=>!isOurs2(e2,writtenIds)))}catch{}return mergeJson(current,{modelProviders:{openai:[...kept,...entries]},security:{auth:{selectedType:"openai"}},model:{name:defaultId}})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Qwen Code will use the gateway with ${defaultId}.`,...models3.length?[`${models3.length} shortlisted gateway models are configured \u2014 the newest Qwen models first, then the gateway's most-used. Re-run setup to refresh the list.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join28}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}from"node:util";import{parse as tomlParse4,stringify as tomlStringify4}from"smol-toml";var PROVIDER_KEY6="vercel-ai-gateway";function isTable3(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function vibeDir(home){let dir=process.env.VIBE_HOME;return dir&&dir.trim()?dir:join28(home,".vibe")}function shortlist2(ctx){return shortlistModels(ctx,{creator:"mistral"})}function perMillionTokens(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value*1e6:void 0}function modelEntry(model){let input=perMillionTokens(model.pricing?.input),output=perMillionTokens(model.pricing?.output);return{name:model.id,provider:PROVIDER_KEY6,...model.context_window?{auto_compact_threshold:model.context_window}:{},...input===void 0?{}:{input_price:input},...output===void 0?{}:{output_price:output},supports_images:(model.tags??[]).includes("vision")}}var vibe={id:"vibe",displayName:"Mistral Vibe",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(vibeDir(home))},configPath(ctx){return ctx.overrides?.vibe??join28(vibeDir(ctx.home),"config.toml")},buildPlan(ctx){let path3=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=shortlist2(ctx),activeModel=models3[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path:path3,label:"Mistral Vibe config",format:"toml",transform:current=>{let doc={};if(current&&current.trim())try{doc=tomlParse4(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=Array.isArray(doc.providers)?[...doc.providers]:[],providerEntry={name:PROVIDER_KEY6,api_base:baseUrl,api_key_env_var:GATEWAY_API_KEY_ENV,api_style:"openai",backend:"generic"},at=providers2.findIndex(v=>isTable3(v)&&v.name===PROVIDER_KEY6);at===-1?providers2.push(providerEntry):providers2[at]={...providers2[at],...providerEntry};let kept=(Array.isArray(doc.models)?doc.models:[]).filter(v=>!(isTable3(v)&&v.provider===PROVIDER_KEY6)),ours=models3.length?models3.map(modelEntry):[{name:GATEWAY_DEFAULT_MODEL,provider:PROVIDER_KEY6}],desired={...doc,providers:providers2,models:[...kept,...ours],active_model:activeModel};return current&&isDeepStrictEqual3(doc,desired)?current:`${tomlStringify4(desired)}
109
109
  `}}],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(id){return CODING_AGENTS.find(a=>a.id===id)}var UNSUPPORTED_AGENTS={};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 id=raw.toLowerCase(),agent2=getAgentById(id);agent2?selected2.includes(agent2)||selected2.push(agent2):UNSUPPORTED_AGENTS[id]?(unsupported.push(id),guidance2.push(`${id}: ${UNSUPPORTED_AGENTS[id]}`)):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?
110
110
  ${import_chalk23.default.dim(" Detected agents are pre-selected \xB7")}${CHECKBOX_INSTRUCTIONS}`,instructions:!1,loop:!1,pageSize:Math.max(choices.length,7),choices})).map(id=>getAgentById(id)).filter(a=>!!a);return selected.length===0?{error:"Select at least one agent to configure.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected,guidance:guidance2,unsupported}}var import_chalk24=__toESM(require_source(),1);import{hostname,userInfo}from"node:os";var CHILD_PROMPT=import_chalk24.default.dim("\u21B3");function defaultKeyName(){let host="",user="";try{host=hostname()}catch{}try{user=userInfo().username}catch{}let device=host.split(".")[0].replace(/[-_]+/g," ").trim(),who=user.trim();return who&&device?`[${who}'s ${device}] Coding Agents`:device?`[${device}] Coding Agents`:who?`[${who}] Coding Agents`:"Coding Agents"}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){let fallback=defaultKeyName();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)||client.config.currentTeam)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}})).apiKeyString}finally{output_manager_default.stopSpinner()}}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(text3){try{return execFileSync(PBCOPY_BIN,{input:text3,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(text3){return text3.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(`
111
111
  `)}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(`
112
- `)){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})}let shellRcPath;if(envExports.length&&process.platform==="win32"&&!ctx.shellRcOverride)notes.push({id:"environment",displayName:"Environment",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}
112
+ `)){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}
113
113
  ${preserved.join(`
114
114
  `)}`:body)}})}let byPath=new Map;for(let p of pending){let entry2=byPath.get(p.path)??{label:p.label,format:p.format,mode:p.mode,owners:[],transforms:[]};entry2.owners.includes(p.owner)||entry2.owners.push(p.owner),p.mode!==void 0&&(entry2.mode=entry2.mode===void 0?p.mode:Math.min(entry2.mode,p.mode)),entry2.transforms.push(p.transform),byPath.set(p.path,entry2)}let changes=[];for(let[path3,entry2]of byPath){let current=await readFileOrNull(path3),symlink=await isSymlink(path3),next=null,status6,error;try{let acc=current;for(let transform of entry2.transforms)acc=transform(acc);next=acc,current===null?status6="create":acc===current||acc!==null&&normalizeManagedSentence(acc)===normalizeManagedSentence(current)||ctx.apiKey===KEY_PLACEHOLDER&&acc!==null&&matchesWithStoredKey(normalizeManagedSentence(current),normalizeManagedSentence(acc))?status6="unchanged":status6="update"}catch(err){status6="error",error=err instanceof Error?err.message:String(err)}changes.push({path:path3,label:entry2.label,format:entry2.format,mode:entry2.mode,owners:entry2.owners,current,next,status:status6,error,symlink})}return{changes,notes,envExports,shellRcPath,migrations}}async function enforcePlanModes(plan){for(let change2 of plan.changes)change2.status==="unchanged"&&change2.mode!==void 0&&!change2.symlink&&await ensureMode(change2.path,change2.mode)}async function applyPlan(plan,options){let results=[];await enforcePlanModes(plan);for(let change2 of plan.changes){if(change2.status!=="create"&&change2.status!=="update"||change2.next===null)continue;let backupPath;options.backup&&change2.current!==null&&(backupPath=await backupFile(change2.path,change2.mode)),await writeConfigFile(change2.path,change2.next,change2.mode),results.push({path:change2.path,label:change2.label,owners:change2.owners,action:change2.status==="create"?"created":"updated",backupPath})}return results}async function applySessionMigrations(plan){let results=[],errors=[];for(let migration of plan.migrations)try{let result=await migration.apply(),{errors:copyErrors=[],...counts}=result;results.push({agentId:migration.agentId,agent:migration.agent,label:migration.label,...counts}),errors.push(...copyErrors.map(message=>({agentId:migration.agentId,agent:migration.agent,message})))}catch(error){errors.push({agentId:migration.agentId,agent:migration.agent,message:error instanceof Error?error.message:String(error)})}return{results,errors}}var import_chalk26=__toESM(require_source(),1);var import_chalk25=__toESM(require_source(),1);function diffLines(before,after){let a=before.length?before.split(`
115
115
  `):[],b=after.length?after.split(`
@@ -133,8 +133,14 @@ ${preserved.join(`
133
133
  `)}function printWarning(message){output_manager_default.print(`${import_chalk26.default.yellow("!")} ${message}
134
134
  `)}function printStatus(message){output_manager_default.print(` ${message}
135
135
  `)}function printReceiptPath(label,path3){output_manager_default.print(` ${import_chalk26.default.bold(label.padEnd(ALIGNED_LABEL_WIDTH))}${import_chalk26.default.dim(path3)}
136
- `)}function printKeyRow(key,opts={}){printAlignedLabel(opts.created?"New API Key":"API Key",`${maskSecret(key)} \xB7 ${opts.keychain?"macOS Keychain":"Config files"}`)}function printNotes(plan){if(plan.notes.length!==0){output_manager_default.print(`
137
- `);for(let note of plan.notes)for(let line2 of note.notes)output_manager_default.log(`${note.displayName}: ${line2}`)}}function printKey(key,opts={}){output_manager_default.print(`
136
+ `)}function printKeyRow(key,opts={}){printAlignedLabel(opts.created?"New API Key":"API Key",`${maskSecret(key)} \xB7 ${opts.keychain?"macOS Keychain":"Config files"}`)}function printNotes(plan){if(plan.notes.length===0)return;let sections=plan.notes.map(note=>[note.actionRequired?`${import_chalk26.default.red("!")} ${import_chalk26.default.bold(note.displayName)} ${import_chalk26.default.red("[Action Required]")}`:` ${import_chalk26.default.bold(note.displayName)}`,...formatInstructions(note.notes)].join(`
137
+ `));output_manager_default.print(`
138
+ ${import_chalk26.default.bold(" Next steps:")}
139
+
140
+ ${sections.join(`
141
+
142
+ `)}
143
+ `)}function formatInstructions(lines){let inOrderedList=!1;return lines.flatMap((line2,index)=>{let trimmed=line2.trimStart(),numbered=/^\d+\.\s/.test(trimmed),indented2=trimmed!==line2,next=lines[index+1]?.trimStart()??"";if(trimmed.endsWith(":")&&/^\d+\.\s/.test(next))return` ${line2}`;if(numbered)return inOrderedList=!0,` ${line2}`;if(indented2)return` ${line2}`;let bullet=` - ${line2}`;return inOrderedList?(inOrderedList=!1,["",bullet]):bullet})}function printKey(key,opts={}){output_manager_default.print(`
138
144
  `),printKeyRow(key,opts)}function buildAgentPrompt(plan,apiKey){let sections=plan.changes.filter(change2=>change2.status==="create"||change2.status==="update").length>0?["Set up the Vercel AI Gateway for my coding agents by applying the file changes below.","For each file, create it if missing or edit it to match the diff (lines starting with `+` are added, `-` are removed; `\u22EF` marks skipped unchanged lines).",`Any masked value (e.g. ${maskSecret(apiKey)}) is my AI Gateway API key, stored in my macOS Keychain; the config and shell already reference it with \`security find-generic-password\`, so leave those lookups as-is and do not ask me to paste the key.`,""]:[];if(plan.migrations.length>0){sections.push("# Existing Codex Desktop sessions","Before editing the provider configuration, copy the sessions described below. Never move, delete, or overwrite the originals.");for(let migration of plan.migrations)sections.push("",`## ${migration.agent}: ${migration.label}`,...migration.prompt);sections.push("")}for(let change2 of plan.changes){if(change2.status!=="create"&&change2.status!=="update")continue;let diff2=renderDiff(change2.current??"",change2.next??"",{secrets:[apiKey],indent:"",color:!1});sections.push(`# ${change2.label} \u2014 ${change2.path}`),diff2&&sections.push(diff2),sections.push("")}return`${sections.join(`
139
145
  `).trimEnd()}
140
146
  `}function formatBytes(bytes5){return bytes5<1024?`${bytes5} B`:bytes5<1024**2?`${(bytes5/1024).toFixed(1)} KiB`:`${(bytes5/1024**2).toFixed(1)} MiB`}var import_chalk27=__toESM(require_source(),1);async function collectAgentWarnings(agents,ctx){let entries=[];for(let agent2 of agents)for(let warning2 of await agent2.warnings?.(ctx)??[])entries.push({agent:agent2,warning:warning2});return entries}function formatWarningMessage(warning2){return`${warning2.impact} ${warning2.why.join(" ")} To undo, ${warning2.undo}.`}function printAgentWarning(warning2){output_manager_default.print(`
@@ -152,8 +158,7 @@ ${preserved.join(`
152
158
  `)}else{for(let[agent2,warnings]of groupWarningsByAgent(agentWarnings)){let message=`${warnings.map(formatWarningMessage).join(" ")} Pass --agent ${agent2.id} to configure it anyway.`;consentSkipped.push({target:agent2.id,reason:AGENT_REASON.REQUIRES_CONSENT,message}),printWarning(message)}if(agents=agents.filter(a=>!consentSkipped.some(s=>s.target===a.id)),agents.length===0&&!dryRun)return failConsent(client,machine,machineWarnings,consentSkipped)}}let sessionMigrations=[];if(!noSessionMigration){try{sessionMigrations=await planSessionMigrations(agents,{home})}catch(error){return failValidation(client,machine,"session_migration_failed",`${error instanceof Error?error.message:String(error)}. No configuration was changed. Pass --no-session-migration to leave existing sessions untouched and continue.`)}if(sessionMigrations.length>0&&canPrompt2&&!yes&&!dryRun){let count2=sessionMigrations.reduce((total,migration)=>total+migration.itemCount,0),agentNames=[...new Set(sessionMigrations.map(migration=>migration.agent))].join(" and ");await client.input.confirm(count2===1?`Copy your existing ${agentNames} Desktop session so it stays visible after switching to the AI Gateway? The original will be left unchanged.`:`Copy your ${count2} existing ${agentNames} Desktop sessions so they stay visible after switching to the AI Gateway? The originals will be left unchanged.`,!0)||(sessionMigrations=[],printStatus(`Skipped ${agentNames} Desktop session migration. Your existing sessions were left unchanged.`))}}let willCreate=!providedKey,unrecoverableKey=!1,existingKey=providedKey,keyName=name,keyBudget=budget2,keyRefresh=refreshPeriod,keyExpiresAt=flagExpiresAt,topModels=await topModelsPromise??void 0,preflightPlan=await buildSetupPlan(agents,{apiKey:previewKey,home,useKeychain:wantKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations),preflightSessionOnly=!providedKey&&!reconfigure&&preflightPlan.changes.every(change2=>change2.status==="unchanged")&&preflightPlan.migrations.length>0;if(applyMode==="prompt"&&!wantKeychain&&!preflightSessionOnly)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");if(willCreate&&!preflightSessionOnly&&agents.length>0&&(!dryRun||canPrompt2)){let promptCreate=canPrompt2&&!yes,wired=await configsPointAtGateway(agents,{apiKey:KEY_PLACEHOLDER,home,overrides,shellRcOverride,baseUrlOverride:baseUrl});if(promptCreate){let pasted=await promptExistingKey(client,wired?"existing":"create");pasted&&(existingKey=pasted,previewKey=pasted,willCreate=!1)}else if(wired&&!reconfigure){let stored=await recoverStoredKey({home,shellRcOverride});stored?(existingKey=stored,previewKey=stored,willCreate=!1):machine||(unrecoverableKey=!0)}if(willCreate&&!unrecoverableKey){if(await ensureTeam2(client,{machine,canPrompt:canPrompt2,yes:!!yes}))return{exitCode:1,outcome:"failed"};if(promptCreate&&keyName===void 0&&(keyName=await promptKeyName(client)),promptCreate){if(keyBudget===void 0&&keyRefresh===void 0){let quota=await promptQuota(client);keyBudget=quota.budget,keyRefresh=quota.refreshPeriod}keyExpiresAt===void 0&&!expiration&&(keyExpiresAt=await promptExpiry(client))}}}let useKeychain=wantKeychain;if(!preflightSessionOnly&&wantKeychain&&canPrompt2&&!yes&&(useKeychain=await promptKeychain(client)),canPrompt2&&!yes){let missing=agents.filter(a=>!overrides[a.id]&&!existsSync2(dirname6(a.configPath({apiKey:"",home}))));if(missing.length>0&&await client.input.confirm("Some agents weren't found at their default locations. Set custom config paths?",!1))for(let agent2 of missing){let resolved=agent2.configPath({apiKey:"",home}),picked=(await client.input.text({message:`${agent2.displayName} config path?`,default:resolved})).trim();picked&&resolve2(picked)!==resolved&&(overrides[agent2.id]=resolve2(picked))}}let previewPlan=await buildSetupPlan(agents,{apiKey:previewKey,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(baseUrl&&!machine){let target=baseUrl.trim();previewPlan.changes.some(c=>c.next?.includes(target))||previewPlan.envExports.some(e2=>e2.value.includes(target))||previewPlan.notes.some(n=>n.notes.some(l=>l.includes(target)))||printWarning("--base-url has no effect for the selected agents.")}let changed=previewPlan.changes.filter(c=>c.status==="create"||c.status==="update"),errored=previewPlan.changes.filter(c=>c.status==="error"),noConfigChanges=changed.length===0&&errored.length===0,alreadyConfigured=noConfigChanges&&previewPlan.migrations.length===0,sessionOnly=!existingKey&&!reconfigure&&noConfigChanges&&previewPlan.migrations.length>0;if(machine)return runMachine({client,selected:agents,unsupported,warnings:machineWarnings,consentSkipped,previewPlan,dryRun:!!dryRun,backup:!noBackup,keySource:existingKey?{key:existingKey,created:!1}:null,createKey:()=>createKey(client,{name:keyName,budget:keyBudget,refreshPeriod:keyRefresh,includeByok,expiresAt:keyExpiresAt}),useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,home,alreadyConfigured,gatewayModels,reconfigure:!!reconfigure&&agents.length>0,promptMode:applyMode==="prompt"});if(unrecoverableKey&&changed.length>0)return printStatus("The selected agents already use the AI Gateway and the stored key could not be read, so nothing was written. Re-run with `--key <key>` to refresh them, or `--reconfigure` to create a new key."),{exitCode:0,outcome:"skipped"};if(alreadyConfigured){let skippedSome=agents.length<selected.length;if(dryRun&&agents.length===0&&consentSkipped.length>0)return printStatus(`All selected agents need explicit consent (see the warnings above) \u2014 a real run would fail. Pass ${consentSkipped.map(s=>`--agent ${s.target}`).join(" ")} (or --all) to consent. No files would be changed.`),{exitCode:0,outcome:"dry_run"};if(!dryRun&&useKeychain&&existingKey)return applyMode!=="prompt"&&await enforcePlanModes(previewPlan),storeKeyInKeychain(existingKey)?(printStatus(agents.length===0?"The existing configuration already uses the AI Gateway; updated the macOS Keychain with the provided key.":`${skippedSome?"The remaining":"All selected"} agents are already configured; updated the macOS Keychain with the provided key.`),printKey(existingKey,{keychain:!0}),{exitCode:0,outcome:"configured"}):(output_manager_default.error("Failed to update the key in the macOS Keychain. Re-run with --no-keychain to write it to the config files instead."),{exitCode:1,outcome:"failed"});let doReconfigure=!!reconfigure&&agents.length>0;if(!doReconfigure&&agents.length>0&&canPrompt2&&!yes&&!dryRun&&(doReconfigure=await client.input.confirm("These agents are already configured for the AI Gateway. Reconfigure them?",!1)),!doReconfigure)return!dryRun&&applyMode!=="prompt"&&await enforcePlanModes(previewPlan),printStatus(agents.length===0?"Every selected agent needs explicit consent (see the warnings above); the existing configuration already uses the AI Gateway.":`${skippedSome?"The remaining":"All selected"} agents are already configured for the AI Gateway.`),existingKey&&printKey(existingKey),{exitCode:0,outcome:"already_configured"}}if(printResolvedState({selected:agents,willCreate,name:keyName,budget:keyBudget,refreshPeriod:keyRefresh,expiresAt:keyExpiresAt,keychain:wantKeychain?useKeychain:void 0,preserveKey:sessionOnly}),printPlan(previewPlan,previewKey,{backup:!noBackup}),dryRun)return printStatus(`Dry run: no files written. Re-run without ${import_chalk28.default.bold("--dry-run")} to apply.`),{exitCode:0,outcome:"dry_run"};let agentConfigChanged=changed.filter(c=>c.format!=="shell");if(agentConfigChanged.length===0&&errored.length>0&&previewPlan.migrations.length===0)return output_manager_default.error("Couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let applyAction=applyMode==="prompt"?"copy":"apply";if(applyMode===void 0&&(changed.length>0||previewPlan.migrations.length>0)&&canPrompt2&&!yes){if(useKeychain){let choice=await client.input.select({message:"Apply these changes?",choices:[{name:"Yes, write the files now",value:"apply"},{name:"Copy a prompt for my agent",value:"copy"},{name:"Cancel",value:"cancel"}],default:"apply"});if(choice==="cancel")return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"};applyAction=choice}else if(!await client.input.confirm("Apply these changes?",!0))return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"}}if(sessionOnly){if(applyAction==="copy"&&previewPlan.migrations.length>0){let promptText=buildAgentPrompt(previewPlan,KEY_PLACEHOLDER);return emitAgentPrompt(client,promptText,applyMode==="prompt","migration"),{exitCode:0,outcome:"agent_prompt"}}dryRun||await enforcePlanModes(previewPlan);let migrated2=await applySessionMigrations(previewPlan);return printSessionMigrationReceipt(migrated2,!0),migrated2.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}if(applyAction==="copy"&&!useKeychain)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");let migrated=applyAction==="apply"?await applySessionMigrations(previewPlan):{results:[],errors:[]};if(migrated.errors.length>0)return printSessionMigrationReceipt(migrated),output_manager_default.error("Session migration did not complete, so no agent configuration was changed. Rerun the command to retry, or pass --no-session-migration to set up without copying sessions."),{exitCode:1,outcome:"failed"};if(migrated.results.length>0&&printSessionMigrationReceipt(migrated,!0),applyAction==="apply"&&agentConfigChanged.length===0&&errored.length>0)return output_manager_default.error("Copied the eligible sessions, but couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let keySource;try{keySource=existingKey?{key:existingKey,created:!1}:{key:await createKey(client,{name:keyName,budget:keyBudget,refreshPeriod:keyRefresh,includeByok,expiresAt:keyExpiresAt}),created:!0}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1,outcome:"failed"};throw err}if(useKeychain&&!storeKeyInKeychain(keySource.key)){if(applyAction==="copy")return output_manager_default.error("Failed to store the key in the macOS Keychain, so a prompt would expose your plaintext key. Re-run and choose Apply, or pass --no-keychain to write the key to the config files."),{exitCode:1,outcome:"failed"};printWarning("Failed to store the key in the macOS Keychain; writing it to the config files instead."),useKeychain=!1}let applyPlanResult=await buildSetupPlan(agents,{apiKey:keySource.key,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(applyAction==="copy"){let promptText=buildAgentPrompt(applyPlanResult,keySource.key);return emitAgentPrompt(client,promptText,applyMode==="prompt","setup"),printKey(keySource.key,{keychain:!0,created:keySource.created}),{exitCode:0,outcome:"agent_prompt"}}let results=await applyPlan(applyPlanResult,{backup:!noBackup});if(results.length===0&&keySource.created&&(output_manager_default.print(`
153
159
  `),printAlignedLabel("Rotated","AI Gateway API key"),printKeyRow(keySource.key,{keychain:useKeychain,created:keySource.created}),output_manager_default.print(import_chalk28.default.dim(` No config files changed.
154
160
  `))),results.length>0){let failed=new Set(errored.flatMap(c=>c.owners)),connected=selected.map(a=>a.displayName).filter(name2=>!failed.has(name2));output_manager_default.print(`
155
- `),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}),results.some(r=>r.backupPath)&&output_manager_default.print(import_chalk28.default.dim(` Previous files saved alongside as .bak
156
- `))}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}
161
+ `),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}
157
162
  `),migrated.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}function printSessionMigrationReceipt(migration,gutter=!1){gutter&&output_manager_default.print(`
158
163
  `);for(let result of migration.results)printAlignedLabel("Sessions",`Copied ${result.copied} ${result.copied===1?"session":"sessions"} for ${result.agent}; originals unchanged`,gutter?{gutter:"\u2713"}:void 0),gutter=!1;for(let error of migration.errors)printWarning(`Could not migrate ${error.agent} sessions: ${error.message}. Original sessions were left unchanged.`)}function emitAgentPrompt(client,prompt,writeToStdout,subject){let copied=copyToClipboard(prompt);writeToStdout?(printStatus(`Generated the ${subject} prompt${copied?" (also copied to clipboard)":""}.`),client.stdout.write(`${prompt}
159
164
  `)):copied?printStatus(`Prompt copied. Paste it into your coding agent for the ${subject}.`):(printStatus("Could not access the clipboard. Prompt printed below:"),client.stdout.write(`${prompt}
@@ -169,7 +174,7 @@ ${preserved.join(`
169
174
  `),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),2):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),2):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),2):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),2):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),2;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),2):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),2):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),1)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var builtInBody={type:"built-in",name:"Production server errors",triggers:{mode:"selected",items:[{type:"error_anomaly",filter:"statusGroup:5xx AND route:/api/*"}]},matchMinimumSeverityLevel:"high"};function getRulesAddBodyExamplesHelp(){return["Scope",""," Provide ruleScope in the body or use a scope flag, not both."," --project maps to one included project."," --all maps to every project in the team.","","Built-in body (rule.json)","",indent_default(JSON.stringify(builtInBody,null,2),2),""," vercel alerts rules add --project my-app --body ./rule.json","","Authoring reference",""," vercel alerts rules schema --type built-in",""].join(`
170
175
  `)}function getRulesUpdateBodyExamplesHelp(){return["Update body",""," Include only the fields to change. type is optional and inferred from the stored rule."," Use --project or --all to change scope with or without --body."," Do not combine a ruleScope field in the body with --project or --all."," --all moves the rule to team-wide scope.","","Partial body (patch.json)","",indent_default(JSON.stringify({name:"Critical production errors",matchMinimumSeverityLevel:"critical"},null,2),2),""," vercel alerts rules update ar_abc123 --body ./patch.json"," vercel alerts rules update ar_abc123 --project my-app","","Authoring reference",""," vercel alerts rules schema --type built-in",""].join(`
171
176
  `)}var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg=>arg==="-help"?"--help":arg)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},1),printError(err),1}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"],rulesHelpParent={...rulesAggregateCommand,name:`${alertsCommand.name} ${rulesAggregateCommand.name}`},notificationsHelpParent={...rulesNotificationsAggregateCommand,name:`${rulesHelpParent.name} ${rulesNotificationsAggregateCommand.name}`};function printHelp(command2,parent=alertsCommand,extra){let helpOutput=help(command2,{parent,columns:client.stderr.columns});output_manager_default.print(extra?`${helpOutput}
172
- ${extra}`:helpOutput)}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesHelpParent),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesHelpParent),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesHelpParent,getRulesAddBodyExamplesHelp()),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesHelpParent),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesHelpParent),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesHelpParent,getRulesUpdateBodyExamplesHelp()),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,notificationsHelpParent),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,notificationsHelpParent),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,notificationsHelpParent),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,notificationsHelpParent),0):(printHelp(rulesNotificationsAggregateCommand,rulesHelpParent),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-GTALMRKE.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-PKOTTFKG.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-57XWFXDW.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let{contextName}=await getScope(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
177
+ ${extra}`:helpOutput)}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesHelpParent),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesHelpParent),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesHelpParent,getRulesAddBodyExamplesHelp()),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesHelpParent),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesHelpParent),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesHelpParent,getRulesUpdateBodyExamplesHelp()),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,notificationsHelpParent),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,notificationsHelpParent),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,notificationsHelpParent),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,notificationsHelpParent),0):(printHelp(rulesNotificationsAggregateCommand,rulesHelpParent),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-CQAFY6OA.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-B2XF44SN.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-HBPNOZ36.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let{contextName}=await getScope(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
173
178
  `)}else if(output_manager_default.log(`aliases found under ${import_chalk32.default.bold(contextName)} ${lsStamp()}`),client.stdout.write(printAliasTable(aliases2)),pagination.next){let flags=getCommandFlags(opts,["_","--next","--format"]);output_manager_default.log(`To display the next page run ${getCommandName(`alias ls${flags} --next ${pagination.next}`)}`)}return 0}function printAliasTable(aliases2){return`${table([["source","url","age"].map(header=>import_chalk32.default.gray(header)),...aliases2.map(a=>[a.deployment?.url?a.deployment.url:import_chalk32.default.gray("\u2013"),a.alias,(0,import_ms2.default)(Date.now()-a.createdAt)])],{align:["l","l","r"],hsep:4}).replace(/^/gm," ")}
174
179
 
175
180
  `}var import_chalk33=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);async function removeAliasById(client,id){return client.fetch(`/now/aliases/${id}`,{method:"DELETE"})}async function findAliasByAliasOrId(client,aliasOrId){return client.fetch(`/now/aliases/${encodeURIComponent(getSafeAlias(aliasOrId))}`)}function getSafeAlias(alias2){return alias2.replace(/^https:\/\//i,"").replace(/^\.+/,"").replace(/\.+$/,"").toLowerCase()}var AliasRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentAlias(alias2){alias2&&this.trackCliArgument({arg:"alias",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(removeSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags:opts}=parsedArguments,{contextName}=await getScope(client),telemetryClient=new AliasRemoveTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliFlagYes(opts["--yes"]);let[aliasOrId]=args;if(telemetryClient.trackCliArgumentAlias(aliasOrId),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("alias rm <alias>")}`)}`),1;if(!aliasOrId)return output_manager_default.error(`${getCommandName("alias rm <alias>")} expects one argument`),1;if(!isValidName(aliasOrId))return output_manager_default.error(`The provided argument "${aliasOrId}" is not a valid alias`),1;let alias2=await findAliasByAliasOrId(client,aliasOrId);if(!alias2)return output_manager_default.error(`Alias not found by "${aliasOrId}" under ${import_chalk33.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("alias ls")} to see your aliases.`),1;let removeStamp=stamp_default();return!opts["--yes"]&&!await confirmAliasRemove(client,alias2)?(output_manager_default.log("Canceled"),0):(await removeAliasById(client,alias2.uid),output_manager_default.success(`Alias ${import_chalk33.default.bold(alias2.alias)} removed ${removeStamp()}`),0)}async function confirmAliasRemove(client,alias2){let srcUrl=alias2.deployment?import_chalk33.default.underline(alias2.deployment.url):null,tbl=table([[...srcUrl?[srcUrl]:[],import_chalk33.default.underline(alias2.alias),import_chalk33.default.gray(`${(0,import_ms3.default)(Date.now()-alias2.createdAt)} ago`)]],{hsep:4});return output_manager_default.log("The following alias will be removed permanently"),output_manager_default.print(` ${tbl}
@@ -223,7 +228,7 @@ validUntil=${result.validUntil} (${new Date(result.validUntil).toISOString()})
223
228
  `):printWebhookSecret(webhookSecret)}function printSetFailure(err,client,team){return isAPIError(err)?(output_manager_default.error(err.message),err.status>=500&&printInspectBeforeRetry(client,team),1):(output_manager_default.error(err instanceof Error?err.message:"Failed to save budget."),printInspectBeforeRetry(client,team),1)}function printInspectBeforeRetry(client,team){output_manager_default.log(`If the budget may already exist, run ${scopedBudgetCommand(client,team,"budgets")} before retrying. Retrying this save can drop a new webhook secret.`)}function printWebhookSecret(secret){secret&&(output_manager_default.log(`Webhook secret: ${secret}`),output_manager_default.log("Store it now \u2014 it cannot be retrieved later."))}var BudgetRemoveTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove6(client,argv){let telemetry2=new BudgetRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand17.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts,args}=parsedArgs,yes=opts["--yes"];if(rejectUnexpectedArgs(args,"budgets remove"))return 1;let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;telemetry2.trackCliFlagYes(yes),telemetry2.trackCliOptionFormat(opts["--format"]?"json":void 0),telemetry2.trackCliFlagJson(opts["--json"]);let team=await resolveBudgetTeam(client);if(!team)return 1;let selector=TEAM_BUDGET;output_manager_default.spinner("Fetching budgets\u2026");let target;try{target=await findBudget(client,selector)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}if(output_manager_default.stopSpinner(),!target)return asJson?client.stdout.write(`${JSON.stringify(removeReceipt({team,alreadyAbsent:!0,disabled:null,scope:selector.scope}),null,2)}
224
229
  `):output_manager_default.log(`No budget to remove on team ${team.slug}.`),0;let amountLabel=formatUsdWhole(budgetAmountDollars(target));if(!yes){if(!client.stdin.isTTY||client.nonInteractive)return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Disable the ${amountLabel} budget on team ${team.slug}?`,!1))return output_manager_default.log("Canceled."),0}output_manager_default.spinner(`Disabling budget on team ${team.slug}\u2026`);try{await removeBudget2(client,target.id)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}return output_manager_default.stopSpinner(),asJson?(client.stdout.write(`${JSON.stringify(removeReceipt({team,alreadyAbsent:!1,disabled:target.id,scope:selector.scope}),null,2)}
225
230
  `),0):(output_manager_default.success(`Disabled the ${amountLabel} budget on team ${team.slug}.`),0)}var import_chalk47=__toESM(require_source(),1);var BudgetInspectTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect5(client,argv){let telemetry2=new BudgetInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand14.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{flags:opts,args}=parsedArgs;if(rejectUnexpectedArgs(args,"budgets"))return 1;let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(opts["--format"]?"json":void 0),telemetry2.trackCliFlagJson(opts["--json"]);let team=await resolveBudgetTeam(client);if(!team)return 1;let selector=TEAM_BUDGET;output_manager_default.spinner("Fetching spend\u2026");let spend,state;try{let[budget2,teamSpend]=await Promise.all([findBudget(client,selector),getTeamSpend(client,team.id,selector)]);spend=teamSpend,budget2&&(state=await toBudgetState(client,budget2,selector))}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let spendDollars=spend.currentSpend===null?null:spend.currentSpend/100,percentUsed=spendDollars!==null&&state&&state.amount>0?Math.round(spendDollars/state.amount*100):null;if(asJson)return client.stdout.write(`${JSON.stringify({teamId:team.id,teamSlug:team.slug,spend:{currentSpend:spendDollars,percentUsed,unit:"usd"},budget:state?budgetStatePayload(state):null},null,2)}
226
- `),0;let spendLabel=spendDollars===null?"\u2014":formatUsd(spendDollars),percentLabel=percentUsed===null?"":` (${percentUsed}% used)`;return output_manager_default.log(`Current spend ${import_chalk47.default.bold(spendLabel)}${percentLabel}`),state?(warnUnavailableWebhooks([state]),client.stdout.write(printBudgetsTable2([state])),0):(output_manager_default.log(`No budget set on team ${team.slug}. Create one with ${getCommandName("budgets set --amount <dollars>")}.`),0)}var COMMAND_CONFIG15={inspect:getCommandAliases(inspectSubcommand14),list:getCommandAliases(listSubcommand28),set:getCommandAliases(setSubcommand3),remove:getCommandAliases(removeSubcommand17)},ADVERTISED_COMMAND_CONFIG=COMMAND_CONFIG15;async function budget(client){let parsedArgs,flagsSpecification=getFlagsSpecification(budgetCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new BudgetTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG15),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("budgets"),output_manager_default.print(help(budgetCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:budgetCommand,columns:client.stderr.columns}))}switch(subcommand){case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(inspectSubcommand14),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect5(client,args));case"list":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(listSubcommand28),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list12(client,args));case"set":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(setSubcommand3),2):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set4(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(removeSubcommand17),2):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove6(client,args));default:{let unknown=args[0];return unknown&&!unknown.startsWith("-")?(output_manager_default.error(getInvalidSubcommand(ADVERTISED_COMMAND_CONFIG)),output_manager_default.print(help(budgetCommand,{columns:client.stderr.columns})),2):needHelp?(telemetry2.trackCliFlagHelp("budgets"),output_manager_default.print(help(budgetCommand,{columns:client.stderr.columns})),2):inspect5(client,args)}}}import{createRequire}from"node:module";import{isAbsolute as isAbsolute6}from"node:path";var require_=createRequire(__filename),COMMAND_CONFIG16={preinstall:getCommandAliases(preinstallSubcommand)};async function builders(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(buildersCommand.options),{permissive:!0})}catch(error){return printError(error),1}let{subcommand,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG16);if(subcommand!=="preinstall"||args.length>0)return output_manager_default.error("Only `vercel builders preinstall` is supported."),2;if(!isNativeBinaryInstall())return output_manager_default.error("Builder preinstallation requires the native Vercel CLI."),1;let configuredCacheRoot=process.env.VERCEL_BUILDERS_DIR;if(!configuredCacheRoot)return output_manager_default.error("Set VERCEL_BUILDERS_DIR to preinstall Builders."),1;if(!isAbsolute6(configuredCacheRoot))return output_manager_default.error("VERCEL_BUILDERS_DIR must be an absolute path."),1;let cacheRoot=configuredCacheRoot;try{let[{loadEmbeddedBuilderGraphs},{createVltBuilderImporter}]=await Promise.all([import("./chunks/vlt-builder-graph-B4DFIUS6.js"),import("./chunks/vlt-builder-importer-6DGKK72W.js")]),graphs=await loadEmbeddedBuilderGraphs(),specs=new Map(Object.keys(graphs.builders).map(name=>[name,name])),loadedBuilders=await createVltBuilderImporter({graphs,require:require_,cacheRoot,debug:message=>output_manager_default.debug(message)})(specs),missingBuilders=[...specs.keys()].filter(spec=>!loadedBuilders.has(spec));if(missingBuilders.length>0)throw new Error(`Failed to load preinstalled Builders: ${missingBuilders.join(", ")}`);return output_manager_default.log(`Preinstalled ${loadedBuilders.size} Builders in ${cacheRoot}`),0}catch(error){return printError(error),1}}var import_chalk48=__toESM(require_source(),1);async function createPurchase(client,item){return client.fetch("/v1/billing/buy?source=cli",{method:"POST",body:{item}})}var import_open2=__toESM(require_open(),1),import_error_utils3=__toESM(require_dist(),1);var getTeamBillingUrl=teamSlug=>`https://vercel.com/${teamSlug}/~/settings/billing`;function tryOpenBillingPage(teamSlug,openBrowser){if(!openBrowser)return;let billingUrl=teamSlug?getTeamBillingUrl(teamSlug):"https://vercel.com/dashboard";(0,import_open2.default)(billingUrl).catch(err=>{output_manager_default.debug(`Failed to open browser: ${err}`)})}function handlePurchaseError(err,teamSlug,opts){let openBrowser=opts?.openBrowser??!1;if(isAPIError(err)){if(err.code==="invalid_plan_iteration")return output_manager_default.error("Your team must be on the Flex plan to purchase add-ons."),1;if(err.code==="missing_subscription")return output_manager_default.error("Your team does not have an active subscription. Please contact support."),1;if(err.code==="missing_stripe_customer"){let billingUrl=teamSlug?getTeamBillingUrl(teamSlug):"https://vercel.com/dashboard",dashboardHint=teamSlug?` Please add one: ${output_manager_default.link(billingUrl,billingUrl)}`:` Please add one in the ${output_manager_default.link("Vercel dashboard",billingUrl)}.`;return output_manager_default.error(`Your team does not have a payment method on file.${dashboardHint}`),tryOpenBillingPage(teamSlug,openBrowser),1}if(err.code==="invalid_v0_subscription"){let pricingUrl="https://v0.app/pricing";return output_manager_default.error(`Your team must have a paid v0 plan to purchase v0 credits. Upgrade at ${output_manager_default.link(pricingUrl,pricingUrl)}`),1}if(err.code==="invalid_plan")return output_manager_default.error("Your team's current plan does not support this purchase."),1;if(err.code==="already_on_plan")return output_manager_default.error("Your team already has an active subscription for this plan."),1;if(err.code==="invalid_status")return output_manager_default.error("Your team is not in a state that allows plan changes. Please contact support."),1;if(err.code==="forbidden")return output_manager_default.error("You do not have permission to make purchases for this team. Please contact your account administrator."),1;if(err.code==="purchase_create_failed"||err.code==="purchase_confirm_failed"||err.code==="purchase_complete_failed"||err.code==="purchase_create_hosted_failed")return err.status===402?(output_manager_default.error("Payment failed. Please check that your team has a valid payment method on file."),tryOpenBillingPage(teamSlug,openBrowser),1):(output_manager_default.error("An error occurred while processing your purchase. Please try again later."),output_manager_default.debug(`Error code: ${err.code}`),1);if(err.status===402||err.code==="payment_failed")return output_manager_default.error("Payment failed. Please check the payment method on file for your team."),tryOpenBillingPage(teamSlug,openBrowser),1}return output_manager_default.error("An unexpected error occurred while completing your purchase. Please try again later."),output_manager_default.debug(`Server response: ${(0,import_error_utils3.errorToString)(err)}`),1}var MAX_CREDIT_PURCHASE_AMOUNT=1e3;async function credits(client,argv){let flagsSpecification=getFlagsSpecification(creditsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,{args}=parsedArgs,[creditType,amountStr]=args;if(!creditType)return output_manager_default.error(`Missing credit type. Supported types: ${SUPPORTED_CREDIT_TYPES.join(", ")}`),output_manager_default.log(`Run ${getCommandName("buy credits --help")} for usage.`),1;if(!SUPPORTED_CREDIT_TYPES.includes(creditType))return output_manager_default.error(`Invalid credit type "${creditType}". Supported types: ${SUPPORTED_CREDIT_TYPES.join(", ")}`),1;if(!amountStr)return output_manager_default.error("Missing amount. Please specify the amount in dollars."),output_manager_default.log(`Run ${getCommandName("buy credits --help")} for usage.`),1;let amount=Number(amountStr);if(!Number.isInteger(amount))return output_manager_default.error(`Invalid amount "${amountStr}". Please specify a whole number (in dollars).`),1;if(amount<=0)return output_manager_default.error(`Invalid amount "${amountStr}". Please specify a positive amount in dollars.`),1;if(amount>MAX_CREDIT_PURCHASE_AMOUNT)return output_manager_default.error(`Amount cannot exceed $${MAX_CREDIT_PURCHASE_AMOUNT.toLocaleString()} per purchase via CLI.`),1;let{team,contextName}=await getScope(client);if(!team)return output_manager_default.error("This command must be run with a team scope. Use --scope to specify a team."),1;let typedCreditType=creditType,label=CREDIT_TYPE_LABELS[typedCreditType];if(!parsedArgs.flags["--yes"]){if(!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if(!await client.input.confirm(`Purchase ${import_chalk48.default.bold(`$${amount}`)} of ${label} credits for team ${import_chalk48.default.bold(contextName)}?`,!1))return 0}let purchaseStamp=stamp_default();output_manager_default.spinner("Processing purchase");try{let result=await createPurchase(client,{type:"credits",creditType:typedCreditType,amount});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({creditType:typedCreditType,amount,team:contextName,purchaseIntent:result.purchaseIntent},null,2)}
231
+ `),0;let spendLabel=spendDollars===null?"\u2014":formatUsd(spendDollars),percentLabel=percentUsed===null?"":` (${percentUsed}% used)`;return output_manager_default.log(`Current spend ${import_chalk47.default.bold(spendLabel)}${percentLabel}`),state?(warnUnavailableWebhooks([state]),client.stdout.write(printBudgetsTable2([state])),0):(output_manager_default.log(`No budget set on team ${team.slug}. Create one with ${getCommandName("budgets set --amount <dollars>")}.`),0)}var COMMAND_CONFIG15={inspect:getCommandAliases(inspectSubcommand14),list:getCommandAliases(listSubcommand28),set:getCommandAliases(setSubcommand3),remove:getCommandAliases(removeSubcommand17)},ADVERTISED_COMMAND_CONFIG=COMMAND_CONFIG15;async function budget(client){let parsedArgs,flagsSpecification=getFlagsSpecification(budgetCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new BudgetTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG15),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("budgets"),output_manager_default.print(help(budgetCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:budgetCommand,columns:client.stderr.columns}))}switch(subcommand){case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(inspectSubcommand14),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect5(client,args));case"list":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(listSubcommand28),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list12(client,args));case"set":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(setSubcommand3),2):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set4(client,args));case"remove":return needHelp?(telemetry2.trackCliFlagHelp("budgets",subcommandOriginal),printHelp(removeSubcommand17),2):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),remove6(client,args));default:{let unknown=args[0];return unknown&&!unknown.startsWith("-")?(output_manager_default.error(getInvalidSubcommand(ADVERTISED_COMMAND_CONFIG)),output_manager_default.print(help(budgetCommand,{columns:client.stderr.columns})),2):needHelp?(telemetry2.trackCliFlagHelp("budgets"),output_manager_default.print(help(budgetCommand,{columns:client.stderr.columns})),2):inspect5(client,args)}}}import{createRequire}from"node:module";import{isAbsolute as isAbsolute6}from"node:path";var require_=createRequire(__filename),COMMAND_CONFIG16={preinstall:getCommandAliases(preinstallSubcommand)};async function builders(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(buildersCommand.options),{permissive:!0})}catch(error){return printError(error),1}let{subcommand,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG16);if(subcommand!=="preinstall"||args.length>0)return output_manager_default.error("Only `vercel builders preinstall` is supported."),2;if(!isNativeBinaryInstall())return output_manager_default.error("Builder preinstallation requires the native Vercel CLI."),1;let configuredCacheRoot=process.env.VERCEL_BUILDERS_DIR;if(!configuredCacheRoot)return output_manager_default.error("Set VERCEL_BUILDERS_DIR to preinstall Builders."),1;if(!isAbsolute6(configuredCacheRoot))return output_manager_default.error("VERCEL_BUILDERS_DIR must be an absolute path."),1;let cacheRoot=configuredCacheRoot;try{let[{loadEmbeddedBuilderGraphs},{createVltBuilderImporter}]=await Promise.all([import("./chunks/vlt-builder-graph-B4DFIUS6.js"),import("./chunks/vlt-builder-importer-W63QEXYX.js")]),graphs=await loadEmbeddedBuilderGraphs(),specs=new Map(Object.keys(graphs.builders).map(name=>[name,name])),loadedBuilders=await createVltBuilderImporter({graphs,require:require_,cacheRoot,debug:message=>output_manager_default.debug(message)})(specs),missingBuilders=[...specs.keys()].filter(spec=>!loadedBuilders.has(spec));if(missingBuilders.length>0)throw new Error(`Failed to load preinstalled Builders: ${missingBuilders.join(", ")}`);return output_manager_default.log(`Preinstalled ${loadedBuilders.size} Builders in ${cacheRoot}`),0}catch(error){return printError(error),1}}var import_chalk48=__toESM(require_source(),1);async function createPurchase(client,item){return client.fetch("/v1/billing/buy?source=cli",{method:"POST",body:{item}})}var import_open2=__toESM(require_open(),1),import_error_utils3=__toESM(require_dist(),1);var getTeamBillingUrl=teamSlug=>`https://vercel.com/${teamSlug}/~/settings/billing`;function tryOpenBillingPage(teamSlug,openBrowser){if(!openBrowser)return;let billingUrl=teamSlug?getTeamBillingUrl(teamSlug):"https://vercel.com/dashboard";(0,import_open2.default)(billingUrl).catch(err=>{output_manager_default.debug(`Failed to open browser: ${err}`)})}function handlePurchaseError(err,teamSlug,opts){let openBrowser=opts?.openBrowser??!1;if(isAPIError(err)){if(err.code==="invalid_plan_iteration")return output_manager_default.error("Your team must be on the Flex plan to purchase add-ons."),1;if(err.code==="missing_subscription")return output_manager_default.error("Your team does not have an active subscription. Please contact support."),1;if(err.code==="missing_stripe_customer"){let billingUrl=teamSlug?getTeamBillingUrl(teamSlug):"https://vercel.com/dashboard",dashboardHint=teamSlug?` Please add one: ${output_manager_default.link(billingUrl,billingUrl)}`:` Please add one in the ${output_manager_default.link("Vercel dashboard",billingUrl)}.`;return output_manager_default.error(`Your team does not have a payment method on file.${dashboardHint}`),tryOpenBillingPage(teamSlug,openBrowser),1}if(err.code==="invalid_v0_subscription"){let pricingUrl="https://v0.app/pricing";return output_manager_default.error(`Your team must have a paid v0 plan to purchase v0 credits. Upgrade at ${output_manager_default.link(pricingUrl,pricingUrl)}`),1}if(err.code==="invalid_plan")return output_manager_default.error("Your team's current plan does not support this purchase."),1;if(err.code==="already_on_plan")return output_manager_default.error("Your team already has an active subscription for this plan."),1;if(err.code==="invalid_status")return output_manager_default.error("Your team is not in a state that allows plan changes. Please contact support."),1;if(err.code==="forbidden")return output_manager_default.error("You do not have permission to make purchases for this team. Please contact your account administrator."),1;if(err.code==="purchase_create_failed"||err.code==="purchase_confirm_failed"||err.code==="purchase_complete_failed"||err.code==="purchase_create_hosted_failed")return err.status===402?(output_manager_default.error("Payment failed. Please check that your team has a valid payment method on file."),tryOpenBillingPage(teamSlug,openBrowser),1):(output_manager_default.error("An error occurred while processing your purchase. Please try again later."),output_manager_default.debug(`Error code: ${err.code}`),1);if(err.status===402||err.code==="payment_failed")return output_manager_default.error("Payment failed. Please check the payment method on file for your team."),tryOpenBillingPage(teamSlug,openBrowser),1}return output_manager_default.error("An unexpected error occurred while completing your purchase. Please try again later."),output_manager_default.debug(`Server response: ${(0,import_error_utils3.errorToString)(err)}`),1}var MAX_CREDIT_PURCHASE_AMOUNT=1e3;async function credits(client,argv){let flagsSpecification=getFlagsSpecification(creditsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,{args}=parsedArgs,[creditType,amountStr]=args;if(!creditType)return output_manager_default.error(`Missing credit type. Supported types: ${SUPPORTED_CREDIT_TYPES.join(", ")}`),output_manager_default.log(`Run ${getCommandName("buy credits --help")} for usage.`),1;if(!SUPPORTED_CREDIT_TYPES.includes(creditType))return output_manager_default.error(`Invalid credit type "${creditType}". Supported types: ${SUPPORTED_CREDIT_TYPES.join(", ")}`),1;if(!amountStr)return output_manager_default.error("Missing amount. Please specify the amount in dollars."),output_manager_default.log(`Run ${getCommandName("buy credits --help")} for usage.`),1;let amount=Number(amountStr);if(!Number.isInteger(amount))return output_manager_default.error(`Invalid amount "${amountStr}". Please specify a whole number (in dollars).`),1;if(amount<=0)return output_manager_default.error(`Invalid amount "${amountStr}". Please specify a positive amount in dollars.`),1;if(amount>MAX_CREDIT_PURCHASE_AMOUNT)return output_manager_default.error(`Amount cannot exceed $${MAX_CREDIT_PURCHASE_AMOUNT.toLocaleString()} per purchase via CLI.`),1;let{team,contextName}=await getScope(client);if(!team)return output_manager_default.error("This command must be run with a team scope. Use --scope to specify a team."),1;let typedCreditType=creditType,label=CREDIT_TYPE_LABELS[typedCreditType];if(!parsedArgs.flags["--yes"]){if(!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if(!await client.input.confirm(`Purchase ${import_chalk48.default.bold(`$${amount}`)} of ${label} credits for team ${import_chalk48.default.bold(contextName)}?`,!1))return 0}let purchaseStamp=stamp_default();output_manager_default.spinner("Processing purchase");try{let result=await createPurchase(client,{type:"credits",creditType:typedCreditType,amount});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({creditType:typedCreditType,amount,team:contextName,purchaseIntent:result.purchaseIntent},null,2)}
227
232
  `):(output_manager_default.success(`Purchased ${import_chalk48.default.bold(`$${amount}`)} of ${label} credits for ${import_chalk48.default.bold(contextName)} ${purchaseStamp()}`),result.purchaseIntent&&output_manager_default.debug(`Purchase intent: ${result.purchaseIntent.id}`)),0}catch(err){return output_manager_default.stopSpinner(),handlePurchaseError(err,contextName,{openBrowser:!!client.stdout.isTTY})}}var import_chalk49=__toESM(require_source(),1);var import_error_utils4=__toESM(require_dist(),1);function handleCustomEnvironmentPurchaseError(err){if(isAPIError(err)){if(err.code==="upgrade_required")return output_manager_default.error("Custom environment purchases require an active Pro or Enterprise plan."),output_manager_default.log(`Upgrade with ${getCommandName("buy pro")} or visit ${output_manager_default.link("vercel.com/pricing","https://vercel.com/pricing")}.`),1;if(err.code==="custom_environments_not_available_to_purchase")return output_manager_default.error(err.serverMessage||"Custom environments are not available to purchase on this team."),1;if(err.code==="custom_environments_in_use")return output_manager_default.error(err.serverMessage||"This project is using more custom environments than the requested capacity allows."),1;if(err.code==="bad_request"&&err.serverMessage)return output_manager_default.error(err.serverMessage),1;if(err.code==="forbidden")return output_manager_default.error(err.serverMessage||"You do not have permission to update custom environment capacity for this project."),1}return output_manager_default.error("An error occurred while updating custom environment capacity. Please try again later."),output_manager_default.debug(`Server response: ${(0,import_error_utils4.errorToString)(err)}`),1}async function purchaseCustomEnvironmentCapacity(client,{packs,yes,projectName,commandName}){let{cwd}=client,link=await ensureLink(commandName,client,cwd,{autoConfirm:yes,projectName,failIfNotFound:!!projectName});if(typeof link=="number")return link;let projectId=link.project.id,projectNameResolved=link.project.name;output_manager_default.spinner("Fetching custom environment settings");let settings;try{settings=await client.fetch(`/v1/projects/custom-environments/settings?projectId=${encodeURIComponent(projectId)}`,{accountId:link.org.id})}catch(err){return output_manager_default.stopSpinner(),handleCustomEnvironmentPurchaseError(err)}output_manager_default.stopSpinner();let{packSize}=settings,purchasedPacks=settings.purchasedAmount/packSize,minPacks=settings.minPurchasedAmount/packSize,maxPacks=settings.maxPurchasedAmount/packSize;if(packs<minPacks||packs>maxPacks){let minEnvironments=minPacks*packSize,maxEnvironments=maxPacks*packSize;return output_manager_default.error(`Packs must be between ${minPacks} and ${maxPacks} for this project (${minEnvironments}-${maxEnvironments} purchased environments).`),1}if(packs===purchasedPacks)return output_manager_default.log(`Project ${import_chalk49.default.bold(projectNameResolved)} already has ${import_chalk49.default.bold(packs)} custom environment pack${packs===1?"":"s"} purchased.`),0;let purchasedAmount=packs*packSize,isIncreasing=packs>purchasedPacks;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if(!await client.input.confirm(`${isIncreasing?"Purchase":"Reduce to"} ${import_chalk49.default.bold(packs)} custom environment pack${packs===1?"":"s"} (${purchasedAmount} environments) for project ${import_chalk49.default.bold(projectNameResolved)}?`,!1))return 0}let purchaseStamp=stamp_default();output_manager_default.spinner("Updating custom environment capacity");try{let result=await client.fetch(`/v1/projects/custom-environments/settings?projectId=${encodeURIComponent(projectId)}`,{method:"POST",body:{purchasedAmount},accountId:link.org.id});return output_manager_default.stopSpinner(),output_manager_default.success(`Updated custom environment capacity for ${import_chalk49.default.bold(projectNameResolved)} to ${import_chalk49.default.bold(packs)} pack${packs===1?"":"s"} (${result.purchasedAmount} environments) ${purchaseStamp()}`),0}catch(err){return output_manager_default.stopSpinner(),handleCustomEnvironmentPurchaseError(err)}}function validateCustomEnvironmentPacks(packsStr){if(!packsStr)return{error:"Missing packs. Specify the number of custom environment packs to purchase.",usage:`Example: ${getCommandName(`buy addon custom-environment ${2}`)} \u2014 each pack adds ${5} environments.`};let packs=Number(packsStr);return Number.isInteger(packs)?packs<0?{error:`Invalid packs "${packsStr}". Please specify a non-negative number.`}:{packs}:{error:`Invalid packs "${packsStr}". Please specify a whole number.`}}var OBSERVABILITY_PLUS_ADDON_ALIASES=new Set(["observability","observabilityplus","observability-plus","observability_plus"]);function isObservabilityPlusAddonAlias(name){return OBSERVABILITY_PLUS_ADDON_ALIASES.has(name.toLowerCase())}var import_error_utils5=__toESM(require_dist(),1);var OBSERVABILITY_PLUS_PRODUCT_ALIAS="observabilityPlus";async function purchaseObservabilityPlus(client,{yes,asJson}){let{team,contextName}=await getScope(client);if(!team)return output_manager_default.error("Observability Plus requires a team. Use --scope to specify one."),1;if(team.billing?.plan==="hobby")return output_manager_default.error("Observability Plus requires an active Pro or Enterprise plan."),output_manager_default.log(`Upgrade with ${getCommandName("buy pro")}.`),1;let currentConfiguration;asJson||output_manager_default.spinner("Checking Observability Plus status");try{currentConfiguration=await client.fetch("/v1/observability/manage/configuration")}catch(err){return output_manager_default.stopSpinner(),output_manager_default.error("Failed to check Observability Plus status."),output_manager_default.debug(`Server response: ${(0,import_error_utils5.errorToString)(err)}`),1}if(output_manager_default.stopSpinner(),currentConfiguration.observabilityPlus.subscribed)return asJson?client.stdout.write(`${JSON.stringify({productAlias:OBSERVABILITY_PLUS_PRODUCT_ALIAS,quantity:1,team:contextName,teamEnabled:currentConfiguration.observabilityPlus.enabled},null,2)}
228
233
  `):(printAlignedLabel("Status","Already enabled"),printAlignedLabel("Team",contextName)),0;if(!yes&&(!client.stdin.isTTY||client.nonInteractive))return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if((!asJson||!yes)&&(printAlignedLabel("Add-on","Observability Plus"),printAlignedLabel("Team",contextName),printAlignedLabel("Usage","Billed as accrued")),!yes&&!await client.input.confirm("Enable this add-on?",!1))return 0;asJson||output_manager_default.spinner("Enabling Observability Plus");try{let result=await client.fetch("/v1/observability/manage/configuration",{method:"PATCH",body:{teamEnabled:!0}});return output_manager_default.stopSpinner(),result.teamEnabled?(asJson?client.stdout.write(`${JSON.stringify({productAlias:OBSERVABILITY_PLUS_PRODUCT_ALIAS,quantity:1,team:contextName,teamEnabled:result.teamEnabled},null,2)}
229
234
  `):(printAlignedLabel("Enabled","Observability Plus",{gutter:"\u2713"}),printAlignedLabel("Team",contextName)),0):(output_manager_default.error("The API did not confirm Observability Plus access for this team. Check the team billing settings before retrying."),1)}catch(err){return output_manager_default.stopSpinner(),handleObservabilityPlusPurchaseError(err,contextName)}}function handleObservabilityPlusPurchaseError(err,teamSlug){if(isAPIError(err)){if(err.code==="forbidden")return output_manager_default.error("Only team owners can purchase Observability Plus. Ask a team owner."),1;if(err.code==="invalid_plan_status")return output_manager_default.error("Observability Plus can't be enabled while this team's subscription is in its current state."),output_manager_default.log(`Review the team billing settings: ${output_manager_default.link(getTeamBillingUrl(teamSlug),getTeamBillingUrl(teamSlug))}`),1;if(err.code==="invalid_product"||err.code==="invalid_price")return output_manager_default.error("Observability Plus isn't available for this team's current plan."),output_manager_default.log(`Review the team billing settings: ${output_manager_default.link(getTeamBillingUrl(teamSlug),getTeamBillingUrl(teamSlug))}`),1}return output_manager_default.error("Failed to enable Observability Plus."),output_manager_default.debug(`Server response: ${(0,import_error_utils5.errorToString)(err)}`),1}async function addon(client,argv){let flagsSpecification=getFlagsSpecification(addonSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArgs,[addonName,quantityStr]=args;if(addonName&&isCustomEnvironmentAddonAlias(addonName)){let packsResult=validateCustomEnvironmentPacks(quantityStr);if("error"in packsResult)return output_manager_default.error(packsResult.error),packsResult.usage&&output_manager_default.log(packsResult.usage),1;let project=flags["--project"];return purchaseCustomEnvironmentCapacity(client,{packs:packsResult.packs,yes:!!flags["--yes"],projectName:typeof project=="string"?project:void 0,commandName:"buy"})}if(addonName&&isObservabilityPlusAddonAlias(addonName)){if(flags["--project"]!==void 0)return output_manager_default.error("--project isn't supported for Observability Plus because it is enabled for a team. Use --scope <team> to select the team."),1;if(quantityStr!==void 0)return output_manager_default.error(`Observability Plus does not accept a quantity. Run ${getCommandName("buy addon observability-plus")} without one.`),1;let formatResult=validateJsonOutput(parsedArgs.flags);return formatResult.valid?purchaseObservabilityPlus(client,{yes:!!flags["--yes"],asJson:formatResult.jsonOutput}):(output_manager_default.error(formatResult.error),1)}return addonName?(output_manager_default.error(`Invalid addon "${addonName}". Supported addons: ${SUPPORTED_ADDON_NAMES.join(", ")}.`),1):(output_manager_default.error(`Missing addon name. Supported addons: ${SUPPORTED_ADDON_NAMES.join(", ")}`),output_manager_default.log(`Run ${getCommandName("buy addon --help")} for usage.`),1)}var import_chalk50=__toESM(require_source(),1);async function pro(client,argv){let flagsSpecification=getFlagsSpecification(proSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,{team,contextName}=await getScope(client);if(!team)return output_manager_default.error("This command must be run with a team scope. Use --scope to specify a team."),1;if(!parsedArgs.flags["--yes"]){if(!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if(!await client.input.confirm(`Upgrade team ${import_chalk50.default.bold(contextName)} to Vercel Pro?`,!1))return 0}let purchaseStamp=stamp_default();output_manager_default.spinner("Processing purchase");try{let result=await createPurchase(client,{type:"subscription",planSlug:"pro"});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({team:contextName,subscriptionIntent:result.subscriptionIntent},null,2)}
@@ -238,7 +243,7 @@ validUntil=${result.validUntil} (${new Date(result.validUntil).toISOString()})
238
243
 
239
244
  `)}
240
245
  `)}async function fetchEntries(query,limit){let url=new URL(query?`${CHANGELOG_API_URL}/search`:CHANGELOG_API_URL);url.searchParams.set("limit",String(limit)),query?url.searchParams.set("q",query):url.searchParams.set("include","content");try{let response=await fetch2(url,{headers:{accept:"application/json","user-agent":ua_default}});if(!response.ok){response.status===429?output_manager_default.error("Too many changelog requests. Try again shortly."):output_manager_default.error("Failed to fetch changelog entries.");return}let data=await response.json();if(!data||typeof data!="object")throw new Error("Invalid changelog response");let items=data.items;if(!Array.isArray(items)||!items.every(isChangelogItem))throw new Error("Invalid changelog response");return items}catch{output_manager_default.error("Failed to fetch changelog entries. Check your connection and try again.");return}}function printCommandHelp(client,command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:command2===changelogCommand?void 0:changelogCommand}))}async function changelog(client){let telemetry2=new ChangelogTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(changelogCommand.options),rawArgs=client.argv.slice(2).filter(arg=>arg!=="--changelog"),parsedArgs;try{parsedArgs=parseArguments(rawArgs,flagsSpecification)}catch(err){return printError(err),1}let commandOffset=parsedArgs.args[0]===changelogCommand.name?1:0,{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(commandOffset),COMMAND_CONFIG19);if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp(changelogCommand.name,subcommand==="search"?subcommandOriginal:void 0),printCommandHelp(client,subcommand==="search"?searchSubcommand:changelogCommand),0;if(!subcommand&&args.length>0)return output_manager_default.error(`Unknown changelog command: ${args[0]}`),printCommandHelp(client,changelogCommand),1;let limit=parsedArgs.flags["--limit"]??DEFAULT_LIMIT;if(!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT)return output_manager_default.error(`--limit must be between 1 and ${MAX_LIMIT}.`),1;telemetry2.trackCliOptionLimit(parsedArgs.flags["--limit"]),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let jsonOutput=formatResult.jsonOutput,query;if(subcommand==="search"&&(telemetry2.trackCliSubcommandSearch(subcommandOriginal),query=args.join(" ").trim(),!query))return output_manager_default.error("Search query is required."),printCommandHelp(client,searchSubcommand),1;jsonOutput||output_manager_default.spinner(query?"Searching the changelog\u2026":"Fetching the changelog\u2026");let items=await fetchEntries(query,limit);return jsonOutput||output_manager_default.stopSpinner(),items?jsonOutput?(client.stdout.write(`${JSON.stringify({items},null,2)}
241
- `),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG20={list:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand4),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand4)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-2EMBEQHZ.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-SNN3JPON.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-XIJ54B7U.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-W2O6M4GH.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-W2O6M4GH.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-FCPWK252.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-L45TA4WK.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand6):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-GKXJQRX6.js")).default(client,telemetry2,defaultInvocation)}}}function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}from"node:path";import{text}from"node:stream/consumers";async function selectConnexTeam(client,message){let scope=await getScope(client,{resolveLocalScope:!0});if(scope.org.type==="team"){client.config.currentTeam=scope.org.id;return}let org=await selectOrg(client,message,!1);if(org.type!=="team")throw new Error("Connect requires a team. Re-run and select a team to continue.");client.config.currentTeam=org.id,client.writeToConfigFile()}import{randomBytes,createHash as createHash2}from"node:crypto";var POLL_INTERVAL_MS=2e3,MAX_POLL_DURATION_MS=115*60*1e3,MAX_EARLY_404_COUNT=3;function generateRequestCode(){let verifier=randomBytes(37).toString("base64url"),requestCode=createHash2("sha256").update(verifier).digest("base64url");return{verifier,requestCode}}async function awaitConnexResult(client,verifier){let deadline=Date.now()+MAX_POLL_DURATION_MS,early404Count=0,lastProgress;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS);try{let result=await client.fetch(`/v1/connect/result/${encodeURIComponent(verifier)}`);if(result.status==="success"&&result.data)return result.data;if(result.status==="partial"&&result.data){if(result.progress&&result.progress!==lastProgress){lastProgress=result.progress,output_manager_default.stopSpinner();let clientId=result.data.clientId;clientId&&output_manager_default.log(`Connector created: ${clientId}`),output_manager_default.spinner(`${result.progress}...`)}continue}if(result.status==="error"&&result.error)return output_manager_default.error(`Setup failed: ${result.error.message} (${result.error.code})`),null;if(result.status==="canceled")return output_manager_default.error("Setup was canceled in the browser."),null}catch(err){if(err.status===404){if(early404Count++,early404Count>MAX_EARLY_404_COUNT)return output_manager_default.error("Setup request expired. Please try again."),null;output_manager_default.debug(`Polling 404 (${early404Count}/${MAX_EARLY_404_COUNT}), will retry`);continue}output_manager_default.debug(`Polling error (will retry): ${err}`)}}return output_manager_default.error("Timed out waiting for setup to complete. Please try again."),null}import{readFile as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}from"node:crypto";var MAX_ICON_BYTES=5*1024*1024,MIN_IMAGE_BYTES=12,IMAGE_SIGNATURES=[/^ffd8ffdb/,/^ffd8ffe000104a4649460001/,/^ffd8ffee/,/^ffd8ffe1.{4}457869660000/,/^ffd8ffe0/,/^89504e470d0a1a0a/];function isImageBuffer(buf){if(buf.length<MIN_IMAGE_BYTES)return!1;let hex=buf.subarray(0,MIN_IMAGE_BYTES).toString("hex");return IMAGE_SIGNATURES.some(re=>re.test(hex))}async function prepareConnexIcon(filePath,cwd){let absPath=resolve5(cwd,filePath),size;try{size=(await stat2(absPath)).size}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(size>MAX_ICON_BYTES)throw new Error(`Icon file at "${filePath}" is ${size} bytes; maximum is ${MAX_ICON_BYTES} bytes (5 MB).`);let buf;try{buf=await readFile2(absPath)}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(!isImageBuffer(buf))throw new Error(`Icon file at "${filePath}" is not a PNG or JPEG.`);let sha=createHash3("sha1").update(new Uint8Array(buf)).digest("hex");return{buf,sha}}async function uploadConnexIcon(client,prepared){try{await client.fetch("/v2/files",{method:"POST",json:!1,body:prepared.buf,headers:{"Content-Type":"application/octet-stream","Content-Length":String(prepared.buf.byteLength),"x-now-digest":prepared.sha,"x-now-size":String(prepared.buf.byteLength)}})}catch(err){let e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk53=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets){return targets.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk53.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk53.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===normalize(url)}function buildMethodGuidance(method,serviceName){let lines=[];if(method.type.type!=="api-key"){let registerUrl=method.settingsUrl??method.docUrl;lines.push(registerUrl?`Register an OAuth app for ${serviceName} at ${import_chalk53.default.cyan(registerUrl)} and copy its Client ID and Client Secret.`:`Register an OAuth app for ${serviceName} and copy its Client ID and Client Secret.`),lines.push(`Add ${import_chalk53.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk53.default.cyan(method.docUrl)}`)}return method.instructions&&lines.push(renderConnexMarkdown(method.instructions)),lines}function isSecretInputKey(method,key){let encrypted=method.type.encryptedFields;return encrypted&&encrypted.length>0?encrypted.includes(key):SECRET_KEY_PATTERN.test(key)}function needsCredentialPrompt(method,key,suppliedData){if(ENDPOINT_IDENTITY_KEYS.has(key)||suppliedData&&key in suppliedData)return!1;let defaults=method.type.createInputDefaults;return!(defaults&&key in defaults)}function describeCredentialFields(method){if(method.type.type==="oauth")return"clientId (required), clientSecret";if(method.type.type==="api-key")return'values: [{ "value": "<api key>" }]'}async function collectMethodCredentials(client,method,suppliedData,interactive,onFirstPrompt){let data={...suppliedData},announced=!1,announce=()=>{announced||(announced=!0,onFirstPrompt?.())};if(method.type.type==="oauth"){if(needsCredentialPrompt(method,"clientId",suppliedData)){if(!interactive)throw missingCredentialsError(method);announce(),data.clientId=await promptCredential(client,method,{key:"clientId",message:"Client ID",required:!0})}if(interactive&&needsCredentialPrompt(method,"clientSecret",suppliedData)){announce();let secret=await promptCredential(client,method,{key:"clientSecret",message:`Client Secret ${import_chalk53.default.dim("leave blank for a public client")}`,required:!1});secret&&(data.clientSecret=secret)}return data}if(method.type.type==="api-key"){if(data.values===void 0){if(!interactive)throw missingCredentialsError(method);announce();let value=await promptCredential(client,method,{key:"value",message:method.label,required:!0});data.values=[{value}]}return data}if(suppliedData===void 0){let schema=method.type.createInputSchema,hint=schema?`
246
+ `),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG20={list:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand4),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand4)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-QPEB2PYJ.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-JSSJIIAC.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-WEUR5QKT.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-KEPX7J5A.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-KEPX7J5A.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-A2YLMFJY.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-F75LDVGB.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand6):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-MHFZCZLT.js")).default(client,telemetry2,defaultInvocation)}}}function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}from"node:path";import{text}from"node:stream/consumers";async function selectConnexTeam(client,message){let scope=await getScope(client,{resolveLocalScope:!0});if(scope.org.type==="team"){client.config.currentTeam=scope.org.id;return}let org=await selectOrg(client,message,!1);if(org.type!=="team")throw new Error("Connect requires a team. Re-run and select a team to continue.");client.config.currentTeam=org.id,client.writeToConfigFile()}import{randomBytes,createHash as createHash2}from"node:crypto";var POLL_INTERVAL_MS=2e3,MAX_POLL_DURATION_MS=115*60*1e3,MAX_EARLY_404_COUNT=3;function generateRequestCode(){let verifier=randomBytes(37).toString("base64url"),requestCode=createHash2("sha256").update(verifier).digest("base64url");return{verifier,requestCode}}async function awaitConnexResult(client,verifier){let deadline=Date.now()+MAX_POLL_DURATION_MS,early404Count=0,lastProgress;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS);try{let result=await client.fetch(`/v1/connect/result/${encodeURIComponent(verifier)}`);if(result.status==="success"&&result.data)return result.data;if(result.status==="partial"&&result.data){if(result.progress&&result.progress!==lastProgress){lastProgress=result.progress,output_manager_default.stopSpinner();let clientId=result.data.clientId;clientId&&output_manager_default.log(`Connector created: ${clientId}`),output_manager_default.spinner(`${result.progress}...`)}continue}if(result.status==="error"&&result.error)return output_manager_default.error(`Setup failed: ${result.error.message} (${result.error.code})`),null;if(result.status==="canceled")return output_manager_default.error("Setup was canceled in the browser."),null}catch(err){if(err.status===404){if(early404Count++,early404Count>MAX_EARLY_404_COUNT)return output_manager_default.error("Setup request expired. Please try again."),null;output_manager_default.debug(`Polling 404 (${early404Count}/${MAX_EARLY_404_COUNT}), will retry`);continue}output_manager_default.debug(`Polling error (will retry): ${err}`)}}return output_manager_default.error("Timed out waiting for setup to complete. Please try again."),null}import{readFile as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}from"node:crypto";var MAX_ICON_BYTES=5*1024*1024,MIN_IMAGE_BYTES=12,IMAGE_SIGNATURES=[/^ffd8ffdb/,/^ffd8ffe000104a4649460001/,/^ffd8ffee/,/^ffd8ffe1.{4}457869660000/,/^ffd8ffe0/,/^89504e470d0a1a0a/];function isImageBuffer(buf){if(buf.length<MIN_IMAGE_BYTES)return!1;let hex=buf.subarray(0,MIN_IMAGE_BYTES).toString("hex");return IMAGE_SIGNATURES.some(re=>re.test(hex))}async function prepareConnexIcon(filePath,cwd){let absPath=resolve5(cwd,filePath),size;try{size=(await stat2(absPath)).size}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(size>MAX_ICON_BYTES)throw new Error(`Icon file at "${filePath}" is ${size} bytes; maximum is ${MAX_ICON_BYTES} bytes (5 MB).`);let buf;try{buf=await readFile2(absPath)}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(!isImageBuffer(buf))throw new Error(`Icon file at "${filePath}" is not a PNG or JPEG.`);let sha=createHash3("sha1").update(new Uint8Array(buf)).digest("hex");return{buf,sha}}async function uploadConnexIcon(client,prepared){try{await client.fetch("/v2/files",{method:"POST",json:!1,body:prepared.buf,headers:{"Content-Type":"application/octet-stream","Content-Length":String(prepared.buf.byteLength),"x-now-digest":prepared.sha,"x-now-size":String(prepared.buf.byteLength)}})}catch(err){let e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk53=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets){return targets.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk53.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk53.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===normalize(url)}function buildMethodGuidance(method,serviceName){let lines=[];if(method.type.type!=="api-key"){let registerUrl=method.settingsUrl??method.docUrl;lines.push(registerUrl?`Register an OAuth app for ${serviceName} at ${import_chalk53.default.cyan(registerUrl)} and copy its Client ID and Client Secret.`:`Register an OAuth app for ${serviceName} and copy its Client ID and Client Secret.`),lines.push(`Add ${import_chalk53.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk53.default.cyan(method.docUrl)}`)}return method.instructions&&lines.push(renderConnexMarkdown(method.instructions)),lines}function isSecretInputKey(method,key){let encrypted=method.type.encryptedFields;return encrypted&&encrypted.length>0?encrypted.includes(key):SECRET_KEY_PATTERN.test(key)}function needsCredentialPrompt(method,key,suppliedData){if(ENDPOINT_IDENTITY_KEYS.has(key)||suppliedData&&key in suppliedData)return!1;let defaults=method.type.createInputDefaults;return!(defaults&&key in defaults)}function describeCredentialFields(method){if(method.type.type==="oauth")return"clientId (required), clientSecret";if(method.type.type==="api-key")return'values: [{ "value": "<api key>" }]'}async function collectMethodCredentials(client,method,suppliedData,interactive,onFirstPrompt){let data={...suppliedData},announced=!1,announce=()=>{announced||(announced=!0,onFirstPrompt?.())};if(method.type.type==="oauth"){if(needsCredentialPrompt(method,"clientId",suppliedData)){if(!interactive)throw missingCredentialsError(method);announce(),data.clientId=await promptCredential(client,method,{key:"clientId",message:"Client ID",required:!0})}if(interactive&&needsCredentialPrompt(method,"clientSecret",suppliedData)){announce();let secret=await promptCredential(client,method,{key:"clientSecret",message:`Client Secret ${import_chalk53.default.dim("leave blank for a public client")}`,required:!1});secret&&(data.clientSecret=secret)}return data}if(method.type.type==="api-key"){if(data.values===void 0){if(!interactive)throw missingCredentialsError(method);announce();let value=await promptCredential(client,method,{key:"value",message:method.label,required:!0});data.values=[{value}]}return data}if(suppliedData===void 0){let schema=method.type.createInputSchema,hint=schema?`
242
247
 
243
248
  Expected --data schema for connection method "${method.connectionMethod}":
244
249
  ${JSON.stringify(schema,null,2)}`:"";throw new ConnexMethodError(`Connection method "${method.connectionMethod}" needs credentials passed with --data. Pass --data @<path> to read from a file.${hint}`)}return data}async function promptCredential(client,method,opts){let validate=opts.required?value=>value.trim().length>0||`${opts.key} is required.`:void 0;return(isSecretInputKey(method,opts.key)?await client.input.password({message:opts.message,mask:!0,validate}):await client.input.text({message:opts.message,validate})).trim()}function missingCredentialsError(method){let fields=describeCredentialFields(method),withFields=fields?` with: ${fields}`:"";return new ConnexMethodError(`Missing credentials. Provide --data${withFields}. Pass --data @<path> to read from a file.`)}async function resolveConnexConnectionMethod(client,opts){let{methods,targets,connectionMethodFlag,targetFlag}=opts;if(methods.length===0)throw new ConnexMethodError(`"${opts.service}" doesn't publish connection methods.`);let explicitTarget=targetFlag?validateTarget(targetFlag,targets,opts.service):void 0;if(connectionMethodFlag){let method2=methods.find(candidate=>candidate.connectionMethod===connectionMethodFlag);if(!method2)throw new ConnexMethodError(`Unknown connection method "${connectionMethodFlag}" for "${opts.service}". Available: ${formatMethodOptions(methods)}.`);if(explicitTarget&&!servesTarget(method2,explicitTarget))throw new ConnexMethodError(`Connection method "${method2.connectionMethod}" doesn't connect to target "${explicitTarget}".`);return{method:method2,target:explicitTarget??soleTargetOf(method2)}}if(opts.resolvedConnectionMethod){let method2=methods.find(candidate=>candidate.connectionMethod===opts.resolvedConnectionMethod);if(method2&&(!explicitTarget||servesTarget(method2,explicitTarget)))return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method2),{method:method2,target:explicitTarget??soleTargetOf(method2)}}let width=choiceWidth(client),chosenTarget=explicitTarget;!chosenTarget&&targets&&targets.length>1&&opts.interactive&&(printOptionCatalog(`${opts.serviceName} products:`,targets.map(target2=>({label:target2.label,description:target2.description,docsUrl:target2.docsUrl})),width),chosenTarget=await client.input.select({message:"What do you want to connect to?",choices:targets.map(target2=>({name:choiceLabel(target2.label,width),value:target2.target}))}));let candidates=chosenTarget?methods.filter(method2=>servesTarget(method2,chosenTarget)):methods;if(candidates.length===0)throw new ConnexMethodError(`No connection method for "${opts.service}" connects to target "${chosenTarget}".`);if(candidates.length>1){if(!opts.interactive)throw new ConnexMethodError(`Missing --connection-method. "${opts.service}" supports: ${formatMethodOptions(candidates)}. Re-run with --connection-method <value>.`);printOptionCatalog(`Connection methods for ${opts.serviceName}:`,candidates.map(method3=>({label:method3.label,badge:createPathBadge(method3),description:method3.description,docsUrl:method3.docUrl})),width);let slug=await client.input.select({message:`How do you want to connect to ${opts.serviceName}?`,choices:candidates.map(method3=>({name:choiceLabel(method3.label,width),value:method3.connectionMethod}))}),method2=candidates.find(candidate=>candidate.connectionMethod===slug);if(!method2)throw new ConnexMethodError(`Unknown connection method "${slug}".`);return{method:method2,target:chosenTarget??soleTargetOf(method2)}}let method=candidates[0],target=chosenTarget??soleTargetOf(method);return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method),{method,target}}async function confirmMethodSelection(client,serviceName,method){let badge=createPathBadge(method),suffix=badge?` (${badge})`:"";if(!await client.input.confirm(`Connect to ${serviceName} with ${method.label}${suffix}?`,!0))throw new ConnexMethodError("Canceled.")}async function collectTemplateParams(client,method,suppliedParams,interactive){let fields=method.templateFields??[];if(fields.length===0){if(Object.keys(suppliedParams).length>0)throw new ConnexMethodError(`Connection method "${method.connectionMethod}" takes no --param values.`);return{}}let known=new Set(fields.map(field=>field.key));for(let key of Object.keys(suppliedParams))if(!known.has(key))throw new ConnexMethodError(`Unknown --param "${key}" for connection method "${method.connectionMethod}". Valid keys: ${fields.map(field=>field.key).join(", ")}.`);let params={};for(let field of fields){let supplied=(suppliedParams[field.key]??"").trim();if(supplied){let problem=templateValueProblem(field,supplied);if(problem)throw new ConnexMethodError(`Invalid --param ${field.key}="${supplied}". ${problem}`);params[field.key]=supplied;continue}if(interactive){let answer=await client.input.text({message:promptMessage(field),default:field.default,validate:value=>{let trimmed=value.trim();return trimmed?templateValueProblem(field,trimmed)??!0:`${field.label} is required.`}});params[field.key]=answer.trim();continue}if(field.default!==void 0){params[field.key]=field.default;continue}throw new ConnexMethodError(`Missing --param ${field.key}=<value> (${describeField(field)}) for connection method "${method.connectionMethod}".`)}return params}function promptMessage(field){let hints=[];return field.placeholder&&hints.push(`e.g. ${field.placeholder}`),field.help&&hints.push(field.help),hints.length>0?`${field.label} ${import_chalk53.default.dim(hints.join(" \xB7 "))}`:field.label}function describeField(field){return field.placeholder?`"${field.label}", e.g. ${field.placeholder}`:`"${field.label}"`}var HOSTNAME_RE=/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$/i;function templateValueProblem(field,value){let sample=field.default??field.placeholder;if(!(!sample||!HOSTNAME_RE.test(sample)||HOSTNAME_RE.test(value)))return`Enter a hostname like ${sample}, without the https:// prefix.`}function printOptionCatalog(heading,entries,width){if(entries.some(entry2=>entry2.description||entry2.docsUrl)){output_manager_default.print(`
@@ -864,12 +869,12 @@ Example: vercel ${commandName} ${integration.slug}/${integration.products[0].slu
864
869
  ${installationsList2}
865
870
 
866
871
  Re-run with --installation-id to select one, e.g.:
867
- 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}output_manager_default.log("Additional setup required. Opening browser...");let url=new URL(fallback.url);return 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(",")),output_manager_default.debug(`Opening URL: ${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_chalk207.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_chalk207.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_chalk207.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_chalk207.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_chalk207.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_chalk207.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_chalk207.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)}
872
+ 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_chalk207.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_chalk207.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_chalk207.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_chalk207.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_chalk207.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_chalk207.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_chalk207.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)}
868
873
  `),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."),1;let installationId=flags["--installation-id"],formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(args.length>1)return output_manager_default.error("Cannot install more than one integration at a time"),1;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"}]},1),output_manager_default.error(message),1}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>"),1}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."),1):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_chalk208=__toESM(require_source(),1);function formatProductHelp(integrationSlug,products,commandName="integration add"){let lines=[];lines.push(""),lines.push(` ${import_chalk208.default.dim("Available products for")} "${import_chalk208.default.bold(integrationSlug)}"${import_chalk208.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_chalk208.default.cyan(paddedSlug)} ${product.name}`)}return lines.push(""),lines.push(` ${import_chalk208.default.dim("Usage:")}`),lines.push(""),lines.push(` ${import_chalk208.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/<product-slug>`)}`),lines.push(""),lines.join(`
869
874
  `)}var import_chalk209=__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_chalk209.default.dim("Available billing plans for")} "${import_chalk209.default.bold(productName)}"${import_chalk209.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_chalk209.default.dim(` (${plan.cost})`):"";lines.push(` ${import_chalk209.default.cyan(paddedId)} ${plan.name}${cost}`)}return lines.push(""),lines.push(` ${import_chalk209.default.dim("Usage:")}`),lines.push(""),lines.push(` ${import_chalk209.default.cyan(`--plan ${enabledPlans[0].id}`)}`),lines.push(""),lines.join(`
870
875
  `)}var import_chalk210=__toESM(require_source(),1);function formatDynamicExamples(integrationSlug,products,commandName="integration add"){let lines=[];if(lines.push(""),lines.push(` ${import_chalk210.default.dim("Examples:")}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install ${integrationSlug}`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}`)}`),products.length>1){let firstProduct=products[0];lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install a specific product`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/${firstProduct.slug}`)}`)}lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install with a custom resource name`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --name my-resource`)}`);let metadataExample=buildMetadataExample(integrationSlug,products,commandName);return metadataExample&&(lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install with metadata`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${metadataExample}`)}`)),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install with a specific billing plan`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --plan pro`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install and connect to specific environments only`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} -e production -e preview`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install without connecting to the current project`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-connect`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install without pulling environment variables`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-env-pull`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install with a prefix for environment variable names`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --prefix NEON2_`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Output as JSON`),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --json`)}`),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --format json`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Install using a specific installation`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --installation-id <id>`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Claim a sandbox resource immediately after provisioning`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --claim`)}`),lines.push(""),lines.push(` ${import_chalk210.default.dim("-")} Skip the offer to claim a sandbox resource`),lines.push(""),lines.push(` ${import_chalk210.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-claim`)}`),lines.push(""),lines.join(`
871
876
  `)}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:[]}),output_manager_default.print(formatDynamicExamples(integrationSlug,products,commandName)),products.length>1&&output_manager_default.print(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;output_manager_default.print(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,{});output_manager_default.print(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),1}let{args,flags}=parsed,telemetry2=new InstallTelemetryClient({opts:{store:client.telemetryEventStore}});return flags["--help"]?(telemetry2.trackCliFlagHelp("install"),await printAddDynamicHelp(client,args[1],installCommand,c=>output_manager_default.print(help(c,{columns:client.stderr.columns})),"install")||output_manager_default.print(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_chalk211=__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),1}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;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"),1;let integrationSlug=parsedArguments.args[1];if(!integrationSlug)return output_manager_default.error("You must pass an integration slug"),1;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)}
872
- `),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_chalk211.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_chalk212=__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),1}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"],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"),1;if(parsedArguments.args.length<1)return output_manager_default.error("You must specify a resource. See `--help` for details."),1;if(parsedArguments.args.length>2)return output_manager_default.error("Too many arguments. Usage: `vercel integration resource connect <resource> [project]`."),1;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."),1;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_chalk212.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_chalk212.default.bold(projectName)} is already connected to resource ${import_chalk212.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_chalk212.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&&client.nonInteractive)return outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Connecting a resource requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&(output_manager_default.log(`The resource ${import_chalk212.default.bold(targetedResource.name)} will be connected to project ${import_chalk212.default.bold(projectName)} (environments: ${environments.join(", ")}).`),!await client.input.confirm(`${import_chalk212.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_chalk212.default.bold(varName)} already exists on project ${import_chalk212.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)}
877
+ `),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_chalk211.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_chalk212=__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),1}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"],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"),1;if(parsedArguments.args.length<1)return output_manager_default.error("You must specify a resource. See `--help` for details."),1;if(parsedArguments.args.length>2)return output_manager_default.error("Too many arguments. Usage: `vercel integration resource connect <resource> [project]`."),1;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."),1;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}`),1}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_chalk212.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_chalk212.default.bold(projectName)} is already connected to resource ${import_chalk212.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_chalk212.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_chalk212.default.bold(targetedResource.name)} will be connected to project ${import_chalk212.default.bold(projectName)} (environments: ${environments.join(", ")}).`),!await client.input.confirm(`${import_chalk212.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_chalk212.default.bold(varName)} already exists on project ${import_chalk212.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)}
873
878
  `),0):(output_manager_default.success(`Connected ${import_chalk212.default.bold(targetedResource.name)} to ${import_chalk212.default.bold(projectName)} (${environments.join(", ")})`),0)}var import_chalk213=__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),1}let args;try{args=parseCreateThresholdArguments(parsedArguments.args,telemetry2)}catch(error){return output_manager_default.error(error.message),1}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_chalk213.default.bold(resourceName)} was not found.`),1;if(!targetedResource.product?.integrationConfigurationId)return output_manager_default.error(`The resource ${import_chalk213.default.bold(resourceName)} does not have an integration configuration.`),1;if(targetedResource.billingPlan?.type!=="prepayment")return output_manager_default.error(`The resource ${import_chalk213.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_chalk213.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_chalk213.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_chalk213.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_chalk213.default.bold(props.resource.product?.name)}`:`resource ${import_chalk213.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_chalk214=__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),1}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"];if(telemetry2.trackCliOptionFormat(parsedArguments.flags["--format"]),asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;if(client.config.currentTeam=team.id,parsedArguments.args.length<1)return output_manager_default.error("You must specify a resource. See `--help` for details."),1;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."),1;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_chalk214.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)}
874
879
  `)}return 0}return!specifiedProject&&(specifiedProject=await getLinkedProject(client).then(result=>{if(result.status==="linked")return result.project.name}),!specifiedProject)?(output_manager_default.error("No project linked. Either use `vc link` to link a project, or specify the project name."),1):await handleDisconnectProject(client,targetedResource,specifiedProject,skipConfirmation,asJson)}async function handleDisconnectProject(client,resource,projectName,skipConfirmation,asJson){let project=resource.projectsMetadata?.find(project2=>projectName===project2.name);if(!project)return output_manager_default.error(`Project ${import_chalk214.default.bold(projectName)} is not connected to resource ${import_chalk214.default.bold(resource.name)}.`),output_manager_default.log("Run `vercel integration list` to see which projects are connected to each resource."),1;let projectConnections=resource.projectsMetadata.filter(connection=>connection.projectId===project.projectId);if(!skipConfirmation&&client.nonInteractive)return outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Disconnecting a resource requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&!await confirmDisconnectProject(client,resource,project,projectConnections.length))return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Disconnecting resource\u2026",500);for(let connection of projectConnections)await disconnectResourceFromProject(client,resource,connection)}catch(error){return output_manager_default.error(`A problem occurred while disconnecting: ${error.message}`),1}if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({resource:resource.name,disconnected:!0,projects:[projectName]},null,2)}
875
880
  `),0;let connectionCount=projectConnections.length;return output_manager_default.success(connectionCount===1?`Disconnected ${import_chalk214.default.bold(project.name)} from ${import_chalk214.default.bold(resource.name)}`:`Disconnected all ${connectionCount} connections for ${import_chalk214.default.bold(project.name)} from ${import_chalk214.default.bold(resource.name)}`),0}async function handleDisconnectAllProjects(client,resource,skipConfirmation,asJson=!1){if(resource.projectsMetadata?.length===0){output_manager_default.log(`${import_chalk214.default.bold(resource.name)} has no projects to disconnect.`);return}if(!skipConfirmation&&client.nonInteractive)throw outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Disconnecting all projects requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),new FailedError("Confirmation required. Use `--yes` to skip the confirmation prompt.");if(!skipConfirmation&&!client.stdin.isTTY)throw new FailedError("Confirmation required. Use `--yes` to skip the confirmation prompt.");if(!skipConfirmation&&!await confirmDisconnectAllProjects(client,resource))throw new CancelledError("Canceled");try{output_manager_default.spinner("Disconnecting projects from resource\u2026",500),await disconnectResourceFromAllProjects(client,resource),asJson?output_manager_default.stopSpinner():output_manager_default.success(`Disconnected all projects from ${import_chalk214.default.bold(resource.name)}`)}catch(error){throw new FailedError(`A problem occurred while disconnecting all projects: ${error.message}`)}}async function confirmDisconnectProject(client,resource,project,connectionCount){return output_manager_default.log(connectionCount===1?`The resource ${import_chalk214.default.bold(resource.name)} will be disconnected from project ${import_chalk214.default.bold(project.name)}.`:`All ${connectionCount} connections between resource ${import_chalk214.default.bold(resource.name)} and project ${import_chalk214.default.bold(project.name)} will be disconnected.`),client.input.confirm(`${import_chalk214.default.red("Are you sure?")}`,!1)}async function confirmDisconnectAllProjects(client,resource){if(output_manager_default.log("The following projects will be disconnected:"),!resource.projectsMetadata)return!1;for(let project of resource.projectsMetadata)output_manager_default.print(` ${project.name}
@@ -1032,7 +1037,7 @@ Starting setup...
1032
1037
  `),output_manager_default.print("\u2500".repeat(50)+`
1033
1038
  `),summary.forEach(line2=>output_manager_default.print(`${line2}
1034
1039
  `)),output_manager_default.print(`Complete any required setup and authentication in the selected MCP clients. Restart configured clients if needed.
1035
- `),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main26(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),2;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG50={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG50),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-EPUGS3PX.js")).default;return schemaFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;if(!positionalMetric)return output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),2;let queryFn=(await import("./chunks/query-P35ZTMXV.js")).default;return queryFn(client,telemetry2)}}}var import_chalk238=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let{contextName}=await getScope(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk238.default.bold(contextName)}`);let rawConfig,dpl=parsedArgs.flags["--dpl"];try{if(dpl){let{config}=await client.fetch(`/v1/microfrontends/${dpl}/config`,{method:"GET"});rawConfig=config}else{let projectId=project.id,{config}=await client.fetch(`/v1/microfrontends/projects/${projectId}/production-mfe-config`,{method:"GET"});rawConfig=config}let sanitizedConfig={...rawConfig,applications:Object.fromEntries(Object.entries(rawConfig.applications).map(([name,app])=>[name,{...app,projectId:void 0}]))};output_manager_default.stopSpinner();let path3=join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS);await(0,import_fs_extra.outputJSON)(path3,sanitizedConfig,{spaces:2});let microfrontendsStamp=stamp_default();return output_manager_default.print(`${prependEmoji(`Downloaded microfrontends configuration to ${import_chalk238.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk238.default.gray(microfrontendsStamp())}`,emoji("success"))}
1040
+ `),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main26(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),2;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},1),1}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG50={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG50),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-O7WKXTFS.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-IRNHCI3O.js")).default;return queryFn(client,telemetry2)}}}var import_chalk238=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let{contextName}=await getScope(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk238.default.bold(contextName)}`);let rawConfig,dpl=parsedArgs.flags["--dpl"];try{if(dpl){let{config}=await client.fetch(`/v1/microfrontends/${dpl}/config`,{method:"GET"});rawConfig=config}else{let projectId=project.id,{config}=await client.fetch(`/v1/microfrontends/projects/${projectId}/production-mfe-config`,{method:"GET"});rawConfig=config}let sanitizedConfig={...rawConfig,applications:Object.fromEntries(Object.entries(rawConfig.applications).map(([name,app])=>[name,{...app,projectId:void 0}]))};output_manager_default.stopSpinner();let path3=join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS);await(0,import_fs_extra.outputJSON)(path3,sanitizedConfig,{spaces:2});let microfrontendsStamp=stamp_default();return output_manager_default.print(`${prependEmoji(`Downloaded microfrontends configuration to ${import_chalk238.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk238.default.gray(microfrontendsStamp())}`,emoji("success"))}
1036
1041
  `),0}catch(error){return output_manager_default.stopSpinner(),printError(error),1}}var import_chalk239=__toESM(require_source(),1);import{writeFile as writeFile6}from"fs/promises";import{existsSync as existsSync3}from"fs";import{join as join36}from"path";async function ensureMicrofrontendsContext(client,options){let link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm:options?.autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link;if(org.type!=="team")return output_manager_default.error("Microfrontends are only available for teams."),1;client.config.currentTeam=org.id;let{team}=await getScope(client);return team?{project,org,team,repoRoot}:(output_manager_default.error("Microfrontends are only available for teams."),1)}async function fetchMicrofrontendsGroups(client,teamId){output_manager_default.spinner("Fetching microfrontends groups\u2026");let response=await client.fetch(`/v1/microfrontends/groups?teamId=${teamId}`,{method:"GET"});return output_manager_default.stopSpinner(),response}function validateDefaultRoute(path3){if(!path3||!path3.startsWith("/"))return"Route must start with /";if(/\s/.test(path3))return"Route must not contain spaces";if(path3.includes("?")||path3.includes("#"))return"Route must not contain query strings or fragments";try{new URL(path3,"http://n")}catch{return"Route is not a valid URL path"}return!0}function validateRoutingPath(path3){return!path3||!path3.startsWith("/")?"Path must start with /. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":/\s/.test(path3)?"Path must not contain spaces. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":!0}var MAX_GROUP_NAME_LENGTH=48;async function createGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(createGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let teamSlug=team.slug;output_manager_default.log("A microfrontends group allows multiple projects to be composed into one application with a seamless user experience."),output_manager_default.log(`Creating a new microfrontends group for team ${import_chalk239.default.bold(teamSlug)}.`),output_manager_default.log("");let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsGroupsPerTeam,maxMicrofrontendsPerGroup}=groupsResponse,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(groups.length>=maxMicrofrontendsGroupsPerTeam){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends group limit for ${planName}. Upgrade to Pro to create more groups.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Maximum number of microfrontends groups (${maxMicrofrontendsGroupsPerTeam}) reached.`),1}let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2;if(isLimitedPlan&&existingMfeProjectCount+1>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=`https://vercel.com/${teamSlug}/~/settings/billing`;return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}let nameFlag=parsedArgs.flags["--name"],projectFlags=parsedArgs.flags["--project"],defaultAppFlag=parsedArgs.flags["--default-app"],defaultRouteFlag=parsedArgs.flags["--default-route"],projectDefaultRouteFlags=parsedArgs.flags["--project-default-route"],autoConfirm=!!parsedArgs.flags["--yes"],isNonInteractive=client.nonInteractive||client.argv.includes("--non-interactive");if(isNonInteractive){if(!nameFlag)return output_manager_default.error("Missing required flag --name. Use --name in non-interactive mode."),1;if(!projectFlags||projectFlags.length===0)return output_manager_default.error("Missing required flag --project. Use --project in non-interactive mode."),1;if(projectFlags.length>1&&!defaultAppFlag)return output_manager_default.error("Missing required flag --default-app when using multiple --project values in non-interactive mode."),1}let projectsToAddCount=projectFlags?.length??1;if(existingMfeProjectCount+projectsToAddCount>freeProjects){if(isNonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends create-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());return outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Creating a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1),1}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let groupName;if(nameFlag){let validation=validateGroupName(nameFlag,groups);if(validation!==!0)return output_manager_default.error(validation),1;groupName=nameFlag}else groupName=await client.input.text({message:"Group name:",validate:val=>validateGroupName(val,groups)});let selectedProjects;if(projectFlags){selectedProjects=[];for(let name of projectFlags)try{let project=await getProjectByNameOrId(client,name,team.id);if(project instanceof ProjectNotFound)return output_manager_default.error(`Project "${name}" not found.`),1;selectedProjects.push(project)}catch{return output_manager_default.error(`Project "${name}" not found.`),1}}else{output_manager_default.spinner("Fetching projects\u2026");let firstPage=await client.fetch(`/v9/projects?limit=100&teamId=${team.id}`,{method:"GET"});output_manager_default.stopSpinner();let allProjects=firstPage.projects,hasMoreProjects=firstPage.pagination.next!==null,availableProjects=allProjects.filter(p=>!isProjectInMicrofrontendsGroup(p,groups));selectedProjects=[];let addMore=!0;for(;addMore;){let project;if(hasMoreProjects)await client.input.text({message:selectedProjects.length===0?"Type a project name to add:":"Type another project name to add:",validate:async val=>{if(!val)return"Project name cannot be empty";let result=await getProjectByNameOrId(client,val,team.id);return result instanceof ProjectNotFound?"Project not found":isProjectInMicrofrontendsGroup(result,groups)?`Project "${val}" is already in a microfrontends group`:selectedProjects.some(s=>s.id===result.id)?`Project "${val}" is already selected`:(project=result,!0)}});else{if(availableProjects.length===0){if(selectedProjects.length===0)return output_manager_default.error("No available projects. All projects are already in a microfrontends group."),1;break}let remaining=availableProjects.filter(p=>!selectedProjects.some(s=>s.id===p.id));if(remaining.length===0)break;let projectId=await client.input.select({message:selectedProjects.length===0?"Select a project to add:":"Select another project to add:",choices:remaining.map(p=>({name:p.name,value:p.id}))});project=availableProjects.find(p=>p.id===projectId)}project&&selectedProjects.push(project),addMore=await client.input.confirm("Add another project?",!1)}if(selectedProjects.length===0)return output_manager_default.error("At least one project must be selected."),1}if(selectedProjects.length>maxMicrofrontendsPerGroup)return output_manager_default.error(`Cannot add more than ${maxMicrofrontendsPerGroup} projects to a group.`),1;let defaultApp;if(defaultAppFlag){let found=selectedProjects.find(p=>p.name===defaultAppFlag);if(!found)return output_manager_default.error(`Default app "${defaultAppFlag}" must be one of the selected projects.`),1;defaultApp=found}else if(selectedProjects.length===1)defaultApp=selectedProjects[0];else{let defaultAppId=await client.input.select({message:"Select the default application:",choices:selectedProjects.map(p=>({name:p.name,value:p.id}))});defaultApp=selectedProjects.find(p=>p.id===defaultAppId)}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else defaultRoute="/";let otherProjects=selectedProjects.filter(p=>p.id!==defaultApp.id),parsedProjectDefaultRoutes=parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp);if(typeof parsedProjectDefaultRoutes=="string")return output_manager_default.error(parsedProjectDefaultRoutes),1;let otherApplications=[];for(let project of otherProjects){let routeFromFlag=parsedProjectDefaultRoutes.get(project.id),route;if(routeFromFlag)route=routeFromFlag;else{if(isNonInteractive)return output_manager_default.error(`Missing required flag --project-default-route for "${project.name}". Use --project-default-route=${project.name}=/<path> in non-interactive mode.`),1;route=await client.input.text({message:`Default route for "${project.name}":`,validate:validateDefaultRoute})}otherApplications.push({projectId:project.id,defaultRoute:route})}let newProjectCount=selectedProjects.length,totalAfter=existingMfeProjectCount+newProjectCount;output_manager_default.log(""),output_manager_default.log(import_chalk239.default.bold("Billing")),output_manager_default.log(` ${import_chalk239.default.bold("Team:")} ${teamSlug}`),output_manager_default.log(` ${import_chalk239.default.bold("Adding:")} ${newProjectCount} microfrontends project${newProjectCount>1?"s":""}`);let projectFee;if(totalAfter<=freeProjects)projectFee=import_chalk239.default.green("Free")+` (first ${freeProjects} included)`;else if(existingMfeProjectCount>=freeProjects)projectFee=import_chalk239.default.yellow(`$250.00/month x ${newProjectCount}`)+` project${newProjectCount>1?"s":""}`;else{let freeRemaining=freeProjects-existingMfeProjectCount,paidProjects=newProjectCount-freeRemaining;projectFee=import_chalk239.default.green(`${freeRemaining} free`)+", "+import_chalk239.default.yellow(`$250.00/month x ${paidProjects}`)}if(output_manager_default.log(` ${import_chalk239.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk239.default.bold("Request fee:")} ${import_chalk239.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects)output_manager_default.log(`This group is within the free tier, so no project fee will be charged to ${import_chalk239.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`);else{let newPaidProjects=Math.min(newProjectCount,totalAfter-freeProjects);output_manager_default.log(`By proceeding, ${import_chalk239.default.bold(teamSlug)} will be charged for ${newPaidProjects} additional paid project${newPaidProjects>1?"s":""} on the team's monthly bill.`)}if(output_manager_default.log(""),!autoConfirm&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to confirm group creation in non-interactive mode."),1;if(!(autoConfirm||await client.input.confirm("Create microfrontends group?",!0)))return output_manager_default.log("Aborted."),0;let createStamp=stamp_default();output_manager_default.spinner("Creating microfrontends group\u2026");try{await client.fetch(`/v1/microfrontends/group?teamId=${team.id}`,{method:"POST",body:{groupName,defaultApp:{projectId:defaultApp.id,defaultRoute},otherApplications}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${defaultApp.name}/settings/microfrontends`;output_manager_default.success(`Microfrontends group "${groupName}" created ${import_chalk239.default.gray(createStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`);let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0;if(linkedProject&&linkedProject.id===defaultApp.id){let repoRoot=link.status==="linked"?link.repoRoot:void 0,projectDir=repoRoot?join36(repoRoot,linkedProject.rootDirectory||""):client.cwd,configPath=join36(projectDir,"microfrontends.json");if(!existsSync3(configPath)&&(output_manager_default.log(""),output_manager_default.log(`No changes to production traffic will take effect until a ${import_chalk239.default.bold("microfrontends.json")} is added to the default app. This configuration file specifies the path routing for the microfrontends group.`),client.stdin.isTTY&&!isNonInteractive&&await client.input.confirm("Create a microfrontends.json now?",!0))){let routingPaths={};for(let project of otherProjects){output_manager_default.log(`Enter routing paths for ${import_chalk239.default.bold(project.name)} (comma-separated, e.g. /docs, /docs/*)`);let pathsInput=await client.input.text({message:`Paths for ${project.name}:`,validate:val=>{if(!val.trim())return"At least one path is required";let paths=val.split(",").map(p=>p.trim());for(let p of paths){let result=validateRoutingPath(p);if(result!==!0)return`Invalid path "${p}": ${result}`}return!0}});routingPaths[project.name]=pathsInput.split(",").map(p=>p.trim())}let productionAlias=defaultApp.targets?.production?.alias?.[0],config=generateMicrofrontendsConfig(defaultApp.name,routingPaths,productionAlias);await writeFile6(configPath,config+`
1037
1042
  `,"utf-8"),output_manager_default.success(`Created ${import_chalk239.default.bold("microfrontends.json")}`),output_manager_default.log("Create a preview deployment to test microfrontends before deploying to production.")}}else output_manager_default.log(`Next step: Add a ${import_chalk239.default.bold("microfrontends.json")} to your default app. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`);return 0}function generateMicrofrontendsConfig(defaultAppName,routingPaths,productionAlias){let fallback=productionAlias||"...your-production-domain.vercel.app",applications={[defaultAppName]:{development:{fallback}}};for(let[name,paths]of Object.entries(routingPaths))applications[name]={routing:[{paths}]};return JSON.stringify({$schema:"https://openapi.vercel.sh/microfrontends.json",applications},null,2)}function validateGroupName(name,existingGroups){return!name||name.trim().length===0?"Group name cannot be empty.":name.length>MAX_GROUP_NAME_LENGTH?`Group name must be ${MAX_GROUP_NAME_LENGTH} characters or less.`:existingGroups.some(g=>g.group.name===name)?`A group named "${name}" already exists.`:!0}function isProjectInMicrofrontendsGroup(project,groups){return groups.some(g=>g.projects.some(p=>p.id===project.id))}function parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp){let routeByProjectId=new Map;if(!projectDefaultRouteFlags||projectDefaultRouteFlags.length===0)return routeByProjectId;for(let entry2 of projectDefaultRouteFlags){let separatorIndex=entry2.indexOf("=");if(separatorIndex<=0||separatorIndex===entry2.length-1)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let projectIdentifier=entry2.slice(0,separatorIndex).trim(),route=entry2.slice(separatorIndex+1).trim();if(!projectIdentifier||!route)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let project=selectedProjects.find(p=>p.name===projectIdentifier||p.id===projectIdentifier);if(!project)return`Invalid --project-default-route value "${entry2}". Project "${projectIdentifier}" is not one of the selected projects.`;if(project.id===defaultApp.id)return`Invalid --project-default-route value "${entry2}". Use --default-route for the default app "${defaultApp.name}".`;let routeValidation=validateDefaultRoute(route);if(routeValidation!==!0)return`Invalid --project-default-route value "${entry2}": ${routeValidation}`;if(routeByProjectId.has(project.id))return`Duplicate --project-default-route for project "${project.name}".`;routeByProjectId.set(project.id,route)}return routeByProjectId}var import_chalk240=__toESM(require_source(),1);async function addToGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(addToGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let context=await ensureMicrofrontendsContext(client);if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsPerGroup}=groupsResponse,existingGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(existingGroup)return output_manager_default.error(`Project "${project.name}" is already part of the microfrontends group "${existingGroup.group.name}". A project cannot be in more than one microfrontends group.`),1;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. Create one first with `vercel microfrontends create-group`."),1;let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2,totalAfter=existingMfeProjectCount+1,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(isLimitedPlan&&totalAfter>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}output_manager_default.log(`Adding project ${import_chalk240.default.bold(project.name)} to a microfrontends group on ${import_chalk240.default.bold(teamSlug)}.`),output_manager_default.log("");let groupFlag=parsedArgs.flags["--group"],defaultRouteFlag=parsedArgs.flags["--default-route"];if(totalAfter>freeProjects){if(client.nonInteractive){let settingsUrl2=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`,flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends add-to-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Adding a project to a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:openUrlInBrowserCommand(settingsUrl2),when:"user opens Microfrontends settings in the browser"},{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1)}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}if(selectedGroup.projects.length>=maxMicrofrontendsPerGroup){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Group "${selectedGroup.group.name}" has reached the maximum number of projects (${maxMicrofrontendsPerGroup}).`),1}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else client.stdin.isTTY&&(output_manager_default.log("Specify a default route for the project. This path will be used for deployment screenshots and the default link to the project."),defaultRoute=await client.input.text({message:"Default route (e.g. /docs):",validate:validateDefaultRoute}));output_manager_default.log(""),output_manager_default.log(import_chalk240.default.bold("Billing")),output_manager_default.log(` ${import_chalk240.default.bold("Team:")} ${teamSlug}`);let projectFee;if(totalAfter<=freeProjects?projectFee=import_chalk240.default.green("Free")+` (first ${freeProjects} included)`:existingMfeProjectCount>=freeProjects?projectFee=import_chalk240.default.yellow("$250.00/month"):projectFee=import_chalk240.default.yellow("$250.00/month")+` (${freeProjects} free projects used)`,output_manager_default.log(` ${import_chalk240.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk240.default.bold("Request fee:")} ${import_chalk240.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects?output_manager_default.log(`Adding "${project.name}" is within the free tier, so no project fee will be charged to ${import_chalk240.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`):output_manager_default.log(`By proceeding, ${import_chalk240.default.bold(teamSlug)} will be charged for this project on the team's monthly bill.`),output_manager_default.log(""),!await client.input.confirm(`Add "${project.name}" to "${selectedGroup.group.name}"?`,!0))return output_manager_default.log("Aborted."),0;let addStamp=stamp_default();output_manager_default.spinner("Adding project to microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{microfrontendsGroupId:selectedGroup.group.id,isDefaultApp:!1,defaultRoute,enabled:!0}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`;return output_manager_default.success(`Project "${project.name}" added to group "${selectedGroup.group.name}" ${import_chalk240.default.gray(addStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`),output_manager_default.log(`Next step: Add routing paths for this project in your microfrontends.json configuration. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`),0}var import_chalk241=__toESM(require_source(),1);async function removeFromGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(removeFromGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],context=await ensureMicrofrontendsContext(client,{autoConfirm});if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse,projectGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(!projectGroup)return output_manager_default.error(`Project "${project.name}" is not part of any microfrontends group.`),1;if(projectGroup.projects.find(p=>p.id===project.id)?.microfrontends?.isDefaultApp)return output_manager_default.error(`Project "${project.name}" is the default app for group "${projectGroup.group.name}" and cannot be removed. To remove it, first change the default app in the dashboard.`),1;if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Removing "${project.name}" from microfrontends group "${projectGroup.group.name}" requires confirmation. Use --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;output_manager_default.log(`Removing project ${import_chalk241.default.bold(project.name)} from microfrontends group ${import_chalk241.default.bold(projectGroup.group.name)} on ${import_chalk241.default.bold(teamSlug)}.`),output_manager_default.log(`After removal, "${project.name}" will no longer be a child app in the group and will not be part of the composed application.`);let isReferencedInConfig=!!projectGroup.config?.applications?.[project.name];if(isReferencedInConfig&&(output_manager_default.log(""),output_manager_default.warn(`The microfrontends.json configuration still contains an entry for "${project.name}".`),output_manager_default.warn("Removing this project will cause other microfrontends projects in the group to fail deploying until the configuration is updated."),!autoConfirm)){if(!client.stdin.isTTY)return output_manager_default.error("Cannot remove a project that is still referenced in microfrontends.json in non-interactive mode."),1;if(output_manager_default.log(""),!await client.input.confirm(`Remove "${project.name}" even though it is still referenced in microfrontends.json?`,!1))return output_manager_default.log("Aborted."),0}if(output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm removal."),1;if(!await client.input.confirm(`Remove "${project.name}" from "${projectGroup.group.name}"?`,!1))return output_manager_default.log("Aborted."),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing project from microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{enabled:!1}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Project "${project.name}" removed from group "${projectGroup.group.name}" ${import_chalk241.default.gray(removeStamp())}`),isReferencedInConfig&&output_manager_default.log(`Remember to remove "${project.name}" from your microfrontends.json configuration.`),0}var import_chalk242=__toESM(require_source(),1);async function deleteGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deleteGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let autoConfirm=!!parsedArgs.flags["--yes"],groupFlag=parsedArgs.flags["--group"];if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a microfrontends group requires confirmation. Use --yes and --group to confirm.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm deletion"}]},1),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. There is nothing to delete."),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),1;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0,linkedGroup=linkedProject?groups.find(g=>g.projects.some(p=>p.id===linkedProject.id&&p.microfrontends?.isDefaultApp)):void 0;if(linkedGroup&&client.stdin.isTTY)if(await client.input.confirm(`Delete microfrontends group "${linkedGroup.group.name}" (linked to ${import_chalk242.default.bold(linkedProject.name)})?`,!0))selectedGroup=linkedGroup;else{if(groups.length===1)return output_manager_default.log("Aborted."),0;{let remaining=groups.filter(g=>g.group.id!==linkedGroup.group.id),groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:remaining.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}else{let groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}let groupName=selectedGroup.group.name,projectCount=selectedGroup.projects.length;if(output_manager_default.log(""),output_manager_default.log(`This will delete the microfrontends group ${import_chalk242.default.bold(groupName)} and all of its settings.`),projectCount>0&&output_manager_default.log(`${projectCount} project${projectCount>1?"s":""} will be removed from the group.`),output_manager_default.log(import_chalk242.default.red("This action is not reversible.")),output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm deletion."),1;if(await client.input.text({message:`Type ${import_chalk242.default.bold(groupName)} to confirm deletion:`,validate:val=>val!==groupName?`You must type "${groupName}" to confirm.`:!0})!==groupName)return output_manager_default.log("Aborted."),0}let deleteStamp=stamp_default();output_manager_default.spinner("Deleting microfrontends group\u2026");try{await client.fetch(`/v2/teams/${team.id}/microfrontends/${selectedGroup.group.id}?teamId=${team.id}`,{method:"DELETE"})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Microfrontends group "${groupName}" deleted ${import_chalk242.default.gray(deleteStamp())}`),0}import{existsSync as existsSync4}from"fs";import{join as join37}from"path";var import_chalk243=__toESM(require_source(),1);async function inspectGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(inspectGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error("error"in formatResult?formatResult.error:"Invalid output format"),1;let asJson=formatResult.jsonOutput,groupFlag=parsedArgs.flags["--group"],configFileNameFlag=parsedArgs.flags["--config-file-name"],{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist."),1;if(!groupFlag&&client.nonInteractive)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"Missing required flag --group. Use --group and --json in non-interactive mode.",next:[{command:'vercel microfrontends inspect-group --group="<group-name-or-id>" --json',when:"to inspect a specific microfrontends group non-interactively"}]},1),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),1;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag||g.group.slug===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group to inspect:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}let localRepoContext=await getLocalRepoContext(client);output_manager_default.spinner("Fetching project metadata\u2026");let projects2=await Promise.all(selectedGroup.projects.map(project=>enrichGroupProject(client,team.id,selectedGroup,project,localRepoContext)));output_manager_default.stopSpinner();let defaultProject=projects2.find(p=>p.isDefaultApp),configuredConfigFileName=resolveConfiguredMicrofrontendsConfigFileName(configFileNameFlag);if(configFileNameFlag&&!configuredConfigFileName)return output_manager_default.error("Invalid --config-file-name. Value must end with .json or .jsonc."),1;let configFile=resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName),json={group:{id:selectedGroup.group.id,slug:selectedGroup.group.slug,name:selectedGroup.group.name,fallbackEnvironment:selectedGroup.group.fallbackEnvironment??null},projectCount:projects2.length,defaultApp:defaultProject?.name??defaultProject?.id??null,configFile,config:{exists:!!selectedGroup.config,applications:Object.keys(selectedGroup.config?.applications??{})},projects:projects2};if(asJson)return client.stdout.write(`${JSON.stringify(json,null,2)}
1038
1043
  `),0;let groupTable=table([["Group",json.group.name],["ID",json.group.id],["Slug",json.group.slug],["Projects",String(json.projectCount)],["Default app",json.defaultApp??"(none)"],["Fallback environment",json.group.fallbackEnvironment??"(none)"],["Local config file",json.configFile??"(not found)"],["Config applications",json.config.applications.length>0?json.config.applications.join(", "):"(none)"]]);output_manager_default.log(""),output_manager_default.log(groupTable),output_manager_default.log(""),output_manager_default.log("Projects"),output_manager_default.log("");for(let project of projects2){let rows=[["Project",project.isDefaultApp?`${project.name} (default app)`:project.name],["Default route",project.defaultRoute??"(none)"],["Production domain",project.productionDomain??"(none)"],["Framework",project.framework??"(unknown)"],["Git org/repo",`${project.git.org??"(unknown)"}/${project.git.repo??"(unknown)"}`],["Root directory",project.git.rootDirectory??"(unknown)"]];project.packageName&&rows.push(["Package name",project.packageName]),project.inGroupConfig||rows.push(["In config",(0,import_chalk243.red)("no")]);let projectTable=table(rows);output_manager_default.log(projectTable),output_manager_default.log("")}for(let project of projects2)project.projectFetchStatus!=="ok"&&output_manager_default.warn(`Project metadata for "${project.id}" is incomplete (status: ${project.projectFetchStatus}).`);return 0}async function enrichGroupProject(client,teamId,group,groupProject,localRepoContext){let fullProject,projectFetchStatus="ok";try{let maybeProject=await getProjectByNameOrId(client,groupProject.id,teamId);maybeProject instanceof ProjectNotFound?projectFetchStatus="not_found":fullProject=maybeProject}catch{projectFetchStatus="error"}let name=groupProject.name??fullProject?.name??groupProject.id,inGroupConfig=Object.prototype.hasOwnProperty.call(group.config?.applications??{},name),rootDirectory=fullProject?.rootDirectory??null,gitRepo=fullProject?.link?.repo??null,gitOrg=fullProject?.link?.org??null,productionDomain=fullProject?.targets?.production?.alias?.[0]??fullProject?.targets?.production?.url??null,framework=fullProject?.framework??null,packageName2=await resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory);return{id:groupProject.id,name,isDefaultApp:!!groupProject.microfrontends?.isDefaultApp,enabled:!!groupProject.microfrontends?.enabled,defaultRoute:groupProject.microfrontends?.defaultRoute??null,productionDomain,framework,git:{org:gitOrg,repo:gitRepo,rootDirectory},packageName:packageName2,inGroupConfig,projectFetchStatus}}async function getLocalRepoContext(client){try{let link=await getLinkedProject(client,{cwd:client.cwd});return link.status!=="linked"?{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}:{repoRoot:link.repoRoot??null,linkedProjectId:link.project.id,linkedRepoOrg:link.project.link?.org??null,linkedRepoName:link.project.link?.repo??null}}catch{return{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}}}function isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo){return!localRepoContext.repoRoot||!localRepoContext.linkedRepoOrg||!localRepoContext.linkedRepoName?!1:localRepoContext.linkedRepoOrg===gitOrg&&localRepoContext.linkedRepoName===gitRepo}async function resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory){if(!isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo))return null;let projectDir=join37(localRepoContext.repoRoot,rootDirectory||""),packageJsonPath=join37(projectDir,"package.json"),pkg=await readJSONFile(packageJsonPath);return!pkg||pkg instanceof Error?null:typeof pkg.name=="string"?pkg.name:null}function resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName){let defaultProject=projects2.find(project=>project.isDefaultApp);if(!defaultProject||!isProjectInLocalRepo(localRepoContext,defaultProject.git.org,defaultProject.git.repo))return null;let projectDir=join37(localRepoContext.repoRoot,defaultProject.git.rootDirectory||""),configuredName=configuredConfigFileName??null;if(configuredName){let configuredPath=join37(projectDir,configuredName);if(existsSync4(configuredPath))return configuredPath}let jsonPath=join37(projectDir,"microfrontends.json"),jsoncPath=join37(projectDir,"microfrontends.jsonc");return existsSync4(jsonPath)?jsonPath:existsSync4(jsoncPath)?jsoncPath:null}function resolveConfiguredMicrofrontendsConfigFileName(configured){if(!configured)return null;let normalized=configured.trim();return!normalized.endsWith(".json")&&!normalized.endsWith(".jsonc")?null:normalized.replace(/^\/+/,"")}var MicrofrontendsTelemetryClient=class extends TelemetryClient{trackCliSubcommandPull(actual){this.trackCliSubcommand({subcommand:"pull",value:actual})}trackCliSubcommandCreateGroup(actual){this.trackCliSubcommand({subcommand:"create-group",value:actual})}trackCliSubcommandAddToGroup(actual){this.trackCliSubcommand({subcommand:"add-to-group",value:actual})}trackCliSubcommandRemoveFromGroup(actual){this.trackCliSubcommand({subcommand:"remove-from-group",value:actual})}trackCliSubcommandDeleteGroup(actual){this.trackCliSubcommand({subcommand:"delete-group",value:actual})}trackCliSubcommandInspectGroup(actual){this.trackCliSubcommand({subcommand:"inspect-group",value:actual})}};var COMMAND_CONFIG51={"create-group":getCommandAliases(createGroupSubcommand),"add-to-group":getCommandAliases(addToGroupSubcommand),"remove-from-group":getCommandAliases(removeFromGroupSubcommand),"delete-group":getCommandAliases(deleteGroupSubcommand),"inspect-group":getCommandAliases(inspectGroupSubcommand),pull:getCommandAliases(pullSubcommand)};async function main27(client){let telemetry2=new MicrofrontendsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(microfrontendsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG51),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("microfrontends"),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:microfrontendsCommand,columns:client.stderr.columns})),2}switch(subcommand){case"create-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(createGroupSubcommand)):(telemetry2.trackCliSubcommandCreateGroup(subcommandOriginal),createGroup(client));case"add-to-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(addToGroupSubcommand)):(telemetry2.trackCliSubcommandAddToGroup(subcommandOriginal),addToGroup(client));case"remove-from-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(removeFromGroupSubcommand)):(telemetry2.trackCliSubcommandRemoveFromGroup(subcommandOriginal),removeFromGroup(client));case"delete-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(deleteGroupSubcommand)):(telemetry2.trackCliSubcommandDeleteGroup(subcommandOriginal),deleteGroup(client));case"inspect-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(inspectGroupSubcommand)):(telemetry2.trackCliSubcommandInspectGroup(subcommandOriginal),inspectGroup(client));case"pull":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(pullSubcommand)):(telemetry2.trackCliSubcommandPull(subcommandOriginal),pull2(client));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG51)),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2}}var import_open17=__toESM(require_open(),1);var OpenTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliCommandOpen(value){this.trackCliCommand({command:"open",value})}};async function openCommandHandler(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(openCommand.options),telemetry2=new OpenTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("open"),output_manager_default.print(help(openCommand,{columns:client.stderr.columns})),0;let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("open",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;if(link.status!=="linked"||!link.org||!link.project)return client.nonInteractive||(output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(` vercel link
@@ -1251,20 +1256,24 @@ ${import_chalk274.default.gray("No changes detected from current production vers
1251
1256
  `),output_manager_default.print(` ${import_chalk281.default.gray("ID:")} ${route.id}
1252
1257
  `),output_manager_default.print(`
1253
1258
  ${import_chalk281.default.bold("Staging version:")} ${version2.id}
1254
- `),await offerAutoPromote(client,projectId,version2,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e2){let error=e2;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ROUTE_CREATE_FAILED,message:"Route creation failed for this project. See hint for next steps.",hint:error.message||"Use `vercel routes list --diff` to inspect staged routes, then adjust flags and retry.",next:[{command:withGlobalFlags2(client,"routes list --diff"),when:"to inspect staged state"}]},1),output_manager_default.error(error.message||"Failed to create route"),1}}var COMMAND_CONFIG55={list:getCommandAliases(listSubcommand19),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand12),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main30(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG55),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand19),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),2):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand12),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect17(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),2):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-VOZ4IKZI.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),2):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-MPLEIGYN.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),2):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-IJ7UEQ3G.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),2):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-WY6N4R7I.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),2):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-L4L2V3MZ.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),2):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-L4D4GCJI.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),2):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-FIHJARRJ.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),2):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-OZPJHXTE.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),2):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-3VYFSUTH.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG55)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg=args[i],[option,inlineValue]=arg.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),0}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default";function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}request(path3,options={}){let url=new URL(path3,this.baseUrl);return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=20}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"enable")}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=20,sort,from,to,executionId}){let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again.",retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError():{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError():{reason:AGENT_REASON.API_ERROR,message:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details}),1):(output_manager_default.fatal(details.message),1)}var IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/;var QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/;var LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>256)return`${label} must be at most 256 characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>256||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>15?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,usage2),when:"Provide valid schedule arguments"}]}),1):(output_manager_default.fatal(message),1)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
1259
+ `),await offerAutoPromote(client,projectId,version2,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e2){let error=e2;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ROUTE_CREATE_FAILED,message:"Route creation failed for this project. See hint for next steps.",hint:error.message||"Use `vercel routes list --diff` to inspect staged routes, then adjust flags and retry.",next:[{command:withGlobalFlags2(client,"routes list --diff"),when:"to inspect staged state"}]},1),output_manager_default.error(error.message||"Failed to create route"),1}}var COMMAND_CONFIG55={list:getCommandAliases(listSubcommand19),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand12),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main30(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG55),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand19),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),2):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand12),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect17(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),2):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-OQYEMSTW.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),2):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-UAJRL4OB.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),2):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-PQE7IYLJ.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),2):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-F22ULQBR.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),2):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-DSBV4PC7.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),2):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-MXCHIXRP.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),2):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-LY3THAIP.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),2):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-YW2G6UVL.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),2):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-RTIHE562.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG55)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg=args[i],[option,inlineValue]=arg.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.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{trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default";function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}request(path3,options={}){let url=new URL(path3,this.baseUrl);return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=20}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"enable")}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=20,sort,from,to,executionId}){let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again.",retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError():{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="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"||error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError():{reason:AGENT_REASON.API_ERROR,message:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details}),1):(output_manager_default.fatal(details.message),1)}var IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/;var QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/;var LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>256)return`${label} must be at most 256 characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>256||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>15?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,usage2),when:"Provide valid schedule arguments"}]}),1):(output_manager_default.fatal(message),1)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
1255
1260
  `)}else output_manager_default.success(message);return 0}async function runScheduleAction(client,argv,action){let subcommand=action==="enable"?enableSubcommand4:action==="disable"?disableSubcommand4:invokeSubcommand,usage2=`schedules ${action} <name>`,telemetry2=new SchedulesActionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(subcommand.options))}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],usage2);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,usage2,flags);if(!outputMode.valid)return outputMode.exitCode;let link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedulesClient=new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}),schedule;try{action==="enable"?schedule=await schedulesClient.enable(identifier):action==="disable"?schedule=await schedulesClient.disable(identifier):await schedulesClient.invoke(identifier)}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action,name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`${action==="enable"?"Enabled":action==="disable"?"Disabled":"Invoked"} schedule ${identifier.namespace}/${identifier.name}.`;if(schedule)return writeScheduleMutationResult(client,schedule,message,outputMode.json);if(outputMode.json){let result=client.nonInteractive?{status:AGENT_STATUS.OK,message}:{invoked:!0,name:identifier.name,namespace:identifier.namespace};client.stdout.write(`${JSON.stringify(result,null,2)}
1256
1261
  `)}else output_manager_default.success(message);return 0}var SchedulesCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionCron(cron){cron&&this.trackCliOption({option:"cron",value:this.redactedValue})}trackCliOptionAt(at){at&&this.trackCliOption({option:"at",value:this.redactedValue})}trackCliOptionTimezone(timezone){timezone&&this.trackCliOption({option:"timezone",value:timezone})}trackCliOptionJitter(jitter){jitter!==void 0&&this.trackCliOption({option:"jitter",value:String(jitter)})}trackCliOptionTopic(topic){topic&&this.trackCliOption({option:"topic",value:this.redactedValue})}trackCliOptionPayload(payload){payload!==void 0&&this.trackCliOption({option:"payload",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE13="schedules create <name> --cron <expression> --topic <topic>";async function create6(client,argv){let telemetry2=new SchedulesCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(createSubcommand6.options))}catch(error){return invalidScheduleArguments(client,USAGE13,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionCron(flags["--cron"]),telemetry2.trackCliOptionAt(flags["--at"]),telemetry2.trackCliOptionTimezone(flags["--timezone"]),telemetry2.trackCliOptionJitter(flags["--jitter"]),telemetry2.trackCliOptionTopic(flags["--topic"]),telemetry2.trackCliOptionPayload(flags["--payload"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE13);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!0);if(!expression.valid)return invalidScheduleArguments(client,USAGE13,expression.error);let topic=flags["--topic"];if(!topic?.trim())return invalidScheduleArguments(client,USAGE13,"A target queue topic is required. Use `--topic`.");let topicError=validateScheduleQueueTopic(topic);if(topicError)return invalidScheduleArguments(client,USAGE13,topicError);let jitter=parseCreateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE13,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE13,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE13,payload.error);let outputMode=parseScheduleOutput(client,USAGE13,flags);if(!outputMode.valid)return outputMode.exitCode;let link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;outputMode.json||output_manager_default.spinner("Creating schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).create({name:identifier.name,namespace:identifier.namespace,expression:expression.value,target:{topic},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...jitter.value!==void 0&&{jitter:jitter.value},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"create",name:identifier.name,namespace:identifier.namespace})}return output_manager_default.stopSpinner(),writeScheduleMutationResult(client,schedule,`Created schedule ${identifier.namespace}/${identifier.name}.`,outputMode.json)}var SchedulesDeleteTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE14="schedules delete <name> --yes";async function deleteSchedule(client,argv){let telemetry2=new SchedulesDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(deleteSubcommand4.options))}catch(error){return invalidScheduleArguments(client,USAGE14,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliFlagYes(flags["--yes"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE14);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,USAGE14,flags);if(!outputMode.valid)return outputMode.exitCode;let skipConfirmation=flags["--yes"]??!1;if(client.nonInteractive&&!skipConfirmation)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"Deleting a schedule requires confirmation. Re-run with `--yes`.",next:[{command:buildCommandWithYes(client.argv)}]},1),1;let link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;if(!skipConfirmation&&!await client.input.confirm(`Delete schedule ${identifier.namespace}/${identifier.name}? This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;outputMode.json||output_manager_default.spinner("Deleting schedule\u2026");let deletedScheduleId;try{deletedScheduleId=(await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).delete(identifier)).scheduleId}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"delete",name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`Deleted schedule ${identifier.namespace}/${identifier.name}.`;if(outputMode.json){let deleted={name:identifier.name,namespace:identifier.namespace,scheduleId:deletedScheduleId},result=client.nonInteractive?{status:AGENT_STATUS.OK,deleted,message}:{deleted:!0,...deleted};client.stdout.write(`${JSON.stringify(result,null,2)}
1257
- `)}else output_manager_default.success(message);return 0}var import_chalk282=__toESM(require_source(),1);var SchedulesListExecutionsTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionFrom(from){from!==void 0&&this.trackCliOption({option:"from",value:String(from)})}trackCliOptionTo(to){to!==void 0&&this.trackCliOption({option:"to",value:String(to)})}trackCliOptionExecutionId(executionId){executionId&&this.trackCliOption({option:"execution-id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules executions list <name>",MAX_EXECUTION_RANGE_MS=30*864e5;function invalidArguments3(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE15),when:"List schedule executions with valid options"}]}),1):(output_manager_default.fatal(message),1)}function capitalize(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function executionTable(executions2){let rows=[["Execution ID","Source","Fired At"].map(header=>import_chalk282.default.dim(header)),...executions2.map(execution=>[import_chalk282.default.bold(execution.executionId),execution.invokeSource?capitalize(execution.invokeSource):import_chalk282.default.gray("-"),execution.firedAt===null?import_chalk282.default.gray("-"):formatDate(execution.firedAt)])];return table(rows,{hsep:3}).split(`
1262
+ `)}else output_manager_default.success(message);return 0}var import_chalk282=__toESM(require_source(),1);var SchedulesListExecutionsTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionFrom(from){from!==void 0&&this.trackCliOption({option:"from",value:String(from)})}trackCliOptionTo(to){to!==void 0&&this.trackCliOption({option:"to",value:String(to)})}trackCliOptionExecutionId(executionId){executionId&&this.trackCliOption({option:"execution-id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules executions list <name>",MAX_EXECUTION_RANGE_MS=30*864e5;function invalidArguments3(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE15),when:"List schedule executions with valid options"}]}),1):(output_manager_default.fatal(message),1)}function capitalize(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExecutionStatus(status6){return status6==="succeeded"?import_chalk282.default.green("Succeeded"):status6==="failed"?import_chalk282.default.red("Failed"):import_chalk282.default.gray("Unavailable")}function formatPercentage3(value){return value===null?import_chalk282.default.gray("-"):`${Number((value*100).toFixed(2))}%`}function formatDuration3(value){return value===null?import_chalk282.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(`
1263
+ `)}function executionTable(executions2){let rows=[["Execution ID","Status","Source","Fired At"].map(header=>import_chalk282.default.dim(header)),...executions2.map(execution=>[import_chalk282.default.bold(execution.executionId),formatExecutionStatus(execution.status),execution.invokeSource?capitalize(execution.invokeSource):import_chalk282.default.gray("-"),execution.firedAt===null?import_chalk282.default.gray("-"):formatDate(execution.firedAt)])];return table(rows,{hsep:3}).split(`
1258
1264
  `).map(line2=>line2.trimEnd()).join(`
1259
- `).replace(/^/gm," ")}function nextPageCommand(client,name,namespace,options){let parts=["schedules executions list",quoteArg(name)];return options.namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),options.limitWasExplicit&&parts.push(`--limit ${options.limit}`),options.sortWasExplicit&&options.sort&&parts.push(`--sort ${options.sort}`),options.from!==void 0&&options.to!==void 0&&parts.push(`--from ${options.from} --to ${options.to}`),options.executionId!==void 0&&parts.push(`--execution-id ${quoteArg(options.executionId)}`),parts.push(`--next ${quoteArg(options.cursor)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function validateTimeRange(from,to){return from===void 0!=(to===void 0)?"`--from` and `--to` must both be provided.":from===void 0||to===void 0?null:!Number.isInteger(from)||from<0?"`--from` must be a non-negative integer (Unix milliseconds).":!Number.isInteger(to)||to<0?"`--to` must be a non-negative integer (Unix milliseconds).":to<=from?"`--to` must be after `--from`.":to-from>MAX_EXECUTION_RANGE_MS?"The time range must be at most 30 days.":null}async function list24(client,argv){let telemetry2=new SchedulesListExecutionsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(executionsListSubcommand.options))}catch(error){return invalidArguments3(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:20}),sort=flags["--sort"],from=flags["--from"],to=flags["--to"],executionId=flags["--execution-id"];if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionSort(sort),telemetry2.trackCliOptionFrom(from),telemetry2.trackCliOptionTo(to),telemetry2.trackCliOptionExecutionId(executionId),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments3(client,`A schedule name is required. Usage: ${getCommandName(USAGE15)}`);if(args.length!==1)return invalidArguments3(client,`Expected one schedule name. Usage: ${getCommandName(USAGE15)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments3(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments3(client,namespaceError);if(!limitResult.valid)return invalidArguments3(client,limitResult.message);if(sort!==void 0&&sort!=="asc"&&sort!=="desc")return invalidArguments3(client,"`--sort` must be `asc` or `desc`.");let timeRangeError=validateTimeRange(from,to);if(timeRangeError)return invalidArguments3(client,timeRangeError);if(executionId!==void 0&&!executionId.trim())return invalidArguments3(client,"`--execution-id` cannot be empty.");let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments3(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner(`Fetching executions for ${namespace}/${name}\u2026`);let result;try{result=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).listExecutions({name,namespace,cursor:flags["--next"],limit:limitResult.value,...sort!==void 0?{sort}:{},...from!==void 0?{from,to}:{},...executionId!==void 0?{executionId}:{}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list-executions",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,message:`Found ${result.data.length} execution${result.data.length===1?"":"s"} for schedule ${namespace}/${name}.`}:result;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1260
- `),0}if(result.data.length===0)return output_manager_default.print(`No executions found for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}.
1261
- `),0;if(output_manager_default.print(`Executions for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}
1265
+ `).replace(/^/gm," ")}function nextPageCommand(client,name,namespace,options){let parts=["schedules executions list",quoteArg(name)];return options.namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),options.limitWasExplicit&&parts.push(`--limit ${options.limit}`),options.sortWasExplicit&&options.sort&&parts.push(`--sort ${options.sort}`),options.from!==void 0&&options.to!==void 0&&parts.push(`--from ${options.from} --to ${options.to}`),options.executionId!==void 0&&parts.push(`--execution-id ${quoteArg(options.executionId)}`),parts.push(`--next ${quoteArg(options.cursor)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function validateTimeRange(from,to){return from===void 0!=(to===void 0)?"`--from` and `--to` must both be provided.":from===void 0||to===void 0?null:!Number.isInteger(from)||from<0?"`--from` must be a non-negative integer (Unix milliseconds).":!Number.isInteger(to)||to<0?"`--to` must be a non-negative integer (Unix milliseconds).":to<=from?"`--to` must be after `--from`.":to-from>MAX_EXECUTION_RANGE_MS?"The time range must be at most 30 days.":null}async function list24(client,argv){let telemetry2=new SchedulesListExecutionsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(executionsListSubcommand.options))}catch(error){return invalidArguments3(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:20}),sort=flags["--sort"],from=flags["--from"],to=flags["--to"],executionId=flags["--execution-id"];if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionSort(sort),telemetry2.trackCliOptionFrom(from),telemetry2.trackCliOptionTo(to),telemetry2.trackCliOptionExecutionId(executionId),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments3(client,`A schedule name is required. Usage: ${getCommandName(USAGE15)}`);if(args.length!==1)return invalidArguments3(client,`Expected one schedule name. Usage: ${getCommandName(USAGE15)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments3(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments3(client,namespaceError);if(!limitResult.valid)return invalidArguments3(client,limitResult.message);if(sort!==void 0&&sort!=="asc"&&sort!=="desc")return invalidArguments3(client,"`--sort` must be `asc` or `desc`.");let timeRangeError=validateTimeRange(from,to);if(timeRangeError)return invalidArguments3(client,timeRangeError);if(executionId!==void 0&&!executionId.trim())return invalidArguments3(client,"`--execution-id` cannot be empty.");let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments3(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner(`Fetching executions for ${namespace}/${name}\u2026`);let result;try{result=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).listExecutions({name,namespace,cursor:flags["--next"],limit:limitResult.value,...sort!==void 0?{sort}:{},...from!==void 0?{from,to}:{},...executionId!==void 0?{executionId}:{}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list-executions",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,metrics:result.metrics,message:`Found ${result.data.length} execution${result.data.length===1?"":"s"} for schedule ${namespace}/${name}.`}:result;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1266
+ `),0}if(output_manager_default.print(`Executions for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}
1262
1267
 
1268
+ ${executionMetrics(result.metrics)}
1269
+ `),result.data.length===0)return output_manager_default.print(`
1270
+ No executions found for schedule ${import_chalk282.default.bold(`${namespace}/${name}`)}.
1271
+ `),0;if(output_manager_default.print(`
1263
1272
  ${executionTable(result.data)}
1264
1273
  `),result.cursor){let next=nextPageCommand(client,name,namespace,{namespaceWasExplicit:flags["--namespace"]!==void 0,limit:limitResult.value,limitWasExplicit:flags["--limit"]!==void 0,sort,sortWasExplicit:flags["--sort"]!==void 0,from,to,executionId,cursor:result.cursor});output_manager_default.print(`
1265
1274
  More executions are available. Run ${cmd(next)} to continue.
1266
- `)}return 0}var COMMAND_CONFIG56={list:getCommandAliases(executionsListSubcommand)};async function executions(client,args,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(args,getFlagsSpecification(executionsSubcommand.options),{permissive:!0})}catch(error){return printError(error),1}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG56),needHelp=parsedArgs.flags["--help"];function printHelp(command2,nested){return output_manager_default.print(help(command2,{parent:nested?{...schedulesCommand,name:"schedules executions"}:schedulesCommand,columns:client.stderr.columns})),2}return subcommand?subcommand==="list"?needHelp?(telemetry2.trackCliFlagHelp("schedules",`executions:${subcommandOriginal}`),printHelp(executionsListSubcommand,!0)):(telemetry2.trackCliSubcommandExecutionsList(subcommandOriginal),list24(client,subArgs)):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),printHelp(executionsSubcommand,!1)):needHelp?(telemetry2.trackCliFlagHelp("schedules","executions"),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2)}var import_chalk283=__toESM(require_source(),1);var SchedulesGetTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE16="schedules get <name>";function invalidArguments4(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE16),when:"Provide a valid schedule name"}]}),1):(output_manager_default.fatal(message),1)}function formatExpression(expression){return expression.type==="cron"?expression.cron:expression.at}function formatTarget(target){return target.type==="queue"?`${target.topic} ${import_chalk283.default.gray("(Queue)")}`:`${target.function} ${import_chalk283.default.gray("(Function)")}`}function capitalize2(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function printSchedule(schedule){printAlignedLabel("Name",schedule.name),printAlignedLabel("Namespace",schedule.namespace),printAlignedLabel("State",capitalize2(schedule.state)),printAlignedLabel("Source",capitalize2(schedule.source)),printAlignedLabel("Type",capitalize2(schedule.expression.type)),printAlignedLabel("Expression",formatExpression(schedule.expression)),printAlignedLabel("Timezone",schedule.timezone),schedule.jitter!==void 0&&printAlignedLabel("Jitter",`${schedule.jitter} minute${schedule.jitter===1?"":"s"}`),printAlignedLabel("Target",formatTarget(schedule.target)),printAlignedLabel("Schedule ID",schedule.scheduleId),printAlignedLabel("Project ID",schedule.projectId),printAlignedLabel("Owner ID",schedule.ownerId),printAlignedLabel("Created",formatDate(schedule.createdAt)),printAlignedLabel("Updated",formatDate(schedule.updatedAt))}async function get3(client,argv){let telemetry2=new SchedulesGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(getSubcommand2.options))}catch(error){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),1):(output_manager_default.fatal(error instanceof Error?error.message:String(error)),1)}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE;if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments4(client,"A schedule name is required");if(args.length!==1)return invalidArguments4(client,`Expected one schedule name. Usage: ${getCommandName(USAGE16)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments4(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments4(client,namespaceError);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments4(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).get({name,namespace})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"get",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message:`Schedule ${namespace}/${name} found.`}:schedule;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1267
- `),0}return printSchedule(schedule),0}var import_chalk284=__toESM(require_source(),1);var SchedulesListTelemetryClient=class extends TelemetryClient{trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE17="schedules list";function invalidArguments5(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE17),when:"List schedules with valid options"}]}),1):(output_manager_default.fatal(message),1)}function capitalize3(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExpression2(expression){return expression.type==="cron"?expression.cron:expression.at}function formatTarget2(target){return target.type==="queue"?`Queue: ${target.topic}`:`Function: ${target.function}`}function scheduleTable(schedules){let rows=[["Name","State","Type","Expression","Target"].map(header=>import_chalk284.default.dim(header)),...schedules.map(schedule=>[import_chalk284.default.bold(schedule.name),capitalize3(schedule.state),capitalize3(schedule.expression.type),formatExpression2(schedule.expression),formatTarget2(schedule.target)])];return table(rows,{hsep:3}).split(`
1275
+ `)}return 0}var COMMAND_CONFIG56={list:getCommandAliases(executionsListSubcommand)};async function executions(client,args,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(args,getFlagsSpecification(executionsSubcommand.options),{permissive:!0})}catch(error){return printError(error),1}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG56),needHelp=parsedArgs.flags["--help"];function printHelp(command2,nested){return output_manager_default.print(help(command2,{parent:nested?{...schedulesCommand,name:"schedules executions"}:schedulesCommand,columns:client.stderr.columns})),2}return subcommand?subcommand==="list"?needHelp?(telemetry2.trackCliFlagHelp("schedules",`executions:${subcommandOriginal}`),printHelp(executionsListSubcommand,!0)):(telemetry2.trackCliSubcommandExecutionsList(subcommandOriginal),list24(client,subArgs)):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),printHelp(executionsSubcommand,!1)):needHelp?(telemetry2.trackCliFlagHelp("schedules","executions"),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG56)),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2)}var import_chalk283=__toESM(require_source(),1);function formatScheduleTarget(target){switch(target.type){case"queue":return`Queue: ${target.topic}`;case"path":return`Path: ${target.path}`;case"function":return`Function: ${target.function}`}}function formatScheduleTargetDetail(target){switch(target.type){case"queue":return`${target.topic} ${import_chalk283.default.gray("(Queue)")}`;case"path":return`${target.path} ${import_chalk283.default.gray("(Path)")}`;case"function":return`${target.function} ${import_chalk283.default.gray("(Function)")}`}}var SchedulesGetTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE16="schedules get <name>";function invalidArguments4(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE16),when:"Provide a valid schedule name"}]}),1):(output_manager_default.fatal(message),1)}function formatExpression(expression){return expression.type==="cron"?expression.cron:expression.at}function capitalize2(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function printSchedule(schedule){printAlignedLabel("Name",schedule.name),printAlignedLabel("Namespace",schedule.namespace),printAlignedLabel("State",capitalize2(schedule.state)),printAlignedLabel("Source",capitalize2(schedule.source)),printAlignedLabel("Type",capitalize2(schedule.expression.type)),printAlignedLabel("Expression",formatExpression(schedule.expression)),printAlignedLabel("Timezone",schedule.timezone),schedule.jitter!==void 0&&printAlignedLabel("Jitter",`${schedule.jitter} minute${schedule.jitter===1?"":"s"}`),printAlignedLabel("Target",formatScheduleTargetDetail(schedule.target)),printAlignedLabel("Schedule ID",schedule.scheduleId),printAlignedLabel("Project ID",schedule.projectId),printAlignedLabel("Owner ID",schedule.ownerId),printAlignedLabel("Created",formatDate(schedule.createdAt)),printAlignedLabel("Updated",formatDate(schedule.updatedAt))}async function get3(client,argv){let telemetry2=new SchedulesGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(getSubcommand2.options))}catch(error){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),1):(output_manager_default.fatal(error instanceof Error?error.message:String(error)),1)}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE;if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments4(client,"A schedule name is required");if(args.length!==1)return invalidArguments4(client,`Expected one schedule name. Usage: ${getCommandName(USAGE16)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments4(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments4(client,namespaceError);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments4(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).get({name,namespace})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"get",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message:`Schedule ${namespace}/${name} found.`}:schedule;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1276
+ `),0}return printSchedule(schedule),0}var import_chalk284=__toESM(require_source(),1);var SchedulesListTelemetryClient=class extends TelemetryClient{trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE17="schedules list";function invalidArguments5(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE17),when:"List schedules with valid options"}]}),1):(output_manager_default.fatal(message),1)}function capitalize3(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExpression2(expression){return expression.type==="cron"?expression.cron:expression.at}function scheduleTable(schedules){let rows=[["Name","State","Type","Expression","Target"].map(header=>import_chalk284.default.dim(header)),...schedules.map(schedule=>[import_chalk284.default.bold(schedule.name),capitalize3(schedule.state),capitalize3(schedule.expression.type),formatExpression2(schedule.expression),formatScheduleTarget(schedule.target)])];return table(rows,{hsep:3}).split(`
1268
1277
  `).map(line2=>line2.trimEnd()).join(`
1269
1278
  `).replace(/^/gm," ")}function nextPageCommand2(client,namespace,namespaceWasExplicit,limit,limitWasExplicit,cursor2){let parts=["schedules list"];return namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),limitWasExplicit&&parts.push(`--limit ${limit}`),parts.push(`--next ${quoteArg(cursor2)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}async function list25(client,argv){let telemetry2=new SchedulesListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(listSubcommand20.options))}catch(error){return invalidArguments5(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:20});if(telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length!==0)return invalidArguments5(client,`Expected no arguments. Usage: ${getCommandName(USAGE17)}`);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments5(client,namespaceError);if(!limitResult.valid)return invalidArguments5(client,limitResult.message);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments5(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedules\u2026");let result;try{result=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).list({namespace,cursor:flags["--next"],limit:limitResult.value})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list",namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,message:`Found ${result.data.length} schedule${result.data.length===1?"":"s"} in namespace ${namespace}.`}:result;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1270
1279
  `),0}if(result.data.length===0)return output_manager_default.print(`No schedules found in namespace ${namespace}.
@@ -1293,7 +1302,7 @@ ${gutter} ${import_chalk286.default.bold(heading)}
1293
1302
  `),{ok,complete:ok&&result.status!=="declined",summary:visible.length>0?visible.map(result2=>summarizePlugin(result2,result2.name)).join("; "):"Skipped (no plugin available for the selected agents)"}}function summarizePlugin(result,name){switch(result.status){case"installed":return`Installed for ${name}`;case"enabled":return`Enabled for ${name}`;case"updated":return`Updated for ${name}`;case"up_to_date":return`Already installed for ${name}`;case"not_detected":return`Skipped (${name} not detected)`;case"declined":return`Skipped for ${name}`;case"confirmation_required":return`Confirmation required for ${name} (re-run with --yes)`;case"dry_run":return`Would ${result.action??"install"} for ${name}`;case"failed":return`Failed for ${name}`}}async function runGatewayStep(client,opts){let argv=[];opts.yes&&argv.push("--yes"),opts.dryRun&&argv.push("--dry-run");for(let agent2 of opts.agents??[])argv.push("--agent",agent2);let result=await setupCodingAgents(client,argv),summaries={configured:"Completed (see above)",already_configured:"Already configured",dry_run:"Previewed (see above)",canceled:"Canceled (no changes applied)",skipped:"Skipped (see above)",agent_prompt:"Prompt generated (apply it with your agent)",failed:"Failed \u2014 see the messages above"};return{ok:result.exitCode===0,complete:result.exitCode===0&&result.outcome!=="canceled"&&result.outcome!=="skipped"&&result.outcome!=="agent_prompt",summary:summaries[result.outcome]}}var import_chalk287=__toESM(require_source(),1);var SignupTelemetryClient=class extends TelemetryClient{trackCliOptionEmail(email2){email2&&this.trackCliOption({option:"email",value:this.redactedValue})}trackState(...args){this.trackLoginState(...args)}};function isValidEmail(value){return email.test(value.trim())}async function signup(client){let telemetry2=new SignupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(signupCommand.options))}catch(error){return printError(error,client),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("signup"),output_manager_default.print(help(signupCommand,{columns:client.stderr.columns})),0;if(parsedArgs.flags["--token"])return output_manager_default.error('`--token` may not be used with the "signup" command'),2;if(parsedArgs.args.slice(1).length)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("signup --email user@example.com")}`),2;let emailOption=parsedArgs.flags["--email"];telemetry2.trackCliOptionEmail(emailOption);let email2=emailOption?.trim();if(email2&&!isValidEmail(email2))return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:"The value provided for --email is not a valid email address."}),output_manager_default.error(`Couldn't use ${import_chalk287.default.bold(email2)}: not a valid email address.`),1;let canPrompt2=client.stdin.isTTY===!0&&!client.nonInteractive&&!client.isAgent;if(!email2){if(!canPrompt2)return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Provide an email address with --email."}),output_manager_default.error(`Provide an email address with ${import_chalk287.default.bold("--email")}. Example: ${getCommandName("signup --email user@example.com")}`),1;email2=await client.input.text({message:"Email?",validate:value=>isValidEmail(value)?!0:"Enter a valid email address."}),email2=email2.trim()}telemetry2.trackState("started");try{let tokens=await performDeviceCodeFlow(client,{signupEmail:email2});if(!tokens)return telemetry2.trackState("error"),1;await saveDeviceCodeTokens(client,tokens)}catch(error){return telemetry2.trackState("error"),printError(error),1}return output_manager_default.print(`
1294
1303
  ${import_chalk287.default.cyan("Welcome to Vercel!")} Your account is ready and you are signed in.
1295
1304
 
1296
- To deploy something, run ${getCommandName()}.
1305
+ Run ${getCommandName("deploy")} to deploy, or ${getCommandName("setup")} to set up the Vercel plugin and connect your coding agents to AI Gateway.
1297
1306
 
1298
1307
  ${emoji("tip")} To deploy every commit automatically,
1299
1308
  connect a Git Repository (${import_chalk287.default.bold(output_manager_default.link("vercel.link/git","https://vercel.link/git",{color:!1}))}).
@@ -1373,16 +1382,18 @@ Learn more: ${import_chalk307.default.cyan("https://vercel.com/docs/cli/about-te
1373
1382
  `)}function renderTree(analysis){let lines=["## Span tree",""];if(analysis.treeOrder.length===0&&analysis.orphanOrder.length===0)return lines.push("_No spans._"),lines.join(`
1374
1383
  `);for(let node of analysis.treeOrder)lines.push(formatTreeRow(node,analysis));if(analysis.orphanOrder.length>0){lines.push("","### Orphan spans","");for(let node of analysis.orphanOrder)lines.push(formatTreeRow(node,analysis))}return analysis.truncatedAtDepth&&lines.push("",`_Tree truncated at depth ${256}._`),lines.join(`
1375
1384
  `)}function formatTreeRow(node,analysis){let{span,depth}=node,info=analysis.spanInfo.get(span.spanId),indent3=" ".repeat(depth),parts=[],durationUs=info?.durationUs??null;if(parts.push(`\`${formatDurationUs(durationUs)}\``),analysis.rootDurationUs!==null&&analysis.rootDurationUs>0&&parts.push(formatPct(durationUs,analysis.rootDurationUs)),analysis.rootStartUs!==null){let offset=info?.startOffsetUs??null;parts.push(formatOffset(offset))}if(parts.push(`\`${span.name||UNNAMED}\``),span.status?.code===1){let message=span.status.message;parts.push(message?`[error: ${message}]`:"[error]")}let[hint]=collectAttrHints(span.attributes);return hint&&parts.push(`\u2014 \`${hint.key}\`: ${hint.value}`),`${indent3}- ${parts.join(" ")}`}function formatEndpoint(method,target,status6){let left=method&&target?`${method} ${target}`:method??target,path3=left?`\`${left}\``:UNKNOWN;return status6?`${path3} \u2192 ${status6}`:path3}function formatSpansLine(count2,errors){return errors===0?String(count2):`${count2} (${errors} ${errors===1?"error":"errors"})`}function formatDurationUs(us){return us===null?UNKNOWN:us<1e3?`${Math.round(us)}\u03BCs`:us<1e6?`${(us/1e3).toFixed(1)}ms`:`${(us/1e6).toFixed(1)}s`}function formatOffset(us){return us===null?`+${UNKNOWN}`:`+${formatDurationUs(us)}`}function formatPct(us,rootUs){if(us===null||rootUs<=0)return UNKNOWN;let pct=us/rootUs*100;return pct>0&&pct<1?"<1%":`${Math.round(pct)}%`}function collectAttrHints(attributes){if(!attributes)return[];let out=[];for(let key of ATTR_HINT_KEYS){let value=readAttrString(attributes,key);value!==void 0&&out.push({key,value:ellipsis(value,ATTR_VALUE_MAX_LEN)})}return out}var VIEW_OPTIONS=["timeline","tree","waterfall"];function isView(value){return VIEW_OPTIONS.includes(value)}function buildDashboardUrl({teamSlug,projectName,traceId,view}){let base=`https://vercel.com/${encodeURIComponent(teamSlug)}/${encodeURIComponent(projectName)}/logs/traces/${encodeURIComponent(traceId)}`;return view&&view!=="timeline"?`${base}?view=${encodeURIComponent(view)}`:base}async function resolveDashboardScope({client,scopeFlag,projectFlag,teamId,linkedProject}){let teamSlug;if(scopeFlag)scopeFlag.startsWith("team_")?teamSlug=(await getTeamByIdOrSlug(client,scopeFlag)).slug:teamSlug=scopeFlag;else if(linkedProject.status==="linked")teamSlug=linkedProject.org.slug;else return{error:"Unable to resolve team slug for the dashboard URL.",reason:AGENT_REASON.NOT_LINKED};let projectName;if(projectFlag){let project=await getProjectByNameOrId(client,projectFlag,teamId);if(project instanceof ProjectNotFound)return{error:`Project not found: ${projectFlag}`,reason:AGENT_REASON.NOT_FOUND};projectName=project.name}else if(linkedProject.status==="linked")projectName=linkedProject.project.name;else return{error:"Unable to resolve project name for the dashboard URL.",reason:AGENT_REASON.NOT_LINKED};return{teamSlug,projectName}}async function get5(client,telemetry2){let parsedArgs,flagsSpecification=getFlagsSpecification(getSubcommand4.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let positional=parsedArgs.args.slice(1),requestId=positional[0]===getSubcommand4.name?positional[1]:positional[0],json=parsedArgs.flags["--json"],scopeFlag=parsedArgs.flags["--scope"],projectFlag=parsedArgs.flags["--project"],openFlag2=parsedArgs.flags["--open"],viewFlag=parsedArgs.flags["--view"];if(telemetry2.trackCliArgumentRequestId(requestId),telemetry2.trackCliFlagJson(json),telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliFlagOpen(openFlag2),telemetry2.trackCliOptionView(viewFlag),json&&openFlag2){let msg="`--json` and `--open` cannot be used together.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),1}if(viewFlag&&!openFlag2){let msg="`--view` can only be used with `--open`.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),1}let view;if(viewFlag!==void 0){if(!isView(viewFlag)){let msg=`\`--view\` must be one of: ${VIEW_OPTIONS.join(", ")}. Received: ${viewFlag}`;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),1}view=viewFlag}if(!requestId)return output_manager_default.print(help(getSubcommand4,{parent:tracesCommand,columns:client.stderr.columns})),2;let teamId,projectId,linkedProject;if(linkedProject=await getLinkedProject(client),linkedProject.status==="error")if(scopeFlag&&projectFlag)linkedProject={status:"not_linked",org:null,project:null};else return linkedProject.exitCode;let scope;try{scope=await resolveScope({client,flags:{scope:scopeFlag,project:projectFlag},linkedProject})}catch(err){return printError(err),1}if("message"in scope)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:scope.reason,message:scope.message}),output_manager_default.error(scope.message),1;teamId=scope.teamId,projectId=scope.projectId,output_manager_default.spinner("Fetching trace\u2026");let trace3,partial;try{({trace:trace3,partial}=await fetchTrace({client,teamId,projectId,requestId}))}catch(err){return output_manager_default.stopSpinner(),printError(err),1}if(output_manager_default.stopSpinner(),partial&&output_manager_default.warn("Trace is incomplete because it exceeded the span limit."),openFlag2){if(!linkedProject){let msg="Unable to resolve project link for the dashboard URL.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:msg}),output_manager_default.error(msg),1}let resolved=await resolveDashboardScope({client,scopeFlag,projectFlag,teamId,linkedProject});if("error"in resolved)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:resolved.reason,message:resolved.error}),output_manager_default.error(resolved.error),1;let url=buildDashboardUrl({teamSlug:resolved.teamSlug,projectName:resolved.projectName,traceId:trace3.traceId,view});return output_manager_default.log(`Opening ${url} in your browser...`),await(0,import_open20.default)(url),0}return json?(client.stdout.write(`${JSON.stringify(trace3,null,2)}
1376
- `),0):(client.stdout.write(renderMarkdown(trace3,{requestId})),output_manager_default.log("Run with --json for full trace data."),0)}var import_chalk309=__toESM(require_source(),1);import{z as z4}from"zod";var import_ms38=__toESM(require_ms(),1);import{z as z3}from"zod";var DEFAULT_LIMIT3=100,MAX_LIMIT3=1e3,SPAN_KINDS=["UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER"],MAX_RANGE_MS=30*24*60*60*1e3,isoDateTimeSchema=z3.iso.datetime({offset:!0}),timeInputSchema=z3.union([isoDateTimeSchema,z3.iso.date()]),TIME_FORMAT_HINT="Use a duration with units such as 100ms or 30m, an ISO timestamp, or YYYY-MM-DD at midnight UTC.";function parseTime(input,now){let value=input.trim();if(!value)return null;try{let duration=(0,import_ms38.default)(value);if(duration!==void 0&&(duration<=0||!/[a-z]/i.test(value))||duration===void 0&&!timeInputSchema.safeParse(value).success)return null;let date=new Date(duration===void 0?value:now-duration);return Number.isFinite(date.getTime())?date:null}catch{return null}}function buildFilter(flags,spanKind){let clauses=["NOT (service.name:vercel.* AND span.kind:1)"],query=flags["--query"];typeof query=="string"&&clauses.push(`(${query.trim()})`),spanKind!==void 0&&clauses.push(`span.kind:${spanKind}`),flags["--root"]&&clauses.push("span.isRoot:1");let filters=[["--environment","environment"],["--service","service.name"],["--name","span.name"],["--status","span.status.code"],["--deployment-id","deployment.id"],["--request-id","request.id"],["--trace-id","trace.id"],["--span-id","span.id"]];for(let[flag,dimension]of filters){let rawValue=flags[flag];if(typeof rawValue!="string")continue;let value=flag==="--status"?{error:"Error",ok:"Ok",unset:"Unset"}[rawValue]:rawValue.trim();clauses.push(`${dimension}:${JSON.stringify(value)}`)}return clauses.join(" AND ")}function trackSpanQueryOptions(flags,telemetry2){telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliOptionService(flags["--service"]),telemetry2.trackCliOptionName(flags["--name"]),telemetry2.trackCliOptionKind(flags["--kind"]),telemetry2.trackCliOptionStatus(flags["--status"]),telemetry2.trackCliOptionDeploymentId(flags["--deployment-id"]),telemetry2.trackCliOptionRequestId(flags["--request-id"]),telemetry2.trackCliOptionTraceId(flags["--trace-id"]),telemetry2.trackCliOptionSpanId(flags["--span-id"]),telemetry2.trackCliFlagRoot(flags["--root"]),telemetry2.trackCliOptionSince(flags["--since"]),telemetry2.trackCliOptionUntil(flags["--until"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionQuery(flags["--query"])}async function resolveSpanQuery(client,flags,telemetry2){let project=flags["--project"],environment=flags["--environment"]?.trim().toLowerCase(),status6=flags["--status"]?.trim().toLowerCase(),query=flags["--query"];if(trackSpanQueryOptions(flags,telemetry2),environment!==void 0&&!["production","preview"].includes(environment))return{exitCode:invalidArguments(client,"`--environment` must be one of: production, preview.")};if(status6!==void 0&&!["error","ok","unset"].includes(status6))return{exitCode:invalidArguments(client,"`--status` must be one of: error, ok, unset.")};for(let flag of["--service","--name","--deployment-id","--request-id","--trace-id","--span-id"])if(flags[flag]!==void 0&&flags[flag]?.trim()==="")return{exitCode:invalidArguments(client,`\`${flag}\` must not be empty.`)};if(query!==void 0&&query.trim()==="")return{exitCode:invalidArguments(client,"`--query` must not be empty.")};let spanKind;if(flags["--kind"]!==void 0){let value=flags["--kind"].trim().toUpperCase();if(spanKind=/^[0-5]$/.test(value)?Number(value):SPAN_KINDS.indexOf(value.replace(/^SPAN_KIND_/,"")),spanKind===-1)return{exitCode:invalidArguments(client,"`--kind` must be one of: UNSPECIFIED (0), INTERNAL (1), SERVER (2), CLIENT (3), PRODUCER (4), CONSUMER (5).")}}let limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:MAX_LIMIT3,defaultValue:DEFAULT_LIMIT3});if(!limitResult.valid)return{exitCode:invalidArguments(client,limitResult.message)};let now=Date.now(),start=parseTime(flags["--since"]??"1h",now),end=flags["--until"]!==void 0?parseTime(flags["--until"],now):new Date(now);if(!start)return{exitCode:invalidArguments(client,`Invalid time format for \`--since\`. ${TIME_FORMAT_HINT}`)};if(!end)return{exitCode:invalidArguments(client,`Invalid time format for \`--until\`. ${TIME_FORMAT_HINT}`)};if(start.getTime()>=end.getTime())return{exitCode:invalidArguments(client,"`--since` must be earlier than `--until`.")};if(end.getTime()-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"The requested time range must not exceed 30 days.")};if(now-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"`--since` must be within the last 30 days.")};let scope=await resolveConfigScope(client,{project});return"exitCode"in scope?scope:{scope:{ownerId:scope.teamId,projectIds:[scope.projectId]},timeRange:{start:start.toISOString(),end:end.toISOString()},filter:buildFilter({...flags,"--environment":environment,"--status":status6},spanKind),limit:limitResult.value}}function fetchSpanQuery(client,teamId,request2){let query=new URLSearchParams({teamId});return client.fetch(`/v1/observability/events?${query}`,{method:"POST",headers:{"x-vercel-observability-query-reason":"cli/traces-search"},body:request2,bailOn429:!0})}function handleSpanQueryError(client,err){if(isAPIError(err)){let issues=z3.array(z3.object({path:z3.string(),message:z3.string()})).safeParse(err.issues);if(issues.success&&issues.data.length>0){let details=issues.data.map(issue2=>`${issue2.path}: ${issue2.message}`).join(", ");err.serverMessage=`${err.serverMessage}: ${details}`,(err.status===400||err.status===422)&&issues.data.some(issue2=>issue2.path==="filter")&&(err.serverMessage+=". Filter error positions refer to the generated filter, including CLI-added clauses."),err.message=`${err.serverMessage} (${err.status})`}}return handleTracingApiError(client,err)}var select=["span","resource"],spanSchema=z4.object({span:z4.object({startTime:isoDateTimeSchema,traceId:z4.string(),id:z4.string(),parentSpanId:z4.string().nullable(),isRoot:z4.number(),traceState:z4.string(),name:z4.string(),kind:z4.string(),status:z4.object({code:z4.string(),message:z4.string()}),duration:z4.number(),attributes:z4.record(z4.string(),z4.unknown()),events:z4.array(z4.object({name:z4.string(),timestamp:isoDateTimeSchema,attributes:z4.record(z4.string(),z4.unknown())})).optional(),links:z4.array(z4.object({traceId:z4.string(),spanId:z4.string(),traceState:z4.string(),attributes:z4.record(z4.string(),z4.unknown())})).optional()}).passthrough(),resource:z4.object({attributes:z4.record(z4.string(),z4.unknown())})}),responseSchema=z4.object({events:z4.array(spanSchema),pagination:z4.object({hasMore:z4.boolean(),nextCursor:z4.string().nullable()}),meta:z4.record(z4.string(),z4.unknown())});function formatDuration3(durationMs){if(durationMs===0)return"0ms";if(durationMs<1e-6)return"<1ns";let units=[[1e-6,"ns"],[.001,"\u03BCs"],[1,"ms"],[1e3,"s"],[6e4,"m"],[36e5,"h"],[864e5,"d"]],index=units.length-1;for(;durationMs<units[index][0];)index--;let value=Number((durationMs/units[index][0]).toFixed(1));return index<units.length-1&&value>=Math.round(units[index+1][0]/units[index][0])&&(index++,value=Number((durationMs/units[index][0]).toFixed(1))),`${value}${units[index][1]}`}function cell(value){return value||"-"}function stringAttribute(attributes,key){let value=attributes[key];return typeof value=="string"?value:null}var spanColumns={"span.startTime":{header:"TIME",format:event=>new Date(event.span.startTime).toISOString()},"span.duration":{header:"DURATION",format:event=>formatDuration3(event.span.duration)},"span.name":{header:"SPAN NAME",format:event=>ellipsis(cell(event.span.name),60)},"span.status.code":{header:"STATUS",format:event=>event.span.status.code.toUpperCase()==="ERROR"?import_chalk309.default.red("ERROR"):cell(event.span.status.code.toUpperCase())},"service.name":{header:"SERVICE NAME",format:event=>{let serviceName=stringAttribute(event.resource.attributes,"service.name");return serviceName?.startsWith("vercel.")?`\u25B2 ${serviceName}`:cell(serviceName)}},environment:{header:"ENVIRONMENT",format:event=>cell(stringAttribute(event.resource.attributes,"deployment.environment.name"))},"request.id":{header:"REQUEST ID",format:event=>stringAttribute(event.span.attributes,"vercel.request_id")?.split("::").at(-1)||"-"},"trace.id":{header:"TRACE ID",format:event=>cell(event.span.traceId)},"span.id":{header:"SPAN ID",format:event=>cell(event.span.id)},"parent.id":{header:"PARENT ID",format:event=>cell(event.span.parentSpanId)},"span.kind":{header:"SPAN KIND",format:event=>SPAN_KINDS.find((kind,index)=>event.span.kind===String(index)||event.span.kind.toUpperCase()===kind)??cell(event.span.kind)}};function printSpans(client,spans,columns){if(spans.length===0){client.stdout.write(`No spans found for this period.
1385
+ `),0):(client.stdout.write(renderMarkdown(trace3,{requestId})),output_manager_default.log("Run with --json for full trace data."),0)}var import_chalk309=__toESM(require_source(),1);import{z as z4}from"zod";var import_ms38=__toESM(require_ms(),1);import{z as z3}from"zod";var DEFAULT_LIMIT3=100,MAX_LIMIT3=1e3,SPAN_KINDS=["UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER"],MAX_RANGE_MS=30*24*60*60*1e3,isoDateTimeSchema=z3.iso.datetime({offset:!0}),timeInputSchema=z3.union([isoDateTimeSchema,z3.iso.date()]),TIME_FORMAT_HINT="Use a duration with units such as 100ms or 30m, an ISO timestamp, or YYYY-MM-DD at midnight UTC.";function parseTime(input,now){let value=input.trim();if(!value)return null;try{let duration=(0,import_ms38.default)(value);if(duration!==void 0&&(duration<=0||!/[a-z]/i.test(value))||duration===void 0&&!timeInputSchema.safeParse(value).success)return null;let date=new Date(duration===void 0?value:now-duration);return Number.isFinite(date.getTime())?date:null}catch{return null}}function buildFilter(flags,spanKind){let clauses=["NOT (service.name:vercel.* AND span.kind:1)"],query=flags["--query"];typeof query=="string"&&clauses.push(`(${query.trim()})`),spanKind!==void 0&&clauses.push(`span.kind:${spanKind}`),flags["--root"]&&clauses.push("span.isRoot:1");let filters=[["--environment","environment"],["--service","service.name"],["--name","span.name"],["--status","span.status.code"],["--deployment-id","deployment.id"],["--request-id","request.id"],["--trace-id","trace.id"],["--span-id","span.id"]];for(let[flag,dimension]of filters){let rawValue=flags[flag];if(typeof rawValue!="string")continue;let value=flag==="--status"?{error:"Error",ok:"Ok",unset:"Unset"}[rawValue]:rawValue.trim();clauses.push(`${dimension}:${JSON.stringify(value)}`)}return clauses.join(" AND ")}function trackSpanQueryOptions(flags,telemetry2){telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliOptionService(flags["--service"]),telemetry2.trackCliOptionName(flags["--name"]),telemetry2.trackCliOptionKind(flags["--kind"]),telemetry2.trackCliOptionStatus(flags["--status"]),telemetry2.trackCliOptionDeploymentId(flags["--deployment-id"]),telemetry2.trackCliOptionRequestId(flags["--request-id"]),telemetry2.trackCliOptionTraceId(flags["--trace-id"]),telemetry2.trackCliOptionSpanId(flags["--span-id"]),telemetry2.trackCliFlagRoot(flags["--root"]),telemetry2.trackCliOptionSince(flags["--since"]),telemetry2.trackCliOptionUntil(flags["--until"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionQuery(flags["--query"])}async function resolveSpanQuery(client,flags,telemetry2){let project=flags["--project"],environment=flags["--environment"]?.trim().toLowerCase(),status6=flags["--status"]?.trim().toLowerCase(),query=flags["--query"];if(trackSpanQueryOptions(flags,telemetry2),environment!==void 0&&!["production","preview"].includes(environment))return{exitCode:invalidArguments(client,"`--environment` must be one of: production, preview.")};if(status6!==void 0&&!["error","ok","unset"].includes(status6))return{exitCode:invalidArguments(client,"`--status` must be one of: error, ok, unset.")};for(let flag of["--service","--name","--deployment-id","--request-id","--trace-id","--span-id"])if(flags[flag]!==void 0&&flags[flag]?.trim()==="")return{exitCode:invalidArguments(client,`\`${flag}\` must not be empty.`)};if(query!==void 0&&query.trim()==="")return{exitCode:invalidArguments(client,"`--query` must not be empty.")};let spanKind;if(flags["--kind"]!==void 0){let value=flags["--kind"].trim().toUpperCase();if(spanKind=/^[0-5]$/.test(value)?Number(value):SPAN_KINDS.indexOf(value.replace(/^SPAN_KIND_/,"")),spanKind===-1)return{exitCode:invalidArguments(client,"`--kind` must be one of: UNSPECIFIED (0), INTERNAL (1), SERVER (2), CLIENT (3), PRODUCER (4), CONSUMER (5).")}}let limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:MAX_LIMIT3,defaultValue:DEFAULT_LIMIT3});if(!limitResult.valid)return{exitCode:invalidArguments(client,limitResult.message)};let now=Date.now(),start=parseTime(flags["--since"]??"1h",now),end=flags["--until"]!==void 0?parseTime(flags["--until"],now):new Date(now);if(!start)return{exitCode:invalidArguments(client,`Invalid time format for \`--since\`. ${TIME_FORMAT_HINT}`)};if(!end)return{exitCode:invalidArguments(client,`Invalid time format for \`--until\`. ${TIME_FORMAT_HINT}`)};if(start.getTime()>=end.getTime())return{exitCode:invalidArguments(client,"`--since` must be earlier than `--until`.")};if(end.getTime()-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"The requested time range must not exceed 30 days.")};if(now-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"`--since` must be within the last 30 days.")};let scope=await resolveConfigScope(client,{project});return"exitCode"in scope?scope:{scope:{ownerId:scope.teamId,projectIds:[scope.projectId]},timeRange:{start:start.toISOString(),end:end.toISOString()},filter:buildFilter({...flags,"--environment":environment,"--status":status6},spanKind),limit:limitResult.value}}function fetchSpanQuery(client,teamId,request2){let query=new URLSearchParams({teamId});return client.fetch(`/v1/observability/events?${query}`,{method:"POST",headers:{"x-vercel-observability-query-reason":"cli/traces-search"},body:request2,bailOn429:!0})}function handleSpanQueryError(client,err){if(isAPIError(err)){let issues=z3.array(z3.object({path:z3.string(),message:z3.string()})).safeParse(err.issues);if(issues.success&&issues.data.length>0){let details=issues.data.map(issue2=>`${issue2.path}: ${issue2.message}`).join(", ");err.serverMessage=`${err.serverMessage}: ${details}`,(err.status===400||err.status===422)&&issues.data.some(issue2=>issue2.path==="filter")&&(err.serverMessage+=". Filter error positions refer to the generated filter, including CLI-added clauses."),err.message=`${err.serverMessage} (${err.status})`}}return handleTracingApiError(client,err)}var select=["span","resource"],spanSchema=z4.object({span:z4.object({startTime:isoDateTimeSchema,traceId:z4.string(),id:z4.string(),parentSpanId:z4.string().nullable(),isRoot:z4.number(),traceState:z4.string(),name:z4.string(),kind:z4.string(),status:z4.object({code:z4.string(),message:z4.string()}),duration:z4.number(),attributes:z4.record(z4.string(),z4.unknown()),events:z4.array(z4.object({name:z4.string(),timestamp:isoDateTimeSchema,attributes:z4.record(z4.string(),z4.unknown())})).optional(),links:z4.array(z4.object({traceId:z4.string(),spanId:z4.string(),traceState:z4.string(),attributes:z4.record(z4.string(),z4.unknown())})).optional()}).passthrough(),resource:z4.object({attributes:z4.record(z4.string(),z4.unknown())})}),responseSchema=z4.object({events:z4.array(spanSchema),pagination:z4.object({hasMore:z4.boolean(),nextCursor:z4.string().nullable()}),meta:z4.record(z4.string(),z4.unknown())});function formatDuration4(durationMs){if(durationMs===0)return"0ms";if(durationMs<1e-6)return"<1ns";let units=[[1e-6,"ns"],[.001,"\u03BCs"],[1,"ms"],[1e3,"s"],[6e4,"m"],[36e5,"h"],[864e5,"d"]],index=units.length-1;for(;durationMs<units[index][0];)index--;let value=Number((durationMs/units[index][0]).toFixed(1));return index<units.length-1&&value>=Math.round(units[index+1][0]/units[index][0])&&(index++,value=Number((durationMs/units[index][0]).toFixed(1))),`${value}${units[index][1]}`}function cell(value){return value||"-"}function stringAttribute(attributes,key){let value=attributes[key];return typeof value=="string"?value:null}var spanColumns={"span.startTime":{header:"TIME",format:event=>new Date(event.span.startTime).toISOString()},"span.duration":{header:"DURATION",format:event=>formatDuration4(event.span.duration)},"span.name":{header:"SPAN NAME",format:event=>ellipsis(cell(event.span.name),60)},"span.status.code":{header:"STATUS",format:event=>event.span.status.code.toUpperCase()==="ERROR"?import_chalk309.default.red("ERROR"):cell(event.span.status.code.toUpperCase())},"service.name":{header:"SERVICE NAME",format:event=>{let serviceName=stringAttribute(event.resource.attributes,"service.name");return serviceName?.startsWith("vercel.")?`\u25B2 ${serviceName}`:cell(serviceName)}},environment:{header:"ENVIRONMENT",format:event=>cell(stringAttribute(event.resource.attributes,"deployment.environment.name"))},"request.id":{header:"REQUEST ID",format:event=>stringAttribute(event.span.attributes,"vercel.request_id")?.split("::").at(-1)||"-"},"trace.id":{header:"TRACE ID",format:event=>cell(event.span.traceId)},"span.id":{header:"SPAN ID",format:event=>cell(event.span.id)},"parent.id":{header:"PARENT ID",format:event=>cell(event.span.parentSpanId)},"span.kind":{header:"SPAN KIND",format:event=>SPAN_KINDS.find((kind,index)=>event.span.kind===String(index)||event.span.kind.toUpperCase()===kind)??cell(event.span.kind)}};function printSpans(client,spans,columns){if(spans.length===0){client.stdout.write(`No spans found for this period.
1377
1386
  `);return}client.stdout.write(`${table([columns.map(column=>column.header),...spans.map(span=>columns.map(column=>column.format(span)))])}
1378
1387
  `)}async function search2(client,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(searchSubcommand3.options))}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{flags}=parsedArgs,json=!!(flags["--json"]||client.nonInteractive),columnsOption=flags["--columns"];if(telemetry2.trackCliOptionColumns(columnsOption),parsedArgs.args.slice(2).length>0)return trackSpanQueryOptions(flags,telemetry2),invalidArguments(client,`Unexpected argument: ${parsedArgs.args.slice(2)[0]}.`);let columns=Object.values(spanColumns).filter(column=>column!==spanColumns["span.kind"]&&column!==spanColumns["request.id"]&&column!==spanColumns.environment);if(columnsOption!==void 0){if(json)return invalidArguments(client,"`--columns` cannot be combined with `--json` or `--non-interactive`.");let names=columnsOption.split(",").map(name=>name.trim());if(names.some(name=>!Object.hasOwn(spanColumns,name)))return invalidArguments(client,`Invalid column selection. Available columns: ${Object.keys(spanColumns).join(", ")}.`);if(new Set(names).size!==names.length)return invalidArguments(client,"Columns cannot repeat. List each column once.");columns=names.map(name=>spanColumns[name])}let query=await resolveSpanQuery(client,flags,telemetry2);if("exitCode"in query)return query.exitCode;let request2={...query,event:"vercel.span",select,order:"desc"};json||output_manager_default.spinner("Searching spans\u2026");let rawResponse;try{rawResponse=await fetchSpanQuery(client,query.scope.ownerId,request2)}catch(err){return handleSpanQueryError(client,err)}finally{json||output_manager_default.stopSpinner()}let result=responseSchema.safeParse(rawResponse);if(!result.success)return handleTracingApiError(client,new Error("The Observability API returned an invalid span search response."));if(json)for(let span of result.data.events)client.stdout.write(`${JSON.stringify(span)}
1379
- `);else printSpans(client,result.data.events,columns);return result.data.pagination.hasMore&&output_manager_default.log("More spans matched. Narrow the query or increase --limit."),0}var COMMAND_CONFIG64={get:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG64),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-4FCRR7C5.js")).default(client,{args,needHelp,subcommandOriginal,telemetry:telemetry2});if(needHelp){telemetry2.trackCliFlagHelp("traces",subcommandOriginal);let subMetadata=typeof subcommand=="string"?SUBCOMMAND_METADATA[subcommand]:void 0;return output_manager_default.print(help(subMetadata??tracesCommand,{parent:subMetadata?tracesCommand:void 0,columns:client.stderr.columns})),0}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return subcommand===searchSubcommand3.name?(telemetry2.trackCliSubcommandSearch(subcommandOriginal||subcommand),search2(client,telemetry2)):get5(client,telemetry2)}var UpgradeTelemetryClient=class extends TelemetryClient{trackCliArgumentVersion(value){value&&this.trackCliArgument({arg:"version",value})}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagEnableAuto(enableAuto){enableAuto&&this.trackCliFlag("enable-auto")}trackCliFlagDisableAuto(disableAuto){disableAuto&&this.trackCliFlag("disable-auto")}trackCliFlagBypassMinReleaseAge(bypass){bypass&&this.trackCliFlag("bypass-min-release-age")}trackCliFlagDisableMinReleaseAgeBypass(disable6){disable6&&this.trackCliFlag("disable-min-release-age-bypass")}trackCliFlagEnableBinary(enableBinary){enableBinary&&this.trackCliFlag("enable-binary")}trackCliFlagDisableBinary(disableBinary){disableBinary&&this.trackCliFlag("disable-binary")}};function setUseNativeBinary(client,enabled){let config={...client.config,useNativeBinary:enabled};delete config.nativeBinaryAutoOptIn,writeToConfigFile(config),client.config=config}var import_semver=__toESM(require_semver(),1);async function upgrade(client){try{return await runUpgrade(client)}catch(error){return printError(error),1}}async function runUpgrade(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(upgradeCommand.options),telemetry2=new UpgradeTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("upgrade"),output_manager_default.print(help(upgradeCommand,{columns:client.stderr.columns})),0;let targetArg=parsedArgs.args[1],target=targetArg==="latest"?targetArg:targetArg?import_semver.default.valid(targetArg)??void 0:void 0;if(telemetry2.trackCliArgumentVersion(targetArg?targetArg==="latest"?"latest":target?"version":"invalid":void 0),parsedArgs.args.length>2)return output_manager_default.error(`Unexpected argument: "${parsedArgs.args[2]}".`),1;if(targetArg&&!target)return output_manager_default.error(`Invalid version: "${targetArg}". Use a major.minor.patch version or "latest".`),1;let dryRun=parsedArgs.flags["--dry-run"],enableAuto=parsedArgs.flags["--enable-auto"],disableAuto=parsedArgs.flags["--disable-auto"],bypassMinReleaseAge=parsedArgs.flags["--bypass-min-release-age"],disableMinReleaseAgeBypass=parsedArgs.flags["--disable-min-release-age-bypass"],enableBinary=parsedArgs.flags["--enable-binary"],disableBinary=parsedArgs.flags["--disable-binary"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagEnableAuto(enableAuto),telemetry2.trackCliFlagDisableAuto(disableAuto),telemetry2.trackCliFlagBypassMinReleaseAge(bypassMinReleaseAge),telemetry2.trackCliFlagDisableMinReleaseAgeBypass(disableMinReleaseAgeBypass),telemetry2.trackCliFlagEnableBinary(enableBinary),telemetry2.trackCliFlagDisableBinary(disableBinary),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),enableAuto&&disableAuto)return output_manager_default.error("Cannot use --enable-auto and --disable-auto together"),1;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),1;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),1;let hasSettingsOnlyFlag=!!(disableMinReleaseAgeBypass||enableBinary||disableBinary||enableAuto||disableAuto);if(target&&hasSettingsOnlyFlag)return output_manager_default.error("Can't use a version with settings-only upgrade flags."),1;if(dryRun||asJson){let requestedPreference;disableMinReleaseAgeBypass?requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!1}:enableBinary||disableBinary?requestedPreference={name:"useNativeBinary",label:"native Vercel CLI binary",enabled:!!enableBinary}:enableAuto||disableAuto?requestedPreference={name:"autoUpdatesEnabled",label:"automatic CLI updates",enabled:!!enableAuto}:bypassMinReleaseAge&&(requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!0});let detectedUpdateCommand=hasSettingsOnlyFlag?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,global=await isGlobal();if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType:global?"global":"local",...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1388
+ `);else printSpans(client,result.data.events,columns);return result.data.pagination.hasMore&&output_manager_default.log("More spans matched. Narrow the query or increase --limit."),0}var COMMAND_CONFIG64={get:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG64),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-5Q37O5JW.js")).default(client,{args,needHelp,subcommandOriginal,telemetry:telemetry2});if(needHelp){telemetry2.trackCliFlagHelp("traces",subcommandOriginal);let subMetadata=typeof subcommand=="string"?SUBCOMMAND_METADATA[subcommand]:void 0;return output_manager_default.print(help(subMetadata??tracesCommand,{parent:subMetadata?tracesCommand:void 0,columns:client.stderr.columns})),0}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return subcommand===searchSubcommand3.name?(telemetry2.trackCliSubcommandSearch(subcommandOriginal||subcommand),search2(client,telemetry2)):get5(client,telemetry2)}var UpgradeTelemetryClient=class extends TelemetryClient{trackCliArgumentVersion(value){value&&this.trackCliArgument({arg:"version",value})}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagEnableAuto(enableAuto){enableAuto&&this.trackCliFlag("enable-auto")}trackCliFlagDisableAuto(disableAuto){disableAuto&&this.trackCliFlag("disable-auto")}trackCliFlagBypassMinReleaseAge(bypass){bypass&&this.trackCliFlag("bypass-min-release-age")}trackCliFlagDisableMinReleaseAgeBypass(disable6){disable6&&this.trackCliFlag("disable-min-release-age-bypass")}trackCliFlagEnableBinary(enableBinary){enableBinary&&this.trackCliFlag("enable-binary")}trackCliFlagDisableBinary(disableBinary){disableBinary&&this.trackCliFlag("disable-binary")}};function setUseNativeBinary(client,enabled){let config={...client.config,useNativeBinary:enabled};delete config.nativeBinaryAutoOptIn,writeToConfigFile(config),client.config=config}var import_semver=__toESM(require_semver(),1);async function 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:
1389
+ ${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:
1390
+ ${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),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("upgrade"),output_manager_default.print(help(upgradeCommand,{columns:client.stderr.columns})),0;let targetArg=parsedArgs.args[1],target=targetArg==="latest"?targetArg:targetArg?import_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),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagEnableAuto(enableAuto),telemetry2.trackCliFlagDisableAuto(disableAuto),telemetry2.trackCliFlagBypassMinReleaseAge(bypassMinReleaseAge),telemetry2.trackCliFlagDisableMinReleaseAgeBypass(disableMinReleaseAgeBypass),telemetry2.trackCliFlagEnableBinary(enableBinary),telemetry2.trackCliFlagDisableBinary(disableBinary),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),enableAuto&&disableAuto)return output_manager_default.error("Cannot use --enable-auto and --disable-auto together"),1;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),1;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),1;let hasSettingsOnlyFlag=!!(disableMinReleaseAgeBypass||enableBinary||disableBinary||enableAuto||disableAuto);if(target&&hasSettingsOnlyFlag)return output_manager_default.error("Can't use a version with settings-only upgrade flags."),1;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)}
1380
1391
  `)}else output_manager_default.print(`Current version: ${pkg_default.version}
1381
- `),output_manager_default.print(`Installation type: ${global?"global":"local"}
1392
+ `),output_manager_default.print(`Installation type: ${installationType}
1382
1393
  `),updateCommand&&output_manager_default.print(`Upgrade command: ${updateCommand}
1383
1394
  `),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
1384
1395
  `),requestedPreference&&output_manager_default.print(`Would ${requestedPreference.enabled?"enable":"disable"} ${requestedPreference.label}. No settings changed.
1385
- `);return 0}if(disableMinReleaseAgeBypass)return setMinReleaseAgeBypass(client,!1),output_manager_default.success("Minimum release-age bypass disabled."),0;if(enableBinary||disableBinary){if(disableBinary&&isNativeBinaryInstall())return output_manager_default.fatal("Can't use `--disable-binary` from the native CLI.\nThis flag only opts the Node.js CLI out of launching the native binary. Install the Node.js CLI with `npm i -g vercel`."),1;let enabled=!!enableBinary;return setUseNativeBinary(client,enabled),output_manager_default.success(`Native Vercel CLI binary ${enabled?"enabled":"disabled"}.`),0}if(enableAuto||disableAuto){let enabled=!!enableAuto;return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return executeUpgrade(target,client,bypassMinReleaseAge,!!target)}var import_chalk312=__toESM(require_source(),1);async function status5(client){let context=await getVersionContext();if(output_manager_default.print(`Version: ${context.version}
1396
+ `);return 0}if(disableMinReleaseAgeBypass)return setMinReleaseAgeBypass(client,!1),output_manager_default.success("Minimum release-age bypass disabled."),0;if(enableBinary||disableBinary){if(disableBinary&&isNativeBinaryInstall())return output_manager_default.fatal("Can't use `--disable-binary` from the native CLI.\nThis flag only opts the Node.js CLI out of launching the native binary. Install the Node.js CLI with `npm i -g vercel`."),1;let enabled=!!enableBinary;return setUseNativeBinary(client,enabled),output_manager_default.success(`Native Vercel CLI binary ${enabled?"enabled":"disabled"}.`),0}if(enableAuto||disableAuto){let enabled=!!enableAuto;return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return installerManaged?installProductionRelease({version:target,skipIfCurrent:!target}):executeUpgrade(target,client,bypassMinReleaseAge,!!target)}var import_chalk312=__toESM(require_source(),1);async function status5(client){let context=await getVersionContext();if(output_manager_default.print(`Version: ${context.version}
1386
1397
  `),output_manager_default.print(`Runtime: ${describeRuntime(context)}
1387
1398
  `),output_manager_default.print(`Managed by: ${describeManager(context)}
1388
1399
  `),context.manager==="installer"){if(output_manager_default.print(`Track: ${context.track??"legacy"}
@@ -1400,10 +1411,9 @@ Learn more: ${import_chalk307.default.cyan("https://vercel.com/docs/cli/about-te
1400
1411
  `)}return versions2.length>shown.length&&output_manager_default.print(import_chalk310.default.dim(`\u2026 and ${versions2.length-shown.length} more
1401
1412
  `)),0}var import_chalk311=__toESM(require_source(),1);async function installed(){let context=await getVersionContext();if(context.manager!=="installer"){let manager=context.packageManager===void 0?"an unsupported package-manager installation":context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;return output_manager_default.print(`${context.version} ${import_chalk311.default.dim("(current)")}
1402
1413
  `),output_manager_default.log(`This CLI is managed by ${manager}, so only the current version is available. The recommended way to manage CLI versions is the installer: ${CURL_INSTALL_COMMAND}`),0}let slots=await listNativeTrackSlots(context.installRoot);if(slots.length===0)return output_manager_default.log("No slot-managed versions found"),0;for(let installed2 of slots){let active=installed2.track===context.track&&installed2.slot===context.slot,build=installed2.pr?`PR #${installed2.pr}${installed2.buildSha?` (${installed2.buildSha.slice(0,12)})`:""}`:`v${installed2.version}`;output_manager_default.print(`${installed2.track}/${installed2.slot} ${build}${active?` ${import_chalk311.default.dim("(active)")}`:""}
1403
- `)}return 0}var import_semver2=__toESM(require_semver(),1);function printInstallerOnlyError(context,version2){if(output_manager_default.error("Switching versions is only supported for installer-managed CLIs."),output_manager_default.log(`Install the CLI with the installer first: ${CURL_INSTALL_COMMAND}`),version2&&context.manager==="package-manager"){let manager=context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;output_manager_default.log(`Or install this version with ${manager}: ${getPackageManagerInstallCommand(context,version2)}`)}}async function use(args){let target=args[0];if(!target)return output_manager_default.error(`Missing version. Usage: ${getCommandName("version use <version>")}`),1;let context=await getVersionContext();if(context.manager==="package-manager"&&context.upgradeCommand===void 0)return output_manager_default.fatal(context.upgradeError.message),1;if(target==="latest")return context.canSwitchVersions?executeNativeSelfUpdate():(printInstallerOnlyError(context),1);let pr=parsePrTarget(target);if(pr!==void 0){if(!context.canSwitchVersions)return printInstallerOnlyError(context),1;try{let{updated,buildSha,slot}=await installAndActivatePrBinary(pr);return output_manager_default.stopSpinner(),updated?output_manager_default.success(`Activated the Vercel CLI build for PR #${pr} (${buildSha.slice(0,12)}) on pr/${slot}.`):output_manager_default.log(`The latest build for PR #${pr} (${buildSha.slice(0,12)}) is active on pr/${slot}.`),output_manager_default.log("PR builds change on every push \u2014 re-run this command to pick up new builds."),output_manager_default.log(`Return to a release build with ${getCommandName("version use latest")}.`),0}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(error instanceof Error?error.message:String(error)),1}}let version2=import_semver2.default.valid(import_semver2.default.coerce(target)?.version??target)?import_semver2.default.coerce(target)?.version??target:void 0;if(!version2||!import_semver2.default.valid(version2))return output_manager_default.error(`Invalid version: "${target}"`),1;if(!context.canSwitchVersions)return printInstallerOnlyError(context,version2),1;try{if(!(await listAvailableVersions(packageName)).includes(version2))return output_manager_default.error(`Version ${version2} does not exist.`),output_manager_default.log(`Run ${getCommandName("version list")} to see available versions.`),1}catch{}try{return await installAndActivateProductionVersion(version2),output_manager_default.stopSpinner(),output_manager_default.success(`Vercel CLI v${version2} is active`),import_semver2.default.lt(version2,context.version)&&output_manager_default.warn(`Older CLI versions can replace the installer-managed links when running version commands. If that happens, restore the bounded slot layout with:
1404
- ${CURL_INSTALL_COMMAND}`),0}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to switch to v${version2}: ${error instanceof Error?error.message:String(error)}`),1}}async function autoupdate(client,args){let action=args[0];if(!action||action==="status"){let enabled=(await getVersionContext()).manager==="installer"?isNativeAutoUpdateEnabled(client.config):isAutoUpdateEnabled(client.config);return output_manager_default.print(`Automatic updates are ${enabled?"enabled":"disabled"}
1405
- `),0}if(action==="enable"||action==="disable"){let enabled=action==="enable";return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return output_manager_default.error(`Invalid argument "${action}". Usage: ${getCommandName("version autoupdate [enable|disable|status]")}`),1}var import_semver3=__toESM(require_semver(),1);import{performance}from"node:perf_hooks";var VersionTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInstalled(actual){this.trackCliSubcommand({subcommand:"installed",value:actual})}trackCliSubcommandUse(actual){this.trackCliSubcommand({subcommand:"use",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandAutoupdate(actual){this.trackCliSubcommand({subcommand:"autoupdate",value:actual})}trackNativeUpdate(event){this.trackCommandOutput({key:"native-update",value:JSON.stringify(event)})}};var NATIVE_UPDATE_CHILD_TIMEOUT_MS=2*60*1e3;async function check3(client,{timeoutMs=NATIVE_UPDATE_CHILD_TIMEOUT_MS}={}){let context=await getVersionContext();if(context.manager!=="installer")return isNativeUpdateChild()?0:(output_manager_default.fatal("Native update checks require an installer-managed CLI."),1);if(isNativeUpdateChild()){let cachedVersion=process.env[NATIVE_UPDATE_VERSION_ENV],source=cachedVersion?"cached":"discovery",controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),startedAt=performance.now(),discoveryMs,stagingMs,outcome="failure";try{let version2=cachedVersion;if(!version2){await cacheNativeUpdateDiscoveryAttempt();let discoveryStartedAt=performance.now();try{version2=await resolveLatestNativeVersion({signal:controller.signal})}finally{discoveryMs=Math.round(performance.now()-discoveryStartedAt)}await cacheNativeUpdateVersion(version2),controller.signal.throwIfAborted()}let selectProduction=process.env[NATIVE_UPDATE_SELECT_PRODUCTION_ENV]==="1";controller.signal.throwIfAborted();let stagingStartedAt=performance.now();try{await stageProductionUpdate(version2,selectProduction,{signal:controller.signal})}finally{stagingMs=Math.round(performance.now()-stagingStartedAt)}return await markNativeUpdateStaged(version2,{selectedProduction:selectProduction}),controller.signal.aborted?(outcome="timeout",1):(outcome="success",0)}catch{if(controller.signal.aborted&&(outcome="timeout"),!cachedVersion)try{await restoreNativeUpdateAfterDiscoveryFailure()}catch{}return 1}finally{clearTimeout(timeout),new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}).trackNativeUpdate({outcome,source,totalMs:Math.round(performance.now()-startedAt),discoveryMs,stagingMs})}}try{output_manager_default.spinner("Resolving latest native version\u2026",0);let latest=await resolveLatestNativeVersion();return output_manager_default.stopSpinner(),output_manager_default.print(`Latest production version: ${latest}
1406
- `),context.track==="production"&&context.activeVersion&&import_semver3.default.valid(context.activeVersion)&&import_semver3.default.gte(context.activeVersion,latest)?(await cacheNativeUpdateVersion(latest),await markNativeUpdateStaged(latest,{selectedProduction:!0}),output_manager_default.print(`Production is already up to date.
1414
+ `)}return 0}var import_semver3=__toESM(require_semver(),1);function printInstallerOnlyError(context,version2){if(output_manager_default.error("Switching versions is only supported for installer-managed CLIs."),output_manager_default.log(`Install the CLI with the installer first: ${CURL_INSTALL_COMMAND}`),version2&&context.manager==="package-manager"){let manager=context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;output_manager_default.log(`Or install this version with ${manager}: ${getPackageManagerInstallCommand(context,version2)}`)}}async function use(args){let target=args[0];if(!target)return output_manager_default.error(`Missing version. Usage: ${getCommandName("version use <version>")}`),1;let context=await getVersionContext();if(context.manager==="package-manager"&&context.upgradeCommand===void 0)return output_manager_default.fatal(context.upgradeError.message),1;if(target==="latest")return context.canSwitchVersions?installProductionRelease({currentVersion:context.version,track:context.track}):(printInstallerOnlyError(context),1);let pr=parsePrTarget(target);if(pr!==void 0){if(!context.canSwitchVersions)return printInstallerOnlyError(context),1;try{let{updated,buildSha,slot}=await installAndActivatePrBinary(pr);return output_manager_default.stopSpinner(),updated?output_manager_default.success(`Activated the Vercel CLI build for PR #${pr} (${buildSha.slice(0,12)}) on pr/${slot}.`):output_manager_default.log(`The latest build for PR #${pr} (${buildSha.slice(0,12)}) is active on pr/${slot}.`),output_manager_default.log("PR builds change on every push \u2014 re-run this command to pick up new builds."),output_manager_default.log(`Return to a release build with ${getCommandName("version use latest")}.`),0}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(error instanceof Error?error.message:String(error)),1}}let version2=import_semver3.default.valid(import_semver3.default.coerce(target)?.version??target)?import_semver3.default.coerce(target)?.version??target:void 0;return!version2||!import_semver3.default.valid(version2)?(output_manager_default.error(`Invalid version: "${target}"`),1):context.canSwitchVersions?installProductionRelease({version:version2,currentVersion:context.version,track:context.track}):(printInstallerOnlyError(context,version2),1)}async function autoupdate(client,args){let action=args[0];if(!action||action==="status"){let enabled=(await getVersionContext()).manager==="installer"?isNativeAutoUpdateEnabled(client.config):isAutoUpdateEnabled(client.config);return output_manager_default.print(`Automatic updates are ${enabled?"enabled":"disabled"}
1415
+ `),0}if(action==="enable"||action==="disable"){let enabled=action==="enable";return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return output_manager_default.error(`Invalid argument "${action}". Usage: ${getCommandName("version autoupdate [enable|disable|status]")}`),1}var import_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}
1416
+ `),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.
1407
1417
  `),0):(await cacheNativeUpdateVersion(latest,{selectProduction:!0}),spawnNativeUpdateChild(latest,!0),output_manager_default.print(`Production update started in the background.
1408
1418
  `),0)}catch(error){return output_manager_default.stopSpinner(),output_manager_default.fatal(`Failed to check for updates: ${error instanceof Error?error.message:String(error)}`),1}}var COMMAND_CONFIG65={list:getCommandAliases(listSubcommand26),installed:getCommandAliases(installedSubcommand),use:getCommandAliases(useSubcommand),update:getCommandAliases(updateSubcommand11),check:getCommandAliases(checkSubcommand3),autoupdate:getCommandAliases(autoupdateSubcommand)};async function version(client){let telemetry2=new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(versionCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG65),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:versionCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("version",subcommand),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand26),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list29());case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),2):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),2):(telemetry2.trackCliSubcommandUse(subcommandOriginal),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand11),2):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand3),2):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),2):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk312.default.red("Error")}: Invalid subcommand. See help instructions for usage:
1409
1419
  `),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk317=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{trackCliOptionFrom(from){from&&this.trackCliOption({option:"from",value:this.redactedValue})}trackCliOptionTo(to){to&&this.trackCliOption({option:"to",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionBreakdown(breakdown){breakdown&&this.trackCliOption({option:"breakdown",value:breakdown})}trackCliOptionGroupBy(groupBy){groupBy&&this.trackCliOption({option:"group-by",value:groupBy})}};var import_error_utils25=__toESM(require_dist(),1);import{DateTime}from"luxon";var LA_TIMEZONE="America/Los_Angeles";function toISOOrThrow(dt){if(!dt.isValid)throw new Error(`Invalid DateTime: ${dt.invalidReason}`);let iso=dt.toISO();if(!iso)throw new Error("Failed to convert DateTime to ISO");return iso}function getDefaultFromDateTime(){return DateTime.now().setZone(LA_TIMEZONE).startOf("month")}function getDefaultToDateTime(){return DateTime.utc()}function getDefaultFromDate(){let dt=getDefaultFromDateTime();return toISOOrThrow(dt.toUTC())}function getDefaultToDate(){let dt=getDefaultToDateTime();return toISOOrThrow(dt.toUTC())}function parseBillingDate(dateStr,isEndDate=!1){if(dateStr.includes("T")){if(!DateTime.fromISO(dateStr).isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss)`);return dateStr}let laDateTime=DateTime.fromISO(dateStr,{zone:LA_TIMEZONE}).startOf("day");if(!laDateTime.isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD)`);let finalDateTime=isEndDate?laDateTime.plus({days:1}):laDateTime;return toISOOrThrow(finalDateTime.toUTC())}function getISOWeekNumber(dateStr){let date=new Date(dateStr);date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7));let yearStart=new Date(Date.UTC(date.getUTCFullYear(),0,1));return Math.ceil(((date.getTime()-yearStart.getTime())/864e5+1)/7)}function getISOWeekYear(dateStr){let date=new Date(dateStr);return date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7)),date.getUTCFullYear()}function getPeriodKey(chargePeriodStart,breakdownPeriod){if(!chargePeriodStart)return"Unknown";switch(breakdownPeriod){case"daily":return chargePeriodStart.substring(0,10);case"weekly":{let weekYear=getISOWeekYear(chargePeriodStart),weekNum=getISOWeekNumber(chargePeriodStart);return`${weekYear}-W${weekNum.toString().padStart(2,"0")}`}case"monthly":return chargePeriodStart.substring(0,7);default:return chargePeriodStart.substring(0,10)}}var VALID_BREAKDOWN_PERIODS=["daily","weekly","monthly"];function isValidBreakdownPeriod(value){return value!==void 0&&VALID_BREAKDOWN_PERIODS.includes(value)}var VALID_GROUP_BY_DIMENSIONS=["project","region"];function isValidGroupByDimension(value){return value!==void 0&&VALID_GROUP_BY_DIMENSIONS.includes(value)}var import_chalk314=__toESM(require_source(),1);function formatUsageAmount(amount,unit){if(unit==="managed_infrastructure_units")return formatUsageQuantity(amount,"MIUs",{showSmallValues:!0});let formattedAmount=amount.toFixed(2);return amount!==0&&Number(formattedAmount)===0?amount>0?"<$0.01":">-$0.01":`$${formattedAmount}`}function formatUsageQuantity(quantity,unit="",options={}){let displayUnit=quantity===1&&options.singularUnit?options.singularUnit:unit;if(options.unitKind==="digitalStorage")return formatStorageQuantity(quantity,unit,options.showSmallValues);let formatter=new Intl.NumberFormat("en-US",{maximumFractionDigits:2,notation:options.compact&&Math.abs(quantity)>=1e3?"compact":"standard"}),formattedQuantity=formatter.format(quantity),roundsToZero=formatter.format(Math.abs(quantity))===formatter.format(0),displayQuantity=options.showSmallValues&&quantity!==0&&roundsToZero?quantity>0?`<${formatter.format(.01)}`:`>${formatter.format(-.01)}`:formattedQuantity;return displayUnit?`${displayQuantity} ${displayUnit}`:displayQuantity}function formatStorageQuantity(quantity,unit,showSmallValues=!1){let units=["byte","kilobyte","megabyte","gigabyte","terabyte"],symbols=["B","KB","MB","GB","TB"],startIndex=units.indexOf(unit.toLowerCase());if(startIndex===-1)return formatUsageQuantity(quantity,unit,{showSmallValues});let value=quantity,unitIndex=startIndex;for(;Math.abs(value)>=1e3&&unitIndex<symbols.length-1;)value/=1e3,unitIndex++;return formatUsageQuantity(value,symbols[unitIndex],{showSmallValues})}var import_chalk313=__toESM(require_source(),1);import{DateTime as DateTime2}from"luxon";function formatServiceName(name,service){return service.included?`${name} (Flat Rate CDN)`:name}function formatServiceCost(service,costUnit){return service.included?"Included":formatUsageAmount(service.cost,costUnit)}function isEmptyService(service){return(service.category==="subscription"||service.quantity===0)&&service.cost===0}function visibleServices(services){return[...services.values()].filter(service=>!isEmptyService(service)).map(service=>[service.name,service])}function outputUsageHeader(data,title6,elapsedSuffix){let{log}=output_manager_default;log(`${title6} for ${data.contextType} ${import_chalk313.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk313.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk313.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk313.default.gray(`Accrued through ${formatDate4(data.usageThrough)} in ${data.costUnit==="managed_infrastructure_units"?"MIUs":"USD"}, before credits and discounts.`)),log("")}function outputHiddenServicesHint(hiddenCount){hiddenCount<=0||output_manager_default.log(import_chalk313.default.gray(`${hiddenCount} ${hiddenCount===1?"service":"services"} with no usage hidden. Add --json to include ${hiddenCount===1?"it":"them"}.`))}function formatRange(from,to){let start=parseDate(from),end=parseDate(to);if(!start||!end)return`${from} to ${to}`;let sameYear=start.year===end.year;return`${start.toFormat(sameYear?"LLL d":"LLL d, yyyy")}\u2013${end.toFormat("LLL d, yyyy")}`}function formatDate4(value){return parseDate(value)?.toFormat("LLL d, yyyy")??value}function parseDate(value){let date=DateTime2.fromISO(value,{zone:"utc"});return date.isValid?date:null}function outputAggregated({data,startTime}){let{print,log}=output_manager_default;if(outputUsageHeader(data,"Usage",elapsed(Date.now()-startTime)),data.creditBalance){log(import_chalk314.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk314.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk314.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk314.default.gray("Remaining")} ${formatCredit(data.creditBalance.remaining,data.creditBalance.currency)}`);let progress=data.creditBalance.allocated>0?data.creditBalance.used/data.creditBalance.allocated*100:0;log(` ${import_chalk314.default.gray("Progress")} ${Math.round(progress)}%`),log("")}let allServices=[...data.services.entries()],sortedServices=visibleServices(data.services).sort((a,b)=>b[1].cost-a[1].cost);if(sortedServices.length===0){log("No usage data found for this period."),outputHiddenServicesHint(allServices.length);return}let usage2=sortedServices.filter(([,service])=>service.category==="usage"),subscriptions=sortedServices.filter(([,service])=>service.category==="subscription");usage2.length>0&&(log(import_chalk314.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk314.default.bold("Subscription licenses")),printTable(print,subscriptions,"Subscriptions subtotal",data.costUnit),log("")),printCostSummary(print,usage2,subscriptions,data.costUnit),outputHiddenServicesHint(allServices.length-sortedServices.length)}function formatCadence(cadence){return cadence.split("_").map(word=>word[0].toUpperCase()+word.slice(1)).join(" ")}function formatCredit(amount,currency){return formatUsageAmount(amount,currency)}function printCostSummary(print,usage2,subscriptions,costUnit){let subscriptionCost=sumCost(subscriptions),infrastructureCost=sumCost(usage2),rows=[["Subscriptions",formatUsageAmount(subscriptionCost,costUnit)],["Infrastructure usage",formatUsageAmount(infrastructureCost,costUnit)],[import_chalk314.default.bold("Estimated total"),import_chalk314.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
@@ -1412,7 +1422,7 @@ ${tablePrint}
1412
1422
  `)}var import_chalk315=__toESM(require_source(),1);function getPeriodLabel(period){switch(period){case"daily":return"Daily";case"weekly":return"Weekly";case"monthly":return"Monthly"}}function outputBreakdown({data,breakdownPeriod,startTime}){let{print,log}=output_manager_default,periodLabel=getPeriodLabel(breakdownPeriod);outputUsageHeader(data,`${periodLabel} usage`,elapsed(Date.now()-startTime));let sortedPeriods=[...data.periodUsage.keys()].sort();if(sortedPeriods.length===0){log("No usage data found for this period.");return}let hiddenCount=0;for(let periodKey of sortedPeriods){let periodData=data.periodUsage.get(periodKey),allServices=[...periodData.services.entries()],sortedServices=visibleServices(periodData.services).sort((a,b)=>b[1].cost-a[1].cost);if(hiddenCount+=allServices.length-sortedServices.length,sortedServices.length===0)continue;log(`${import_chalk315.default.bold(import_chalk315.default.cyan(periodKey))} (${formatUsageAmount(periodData.totalCost,data.costUnit)})`);let rows=sortedServices.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:!0,singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,data.costUnit)]),tablePrint=table([["Service","Usage","Cost"].map(header=>import_chalk315.default.bold(import_chalk315.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1413
1423
  `)}outputHiddenServicesHint(hiddenCount)}var import_chalk316=__toESM(require_source(),1);function getDimensionLabel(dimension){return dimension==="project"?"Project":"Region"}function outputGroupBy({data,groupByDimension,startTime}){let{print,log}=output_manager_default,dimensionLabel=getDimensionLabel(groupByDimension);outputUsageHeader(data,`Usage by ${dimensionLabel}`,elapsed(Date.now()-startTime));let sortedGroups=[...data.groupByUsage.entries()].sort((a,b)=>b[1].totalCost-a[1].totalCost);if(sortedGroups.length===0){log("No usage data found for this period.");return}let hiddenCount=0;for(let[groupName,groupData]of sortedGroups){let allServices=[...groupData.services.entries()],services=visibleServices(groupData.services).sort((a,b)=>b[1].cost-a[1].cost);if(hiddenCount+=allServices.length-services.length,services.length===0)continue;log(`${import_chalk316.default.bold(import_chalk316.default.cyan(groupName))} (${formatUsageAmount(groupData.totalCost,data.costUnit)})`);let rows=services.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:!0,singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,data.costUnit)]),tablePrint=table([["Service","Usage","Cost"].map(header=>import_chalk316.default.bold(import_chalk316.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
1414
1424
  `)}log(""),log(`${import_chalk316.default.gray("Estimated total:")} ${import_chalk316.default.bold(formatUsageAmount(data.totalCost,data.costUnit))}`),outputHiddenServicesHint(hiddenCount)}function serializeService(service){return{name:service.name,product:service.product,quantity:service.quantity,unit:service.unit,cost:service.cost,included:service.included,category:service.category}}function outputJson9(client,{data,fromDate,toDate,breakdownPeriod,groupByDimension}){let sortedServices=[...data.services.entries()].sort((a,b)=>b[1].cost-a[1].cost),jsonOutput={period:{from:fromDate,to:toDate},context:data.contextName,costUnit:data.costUnit};data.creditBalance&&(jsonOutput.creditBalance=data.creditBalance),breakdownPeriod&&(jsonOutput.breakdown={period:breakdownPeriod,data:[...data.periodUsage.keys()].sort().map(periodKey=>{let period=data.periodUsage.get(periodKey);return{periodKey,services:[...period.services.entries()].sort((a,b)=>b[1].cost-a[1].cost).map(([,service])=>serializeService(service)),totals:{cost:period.totalCost}}})}),groupByDimension&&(jsonOutput.groupBy={dimension:groupByDimension,data:[...data.groupByUsage.entries()].sort((a,b)=>b[1].totalCost-a[1].totalCost).map(([name,group])=>({name,services:[...group.services.entries()].sort((a,b)=>b[1].cost-a[1].cost).map(([,service])=>serializeService(service)),totals:{cost:group.totalCost}}))}),jsonOutput.services=sortedServices.map(([,service])=>serializeService(service)),jsonOutput.totals={cost:data.totalCost},client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1415
- `)}var GROSS_COST_METRIC="gross_cost",SUMMARY_VIEW="byProduct",DETAIL_VIEW="byProductRegionProject";function getCostViews(groupByDimension){let views={};return groupByDimension&&(views[DETAIL_VIEW]={groupBy:["product","region","project"]}),views[SUMMARY_VIEW]={groupBy:["product"]},{views,summaryViewName:SUMMARY_VIEW,detailViewName:groupByDimension?DETAIL_VIEW:void 0}}async function usage(client){let{print,error,debug,spinner}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("usage"),print(help(usageCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),1;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(!!fromFlag!=!!toFlag)return error("Both --from and --to must be specified or neither for the current billing cycle"),1;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),1;let breakdownPeriod=breakdownFlag,groupByFlag=parsedArgs.flags["--group-by"];if(groupByFlag&&!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),1;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),1;telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.trackCliOptionGroupBy(groupByFlag);let contextName,contextType,teamId,billingPeriod,hasPrecommitment=!1;try{let scope=await getScope(client),owner=scope.team??scope.user;contextName=scope.contextName,contextType=scope.team?"team":"personal account",teamId=scope.team?.id;let billing=owner?.billing;billingPeriod=billing?.subscriptions?.find(subscription=>subscription.frequency.interval==="month"&&subscription.frequency.intervalCount===1)?.period??billing?.period,hasPrecommitment=billing?.plan==="enterprise"||billing?.planIteration==="plus"||billing?.plan==="pro"&&billing?.planIteration==="flex"}catch(err){if((0,import_error_utils25.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!fromFlag&&!toFlag,fromDate,toDate;try{fromDate=fromFlag?parseBillingDate(fromFlag,!1):billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate(),toDate=toFlag?parseBillingDate(toFlag,!0):billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()}catch(err){return error(err.message),1}let fromDisplay=fromFlag??extractDatePortion(fromDate),toDisplay=toFlag??extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk317.default.bold(contextName)}`);try{let query=new URLSearchParams;teamId&&query.set("teamId",teamId);let viewPlan=getCostViews(groupByDimension),queryString=query.toString(),costsRequest=client.fetch(`/v2/billing/costs${queryString?`?${queryString}`:""}`,{method:"POST",body:{from:fromDate,to:toDate,metrics:[GROSS_COST_METRIC,"quantity"],format:"timeseries",views:viewPlan.views,userAgent:"vercel-cli.usage"},useCurrentTeam:!1}),commitmentRequest=usingDefaults&&teamId&&hasPrecommitment?client.fetch(`/v1/invoices/pre-commitment-usage?teamId=${encodeURIComponent(teamId)}`,{useCurrentTeam:!1}).catch(err=>(debug(`Unable to fetch infrastructure credit: ${String(err)}`),null)):Promise.resolve(null),[response,commitmentUsage]=await Promise.all([costsRequest,commitmentRequest]),usageData=processCosts(response,{summaryView:response.results.views[viewPlan.summaryViewName],detailView:viewPlan.detailViewName?response.results.views[viewPlan.detailViewName]:void 0,contextName,contextType,scope:parsedArgs.flags["--scope"],fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension});return attachCredit(usageData,commitmentUsage),asJson?(outputJson9(client,{data:usageData,fromDate,toDate,breakdownPeriod,groupByDimension}),0):(groupByDimension?outputGroupBy({data:usageData,groupByDimension,startTime:start}):breakdownPeriod?outputBreakdown({data:usageData,breakdownPeriod,startTime:start}):outputAggregated({data:usageData,startTime:start}),0)}catch(err){return isAPIError(err)&&err.status===404&&err.code==="costs_not_found"?error(`Billing cost data is unavailable for ${fromDisplay} through ${toDisplay}. This does not mean usage was zero. It usually means the team has no active subscription for that range, or the range is before the team's billing data starts. Check that the selected team and date range are correct.`):output_manager_default.prettyError(err),1}}function roundToHundredths(value){return Math.round((value+Number.EPSILON)*100)/100}function getUsageThrough(queriedAt,toDisplay){let queriedDate=extractDatePortion(queriedAt);return queriedDate<toDisplay?queriedDate:toDisplay}function attachCredit(usageData,commitmentUsage){if(!commitmentUsage)return;let creditLedger=commitmentUsage.creditLedgers.find(ledger=>ledger.currency===usageData.costUnit);if(!creditLedger)return;let used=roundToHundredths(creditLedger.total-creditLedger.remaining);usageData.creditBalance={cadence:commitmentUsage.cadence,currency:creditLedger.currency,allocated:creditLedger.total,used,remaining:creditLedger.remaining}}function processCosts(response,options){let{summaryView,detailView,contextName,contextType,scope,fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension}=options;if(!summaryView)throw new Error("The billing API did not return the requested usage summary.");let costUnit=getCostUnit(response);if(response.availableCurrencies?.some(currency=>currency!==costUnit))throw new Error("Can't show complete costs for this date range because some costs use a different billing currency. Choose a date range within the current billing currency or view usage in the dashboard.");let products=response.results.dimensionsMeta.product?.values??{},projects2=response.results.dimensionsMeta.project?.values??{},regions=response.results.dimensionsMeta.region?.values??{};if(groupByDimension&&(!detailView||!detailView.groupBy.includes(groupByDimension)))throw new Error(`Usage cannot be grouped by ${groupByDimension} for this team.`);let services=new Map,periodUsage=new Map,groupByUsage=new Map,totalCost=0;for(let result of summaryView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses");if(addService(services,serviceName,aggregation),totalCost+=aggregation.cost,breakdownPeriod)for(let index=0;index<response.results.times.length;index++){let periodKey=getPeriodKey(response.results.times[index],breakdownPeriod),period=periodUsage.get(periodKey)??emptyAggregation(),sample=aggregateResult(result,product,serviceName,response.metrics,index,productMetadata?.category==="Subscription Licenses");addService(period.services,serviceName,sample),period.totalCost+=sample.cost,periodUsage.set(periodKey,period)}}if(groupByDimension)for(let result of detailView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses"),id=result.dimensionValues[groupByDimension],groupName=id?(groupByDimension==="project"?projects2:regions)[id]?.title??id:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.find(metric=>metric.slug===result.metrics[quantityIndex]),values=sampleIndex===void 0?result.totalValue:result.values[sampleIndex]??[],cost=grossCostIndex===-1?0:values[grossCostIndex]??0,included=result.flatRate===!0,rawQuantity=quantityIndex===-1?0:values[quantityIndex]??0,quantity=isSubscription&&sampleIndex===void 0&&quantityIndex!==-1?result.values.reduce((maximum,sample)=>Math.max(maximum,sample[quantityIndex]??0),0):rawQuantity,units=getQuantityUnits(quantityMetric,product,isSubscription);return{name,product,quantity,...units,cost,included,category:isSubscription?"subscription":"usage"}}function getQuantityUnits(metric,product,isSubscription){if(isSubscription)return{unit:"licenses",singularUnit:"license"};if(!metric?.unit)return{};if(metric.unit.kind==="custom"){let singularUnit=metric.unit.singular,unit2=metric.unit.plural??singularUnit;return!unit2||singularUnit===metric.title||unit2===metric.title?{}:{unit:unit2,singularUnit}}if(metric.unit.kind==="digitalStorage"&&metric.unit.name)return{unit:metric.unit.name,unitKind:metric.unit.kind};let unit=metric.unit.name;return!unit||unit===metric.title||unit===product?{}:{unit,unitKind:metric.unit.kind}}function addService(services,name,value){let key=JSON.stringify([value.product,value.included]),existing=services.get(key);if(!existing){services.set(key,{...value,name});return}let previousQuantity=existing.quantity;existing.quantity=existing.category==="subscription"?Math.max(previousQuantity,value.quantity):previousQuantity+value.quantity,existing.cost+=value.cost}function emptyAggregation(){return{services:new Map,totalCost:0}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG66={ls:getCommandAliases(listSubcommand25),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG66),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand25),2;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand13),2;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),2;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),2;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),2;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),2;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),2;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),2;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),2):(printHelp(tagsAggregateCommand),2)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),2):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),2):(printHelp(imageAggregateCommand),2)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg=>arg!==void 0&&aliases2.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),2):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),2):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),2):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),2):(printHelp(permissionsAggregateCommand),2)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-NX3EMRFH.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-V6IX3MOJ.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandAdd(subcommandOriginal),(await import("./chunks/add-D6D2J6ID.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-VZQLRHHA.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-HM7V26WX.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-MQXAAFBP.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-PP4JOW2C.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-VN6BPT3B.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-MBJR7IQW.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-ORGBK7MR.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-5LSKNTW7.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG66)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms39=__toESM(require_ms(),1),import_chalk318=__toESM(require_source(),1),import_pluralize22=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls10(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand29.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk318.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks get <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1425
+ `)}var GROSS_COST_METRIC="gross_cost",SUMMARY_VIEW="byProduct",DETAIL_VIEW="byProductRegionProject";function getCostViews(groupByDimension){let views={};return groupByDimension&&(views[DETAIL_VIEW]={groupBy:["product","region","project"]}),views[SUMMARY_VIEW]={groupBy:["product"]},{views,summaryViewName:SUMMARY_VIEW,detailViewName:groupByDimension?DETAIL_VIEW:void 0}}async function usage(client){let{print,error,debug,spinner}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("usage"),print(help(usageCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),1;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(!!fromFlag!=!!toFlag)return error("Both --from and --to must be specified or neither for the current billing cycle"),1;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),1;let breakdownPeriod=breakdownFlag,groupByFlag=parsedArgs.flags["--group-by"];if(groupByFlag&&!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),1;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),1;telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.trackCliOptionGroupBy(groupByFlag);let contextName,contextType,teamId,billingPeriod,hasPrecommitment=!1;try{let scope=await getScope(client),owner=scope.team??scope.user;contextName=scope.contextName,contextType=scope.team?"team":"personal account",teamId=scope.team?.id;let billing=owner?.billing;billingPeriod=billing?.subscriptions?.find(subscription=>subscription.frequency.interval==="month"&&subscription.frequency.intervalCount===1)?.period??billing?.period,hasPrecommitment=billing?.plan==="enterprise"||billing?.planIteration==="plus"||billing?.plan==="pro"&&billing?.planIteration==="flex"}catch(err){if((0,import_error_utils25.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!fromFlag&&!toFlag,fromDate,toDate;try{fromDate=fromFlag?parseBillingDate(fromFlag,!1):billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate(),toDate=toFlag?parseBillingDate(toFlag,!0):billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()}catch(err){return error(err.message),1}let fromDisplay=fromFlag??extractDatePortion(fromDate),toDisplay=toFlag??extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk317.default.bold(contextName)}`);try{let query=new URLSearchParams;teamId&&query.set("teamId",teamId);let viewPlan=getCostViews(groupByDimension),queryString=query.toString(),costsRequest=client.fetch(`/v2/billing/costs${queryString?`?${queryString}`:""}`,{method:"POST",body:{from:fromDate,to:toDate,metrics:[GROSS_COST_METRIC,"quantity"],format:"timeseries",views:viewPlan.views,userAgent:"vercel-cli.usage"},useCurrentTeam:!1}),commitmentRequest=usingDefaults&&teamId&&hasPrecommitment?client.fetch(`/v1/invoices/pre-commitment-usage?teamId=${encodeURIComponent(teamId)}`,{useCurrentTeam:!1}).catch(err=>(debug(`Unable to fetch infrastructure credit: ${String(err)}`),null)):Promise.resolve(null),[response,commitmentUsage]=await Promise.all([costsRequest,commitmentRequest]),usageData=processCosts(response,{summaryView:response.results.views[viewPlan.summaryViewName],detailView:viewPlan.detailViewName?response.results.views[viewPlan.detailViewName]:void 0,contextName,contextType,scope:parsedArgs.flags["--scope"],fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension});return attachCredit(usageData,commitmentUsage),asJson?(outputJson9(client,{data:usageData,fromDate,toDate,breakdownPeriod,groupByDimension}),0):(groupByDimension?outputGroupBy({data:usageData,groupByDimension,startTime:start}):breakdownPeriod?outputBreakdown({data:usageData,breakdownPeriod,startTime:start}):outputAggregated({data:usageData,startTime:start}),0)}catch(err){return isAPIError(err)&&err.status===404&&err.code==="costs_not_found"?error(`Billing cost data is unavailable for ${fromDisplay} through ${toDisplay}. This does not mean usage was zero. It usually means the team has no active subscription for that range, or the range is before the team's billing data starts. Check that the selected team and date range are correct.`):output_manager_default.prettyError(err),1}}function roundToHundredths(value){return Math.round((value+Number.EPSILON)*100)/100}function getUsageThrough(queriedAt,toDisplay){let queriedDate=extractDatePortion(queriedAt);return queriedDate<toDisplay?queriedDate:toDisplay}function attachCredit(usageData,commitmentUsage){if(!commitmentUsage)return;let creditLedger=commitmentUsage.creditLedgers.find(ledger=>ledger.currency===usageData.costUnit);if(!creditLedger)return;let used=roundToHundredths(creditLedger.total-creditLedger.remaining);usageData.creditBalance={cadence:commitmentUsage.cadence,currency:creditLedger.currency,allocated:creditLedger.total,used,remaining:creditLedger.remaining}}function processCosts(response,options){let{summaryView,detailView,contextName,contextType,scope,fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension}=options;if(!summaryView)throw new Error("The billing API did not return the requested usage summary.");let costUnit=getCostUnit(response);if(response.availableCurrencies?.some(currency=>currency!==costUnit))throw new Error("Can't show complete costs for this date range because some costs use a different billing currency. Choose a date range within the current billing currency or view usage in the dashboard.");let products=response.results.dimensionsMeta.product?.values??{},projects2=response.results.dimensionsMeta.project?.values??{},regions=response.results.dimensionsMeta.region?.values??{};if(groupByDimension&&(!detailView||!detailView.groupBy.includes(groupByDimension)))throw new Error(`Usage cannot be grouped by ${groupByDimension} for this team.`);let services=new Map,periodUsage=new Map,groupByUsage=new Map,totalCost=0;for(let result of summaryView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses");if(addService(services,serviceName,aggregation),totalCost+=aggregation.cost,breakdownPeriod)for(let index=0;index<response.results.times.length;index++){let periodKey=getPeriodKey(response.results.times[index],breakdownPeriod),period=periodUsage.get(periodKey)??emptyAggregation(),sample=aggregateResult(result,product,serviceName,response.metrics,index,productMetadata?.category==="Subscription Licenses");addService(period.services,serviceName,sample),period.totalCost+=sample.cost,periodUsage.set(periodKey,period)}}if(groupByDimension)for(let result of detailView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses"),id=result.dimensionValues[groupByDimension],groupName=id?(groupByDimension==="project"?projects2:regions)[id]?.title??id:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.find(metric=>metric.slug===result.metrics[quantityIndex]),values=sampleIndex===void 0?result.totalValue:result.values[sampleIndex]??[],cost=grossCostIndex===-1?0:values[grossCostIndex]??0,included=result.flatRate===!0,rawQuantity=quantityIndex===-1?0:values[quantityIndex]??0,quantity=isSubscription&&sampleIndex===void 0&&quantityIndex!==-1?result.values.reduce((maximum,sample)=>Math.max(maximum,sample[quantityIndex]??0),0):rawQuantity,units=getQuantityUnits(quantityMetric,product,isSubscription);return{name,product,quantity,...units,cost,included,category:isSubscription?"subscription":"usage"}}function getQuantityUnits(metric,product,isSubscription){if(isSubscription)return{unit:"licenses",singularUnit:"license"};if(!metric?.unit)return{};if(metric.unit.kind==="custom"){let singularUnit=metric.unit.singular,unit2=metric.unit.plural??singularUnit;return!unit2||singularUnit===metric.title||unit2===metric.title?{}:{unit:unit2,singularUnit}}if(metric.unit.kind==="digitalStorage"&&metric.unit.name)return{unit:metric.unit.name,unitKind:metric.unit.kind};let unit=metric.unit.name;return!unit||unit===metric.title||unit===product?{}:{unit,unitKind:metric.unit.kind}}function addService(services,name,value){let key=JSON.stringify([value.product,value.included]),existing=services.get(key);if(!existing){services.set(key,{...value,name});return}let previousQuantity=existing.quantity;existing.quantity=existing.category==="subscription"?Math.max(previousQuantity,value.quantity):previousQuantity+value.quantity,existing.cost+=value.cost}function emptyAggregation(){return{services:new Map,totalCost:0}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG66={ls:getCommandAliases(listSubcommand25),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG66),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand25),2;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand13),2;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),2;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),2;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),2;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),2;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),2;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),2;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),2):(printHelp(tagsAggregateCommand),2)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),2):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),2):(printHelp(imageAggregateCommand),2)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg=>arg!==void 0&&aliases2.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),2):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),2):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),2):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),2):(printHelp(permissionsAggregateCommand),2)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-XI2PIZR4.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-L6XPIN4I.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandAdd(subcommandOriginal),(await import("./chunks/add-I5N2DAIP.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-L2HMQKZN.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-NUUHW6XI.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-4RTE52M4.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-V6DQKDOO.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-YEQRRX7B.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-M6DJBEV4.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-IWWMC6OL.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-OIMJWVL6.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG66)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms39=__toESM(require_ms(),1),import_chalk318=__toESM(require_source(),1),import_pluralize22=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls10(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand29.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk318.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks get <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
1416
1426
  `)}else output_manager_default.log(`${(0,import_pluralize22.default)("Webhook",webhooks.length,!0)} found under ${import_chalk318.default.bold(contextName)} ${import_chalk318.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
1417
1427
 
1418
1428
  `));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,import_ms39.default)(current-webhook.createdAt):"-",eventsDisplay=webhook.events.length>2?`${webhook.events.slice(0,2).join(", ")} +${webhook.events.length-2}`:webhook.events.join(", ");return[webhook.id,webhook.url,eventsDisplay,import_chalk318.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk319=__toESM(require_source(),1);var WebhooksGetTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function get6(client,argv){let telemetry2=new WebhooksGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(getSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[webhookId]=args,getStamp=stamp_default();if(!webhookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Webhook ID is required. Provide ID as the first argument.",next:[{command:getCommandNamePlain("webhooks ls")},{command:getCommandNamePlain("webhooks get <id>")}]},1),output_manager_default.error(`${getCommandName("webhooks get <id>")} expects one argument`),1;telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk319.default.cyan(`${getCommandName("webhooks get <id>")}`)}`),1;output_manager_default.debug("Fetching webhook info");let{contextName}=await getScope(client);client.nonInteractive||output_manager_default.spinner(`Fetching Webhook ${webhookId} under ${import_chalk319.default.bold(contextName)}`);let webhook;try{webhook=await getWebhook(client,webhookId)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"webhook_not_found",message:`Webhook not found: ${webhookId}.`,next:[{command:getCommandNamePlain("webhooks ls")}]},1),output_manager_default.error(`Webhook not found: ${webhookId}`),output_manager_default.log(`Run ${getCommandName("webhooks ls")} to see your webhooks.`),1;throw err}if(asJson){output_manager_default.stopSpinner();let jsonOutput=client.nonInteractive?{status:"ok",webhook,message:`Webhook ${webhookId} found.`,next:[{command:getCommandNamePlain(`webhooks rm ${webhookId} --yes`),when:"Remove this webhook"}]}:webhook;client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}