@vercel/cli-support 0.0.0 → 65.4.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 (355) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +100 -3
  3. package/dist/chunks/add-7NS6HIWC.js +8 -0
  4. package/dist/chunks/add-NMYFDVXW.js +8 -0
  5. package/dist/chunks/add-PMJ5BECU.js +8 -0
  6. package/dist/chunks/build-BCY6HQJG.js +7 -0
  7. package/dist/chunks/chunk-25565AGS.js +7 -0
  8. package/dist/chunks/chunk-2EYYB6YN.js +7 -0
  9. package/dist/chunks/chunk-2GHZGOWT.js +7 -0
  10. package/dist/chunks/chunk-2K3ISCQ6.js +7 -0
  11. package/dist/chunks/chunk-2NABMKFV.js +29 -0
  12. package/dist/chunks/chunk-2S6PE6GB.js +7 -0
  13. package/dist/chunks/chunk-2TUVL6WE.js +12 -0
  14. package/dist/chunks/chunk-363SJ4TN.js +7 -0
  15. package/dist/chunks/chunk-3G3FQYMW.js +7 -0
  16. package/dist/chunks/chunk-3LIKVGFT.js +8 -0
  17. package/dist/chunks/chunk-3XW7N4W3.js +9 -0
  18. package/dist/chunks/chunk-462YCCJZ.js +7 -0
  19. package/dist/chunks/chunk-4CACOKMS.js +7 -0
  20. package/dist/chunks/chunk-4N6LMERQ.js +57 -0
  21. package/dist/chunks/chunk-4NTBYNFR.js +17 -0
  22. package/dist/chunks/chunk-4SAVH3H7.js +7 -0
  23. package/dist/chunks/chunk-4VFYJU37.js +7 -0
  24. package/dist/chunks/chunk-527GBU3K.js +7 -0
  25. package/dist/chunks/chunk-5IWFRZQT.js +10 -0
  26. package/dist/chunks/chunk-5KUUMQ3M.js +7 -0
  27. package/dist/chunks/chunk-5RMIM4S2.js +7 -0
  28. package/dist/chunks/chunk-5V53NA6C.js +7 -0
  29. package/dist/chunks/chunk-67GZ5REA.js +7 -0
  30. package/dist/chunks/chunk-6I6QJHCY.js +7 -0
  31. package/dist/chunks/chunk-6IDNVZZR.js +7 -0
  32. package/dist/chunks/chunk-6OVX3PWM.js +7 -0
  33. package/dist/chunks/chunk-6QKS6QK7.js +7 -0
  34. package/dist/chunks/chunk-6TXEVQA4.js +7 -0
  35. package/dist/chunks/chunk-6VH56CX2.js +19 -0
  36. package/dist/chunks/chunk-6Y2ZL5XJ.js +98 -0
  37. package/dist/chunks/chunk-6YXIWZ3X.js +25 -0
  38. package/dist/chunks/chunk-773GOZIR.js +13 -0
  39. package/dist/chunks/chunk-7E3WREH5.js +7 -0
  40. package/dist/chunks/chunk-7EJQLVWX.js +7 -0
  41. package/dist/chunks/chunk-7L2K4OKM.js +63 -0
  42. package/dist/chunks/chunk-7L5QUDUR.js +8 -0
  43. package/dist/chunks/chunk-7QAGSRCU.js +7 -0
  44. package/dist/chunks/chunk-7R6TRRG5.js +7 -0
  45. package/dist/chunks/chunk-7YKFF6CE.js +7 -0
  46. package/dist/chunks/chunk-A2RZZQEP.js +7 -0
  47. package/dist/chunks/chunk-ADLBLGT3.js +8 -0
  48. package/dist/chunks/chunk-AM46JVVN.js +7 -0
  49. package/dist/chunks/chunk-ANMDN3EG.js +9 -0
  50. package/dist/chunks/chunk-AYUUSAB7.js +7 -0
  51. package/dist/chunks/chunk-BLUPZPAS.js +7 -0
  52. package/dist/chunks/chunk-BPUANOGW.js +7 -0
  53. package/dist/chunks/chunk-BRQUZ5NC.js +7 -0
  54. package/dist/chunks/chunk-BS32OUOC.js +7 -0
  55. package/dist/chunks/chunk-BTI5TG6Q.js +7 -0
  56. package/dist/chunks/chunk-BUJITHGZ.js +8 -0
  57. package/dist/chunks/chunk-BVGGTBYE.js +7 -0
  58. package/dist/chunks/chunk-BVH2AEFE.js +7 -0
  59. package/dist/chunks/chunk-BZENIQ7N.js +7 -0
  60. package/dist/chunks/chunk-C6GY2G73.js +7 -0
  61. package/dist/chunks/chunk-C7FQMC6D.js +7 -0
  62. package/dist/chunks/chunk-CBVKB3DT.js +21 -0
  63. package/dist/chunks/chunk-CC6FLKIP.js +11 -0
  64. package/dist/chunks/chunk-COD3WAUI.js +7 -0
  65. package/dist/chunks/chunk-CR3NBTHV.js +7 -0
  66. package/dist/chunks/chunk-CWM2F235.js +7 -0
  67. package/dist/chunks/chunk-CZSOZKHX.js +7 -0
  68. package/dist/chunks/chunk-D3AHZ5LI.js +7 -0
  69. package/dist/chunks/chunk-D6REP5QQ.js +15 -0
  70. package/dist/chunks/chunk-DFVNL5ML.js +7 -0
  71. package/dist/chunks/chunk-DKJL2KV7.js +7 -0
  72. package/dist/chunks/chunk-DQ2SVW4R.js +12 -0
  73. package/dist/chunks/chunk-DWZBL4NK.js +7 -0
  74. package/dist/chunks/chunk-EAUDC24V.js +9 -0
  75. package/dist/chunks/chunk-EAXMWCOL.js +63 -0
  76. package/dist/chunks/chunk-ECEDD646.js +8 -0
  77. package/dist/chunks/chunk-ECQIO5K3.js +7 -0
  78. package/dist/chunks/chunk-EEUJLJEJ.js +7 -0
  79. package/dist/chunks/chunk-EGNR2DEI.js +7 -0
  80. package/dist/chunks/chunk-EISD3RG7.js +11 -0
  81. package/dist/chunks/chunk-EKZTFGDX.js +7 -0
  82. package/dist/chunks/chunk-ETV3C2CV.js +7 -0
  83. package/dist/chunks/chunk-EU2GBIPC.js +7 -0
  84. package/dist/chunks/chunk-F4KY2TOK.js +7 -0
  85. package/dist/chunks/chunk-F53OKXYI.js +7 -0
  86. package/dist/chunks/chunk-F6EBOT64.js +7 -0
  87. package/dist/chunks/chunk-F7AVGV4Y.js +7 -0
  88. package/dist/chunks/chunk-FBYA6LLM.js +7 -0
  89. package/dist/chunks/chunk-FGFLTLEA.js +7 -0
  90. package/dist/chunks/chunk-FHU2O7ZJ.js +8 -0
  91. package/dist/chunks/chunk-FLHO75XC.js +8 -0
  92. package/dist/chunks/chunk-FSPPKNKN.js +7 -0
  93. package/dist/chunks/chunk-FUX6LKNP.js +7 -0
  94. package/dist/chunks/chunk-GA277JFB.js +20 -0
  95. package/dist/chunks/chunk-GCZVIDNG.js +86 -0
  96. package/dist/chunks/chunk-GD7AV7BO.js +9 -0
  97. package/dist/chunks/chunk-GG5RME4X.js +7 -0
  98. package/dist/chunks/chunk-GHAY4PSD.js +7 -0
  99. package/dist/chunks/chunk-GYVJIIYL.js +7 -0
  100. package/dist/chunks/chunk-GZNDA6SV.js +8 -0
  101. package/dist/chunks/chunk-HCRD3JFL.js +7 -0
  102. package/dist/chunks/chunk-HEGJZJO7.js +7 -0
  103. package/dist/chunks/chunk-HRR57QNP.js +7 -0
  104. package/dist/chunks/chunk-HSFKISDH.js +9 -0
  105. package/dist/chunks/chunk-HTXDC7E2.js +10 -0
  106. package/dist/chunks/chunk-ID663OJ7.js +7 -0
  107. package/dist/chunks/chunk-IOZ3I765.js +7 -0
  108. package/dist/chunks/chunk-IQ7FPAI4.js +7 -0
  109. package/dist/chunks/chunk-IQKGQ2Y2.js +15 -0
  110. package/dist/chunks/chunk-ISWW3DKF.js +7 -0
  111. package/dist/chunks/chunk-IVSSTHB6.js +7 -0
  112. package/dist/chunks/chunk-J24BABG4.js +21 -0
  113. package/dist/chunks/chunk-JALVF3C2.js +7 -0
  114. package/dist/chunks/chunk-JELLVPCM.js +8 -0
  115. package/dist/chunks/chunk-JESNVRVR.js +7 -0
  116. package/dist/chunks/chunk-JLE7K4SY.js +9 -0
  117. package/dist/chunks/chunk-JLEJB6KM.js +7 -0
  118. package/dist/chunks/chunk-JP33AIDQ.js +7 -0
  119. package/dist/chunks/chunk-JRPNHWA3.js +7 -0
  120. package/dist/chunks/chunk-JUSR7V2L.js +7 -0
  121. package/dist/chunks/chunk-JWCEHQQF.js +29 -0
  122. package/dist/chunks/chunk-K5U47EVH.js +7 -0
  123. package/dist/chunks/chunk-KCKYPLIH.js +7 -0
  124. package/dist/chunks/chunk-KGBIRIFF.js +7 -0
  125. package/dist/chunks/chunk-KJA2GKPT.js +7 -0
  126. package/dist/chunks/chunk-KPQLUGFI.js +32 -0
  127. package/dist/chunks/chunk-KQCFC2JL.js +7 -0
  128. package/dist/chunks/chunk-KQCROPL3.js +8 -0
  129. package/dist/chunks/chunk-KRPY5FHJ.js +7 -0
  130. package/dist/chunks/chunk-KW6GSQXV.js +7 -0
  131. package/dist/chunks/chunk-KY335KWI.js +7 -0
  132. package/dist/chunks/chunk-L3JYCXVB.js +23 -0
  133. package/dist/chunks/chunk-LFOWP74R.js +7 -0
  134. package/dist/chunks/chunk-LOBA3E72.js +7 -0
  135. package/dist/chunks/chunk-LQVSU5HR.js +7 -0
  136. package/dist/chunks/chunk-LSF7FY6X.js +7 -0
  137. package/dist/chunks/chunk-LSQREJXO.js +11 -0
  138. package/dist/chunks/chunk-LW4N3CW6.js +9 -0
  139. package/dist/chunks/chunk-M2NXKZKX.js +16 -0
  140. package/dist/chunks/chunk-MBEKRUTQ.js +8 -0
  141. package/dist/chunks/chunk-MCRKBVZA.js +7 -0
  142. package/dist/chunks/chunk-MVGTMPMI.js +23 -0
  143. package/dist/chunks/chunk-MXTC4ZAQ.js +7 -0
  144. package/dist/chunks/chunk-N2FLYCCO.js +9 -0
  145. package/dist/chunks/chunk-N6JBQMOF.js +20 -0
  146. package/dist/chunks/chunk-NAX6IARA.js +11 -0
  147. package/dist/chunks/chunk-NB2WLB3J.js +12 -0
  148. package/dist/chunks/chunk-NGKO2OOU.js +8 -0
  149. package/dist/chunks/chunk-NW7WWUCQ.js +9 -0
  150. package/dist/chunks/chunk-NWGBDBZI.js +7 -0
  151. package/dist/chunks/chunk-NZ2TFADV.js +7 -0
  152. package/dist/chunks/chunk-O4WNSKQR.js +15 -0
  153. package/dist/chunks/chunk-O72YDZKD.js +10 -0
  154. package/dist/chunks/chunk-OAM5NJCU.js +9 -0
  155. package/dist/chunks/chunk-OCR5CRTH.js +10 -0
  156. package/dist/chunks/chunk-OFDTADPQ.js +7 -0
  157. package/dist/chunks/chunk-OHEOYFBU.js +9 -0
  158. package/dist/chunks/chunk-OO572JUC.js +7 -0
  159. package/dist/chunks/chunk-OPORM35X.js +7 -0
  160. package/dist/chunks/chunk-OZCQTXI4.js +7 -0
  161. package/dist/chunks/chunk-PADL3C6Z.js +7 -0
  162. package/dist/chunks/chunk-PFD7LETF.js +7 -0
  163. package/dist/chunks/chunk-PFPJLIFF.js +33 -0
  164. package/dist/chunks/chunk-PSOVLGHP.js +7 -0
  165. package/dist/chunks/chunk-PUKYAALC.js +7 -0
  166. package/dist/chunks/chunk-PVASGBEF.js +7 -0
  167. package/dist/chunks/chunk-Q4KTAQB3.js +7 -0
  168. package/dist/chunks/chunk-Q5ODLDCU.js +7 -0
  169. package/dist/chunks/chunk-Q7D7RGXM.js +7 -0
  170. package/dist/chunks/chunk-QB7F3UAP.js +7 -0
  171. package/dist/chunks/chunk-QHJLRTVY.js +7 -0
  172. package/dist/chunks/chunk-QIVX6SCR.js +27 -0
  173. package/dist/chunks/chunk-QVHXFHBV.js +14 -0
  174. package/dist/chunks/chunk-QVXS234E.js +7 -0
  175. package/dist/chunks/chunk-QVZAAMGQ.js +39 -0
  176. package/dist/chunks/chunk-R2BUF6Z7.js +7 -0
  177. package/dist/chunks/chunk-R2XHJDAP.js +7 -0
  178. package/dist/chunks/chunk-R6BEOVTU.js +7 -0
  179. package/dist/chunks/chunk-RLKS5G6C.js +12 -0
  180. package/dist/chunks/chunk-RM3ZDRYE.js +7 -0
  181. package/dist/chunks/chunk-RMZTB2IU.js +7 -0
  182. package/dist/chunks/chunk-RRDNKB2X.js +7 -0
  183. package/dist/chunks/chunk-RW3X523R.js +8 -0
  184. package/dist/chunks/chunk-S3L2OHPO.js +7 -0
  185. package/dist/chunks/chunk-SACGQMVQ.js +13 -0
  186. package/dist/chunks/chunk-SCV7XEEO.js +7 -0
  187. package/dist/chunks/chunk-SF4E3AQ3.js +7 -0
  188. package/dist/chunks/chunk-SLGUYM42.js +10 -0
  189. package/dist/chunks/chunk-SYFG2RM6.js +10 -0
  190. package/dist/chunks/chunk-T6243EDS.js +7 -0
  191. package/dist/chunks/chunk-TAAWMNNL.js +7 -0
  192. package/dist/chunks/chunk-TAISZMA2.js +7 -0
  193. package/dist/chunks/chunk-TEYREL44.js +7 -0
  194. package/dist/chunks/chunk-TG2RCYTH.js +7 -0
  195. package/dist/chunks/chunk-TIPQQ4TG.js +17 -0
  196. package/dist/chunks/chunk-U2OBPULW.js +7 -0
  197. package/dist/chunks/chunk-U4Z2MMOF.js +301 -0
  198. package/dist/chunks/chunk-U56NHYAH.js +7 -0
  199. package/dist/chunks/chunk-UGNIIDHR.js +32 -0
  200. package/dist/chunks/chunk-UHBMX3OK.js +7 -0
  201. package/dist/chunks/chunk-UVHKXCR5.js +11 -0
  202. package/dist/chunks/chunk-V6Y6UK6B.js +43 -0
  203. package/dist/chunks/chunk-VNIKIQVE.js +10 -0
  204. package/dist/chunks/chunk-VT6RIZJH.js +7 -0
  205. package/dist/chunks/chunk-WDXW6A4H.js +10 -0
  206. package/dist/chunks/chunk-WEH6XC4Y.js +22 -0
  207. package/dist/chunks/chunk-WKZ6JSGZ.js +7 -0
  208. package/dist/chunks/chunk-WVHCBDTB.js +7 -0
  209. package/dist/chunks/chunk-XC46OAAT.js +9 -0
  210. package/dist/chunks/chunk-XGTKHQTT.js +7 -0
  211. package/dist/chunks/chunk-XOETL6DB.js +96 -0
  212. package/dist/chunks/chunk-XP3FT56R.js +27 -0
  213. package/dist/chunks/chunk-XR6QY7RR.js +7 -0
  214. package/dist/chunks/chunk-XVDRGWXM.js +16 -0
  215. package/dist/chunks/chunk-Y5ZMKL7E.js +7 -0
  216. package/dist/chunks/chunk-YEZJNXQX.js +7 -0
  217. package/dist/chunks/chunk-YHPPP3SF.js +7 -0
  218. package/dist/chunks/chunk-YHULP2KK.js +7 -0
  219. package/dist/chunks/chunk-YMZ6WBKB.js +21 -0
  220. package/dist/chunks/chunk-ZF27J6FQ.js +7 -0
  221. package/dist/chunks/chunk-ZFRNVIHI.js +7 -0
  222. package/dist/chunks/chunk-ZN6CQWVP.js +7 -0
  223. package/dist/chunks/chunk-ZQBSAMFL.js +24 -0
  224. package/dist/chunks/cjs-2SMN43VH.js +54 -0
  225. package/dist/chunks/clear-FKVWDCVA.js +8 -0
  226. package/dist/chunks/compile-vercel-config-GWAJE44R.js +7 -0
  227. package/dist/chunks/config-5WVLG5SE.js +8 -0
  228. package/dist/chunks/config-RMOHN5YT.js +7 -0
  229. package/dist/chunks/config-validator.mjs +1 -0
  230. package/dist/chunks/connect-git-provider-FS5Q2HO4.js +7 -0
  231. package/dist/chunks/constants-JAB7MRSK.js +7 -0
  232. package/dist/chunks/create-project-IKCB6MB2.js +7 -0
  233. package/dist/chunks/delete-5WMB4WFR.js +9 -0
  234. package/dist/chunks/delete-EM4JZPFA.js +10 -0
  235. package/dist/chunks/detect-projects-OD4JEAW2.js +7 -0
  236. package/dist/chunks/detect-services-BSJGB4RM.js +7 -0
  237. package/dist/chunks/disable-QOM7UHQC.js +7 -0
  238. package/dist/chunks/discard-L5ZH7P5B.js +14 -0
  239. package/dist/chunks/dist-33WTJLVQ.js +7 -0
  240. package/dist/chunks/dist-RXYNZPEA.js +7 -0
  241. package/dist/chunks/edit-F3VJGCG2.js +9 -0
  242. package/dist/chunks/edit-TM7YCWBU.js +8 -0
  243. package/dist/chunks/enable-72C3QX34.js +7 -0
  244. package/dist/chunks/esm-33752ISR.js +7 -0
  245. package/dist/chunks/esm-4JKEE7PC.js +7 -0
  246. package/dist/chunks/esm-BYG5BWYH.js +9 -0
  247. package/dist/chunks/esm-DFFBNKNU.js +20 -0
  248. package/dist/chunks/esm-IF453UWS.js +7 -0
  249. package/dist/chunks/esm-LABWDJ72.js +7 -0
  250. package/dist/chunks/esm-TG37FXTU.js +9 -0
  251. package/dist/chunks/exec-OZSY46V6.js +16372 -0
  252. package/dist/chunks/export-EPLYZF2Q.js +19 -0
  253. package/dist/chunks/fetch-proxy-45DGILKR.js +67 -0
  254. package/dist/chunks/future-V77DRMQG.js +7 -0
  255. package/dist/chunks/generate-cert-for-deploy-Y3YHBMPU.js +7 -0
  256. package/dist/chunks/image-CVXEXU5R.js +7 -0
  257. package/dist/chunks/import-builders-PGRKJOOE.js +7 -0
  258. package/dist/chunks/inspect-BTRNXRJT.js +9 -0
  259. package/dist/chunks/inspect-CZ7WXYE5.js +20 -0
  260. package/dist/chunks/inspect-FGDVWAQP.js +13 -0
  261. package/dist/chunks/inspect-HFDGZNWC.js +15 -0
  262. package/dist/chunks/inspect-T2AIREYK.js +19 -0
  263. package/dist/chunks/list-CKRRHAOE.js +12 -0
  264. package/dist/chunks/list-FLREMGJR.js +16 -0
  265. package/dist/chunks/list-ON4YTQRN.js +10 -0
  266. package/dist/chunks/login-55LJ5ZA6.js +9 -0
  267. package/dist/chunks/login-DQRZSD4Z.js +7 -0
  268. package/dist/chunks/logs-2HQXWOHM.js +7 -0
  269. package/dist/chunks/ls-2HUJHVLA.js +12 -0
  270. package/dist/chunks/ls-3DVM5HLK.js +12 -0
  271. package/dist/chunks/ls-4B3QYHCI.js +8 -0
  272. package/dist/chunks/ls-A7K4XDQB.js +8 -0
  273. package/dist/chunks/ls-FK5XEJEU.js +12 -0
  274. package/dist/chunks/ls-QGUKJJY5.js +12 -0
  275. package/dist/chunks/ls-VTKHPDWS.js +11 -0
  276. package/dist/chunks/mutate-7ADZBCZM.js +9 -0
  277. package/dist/chunks/notifications-XZJXE2K4.js +7 -0
  278. package/dist/chunks/open-EE5IZQD7.js +7 -0
  279. package/dist/chunks/openapi-QBX62ZXC.js +7 -0
  280. package/dist/chunks/permissions-VYJ4LL5R.js +7 -0
  281. package/dist/chunks/pkg-EDJQLCNP.js +7 -0
  282. package/dist/chunks/plugin-offer-TEGYA3TA.js +9 -0
  283. package/dist/chunks/prompt-missing-credentials-VP6OVCFM.js +7 -0
  284. package/dist/chunks/publish-2HEK5UMJ.js +15 -0
  285. package/dist/chunks/pull-WRTTSY7J.js +7 -0
  286. package/dist/chunks/purchase-domain-if-available-6S3NLTUI.js +7 -0
  287. package/dist/chunks/push-L3QRGGLC.js +7 -0
  288. package/dist/chunks/query-FXXLX6UB.js +12 -0
  289. package/dist/chunks/reauthenticate-IXQDC4UZ.js +7 -0
  290. package/dist/chunks/reorder-B4OXSYCI.js +10 -0
  291. package/dist/chunks/reply-F637K6XH.js +9 -0
  292. package/dist/chunks/repo-info-to-url-XQSULSEO.js +7 -0
  293. package/dist/chunks/resolve-E3F6NYQZ.js +12 -0
  294. package/dist/chunks/resolve-agent-team-EIPCH766.js +7 -0
  295. package/dist/chunks/resolve-deployment-framework-preset-AXXYBFCL.js +7 -0
  296. package/dist/chunks/restore-Q25KRZPH.js +16 -0
  297. package/dist/chunks/rm-FWD2NUGX.js +8 -0
  298. package/dist/chunks/rm-JMQ4QKCC.js +8 -0
  299. package/dist/chunks/rm-PPG7P3GN.js +8 -0
  300. package/dist/chunks/rm-SH3DYKNS.js +8 -0
  301. package/dist/chunks/rm-UEBLKFVC.js +8 -0
  302. package/dist/chunks/routes-PKTWMDWQ.js +7 -0
  303. package/dist/chunks/rule-inspect-LKQA5I4V.js +8 -0
  304. package/dist/chunks/schema-FBV42W7N.js +14 -0
  305. package/dist/chunks/schema-ZWE5MNMG.js +44 -0
  306. package/dist/chunks/select-org-WMB752Z6.js +7 -0
  307. package/dist/chunks/set-UTYIPOLC.js +7 -0
  308. package/dist/chunks/setup-and-link-ZLY5XQW5.js +7 -0
  309. package/dist/chunks/skills-RKIGVVNM.js +590 -0
  310. package/dist/chunks/slugify-NMMUASYK.js +7 -0
  311. package/dist/chunks/stamp-TKONNIJ5.js +7 -0
  312. package/dist/chunks/tags-UCLZ5UMX.js +7 -0
  313. package/dist/chunks/token-W6P2KNI5.js +7 -0
  314. package/dist/chunks/token-util-JDQI37VN.js +7 -0
  315. package/dist/chunks/types-YM7TMHXW.js +14 -0
  316. package/dist/chunks/update-BGDQ5TXO.js +8 -0
  317. package/dist/chunks/update-route-version-KWK5S4UW.js +7 -0
  318. package/dist/chunks/utils-IQZEE4DT.js +86 -0
  319. package/dist/chunks/vlt-builder-graph-XL2XRO4V.js +7 -0
  320. package/dist/chunks/vlt-builder-importer-RBUPAB6J.js +11 -0
  321. package/dist/chunks/zod-2C2SXNIK.js +7 -0
  322. package/dist/commands/build/builder-worker.cjs +281 -0
  323. package/dist/commands/build/index.js +34 -0
  324. package/dist/commands/deploy/index.js +72 -0
  325. package/dist/commands/dev/builder-worker.cjs +110 -0
  326. package/dist/commands/dev/index.js +157 -0
  327. package/dist/commands/env/index.js +40 -0
  328. package/dist/commands/link/index.js +10 -0
  329. package/dist/commands/list/index.js +14 -0
  330. package/dist/commands/project/index.js +113 -0
  331. package/dist/commands-account.js +209 -0
  332. package/dist/commands-ai.js +200 -0
  333. package/dist/commands-blob.js +107 -0
  334. package/dist/commands-core.js +222 -0
  335. package/dist/commands-deployments.js +84 -0
  336. package/dist/commands-flags.js +377 -0
  337. package/dist/commands-integrations.js +143 -0
  338. package/dist/commands-observability.js +122 -0
  339. package/dist/commands-routing.js +273 -0
  340. package/dist/fetch-dist-tags.cjs +60 -0
  341. package/dist/get-latest-worker.cjs +222 -0
  342. package/dist/help.js +7 -0
  343. package/dist/index.js +27 -0
  344. package/dist/internal-build-worker.js +10 -0
  345. package/dist/internal-build.js +11 -0
  346. package/dist/package.json +264 -0
  347. package/dist/root-help-commands.mjs +1 -0
  348. package/dist/runtime-assets/dev-tunnel/api/tunnel.ts +443 -0
  349. package/dist/runtime-assets/dev-tunnel/lib/env.ts +25 -0
  350. package/dist/runtime-assets/dev-tunnel/lib/tunnel_pb.ts +505 -0
  351. package/dist/runtime-assets/node-preloads/next-dev-websocket.cjs +220 -0
  352. package/dist/vc.js +404 -0
  353. package/dist/version.mjs +2 -0
  354. package/package.json +224 -14
  355. package/index.js +0 -1
@@ -0,0 +1,273 @@
1
+ import { createRequire as __createRequire } from 'node:module';
2
+ import { fileURLToPath as __fileURLToPath } from 'node:url';
3
+ import { dirname as __dirname_ } from 'node:path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __dirname_(__filename);
7
+ import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-TEYREL44.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-GCZVIDNG.js";import{getRouteVersions}from"./chunks/chunk-BVH2AEFE.js";import{TRANSFORM_TYPE_LABELS,findVersionById,formatCondition,formatTransform,getRouteTypeLabel,getRoutes,getSrcSyntaxLabel,isTargetTransform,offerAutoPromote,parsePosition,parseSubcommandArgs,withGlobalFlags as withGlobalFlags2}from"./chunks/chunk-M2NXKZKX.js";import{LOCAL_SCHEDULES_SESSION_HEADER,isLocalSchedulesOrigin,readLocalSchedulesSessions}from"./chunks/chunk-SF4E3AQ3.js";import{getLinkedFlagsProject,getProjectNameFromFlags}from"./chunks/chunk-JRPNHWA3.js";import{parseSubcommandArguments,requireProjectContext,validateRequiredArguments}from"./chunks/chunk-YEZJNXQX.js";import{formatMetricValue,generateSparkline}from"./chunks/chunk-XVDRGWXM.js";import{OBSERVABILITY_METRICS_PATH}from"./chunks/chunk-CC6FLKIP.js";import"./chunks/chunk-IVSSTHB6.js";import{writeJsonError}from"./chunks/chunk-O72YDZKD.js";import{Now,printDeploymentStatus}from"./chunks/chunk-YMZ6WBKB.js";import"./chunks/chunk-VT6RIZJH.js";import{require_dist as require_dist2}from"./chunks/chunk-N6JBQMOF.js";import"./chunks/chunk-ZFRNVIHI.js";import"./chunks/chunk-N2FLYCCO.js";import{getCustomEnvironments,pickCustomEnvironment}from"./chunks/chunk-F7AVGV4Y.js";import"./chunks/chunk-ANMDN3EG.js";import{readJSONFile}from"./chunks/chunk-R2XHJDAP.js";import"./chunks/chunk-MBEKRUTQ.js";import"./chunks/chunk-U56NHYAH.js";import{getTeamBillingUrl}from"./chunks/chunk-XR6QY7RR.js";import{handleValidationError,normalizeRepeatableStringFilters,resolveTimeRange,validateIntegerRangeWithDefault,validateOptionalIntegerRange,validateTimeBound,validateTimeOrder}from"./chunks/chunk-RW3X523R.js";import"./chunks/chunk-ID663OJ7.js";import{isValidName}from"./chunks/chunk-PADL3C6Z.js";import"./chunks/chunk-D6REP5QQ.js";import{printUnknownCommand}from"./chunks/chunk-5IWFRZQT.js";import"./chunks/chunk-2EYYB6YN.js";import{getAliases}from"./chunks/chunk-2K3ISCQ6.js";import{INVALID_NEXT_MESSAGE,parseNumericCursor}from"./chunks/chunk-C6GY2G73.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{formatTable,strlen}from"./chunks/chunk-LSQREJXO.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-FBYA6LLM.js";import"./chunks/chunk-GZNDA6SV.js";import"./chunks/chunk-OCR5CRTH.js";import{applyDeprecatedTargetFlag}from"./chunks/chunk-7QAGSRCU.js";import"./chunks/chunk-25565AGS.js";import{resolveProjectContext}from"./chunks/chunk-JP33AIDQ.js";import{formatProject}from"./chunks/chunk-6OVX3PWM.js";import{ensureLink}from"./chunks/chunk-HTXDC7E2.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-2TUVL6WE.js";import{getDeployment}from"./chunks/chunk-R6BEOVTU.js";import"./chunks/chunk-HCRD3JFL.js";import"./chunks/chunk-7EJQLVWX.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{getNextPageCommand,printNextPageCommand}from"./chunks/chunk-VNIKIQVE.js";import{require_format}from"./chunks/chunk-PFD7LETF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getRenamedOption,renameOptionInArgs,reportRenamedOptionError,withWarnings}from"./chunks/chunk-T6243EDS.js";import{getSubcommand as getSubcommand2}from"./chunks/chunk-ETV3C2CV.js";import{validateLsArgs}from"./chunks/chunk-KW6GSQXV.js";import"./chunks/chunk-SCV7XEEO.js";import{KMS_ALGORITHMS,PROJECT_GRANT_POLICY_KIND,activateKeySubcommand,addGrantSubcommand,addKeySubcommand,addSubcommand7 as addSubcommand,addSubcommand9 as addSubcommand2,addToGroupSubcommand,analyzeSubcommand,createGroupSubcommand,createSubcommand5 as createSubcommand,createSubcommand8 as createSubcommand2,decideSubcommand,deleteGroupSubcommand,deleteSubcommand2 as deleteSubcommand,deleteSubcommand3,diagnoseSubcommand,disableSubcommand3 as disableSubcommand2,enableSubcommand4 as enableSubcommand2,executionsListSubcommand,executionsSubcommand,experimentsCommand,getCommandAliases,getSubcommand2 as getSubcommand,importKeySubcommand,importSubcommand2 as importSubcommand,inspectGroupSubcommand,inspectSubcommand11 as inspectSubcommand3,inspectSubcommand5 as inspectSubcommand,inspectSubcommand8 as inspectSubcommand2,instancesInspectSubcommand,instancesListSubcommand,instancesRestartSubcommand,instancesSubcommand,invokeSubcommand,isProjectGrant,issuerJwksUrl,issuerUrl,kmsCommand,listSubcommand13 as listSubcommand2,listSubcommand17 as listSubcommand3,listSubcommand20 as listSubcommand4,listSubcommand21 as listSubcommand6,listSubcommand9 as listSubcommand,listVersionsSubcommand,microfrontendsCommand,openSubcommand2 as openSubcommand,promoteSubcommand,pullSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand12 as removeSubcommand,removeSubcommand14 as removeSubcommand2,reseedEnrollmentSubcommand,restartAnalysisSubcommand,restoreSubcommand,returnToDraftSubcommand,revokeKeySubcommand,scaleSubcommand,schedulesCommand,setRampSubcommand,startSubcommand,updateGrantSubcommand,updateSubcommand11 as updateSubcommand3,updateSubcommand4 as updateSubcommand,updateSubcommand8 as updateSubcommand2,uploadSubcommand}from"./chunks/chunk-O4WNSKQR.js";import"./chunks/chunk-6I6QJHCY.js";import"./chunks/chunk-EKZTFGDX.js";import{addSubcommand as addSubcommand3,deleteSubcommand as deleteSubcommand2,disableSubcommand,discardSubcommand,editSubcommand,enableSubcommand,exportSubcommand,inspectSubcommand as inspectSubcommand4,listSubcommand as listSubcommand5,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-462YCCJZ.js";import"./chunks/chunk-WVHCBDTB.js";import"./chunks/chunk-TAISZMA2.js";import"./chunks/chunk-527GBU3K.js";import"./chunks/chunk-CR3NBTHV.js";import"./chunks/chunk-BVGGTBYE.js";import"./chunks/chunk-6TXEVQA4.js";import"./chunks/chunk-5KUUMQ3M.js";import"./chunks/chunk-UHBMX3OK.js";import"./chunks/chunk-EEUJLJEJ.js";import"./chunks/chunk-NW7WWUCQ.js";import"./chunks/chunk-F6EBOT64.js";import"./chunks/chunk-LFOWP74R.js";import"./chunks/chunk-LOBA3E72.js";import{DEV_RESOURCE_TOKEN}from"./chunks/chunk-7R6TRRG5.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-OZCQTXI4.js";import"./chunks/chunk-FSPPKNKN.js";import{help}from"./chunks/chunk-FLHO75XC.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-HSFKISDH.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{TelemetryClient}from"./chunks/chunk-6YXIWZ3X.js";import"./chunks/chunk-PUKYAALC.js";import{getContextName,getScope}from"./chunks/chunk-K5U47EVH.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,buildCommandWithYes,getErrorRecovery,getExitCodeForReason,openUrlInBrowserCommand,outputActionRequired,outputAgentError,withGlobalFlags}from"./chunks/chunk-WDXW6A4H.js";import"./chunks/chunk-DKJL2KV7.js";import{getLinkedProject,getProjectByNameOrId,humanizePath,require_lib,require_pluralize,responseError,ua_default}from"./chunks/chunk-4N6LMERQ.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-ADLBLGT3.js";import"./chunks/chunk-CWM2F235.js";import"./chunks/chunk-4NTBYNFR.js";import{getTypedOptionName,isArgumentError,parseArguments,takeCommand}from"./chunks/chunk-KCKYPLIH.js";import{getTeamByIdOrSlug,quoteArg}from"./chunks/chunk-F53OKXYI.js";import{getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedInput,warnDeprecatedOption,warnDeprecatedSubcommand}from"./chunks/chunk-QVXS234E.js";import{directFetch,getFetchDispatcher}from"./chunks/chunk-FUX6LKNP.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{NowError,ProjectNotFound,isAPIError}from"./chunks/chunk-6VH56CX2.js";import{cmd,getCommandName,getCommandNamePlain}from"./chunks/chunk-JESNVRVR.js";import{emoji,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-XP3FT56R.js";import"./chunks/chunk-BLUPZPAS.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";var DaemonsTelemetryClient=class extends TelemetryClient{constructor(){super(...arguments);this.sub=subcommand=>value=>this.trackSubcommand(subcommand,value);this.arg=arg=>value=>this.trackCliArgument({arg,value:value&&this.redactedValue});this.option=option=>value=>this.trackRedactedCliOption(option,value);this.flag=flag=>value=>{value&&this.trackCliFlag(flag)};this.trackCliSubcommandList=this.sub("list");this.trackCliSubcommandScale=this.sub("scale");this.trackCliSubcommandInstances=this.sub("instances");this.trackCliSubcommandInspect=this.sub("inspect");this.trackCliSubcommandRestart=this.sub("restart");this.trackCliArgumentDaemon=this.arg("daemon");this.trackCliArgumentInstance=this.arg("instance");this.trackCliOptionNext=this.option("next");this.trackCliOptionSince=this.option("since");this.trackCliOptionUntil=this.option("until");this.trackCliFlagReset=this.flag("reset");this.trackCliFlagJson=this.flag("json")}trackSubcommand(subcommand,value){this.trackCliSubcommand({subcommand,value})}trackCliArgumentOverrides(value){let count=value.length?String(value.length):void 0;this.trackCliArgument({arg:"overrides",value:count})}trackCliOptionLimit(value){value!==void 0&&this.trackCliOption({option:"limit",value:String(value)})}trackOptions(flags){this.trackCliOptionProject(flags["--project"]),this.trackCliOptionLimit(flags["--limit"]),this.trackCliOptionNext(flags["--next"]),this.trackCliOptionSince(flags["--since"]),this.trackCliOptionUntil(flags["--until"]),this.trackCliFlagReset(flags["--reset"]),this.trackCliOptionFormat(flags["--format"]),this.trackCliFlagJson(flags["--json"])}};var import_chalk2=__toESM(require_source(),1);var import_chalk=__toESM(require_source(),1),import_ms=__toESM(require_ms(),1);function isJsonOutput(client){return wantsMachineReadableOutput("daemons",client.argv)||client.nonInteractive}function reportError(client,err,exitCode=1){if(!isJsonOutput(client))return printError(err,client),exitCode;let apiError=isAPIError(err)?err:void 0,reason=exitCode===2?AGENT_REASON.INVALID_ARGUMENTS:AGENT_REASON.API_ERROR,message=exitCode===2&&err instanceof Error?err.message:"Couldn't complete the daemon command.";return writeJsonError(client,{status:AGENT_STATUS.ERROR,reason,message,...apiError&&{...getErrorRecovery(apiError,client),data:{httpStatus:apiError.status}}},exitCode)}function toDaemon(daemon){if(!("replicas"in daemon))return daemon;let{replicas:instances,config,...rest}=daemon;if(!config)return{...rest,instances};let{replicas,configuredReplicas,...restConfig}=config;return{...rest,config:{...restConfig,instances:replicas,configuredInstances:configuredReplicas},instances}}var DAEMON_NAME_PATTERN=/^[a-zA-Z0-9_-]+$/;function instanceIdArg(client,args,usage){return args.length===0?failure(client,AGENT_REASON.INVALID_ARGUMENTS,"An instance ID is required.",{command:"instances list",when:"List available instances"},2):args.length===1&&/^dmni_[0-9a-hjkmnp-tv-z]{26}$/.test(args[0])?args[0]:usageError(client,"Expected one instance ID, like dmni_01k7d0q5w3x8y9z0a1b2c3d4e5.",usage)}function parse(client,argv,options,usage){let parsed;try{let spec=getFlagsSpecification(options);parsed=parseArguments(argv,spec)}catch(err){return reportError(client,err,2)}let telemetry=new DaemonsTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackOptions(parsed.flags);let format2=validateJsonOutput(parsed.flags);if(!format2.valid)return usageError(client,format2.error,usage);let asJson=format2.jsonOutput||client.nonInteractive;return{...parsed,asJson,telemetry}}async function resolveProject(client,project){let link=isJsonOutput(client)?await resolveProjectContext({client,projectNameOrId:project,projectNotFoundHandling:"return",quiet:!0}):await requireProjectContext(client,"daemons",project);return typeof link=="number"?link:link.status==="error"?reportError(client,new Error("Could not resolve project context."),link.exitCode):link.status!=="linked"?failure(client,project?AGENT_REASON.PROJECT_NOT_FOUND:AGENT_REASON.NOT_LINKED,project?`Couldn't find project ${project}.`:"No linked project found.",{command:"list --project <PROJECT>",when:"Select an existing project"}):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{...link,target:`${link.org.slug}/${link.project.name}`})}function daemonsCommand(client,command2){return withGlobalFlags(client,`daemons ${command2}`,{preserveProject:!0})}function failure(client,reason,message,next,exitCode=1){let command2=daemonsCommand(client,next.command);return output_manager_default.stopSpinner(),isJsonOutput(client)?writeJsonError(client,{status:AGENT_STATUS.ERROR,reason,message,next:[{...next,command:command2}]},exitCode):(output_manager_default.fatal(message),output_manager_default.print(`
8
+ ${next.when}:
9
+ ${cmd(command2)}
10
+ `),exitCode)}function usageError(client,message,usage){let next={command:usage,when:"Usage"};return failure(client,AGENT_REASON.INVALID_ARGUMENTS,message,next,2)}function printJson(client,value){return client.stdout.write(`${JSON.stringify(value,null,2)}
11
+ `),0}function formatAge(date){return`${(0,import_ms.default)(Math.max(0,Date.now()-Date.parse(date)))} ago`}function formatInstanceState(instance){return instance.stoppedAt?"Stopped":instance.alive?"Alive":"Not alive"}function formatStatus(status){let state=status.toLowerCase(),tone=state==="ready"||state==="alive"?"success":state==="reconciling"?"pending":state==="not alive"?"error":"muted",label=`${status.charAt(0).toUpperCase()}${status.slice(1)}`;return output_manager_default.formatStatus(label,tone)}function formatTable2(headers,rows,hsep=3){return table([headers.map(header=>import_chalk.default.dim(header)),...rows],{hsep}).split(`
12
+ `).map(line=>` ${line}`.trimEnd()).join(`
13
+ `)}function daemonsPath(project,...segments){return[`/v1/projects/${encodeURIComponent(project.id)}/daemons`,...segments.map(encodeURIComponent)].join("/")}async function fetchDaemonsPage(client,project,opts){let query=new URLSearchParams({scopeType:"target",scopeValue:"production"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next);let page=await client.fetch(`${daemonsPath(project)}?${query}`,{accountId:project.accountId});return{...page,daemons:page.daemons.map(toDaemon)}}async function fetchAllDaemons(client,project){let daemons2=[],next;do{let page=await fetchDaemonsPage(client,project,{limit:100,next});daemons2.push(...page.daemons),next=page.pagination.next}while(next);return daemons2}async function findInstance(client,link,instanceId){for(let daemon of await fetchAllDaemons(client,link.project)){let item=daemon.instances.items.find(({id})=>id===instanceId);if(item)return{...item,daemon:daemon.name}}return failure(client,AGENT_REASON.NOT_FOUND,`Couldn't find running production instance ${instanceId} in ${link.target}.`,{command:"instances list",when:"See the running instances"})}function formatInstanceCounts(daemon){let counts=daemon.config?.instances;if(counts&&typeof counts=="object"){let regions=Object.entries(counts).filter(([,count2])=>count2>0).sort(([a,countA],[b,countB])=>countB-countA||a.localeCompare(b)),visible=regions.length>4?regions.slice(0,3):regions,hidden=regions.length-visible.length,labels=visible.map(([region,count2])=>`${region}:${count2}`);return hidden&&labels.push(`+${hidden}`),{label:labels.join(" ")||"0 instances",hidden}}let count=typeof counts=="number"?counts:daemon.instances.desired;return{label:`${count} ${count===1?"instance":"instances"}`,hidden:0}}async function list(client,argv){let USAGE20="list",parsed=parse(client,argv,listSubcommand.options,USAGE20);if(typeof parsed=="number")return parsed;let{args,flags,asJson}=parsed;if(args.length>0)return usageError(client,"Expected no arguments.",USAGE20);let limit=validateOptionalIntegerRange(flags["--limit"],{flag:"--limit",min:1,max:100});if(!limit.valid)return usageError(client,limit.message,USAGE20);let link=await resolveProject(client,flags["--project"]);if(typeof link=="number")return link;try{asJson||output_manager_default.spinner(`Fetching daemons for ${link.target}`);let{daemons:daemons2,pagination}=limit.value!==void 0||flags["--next"]!==void 0?await fetchDaemonsPage(client,link.project,{limit:limit.value,next:flags["--next"]}):{daemons:await fetchAllDaemons(client,link.project),pagination:{next:void 0}};if(output_manager_default.stopSpinner(),asJson){let next=pagination.next??null;return printJson(client,{daemons:daemons2,pagination:{next}})}if(daemons2.length===0)return output_manager_default.print(` No production daemons in ${link.target}.
14
+
15
+ Add one under "daemons" in vercel.json, then deploy to production.
16
+ `),0;printAlignedLabel("Project",link.target);let instances=daemons2.map(formatInstanceCounts),isOverridden=daemon=>daemon.config?.configuredInstances!==void 0,rows=daemons2.map((daemon,i)=>[import_chalk2.default.bold(daemon.name),formatStatus(daemon.status),`${daemon.instances.ready}/${daemon.instances.desired}`,`${instances[i].label}${isOverridden(daemon)?" *":""}`,formatAge(daemon.updatedAt)]),headers=["Name","Status","Ready","Instances","Updated"];client.stdout.write(`
17
+ ${formatTable2(headers,rows,2)}
18
+
19
+ `);let limitFlag=limit.value?` --limit ${limit.value}`:"";if(daemons2.some(isOverridden)&&output_manager_default.print(` * Scaling overridden.
20
+ `),instances.some(({hidden})=>hidden>0)){let cursorFlag=flags["--next"]?` --next ${quoteArg(flags["--next"])}`:"",command2=daemonsCommand(client,`list --json${limitFlag}${cursorFlag}`);output_manager_default.print(` +N more regions. Show all region counts:
21
+ ${cmd(command2)}
22
+ `)}if(pagination.next){let nextPage=`list${limitFlag} --next ${quoteArg(pagination.next)}`,command2=daemonsCommand(client,nextPage);printNextPageCommand(command2)}return 0}catch(err){return output_manager_default.stopSpinner(),reportError(client,err)}}async function instancesList(client,argv){let USAGE20="instances list [daemon]",options=instancesListSubcommand.options,parsed=parse(client,argv,options,USAGE20);if(typeof parsed=="number")return parsed;let{args,flags,asJson,telemetry}=parsed,[daemonName]=args;if(telemetry.trackCliArgumentDaemon(daemonName),args.length>1)return usageError(client,"Expected at most one argument.",USAGE20);let link=await resolveProject(client,flags["--project"]);if(typeof link=="number")return link;try{asJson||output_manager_default.spinner(`Fetching daemon instances for ${link.target}`);let daemons2=(await fetchAllDaemons(client,link.project)).filter(daemon=>!daemonName||daemon.name===daemonName);if(output_manager_default.stopSpinner(),daemonName&&daemons2.length===0)return failure(client,AGENT_REASON.NOT_FOUND,`Couldn't find production daemon ${daemonName} in ${link.target}.`,{command:"list",when:"See the daemons"});let instances=daemons2.flatMap(({name,instances:{items}})=>items.map(instance=>({...instance,daemon:name})));if(asJson)return printJson(client,{instances});if(instances.length===0)return output_manager_default.print(` No running daemon instances in ${link.target}.
23
+ `),0;printAlignedLabel("Project",link.target);let rows=instances.map(instance=>[import_chalk2.default.bold(instance.id),instance.daemon,instance.region,formatStatus(formatInstanceState(instance)),formatAge(instance.startedAt)]),headers=["Instance","Daemon","Region","Status","Started"];return client.stdout.write(`
24
+ ${formatTable2(headers,rows)}
25
+
26
+ `),0}catch(err){return output_manager_default.stopSpinner(),reportError(client,err)}}var USAGE="scale <daemon> <REGION=NUMBER>...";function parseOverrides(values){let overrides={};for(let value of values){let[,region,count]=/^([a-z]{3}[0-9])=([0-9]+)$/.exec(value)??[];if(!region)return`Invalid override "${value}". Use REGION=NUMBER.`;if(Number(count)>100)return`Invalid override "${value}". The maximum is 100.`;if(region in overrides)return`Region ${region} is set more than once.`;overrides[region]=Number(count)}return overrides}async function scale(client,argv){let parsed=parse(client,argv,scaleSubcommand.options,USAGE);if(typeof parsed=="number")return parsed;let{args,flags,asJson,telemetry}=parsed,[daemonName,...overrideArgs]=args;if(telemetry.trackCliArgumentDaemon(daemonName),telemetry.trackCliArgumentOverrides(overrideArgs),!daemonName||!DAEMON_NAME_PATTERN.test(daemonName))return usageError(client,"Expected a valid daemon name.",USAGE);if(!!flags["--reset"]==overrideArgs.length>0)return usageError(client,"Expected REGION=NUMBER overrides or --reset, not both.",USAGE);let overrides=parseOverrides(overrideArgs);if(typeof overrides=="string")return usageError(client,overrides,USAGE);let link=await resolveProject(client,flags["--project"]);if(typeof link=="number")return link;let next=daemonsCommand(client,`instances list ${daemonName}`);try{if(asJson||output_manager_default.spinner(`Scaling daemon ${daemonName}`),await client.fetch(`${daemonsPath(link.project,daemonName,"instances")}?target=production`,{method:"PUT",accountId:link.project.accountId,body:overrides}),output_manager_default.stopSpinner(),asJson)return printJson(client,{daemon:{name:daemonName,overrides},outcome:"scaled",next:[{command:next}]});let counts=Object.entries(overrides).map(([r,n])=>`${r}=${n}`);return printAlignedLabel("Scaled",daemonName,{gutter:"\u2713"}),printAlignedLabel("Project",link.target),printAlignedLabel("Overrides",counts.join(", ")||"None"),output_manager_default.print(`
27
+ Instances change in the background. Check them:
28
+ ${cmd(next)}
29
+ `),client.stdout.isTTY||client.stdout.write(`${daemonName}
30
+ `),0}catch(err){return isAPIError(err)&&err.status===404?failure(client,AGENT_REASON.NOT_FOUND,`Couldn't find production daemon ${daemonName} in ${link.target}.`,{command:"list",when:"See the daemons"}):(output_manager_default.stopSpinner(),reportError(client,err))}}function countsByRegion(counts){return typeof counts=="number"?{iad1:counts}:counts}function regionalCounts(daemon,memoryMiB){let desired=countsByRegion(daemon.config?.instances),configured=countsByRegion(daemon.config?.configuredInstances??daemon.config?.instances),image=daemon.config?.image?.resolved,canCountReady=image!==void 0&&memoryMiB!==void 0&&desired!==void 0,regions=new Set([...Object.keys(configured??{}),...Object.keys(desired??{}),...daemon.instances.items.map(instance=>instance.region)]),ready=new Map,alive=new Map;for(let instance of daemon.instances.items)instance.stoppedAt||(instance.alive&&alive.set(instance.region,(alive.get(instance.region)??0)+1),canCountReady&&instance.image===image&&instance.memoryMiB===memoryMiB&&ready.set(instance.region,(ready.get(instance.region)??0)+1));return[...regions].sort().map(region=>{let desiredCount=desired?desired[region]??0:null;return{region,configured:configured?configured[region]??0:null,desired:desiredCount,ready:desiredCount===0?0:canCountReady&&desiredCount!==null?Math.min(desiredCount,ready.get(region)??0):null,alive:alive.get(region)??0}})}async function inspect(client,argv){let USAGE20="inspect <daemon>",parsed=parse(client,argv,inspectSubcommand.options,USAGE20);if(typeof parsed=="number")return parsed;let{args,flags,asJson,telemetry}=parsed,[daemonName]=args;if(telemetry.trackCliArgumentDaemon(daemonName),args.length===0)return failure(client,AGENT_REASON.INVALID_ARGUMENTS,"A daemon name is required.",{command:"list",when:"List available daemons"},2);if(args.length!==1||!DAEMON_NAME_PATTERN.test(daemonName))return usageError(client,"Expected one valid daemon name.",USAGE20);let link=await resolveProject(client,flags["--project"]);if(typeof link=="number")return link;try{asJson||output_manager_default.spinner(`Fetching daemon ${daemonName}`);let daemon=(await fetchAllDaemons(client,link.project)).find(item=>item.name===daemonName);if(output_manager_default.stopSpinner(),!daemon)return failure(client,AGENT_REASON.NOT_FOUND,`Couldn't find production daemon ${daemonName} in ${link.target}.`,{command:"list",when:"List available daemons"});let memory=daemon.config?.resources?.requests.memory,memoryMatch=/^(\d+)Mi$/.exec(memory??""),memoryMiB=memoryMatch?Number(memoryMatch[1]):void 0,regions=regionalCounts(daemon,memoryMiB),scalingOverridden=daemon.config?.configuredInstances!==void 0,next=daemonsCommand(client,`instances list ${daemonName}`);if(asJson)return printJson(client,{daemon,context:{project:{id:link.project.id,name:link.project.name},team:{id:link.org.id,slug:link.org.slug},environment:"production"},scalingOverridden,regions,next:[{command:next,when:"List the daemon's instances"}]});printAlignedLabel("Project",link.target),printAlignedLabel("Environment","Production");let lines=[["Daemon",daemon.name],["Status",formatStatus(daemon.status)],["Ready",`${daemon.instances.ready}/${daemon.instances.desired}`],["Overrides",scalingOverridden?"Active":"None"],["Deployment ID",daemon.deploymentId],["Image",daemon.config?.image?.resolved??daemon.config?.image?.requested],["Memory/instance",memoryMiB===void 0?memory:`${memoryMiB} MiB`],["Updated",formatDate(daemon.updatedAt)]].flatMap(([label,value])=>value?[formatAlignedLabel(label,value)]:[]);if(client.stdout.write(`
31
+ ${lines.join(`
32
+ `)}
33
+
34
+ `),regions.length){let rows=regions.map(({region,configured,desired,ready,alive})=>[region,configured===null?"-":String(configured),desired===null?"-":String(desired),ready===null?"-":String(ready),String(alive)]),headers=["Region","Configured","Desired","Ready","Alive"];client.stdout.write(`${formatTable2(headers,rows,2)}
35
+
36
+ `)}return output_manager_default.print(` List the daemon's instances:
37
+ ${cmd(next)}
38
+ `),0}catch(err){return output_manager_default.stopSpinner(),reportError(client,err)}}var import_format=__toESM(require_format(),1);var ROWS=[["cpu","CPU","percent","avg"],["cpuTime","CPU time","milliseconds","sum"],["memory","Memory (avg)","bytes","avg"],["memoryPeak","Memory (peak)","bytes","max"],["transferIn","Data transfer in","bytes","sum"],["transferOut","Data transfer out","bytes","sum"]],metric=(name,aggregation)=>({metric:`vercel.daemon.${name}`,aggregation});function fetchMetrics(client,project,instanceId,{startTime,endTime}){let start=Math.floor(startTime.getTime()/1e3)*1e3,end=Math.floor(endTime.getTime()/1e3)*1e3,minutes=(end-start)/6e4,body={scope:{ownerId:project.accountId,projectIds:[project.id]},timeRange:{start:new Date(start).toISOString(),end:new Date(end).toISOString()},bucketSeconds:Math.max(1,Math.ceil(minutes/300))*300,filter:`instanceId:${instanceId}`,metrics:{cpuTime:metric("cpu_time_ms","sum"),provisionedCpu:metric("provisioned_cpu_time_ms","sum"),memory:metric("memory_used_bytes","avg"),memoryPeak:metric("memory_peak_bytes","max"),transferIn:metric("data_transfer_in_bytes","sum"),transferOut:metric("data_transfer_out_bytes","sum")},formulas:{cpu:"cpuTime / provisionedCpu * 100"},outputs:ROWS.map(([key])=>key)};return client.fetch(OBSERVABILITY_METRICS_PATH,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},accountId:project.accountId,bailOn429:!0})}function formatMetrics(response){let summary=response.summary[0]?.values??{},rows=ROWS.map(([key,label,unit,aggregation])=>[label,typeof summary[key]=="number"?formatMetricValue(summary[key],unit,aggregation):"-",generateSparkline((response.series??[]).map(p=>p.values[key]??null))]);return formatTable2(["Metric","Value","Trend"],rows)}async function instancesInspect(client,argv){let USAGE20="instances inspect <instance>",options=instancesInspectSubcommand.options,parsed=parse(client,argv,options,USAGE20);if(typeof parsed=="number")return parsed;let{args,flags,asJson,telemetry}=parsed;telemetry.trackCliArgumentInstance(args[0]);let instanceId=instanceIdArg(client,args,USAGE20);if(typeof instanceId=="number")return instanceId;let range;try{range=resolveTimeRange(flags["--since"],flags["--until"])}catch(err){return usageError(client,err.message,USAGE20)}let order=validateTimeOrder(range.startTime,range.endTime);if(!order.valid)return usageError(client,order.message,USAGE20);if(Math.floor(range.startTime.getTime()/1e3)===Math.floor(range.endTime.getTime()/1e3))return usageError(client,"The metrics time range must span at least one whole second.",USAGE20);let link=await resolveProject(client,flags["--project"]);if(typeof link=="number")return link;try{asJson||output_manager_default.spinner(`Fetching instance ${instanceId}`);let instance=await findInstance(client,link,instanceId);if(typeof instance=="number")return instance;let metrics=await fetchMetrics(client,link.project,instanceId,range).catch(err=>output_manager_default.debug(err));output_manager_default.stopSpinner();let warning="Couldn't load the usage metrics of this instance.";if(asJson){let reason=AGENT_REASON.METRICS_UNAVAILABLE;return printJson(client,{instance,metrics:metrics??null,warnings:metrics?void 0:[{reason,message:warning}]})}printAlignedLabel("Project",link.target);let lines=[["Instance ID",instance.id],["Daemon",instance.daemon],["Region",instance.region],["Status",formatStatus(formatInstanceState(instance))],["Started",formatDate(instance.startedAt)],["Last checked",instance.lastCheckedAt&&formatDate(instance.lastCheckedAt)],["Memory",instance.memoryMiB?`${instance.memoryMiB} MiB`:void 0],["Image",instance.image]].flatMap(([label,value])=>value?[formatAlignedLabel(label,value)]:[]);if(client.stdout.write(`
39
+ ${lines.join(`
40
+ `)}
41
+
42
+ `),!metrics)return output_manager_default.warning(warning),0;let time=date=>(0,import_format.default)(date,"YYYY-MM-DD HH:mm"),period=`${time(range.startTime)} to ${time(range.endTime)}`;return client.stdout.write(` Usage from ${period}
43
+
44
+ ${formatMetrics(metrics)}
45
+
46
+ `),0}catch(err){return output_manager_default.stopSpinner(),reportError(client,err)}}async function instancesRestart(client,argv){let USAGE20="instances restart <instance>",options=instancesRestartSubcommand.options,parsed=parse(client,argv,options,USAGE20);if(typeof parsed=="number")return parsed;let{args,flags,asJson,telemetry}=parsed;telemetry.trackCliArgumentInstance(args[0]);let instanceId=instanceIdArg(client,args,USAGE20);if(typeof instanceId=="number")return instanceId;let link=await resolveProject(client,flags["--project"]);if(typeof link=="number")return link;let command2=`instances inspect ${instanceId}`,inspect4={command:command2,when:"Check the instance"};try{asJson||output_manager_default.spinner(`Restarting instance ${instanceId}`);let instance=await findInstance(client,link,instanceId);if(typeof instance=="number")return instance;let path=`${daemonsPath(link.project,instance.daemon)}/instances`;try{await client.fetch(`${path}/${instanceId}/restart`,{method:"POST",accountId:link.project.accountId,retry:{retries:0}})}catch(err){if(isAPIError(err))throw err;output_manager_default.debug(err);let message="Couldn't confirm whether the restart was accepted.",reason=AGENT_REASON.UNKNOWN_OUTCOME;return failure(client,reason,message,inspect4)}output_manager_default.stopSpinner();let next=daemonsCommand(client,command2);return asJson?printJson(client,{instance:{id:instanceId,daemon:instance.daemon},outcome:"accepted",next:[{command:next}]}):(printAlignedLabel("Accepted",`restart of ${instanceId}`),output_manager_default.print(`
47
+ The instance is restarting. Check its status:
48
+ ${cmd(next)}
49
+ `),client.stdout.isTTY||client.stdout.write(`${instanceId}
50
+ `),0)}catch(err){if(isAPIError(err)&&err.status===409){let message=`Instance ${instanceId} is still starting. Try again when it is running.`;return failure(client,AGENT_REASON.CONFLICT,message,inspect4)}return output_manager_default.stopSpinner(),reportError(client,err)}}var INSTANCES=[[instancesListSubcommand,instancesList],[instancesInspectSubcommand,instancesInspect],[instancesRestartSubcommand,instancesRestart]],ROOT=[[listSubcommand,list],[inspectSubcommand,inspect],[scaleSubcommand,scale],[instancesSubcommand,(client,argv)=>route(client,argv,INSTANCES,["daemons","instances"])]],routingFlags=getFlagsSpecification([...ROOT,...INSTANCES].flatMap(([command2])=>command2.options));async function daemons(client){try{let group=takeCommand(client.argv.slice(2),routingFlags);return await route(client,group.args,ROOT,["daemons"])}catch(err){return reportError(client,err,isArgumentError(err)?2:1)}}async function route(client,argv,routes,path){let config=Object.fromEntries(routes.map(([command3])=>[command3.name,getCommandAliases(command3)])),selected=takeCommand(argv,routingFlags),{subcommand,subcommandOriginal}=getSubcommand2(selected.command?[selected.command]:[],config);if(!subcommand&&selected.command&&!selected.command.startsWith("-"))return isJsonOutput(client)?failure(client,"unknown_command",`Unknown command ${selected.command} for ${getCommandNamePlain(path.join(" "))}.`,{command:`${path.slice(1).join(" ")} --help`.trim(),when:"See all commands"},2):(printUnknownCommand(client,selected.command,path),2);let[command2,run]=routes.find(([command3])=>command3.name===subcommand)??routes[0];return new DaemonsTelemetryClient({opts:{store:client.telemetryEventStore}}).trackSubcommand(command2.name,subcommandOriginal),run(client,subcommand?selected.args:argv)}var ExperimentsTelemetryClient=class extends TelemetryClient{trackSubcommand(subcommand,actual){this.trackCliSubcommand({subcommand,value:actual})}};function experimentsUrl(projectId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/experiments`}function experimentUrl(projectId,experimentIdOrSlug){return`${experimentsUrl(projectId)}/${encodeURIComponent(experimentIdOrSlug)}`}async function listExperiments(client,projectId){return(await client.fetch(experimentsUrl(projectId))).data}function getExperiment(client,projectId,experimentIdOrSlug){return client.fetch(experimentUrl(projectId,experimentIdOrSlug))}function createExperiment(client,projectId,body){return client.fetch(experimentsUrl(projectId),{method:"PUT",body})}function updateExperiment(client,projectId,experimentIdOrSlug,body){return client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"PATCH",body})}function applyExperimentAction(client,projectId,experimentIdOrSlug,action){return client.fetch(`${experimentUrl(projectId,experimentIdOrSlug)}/actions`,{method:"POST",body:action})}async function deleteExperiment(client,projectId,experimentIdOrSlug){await client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"DELETE"})}function getExperimentAnalysis(client,projectId,experimentId,body){return client.fetch(`/v3/projects/${encodeURIComponent(projectId)}/experiments/${encodeURIComponent(experimentId)}/results`,{method:"POST",body})}var OBSERVABILITY_EVENTS_PATH="/v1/observability/events";function observabilityEventsUrl(){let override=process.env.VERCEL_OBSERVABILITY_EVENTS_URL;return override||OBSERVABILITY_EVENTS_PATH}async function resolveAnalyticsProjectId(client,ownerId,projectId){let groups;try{({groups=[]}=await client.fetch("/v1/microfrontends/groups",{accountId:ownerId}))}catch{return projectId}for(let group of groups){let entry=group.projects?.find(project=>project.id===projectId);if(!entry)continue;let settings=entry.microfrontends;return!settings?.enabled||settings.isDefaultApp||settings.routeObservabilityToThisProject||settings.routeObservabilityToDefaultApp===!1?projectId:group.projects?.find(project=>project.microfrontends?.isDefaultApp)?.id??projectId}return projectId}function queryAnalyticsEvents(client,ownerId,projectId,{filter,select,start,end,limit,order="desc"}){return client.fetch(observabilityEventsUrl(),{method:"POST",body:{event:"vercel.analytics",scope:{ownerId,projectIds:[projectId]},timeRange:{start,end},select,filter,order,limit},accountId:ownerId})}var import_chalk3=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);var CONTAMINATION_WARNING_RATIO=.01;function safeResourceToken(value){return value&&/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)?value:void 0}function getExperimentIdentifier(experiment){return experiment.slug||experiment.id}function experimentToken(experiment){return safeResourceToken(experiment.slug)??safeResourceToken(experiment.id)}function command(client,template){return withGlobalFlags(client,template,{preserveProject:!0})}function buildExperimentNextCommands(client,experiment){let id=experimentToken(experiment),flag=safeResourceToken(experiment.flagSlug);if(!id)return[];let inspectFlag=flag?{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)}:void 0;return experiment.state==="draft"?[{label:"Start experiment",command:command(client,`experiments start ${id} --ramp <percentage>`)},{label:"Edit settings",command:command(client,`experiments update ${id} --file <file>`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id} --confirm ${id}`)}]:experiment.state==="running"?[{label:"Analyze results",command:command(client,`experiments analyze ${id}`)},{label:"Ramp exposures",command:command(client,`experiments set-ramp ${id} --ramp <percentage>`)},{label:"Make decision",command:command(client,`experiments decide ${id} --winner <variant-id> --rationale <text>`)},...inspectFlag?[inspectFlag]:[]]:[{label:"Analyze results",command:command(client,`experiments analyze ${id}`)},{label:"Return to draft",command:command(client,`experiments return-to-draft ${id}`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id} --confirm ${id}`)}]}function buildListNextCommands(client){return[{label:"Inspect experiment",command:command(client,"experiments inspect <experiment>")},{label:"Open experiments",command:command(client,"experiments open")},{label:"Create experiment",command:command(client,"experiments create --file <file>")}]}function buildDeletedNextCommands(client,experiment){let flag=safeResourceToken(experiment.flagSlug);return[...flag?[{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)},{label:"Edit flag",command:command(client,`flags open ${flag}`)}]:[],{label:"List experiments",command:command(client,"experiments ls")}]}function printNextCommands(next){if(next.length===0)return;let labelWidth=Math.max(ALIGNED_LABEL_WIDTH,...next.map(item=>item.label.length+1));output_manager_default.print(`
51
+ `);for(let item of next)printAlignedLabel(item.label,`\`${item.command}\``,{labelWidth,emphasis:"subtle"})}function printExperimentsTable(experiments2){let now=Date.now(),rows=experiments2.map(experiment=>[import_chalk3.default.bold(getExperimentIdentifier(experiment)),experiment.state,experiment.decision?.outcome??"\u2014",experiment.flagSlug,experiment.rampPercentage===void 0?"\u2014":`${experiment.rampPercentage}%`,`${(0,import_ms2.default)(now-experiment.updatedAt)} ago`]);output_manager_default.print(`
52
+ ${formatTable(["Experiment","State","Decision","Flag","Ramp","Updated"],["l","l","l","l","r","l"],[{name:"",rows}])}
53
+ `)}function formatTimestamp(timestamp){return timestamp===void 0?"\u2014":new Date(timestamp).toISOString()}function printExperimentDetails(experiment){let metricCount=Object.keys(experiment.metrics??{}).length,decision=experiment.decision?experiment.decision.outcome==="winner"?`Winner: ${experiment.decision.winnerVariantId??"unknown"}`:"Abandoned":"\u2014";printAlignedLabel("Experiment",experiment.name),printAlignedLabel("ID",experiment.id),printAlignedLabel("Slug",experiment.slug??"\u2014"),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("Unit",experimentUnitLabel(experiment)),printAlignedLabel("Target",`${experiment.targetPercentage}%`),printAlignedLabel("Ramp",experiment.rampPercentage===void 0?"\u2014":`${experiment.rampPercentage}%`),printAlignedLabel("Control",experiment.controlVariantId),printAlignedLabel("Variants",String(experiment.variants.length)),printAlignedLabel("Metrics",String(metricCount)),printAlignedLabel("Decision",decision),printAlignedLabel("Ramp ID",experiment.rampId??"\u2014"),printAlignedLabel("Created",formatTimestamp(experiment.createdAt)),printAlignedLabel("Updated",formatTimestamp(experiment.updatedAt))}function metricRole(experiment,alias){return experiment.primaryMetric===alias?"Primary":experiment.guardrailMetrics?.includes(alias)?"Guardrail":experiment.secondaryMetrics?.includes(alias)?"Secondary":"Other"}function formatPercentage(value){return value==null?"\u2014":`${(value*100).toFixed(2)}%`}function metricValue(type,variant){switch(type){case"conversion":return formatPercentage(variant.conversionRate);case"funnel":return formatPercentage(variant.overallRate);case"retention":return formatPercentage(variant.retentionRate);case"mean":return variant.mean?.toFixed(3)??"\u2014";case"ratio":return variant.ratio?.toFixed(3)??"\u2014";default:return"\u2014"}}function assessExperimentAnalysis(experiment,analysis){let issues=[],hasSampleSizeEstimate=!1;for(let[alias,metric2]of Object.entries(analysis.metrics)){let control=metric2.variants.find(variant=>variant.isBaseline);if(control)for(let variant of metric2.variants){if(variant.isBaseline||variant.requiredSampleSize==null)continue;hasSampleSizeEstimate=!0;let smallerArm=Math.min(control.exposedUnits,variant.exposedUnits);smallerArm>=variant.requiredSampleSize||issues.push({metric:alias,role:metricRole(experiment,alias),variantId:variant.variantId,controlUnits:control.exposedUnits,variantUnits:variant.exposedUnits,requiredUnitsPerArm:variant.requiredSampleSize,remainingUnitsInSmallerArm:variant.requiredSampleSize-smallerArm})}}let reasons=[],hasExposureInvariantFailure=analysis.warnings.some(warning=>warning.startsWith("Exposure invariant failed")),includesMaterialContamination=(analysis.contamination.totalUnits>0?analysis.contamination.contaminatedUnits/analysis.contamination.totalUnits:0)>=CONTAMINATION_WARNING_RATIO&&!analysis.excludeContaminated;analysis.srm.isValid||reasons.push("sample_ratio_mismatch"),hasExposureInvariantFailure&&reasons.push("exposure_invariant_failed"),includesMaterialContamination&&reasons.push("contamination_included"),issues.length>0&&reasons.push("insufficient_sample_size");let trust;return!analysis.srm.isValid||hasExposureInvariantFailure?trust={status:"failed",summary:!analysis.srm.isValid&&hasExposureInvariantFailure?"Do not trust \u2014 data quality checks failed":analysis.srm.isValid?"Do not trust \u2014 exposure counts disagree":"Do not trust \u2014 sample ratio mismatch",reasons}:includesMaterialContamination?trust={status:"caution",summary:"Use caution \u2014 contaminated units are included",reasons}:issues.length>0?trust={status:"directional",summary:"Directional only \u2014 insufficient sample size",reasons}:trust={status:"passed",summary:"Health checks passed",reasons},{trust,sampleSize:{status:issues.length>0?"insufficient":hasSampleSizeEstimate?"no_insufficiency_detected":"unavailable",issues}}}function printAnalysisWarning(message){output_manager_default.print(`${import_chalk3.default.yellow("!")} ${message}
54
+ `)}function printExperimentAnalysis(experiment,analysis,assessment=assessExperimentAnalysis(experiment,analysis)){printAlignedLabel("Experiment",experiment.name),printAlignedLabel("Ramp ID",analysis.rampId),printAlignedLabel("Population",`${analysis.contamination.totalUnits} exposed units`),printAlignedLabel("Contaminated",String(analysis.contamination.contaminatedUnits)),printAlignedLabel("SRM",analysis.srm.isValid?`Valid (p=${analysis.srm.pValue.toFixed(4)})`:`Mismatch (p=${analysis.srm.pValue.toFixed(4)})`),printAlignedLabel("Trust",assessment.trust.summary),printAlignedLabel("Sample Size",assessment.sampleSize.status==="insufficient"?"Insufficient":assessment.sampleSize.status==="no_insufficiency_detected"?"No insufficiency detected":"No estimate available"),analysis.srm.isValid||printAnalysisWarning(`Sample ratio mismatch detected (p=${analysis.srm.pValue.toFixed(4)}). Assignment may be biased; do not trust comparisons until the mismatch is explained.`);let contaminationRatio=analysis.contamination.totalUnits>0?analysis.contamination.contaminatedUnits/analysis.contamination.totalUnits:0;contaminationRatio>=CONTAMINATION_WARNING_RATIO&&!analysis.excludeContaminated&&printAnalysisWarning(`${analysis.contamination.contaminatedUnits} of ${analysis.contamination.totalUnits} units (${formatPercentage(contaminationRatio)}) saw multiple variants and are included. Re-run with --exclude-contaminated to compare the sensitivity analysis.`);for(let issue of assessment.sampleSize.issues)printAnalysisWarning(`Insufficient sample size for ${issue.role.toLowerCase()} metric \`${issue.metric}\`, variant \`${issue.variantId}\`: control has ${issue.controlUnits} and the variant has ${issue.variantUnits} exposed units; ~${issue.requiredUnitsPerArm} per arm are estimated for 80% power. Keep running before deciding.`);let rows=Object.entries(analysis.metrics).flatMap(([alias,metric2])=>metric2.variants.map(variant=>[alias,metricRole(experiment,alias),variant.variantId,metricValue(metric2.type,variant),formatPercentage(variant.lift),variant.pValue==null?"\u2014":variant.pValue.toFixed(4),variant.isSignificant?"Yes":"No"]));rows.length>0&&output_manager_default.print(formatTable(["Metric","Role","Variant","Value","Lift","p-value","Significant"],["l","l","l","r","r","r","l"],[{name:"",rows}]));for(let warning of analysis.warnings)printAnalysisWarning(warning)}var DIAGNOSED_COLUMN_WIDTHS={time:24,kind:8,what:26,variant:9,unit:21},DIAGNOSED_HEADER_INTERVAL=50;function experimentUnitLabel(experiment){return`${experiment.base.kind}.${experiment.base.attribute}`}function printExperimentDiagnosis(experiment,diagnosis,{follow=!1}={}){if(printAlignedLabel("Experiment",getExperimentIdentifier(experiment)),printAlignedLabel("Unit",experimentUnitLabel(experiment)),printAlignedLabel("Window",`${diagnosis.window.start} \u2192 ${diagnosis.window.end}`),diagnosis.projectId!==experiment.projectId&&printAlignedLabel("Data Project",diagnosis.projectId),printAlignedLabel("Events",`${String(diagnosis.events.length)} (${String(diagnosis.exposureCount)} exposures, ${String(diagnosis.metricEventCount)} metric events)`),printAlignedLabel("Enrolled Units",String(diagnosis.enrolledUnits)),diagnosis.notEnrolledExposures>0&&printAlignedLabel("Not Enrolled",`${String(diagnosis.notEnrolledExposures)} exposures`),diagnosis.events.length===0){output_manager_default.print(`
55
+ ${import_chalk3.default.yellow("!")} No exposures or metric events in this window. Analytics ingestion is asynchronous, so recent activity may not have landed yet.
56
+ `);return}let notes=[diagnosis.staleRampExposures>0?`${import_chalk3.default.yellow("!")} ${String(diagnosis.staleRampExposures)} of these exposures came from an earlier ramp, so the current analysis excludes them.`:void 0,diagnosis.truncated&&!follow?`${import_chalk3.default.yellow("!")} Showing the newest ${String(diagnosis.events.length)} events only; older rows exist. Raise --limit to see more.`:void 0,diagnosis.metricEventNames.length===0?`${import_chalk3.default.yellow("!")} This experiment configures no metrics, so only exposures are shown.`:void 0].filter(note=>note!==void 0),rows=(follow?[...diagnosis.events].reverse():diagnosis.events).map(diagnosedEventRow);if(output_manager_default.print(`
57
+ `),follow){for(let note of notes)output_manager_default.print(`${note}
58
+ `);notes.length>0&&output_manager_default.print(`
59
+ `)}output_manager_default.print(`${diagnosedHeader()}
60
+ `);for(let row of rows)output_manager_default.print(`${row}
61
+ `);if(!follow){output_manager_default.print(`
62
+ `);for(let note of notes)output_manager_default.print(`${note}
63
+ `)}}function createDiagnosedEventPrinter(printedSoFar=0){let printed=printedSoFar;return event=>{printed>0&&printed%DIAGNOSED_HEADER_INTERVAL===0&&output_manager_default.print(`${diagnosedHeader()}
64
+ `),output_manager_default.print(`${diagnosedEventRow(event)}
65
+ `),printed+=1}}function diagnosedEventRow(event){return diagnosedRow({time:diagnosedEventCells.time(event),kind:diagnosedEventCells.kind(event),what:diagnosedEventCells.what(event),variant:diagnosedEventCells.variant(event),unit:diagnosedEventCells.unit(event),note:diagnosedEventCells.note(event)})}function diagnosedHeader(){return import_chalk3.default.dim(diagnosedRow({time:"Time",kind:"Kind",what:"What",variant:"Variant",unit:"Unit",note:"Note"}))}function diagnosedRow(cells){return[padCell(cells.time,DIAGNOSED_COLUMN_WIDTHS.time),padCell(cells.kind,DIAGNOSED_COLUMN_WIDTHS.kind),padCell(cells.what,DIAGNOSED_COLUMN_WIDTHS.what),padCell(cells.variant,DIAGNOSED_COLUMN_WIDTHS.variant),padCell(cells.unit,DIAGNOSED_COLUMN_WIDTHS.unit),cells.note].join(" ").trimEnd()}var diagnosedEventCells={time:event=>import_chalk3.default.gray(event.timestamp),kind:event=>event.kind==="exposure"?import_chalk3.default.cyan(event.kind):import_chalk3.default.magenta(event.kind),what:event=>diagnosedEventName(event),variant:event=>event.variantId?import_chalk3.default.bold(event.variantId):import_chalk3.default.dim("\u2014"),unit:event=>event.unit??import_chalk3.default.dim("\u2014"),note:event=>event.assignmentReason?import_chalk3.default.yellow(event.assignmentReason):""};function padCell(value,width){return value+" ".repeat(Math.max(0,width-strlen(value)))}function diagnosedEventName(event){return event.name??(event.kind==="exposure"?"assigned":"\u2014")}import{readFile}from"node:fs/promises";import{resolve}from"node:path";function isJson(flags){return flags["--format"]==="json"}function validateFormat(flags){let format2=flags["--format"];return format2===void 0||format2==="json"?!0:(output_manager_default.error("The --format option only accepts `json`."),!1)}async function resolveProject2(client,flags){let projectName=getProjectNameFromFlags(flags),link=await getLinkedFlagsProject(client,projectName);return link.status==="error"?link.exitCode:link.status==="not_linked"?(output_manager_default.error(`Your codebase isn't linked to a project. Pass --project <name-or-id>, or run ${getCommandName("link")}.`),1):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,link)}function parseSubcommand(argv,command2){try{let parsed=parseArguments(argv,getFlagsSpecification(command2.options));return validateFormat(parsed.flags)?parsed:void 0}catch(error){printError(error);return}}function requireExperimentArgument(args,usage){let[experiment,extra]=args;if(!experiment){output_manager_default.error(`Missing required argument: experiment. Usage: ${getCommandName(usage)}`);return}if(extra){output_manager_default.error(`Too many arguments. Usage: ${getCommandName(usage)}`);return}return experiment}function writeJson(client,value){client.stdout.write(`${JSON.stringify(value,null,2)}
66
+ `)}var EXPERIMENTS_NOT_ENABLED_MESSAGE="Experiments are not enabled for this team.",EXPERIMENTS_LIMITED_PREVIEW_MESSAGE="This command is currently in limited preview and isn\u2019t enabled for your team.";function printExperimentError(client,error,json=!1){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){json||client.nonInteractive?writeJson(client,{status:"error",reason:"experiments_not_enabled",message:EXPERIMENTS_LIMITED_PREVIEW_MESSAGE,userActionRequired:!0}):output_manager_default.error(EXPERIMENTS_LIMITED_PREVIEW_MESSAGE);return}printError(error)}function jsonResult(experiment,next,extra={}){return{status:"success",experiment,...extra,next}}function printMutationPreview(link,experiment,transition,effect){let experimentIdentifier=getExperimentIdentifier(experiment);printAlignedLabel("Project",formatProject(link.org.slug,link.project.name)),printAlignedLabel("Experiment",experimentIdentifier),printAlignedLabel("State",transition),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("Effect",effect),output_manager_default.print(`
67
+ `)}async function confirmMutation({client,flags,link,experiment,transition,effect,prompt}){let json=isJson(flags),yes=flags["--yes"]===!0;if(json||printMutationPreview(link,experiment,transition,effect),!yes){if(json||client.nonInteractive||!client.stdin.isTTY){let nextCommand=buildCommandWithYes(client.argv);return json||client.nonInteractive?writeJson(client,{status:"action_required",reason:"confirmation_required",message:"Re-run with --yes to apply this production change.",userActionRequired:!0,next:[{command:nextCommand}]}):output_manager_default.error(`Missing required flag --yes. Re-run \`${nextCommand}\`.`),2}return await client.input.confirm(prompt,!1)?void 0:outputCanceled()}}function outputCanceled(){return output_manager_default.log("Canceled"),0}async function readAllStdin(client){if(client.stdin.isTTY)return"";let chunks=[];client.stdin.setEncoding("utf8");for await(let chunk of client.stdin)chunks.push(String(chunk));return chunks.join("")}async function readJsonObject(client,file){if(typeof file!="string"){output_manager_default.error("Missing required option --file <file>.");return}try{let source=file==="-"?await readAllStdin(client):await readFile(resolve(client.cwd,file),"utf8");if(!source.trim()){output_manager_default.error(file==="-"?"No JSON received on stdin for --file -.":`The file ${file} is empty.`);return}let value=JSON.parse(source);if(typeof value!="object"||value===null||Array.isArray(value)){output_manager_default.error("The JSON request body must be an object.");return}return value}catch(error){output_manager_default.error(`Failed to read experiment JSON: ${error instanceof Error?error.message:String(error)}`);return}}async function fetchExperimentContext(client,parsed,usage){let id=requireExperimentArgument(parsed.args,usage);if(!id)return 2;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiment\u2026");let experiment=await getExperiment(client,link.project.id,id);return output_manager_default.stopSpinner(),{link,experiment}}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function mutateExperiment(client,flags,context,spinner,mutation,resultLabel){try{output_manager_default.spinner(spinner);let experiment=await mutation();output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(flags)?writeJson(client,jsonResult(experiment,next)):(printAlignedLabel(resultLabel,experiment.name,{gutter:"\u2713"}),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),experiment.rampPercentage!==void 0&&printAlignedLabel("Ramp",`${experiment.rampPercentage}%`),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(flags)),1}}async function confirmAndMutateExperiment({client,flags,context,transition,effect,prompt,spinner,mutation,resultLabel}){let confirmation=await confirmMutation({client,flags,link:context.link,experiment:context.experiment,transition,effect,prompt});return confirmation!==void 0?confirmation:mutateExperiment(client,flags,context,spinner,mutation,resultLabel)}function parseRamp(flags){let ramp=flags["--ramp"];if(typeof ramp!="number"||!Number.isFinite(ramp)||ramp<0||ramp>100){output_manager_default.error("Provide --ramp as a percentage from 0 to 100.");return}return ramp}function requireExperimentState(experiment,expected,action){let states=Array.isArray(expected)?expected:[expected];return states.includes(experiment.state)?!0:(output_manager_default.error(`Cannot ${action} while the experiment is ${experiment.state}. Expected state: ${states.join(" or ")}.`),!1)}function unitKeyFromBase(experiment){let{kind,attribute}=experiment.base;return attribute==="id"&&(kind==="device"||kind==="user"||kind==="group")?`${kind}_id`:`event_data.${attribute==="id"?`${kind.replace(/[^A-Za-z0-9_]/g,"_")}Id`:attribute.replace(/[^A-Za-z0-9_]/g,"_")}`}async function runAnalyze(client,argv){let parsed=parseSubcommand(argv,analyzeSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments analyze <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,metrics=experiment.metrics??{};if(Object.keys(metrics).length===0)return output_manager_default.error("This experiment has no metrics to analyze."),1;let primaryMetric=typeof parsed.flags["--metric"]=="string"?parsed.flags["--metric"]:experiment.primaryMetric;if(primaryMetric&&!(primaryMetric in metrics))return output_manager_default.error(`Metric ${primaryMetric} isn't configured. Choose one of: ${Object.keys(metrics).join(", ")}.`),1;let epoch=experiment.rampId?experiment.epochs.find(item=>item.rampId===experiment.rampId):experiment.epochs.at(-1);if(!epoch)return output_manager_default.error("This experiment has no analysis epoch. Start it before requesting results."),1;let body={metrics,...primaryMetric?{primaryMetric}:{},controlVariantId:experiment.controlVariantId,expectedVariantWeights:experiment.weights,excludeContaminated:parsed.flags["--exclude-contaminated"]===!0,unitKey:unitKeyFromBase(experiment),rampId:epoch.rampId,from:new Date(epoch.startedAt).toISOString(),...epoch.endedAt?{to:new Date(epoch.endedAt).toISOString()}:{}};try{output_manager_default.spinner("Analyzing experiment\u2026");let analysis=await getExperimentAnalysis(client,context.link.project.id,experiment.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment),assessment=assessExperimentAnalysis(experiment,analysis);return isJson(parsed.flags)?writeJson(client,jsonResult(experiment,next,{analysis,assessment})):(printExperimentAnalysis(experiment,analysis,assessment),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runCreate(client,argv){let parsed=parseSubcommand(argv,createSubcommand);if(!parsed)return 2;if(parsed.args.length>0)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments create --file <file>")}`),2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Creating experiment\u2026");let experiment=await createExperiment(client,link.project.id,body);output_manager_default.stopSpinner();let next=buildExperimentNextCommands(client,experiment);return isJson(parsed.flags)?writeJson(client,jsonResult(experiment,next)):(printAlignedLabel("Created",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Experiment",experiment.id),experiment.slug&&printAlignedLabel("Slug",experiment.slug),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("State",experiment.state),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}async function runDecide(client,argv){let parsed=parseSubcommand(argv,decideSubcommand);if(!parsed)return 2;let winner=parsed.flags["--winner"],abandon=parsed.flags["--abandon"]===!0,rationale=parsed.flags["--rationale"];if(typeof winner=="string"===abandon)return output_manager_default.error("Use exactly one of --winner <variant-id> or --abandon."),2;if(typeof rationale!="string"||rationale.trim().length===0)return output_manager_default.error("Missing required option --rationale <text>."),2;let context=await fetchExperimentContext(client,parsed,"experiments decide <experiment> (--winner <variant-id>|--abandon) --rationale <text>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","make a decision"))return 1;if(typeof winner=="string"&&!context.experiment.variants.some(variant=>variant.id===winner))return output_manager_default.error(`Variant ${winner} isn't part of this experiment. Choose one of: ${context.experiment.variants.map(variant=>variant.id).join(", ")}.`),1;let effect=abandon?"Stop the experiment and serve control":`Stop the experiment and serve variant ${winner}`;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 completed`,effect,prompt:"Record this experiment decision?",spinner:"Recording experiment decision\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"complete",outcome:abandon?"abandon":"winner",...typeof winner=="string"?{winnerVariantId:winner}:{},rationale}),resultLabel:abandon?"Abandoned":"Completed"})}async function runDelete(client,argv){let parsed=parseSubcommand(argv,deleteSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments delete <experiment> --confirm <experiment>");if(typeof context=="number")return context;let experiment=context.experiment,experimentIdentifier=getExperimentIdentifier(experiment),proof=parsed.flags["--confirm"],proofMatches=proof===experiment.id||proof===experiment.slug||proof===parsed.args[0];if(isJson(parsed.flags)||printMutationPreview(context.link,experiment,`${experiment.state} \u2192 deleted`,`Delete experiment data and release feature flag ${experiment.flagSlug}`),!proofMatches){if(isJson(parsed.flags)||client.nonInteractive||!client.stdin.isTTY){let command2=buildCommandWithGlobalFlags(client.argv,`experiments delete ${experimentIdentifier} --confirm ${experimentIdentifier}`,void 0,{preserveProject:!0});return isJson(parsed.flags)||client.nonInteractive?writeJson(client,{status:"action_required",reason:"confirmation_required",message:"Deleting an experiment permanently removes its history and releases its feature flag.",userActionRequired:!0,next:[{command:command2}]}):output_manager_default.error(`Provide --confirm ${experimentIdentifier} to delete this experiment non-interactively.`),1}if(await client.input.text({message:`Type ${experimentIdentifier} to confirm deletion:`})!==experimentIdentifier)return outputCanceled()}try{output_manager_default.spinner("Deleting experiment\u2026"),await deleteExperiment(client,context.link.project.id,experiment.id),output_manager_default.stopSpinner();let next=buildDeletedNextCommands(client,experiment);return isJson(parsed.flags)?writeJson(client,{status:"success",deletedExperiment:{id:experiment.id,slug:experiment.slug,name:experiment.name},releasedFlag:{id:experiment.flagId,slug:experiment.flagSlug},next}):(printAlignedLabel("Deleted",experiment.name,{gutter:"\u2713"}),printAlignedLabel("Released Flag",experiment.flagSlug),printNextCommands(next)),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_chalk4=__toESM(require_source(),1);var MAX_DIAGNOSE_EVENTS=200,DEFAULT_DIAGNOSE_EVENTS=50,DIAGNOSE_LOOKBACK_MS=30*24*60*60*1e3,FOLLOW_TIMEOUT_MS=5*60*1e3,FOLLOW_POLL_INTERVAL_MS=5e3,FOLLOW_PAGE_LIMIT=200;async function followExperimentEvents({client,experiment,ownerId,projectId,filter,unitField,from,seen,json,printedSoFar=0,intervalMs=FOLLOW_POLL_INTERVAL_MS,timeoutMs=FOLLOW_TIMEOUT_MS}){let printEvent=createDiagnosedEventPrinter(printedSoFar),abortController=new AbortController,deadline=setTimeout(()=>{abortController.abort()},timeoutMs),onSigint=()=>{abortController.abort()};process.on("SIGINT",onSigint);let watermark=from,watermarkSeen=seen;try{for(;!abortController.signal.aborted&&(await sleepUnlessAborted(intervalMs,abortController.signal),!abortController.signal.aborted);){let end=new Date;if(end.getTime()<=watermark.getTime())continue;let rows;try{rows=(await queryAnalyticsEvents(client,ownerId,projectId,{filter,select:["type","eventName","eventData"],start:toWholeSecondIso(watermark),end:toWholeSecondIso(end),limit:FOLLOW_PAGE_LIMIT,order:"asc"})).events??[]}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,json),1}let events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),fresh=withoutSeen(events,watermarkSeen);if(fresh.length>0){output_manager_default.stopSpinner();for(let event of fresh)json?writeJson(client,event):printEvent(event)}let latest=events.at(-1)?.timestamp;if(latest){let latestDate=new Date(latest);latestDate.getTime()>watermark.getTime()?(watermark=latestDate,watermarkSeen=countByKey(events.filter(event=>event.timestamp===latest))):watermarkSeen=countByKey(events)}abortController.signal.aborted||output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`)}}finally{clearTimeout(deadline),process.removeListener("SIGINT",onSigint),output_manager_default.stopSpinner()}return 0}async function runDiagnose(client,argv){let parsed=parseSubcommand(argv,diagnoseSubcommand);if(!parsed)return 2;let jsonOutput=isJson(parsed.flags),fail=result=>handleValidationError(result,jsonOutput,client);if(parsed.flags["--follow"]&&parsed.flags["--until"]!==void 0)return fail({valid:!1,code:"MUTUAL_EXCLUSIVITY",message:`The ${import_chalk4.default.bold("--follow")} flag reads until interrupted, so it cannot be combined with ${import_chalk4.default.bold("--until")}.`});let limit=validateIntegerRangeWithDefault(parsed.flags["--limit"],{flag:"--limit",min:1,max:MAX_DIAGNOSE_EVENTS,defaultValue:DEFAULT_DIAGNOSE_EVENTS});if(!limit.valid)return fail(limit);let since=validateTimeBound(parsed.flags["--since"]);if(!since.valid)return fail(since);let until=validateTimeBound(parsed.flags["--until"]);if(!until.valid)return fail(until);let order=validateTimeOrder(since.value,until.value);if(!order.valid)return fail(order);let context=await fetchExperimentContext(client,parsed,"experiments diagnose <experiment>");if(typeof context=="number")return context;let{experiment,link}=context,names=metricEventNames(experiment),requestedEvents=normalizeRepeatableStringFilters(parsed.flags["--event"]),unknownEvents=requestedEvents.filter(name=>!names.includes(name));if(unknownEvents.length>0)return fail({valid:!1,code:"UNKNOWN_METRIC_EVENT",message:`This experiment has no metric event named ${unknownEvents.map(name=>`"${name}"`).join(", ")}. Choose from: ${names.join(", ")||"(none configured)"}.`,allowedValues:names});let wantsExposures=!!parsed.flags["--exposures"]||requestedEvents.length===0,eventNames=requestedEvents.length>0?requestedEvents:parsed.flags["--exposures"]?[]:names,limitValue=limit.value,end=until.value??new Date,window={start:toWholeSecondIso(since.value??defaultRangeStart(experiment,end)),end:toWholeSecondIso(end)},unitValue=typeof parsed.flags["--unit"]=="string"?parsed.flags["--unit"]:"",unitClause=unitValue?` AND eventData:*${unitValue.replaceAll("*","")}*`:"",branches=[wantsExposures?`type:exposure AND eventName:${quoteFilterValue(experiment.id)}${unitClause}`:void 0,eventNames.length>0?`type:event AND eventName:(${eventNames.map(quoteFilterValue).join(" OR ")})${unitClause}`:void 0].filter(branch=>branch!==void 0);if(branches.length===0)return output_manager_default.error("Nothing selected. Drop --exposures, or name a metric event with --event."),1;let followFilter=branches.length===1?branches[0]:branches.map(branch=>`(${branch})`).join(" OR "),diagnosis;try{output_manager_default.spinner("Reading experiment events\u2026");let projectId=await resolveAnalyticsProjectId(client,link.org.id,link.project.id),rows=(await queryAnalyticsEvents(client,link.org.id,projectId,{filter:followFilter,select:["type","eventName","eventData"],...window,limit:limitValue})).events??[],declaredUnitKey=rows.map(row=>parseEventData(row.eventData).unitKey).find(key=>typeof key=="string"),unitField=unitFieldFromKey(declaredUnitKey??unitKeyFromBase(experiment)),events=rows.map(row=>toDiagnosedEvent(row,row.type==="exposure"?"exposure":"event",unitField)),exposures=events.filter(event=>event.kind==="exposure"),enrolled=exposures.filter(event=>event.assignmentReason===void 0);diagnosis={events,projectId,exposureCount:exposures.length,metricEventCount:events.length-exposures.length,enrolledUnits:new Set(enrolled.map(event=>event.unit).filter(Boolean)).size,notEnrolledExposures:exposures.length-enrolled.length,metricEventNames:names,unitField,truncated:rows.length>=limitValue,staleRampExposures:experiment.rampId?exposures.filter(event=>event.rampId!==void 0&&event.rampId!==experiment.rampId).length:0,window},output_manager_default.stopSpinner()}catch(error){return output_manager_default.stopSpinner(),printDiagnoseError(client,error,jsonOutput),1}if(jsonOutput?writeJson(client,{status:"success",experiment:{id:experiment.id,slug:experiment.slug,state:experiment.state,rampId:experiment.rampId},diagnosis}):printExperimentDiagnosis(experiment,diagnosis,{follow:!!parsed.flags["--follow"]}),parsed.flags["--follow"]){let newest=diagnosis.events[0]?.timestamp,from=newest?new Date(newest):new Date(diagnosis.window.end),seen=newest?countByKey(diagnosis.events.filter(event=>event.timestamp===newest)):new Map;return output_manager_default.spinner(`Watching ${getExperimentIdentifier(experiment)}\u2026`),followExperimentEvents({client,experiment,ownerId:link.org.id,projectId:diagnosis.projectId,filter:followFilter,unitField:diagnosis.unitField,from,seen,json:jsonOutput,printedSoFar:diagnosis.events.length})}return 0}function sleepUnlessAborted(ms9,signal){return signal.aborted?Promise.resolve():new Promise(resolve3=>{let settle=()=>{clearTimeout(timer),signal.removeEventListener("abort",settle),resolve3()},timer=setTimeout(settle,ms9);signal.addEventListener("abort",settle,{once:!0})})}function printDiagnoseError(client,error,json){if(isAPIError(error)&&error.status===403&&error.serverMessage===EXPERIMENTS_NOT_ENABLED_MESSAGE){printExperimentError(client,error,json);return}if(isAPIError(error)&&error.status===402){output_manager_default.error("Reading custom events and experiment exposures requires a Pro or Enterprise plan.");return}if(isAPIError(error)&&error.status===403){output_manager_default.error("Cannot read experiment exposures. Web Analytics must be enabled for the project, and exposures are behind the `web-analytics-exposure-events` flag.");return}printExperimentError(client,error,json)}function countByKey(events){let counts=new Map;for(let event of events){let key=diagnosedEventKey(event);counts.set(key,(counts.get(key)??0)+1)}return counts}function diagnosedEventKey(event){return[event.timestamp,event.kind,event.name??"",event.unit??"",event.variantId??""].join("\0")}function withoutSeen(events,seen){let remaining=new Map(seen),fresh=[];for(let event of events){let key=diagnosedEventKey(event),outstanding=remaining.get(key)??0;if(outstanding>0){remaining.set(key,outstanding-1);continue}fresh.push(event)}return fresh}function toWholeSecondIso(date){let truncated=new Date(date);return truncated.setUTCMilliseconds(0),truncated.toISOString()}function toDiagnosedEvent(row,kind,unitField){let payload=parseEventData(row.eventData),pick=key=>typeof payload[key]=="string"?payload[key]:void 0,unit=pick(kind==="exposure"?"unitValue":unitField),variantId=pick("variantId"),rampId=pick("rampId"),assignmentReason=pick("assignmentReason");return{timestamp:row.timestamp,kind,...kind==="event"&&row.eventName?{name:row.eventName}:{},...unit?{unit}:{},...variantId?{variantId}:{},...rampId?{rampId}:{},...assignmentReason&&assignmentReason!=="experiment"?{assignmentReason}:{},...Object.keys(payload).length>0?{payload}:{}}}function parseEventData(raw){if(!raw)return{};try{let parsed=JSON.parse(raw);return parsed!==null&&typeof parsed=="object"?parsed:{}}catch{return{}}}function unitFieldFromKey(unitKey){return unitKey.startsWith("event_data.")?unitKey.slice(11):unitKey}function metricEventNames(experiment){let names=new Set,add4=value=>{typeof value=="string"&&value.length>0&&names.add(value)};for(let metric2 of Object.values(experiment.metrics??{}))add4(metric2.eventName),add4(metric2.initialEvent),add4(metric2.goalEvent),add4(metric2.numeratorEvent),add4(metric2.denominatorEvent),Array.isArray(metric2.eventNames)&&metric2.eventNames.forEach(add4);return[...names]}function quoteFilterValue(value){return`"${value.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}function defaultRangeStart(experiment,end){let launchedAt=experiment.launchedAt??experiment.createdAt;return new Date(Math.max(launchedAt,end.getTime()-DIAGNOSE_LOOKBACK_MS))}async function runInspect(client,argv){let parsed=parseSubcommand(argv,inspectSubcommand2);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments inspect <experiment>");if(typeof context=="number")return context;let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson(client,jsonResult(context.experiment,next)):(printExperimentDetails(context.experiment),printNextCommands(next)),0}async function runList(client,argv){let parsed=parseSubcommand(argv,listSubcommand2);if(!parsed)return 2;let state=parsed.flags["--state"];if(state!==void 0&&state!=="draft"&&state!=="running"&&state!=="completed")return output_manager_default.error("The --state option must be draft, running, or completed."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;try{output_manager_default.spinner("Fetching experiments\u2026");let all=await listExperiments(client,link.project.id);output_manager_default.stopSpinner();let experiments2=state?all.filter(experiment=>experiment.state===state):all,next=buildListNextCommands(client);return isJson(parsed.flags)?(writeJson(client,{status:"success",experiments:experiments2,next}),0):(experiments2.length===0?output_manager_default.log(state?`No experiments match state ${state}.`:"No experiments found."):printExperimentsTable(experiments2),printNextCommands(next),0)}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error,isJson(parsed.flags)),1}}var import_open=__toESM(require_open(),1);async function runOpen(client,argv){let parsed=parseSubcommand(argv,openSubcommand);if(!parsed)return 2;let[id,extra]=parsed.args;if(extra)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("experiments open [experiment]")}`),2;let tab=parsed.flags["--tab"]??"configuration";if(tab!=="configuration"&&tab!=="analysis")return output_manager_default.error("The --tab option must be configuration or analysis."),1;if(!id&&parsed.flags["--tab"]!==void 0)return output_manager_default.error("The --tab option requires an experiment argument."),1;let link=await resolveProject2(client,parsed.flags);if(typeof link=="number")return link;let experiment;try{id?(output_manager_default.spinner("Fetching experiment\u2026"),experiment=await getExperiment(client,link.project.id,id),output_manager_default.stopSpinner()):(output_manager_default.spinner("Checking experiment access\u2026"),await listExperiments(client,link.project.id),output_manager_default.stopSpinner());let base=`https://vercel.com/${encodeURIComponent(link.org.slug)}/${encodeURIComponent(link.project.name)}/flags`,url=experiment?`${base}/experiment/${encodeURIComponent(experiment.id)}/${tab}`:base;return client.stdout.isTTY?(output_manager_default.log(`Opening ${experiment?`experiment ${getExperimentIdentifier(experiment)}`:"experiments"} in your browser\u2026`),output_manager_default.log(`Visit this URL if the browser doesn't open: ${url}`),(0,import_open.default)(url).catch(()=>{}),printNextCommands(experiment?buildExperimentNextCommands(client,experiment):buildListNextCommands(client))):client.stdout.write(`${url}
68
+ `),0}catch(error){return output_manager_default.stopSpinner(),printExperimentError(client,error),1}}async function runReseedEnrollment(client,argv){let parsed=parseSubcommand(argv,reseedEnrollmentSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments reseed-enrollment <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="completed")return output_manager_default.error("Cannot reseed a completed experiment. Return it to draft first."),1;let running=context.experiment.state==="running";return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:running?"Reassign enrollment and start a new analysis epoch":"Reassign enrollment for the next run",prompt:"Reseed enrollment for this experiment?",spinner:"Reseeding enrollment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"reseed-enrollment"}),resultLabel:"Reseeded"})}async function runRestartAnalysis(client,argv){let parsed=parseSubcommand(argv,restartAnalysisSubcommand);if(!parsed)return 2;let context=await fetchExperimentContext(client,parsed,"experiments restart-analysis <experiment>");return typeof context=="number"?context:requireExperimentState(context.experiment,"running","restart its analysis")?confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:"Start a new analysis epoch without changing enrollment",prompt:"Restart analysis for this experiment?",spinner:"Restarting analysis\u2026",mutation:()=>updateExperiment(client,context.link.project.id,context.experiment.id,{restartAnalysis:!0}),resultLabel:"Restarted"}):1}async function runReturnToDraft(client,argv){let parsed=parseSubcommand(argv,returnToDraftSubcommand);if(!parsed)return 2;let cause=parsed.flags["--cause"];if(cause!==void 0&&cause!=="manual"&&cause!=="guardrail"&&cause!=="srm")return output_manager_default.error("The --cause option must be manual, guardrail, or srm."),1;let reason=parsed.flags["--reason"];if(typeof reason=="string"&&reason.trim().length===0)return output_manager_default.error("The --reason option cannot be empty."),1;let context=await fetchExperimentContext(client,parsed,"experiments return-to-draft <experiment>");if(typeof context=="number")return context;if(context.experiment.state==="draft"){let next=buildExperimentNextCommands(client,context.experiment);return isJson(parsed.flags)?writeJson(client,jsonResult(context.experiment,next,{changed:!1})):(output_manager_default.log("Experiment is already in draft."),printNextCommands(next)),0}let action={action:"return-to-draft",...cause?{cause}:{},...typeof reason=="string"?{reason}:{}};return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 draft`,effect:"Serve control and stop the active measurement window",prompt:"Return this experiment to draft?",spinner:"Returning experiment to draft\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,action),resultLabel:"Returned"})}async function runSetRamp(client,argv){let parsed=parseSubcommand(argv,setRampSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments set-ramp <experiment> --ramp <percentage>");if(typeof context=="number")return context;if(!requireExperimentState(context.experiment,"running","change its ramp"))return 1;let current=context.experiment.rampPercentage;if(ramp>context.experiment.targetPercentage)return output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1;if(ramp===current)return output_manager_default.error(`The experiment ramp is already ${ramp}%.`),1;let decreasing=current!==void 0&&ramp<current;return confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:"running \u2192 running",effect:`${current??"\u2014"}% \u2192 ${ramp}%${decreasing?"; start a new analysis epoch":"; keep the analysis epoch"}`,prompt:"Change this experiment ramp?",spinner:"Changing experiment ramp\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"set-ramp",rampPercentage:ramp}),resultLabel:"Changed Ramp"})}async function runStart(client,argv){let parsed=parseSubcommand(argv,startSubcommand);if(!parsed)return 2;let ramp=parseRamp(parsed.flags);if(ramp===void 0)return 2;let context=await fetchExperimentContext(client,parsed,"experiments start <experiment> --ramp <percentage>");return typeof context=="number"?context:requireExperimentState(context.experiment,"draft","start it")?ramp>context.experiment.targetPercentage?(output_manager_default.error(`Ramp cannot exceed the configured target of ${context.experiment.targetPercentage}%.`),1):confirmAndMutateExperiment({client,flags:parsed.flags,context,transition:`${context.experiment.state} \u2192 running`,effect:`Enroll ${ramp}% of eligible units`,prompt:"Start this experiment?",spinner:"Starting experiment\u2026",mutation:()=>applyExperimentAction(client,context.link.project.id,context.experiment.id,{action:"start",rampPercentage:ramp}),resultLabel:"Started"}):1}async function runUpdate(client,argv){let parsed=parseSubcommand(argv,updateSubcommand);if(!parsed)return 2;let body=await readJsonObject(client,parsed.flags["--file"]);if(!body)return 1;let context=await fetchExperimentContext(client,parsed,"experiments update <experiment> --file <file>");if(typeof context=="number")return context;let restart=parsed.flags["--restart-analysis"]===!0,keep=parsed.flags["--keep-analysis"]===!0;if(restart&&keep)return output_manager_default.error("Use either --restart-analysis or --keep-analysis, not both."),2;if("restartAnalysis"in body&&(restart||keep))return output_manager_default.error("Set restartAnalysis in the JSON file or use a command option, not both."),1;if(context.experiment.state==="running"){if(!("restartAnalysis"in body)&&!restart&&!keep)return output_manager_default.error("Updating a running experiment requires --restart-analysis or --keep-analysis."),2;"restartAnalysis"in body||(body.restartAnalysis=restart)}else if("restartAnalysis"in body||restart||keep)return output_manager_default.error("Analysis restart options only apply to a running experiment."),1;if(context.experiment.state!=="draft"){let confirmation=await confirmMutation({client,flags:parsed.flags,link:context.link,experiment:context.experiment,transition:`${context.experiment.state} \u2192 ${context.experiment.state}`,effect:body.restartAnalysis===!0?"Update serving settings and start a new analysis epoch":context.experiment.state==="running"?"Update serving settings and keep the current analysis epoch":"Update the completed experiment configuration",prompt:"Update this experiment?"});if(confirmation!==void 0)return confirmation}return mutateExperiment(client,parsed.flags,context,"Updating experiment\u2026",()=>updateExperiment(client,context.link.project.id,context.experiment.id,body),"Updated")}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand2),inspect:getCommandAliases(inspectSubcommand2),create:getCommandAliases(createSubcommand),update:getCommandAliases(updateSubcommand),start:getCommandAliases(startSubcommand),"set-ramp":getCommandAliases(setRampSubcommand),"restart-analysis":getCommandAliases(restartAnalysisSubcommand),"reseed-enrollment":getCommandAliases(reseedEnrollmentSubcommand),"return-to-draft":getCommandAliases(returnToDraftSubcommand),decide:getCommandAliases(decideSubcommand),analyze:getCommandAliases(analyzeSubcommand),diagnose:getCommandAliases(diagnoseSubcommand),open:getCommandAliases(openSubcommand),delete:getCommandAliases(deleteSubcommand)};async function experiments(client){let telemetry=new ExperimentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(experimentsCommand.options),{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsed.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand2(subArgs,COMMAND_CONFIG),needHelp=parsed.flags["--help"];if(!subcommand)return telemetry.trackCliFlagHelp("experiments",subcommand),output_manager_default.print(help(experimentsCommand,{columns:client.stderr.columns})),needHelp?0:2;let commands={list:{command:listSubcommand2,run:runList},inspect:{command:inspectSubcommand2,run:runInspect},create:{command:createSubcommand,run:runCreate},update:{command:updateSubcommand,run:runUpdate},start:{command:startSubcommand,run:runStart},"set-ramp":{command:setRampSubcommand,run:runSetRamp},"restart-analysis":{command:restartAnalysisSubcommand,run:runRestartAnalysis},"reseed-enrollment":{command:reseedEnrollmentSubcommand,run:runReseedEnrollment},"return-to-draft":{command:returnToDraftSubcommand,run:runReturnToDraft},decide:{command:decideSubcommand,run:runDecide},analyze:{command:analyzeSubcommand,run:runAnalyze},diagnose:{command:diagnoseSubcommand,run:runDiagnose},open:{command:openSubcommand,run:runOpen},delete:{command:deleteSubcommand,run:runDelete}},selectedName=subcommand,selected=commands[selectedName];return needHelp?(telemetry.trackCliFlagHelp("experiments",subcommandOriginal),output_manager_default.print(help(selected.command,{parent:experimentsCommand,columns:client.stderr.columns})),0):(telemetry.trackSubcommand(selectedName,Array.isArray(subcommandOriginal)?subcommandOriginal[0]??selectedName:subcommandOriginal),selected.run(client,args))}var KmsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandAddKey(actual){this.trackCliSubcommand({subcommand:"add-key",value:actual})}trackCliSubcommandImportKey(actual){this.trackCliSubcommand({subcommand:"import-key",value:actual})}trackCliSubcommandActivateKey(actual){this.trackCliSubcommand({subcommand:"activate-key",value:actual})}trackCliSubcommandRevokeKey(actual){this.trackCliSubcommand({subcommand:"revoke-key",value:actual})}trackCliSubcommandAddGrant(actual){this.trackCliSubcommand({subcommand:"add-grant",value:actual})}trackCliSubcommandUpdateGrant(actual){this.trackCliSubcommand({subcommand:"update-grant",value:actual})}trackCliSubcommandRemoveGrant(actual){this.trackCliSubcommand({subcommand:"remove-grant",value:actual})}};var import_chalk7=__toESM(require_source(),1),import_pluralize=__toESM(require_pluralize(),1);var ISSUERS_PATH="/v1/kms/issuers";function issuerPath(issuerId){return`${ISSUERS_PATH}/${encodeURIComponent(issuerId)}`}async function getIssuers(client,{limit,next}={}){let query=new URLSearchParams;limit!==void 0&&query.set("limit",String(limit)),next!==void 0&&query.set("next",next);let search=query.toString();return client.fetch(search?`${ISSUERS_PATH}?${search}`:ISSUERS_PATH)}async function getIssuer(client,issuerId){return client.fetch(issuerPath(issuerId))}async function createIssuer(client,payload){return client.fetch(ISSUERS_PATH,{method:"POST",body:payload})}async function updateIssuer(client,issuerId,payload){return client.fetch(issuerPath(issuerId),{method:"PATCH",body:payload})}async function deleteIssuer(client,issuerId){await client.fetch(issuerPath(issuerId),{method:"DELETE"})}var import_chalk5=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);function relativeAge(isoDate){let elapsed2=Date.now()-new Date(isoDate).getTime();return elapsed2>0?`${(0,import_ms3.default)(elapsed2)} ago`:(0,import_ms3.default)(-elapsed2)}function activeSigningKey(issuer){return issuer.signingKeys.find(key=>key.status==="active")}function describeKeyStatus(key){return key.status==="pending"?key.activateAt?`pending \xB7 activates in ${(0,import_ms3.default)(Math.max(0,new Date(key.activateAt).getTime()-Date.now()))}`:"pending \xB7 activate manually":key.status==="revoking"?key.revokeAt?`revoking \xB7 revoked in ${(0,import_ms3.default)(Math.max(0,new Date(key.revokeAt).getTime()-Date.now()))}`:"revoking":"active"}function formatIssuersTable(issuers){let rows=issuers.map(issuer=>{let active=activeSigningKey(issuer);return[issuer.id,issuer.name,issuer.algorithm,active?active.keyId:import_chalk5.default.gray("none"),import_chalk5.default.gray(relativeAge(issuer.createdAt))]});return formatTable(["ID","Name","Algorithm","Active Key","Age"],["l","l","l","l","l"],[{rows}])}function formatSigningKeysTable(keys){let rows=keys.map(key=>[key.keyId,key.algorithm,describeKeyStatus(key),key.importKeyId??import_chalk5.default.gray("-"),import_chalk5.default.gray(relativeAge(key.createdAt))]);return formatTable(["Key ID","Algorithm","Status","JWKS kid","Age"],["l","l","l","l","l"],[{rows}])}function formatGrantsTable(policies){let rows=policies.map(policy=>isProjectGrant(policy)?[policy.kind,policy.projectId,policy.environments.join(", "),policy.tokenClaims?"yes":import_chalk5.default.gray("no")]:[policy.kind,policy.clientId,import_chalk5.default.gray("-"),policy.tokenClaims?"yes":import_chalk5.default.gray("no")]);return formatTable(["Kind","Target","Environments","Token Claims"],["l","l","l","l"],[{rows}])}function indentTable(table2){return table2.replace(/^(.*)/gm," $1")}function printIssuerRows(issuer,gutterLabel){gutterLabel?(printAlignedLabel(gutterLabel.label,issuer.name,{gutter:gutterLabel.gutter}),printAlignedLabel("Issuer",issuer.id)):(printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Name",issuer.name)),printAlignedLabel("Algorithm",issuer.algorithm),printAlignedLabel("Origin",issuer.origin),issuer.managedBy&&printAlignedLabel("Managed By",issuer.managedBy)}function printSigningKeyRows(key,gutterLabel){printAlignedLabel(gutterLabel.label,key.keyId,{gutter:gutterLabel.gutter}),printAlignedLabel("Algorithm",key.algorithm),printAlignedLabel("Status",describeKeyStatus(key)),key.importKeyId&&printAlignedLabel("JWKS kid",key.importKeyId)}var import_chalk6=__toESM(require_source(),1);var MANAGED_ISSUER_CODE="issuer_managed_by_mismatch";function handleKmsApiError(client,err,{notFound,attempted,contextName,next}){if(!isAPIError(err))return;if(err.status===404&&notFound)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ISSUER_NOT_FOUND,message:notFound,next},1),output_manager_default.error(notFound),1;if(err.status===403&&err.code===MANAGED_ISSUER_CODE){let message2=`${attempted} isn't available for this issuer. It was provisioned by another Vercel service, which manages its keys and grants.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ISSUER_MANAGED,message:message2},1),output_manager_default.error(message2),1}if(err.status===403){let message2=`${attempted} requires the Owner role on ${contextName}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PERMISSION_DENIED,message:message2,...err.action&&{action:err.action},...typeof err.resource=="string"&&{resource:err.resource}},1),output_manager_default.error(message2),output_manager_default.log(`Ask an Owner of ${import_chalk6.default.bold(contextName)} to run it, or switch teams with ${import_chalk6.default.cyan("--scope")}.`),1}let message=err.serverMessage||err.message;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message},1),output_manager_default.error(message),1}var KmsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls(client,argv){let telemetry=new KmsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"kms ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionNext(opts["--next"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching KMS issuers under ${import_chalk7.default.bold(contextName)}`);let response;try{response=await getIssuers(client,{limit:opts["--limit"],next:opts["--next"]})}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{attempted:"Listing KMS issuers",contextName});if(handled!==void 0)return handled;throw err}let{issuers,pagination}=response;if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuers,pagination,message:`${(0,import_pluralize.default)("issuer",issuers.length,!0)} found.`,next:[{command:getCommandNamePlain("kms inspect <issuerId>"),when:"Show an issuer with its keys and grants"}]}:{issuers,pagination};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
69
+ `),0}if(issuers.length===0)return output_manager_default.log(`No issuers found under ${import_chalk7.default.bold(contextName)}. Run ${getCommandName("kms create <name>")} to create one.`),0;if(output_manager_default.log(`${(0,import_pluralize.default)("issuer",issuers.length,!0)} found under ${import_chalk7.default.bold(contextName)} ${import_chalk7.default.gray(lsStamp())}`),output_manager_default.print(indentTable(formatIssuersTable(issuers))),output_manager_default.print(`
70
+
71
+ `),pagination.next){let flags=getCommandFlags(opts,["_","--next"]);printNextPageCommand(getCommandNamePlain(`kms ls${flags} --next ${pagination.next}`))}return 0}var import_chalk9=__toESM(require_source(),1);var import_chalk8=__toESM(require_source(),1);function kmsSuggestion(subcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${subcommand} ${globalFlags.join(" ")}`:subcommand;return getCommandNamePlain(full)}function missingArgument(client,options){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:options.reason,message:options.message,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers to find an ID"},{command:kmsSuggestion(options.usage,client.argv)}]},getExitCodeForReason(options.reason)),output_manager_default.error(options.message),output_manager_default.log(`Usage: ${import_chalk8.default.cyan(getCommandName(options.usage))}`),getExitCodeForReason(options.reason)}function invalidArgumentCount(client,usage){let message=`Too many arguments. Usage: ${getCommandNamePlain(usage)}`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk8.default.cyan(getCommandName(usage))}`),2}function invalidInput(client,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),output_manager_default.error(message),2}var KmsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE2="kms inspect <issuerId>";async function inspect2(client,argv){let telemetry=new KmsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE2});if(args.length>1)return invalidArgumentCount(client,USAGE2);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Fetching issuer ${issuerId}`);let issuer;try{issuer=await getIssuer(client,issuerId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:"Reading this issuer",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuer,message:`Issuer ${issuer.id} found.`,next:[{command:getCommandNamePlain(`kms add-key ${issuer.id}`),when:"Rotate to a new signing key"}]}:issuer;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
72
+ `),0}return printIssuerRows(issuer),printAlignedLabel("Issuer URL",import_chalk9.default.cyan(issuerUrl(issuer.id))),printAlignedLabel("JWKS",import_chalk9.default.cyan(issuerJwksUrl(issuer.id))),printAlignedLabel("Created",formatDate(issuer.createdAt)),printAlignedLabel("Claims Schema",issuer.claimsSchema?"set":import_chalk9.default.gray("none")),output_manager_default.print(`
73
+ `),output_manager_default.print(` ${import_chalk9.default.bold("Signing keys")}
74
+ `),issuer.signingKeys.length===0?output_manager_default.print(` ${import_chalk9.default.gray("No signing keys.")}
75
+ `):(output_manager_default.print(indentTable(formatSigningKeysTable(issuer.signingKeys))),output_manager_default.print(`
76
+ `)),output_manager_default.print(`
77
+ `),output_manager_default.print(` ${import_chalk9.default.bold("Grants")}
78
+ `),issuer.policies.length===0?output_manager_default.print(` ${import_chalk9.default.gray("No grants visible. Only team owners can see grants.")}
79
+ `):(output_manager_default.print(indentTable(formatGrantsTable(issuer.policies))),output_manager_default.print(`
80
+ `)),output_manager_default.print(`
81
+ `),0}var import_chalk10=__toESM(require_source(),1);import{readFile as readFile2}from"node:fs/promises";import{resolve as resolve2}from"node:path";import{text}from"node:stream/consumers";async function readStdinToEnd(stdin){return stdin.isTTY?"":text(stdin)}async function resolveFlagSource(client,flagName,raw){if(!raw.startsWith("@"))return raw;let source=raw.slice(1);if(source==="-")return readStdinToEnd(client.stdin);if(source.length===0)throw new Error(`Invalid ${flagName} value. Use \`@<path>\` to read from a file or \`@-\` to read from stdin.`);try{return await readFile2(resolve2(client.cwd,source),"utf8")}catch(err){throw new Error(`Couldn't read ${flagName} file at "${source}": ${err.message}`)}}async function parseJsonObjectFlag(client,flagName,raw){let source=await resolveFlagSource(client,flagName,raw);if(source.trim().length===0)throw new Error(`${flagName} requires a non-empty JSON object.`);let parsed;try{parsed=JSON.parse(source)}catch{throw new Error(`Invalid JSON for ${flagName}. Expected a JSON object.`)}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new Error(`${flagName} must be a JSON object.`);return parsed}async function readPrivateKey(client,raw){let pem=raw==="-"?await readStdinToEnd(client.stdin):await readPem(client,raw);if(pem.trim().length===0)throw new Error("--key is empty. Pass a path to a PEM private key file, or `-` to read it from stdin.");if(!pem.includes("-----BEGIN"))throw new Error("--key must be a PEM-encoded private key. Pass a path to a `.pem` file, or `-` to read it from stdin.");return pem}async function readPem(client,path){try{return await readFile2(resolve2(client.cwd,path),"utf8")}catch(err){throw new Error(`Couldn't read --key file at "${path}": ${err.message}`)}}var KmsAddTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionAlgorithm(algorithm){algorithm&&this.trackCliOption({option:"algorithm",value:algorithm})}trackCliOptionClaimsSchema(claimsSchema){claimsSchema&&this.trackCliOption({option:"claims-schema",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE3="kms create <name>";async function add(client,argv){let telemetry=new KmsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[name]=args;if(telemetry.trackCliArgumentName(name),telemetry.trackCliOptionAlgorithm(opts["--algorithm"]),telemetry.trackCliOptionClaimsSchema(opts["--claims-schema"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!name)return missingArgument(client,{reason:AGENT_REASON.MISSING_NAME,message:"An issuer name is required.",usage:USAGE3});if(args.length>1)return invalidArgumentCount(client,USAGE3);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,algorithm=opts["--algorithm"];if(algorithm&&!KMS_ALGORITHMS.includes(algorithm))return invalidInput(client,`Invalid algorithm "${algorithm}". Supported algorithms: ${KMS_ALGORITHMS.join(", ")}.`);let claimsSchema;if(opts["--claims-schema"])try{claimsSchema=await parseJsonObjectFlag(client,"--claims-schema",opts["--claims-schema"])}catch(err){return invalidInput(client,err.message)}let payload={name,...algorithm&&{algorithm},...claimsSchema&&{claimsSchema}},contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Creating issuer under ${import_chalk10.default.bold(contextName)}`);let issuer;try{issuer=await createIssuer(client,payload)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{attempted:"Creating an issuer",contextName});if(handled!==void 0)return handled;throw err}output_manager_default.stopSpinner();let grantCommand=`kms add-grant ${issuer.id} --project <projectId> --environment production`;if(asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuer,message:`Issuer ${issuer.id} created.`,next:[{command:getCommandNamePlain(grantCommand),when:"Let a project sign with this issuer"}]}:issuer;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
82
+ `),0}printIssuerRows(issuer,{label:"Created",gutter:"\u2713"}),printAlignedLabel("Issuer URL",import_chalk10.default.cyan(issuerUrl(issuer.id))),printAlignedLabel("JWKS",import_chalk10.default.cyan(issuerJwksUrl(issuer.id)));let active=activeSigningKey(issuer);return active&&printAlignedLabel("Signing Key",active.keyId),output_manager_default.print(`
83
+ `),output_manager_default.log(`Let a project sign with this issuer: ${getCommandName(grantCommand)}`),0}var import_chalk11=__toESM(require_source(),1);var KmsImportTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionKey(key){key&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionKeyId(keyId){keyId&&this.trackCliOption({option:"key-id",value:this.redactedValue})}trackCliOptionAlgorithm(algorithm){algorithm&&this.trackCliOption({option:"algorithm",value:algorithm})}trackCliOptionClaimsSchema(claimsSchema){claimsSchema&&this.trackCliOption({option:"claims-schema",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE4="kms import <name> --key <file>";async function importIssuer(client,argv){let telemetry=new KmsImportTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(importSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[name]=args;if(telemetry.trackCliArgumentName(name),telemetry.trackCliOptionKey(opts["--key"]),telemetry.trackCliOptionKeyId(opts["--key-id"]),telemetry.trackCliOptionAlgorithm(opts["--algorithm"]),telemetry.trackCliOptionClaimsSchema(opts["--claims-schema"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!name)return missingArgument(client,{reason:AGENT_REASON.MISSING_NAME,message:"An issuer name is required.",usage:USAGE4});if(args.length>1)return invalidArgumentCount(client,USAGE4);let keyFlag=opts["--key"];if(!keyFlag)return missingArgument(client,{reason:AGENT_REASON.MISSING_KEY,message:"A private key is required. Pass --key with a path to a PEM file, or `-` to read it from stdin.",usage:USAGE4});let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,algorithm=opts["--algorithm"];if(algorithm&&!KMS_ALGORITHMS.includes(algorithm))return invalidInput(client,`Invalid algorithm "${algorithm}". Supported algorithms: ${KMS_ALGORITHMS.join(", ")}.`);let claimsSchema;if(opts["--claims-schema"])try{claimsSchema=await parseJsonObjectFlag(client,"--claims-schema",opts["--claims-schema"])}catch(err){return invalidInput(client,err.message)}let importKey2;try{importKey2=await readPrivateKey(client,keyFlag)}catch(err){return invalidInput(client,err.message)}let keyId=opts["--key-id"],payload={name,importKey:importKey2,...keyId&&{importKeyId:keyId},...algorithm&&{algorithm},...claimsSchema&&{claimsSchema}},contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Importing issuer under ${import_chalk11.default.bold(contextName)}`);let issuer;try{issuer=await createIssuer(client,payload)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{attempted:"Importing an issuer",contextName});if(handled!==void 0)return handled;throw err}output_manager_default.stopSpinner();let grantCommand=`kms add-grant ${issuer.id} --project <projectId> --environment production`;if(asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuer,message:`Issuer ${issuer.id} imported.`,next:[{command:getCommandNamePlain(grantCommand),when:"Let a project sign with this issuer"}]}:issuer;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
84
+ `),0}printIssuerRows(issuer,{label:"Imported",gutter:"\u2713"}),printAlignedLabel("Issuer URL",import_chalk11.default.cyan(issuerUrl(issuer.id))),printAlignedLabel("JWKS",import_chalk11.default.cyan(issuerJwksUrl(issuer.id)));let active=activeSigningKey(issuer);return active&&(printAlignedLabel("Signing Key",active.keyId),active.importKeyId&&printAlignedLabel("JWKS kid",active.importKeyId)),output_manager_default.print(`
85
+ `),output_manager_default.log(`Every later key for this issuer is imported too: ${getCommandName(`kms import-key ${issuer.id} --key <file>`)}`),output_manager_default.log(`Let a project sign with this issuer: ${getCommandName(grantCommand)}`),0}var import_chalk12=__toESM(require_source(),1);var KmsUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionClaimsSchema(claimsSchema){claimsSchema&&this.trackCliOption({option:"claims-schema",value:this.redactedValue})}trackCliFlagRemoveClaimsSchema(removeClaimsSchema){removeClaimsSchema&&this.trackCliFlag("remove-claims-schema")}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE5="kms update <issuerId>";async function update(client,argv){let telemetry=new KmsUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(updateSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliOptionName(opts["--name"]),telemetry.trackCliOptionClaimsSchema(opts["--claims-schema"]),telemetry.trackCliFlagRemoveClaimsSchema(opts["--remove-claims-schema"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE5});if(args.length>1)return invalidArgumentCount(client,USAGE5);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,name=opts["--name"],claimsSchemaFlag=opts["--claims-schema"],removeClaimsSchema=opts["--remove-claims-schema"];if(claimsSchemaFlag&&removeClaimsSchema)return invalidInput(client,"--claims-schema and --remove-claims-schema conflict. Pass one or the other.");if(!name&&!claimsSchemaFlag&&!removeClaimsSchema)return invalidInput(client,"Nothing to update. Pass --name, --claims-schema, or --remove-claims-schema.");let claimsSchema;if(claimsSchemaFlag)try{claimsSchema=await parseJsonObjectFlag(client,"--claims-schema",claimsSchemaFlag)}catch(err){return invalidInput(client,err.message)}let payload={...name&&{name},...claimsSchema&&{claimsSchema},...removeClaimsSchema&&{claimsSchema:null}},contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Updating issuer ${issuerId}`);let issuer;try{issuer=await updateIssuer(client,issuerId,payload)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:"Updating an issuer",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,issuer,message:`Issuer ${issuer.id} updated.`,next:[{command:getCommandNamePlain(`kms inspect ${issuer.id}`),when:"Show the updated issuer"}]}:issuer;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
86
+ `),0}return printIssuerRows(issuer,{label:"Updated",gutter:"\u2713"}),printAlignedLabel("Claims Schema",issuer.claimsSchema?"set":import_chalk12.default.gray("none")),output_manager_default.print(`
87
+ `),output_manager_default.log(`Inspect it: ${getCommandName(`kms inspect ${issuer.id}`)}`),0}var import_pluralize2=__toESM(require_pluralize(),1);var KmsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var USAGE6="kms delete <issuerId>";async function rm(client,argv){let telemetry=new KmsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliFlagYes(opts["--yes"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:`${USAGE6} --yes`});if(args.length>1)return invalidArgumentCount(client,USAGE6);let skipConfirmation=opts["--yes"]||!1;client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"Deleting an issuer also deletes its signing keys, and tokens it signed stop verifying. Re-run with --yes to confirm.",next:[{command:buildCommandWithYes(client.argv)}]},1);let contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Fetching issuer ${issuerId}`);let issuer;try{issuer=await getIssuer(client,issuerId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:"Deleting an issuer",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),!skipConfirmation&&(printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Name",issuer.name),printAlignedLabel("Signing Keys",(0,import_pluralize2.default)("key",issuer.signingKeys.length,!0)),output_manager_default.print(`
88
+ `),!await client.input.confirm(`Delete ${param(issuer.name)} and its signing keys? Tokens it signed stop verifying.`,!1)))return output_manager_default.log("Canceled"),0;client.nonInteractive||output_manager_default.spinner(`Deleting issuer ${issuer.id}`);try{await deleteIssuer(client,issuer.id)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuer.id}.`,attempted:"Deleting an issuer",contextName});if(handled!==void 0)return handled;throw err}return output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,issuer:{id:issuer.id,name:issuer.name},message:`Issuer ${issuer.id} deleted.`,next:[{command:getCommandNamePlain("kms ls"),when:"List remaining issuers"}]},null,2)}
89
+ `),0):(printAlignedLabel("Deleted",issuer.name,{gutter:"\u2713"}),printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Team",contextName),0)}function keysPath(issuerId){return`/v1/kms/issuers/${encodeURIComponent(issuerId)}/keys`}function keyPath(issuerId,keyId){return`${keysPath(issuerId)}/${encodeURIComponent(keyId)}`}function validateRevokePreviousAfterHours(value){return value===void 0?null:Number.isFinite(value)?value<0?"--revoke-previous-after-hours must be 0 or more.":null:"--revoke-previous-after-hours must be a number of hours."}async function createSigningKey(client,issuerId,payload){return client.fetch(keysPath(issuerId),{method:"POST",body:payload})}async function activateSigningKey(client,issuerId,keyId,payload){return client.fetch(`${keyPath(issuerId,keyId)}/activate`,{method:"POST",body:payload})}async function revokeSigningKey(client,issuerId,keyId){return client.fetch(`${keyPath(issuerId,keyId)}/revoke`,{method:"POST",body:{}})}async function resolveIssuerForKeySource(client,issuerId,options){client.nonInteractive||output_manager_default.spinner(`Fetching issuer ${issuerId}`);let issuer;try{issuer=await getIssuer(client,issuerId)}catch(err){output_manager_default.stopSpinner();let handled=handleIssuerLookupError(client,err,issuerId,options);if(handled!==void 0)return handled;throw err}output_manager_default.stopSpinner();let takesImportedKeys=issuer.origin==="external";return takesImportedKeys&&options.source==="generated"?rejectMismatch(client,{reason:AGENT_REASON.ISSUER_REQUIRES_IMPORTED_KEY,message:`Issuer ${issuerId} was created from a key you imported, so its keys must be imported too.`,command:`kms import-key ${issuerId} --key <file>`,when:"Import the next signing key"}):!takesImportedKeys&&options.source==="imported"?rejectMismatch(client,{reason:AGENT_REASON.ISSUER_REQUIRES_GENERATED_KEY,message:`Vercel generates the signing keys for issuer ${issuerId}, so a key cannot be imported into it.`,command:`kms add-key ${issuerId}`,when:"Add a Vercel-generated key instead"}):issuer}function rejectMismatch(client,options){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:options.reason,message:options.message,next:[{command:kmsSuggestion(options.command,client.argv),when:options.when}]},1),output_manager_default.error(options.message),output_manager_default.log(`Run ${getCommandName(options.command)} instead.`),1}function handleIssuerLookupError(client,err,issuerId,options){return handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:options.attempted,contextName:options.contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]})}var KmsAddKeyTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliOptionActivation(activation){activation&&this.trackCliOption({option:"activation",value:activation})}trackCliOptionRevokePreviousAfterHours(hours){hours!==void 0&&this.trackCliOption({option:"revoke-previous-after-hours",value:String(hours)})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE7="kms add-key <issuerId>",ACTIVATION_MODES=["automatic","manual"];async function addKey(client,argv){let telemetry=new KmsAddKeyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addKeySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliOptionActivation(opts["--activation"]),telemetry.trackCliOptionRevokePreviousAfterHours(opts["--revoke-previous-after-hours"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE7});if(args.length>1)return invalidArgumentCount(client,USAGE7);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,activation=opts["--activation"];if(activation&&!ACTIVATION_MODES.includes(activation))return invalidInput(client,`Invalid activation mode "${activation}". Use ${ACTIVATION_MODES.join(" or ")}.`);let revokePreviousAfterHours=opts["--revoke-previous-after-hours"],revokePreviousAfterHoursError=validateRevokePreviousAfterHours(revokePreviousAfterHours);if(revokePreviousAfterHoursError)return invalidInput(client,revokePreviousAfterHoursError);let payload={...activation&&{activation},...revokePreviousAfterHours!==void 0&&{revokePreviousAfterHours}},contextName=await getContextName(client),attempted="Adding a signing key",issuer=await resolveIssuerForKeySource(client,issuerId,{source:"generated",attempted,contextName});if(typeof issuer=="number")return issuer;client.nonInteractive||output_manager_default.spinner(`Adding a signing key to ${issuerId}`);let key;try{key=await createSigningKey(client,issuerId,payload)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted,contextName});if(handled!==void 0)return handled;throw err}output_manager_default.stopSpinner();let activateCommand=`kms activate-key ${issuerId} ${key.keyId}`,isManual=key.status==="pending"&&!key.activateAt;if(asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,signingKey:key,message:`Signing key ${key.keyId} added to issuer ${issuerId}.`,next:isManual?[{command:getCommandNamePlain(activateCommand),when:"Start signing with this key"}]:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Check when the key becomes active"}]}:key;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
90
+ `),0}return printSigningKeyRows(key,{label:"Added",gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),output_manager_default.print(`
91
+ `),isManual?output_manager_default.log(`The key is staged and not signing yet. Activate it: ${getCommandName(activateCommand)}`):output_manager_default.log(`The key starts signing once its public key propagates. Check status: ${getCommandName(`kms inspect ${issuerId}`)}`),0}var KmsImportKeyTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliOptionKey(key){key&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionKeyId(keyId){keyId&&this.trackCliOption({option:"key-id",value:this.redactedValue})}trackCliOptionActivation(activation){activation&&this.trackCliOption({option:"activation",value:activation})}trackCliOptionRevokePreviousAfterHours(hours){hours!==void 0&&this.trackCliOption({option:"revoke-previous-after-hours",value:String(hours)})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE8="kms import-key <issuerId> --key <file>",ACTIVATION_MODES2=["automatic","manual"];async function importKey(client,argv){let telemetry=new KmsImportKeyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(importKeySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliOptionKey(opts["--key"]),telemetry.trackCliOptionKeyId(opts["--key-id"]),telemetry.trackCliOptionActivation(opts["--activation"]),telemetry.trackCliOptionRevokePreviousAfterHours(opts["--revoke-previous-after-hours"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE8});if(args.length>1)return invalidArgumentCount(client,USAGE8);let keyFlag=opts["--key"];if(!keyFlag)return missingArgument(client,{reason:AGENT_REASON.MISSING_KEY,message:"A private key is required. Pass --key with a path to a PEM file, or `-` to read it from stdin.",usage:USAGE8});let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,activation=opts["--activation"];if(activation&&!ACTIVATION_MODES2.includes(activation))return invalidInput(client,`Invalid activation mode "${activation}". Use ${ACTIVATION_MODES2.join(" or ")}.`);let revokePreviousAfterHours=opts["--revoke-previous-after-hours"],revokePreviousAfterHoursError=validateRevokePreviousAfterHours(revokePreviousAfterHours);if(revokePreviousAfterHoursError)return invalidInput(client,revokePreviousAfterHoursError);let importKeyPem;try{importKeyPem=await readPrivateKey(client,keyFlag)}catch(err){return invalidInput(client,err.message)}let keyId=opts["--key-id"],payload={importKey:importKeyPem,...keyId&&{importKeyId:keyId},...activation&&{activation},...revokePreviousAfterHours!==void 0&&{revokePreviousAfterHours}},contextName=await getContextName(client),attempted="Importing a signing key",issuer=await resolveIssuerForKeySource(client,issuerId,{source:"imported",attempted,contextName});if(typeof issuer=="number")return issuer;client.nonInteractive||output_manager_default.spinner(`Importing a signing key into ${issuerId}`);let key;try{key=await createSigningKey(client,issuerId,payload)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted,contextName});if(handled!==void 0)return handled;throw err}output_manager_default.stopSpinner();let activateCommand=`kms activate-key ${issuerId} ${key.keyId}`,isManual=key.status==="pending"&&!key.activateAt;if(asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,signingKey:key,message:`Signing key ${key.keyId} imported into issuer ${issuerId}.`,next:isManual?[{command:getCommandNamePlain(activateCommand),when:"Start signing with this key"}]:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Check when the key becomes active"}]}:key;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
92
+ `),0}return printSigningKeyRows(key,{label:"Imported",gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),output_manager_default.print(`
93
+ `),isManual?output_manager_default.log(`The key is staged and not signing yet. Activate it: ${getCommandName(activateCommand)}`):output_manager_default.log(`The key starts signing once its public key propagates. Check status: ${getCommandName(`kms inspect ${issuerId}`)}`),0}var KmsActivateKeyTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliArgumentKeyId(keyId){keyId&&this.trackCliArgument({arg:"keyId",value:this.redactedValue})}trackCliOptionRevokePreviousAfterHours(hours){hours!==void 0&&this.trackCliOption({option:"revoke-previous-after-hours",value:String(hours)})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE9="kms activate-key <issuerId> <keyId>";async function activateKey(client,argv){let telemetry=new KmsActivateKeyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activateKeySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId,keyId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliArgumentKeyId(keyId),telemetry.trackCliOptionRevokePreviousAfterHours(opts["--revoke-previous-after-hours"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE9});if(!keyId)return missingArgument(client,{reason:AGENT_REASON.MISSING_KEY_ID,message:`A key ID is required. Run ${getCommandNamePlain(`kms inspect ${issuerId}`)} to list the issuer's keys.`,usage:USAGE9});if(args.length>2)return invalidArgumentCount(client,USAGE9);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,revokePreviousAfterHours=opts["--revoke-previous-after-hours"],revokePreviousAfterHoursError=validateRevokePreviousAfterHours(revokePreviousAfterHours);if(revokePreviousAfterHoursError)return invalidInput(client,revokePreviousAfterHoursError);let contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Activating key ${keyId}`);let key;try{key=await activateSigningKey(client,issuerId,keyId,{...revokePreviousAfterHours!==void 0&&{revokePreviousAfterHours}})}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Key not found: ${keyId} on issuer ${issuerId}.`,attempted:"Activating a signing key",contextName,next:[{command:kmsSuggestion(`kms inspect ${issuerId}`,client.argv),when:"List the issuer's keys"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,signingKey:key,message:`Signing key ${key.keyId} activated.`,next:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Show the issuer and its keys"}]}:key;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
94
+ `),0}return printSigningKeyRows(key,{label:"Activated",gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),output_manager_default.print(`
95
+ `),output_manager_default.log(`The previous key keeps verifying until its grace period ends. Check status: ${getCommandName(`kms inspect ${issuerId}`)}`),0}var KmsRevokeKeyTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliArgumentKeyId(keyId){keyId&&this.trackCliArgument({arg:"keyId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var USAGE10="kms revoke-key <issuerId> <keyId>";async function revokeKey(client,argv){let telemetry=new KmsRevokeKeyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(revokeKeySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId,keyId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliArgumentKeyId(keyId),telemetry.trackCliFlagYes(opts["--yes"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:`${USAGE10} --yes`});if(!keyId)return missingArgument(client,{reason:AGENT_REASON.MISSING_KEY_ID,message:`A key ID is required. Run ${getCommandNamePlain(`kms inspect ${issuerId}`)} to list the issuer's keys.`,usage:`${USAGE10} --yes`});if(args.length>2)return invalidArgumentCount(client,USAGE10);let skipConfirmation=opts["--yes"]||!1;client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"Revoking a key ends its grace period immediately, so tokens it signed stop verifying. Re-run with --yes to confirm.",next:[{command:buildCommandWithYes(client.argv)}]},1);let contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Fetching issuer ${issuerId}`);let issuer;try{issuer=await getIssuer(client,issuerId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:"Revoking a signing key",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]});if(handled!==void 0)return handled;throw err}output_manager_default.stopSpinner();let key=issuer.signingKeys.find(candidate=>candidate.keyId===keyId),inspectCommand=kmsSuggestion(`kms inspect ${issuerId}`,client.argv);if(!key){let message=`Key not found: ${keyId} on issuer ${issuerId}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_FOUND,message,next:[{command:inspectCommand,when:"List the issuer's keys"}]},1),output_manager_default.error(message),output_manager_default.log(`Run ${getCommandName(`kms inspect ${issuerId}`)} to list its keys.`),1}if(key.status!=="revoking"){let message=`Key ${keyId} is ${key.status}, not scheduled for revocation. Only a key already retiring can be revoked immediately; activate a replacement key first.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.KEY_NOT_REVOKING,message,next:[{command:kmsSuggestion(`kms add-key ${issuerId}`,client.argv),when:"Rotate to a new key, which retires this one"}]},1),output_manager_default.error(message),1}if(!skipConfirmation&&(printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Key",key.keyId),printAlignedLabel("Status",describeKeyStatus(key)),output_manager_default.print(`
96
+ `),!await client.input.confirm(`Revoke ${param(key.keyId)} now? Tokens it signed stop verifying.`,!1)))return output_manager_default.log("Canceled"),0;client.nonInteractive||output_manager_default.spinner(`Revoking key ${key.keyId}`);let updated;try{updated=await revokeSigningKey(client,issuerId,key.keyId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Key not found: ${key.keyId} on issuer ${issuerId}.`,attempted:"Revoking a signing key",contextName});if(handled!==void 0)return handled;throw err}return output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,issuer:updated,message:`Signing key ${key.keyId} revoked.`,next:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Show the issuer's remaining keys"}]},null,2)}
97
+ `),0):(printAlignedLabel("Revoked",key.keyId,{gutter:"\u2713"}),printAlignedLabel("Issuer",updated.id),printAlignedLabel("Signing Keys",String(updated.signingKeys.length)),0)}var import_chalk13=__toESM(require_source(),1);function policiesPath(issuerId){return`/v1/kms/issuers/${encodeURIComponent(issuerId)}/policies`}function projectGrantPath(issuerId,projectId){return`${policiesPath(issuerId)}/${PROJECT_GRANT_POLICY_KIND}/${encodeURIComponent(projectId)}`}async function createProjectGrant(client,issuerId,payload){return client.fetch(policiesPath(issuerId),{method:"POST",body:{kind:PROJECT_GRANT_POLICY_KIND,...payload}})}async function updateProjectGrant(client,issuerId,projectId,payload){return client.fetch(projectGrantPath(issuerId,projectId),{method:"PATCH",body:payload})}async function deleteProjectGrant(client,issuerId,projectId){await client.fetch(projectGrantPath(issuerId,projectId),{method:"DELETE"})}var SYSTEM_ENVIRONMENTS=["production","preview","development"],CUSTOM_ENVIRONMENT_ID_PREFIX="env_";function isSystemEnvironment(value){return SYSTEM_ENVIRONMENTS.includes(value)}function isCustomEnvironmentId(value){return value.startsWith(CUSTOM_ENVIRONMENT_ID_PREFIX)&&value.length>CUSTOM_ENVIRONMENT_ID_PREFIX.length}function findInvalidEnvironments(environments){return environments.filter(value=>!isSystemEnvironment(value)&&!isCustomEnvironmentId(value))}function invalidEnvironmentsMessage(invalid){return`Invalid ${invalid.length===1?"environment":"environments"}: ${invalid.join(", ")}. Pass a system environment (${SYSTEM_ENVIRONMENTS.join(", ")}) or a custom environment ID (starts with "${CUSTOM_ENVIRONMENT_ID_PREFIX}"). Custom environments are granted by ID, not name.`}var KmsAddGrantTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliOptionProject(project){project&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(environments){environments&&environments.length>0&&this.trackCliOption({option:"environment",value:String(environments.length)})}trackCliOptionTokenClaims(tokenClaims){tokenClaims&&this.trackCliOption({option:"token-claims",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE11="kms add-grant <issuerId> [--project <project>] --environment <environment>";async function addGrant(client,argv){let telemetry=new KmsAddGrantTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addGrantSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliOptionProject(opts["--project"]),telemetry.trackCliOptionEnvironment(opts["--environment"]),telemetry.trackCliOptionTokenClaims(opts["--token-claims"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE11});if(args.length>1)return invalidArgumentCount(client,USAGE11);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,projectFlag=opts["--project"],projectId,scope;if(projectFlag){scope=await getScope(client);let resolved;try{resolved=await getProjectByNameOrId(client,projectFlag,scope.team?.id)}catch(err){if(isAPIError(err))return invalidInput(client,err.serverMessage||`Couldn't look up project "${projectFlag}" in ${scope.contextName} (${err.status}).`);throw err}if(resolved instanceof ProjectNotFound)return invalidInput(client,`Project "${projectFlag}" was not found in ${scope.contextName}.`);projectId=resolved.id}else{let linked=await getLinkedProject(client);if(linked.status==="error")return linked.exitCode;if(linked.status!=="linked")return missingArgument(client,{reason:AGENT_REASON.MISSING_PROJECT,message:"A project is required. Pass --project <name-or-id>, or run `vercel link` to link this directory to a project.",usage:USAGE11});projectId=linked.project.id}let environments=Array.from(new Set(opts["--environment"]??[]));if(environments.length===0)return missingArgument(client,{reason:AGENT_REASON.MISSING_ENVIRONMENT,message:"At least one environment is required. Pass --environment production, and repeat the flag for more.",usage:USAGE11});let invalidEnvironments=findInvalidEnvironments(environments);if(invalidEnvironments.length>0)return invalidInput(client,invalidEnvironmentsMessage(invalidEnvironments));let tokenClaims;if(opts["--token-claims"])try{tokenClaims=await parseJsonObjectFlag(client,"--token-claims",opts["--token-claims"])}catch(err){return invalidInput(client,err.message)}let{contextName}=scope??await getScope(client);client.nonInteractive||output_manager_default.spinner(`Granting ${projectId} access to ${issuerId}`);let grant;try{grant=await createProjectGrant(client,issuerId,{projectId,environments,...tokenClaims&&{tokenClaims}})}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Couldn't find issuer ${issuerId} or project ${projectId} in ${contextName}.`,attempted:"Adding a project grant",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"},{command:kmsSuggestion("project ls",client.argv),when:"List projects to find the right ID"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,grant,message:`Project ${projectId} can now sign with issuer ${issuerId}.`,next:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Show the issuer's grants"}]}:grant;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
98
+ `),0}return printAlignedLabel("Granted",grant.projectId,{gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),printAlignedLabel("Environments",grant.environments.join(", ")),printAlignedLabel("Token Claims",grant.tokenClaims?"set":import_chalk13.default.gray("none")),output_manager_default.print(`
99
+ `),output_manager_default.log(`Deployments in ${grant.environments.join(" and ")} can now sign with this issuer. Inspect it: ${getCommandName(`kms inspect ${issuerId}`)}`),0}var import_chalk14=__toESM(require_source(),1);var KmsUpdateGrantTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliArgumentProjectId(projectId){projectId&&this.trackCliArgument({arg:"projectId",value:this.redactedValue})}trackCliOptionEnvironment(environments){environments&&environments.length>0&&this.trackCliOption({option:"environment",value:String(environments.length)})}trackCliOptionTokenClaims(tokenClaims){tokenClaims&&this.trackCliOption({option:"token-claims",value:this.redactedValue})}trackCliFlagRemoveTokenClaims(removeTokenClaims){removeTokenClaims&&this.trackCliFlag("remove-token-claims")}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE12="kms update-grant <issuerId> <projectId>";async function updateGrant(client,argv){let telemetry=new KmsUpdateGrantTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(updateGrantSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId,projectId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliArgumentProjectId(projectId),telemetry.trackCliOptionEnvironment(opts["--environment"]),telemetry.trackCliOptionTokenClaims(opts["--token-claims"]),telemetry.trackCliFlagRemoveTokenClaims(opts["--remove-token-claims"]),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:USAGE12});if(!projectId)return missingArgument(client,{reason:AGENT_REASON.MISSING_PROJECT,message:`A project ID is required. Run ${getCommandNamePlain(`kms inspect ${issuerId}`)} to list the issuer's grants.`,usage:USAGE12});if(args.length>2)return invalidArgumentCount(client,USAGE12);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,tokenClaimsFlag=opts["--token-claims"],removeTokenClaims=opts["--remove-token-claims"],environments=opts["--environment"]?Array.from(new Set(opts["--environment"])):void 0;if(tokenClaimsFlag&&removeTokenClaims)return invalidInput(client,"--token-claims and --remove-token-claims conflict. Pass one or the other.");if(!environments&&!tokenClaimsFlag&&!removeTokenClaims)return invalidInput(client,"Nothing to update. Pass --environment, --token-claims, or --remove-token-claims.");if(environments){let invalidEnvironments=findInvalidEnvironments(environments);if(invalidEnvironments.length>0)return invalidInput(client,invalidEnvironmentsMessage(invalidEnvironments))}let tokenClaims;if(tokenClaimsFlag)try{tokenClaims=await parseJsonObjectFlag(client,"--token-claims",tokenClaimsFlag)}catch(err){return invalidInput(client,err.message)}let payload={...environments&&{environments},...tokenClaims&&{tokenClaims},...removeTokenClaims&&{tokenClaims:null}},contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Updating grant for ${projectId} on ${issuerId}`);let grant;try{grant=await updateProjectGrant(client,issuerId,projectId,payload)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Couldn't find a grant for project ${projectId} on issuer ${issuerId}.`,attempted:"Updating a project grant",contextName,next:[{command:kmsSuggestion(`kms inspect ${issuerId}`,client.argv),when:"List the issuer's grants"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,grant,message:`Grant for project ${grant.projectId} updated.`,next:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Show the issuer's grants"}]}:grant;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
100
+ `),0}return printAlignedLabel("Updated",grant.projectId,{gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),printAlignedLabel("Environments",grant.environments.join(", ")),printAlignedLabel("Token Claims",grant.tokenClaims?"set":import_chalk14.default.gray("none")),output_manager_default.print(`
101
+ `),output_manager_default.log(`Inspect the issuer: ${getCommandName(`kms inspect ${issuerId}`)}`),0}var KmsRmGrantTelemetryClient=class extends TelemetryClient{trackCliArgumentIssuerId(issuerId){issuerId&&this.trackCliArgument({arg:"issuerId",value:this.redactedValue})}trackCliArgumentProjectId(projectId){projectId&&this.trackCliArgument({arg:"projectId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var USAGE13="kms remove-grant <issuerId> <projectId>";async function rmGrant(client,argv){let telemetry=new KmsRmGrantTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeGrantSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[issuerId,projectId]=args;if(telemetry.trackCliArgumentIssuerId(issuerId),telemetry.trackCliArgumentProjectId(projectId),telemetry.trackCliFlagYes(opts["--yes"]),!issuerId)return missingArgument(client,{reason:AGENT_REASON.MISSING_ISSUER_ID,message:"An issuer ID is required.",usage:`${USAGE13} --yes`});if(!projectId)return missingArgument(client,{reason:AGENT_REASON.MISSING_PROJECT,message:`A project ID is required. Run ${getCommandNamePlain(`kms inspect ${issuerId}`)} to list the issuer's grants.`,usage:`${USAGE13} --yes`});if(args.length>2)return invalidArgumentCount(client,USAGE13);let skipConfirmation=opts["--yes"]||!1;client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"Removing a grant stops the project from signing new tokens with this issuer. Re-run with --yes to confirm.",next:[{command:buildCommandWithYes(client.argv)}]},1);let contextName=await getContextName(client),grant;if(!skipConfirmation){output_manager_default.spinner(`Fetching issuer ${issuerId}`);let issuer;try{issuer=await getIssuer(client,issuerId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`Issuer not found: ${issuerId}.`,attempted:"Removing a project grant",contextName,next:[{command:kmsSuggestion("kms ls",client.argv),when:"List issuers in this team"}]});if(handled!==void 0)return handled;throw err}if(output_manager_default.stopSpinner(),grant=issuer.policies.filter(isProjectGrant).find(policy=>policy.projectId===projectId),!grant){let message=`No grant for project ${projectId} on issuer ${issuerId}.`;return output_manager_default.error(message),output_manager_default.log(`Run ${getCommandName(`kms inspect ${issuerId}`)} to list its grants.`),1}if(printAlignedLabel("Issuer",issuer.id),printAlignedLabel("Project",grant.projectId),printAlignedLabel("Environments",grant.environments.join(", ")),output_manager_default.print(`
102
+ `),!await client.input.confirm(`Remove ${param(grant.projectId)}'s access to this issuer?`,!1))return output_manager_default.log("Canceled"),0}client.nonInteractive||output_manager_default.spinner(`Removing grant for ${projectId}`);try{await deleteProjectGrant(client,issuerId,projectId)}catch(err){output_manager_default.stopSpinner();let handled=handleKmsApiError(client,err,{notFound:`No grant for project ${projectId} on issuer ${issuerId}.`,attempted:"Removing a project grant",contextName,next:[{command:kmsSuggestion(`kms inspect ${issuerId}`,client.argv),when:"List the issuer's grants"}]});if(handled!==void 0)return handled;throw err}return output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,grant:{issuerId,projectId},message:`Grant for project ${projectId} removed.`,next:[{command:getCommandNamePlain(`kms inspect ${issuerId}`),when:"Show the issuer's remaining grants"}]},null,2)}
103
+ `),0):(printAlignedLabel("Removed",projectId,{gutter:"\u2713"}),printAlignedLabel("Issuer",issuerId),printAlignedLabel("Team",contextName),0)}var COMMAND_CONFIG2={list:getCommandAliases(listSubcommand3),inspect:getCommandAliases(inspectSubcommand3),add:getCommandAliases(addSubcommand),import:getCommandAliases(importSubcommand),update:getCommandAliases(updateSubcommand2),delete:getCommandAliases(removeSubcommand),"add-key":getCommandAliases(addKeySubcommand),"import-key":getCommandAliases(importKeySubcommand),"activate-key":getCommandAliases(activateKeySubcommand),"revoke-key":getCommandAliases(revokeKeySubcommand),"add-grant":getCommandAliases(addGrantSubcommand),"update-grant":getCommandAliases(updateGrantSubcommand),"remove-grant":getCommandAliases(removeGrantSubcommand)};async function main(client){let parsedArgs,flagsSpecification=getFlagsSpecification(kmsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry=new KmsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand2(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("kms"),output_manager_default.print(help(kmsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:kmsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(listSubcommand3)):(telemetry.trackCliSubcommandList(subcommandOriginal),ls(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(inspectSubcommand3)):(telemetry.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"kms get","kms inspect"),inspect2(client,args));case"add":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addSubcommand)):(telemetry.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"kms add","kms create"),add(client,args));case"import":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(importSubcommand)):(telemetry.trackCliSubcommandImport(subcommandOriginal),importIssuer(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(updateSubcommand2)):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),update(client,args));case"delete":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(removeSubcommand)):(telemetry.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"kms remove","kms delete"),rm(client,args));case"add-key":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addKeySubcommand)):(telemetry.trackCliSubcommandAddKey(subcommandOriginal),addKey(client,args));case"import-key":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(importKeySubcommand)):(telemetry.trackCliSubcommandImportKey(subcommandOriginal),importKey(client,args));case"activate-key":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(activateKeySubcommand)):(telemetry.trackCliSubcommandActivateKey(subcommandOriginal),activateKey(client,args));case"revoke-key":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(revokeKeySubcommand)):(telemetry.trackCliSubcommandRevokeKey(subcommandOriginal),revokeKey(client,args));case"add-grant":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(addGrantSubcommand)):(telemetry.trackCliSubcommandAddGrant(subcommandOriginal),addGrant(client,args));case"update-grant":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(updateGrantSubcommand)):(telemetry.trackCliSubcommandUpdateGrant(subcommandOriginal),updateGrant(client,args));case"remove-grant":return needHelp?(telemetry.trackCliFlagHelp("kms",subcommandOriginal),printHelp(removeGrantSubcommand)):(telemetry.trackCliSubcommandRemoveGrant(subcommandOriginal),subcommandOriginal!=="remove-grant"&&warnDeprecatedSubcommand(client,`kms ${subcommandOriginal}`,"kms remove-grant"),rmGrant(client,args));default:return args.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG2)),output_manager_default.print(help(kmsCommand,{columns:client.stderr.columns})),2):(telemetry.trackCliSubcommandList(subcommandOriginal),ls(client,args))}}var import_chalk15=__toESM(require_source(),1);import{join}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var MicrofrontendsPullTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionDeployment(value){value&&this.trackCliOption({option:"deployment",value:this.redactedValue})}trackCliOptionDpl(value){value&&this.trackCliOption({option:"dpl",value:this.redactedValue})}};var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry=new MicrofrontendsPullTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliOptionDeployment(parsedArgs.flags["--deployment"]),telemetry.trackCliOptionDpl(parsedArgs.flags["--dpl"]);let deployment=getRenamedOption(parsedArgs.flags,"--deployment","--dpl");if("error"in deployment)return reportRenamedOptionError(client,deployment.error);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=join(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let contextName=await getContextName(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk15.default.bold(contextName)}`);let rawConfig,deploymentId=deployment.value;try{if(deploymentId){let{config}=await client.fetch(`/v1/microfrontends/${deploymentId}/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 path=join(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS);await(0,import_fs_extra.outputJSON)(path,sanitizedConfig,{spaces:2});let microfrontendsStamp=stamp_default();return output_manager_default.print(`${prependEmoji(`Downloaded microfrontends configuration to ${import_chalk15.default.bold(humanizePath(join(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk15.default.gray(microfrontendsStamp())}`,emoji("success"))}
104
+ `),0}catch(error){return output_manager_default.stopSpinner(),printError(error),1}}var import_chalk16=__toESM(require_source(),1);import{writeFile}from"fs/promises";import{existsSync}from"fs";import{join as join2}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(path){if(!path||!path.startsWith("/"))return"Route must start with /";if(/\s/.test(path))return"Route must not contain spaces";if(path.includes("?")||path.includes("#"))return"Route must not contain query strings or fragments";try{new URL(path,"http://n")}catch{return"Route is not a valid URL path"}return!0}function validateRoutingPath(path){return!path||!path.startsWith("/")?"Path must start with /. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":/\s/.test(path)?"Path must not contain spaces. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":!0}var MAX_GROUP_NAME_LENGTH=48;async function createGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(createGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let teamSlug=team.slug;output_manager_default.log("A microfrontends group allows multiple projects to be composed into one application with a seamless user experience."),output_manager_default.log(`Creating a new microfrontends group for team ${import_chalk16.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((count,g)=>count+g.projects.length,0),freeProjects=2;if(isLimitedPlan&&existingMfeProjectCount+1>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=`https://vercel.com/${teamSlug}/~/settings/billing`;return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}let nameFlag=parsedArgs.flags["--name"],projectFlags=parsedArgs.flags["--project"],defaultAppFlag=parsedArgs.flags["--default-app"],defaultRouteFlag=parsedArgs.flags["--default-route"],projectDefaultRouteFlags=parsedArgs.flags["--project-default-route"],autoConfirm=!!parsedArgs.flags["--yes"],isNonInteractive=client.nonInteractive||client.argv.includes("--non-interactive");if(isNonInteractive){if(!nameFlag)return output_manager_default.error("Missing required flag --name. Use --name in non-interactive mode."),2;if(!projectFlags||projectFlags.length===0)return output_manager_default.error("Missing required flag --project. Use --project in non-interactive mode."),2;if(projectFlags.length>1&&!defaultAppFlag)return output_manager_default.error("Missing required flag --default-app when using multiple --project values in non-interactive mode."),2}let projectsToAddCount=projectFlags?.length??1;if(existingMfeProjectCount+projectsToAddCount>freeProjects){if(isNonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends create-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());return outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Creating a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1),1}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let groupName;if(nameFlag){let validation=validateGroupName(nameFlag,groups);if(validation!==!0)return output_manager_default.error(validation),1;groupName=nameFlag}else groupName=await client.input.text({message:"Group name:",validate:val=>validateGroupName(val,groups)});let selectedProjects;if(projectFlags){selectedProjects=[];for(let name of projectFlags)try{let project=await getProjectByNameOrId(client,name,team.id);if(project instanceof ProjectNotFound)return output_manager_default.error(`Project "${name}" not found.`),1;selectedProjects.push(project)}catch{return output_manager_default.error(`Project "${name}" not found.`),1}}else{output_manager_default.spinner("Fetching projects\u2026");let firstPage=await client.fetch(`/v9/projects?limit=100&teamId=${team.id}`,{method:"GET"});output_manager_default.stopSpinner();let allProjects=firstPage.projects,hasMoreProjects=firstPage.pagination.next!==null,availableProjects=allProjects.filter(p=>!isProjectInMicrofrontendsGroup(p,groups));selectedProjects=[];let addMore=!0;for(;addMore;){let project;if(hasMoreProjects)await client.input.text({message:selectedProjects.length===0?"Type a project name to add:":"Type another project name to add:",validate:async val=>{if(!val)return"Project name cannot be empty";let result=await getProjectByNameOrId(client,val,team.id);return result instanceof ProjectNotFound?"Project not found":isProjectInMicrofrontendsGroup(result,groups)?`Project "${val}" is already in a microfrontends group`:selectedProjects.some(s=>s.id===result.id)?`Project "${val}" is already selected`:(project=result,!0)}});else{if(availableProjects.length===0){if(selectedProjects.length===0)return output_manager_default.error("No available projects. All projects are already in a microfrontends group."),1;break}let remaining=availableProjects.filter(p=>!selectedProjects.some(s=>s.id===p.id));if(remaining.length===0)break;let projectId=await client.input.select({message:selectedProjects.length===0?"Select a project to add:":"Select another project to add:",choices:remaining.map(p=>({name:p.name,value:p.id}))});project=availableProjects.find(p=>p.id===projectId)}project&&selectedProjects.push(project),addMore=await client.input.confirm("Add another project?",!1)}if(selectedProjects.length===0)return output_manager_default.error("At least one project must be selected."),1}if(selectedProjects.length>maxMicrofrontendsPerGroup)return output_manager_default.error(`Cannot add more than ${maxMicrofrontendsPerGroup} projects to a group.`),1;let defaultApp;if(defaultAppFlag){let found=selectedProjects.find(p=>p.name===defaultAppFlag);if(!found)return output_manager_default.error(`Default app "${defaultAppFlag}" must be one of the selected projects.`),2;defaultApp=found}else if(selectedProjects.length===1)defaultApp=selectedProjects[0];else{let defaultAppId=await client.input.select({message:"Select the default application:",choices:selectedProjects.map(p=>({name:p.name,value:p.id}))});defaultApp=selectedProjects.find(p=>p.id===defaultAppId)}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else defaultRoute="/";let otherProjects=selectedProjects.filter(p=>p.id!==defaultApp.id),parsedProjectDefaultRoutes=parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp);if(typeof parsedProjectDefaultRoutes=="string")return output_manager_default.error(parsedProjectDefaultRoutes),1;let otherApplications=[];for(let project of otherProjects){let routeFromFlag=parsedProjectDefaultRoutes.get(project.id),route2;if(routeFromFlag)route2=routeFromFlag;else{if(isNonInteractive)return output_manager_default.error(`Missing required flag --project-default-route for "${project.name}". Use --project-default-route=${project.name}=/<path> in non-interactive mode.`),2;route2=await client.input.text({message:`Default route for "${project.name}":`,validate:validateDefaultRoute})}otherApplications.push({projectId:project.id,defaultRoute:route2})}let newProjectCount=selectedProjects.length,totalAfter=existingMfeProjectCount+newProjectCount;output_manager_default.log(""),output_manager_default.log(import_chalk16.default.bold("Billing")),output_manager_default.log(` ${import_chalk16.default.bold("Team:")} ${teamSlug}`),output_manager_default.log(` ${import_chalk16.default.bold("Adding:")} ${newProjectCount} microfrontends project${newProjectCount>1?"s":""}`);let projectFee;if(totalAfter<=freeProjects)projectFee=import_chalk16.default.green("Free")+` (first ${freeProjects} included)`;else if(existingMfeProjectCount>=freeProjects)projectFee=import_chalk16.default.yellow(`$250.00/month x ${newProjectCount}`)+` project${newProjectCount>1?"s":""}`;else{let freeRemaining=freeProjects-existingMfeProjectCount,paidProjects=newProjectCount-freeRemaining;projectFee=import_chalk16.default.green(`${freeRemaining} free`)+", "+import_chalk16.default.yellow(`$250.00/month x ${paidProjects}`)}if(output_manager_default.log(` ${import_chalk16.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk16.default.bold("Request fee:")} ${import_chalk16.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_chalk16.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_chalk16.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_chalk16.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?join2(repoRoot,linkedProject.rootDirectory||""):client.cwd,configPath=join2(projectDir,"microfrontends.json");if(!existsSync(configPath)&&(output_manager_default.log(""),output_manager_default.log(`No changes to production traffic will take effect until a ${import_chalk16.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_chalk16.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 writeFile(configPath,config+`
105
+ `,"utf-8"),output_manager_default.success(`Created ${import_chalk16.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_chalk16.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 entry of projectDefaultRouteFlags){let separatorIndex=entry.indexOf("=");if(separatorIndex<=0||separatorIndex===entry.length-1)return`Invalid --project-default-route value "${entry}". Use "<project>=<route>", for example "docs=/docs".`;let projectIdentifier=entry.slice(0,separatorIndex).trim(),route2=entry.slice(separatorIndex+1).trim();if(!projectIdentifier||!route2)return`Invalid --project-default-route value "${entry}". 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 "${entry}". Project "${projectIdentifier}" is not one of the selected projects.`;if(project.id===defaultApp.id)return`Invalid --project-default-route value "${entry}". Use --default-route for the default app "${defaultApp.name}".`;let routeValidation=validateDefaultRoute(route2);if(routeValidation!==!0)return`Invalid --project-default-route value "${entry}": ${routeValidation}`;if(routeByProjectId.has(project.id))return`Duplicate --project-default-route for project "${project.name}".`;routeByProjectId.set(project.id,route2)}return routeByProjectId}var import_chalk17=__toESM(require_source(),1);async function addToGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(addToGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let context=await ensureMicrofrontendsContext(client);if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsPerGroup}=groupsResponse,existingGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(existingGroup)return output_manager_default.error(`Project "${project.name}" is already part of the microfrontends group "${existingGroup.group.name}". A project cannot be in more than one microfrontends group.`),1;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. Create one first with `vercel microfrontends create-group`."),1;let existingMfeProjectCount=groups.reduce((count,g)=>count+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_chalk17.default.bold(project.name)} to a microfrontends group on ${import_chalk17.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_chalk17.default.bold("Billing")),output_manager_default.log(` ${import_chalk17.default.bold("Team:")} ${teamSlug}`);let projectFee;if(totalAfter<=freeProjects?projectFee=import_chalk17.default.green("Free")+` (first ${freeProjects} included)`:existingMfeProjectCount>=freeProjects?projectFee=import_chalk17.default.yellow("$250.00/month"):projectFee=import_chalk17.default.yellow("$250.00/month")+` (${freeProjects} free projects used)`,output_manager_default.log(` ${import_chalk17.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk17.default.bold("Request fee:")} ${import_chalk17.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_chalk17.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`):output_manager_default.log(`By proceeding, ${import_chalk17.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_chalk17.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_chalk18=__toESM(require_source(),1);async function removeFromGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(removeFromGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],context=await ensureMicrofrontendsContext(client,{autoConfirm});if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse,projectGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(!projectGroup)return output_manager_default.error(`Project "${project.name}" is not part of any microfrontends group.`),1;if(projectGroup.projects.find(p=>p.id===project.id)?.microfrontends?.isDefaultApp)return output_manager_default.error(`Project "${project.name}" is the default app for group "${projectGroup.group.name}" and cannot be removed. To remove it, first change the default app in the dashboard.`),1;if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Removing "${project.name}" from microfrontends group "${projectGroup.group.name}" requires confirmation. Use --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;output_manager_default.log(`Removing project ${import_chalk18.default.bold(project.name)} from microfrontends group ${import_chalk18.default.bold(projectGroup.group.name)} on ${import_chalk18.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_chalk18.default.gray(removeStamp())}`),isReferencedInConfig&&output_manager_default.log(`Remember to remove "${project.name}" from your microfrontends.json configuration.`),0}var import_chalk19=__toESM(require_source(),1);async function deleteGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deleteGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],groupFlag=parsedArgs.flags["--group"];if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a microfrontends group requires confirmation. Use --yes and --group to confirm.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm deletion"}]},1),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. There is nothing to delete."),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0,linkedGroup=linkedProject?groups.find(g=>g.projects.some(p=>p.id===linkedProject.id&&p.microfrontends?.isDefaultApp)):void 0;if(linkedGroup&&client.stdin.isTTY)if(await client.input.confirm(`Delete microfrontends group "${linkedGroup.group.name}" (linked to ${import_chalk19.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_chalk19.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_chalk19.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_chalk19.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_chalk19.default.gray(deleteStamp())}`),0}import{existsSync as existsSync2}from"fs";import{join as join3}from"path";var import_chalk20=__toESM(require_source(),1);async function inspectGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(inspectGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error("error"in formatResult?formatResult.error:"Invalid output format"),2;let asJson=formatResult.jsonOutput,groupFlag=parsedArgs.flags["--group"],configFileNameFlag=parsedArgs.flags["--config-file-name"],{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist."),1;if(!groupFlag&&client.nonInteractive)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"Missing required flag --group. Use --group and --json in non-interactive mode.",next:[{command:'vercel microfrontends inspect-group --group="<group-name-or-id>" --json',when:"to inspect a specific microfrontends group non-interactively"}]},2),2;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag||g.group.slug===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group to inspect:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}let localRepoContext=await getLocalRepoContext(client);output_manager_default.spinner("Fetching project metadata\u2026");let projects=await Promise.all(selectedGroup.projects.map(project=>enrichGroupProject(client,team.id,selectedGroup,project,localRepoContext)));output_manager_default.stopSpinner();let defaultProject=projects.find(p=>p.isDefaultApp),configuredConfigFileName=resolveConfiguredMicrofrontendsConfigFileName(configFileNameFlag);if(configFileNameFlag&&!configuredConfigFileName)return output_manager_default.error("Invalid --config-file-name. Value must end with .json or .jsonc."),2;let configFile=resolveLocalConfigFilePath(projects,localRepoContext,configuredConfigFileName),json={group:{id:selectedGroup.group.id,slug:selectedGroup.group.slug,name:selectedGroup.group.name,fallbackEnvironment:selectedGroup.group.fallbackEnvironment??null},projectCount:projects.length,defaultApp:defaultProject?.name??defaultProject?.id??null,configFile,config:{exists:!!selectedGroup.config,applications:Object.keys(selectedGroup.config?.applications??{})},projects};if(asJson)return client.stdout.write(`${JSON.stringify(json,null,2)}
106
+ `),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 projects){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_chalk20.red)("no")]);let projectTable=table(rows);output_manager_default.log(projectTable),output_manager_default.log("")}for(let project of projects)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,packageName=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,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=join3(localRepoContext.repoRoot,rootDirectory||""),packageJsonPath=join3(projectDir,"package.json"),pkg=await readJSONFile(packageJsonPath);return!pkg||pkg instanceof Error?null:typeof pkg.name=="string"?pkg.name:null}function resolveLocalConfigFilePath(projects,localRepoContext,configuredConfigFileName){let defaultProject=projects.find(project=>project.isDefaultApp);if(!defaultProject||!isProjectInLocalRepo(localRepoContext,defaultProject.git.org,defaultProject.git.repo))return null;let projectDir=join3(localRepoContext.repoRoot,defaultProject.git.rootDirectory||""),configuredName=configuredConfigFileName??null;if(configuredName){let configuredPath=join3(projectDir,configuredName);if(existsSync2(configuredPath))return configuredPath}let jsonPath=join3(projectDir,"microfrontends.json"),jsoncPath=join3(projectDir,"microfrontends.jsonc");return existsSync2(jsonPath)?jsonPath:existsSync2(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_CONFIG3={"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 main2(client){let telemetry=new MicrofrontendsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(microfrontendsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}parsedArgs.args[0]==="mf"&&warnDeprecatedSubcommand(client,"mf","microfrontends");let{subcommand,subcommandOriginal}=getSubcommand2(parsedArgs.args.slice(1),COMMAND_CONFIG3),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("microfrontends"),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:microfrontendsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create-group":return needHelp?(telemetry.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(createGroupSubcommand)):(telemetry.trackCliSubcommandCreateGroup(subcommandOriginal),createGroup(client));case"add-to-group":return needHelp?(telemetry.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(addToGroupSubcommand)):(telemetry.trackCliSubcommandAddToGroup(subcommandOriginal),addToGroup(client));case"remove-from-group":return needHelp?(telemetry.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(removeFromGroupSubcommand)):(telemetry.trackCliSubcommandRemoveFromGroup(subcommandOriginal),removeFromGroup(client));case"delete-group":return needHelp?(telemetry.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(deleteGroupSubcommand)):(telemetry.trackCliSubcommandDeleteGroup(subcommandOriginal),deleteGroup(client));case"inspect-group":return needHelp?(telemetry.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(inspectGroupSubcommand)):(telemetry.trackCliSubcommandInspectGroup(subcommandOriginal),inspectGroup(client));case"pull":return needHelp?(telemetry.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(pullSubcommand)):(telemetry.trackCliSubcommandPull(subcommandOriginal),pull(client));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG3)),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2}}var import_chalk22=__toESM(require_source(),1),import_client=__toESM(require_dist2(),1);var import_chalk21=__toESM(require_source(),1);async function getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}){let{config}=client;if(!isValidName(deployIdOrUrl))throw new Error(`The provided argument "${deployIdOrUrl}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default.spinner(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk21.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployIdOrUrl)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason.message);team=teamResult.value,deployment=deploymentResult.value,output_manager_default.log(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk21.default.bold(contextName)}\u2026`)}finally{output_manager_default.stopSpinner()}if(deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk21.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk21.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}return deployment}var import_error_utils=__toESM(require_dist(),1);var RedeployTelemetryClient=class extends TelemetryClient{trackCliArgumentDeployment(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliFlagNoWait(noWait){noWait&&this.trackCliFlag("no-wait")}trackCliOptionTarget(target){target&&this.trackCliArgument({arg:"target",value:this.redactedTargetName(target)})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedTargetName(environment)})}};async function redeploy(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(redeployCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry=new RedeployTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry.trackCliFlagHelp("redeploy"),output_manager_default.print(help(redeployCommand,{columns:client.stderr.columns})),0;let deployIdOrUrl=parsedArgs.args[1];if(!deployIdOrUrl)return output_manager_default.error(`Missing required deployment id or url: ${getCommandName("redeploy <deployment>")}`),1;if(telemetry.trackCliArgumentDeployment(deployIdOrUrl),telemetry.trackCliFlagNoWait(parsedArgs.flags["--no-wait"]),telemetry.trackCliOptionTarget(parsedArgs.flags["--target"]),telemetry.trackCliOptionEnvironment(parsedArgs.flags["--environment"]),!applyDeprecatedTargetFlag(client,parsedArgs.flags))return 2;let contextName=await getContextName(client),noWait=!!parsedArgs.flags["--no-wait"],targetArgument=parsedArgs.flags["--environment"];try{let fromDeployment=await getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}),target,customEnvironmentSlugOrId;targetArgument?targetArgument==="staging"||targetArgument==="production"?target=targetArgument:targetArgument==="preview"?target=void 0:targetArgument?(customEnvironmentSlugOrId=targetArgument,target=void 0):target=fromDeployment.target:(target=fromDeployment.target??void 0,customEnvironmentSlugOrId=fromDeployment.customEnvironment?.id);let customEnvironment;if(fromDeployment?.projectId&&customEnvironmentSlugOrId){let customEnvironments=await getCustomEnvironments(client,fromDeployment.projectId);customEnvironment=pickCustomEnvironment(customEnvironments,customEnvironmentSlugOrId)}if(customEnvironmentSlugOrId&&!customEnvironment)return output_manager_default.error(`The provided argument "${targetArgument}" is not a valid target environment.`),2;fromDeployment.prebuilt&&fromDeployment.manualProvisioning===void 0&&output_manager_default.warning([`Deployment ${fromDeployment.id} is a prebuilt deployment. Redeploying reuses its prebuilt output, so it is not rebuilt from source and will not use the latest environment variables or project settings.`,`To use the latest settings, create a new deployment instead: run ${getCommandName("pull")}, ${getCommandName("build")}, and ${getCommandName("deploy --prebuilt")} with the same ${import_chalk22.default.bold("--environment")} flag (for example ${import_chalk22.default.bold("--environment production")}).`,`Learn More: ${link_default("https://vercel.com/docs/cli/deploy#prebuilt")}`].join(`
107
+ `));let deployStamp=stamp_default();output_manager_default.spinner(`Redeploying project ${fromDeployment.id}`,0);let deployment=await client.fetch("/v13/deployments?forceNew=1",{body:{deploymentId:fromDeployment.id,meta:{action:"redeploy"},name:fromDeployment.name,target,customEnvironmentSlugOrId},method:"POST"});output_manager_default.stopSpinner();let previewUrl=`https://${deployment.url}`,isProdDeployment=target==="production";if(customEnvironmentSlugOrId&&customEnvironment&&(isProdDeployment=customEnvironment.type==="production"),printAlignedLabel("Inspect",import_chalk22.default.cyan(deployment.inspectorUrl)),printAlignedLabel(isProdDeployment?"Production":"Preview",import_chalk22.default.cyan(previewUrl),isProdDeployment&&noWait?{gutter:"\u25B2"}:{}),client.stdout.isTTY||client.stdout.write(`https://${deployment.url}`),!noWait){output_manager_default.spinner(deployment.readyState==="QUEUED"?"Queued\u2026":"Building\u2026",0);let project,rollingRelease;if(deployment.projectId&&deployment.projectId!=""&&(project=await getProjectByNameOrId(client,deployment.projectId),rollingRelease=project?.rollingRelease),deployment.readyState==="READY"&&deployment.aliasAssigned&&!rollingRelease){if(output_manager_default.spinner("Completing\u2026",0),deployment.target==="production"&&deployment.alias&&deployment.alias.length>0){output_manager_default.stopSpinner();let prodUrl=`https://${deployment.alias[0]}`;printAlignedLabel("Aliased",import_chalk22.default.cyan(prodUrl),{gutter:"\u25B2"})}}else try{let clientOptions={dispatcher:getFetchDispatcher(),apiUrl:client.apiUrl,debug:output_manager_default.debugEnabled,path:"",teamId:fromDeployment.team?.id,token:client.authConfig.token,userAgent:ua_default};for await(let event of(0,import_client.checkDeploymentStatus)(deployment,clientOptions))if(event.type==="building")output_manager_default.spinner("Building\u2026",0);else if(event.type==="ready"&&rollingRelease){output_manager_default.spinner("Releasing\u2026",0),output_manager_default.stopSpinner(),deployment=event.payload;break}else if(event.type==="ready"&&(!event.payload.checksState||event.payload.checksState==="completed"))output_manager_default.spinner("Completing\u2026",0);else if(event.type==="checks-running")output_manager_default.spinner("Running Checks\u2026",0);else if(event.type==="alias-assigned"||event.type==="checks-conclusion-failed"){if(output_manager_default.stopSpinner(),event.type==="alias-assigned"&&!Array.isArray(event.payload)&&event.payload.target==="production"&&event.payload.alias&&event.payload.alias.length>0){let prodUrl=`https://${event.payload.alias[0]}`;printAlignedLabel("Aliased",import_chalk22.default.cyan(prodUrl),{gutter:"\u25B2"})}deployment=event.payload;break}else{if(event.type==="canceled")return output_manager_default.stopSpinner(),output_manager_default.print(`The deployment has been canceled.
108
+ `),1;if(event.type==="error")throw output_manager_default.stopSpinner(),await new Now({client,currentTeam:fromDeployment.team?.id}).handleDeploymentError(event.payload,{env:{}})}}catch(err){output_manager_default.prettyError(err),process.exit(1)}}return printDeploymentStatus(client,deployment,deployStamp,noWait,!1)}catch(err){return output_manager_default.prettyError(err),(0,import_error_utils.isErrnoException)(err)&&err.code==="ERR_INVALID_TEAM"&&output_manager_default.error(`Use ${import_chalk22.default.bold("vc switch")} to change your current team`),1}}var import_chalk23=__toESM(require_source(),1),import_pluralize3=__toESM(require_pluralize(),1);function withGlobalFlags3(client,commandTemplate){return withGlobalFlags(client,commandTemplate,{preserveProject:!0})}async function parseSubcommandArgs2(argv,command2){let parsedArgs;try{parsedArgs=parseSubcommandArguments(argv,command2)}catch(err){return printError(err),2}return parsedArgs}async function confirmAction(client,skipConfirmation,message,details){return skipConfirmation?!0:(details&&output_manager_default.print(` ${details}
109
+ `),await client.input.confirm(message,!1))}function isValidUrl(url){if(url.startsWith("/"))return!0;try{let parsed=new URL(url);return parsed.protocol==="http:"||parsed.protocol==="https:"}catch{return!1}}function getArgsAfterRedirectsSubcommand(fullArgs,subcommand){let idx=fullArgs.indexOf(subcommand);return idx>=0?fullArgs.slice(idx+1):[]}function getRedirectGlobalFlagsOnly(afterSubcommandArgs){return getGlobalFlagsFromArgs(afterSubcommandArgs,{preserveProject:!0})}function getRedirectPromoteSuggestionFlags(afterSubcommandArgs){let parts=getRedirectGlobalFlagsOnly(afterSubcommandArgs);return parts.some(p=>p==="--yes"||p==="-y")||parts.push("--yes"),parts}function buildRedirectsSuggestionFlags(fullArgs,subcommand,options={}){let after=getArgsAfterRedirectsSubcommand(fullArgs,subcommand),flagParts=getSameSubcommandSuggestionFlags(after);return options.ensureYes!==!1&&!flagParts.some(a=>a==="--yes"||a==="-y")&&flagParts.push("--yes"),flagParts}async function getRedirects(client,projectId,options={}){let{teamId,search,page,perPage=50,versionId,diff}=options,params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId),versionId&&params.set("versionId",versionId),diff?params.set("diff",diff===!0?"true":diff):(params.set("per_page",perPage.toString()),search&&params.set("q",search),page&&params.set("page",page.toString()));let url=`/v1/bulk-redirects?${params}`;return await client.fetch(url)}async function getRedirectVersions(client,projectId,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url)}async function list2(client,argv){let parsed=await parseSubcommandArgs2(argv,listSubcommand4);if(typeof parsed=="number")return parsed;let asJson=!!parsed.flags["--json"],query=getRenamedOption(parsed.flags,"--query","--search",{json:asJson,typedName:getTypedOptionName(argv,getFlagsSpecification(listSubcommand4.options),"--search")});if("error"in query)return reportRenamedOptionError(client,query.error,{json:asJson});let nextPage=parseNumericCursor(parsed.flags["--next"]);if(Number.isNaN(nextPage))return output_manager_default.error(INVALID_NEXT_MESSAGE),2;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search=query.value,page=nextPage??flags["--page"];flags["--page"]!==void 0&&warnDeprecatedOption(client.argv,"--page","--next");let perPage=flags["--limit"]??flags["--per-page"],staging=flags["--staging"],versionIdFlag=flags["--redirects-version"],versionId,versionName,useDiff=!1;if(staging){asJson||output_manager_default.spinner("Fetching staging version");let{versions}=await getRedirectVersions(client,project.id,teamId),stagingVersion=versions.find(v=>v.isStaging);if(!stagingVersion)return output_manager_default.error(`No staging version found for ${import_chalk23.default.bold(project.name)}. Run ${import_chalk23.default.cyan(withGlobalFlags3(client,"redirects list-versions"))} to see available versions.`),1;versionId=stagingVersion.id,versionName=stagingVersion.name||stagingVersion.id,!search&&!page&&(useDiff=!0)}if(versionIdFlag){if(staging)return output_manager_default.error("Cannot use both --staging and --redirects-version flags together"),2;asJson||output_manager_default.spinner("Fetching version");let{versions}=await getRedirectVersions(client,project.id,teamId),version=versions.find(v=>v.id===versionIdFlag||v.name===versionIdFlag);if(!version)return output_manager_default.error(`Version "${versionIdFlag}" not found. Run ${import_chalk23.default.cyan(withGlobalFlags3(client,"redirects list-versions"))} to see available versions.`),1;versionId=version.id,versionName=version.name||version.id}let lsStamp=stamp_default(),spinnerMessage=`Fetching redirects for ${import_chalk23.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search&&(spinnerMessage+=` matching "${search}"`),asJson||output_manager_default.spinner(spinnerMessage);let{redirects,pagination}=await getRedirects(client,project.id,{teamId,search,page,perPage,versionId,diff:useDiff});if(asJson){let next=pagination&&pagination.page<pagination.numPages?pagination.page+1:null;return client.stdout.write(`${JSON.stringify(withWarnings({redirects,pagination:{next}},[query.warning]),null,2)}
110
+ `),0}if(useDiff){let added=redirects.filter(r=>r.action==="+"),removed=redirects.filter(r=>r.action==="-"),unchanged=redirects.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk23.default.bold(versionName||"")} ${import_chalk23.default.gray(lsStamp())}`),added.length===0&&removed.length===0?output_manager_default.log(`
111
+ No changes from production version
112
+ `):(added.length>0&&(output_manager_default.print(`
113
+ ${import_chalk23.default.bold(import_chalk23.default.green(`Added (${added.length}):`))}
114
+ `),output_manager_default.print(formatRedirectsTable(added,"+"))),removed.length>0&&(output_manager_default.print(`
115
+ ${import_chalk23.default.bold(import_chalk23.default.red(`Removed (${removed.length}):`))}
116
+ `),output_manager_default.print(formatRedirectsTable(removed,"-"))),unchanged.length>0&&output_manager_default.print(`
117
+ ${import_chalk23.default.gray(`${unchanged.length} redirect${unchanged.length===1?"":"s"} unchanged`)}
118
+ `),output_manager_default.print(`
119
+ `))}else{let resultMessage=`${(0,import_pluralize3.default)("Redirect",redirects.length,!0)} found for ${import_chalk23.default.bold(project.name)}`;versionName&&(resultMessage+=` ${import_chalk23.default.gray(`(version: ${versionName})`)}`),search&&(resultMessage+=` matching "${search}"`),pagination&&(resultMessage+=` ${import_chalk23.default.gray(`(page ${pagination.page} of ${pagination.numPages})`)}`),resultMessage+=` ${import_chalk23.default.gray(lsStamp())}`,output_manager_default.log(resultMessage),client.nonInteractive&&redirects.length===0&&!staging&&!versionIdFlag&&output_manager_default.log(` ${withGlobalFlags3(client,"redirects list")} shows production redirects only. If you added redirects but do not see them here, they may still be staged only\u2014run ${withGlobalFlags3(client,"redirects list --staging")} to view staged changes.`),redirects.length>0&&(output_manager_default.print(formatRedirectsTable(redirects)),output_manager_default.print(`
120
+ `))}return pagination&&pagination.page<pagination.numPages&&printNextPageCommand(getNextPageCommand(renameOptionInArgs(client.argv,"--search","--query"),String(pagination.page+1),["--page"])),0}function formatRedirectsTable(redirects,actionSymbol){let rows=redirects.map(redirect=>{let status=redirect.statusCode||(redirect.permanent?308:307),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk23.default.green:actionSymbol==="-"?import_chalk23.default.red:s=>s;return[colorFn(`${prefix} ${redirect.source}`),colorFn(`${redirect.destination}`),colorFn(status.toString())]});return formatTable(["Source","Destination","Status"],["l","l","l"],[{rows}])}var import_chalk24=__toESM(require_source(),1),import_ms4=__toESM(require_ms(),1),import_pluralize4=__toESM(require_pluralize(),1);async function listVersions(client,argv){let parsed=await parseSubcommandArgs2(argv,listVersionsSubcommand);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,lsStamp=stamp_default(),asJson=!!parsed.flags["--json"];asJson||output_manager_default.spinner(`Fetching redirect versions for ${import_chalk24.default.bold(project.name)}`);let{versions}=await getRedirectVersions(client,project.id,teamId);if(asJson)return client.stdout.write(`${JSON.stringify({versions},null,2)}
121
+ `),0;let sortedVersions=sortVersions(versions).slice(0,20);return output_manager_default.log(`${(0,import_pluralize4.default)("Version",sortedVersions.length,!0)} found for ${import_chalk24.default.bold(project.name)} ${import_chalk24.default.gray(lsStamp())}`),sortedVersions.length>0&&(output_manager_default.print(formatVersionsTable(sortedVersions)),output_manager_default.print(`
122
+ `)),0}function sortVersions(versions){return versions.slice().sort((a,b)=>a.isStaging&&!b.isStaging?-1:!a.isStaging&&b.isStaging?1:a.isLive&&!b.isLive?-1:!a.isLive&&b.isLive?1:b.lastModified-a.lastModified)}function formatVersionsTable(versions){let now=Date.now(),rows=versions.map(version=>{let age=(0,import_ms4.default)(now-version.lastModified),status="";version.isStaging?status=import_chalk24.default.yellow("Staging"):version.isLive?status=import_chalk24.default.green("Live"):status=import_chalk24.default.gray("Previous");let name=version.name||import_chalk24.default.gray("(unnamed)"),redirectCountStr=version.redirectCount!==void 0&&version.redirectCount!==null?version.redirectCount.toString():import_chalk24.default.gray("-");return[status,name,version.id,redirectCountStr,version.createdBy||import_chalk24.default.gray("(unknown)"),import_chalk24.default.gray(age+" ago")]});return formatTable(["Status","Name","ID","Redirects","Created By","Age"],["l","l","l","r","l","l"],[{rows}])}var import_chalk25=__toESM(require_source(),1);async function putRedirects(client,projectId,redirects,teamId,name){let url="/v1/bulk-redirects",body={projectId,redirects};return teamId&&(body.teamId=teamId),name&&(body.name=name),await client.fetch(url,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)})}async function updateRedirectVersion(client,projectId,versionId,action,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:versionId,action})})}async function add2(client,argv){let parsed=await parseSubcommandArgs2(argv,addSubcommand2);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,{versions}=await getRedirectVersions(client,project.id,teamId),existingStagingVersion=versions.find(v=>v.isStaging),{args,flags}=parsed,skipPrompts=flags["--yes"]||client.nonInteractive;if(client.nonInteractive&&(!args[0]||!args[1])){let sourcePart=args[0]||"<source>",destPart=args[1]!==void 0&&args[1]!==""?args[1]:"<destination>",flagParts=buildRedirectsSuggestionFlags(client.argv.slice(2),"add"),cmd2=getCommandNamePlain(`redirects add ${sourcePart} ${destPart} ${flagParts.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`In non-interactive mode source and destination are required. Run: ${cmd2}`,next:[{command:cmd2,when:"to add a redirect"}]},2),2}let source;if(args[0]){if(source=args[0],!isValidUrl(source))return output_manager_default.error("Source must be a relative path (starting with /) or an absolute URL"),2}else{if(skipPrompts)return output_manager_default.error("Source and destination are required when using --yes. Use: vercel redirects add <source> <destination> --yes"),2;output_manager_default.log(`Add a new redirect
123
+ `),source=await client.input.text({message:"What is the source URL?",validate:val=>val?isValidUrl(val)?!0:"Must be a relative path (starting with /) or an absolute URL":"Source URL cannot be empty"})}let destination;if(args[1]){if(destination=args[1],!isValidUrl(destination))return output_manager_default.error("Destination must be a relative path (starting with /) or an absolute URL"),2}else{if(skipPrompts)return output_manager_default.error("Source and destination are required when using --yes. Use: vercel redirects add <source> <destination> --yes"),2;args[0]||output_manager_default.log(`Add a new redirect
124
+ `),destination=await client.input.text({message:"What is the destination URL?",validate:val=>val?isValidUrl(val)?!0:"Must be a relative path (starting with /) or an absolute URL":"Destination URL cannot be empty"})}let statusCode;if(flags["--status"]){if(statusCode=flags["--status"],![301,302,307,308].includes(statusCode))return output_manager_default.error("Status code must be 301, 302, 307, or 308"),1}else skipPrompts?statusCode=307:statusCode=await client.input.select({message:"Select the status code:",choices:[{name:"307 - Temporary Redirect (preserves request method)",value:307},{name:"308 - Permanent Redirect (preserves request method)",value:308},{name:"301 - Moved Permanently (cached by browsers)",value:301},{name:"302 - Found (temporary redirect, not cached)",value:302}]});let caseSensitive;flags["--case-sensitive"]!==void 0?caseSensitive=flags["--case-sensitive"]:skipPrompts?caseSensitive=!1:caseSensitive=await client.input.confirm("Should the redirect be case sensitive?",!1);let preserveQueryParams;flags["--preserve-query-params"]!==void 0?preserveQueryParams=flags["--preserve-query-params"]:skipPrompts?preserveQueryParams=!1:preserveQueryParams=await client.input.confirm("Should query parameters be preserved?",!1);let versionName;if(flags["--name"]){if(versionName=flags["--name"],versionName&&versionName.length>256)return output_manager_default.error("Name must be 256 characters or less"),1}else skipPrompts?versionName=void 0:await client.input.confirm("Do you want to provide a name for this version?",!1)&&(versionName=await client.input.text({message:"Version name (max 256 characters):",validate:val=>val&&val.length>256?"Name must be 256 characters or less":!0}),versionName||(versionName=void 0));let addStamp=stamp_default();output_manager_default.spinner("Adding redirect");let{alias,version}=await putRedirects(client,project.id,[{source,destination,statusCode,caseSensitive,preserveQueryParams}],teamId,versionName);if(client.nonInteractive){output_manager_default.stopSpinner();let testUrl=alias?source.startsWith("/")?`https://${alias}${source}`:`https://${alias}`:void 0,fullArgs=client.argv.slice(2),afterAdd=getArgsAfterRedirectsSubcommand(fullArgs,"add"),globalFlags=getRedirectGlobalFlagsOnly(afterAdd),flagsSuffix=globalFlags.length>0?` ${globalFlags.join(" ")}`:"",listStagingCmd=getCommandNamePlain(`redirects list --staging${flagsSuffix}`.trim()),promoteFlagParts=getRedirectPromoteSuggestionFlags(afterAdd),promoteCmd=getCommandNamePlain(`redirects promote ${version.id} ${promoteFlagParts.join(" ")}`.trim()),jsonOutput={status:AGENT_STATUS.OK,redirect:{source,destination,statusCode,caseSensitive,preserveQueryParams},version:{id:version.id,name:version.name||version.id},...alias&&{alias,testUrl},stagingOnly:!0,inProduction:!1,message:`Redirect was added to a staging version only\u2014not live in production yet. \`vercel redirects list\` (without --staging) shows production redirects only, so you may see 0 until you promote. Use ${listStagingCmd} to see staged redirects including this one, then ${promoteCmd} to promote this staging version to production.`,next:[{command:listStagingCmd,when:"To list staged redirects (includes this redirect)"},{command:promoteCmd,when:"To promote this staging version to production"}]};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
125
+ `),0}if(output_manager_default.log(`${import_chalk25.default.cyan("\u2713")} Redirect added ${import_chalk25.default.gray(addStamp())}`),output_manager_default.print(`
126
+ ${import_chalk25.default.bold("Redirect:")}
127
+ `),output_manager_default.print(` ${import_chalk25.default.cyan(source)} \u2192 ${import_chalk25.default.cyan(destination)}
128
+ `),output_manager_default.print(` Status: ${statusCode}
129
+ `),output_manager_default.print(` Case sensitive: ${caseSensitive?"Yes":"No"}
130
+ `),output_manager_default.print(` Preserve query params: ${preserveQueryParams?"Yes":"No"}
131
+ `),alias){let testUrl=source.startsWith("/")?`https://${alias}${source}`:`https://${alias}`;output_manager_default.print(`
132
+ ${import_chalk25.default.bold("Test your changes:")} ${import_chalk25.default.cyan(testUrl)}
133
+ `)}let newVersionName=version.name||version.id;if(output_manager_default.print(` ${import_chalk25.default.bold("New staging version:")} ${newVersionName}
134
+
135
+ `),existingStagingVersion)output_manager_default.warn(`There are other staged changes. Please review all changes with ${import_chalk25.default.cyan("vercel redirects list --staging")} before promoting to production.`);else if(await client.input.confirm("This is the only staged change. Do you want to promote it to production now?",!1)){let promoteStamp=stamp_default();output_manager_default.spinner("Promoting to production"),await updateRedirectVersion(client,project.id,version.id,"promote",teamId),output_manager_default.log(`${import_chalk25.default.cyan("\u2713")} Version promoted to production ${import_chalk25.default.gray(promoteStamp())}`)}return 0}var import_chalk26=__toESM(require_source(),1);import{readFileSync}from"fs";import{basename}from"path";import{statSync}from"fs";var MAX_FILE_SIZE=50*1024*1024,ALLOWED_EXTENSIONS=[".csv",".json"],MAX_REDIRECTS=1e6,MAX_URL_LENGTH=2048,VALID_STATUS_CODES=[301,302,303,307,308];function validateUploadFile(filePath,options={}){let maxSize=options.maxFileSize??MAX_FILE_SIZE,allowedExts=options.allowedExtensions??ALLOWED_EXTENSIONS;try{let stats=statSync(filePath);return stats.isFile()?stats.size>maxSize?{valid:!1,error:`File must be below ${Math.round(maxSize/1048576)}MB`}:allowedExts.some(ext=>filePath.toLowerCase().endsWith(ext))?{valid:!0}:{valid:!1,error:"File must be a .csv or .json file"}:{valid:!1,error:`Path "${filePath}" is not a file`}}catch(err){return err.code==="ENOENT"?{valid:!1,error:`File "${filePath}" not found`}:{valid:!1,error:`Error accessing file: ${err.message}`}}}function validateRedirect(redirect){if(!redirect.source)return{valid:!1,error:"Redirect source is required"};if(redirect.source.length>MAX_URL_LENGTH)return{valid:!1,error:"Source URL is too long"};if(!isValidUrl(redirect.source))return{valid:!1,error:"Source must be a relative path or a valid URL"};if(!redirect.destination)return{valid:!1,error:"Redirect destination is required"};if(redirect.destination.length>MAX_URL_LENGTH)return{valid:!1,error:"Destination URL is too long"};try{new URL(redirect.destination,"https://vercel.com")}catch{return{valid:!1,error:"Destination must be a valid URL"}}return redirect.statusCode&&!VALID_STATUS_CODES.includes(redirect.statusCode)?{valid:!1,error:`Invalid status code. Must be one of: ${VALID_STATUS_CODES.join(", ")}`}:{valid:!0}}function validateRedirectsArray(redirects){if(!Array.isArray(redirects))return{valid:!1,error:"JSON file must contain an array of redirects"};if(redirects.length===0)return{valid:!1,error:"No redirects provided"};if(redirects.length>MAX_REDIRECTS)return{valid:!1,error:`Too many redirects. Maximum allowed: ${MAX_REDIRECTS}`};for(let i=0;i<redirects.length;i++){let result=validateRedirect(redirects[i]);if(!result.valid)return{valid:!1,error:`Redirect ${i+1}: ${result.error}`}}return{valid:!0}}function validateCSVStructure(content){let lines=content.trim().split(`
136
+ `);if(lines.length<2)return{valid:!1,error:"CSV must have a header and at least one redirect"};let header=lines[0].toLowerCase(),hasSource=header.includes("source"),hasDestination=header.includes("destination");return!hasSource||!hasDestination?{valid:!1,error:'CSV must have "source" and "destination" columns'}:{valid:!0}}function validateVersionName(name){return name?name.length>256?{valid:!1,error:"Name must be 256 characters or less"}:{valid:!0}:{valid:!1,error:"Name is required"}}async function upload(client,argv,subcommandName){let parsed=await parseSubcommandArgs2(argv,uploadSubcommand);if(typeof parsed=="number")return parsed;let force=getRenamedOption(parsed.flags,"--force","--overwrite");if("error"in force)return reportRenamedOptionError(client,force.error);let suggestionArgv=renameOptionInArgs(client.argv,"--overwrite","--force"),link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,{args,flags}=parsed,skipPrompts=flags["--yes"]||!1,filePath=args[0];if(!filePath){if(client.nonInteractive){let flagParts=buildRedirectsSuggestionFlags(suggestionArgv.slice(2),subcommandName),cmd2=getCommandNamePlain(`redirects import <file> ${flagParts.join(" ")}`.trim());outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`File path is required. Run: ${cmd2}`,next:[{command:cmd2,when:"to import redirects from a CSV or JSON file"}]},2)}return output_manager_default.error("File path is required. Use: vercel redirects import <file>"),2}if(client.nonInteractive&&!skipPrompts){let cmd2=buildCommandWithYes(suggestionArgv);return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`In non-interactive mode use --yes to confirm import. Run: ${cmd2}`,next:[{command:cmd2,when:"to confirm import"}]},1),1}let overwrite=force.value||!1,fileValidation=validateUploadFile(filePath);if(!fileValidation.valid)return output_manager_default.error(fileValidation.error),1;let{versions}=await getRedirectVersions(client,project.id,teamId),existingStagingVersion=versions.find(v=>v.isStaging);if(!skipPrompts){let fileName=basename(filePath),fileType=filePath.endsWith(".csv")?"CSV":"JSON",message=overwrite?`Import ${fileType} file "${fileName}" and replace all existing redirects?`:`Import ${fileType} file "${fileName}"?`;if(!await client.input.confirm(message,!0))return output_manager_default.log("Import cancelled"),0}let versionName;if(!skipPrompts&&await client.input.confirm("Do you want to provide a name for this version?",!1)){versionName=await client.input.text({message:"Version name (max 256 characters):",validate:val=>val&&val.length>256?"Name must be 256 characters or less":!0});let{valid,error}=validateVersionName(versionName);if(!valid)return output_manager_default.error(error),1}let uploadStamp=stamp_default();output_manager_default.spinner("Importing redirects");try{let result,url="/v1/bulk-redirects";if(filePath.endsWith(".csv")){let csvContent=readFileSync(filePath),fileName=basename(filePath),csvValidation=validateCSVStructure(csvContent.toString());if(!csvValidation.valid)return output_manager_default.error(`Invalid CSV: ${csvValidation.error}`),1;let form=new FormData;form.append("teamId",teamId||org.id),form.append("projectId",project.id),form.append("overwrite",String(overwrite)),versionName&&form.append("name",versionName),form.append("bulkRedirectsFile",new Blob([new Uint8Array(csvContent)],{type:"text/csv"}),fileName),result=await client.fetch(url,{method:"PUT",body:form})}else{let content=readFileSync(filePath,"utf8"),redirects2;try{redirects2=JSON.parse(content)}catch{return output_manager_default.error("Invalid JSON file format"),1}let redirectsValidation=validateRedirectsArray(redirects2);if(!redirectsValidation.valid)return output_manager_default.error(redirectsValidation.error),1;let body={projectId:project.id,redirects:redirects2,overwrite};teamId&&(body.teamId=teamId),versionName&&(body.versionName=versionName),result=await client.fetch(url,{method:"PUT",body})}if(client.nonInteractive){output_manager_default.stopSpinner();let afterUpload=getArgsAfterRedirectsSubcommand(client.argv.slice(2),subcommandName),promoteFlagParts=getRedirectPromoteSuggestionFlags(afterUpload),promoteCmd=getCommandNamePlain(`redirects promote ${result.version.id} ${promoteFlagParts.join(" ")}`.trim()),jsonOutput={status:AGENT_STATUS.OK,version:{id:result.version.id,name:result.version.name||result.version.id,...result.version.redirectCount!==void 0&&{redirectCount:result.version.redirectCount}},...result.alias&&{alias:result.alias,testUrl:`https://${result.alias}`},...!existingStagingVersion&&{next:[{command:promoteCmd,when:"To promote this staging version to production"}]},...existingStagingVersion&&{hint:`Review staged changes with ${withGlobalFlags3(client,"redirects list --staging")} before promoting.`}};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
137
+ `),0}output_manager_default.log(`${import_chalk26.default.cyan("\u2713")} Redirects imported ${import_chalk26.default.gray(uploadStamp())}`),output_manager_default.spinner("Fetching diff");let{redirects}=await getRedirects(client,project.id,{teamId,versionId:result.version.id,diff:"only"}),redirectCount=redirects.length;if(output_manager_default.print(`
138
+ ${import_chalk26.default.bold("Summary:")}
139
+ `),output_manager_default.print(` Imported ${redirectCount} redirect${redirectCount===1?"":"s"}
140
+ `),redirectCount>0){let added=redirects.filter(r=>r.action==="+"),deleted=redirects.filter(r=>r.action==="-"),edited=redirects.filter(r=>r.action==="~");output_manager_default.print(`
141
+ ${import_chalk26.default.bold("Changes:")}
142
+ `),added.length>0&&output_manager_default.print(` ${import_chalk26.default.green(`Added: ${added.length}`)}
143
+ `),deleted.length>0&&output_manager_default.print(` ${import_chalk26.default.red(`Deleted: ${deleted.length}`)}
144
+ `),edited.length>0&&output_manager_default.print(` ${import_chalk26.default.yellow(`Modified: ${edited.length}`)}
145
+ `),output_manager_default.print(`
146
+ ${import_chalk26.default.bold("Redirect changes:")}
147
+ `);let rows=redirects.slice(0,100).map(redirect=>{let status=redirect.statusCode||(redirect.permanent?308:307),action=redirect.action||"+",colorFn,actionSymbol;switch(action){case"+":colorFn=import_chalk26.default.green,actionSymbol="+";break;case"-":colorFn=import_chalk26.default.red,actionSymbol="-";break;case"~":colorFn=import_chalk26.default.yellow,actionSymbol="~";break;default:colorFn=s=>s,actionSymbol=" "}return[colorFn(`${actionSymbol} ${redirect.source}`),colorFn(redirect.destination),colorFn(status.toString())]});output_manager_default.print(formatTable(["Source","Destination","Status"],["l","l","l"],[{rows}])),redirectCount>100&&output_manager_default.print(`
148
+ ${import_chalk26.default.gray(`... and ${redirectCount-100} more redirect${redirectCount-100===1?"":"s"}`)}
149
+ `)}if(result.alias){let testUrl=`https://${result.alias}`;output_manager_default.print(`
150
+ ${import_chalk26.default.bold("Test your changes:")} ${import_chalk26.default.cyan(testUrl)}
151
+ `)}let newVersionName=result.version.name||result.version.id;if(output_manager_default.print(` ${import_chalk26.default.bold("New staging version:")} ${newVersionName}
152
+
153
+ `),existingStagingVersion)output_manager_default.warn(`There are other staged changes. Please review all changes with ${import_chalk26.default.cyan("vercel redirects list --staging")} before promoting to production.`);else if(!skipPrompts&&!client.nonInteractive){if(await client.input.confirm("This is the only staged change. Do you want to promote it to production now?",!1)){let promoteStamp=stamp_default();output_manager_default.spinner("Promoting to production"),await updateRedirectVersion(client,project.id,result.version.id,"promote",teamId),output_manager_default.log(`${import_chalk26.default.cyan("\u2713")} Version promoted to production ${import_chalk26.default.gray(promoteStamp())}`)}}else!existingStagingVersion&&client.nonInteractive&&output_manager_default.print(` Run ${import_chalk26.default.cyan(`vercel redirects promote ${result.version.id} --yes`)} to promote this staging version to production.
154
+
155
+ `);return 0}catch(error){return output_manager_default.error(`Failed to import redirects: ${error.message}`),1}}var import_chalk27=__toESM(require_source(),1);async function deleteRedirects(client,projectId,sources,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&&params.set("teamId",teamId);let url=`/v1/bulk-redirects?${params}`;return await client.fetch(url,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({redirects:sources})})}async function remove(client,argv){let parsed=await parseSubcommandArgs2(argv,removeSubcommand2);if(typeof parsed=="number")return parsed;let error=validateRequiredArguments(parsed.args,["source"]);if(error){if(client.nonInteractive){let flagParts=buildRedirectsSuggestionFlags(client.argv.slice(2),"remove"),cmd2=getCommandNamePlain(`redirects remove <source> ${flagParts.join(" ")}`.trim());outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`${error} Run: ${cmd2}`,next:[{command:cmd2,when:"to remove a redirect"}]},2)}return output_manager_default.error(error),2}let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,{versions}=await getRedirectVersions(client,project.id,teamId),existingStagingVersion=versions.find(v=>v.isStaging),[source]=parsed.args;output_manager_default.spinner("Fetching redirect information");let{redirects}=await getRedirects(client,project.id,{teamId}),redirectToRemove=redirects.find(r=>r.source===source);if(!redirectToRemove){if(client.nonInteractive){let afterRemove=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"remove"),globalFlags=getRedirectGlobalFlagsOnly(afterRemove),listCmd=getCommandNamePlain(`redirects list ${globalFlags.join(" ")}`.trim());outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.REDIRECT_NOT_FOUND,message:`Redirect with source "${source}" not found. Run ${listCmd} to see available redirects.`,next:[{command:listCmd}]},1)}return output_manager_default.error(`Redirect with source "${source}" not found. Run ${import_chalk27.default.cyan("vercel redirects list")} to see available redirects.`),1}if(client.nonInteractive&&!parsed.flags["--yes"]){let cmd2=buildCommandWithYes(client.argv);return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`In non-interactive mode use --yes to confirm removal. Run: ${cmd2}`,next:[{command:cmd2,when:"to confirm removal"}]},1),1}output_manager_default.print(`
156
+ ${import_chalk27.default.bold("Removing redirect:")}
157
+ `),output_manager_default.print(` ${import_chalk27.default.cyan(redirectToRemove.source)} \u2192 ${import_chalk27.default.cyan(redirectToRemove.destination)}
158
+ `);let status=redirectToRemove.statusCode||(redirectToRemove.permanent?308:307);if(output_manager_default.print(` Status: ${status}
159
+
160
+ `),!await confirmAction(client,parsed.flags["--yes"],"Remove this redirect?","This will create a new staging version without this redirect."))return output_manager_default.log("Canceled"),0;let removeStamp=stamp_default();output_manager_default.spinner(`Removing redirect for ${import_chalk27.default.bold(source)}`);let{alias,version}=await deleteRedirects(client,project.id,[source],teamId);if(client.nonInteractive){output_manager_default.stopSpinner();let testUrl=alias?source.startsWith("/")?`https://${alias}${source}`:`https://${alias}`:void 0,afterRemove=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"remove"),promoteFlagParts=getRedirectPromoteSuggestionFlags(afterRemove),promoteCmd=getCommandNamePlain(`redirects promote ${version.id} ${promoteFlagParts.join(" ")}`.trim()),jsonOutput={status:AGENT_STATUS.OK,removed:{source},version:{id:version.id,name:version.name||version.id},...alias&&{alias,testUrl},...!existingStagingVersion&&{next:[{command:promoteCmd,when:"To promote this staging version to production"}]},...existingStagingVersion&&{hint:`Review staged changes with ${withGlobalFlags3(client,"redirects list --staging")} before promoting.`}};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
161
+ `),0}if(output_manager_default.log(`${import_chalk27.default.cyan("\u2713")} Redirect removed ${import_chalk27.default.gray(removeStamp())}`),alias){let testUrl=source.startsWith("/")?`https://${alias}${source}`:`https://${alias}`;output_manager_default.print(`
162
+ ${import_chalk27.default.bold("Test your changes:")} ${import_chalk27.default.cyan(testUrl)}
163
+ `),output_manager_default.print(` This URL should no longer redirect to the above destination.
164
+ `)}let versionName=version.name||version.id;if(output_manager_default.print(` ${import_chalk27.default.bold("New staging version:")} ${versionName}
165
+
166
+ `),existingStagingVersion)output_manager_default.warn(`There are other staged changes. Review them with ${import_chalk27.default.cyan("vercel redirects list --staging")} before promoting to production.`);else if(await client.input.confirm("This is the only staged change. Do you want to promote it to production now?",!1)){let promoteStamp=stamp_default();output_manager_default.spinner("Promoting to production"),await updateRedirectVersion(client,project.id,version.id,"promote",teamId),output_manager_default.log(`${import_chalk27.default.cyan("\u2713")} Version promoted to production ${import_chalk27.default.gray(promoteStamp())}`)}return 0}var import_chalk28=__toESM(require_source(),1);async function promote(client,argv){let parsed=await parseSubcommandArgs2(argv,promoteSubcommand);if(typeof parsed=="number")return parsed;let error=validateRequiredArguments(parsed.args,["version-id"]);if(error){if(client.nonInteractive){let afterPromote=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"promote"),listVersionsCmd=getCommandNamePlain(`redirects list-versions ${getRedirectGlobalFlagsOnly(afterPromote).join(" ")}`.trim()),promoteFlagParts=getRedirectPromoteSuggestionFlags(afterPromote),promoteCmd=getCommandNamePlain(`redirects promote <version-id> ${promoteFlagParts.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`${error} Run ${listVersionsCmd} to list version IDs and names, then ${promoteCmd} (replace <version-id> with a staging version to promote).`,next:[{command:listVersionsCmd,when:"To list redirect version IDs"},{command:promoteCmd,when:"To promote a staging version (substitute version-id)"}]},2),2}return output_manager_default.error(error),2}let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,[versionIdentifier]=parsed.args;output_manager_default.spinner(`Fetching redirect versions for ${import_chalk28.default.bold(project.name)}`);let{versions}=await getRedirectVersions(client,project.id,teamId),version=versions.find(v=>v.id===versionIdentifier||v.name===versionIdentifier);if(!version){if(client.nonInteractive){let afterPromote=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"promote"),listVersionsCmd=getCommandNamePlain(`redirects list-versions ${getRedirectGlobalFlagsOnly(afterPromote).join(" ")}`.trim());return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_FOUND,message:`Version with ID or name "${versionIdentifier}" not found.`,next:[{command:listVersionsCmd,when:"To see available redirect versions (IDs and names)"}]},1),1}return output_manager_default.error(`Version with ID or name "${versionIdentifier}" not found. Run ${import_chalk28.default.cyan("vercel redirects list-versions")} to see available versions.`),1}if(version.isLive)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Version ${version.name||version.id} is already live. Nothing to promote.`},2),2):(output_manager_default.error(`Version ${import_chalk28.default.bold(version.name||version.id)} is already live.`),2);if(!version.isStaging){if(client.nonInteractive){let afterPromote=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"promote"),listVersionsCmd=getCommandNamePlain(`redirects list-versions ${getRedirectGlobalFlagsOnly(afterPromote).join(" ")}`.trim());return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Version ${version.name||version.id} is not staged. Only staging versions can be promoted to production.`,next:[{command:listVersionsCmd,when:"To see which version is currently staged"}]},2),2}return output_manager_default.error(`Version ${import_chalk28.default.bold(version.name||version.id)} is not staged. Only staging versions can be promoted to production.
167
+ Run ${import_chalk28.default.cyan("vercel redirects list-versions")} to see which version is currently staged.`),2}let versionName=version.name||version.id;output_manager_default.spinner("Fetching changes");let{redirects:diffRedirects}=await getRedirects(client,project.id,{teamId,versionId:version.id,diff:!0}),changedRedirects=diffRedirects.filter(r=>r.action==="+"||r.action==="-");if(changedRedirects.length>0){output_manager_default.print(`
168
+ ${import_chalk28.default.bold("Changes to be promoted:")}
169
+
170
+ `);let displayRedirects=changedRedirects.slice(0,20);for(let redirect of displayRedirects){let status=redirect.statusCode||(redirect.permanent?308:307),symbol=redirect.action==="+"?import_chalk28.default.green("+"):import_chalk28.default.red("-");output_manager_default.print(` ${symbol} ${redirect.source} \u2192 ${redirect.destination} (${status})
171
+ `)}changedRedirects.length>20&&output_manager_default.print(import_chalk28.default.gray(`
172
+ ... and ${changedRedirects.length-20} more changes
173
+ `)),output_manager_default.print(`
174
+ `)}else output_manager_default.print(`
175
+ ${import_chalk28.default.gray("No changes detected from current production version.")}
176
+
177
+ `);if(client.nonInteractive&&!parsed.flags["--yes"]){let cmd2=buildCommandWithYes(client.argv);return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`In non-interactive mode use --yes to confirm promote. Run: ${cmd2}`,next:[{command:cmd2,when:"to confirm promote to production"}]},1),1}if(!await confirmAction(client,parsed.flags["--yes"],`Promote version ${import_chalk28.default.bold(versionName)} to production?`,`This will make it the live version for ${import_chalk28.default.bold(project.name)}.`))return output_manager_default.log("Canceled"),0;let updateStamp=stamp_default();output_manager_default.spinner(`Promoting version ${import_chalk28.default.bold(versionName)} to production`);let{version:newVersion}=await updateRedirectVersion(client,project.id,version.id,"promote",teamId);return output_manager_default.log(`${import_chalk28.default.cyan("\u2713")} Version ${import_chalk28.default.bold(newVersion.name||newVersion.id)} promoted to production ${import_chalk28.default.gray(updateStamp())}`),0}var import_chalk29=__toESM(require_source(),1);async function restore(client,argv){let parsed=await parseSubcommandArgs2(argv,restoreSubcommand);if(typeof parsed=="number")return parsed;let error=validateRequiredArguments(parsed.args,["version-id"]);if(error){if(client.nonInteractive){let afterRestore=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"restore"),globalFlags=getRedirectGlobalFlagsOnly(afterRestore),listVersionsCmd=getCommandNamePlain(`redirects list-versions ${globalFlags.join(" ")}`.trim()),restoreFlagParts=getRedirectPromoteSuggestionFlags(afterRestore),restoreCmd=getCommandNamePlain(`redirects restore <version-id> ${restoreFlagParts.join(" ")}`.trim());outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`${error} Run ${listVersionsCmd} to list version IDs and names, then ${restoreCmd} (replace <version-id> with a non-live, non-staging version).`,next:[{command:listVersionsCmd,when:"To list redirect version IDs to restore"},{command:restoreCmd,when:"To restore a previous version (substitute version-id)"}]},2)}return output_manager_default.error(error),2}let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,[versionIdentifier]=parsed.args;output_manager_default.spinner(`Fetching redirect versions for ${import_chalk29.default.bold(project.name)}`);let{versions}=await getRedirectVersions(client,project.id,teamId),version=versions.find(v=>v.id===versionIdentifier||v.name===versionIdentifier);if(!version){if(client.nonInteractive){let afterRestore=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"restore"),globalFlags=getRedirectGlobalFlagsOnly(afterRestore),listCmd=getCommandNamePlain(`redirects list-versions ${globalFlags.join(" ")}`.trim());outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.VERSION_NOT_FOUND,message:`Version with ID or name "${versionIdentifier}" not found. Run ${listCmd} to see available versions.`,next:[{command:listCmd}]},1)}return output_manager_default.error(`Version with ID or name "${versionIdentifier}" not found. Run ${import_chalk29.default.cyan("vercel redirects list-versions")} to see available versions.`),1}if(version.isLive){if(client.nonInteractive){let afterRestore=getArgsAfterRedirectsSubcommand(client.argv.slice(2),"restore"),globalFlags=getRedirectGlobalFlagsOnly(afterRestore),listCmd=getCommandNamePlain(`redirects list-versions ${globalFlags.join(" ")}`.trim());outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.VERSION_ALREADY_LIVE,message:`Version ${version.name||version.id} is currently live. You cannot restore the live version. Run ${listCmd} to see previous versions you can restore.`,next:[{command:listCmd}]},1)}return output_manager_default.error(`Version ${import_chalk29.default.bold(version.name||version.id)} is currently live. You cannot restore the live version.
178
+ Run ${import_chalk29.default.cyan("vercel redirects list-versions")} to see previous versions you can restore.`),1}if(version.isStaging)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.VERSION_IS_STAGING,message:`Version ${version.name||version.id} is staged. You can only restore previous (non-staging, non-live) versions.`},1),output_manager_default.error(`Version ${import_chalk29.default.bold(version.name||version.id)} is staged. You can only restore previous versions.`),1;let versionName=version.name||version.id;output_manager_default.spinner("Fetching changes");let{redirects:diffRedirects}=await getRedirects(client,project.id,{teamId,versionId:version.id,diff:!0}),changedRedirects=diffRedirects.filter(r=>r.action==="+"||r.action==="-");if(changedRedirects.length>0){output_manager_default.print(`
179
+ ${import_chalk29.default.bold("Changes to be restored:")}
180
+
181
+ `);let displayRedirects=changedRedirects.slice(0,20);for(let redirect of displayRedirects){let status=redirect.statusCode||(redirect.permanent?308:307),symbol=redirect.action==="+"?import_chalk29.default.green("+"):import_chalk29.default.red("-");output_manager_default.print(` ${symbol} ${redirect.source} \u2192 ${redirect.destination} (${status})
182
+ `)}changedRedirects.length>20&&output_manager_default.print(import_chalk29.default.gray(`
183
+ ... and ${changedRedirects.length-20} more changes
184
+ `)),output_manager_default.print(`
185
+ `)}else output_manager_default.print(`
186
+ ${import_chalk29.default.gray("No changes detected from current production version.")}
187
+
188
+ `);if(client.nonInteractive&&!parsed.flags["--yes"]){let cmd2=buildCommandWithYes(client.argv);return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`In non-interactive mode use --yes to confirm restore. Run: ${cmd2}`,next:[{command:cmd2,when:"to confirm restore to production"}]},1),1}if(!await confirmAction(client,parsed.flags["--yes"],`Restore version ${import_chalk29.default.bold(versionName)}?`,`This will make it the live version for ${import_chalk29.default.bold(project.name)}.`))return output_manager_default.log("Canceled"),0;let updateStamp=stamp_default();output_manager_default.spinner(`Restoring version ${import_chalk29.default.bold(versionName)}`);let{version:newVersion}=await updateRedirectVersion(client,project.id,version.id,"restore",teamId);return output_manager_default.log(`${import_chalk29.default.cyan("\u2713")} Version ${import_chalk29.default.bold(newVersion.name||newVersion.id)} restored to production ${import_chalk29.default.gray(updateStamp())}`),0}var RedirectsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandListVersions(actual){this.trackCliSubcommand({subcommand:"list-versions",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandUpload(actual){this.trackCliSubcommand({subcommand:"upload",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandPromote(actual){this.trackCliSubcommand({subcommand:"promote",value:actual})}trackCliSubcommandRestore(actual){this.trackCliSubcommand({subcommand:"restore",value:actual})}};var COMMAND_CONFIG4={list:getCommandAliases(listSubcommand4),"list-versions":getCommandAliases(listVersionsSubcommand),add:getCommandAliases(addSubcommand2),import:getCommandAliases(uploadSubcommand),remove:getCommandAliases(removeSubcommand2),promote:getCommandAliases(promoteSubcommand),restore:getCommandAliases(restoreSubcommand)};async function main3(client){let telemetry=new RedirectsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(redirectsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand2(subArgs,COMMAND_CONFIG4),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("redirects"),output_manager_default.print(help(redirectsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:redirectsCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("redirects",subcommandOriginal),printHelp(listSubcommand4),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list2(client,args));case"list-versions":return needHelp?(telemetry.trackCliFlagHelp("redirects",subcommandOriginal),printHelp(listVersionsSubcommand),0):(telemetry.trackCliSubcommandListVersions(subcommandOriginal),subcommandOriginal==="ls-versions"&&warnDeprecatedSubcommand(client,"redirects ls-versions","redirects list-versions"),listVersions(client,args));case"add":return needHelp?(telemetry.trackCliFlagHelp("redirects",subcommandOriginal),printHelp(addSubcommand2),0):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add2(client,args));case"import":return needHelp?(telemetry.trackCliFlagHelp("redirects",subcommandOriginal),printHelp(uploadSubcommand),0):(telemetry.trackCliSubcommandImport(subcommandOriginal),subcommandOriginal==="upload"&&warnDeprecatedSubcommand(client,"redirects upload","redirects import"),upload(client,args,subcommandOriginal));case"remove":return needHelp?(telemetry.trackCliFlagHelp("redirects",subcommandOriginal),printHelp(removeSubcommand2),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),remove(client,args));case"promote":return needHelp?(telemetry.trackCliFlagHelp("redirects",subcommandOriginal),printHelp(promoteSubcommand),0):(telemetry.trackCliSubcommandPromote(subcommandOriginal),promote(client,args));case"restore":return needHelp?(telemetry.trackCliFlagHelp("redirects",subcommandOriginal),printHelp(restoreSubcommand),0):(telemetry.trackCliSubcommandRestore(subcommandOriginal),restore(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG4)),output_manager_default.print(help(redirectsCommand,{columns:client.stderr.columns})),2}}var import_chalk30=__toESM(require_source(),1),import_ms5=__toESM(require_ms(),1),import_pluralize5=__toESM(require_pluralize(),1);var normalizeURL=u=>(u.slice(-1)==="/"&&(u=u.slice(0,-1)),u=u.replace(/^https:\/\//i,""),u);async function removeProject(client,projectNameOrId){try{await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}`,{method:"DELETE"})}catch(error){if(isAPIError(error)&&error.status===404)return new ProjectNotFound(projectNameOrId);throw error}}import{URLSearchParams as URLSearchParams2}from"url";async function getDeploymentsByProjectId(client,projectId,options={from:null,limit:100,continue:!1},total=0){let limit=options.limit||100,query=new URLSearchParams2;query.set("projectId",projectId),query.set("limit",limit.toString()),options.from&&query.set("from",options.from.toString());let{deployments:legacyDeployments}=await client.fetch(`/v6/deployments?${query}`),deployments=legacyDeployments.map(depl=>({aliasAssigned:depl.aliasAssigned,aliasError:depl.aliasError,buildingAt:depl.buildingAt,checksConclusion:depl.checksConclusion,checksState:depl.checksState,createdAt:depl.created,creator:{uid:depl.creator.uid,username:depl.creator.username},id:depl.uid,inspectorUrl:depl.inspectorUrl,meta:depl.meta,name:depl.name,public:!0,ready:depl.ready,readyState:depl.state,regions:[],source:depl.source,status:depl.state,target:depl.target,type:depl.type,url:depl.url,version:2}));if(total+=deployments.length,options.max&&total>=options.max)return deployments;if(options.continue&&deployments.length===limit){let nextFrom=deployments[deployments.length-1].createdAt,nextOptions=Object.assign({},options,{from:nextFrom});deployments.push(...await getDeploymentsByProjectId(client,projectId,nextOptions,total))}return deployments}var RemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentNameOrDeploymentId(values){values&&this.trackCliArgument({arg:"nameOrDeploymentId",value:this.redactedArgumentsLength(values)})}trackCliFlagHard(flag){flag&&this.trackCliFlag("hard")}trackCliFlagSafe(flag){flag&&this.trackCliFlag("safe")}trackCliFlagYes(flag){flag&&this.trackCliFlag("yes")}};async function remove2(client){let telemetryClient=new RemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs=null,flagsSpecification=getFlagsSpecification(removeCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error2){return printError(error2),2}if(parsedArgs.flags["--help"])return telemetryClient.trackCliFlagHelp("remove"),output_manager_default.print(help(removeCommand,{columns:client.stderr.columns})),0;let ids=parsedArgs.args.slice(1),hard=parsedArgs.flags["--hard"],skipConfirmation=parsedArgs.flags["--yes"],safe=parsedArgs.flags["--safe"];telemetryClient.trackCliArgumentNameOrDeploymentId(ids),telemetryClient.trackCliFlagSafe(safe),telemetryClient.trackCliFlagHard(hard),telemetryClient.trackCliFlagYes(skipConfirmation);let{config:{currentTeam}}=client,{success,error,log}=output_manager_default;if(ids.length<1)return error(`${getCommandName("rm")} expects at least one argument`),output_manager_default.print(help(removeCommand,{columns:client.stderr.columns})),2;let invalidName=ids.find(name=>!isValidName(name));if(invalidName)return error(`The provided argument "${invalidName}" is not a valid deployment or project`),2;let contextName=await getContextName(client);output_manager_default.spinner(`Fetching deployment(s) ${ids.map(id=>`"${id}"`).join(" ")} in ${import_chalk30.default.bold(contextName)}`);let aliases,projects,deployments,findStart=Date.now();try{let searchFilter=d=>ids.some(id=>d&&!(d instanceof NowError)&&(d.id===id||d.name===id||d.url===normalizeURL(id))),[deploymentList,projectList]=await Promise.all([Promise.all(ids.map(async idOrHost=>{if(!contextName)throw new Error("Context name is not defined");return getDeployment(client,contextName,idOrHost).catch(err=>err)})),Promise.all(ids.map(async idOrName=>getProjectByNameOrId(client,idOrName)))]);if(deployments=deploymentList.filter(d=>searchFilter(d)),projects=projectList.filter(d=>searchFilter(d)),safe){let projectDeployments=await Promise.all(projects.map(project=>getDeploymentsByProjectId(client,project.id,{max:201,continue:!0}))),to=Math.min(projectDeployments.length,201);for(let i=0;i<to;i++)for(let pDepl of projectDeployments[i]){let depl=pDepl;depl.aliases=[],deployments.push(depl)}projects=[]}else deployments=deployments.filter(d=>!projects.some(p=>p.name===d.name));aliases=await Promise.all(deployments.map(async depl=>{let{aliases:aliases2}=await getAliases(client,depl.id);return aliases2}))}finally{output_manager_default.stopSpinner()}if(deployments=deployments.filter((match,i)=>safe&&aliases[i].length>0?!1:(match.aliases=aliases[i],!0)),deployments.length===0&&projects.length===0){let safeUnaliased=parsedArgs.flags["--safe"]?"unaliased":"any",stylizedIds=ids.map(id=>import_chalk30.default.bold(`"${id}"`)).join(", "),commandName=getCommandName("projects ls");return log(`Could not find ${safeUnaliased} deployments or projects matching ${stylizedIds}. Run ${commandName} to list.`),1}if(log(`Found ${deploymentsAndProjects(deployments,projects)} for removal in ${import_chalk30.default.bold(contextName)} ${elapsed(Date.now()-findStart)}`),deployments.length>200&&output_manager_default.warn("Only 200 deployments can get deleted at once. Please continue 10 minutes after deletion to remove the rest."),!skipConfirmation){let confirmation=(await readConfirmation(deployments,projects)).toLowerCase();if(confirmation!=="y"&&confirmation!=="yes")return output_manager_default.log("Canceled"),1}let now=new Now({client,currentTeam:client.ignoresSavedTeam?await client.resolveCurrentTeam():currentTeam}),start=Date.now();return await Promise.all([...deployments.map(depl=>now.remove(depl.id,{hard})),...projects.map(project=>removeProject(client,project.id))]),success(`Removed ${deploymentsAndProjects(deployments,projects)} ${elapsed(Date.now()-start)}`),deployments.forEach(depl=>{output_manager_default.print(`${import_chalk30.default.gray("-")} ${import_chalk30.default.bold(depl.url)}
189
+ `)}),projects.forEach(project=>{output_manager_default.print(`${import_chalk30.default.gray("-")} ${import_chalk30.default.bold(project.name)}
190
+ `)}),0}function readConfirmation(deployments,projects){return new Promise(resolve3=>{if(deployments.length>0){output_manager_default.log(`The following ${(0,import_pluralize5.default)("deployment",deployments.length,deployments.length>1)} will be permanently removed:`);let deploymentTable=table(deployments.map(depl=>{let time=import_chalk30.default.gray(`${(0,import_ms5.default)(Date.now()-depl.createdAt)} ago`),url=depl.url?import_chalk30.default.underline(`https://${depl.url}`):"";return[` ${depl.id}`,url,time]}),{align:["l","r","l"],hsep:6});output_manager_default.print(`${deploymentTable}
191
+ `)}for(let depl of deployments)for(let{alias}of depl.aliases)output_manager_default.warn(`${import_chalk30.default.underline(`https://${alias}`)} is an alias for ${import_chalk30.default.bold(depl.url)} and will be removed`);if(projects.length>0){output_manager_default.print(`The following ${(0,import_pluralize5.default)("project",projects.length,projects.length>1)} will be permanently removed, including all ${projects.length>1?"their":"its"} deployments and aliases:
192
+ `);for(let project of projects)output_manager_default.print(`${import_chalk30.default.gray("-")} ${import_chalk30.default.bold(project.name)}
193
+ `)}output_manager_default.print(`${import_chalk30.default.bold.red("> Are you sure?")} ${import_chalk30.default.gray("(y/N) ")}`),process.stdin.on("data",d=>{process.stdin.pause(),resolve3(d.toString().trim())}).resume()})}function deploymentsAndProjects(deployments,projects,conjunction="and"){return!projects||projects.length===0?`${(0,import_pluralize5.default)("deployment",deployments.length,!0)}`:!deployments||deployments.length===0?`${(0,import_pluralize5.default)("project",projects.length,!0)}`:`${(0,import_pluralize5.default)("deployment",deployments.length,!0)} ${conjunction} ${(0,import_pluralize5.default)("project",projects.length,!0)}`}var import_chalk31=__toESM(require_source(),1),import_pluralize6=__toESM(require_pluralize(),1);async function list3(client,argv){let parsed=await parseSubcommandArgs(argv,listSubcommand5,client);if(typeof parsed=="number")return parsed;let asJson=!!parsed.flags["--json"],spec=getFlagsSpecification(listSubcommand5.options),query=getRenamedOption(parsed.flags,"--query","--search",{json:asJson,typedName:getTypedOptionName(argv,spec,"--search")});if("error"in query)return reportRenamedOptionError(client,query.error,{json:asJson});let type=getRenamedOption(parsed.flags,"--type","--filter",{json:asJson,typedName:getTypedOptionName(argv,spec,"--filter")});if("error"in type)return reportRenamedOptionError(client,type.error,{json:asJson});let routesVersion=getRenamedOption(parsed.flags,"--routes-version","--version-id",{json:asJson});if("error"in routesVersion)return reportRenamedOptionError(client,routesVersion.error,{json:asJson});let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search=query.value,filter=type.value,production=flags["--production"],versionIdFlag=routesVersion.value,diffFlag=flags["--diff"],expand=flags["--expand"];if(filter){let validFilters=["rewrite","redirect","set_status","transform"];if(!validFilters.includes(filter)){let msg=`Invalid filter type "${filter}". Valid types: ${validFilters.join(", ")}`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),2}}if(production&&versionIdFlag){let msg="Cannot use both --production and --routes-version flags together";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),2}if(production&&diffFlag){let msg="Cannot use both --production and --diff flags together. --diff compares staged changes against production.";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list --diff")}]}),process.exit(1)),output_manager_default.error(msg),2}let versionId,versionName,useDiff=!1;if(production){asJson||output_manager_default.spinner("Fetching production version");let{versions}=await getRouteVersions(client,project.id,{teamId}),productionVersion=versions.find(v=>!v.isStaging);if(!productionVersion){let msg=`No production version found for ${project.name}.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(`No production version found for ${import_chalk31.default.bold(project.name)}.`),1}versionId=productionVersion.id,versionName=productionVersion.id}if(diffFlag&&!versionIdFlag){asJson||output_manager_default.spinner("Fetching staging version");let{versions}=await getRouteVersions(client,project.id,{teamId}),stagingVersion=versions.find(v=>v.isStaging);if(!stagingVersion){let msg=`No staged changes to diff. Run ${withGlobalFlags2(client,"routes add")} or ${withGlobalFlags2(client,"routes update")} to make changes.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")},{command:withGlobalFlags2(client,"routes add")}]}),process.exit(1)),output_manager_default.error(`No staged changes to diff. Run ${import_chalk31.default.cyan(withGlobalFlags2(client,"routes add"))} or ${import_chalk31.default.cyan(withGlobalFlags2(client,"routes update"))} to make changes.`),1}versionId=stagingVersion.id,versionName=stagingVersion.id,useDiff=!0}if(versionIdFlag){asJson||output_manager_default.spinner("Fetching version");let{versions}=await getRouteVersions(client,project.id,{teamId}),result=findVersionById(client,versions,versionIdFlag);if(result.error||!result.version){let msg=result.error??"Version not found";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list-versions")}]}),process.exit(1)),output_manager_default.error(msg),1}versionId=result.version.id,versionName=result.version.id,diffFlag&&(useDiff=!0)}let lsStamp=stamp_default(),spinnerMessage=`Fetching routes for ${import_chalk31.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search&&(spinnerMessage+=` matching "${search}"`),filter&&(spinnerMessage+=` filtered by ${filter}`),asJson||output_manager_default.spinner(spinnerMessage);let{routes,version,limit}=await getRoutes(client,project.id,{teamId,search,filter,versionId,diff:useDiff});if(asJson)return client.stdout.write(`${JSON.stringify(withWarnings({routes,version,limit:limit??null},[query.warning,type.warning,routesVersion.warning]),null,2)}
194
+ `),0;if(useDiff){let added=routes.filter(r=>r.action==="+"),removed=routes.filter(r=>r.action==="-"),modified=routes.filter(r=>r.action==="~"),unchanged=routes.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk31.default.bold(versionName||"")} ${import_chalk31.default.gray(lsStamp())}`),added.length===0&&removed.length===0&&modified.length===0?output_manager_default.log(`
195
+ No changes from production version
196
+ `):(added.length>0&&(output_manager_default.print(`
197
+ ${import_chalk31.default.bold(import_chalk31.default.green(`Added (${added.length}):`))}
198
+ `),output_manager_default.print(formatRoutesTable(added,"+"))),modified.length>0&&(output_manager_default.print(`
199
+ ${import_chalk31.default.bold(import_chalk31.default.yellow(`Modified (${modified.length}):`))}
200
+ `),output_manager_default.print(formatRoutesTable(modified,"~"))),removed.length>0&&(output_manager_default.print(`
201
+ ${import_chalk31.default.bold(import_chalk31.default.red(`Removed (${removed.length}):`))}
202
+ `),output_manager_default.print(formatRoutesTable(removed,"-"))),unchanged.length>0&&output_manager_default.print(`
203
+ ${import_chalk31.default.gray(`${unchanged.length} route${unchanged.length===1?"":"s"} unchanged`)}
204
+ `),output_manager_default.print(`
205
+ `)),version?.alias&&output_manager_default.log(`Test your changes: ${import_chalk31.default.cyan(`https://${version.alias}`)}`)}else{let resultMessage=`${(0,import_pluralize6.default)("Route",routes.length,!0)} found for ${import_chalk31.default.bold(project.name)}`;if(versionName&&(resultMessage+=` ${import_chalk31.default.gray(`(version: ${versionName})`)}`),search&&(resultMessage+=` matching "${search}"`),filter&&(resultMessage+=` filtered by ${filter}`),resultMessage+=` ${import_chalk31.default.gray(lsStamp())}`,output_manager_default.log(resultMessage),routes.length>0&&(expand?output_manager_default.print(formatExpandedRoutes(routes)):output_manager_default.print(formatRoutesTable(routes)),output_manager_default.print(`
206
+ `)),limit&&limit.maxRoutes>0){let utilization=limit.currentRoutes/limit.maxRoutes;if(utilization>=.8){let usageColor=utilization>=1?import_chalk31.default.red:import_chalk31.default.yellow;output_manager_default.print(` ${usageColor(`Routes Usage: ${limit.currentRoutes}/${limit.maxRoutes}`)}
207
+
208
+ `)}}}return 0}function formatRoutesTable(routes,actionSymbol){let rows=routes.map((rule,index)=>{let typeLabels=getRouteTypeLabel(rule),status=rule.enabled===!1?import_chalk31.default.red("Disabled"):import_chalk31.default.green("Enabled"),prefix=actionSymbol||"",colorFn=actionSymbol==="+"?import_chalk31.default.green:actionSymbol==="-"?import_chalk31.default.red:actionSymbol==="~"?import_chalk31.default.yellow:s=>s,position=actionSymbol?"":`${index+1}`;return[colorFn(`${prefix} ${position}`).trim(),colorFn(truncate(rule.name,30)+(rule.staged?import_chalk31.default.yellow(" (draft)"):"")),colorFn(truncate(rule.route.src,40)),colorFn(typeLabels),status]});return formatTable(["#","Name","Path Pattern","Actions","Status"],["r","l","l","l","l"],[{rows}])}function truncate(str,maxLength){return str.length<=maxLength?str:str.slice(0,maxLength-3)+"..."}function formatExpandedRoutes(routes){let lines=[""];return routes.forEach((rule,index)=>{let typeLabels=getRouteTypeLabel(rule),syntaxLabel=getSrcSyntaxLabel(rule),statusText=rule.enabled===!1?import_chalk31.default.red("Disabled"):import_chalk31.default.green("Enabled"),stagedText=rule.staged?import_chalk31.default.yellow(" (staged)"):"";if(lines.push(` ${import_chalk31.default.bold(`${index+1}. ${rule.name}`)}${stagedText} ${import_chalk31.default.gray(`[${rule.id}]`)}`),lines.push(` ${import_chalk31.default.cyan("Status:")} ${statusText}`),lines.push(` ${import_chalk31.default.cyan("Type:")} ${typeLabels}`),rule.description&&lines.push(` ${import_chalk31.default.cyan("Desc:")} ${rule.description}`),lines.push(` ${import_chalk31.default.cyan("Source:")} ${rule.route.src}`),lines.push(` ${import_chalk31.default.cyan("Syntax:")} ${syntaxLabel}`),rule.route.dest&&lines.push(` ${import_chalk31.default.cyan("Dest:")} ${rule.route.dest}`),rule.route.status&&lines.push(` ${import_chalk31.default.cyan("Code:")} ${rule.route.status}`),rule.route.headers&&Object.keys(rule.route.headers).length>0){lines.push(` ${import_chalk31.default.cyan("Response Headers:")}`);for(let[key,value]of Object.entries(rule.route.headers))lines.push(` ${key}: ${value}`)}if(rule.route.transforms&&rule.route.transforms.length>0){lines.push(` ${import_chalk31.default.cyan("Transforms:")}`);for(let transform of rule.route.transforms)lines.push(` ${formatTransform(transform)}`)}if(rule.route.has&&rule.route.has.length>0){lines.push(` ${import_chalk31.default.cyan("Has conditions:")}`);for(let condition of rule.route.has)lines.push(` ${formatCondition(condition)}`)}if(rule.route.missing&&rule.route.missing.length>0){lines.push(` ${import_chalk31.default.cyan("Does not have conditions:")}`);for(let condition of rule.route.missing)lines.push(` ${formatCondition(condition)}`)}lines.push("")}),lines.join(`
209
+ `)}var import_chalk32=__toESM(require_source(),1),import_ms6=__toESM(require_ms(),1);async function listVersions2(client,argv){let parsed=await parseSubcommandArgs(argv,listVersionsSubcommand2,client);if(typeof parsed=="number")return parsed;let asJson=!!parsed.flags["--json"],limit=getRenamedOption(parsed.flags,"--limit","--count",{json:asJson});if("error"in limit)return reportRenamedOptionError(client,limit.error,{json:asJson});let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,count=limit.value;if(count!==void 0&&(count<1||count>100))return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:"Count must be between 1 and 100",next:[{command:withGlobalFlags2(client,"routes list-versions --limit 20")}]}),process.exit(1)),output_manager_default.error("Count must be between 1 and 100"),2;let lsStamp=stamp_default();asJson||output_manager_default.spinner(`Fetching route versions for ${import_chalk32.default.bold(project.name)}`);let{versions}=await getRouteVersions(client,project.id,{teamId,count});return asJson?(client.stdout.write(`${JSON.stringify(withWarnings({versions},[limit.warning]),null,2)}
210
+ `),0):(output_manager_default.log(`Route versions for ${import_chalk32.default.bold(project.name)} ${import_chalk32.default.gray(lsStamp())}`),versions.length===0?(output_manager_default.log(`
211
+ No versions found
212
+ `),0):(output_manager_default.print(formatVersionsTable2(versions)),output_manager_default.print(`
213
+ `),0))}function formatVersionsTable2(versions){let rows=versions.map(version=>{let status="";version.isStaging?status=import_chalk32.default.yellow("Staging"):version.isLive?status=import_chalk32.default.green("Live"):status=import_chalk32.default.gray("Previous");let id=version.id.slice(0,12),routeCount=version.ruleCount!==void 0?version.ruleCount.toString():"-",age=getRelativeTime(version.lastModified);return[status,id,routeCount,age]});return formatTable(["Status","ID","Routes","Age"],["l","l","r","l"],[{rows}])}function getRelativeTime(timestamp){let diff=Date.now()-timestamp;return diff<1e3?"just now":(0,import_ms6.default)(diff,{long:!0})+" ago"}var import_chalk33=__toESM(require_source(),1);async function inspect3(client,argv){let parsed=await parseSubcommandArgs(argv,inspectSubcommand4,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags,args}=parsed,teamId=org.type==="team"?org.id:void 0,showDiff=flags["--diff"],asJson=!!flags["--json"],identifier=args[0]==="inspect"?args[1]:args[0];if(!identifier)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Route name or ID is required. Pass a single route name or ID as the first argument after inspect.",next:[{command:withGlobalFlags2(client,"routes inspect <name-or-id>"),when:"replace <name-or-id> with route name or ID from routes list"},{command:withGlobalFlags2(client,"routes list"),when:"to list routes and copy an exact name or id"}]},2),2):(output_manager_default.error(`Missing route name or ID. Usage: ${import_chalk33.default.cyan(withGlobalFlags2(client,"routes inspect <name-or-id>"))}`),2);let inspectStamp=stamp_default();asJson||output_manager_default.spinner(`Searching for route "${identifier}" in ${import_chalk33.default.bold(project.name)}`);let{routes}=await getRoutes(client,project.id,{teamId,search:identifier}),exactMatch=routes.find(r=>r.id===identifier||r.name.toLowerCase()===identifier.toLowerCase()),route2;if(exactMatch)route2=exactMatch;else{if(routes.length===0)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_FOUND,message:`No route found matching "${identifier}".`,next:[{command:withGlobalFlags2(client,"routes list"),when:"to list routes and pick an exact name or id"}]},1),1):(output_manager_default.error(`No route found matching "${identifier}". Run ${import_chalk33.default.cyan(withGlobalFlags2(client,"routes list"))} to see all routes.`),1);if(routes.length===1)route2=routes[0];else{if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.AMBIGUOUS_ROUTE,message:`Multiple routes match "${identifier}" (${routes.length} matches). Pass an exact route name or ID; non-interactive mode cannot prompt for a choice.`,next:[{command:withGlobalFlags2(client,"routes list"),when:"to see route names and ids, then inspect with a unique id"},{command:withGlobalFlags2(client,"routes inspect <name-or-id>"),when:"retry with a single unique name or id"}]},1),1;if(asJson)return output_manager_default.error(`Multiple routes match "${identifier}" (${routes.length} matches). Pass an exact route name or ID.`),1;output_manager_default.log(`Found ${routes.length} routes matching "${identifier}" ${import_chalk33.default.gray(inspectStamp())}`);let selectedId=await client.input.select({message:"Select a route to inspect:",choices:routes.map(r=>({value:r.id,name:`${r.name} ${import_chalk33.default.gray(`(${r.route.src})`)}`}))});if(!selectedId)return output_manager_default.error("No route selected"),1;let selected=routes.find(r=>r.id===selectedId);if(!selected)return output_manager_default.error("Selected route not found"),1;route2=selected}}if(asJson){let productionRoute=showDiff?(await getProductionRoute(client,project.id,teamId,route2.id)).route??null:void 0;return client.stdout.write(`${JSON.stringify({route:route2,productionRoute},null,2)}
214
+ `),0}return output_manager_default.log(`Route found in ${import_chalk33.default.bold(project.name)} ${import_chalk33.default.gray(inspectStamp())}`),showDiff?await showRouteDiff(client,project.id,teamId,route2):(output_manager_default.print(formatRouteDetails(route2)),0)}async function getProductionRoute(client,projectId,teamId,routeId){let{versions}=await getRouteVersions(client,projectId,{teamId}),version=versions.find(v=>v.isLive);if(!version)return{};let{routes}=await getRoutes(client,projectId,{teamId,versionId:version.id});return{version,route:routes.find(r=>r.id===routeId)}}async function showRouteDiff(client,projectId,teamId,stagingRoute){let{version:productionVersion,route:productionRoute}=await getProductionRoute(client,projectId,teamId,stagingRoute.id);return productionVersion?productionRoute?(output_manager_default.print(formatRouteDiff(stagingRoute,productionRoute)),0):(output_manager_default.print(`
215
+ ${import_chalk33.default.bold(stagingRoute.name)} ${import_chalk33.default.green("(new)")}
216
+ `),output_manager_default.print(` ${import_chalk33.default.gray(stagingRoute.id)}
217
+ `),output_manager_default.print(` ${import_chalk33.default.green("This route does not exist in production yet.")}
218
+ `),output_manager_default.print(formatRouteDetails(stagingRoute)),0):(output_manager_default.log("No production version found. Showing current route."),output_manager_default.print(formatRouteDetails(stagingRoute)),0)}function diffField(label,oldVal,newVal){return oldVal===newVal?newVal?` ${import_chalk33.default.cyan(label)} ${newVal}`:"":!oldVal&&newVal?`${import_chalk33.default.green("+")} ${import_chalk33.default.cyan(label)} ${newVal}`:oldVal&&!newVal?`${import_chalk33.default.red("-")} ${import_chalk33.default.cyan(label)} ${import_chalk33.default.strikethrough(oldVal)}`:`${import_chalk33.default.yellow("~")} ${import_chalk33.default.cyan(label)} ${import_chalk33.default.red(oldVal)} \u2192 ${import_chalk33.default.green(newVal)}`}function formatRouteDiff(staging,production){let lines=[""];if(!(JSON.stringify(normalizeForComparison(staging))!==JSON.stringify(normalizeForComparison(production))))return lines.push(` ${import_chalk33.default.bold(staging.name)}`),lines.push(` ${import_chalk33.default.gray(staging.id)}`),lines.push(""),lines.push(` ${import_chalk33.default.gray("No staged changes for this route.")}`),lines.push(""),lines.push(import_chalk33.default.bold(" Route Configuration")),lines.join(`
219
+ `)+`
220
+ `+formatRouteDetails(staging);let typeLabels=getRouteTypeLabel(staging),syntaxLabel=getSrcSyntaxLabel(staging);lines.push(` ${import_chalk33.default.bold(staging.name)} ${import_chalk33.default.yellow("(modified)")}`),lines.push(` ${import_chalk33.default.gray(staging.id)}`),lines.push(""),production.description!==staging.description?(!production.description&&staging.description?lines.push(`${import_chalk33.default.green("+")} ${import_chalk33.default.cyan("Description:")} ${staging.description}`):production.description&&!staging.description?lines.push(`${import_chalk33.default.red("-")} ${import_chalk33.default.cyan("Description:")} ${import_chalk33.default.strikethrough(production.description)}`):lines.push(`${import_chalk33.default.yellow("~")} ${import_chalk33.default.cyan("Description:")} ${import_chalk33.default.red(production.description)} \u2192 ${import_chalk33.default.green(staging.description)}`),lines.push("")):staging.description&&(lines.push(` ${staging.description}`),lines.push(""));let prodStatusText=production.enabled===!1?"Disabled":"Enabled",stagingStatusText=staging.enabled===!1?"Disabled":"Enabled";lines.push(diffField("Status:",prodStatusText,stagingStatusText)||` ${import_chalk33.default.cyan("Status:")} ${stagingStatusText}`),lines.push(` ${import_chalk33.default.cyan("Type:")} ${typeLabels}`),lines.push(""),lines.push(import_chalk33.default.bold(" Route Configuration"));let srcLine=diffField("Source:",production.route.src,staging.route.src);lines.push(srcLine||` ${import_chalk33.default.cyan("Source:")} ${staging.route.src}`),lines.push(` ${import_chalk33.default.cyan("Syntax:")} ${syntaxLabel}`);let destLine=diffField("Destination:",production.route.dest,staging.route.dest);destLine?lines.push(destLine):staging.route.dest&&lines.push(` ${import_chalk33.default.cyan("Destination:")} ${staging.route.dest}`);let prodStatus=production.route.status?String(production.route.status):void 0,stagingStatus=staging.route.status?String(staging.route.status):void 0,statusLine=diffField("HTTP Status:",prodStatus,stagingStatus);statusLine?lines.push(statusLine):staging.route.status&&lines.push(` ${import_chalk33.default.cyan("HTTP Status:")} ${staging.route.status}`);let prodHeaders=production.route.headers??{},stagingHeaders=staging.route.headers??{},allHeaderKeys=new Set([...Object.keys(prodHeaders),...Object.keys(stagingHeaders)]);if(allHeaderKeys.size>0){lines.push(""),lines.push(import_chalk33.default.bold(" Response Headers"));for(let key of allHeaderKeys){let prodVal=prodHeaders[key],stagingVal=stagingHeaders[key];prodVal===stagingVal?lines.push(` ${import_chalk33.default.cyan(key+":")} ${stagingVal}`):prodVal?stagingVal?lines.push(`${import_chalk33.default.yellow("~")} ${import_chalk33.default.cyan(key+":")} ${import_chalk33.default.red(prodVal)} \u2192 ${import_chalk33.default.green(stagingVal)}`):lines.push(`${import_chalk33.default.red("-")} ${import_chalk33.default.cyan(key+":")} ${import_chalk33.default.strikethrough(prodVal)}`):lines.push(`${import_chalk33.default.green("+")} ${import_chalk33.default.cyan(key+":")} ${stagingVal}`)}}let prodTransforms=production.route.transforms??[],stagingTransforms=staging.route.transforms??[];if(prodTransforms.length>0||stagingTransforms.length>0){lines.push(""),lines.push(import_chalk33.default.bold(" Transforms"));let prodKeys=prodTransforms.map(transformKey),stagingKeys=stagingTransforms.map(transformKey);for(let i=0;i<stagingTransforms.length;i++){let key=stagingKeys[i],prodIdx=prodKeys.indexOf(key);if(prodIdx===-1)lines.push(`${import_chalk33.default.green("+")} ${formatTransform(stagingTransforms[i])}`);else{let prodArgs=stringifyArgs(prodTransforms[prodIdx].args),stagingArgs=stringifyArgs(stagingTransforms[i].args);prodArgs!==stagingArgs?lines.push(`${import_chalk33.default.yellow("~")} ${formatTransform(stagingTransforms[i])} ${import_chalk33.default.gray(`(was: ${prodArgs})`)}`):lines.push(` ${formatTransform(stagingTransforms[i])}`)}}for(let i=0;i<prodTransforms.length;i++){let key=prodKeys[i];stagingKeys.includes(key)||lines.push(`${import_chalk33.default.red("-")} ${import_chalk33.default.strikethrough(formatTransformPlain(prodTransforms[i]))}`)}}let prodHas=production.route.has??[],stagingHas=staging.route.has??[];(prodHas.length>0||stagingHas.length>0)&&(lines.push(""),lines.push(import_chalk33.default.bold(" Has Conditions")),diffConditions(lines,prodHas,stagingHas));let prodMissing=production.route.missing??[],stagingMissing=staging.route.missing??[];return(prodMissing.length>0||stagingMissing.length>0)&&(lines.push(""),lines.push(import_chalk33.default.bold(" Does Not Have Conditions")),diffConditions(lines,prodMissing,stagingMissing)),lines.push(""),lines.join(`
221
+ `)}function normalizeForComparison(rule){return{name:rule.name,description:rule.description,enabled:rule.enabled,route:rule.route}}function transformKey(t){let key=isTargetTransform(t)?typeof t.target.key=="string"?t.target.key:JSON.stringify(t.target.key):stringifyArgs(t.args);return`${t.type}:${t.op}:${key}`}function stringifyArgs(args){return args===void 0?"":typeof args=="string"?args:Array.isArray(args)?args.join(", "):JSON.stringify(args)}function formatTransformPlain(transform){let typeLabel=TRANSFORM_TYPE_LABELS[transform.type]??transform.type,key=isTargetTransform(transform)?typeof transform.target.key=="string"?transform.target.key:JSON.stringify(transform.target.key):"path",parts=[`[${typeLabel}]`,transform.op,key];if(transform.args!==void 0&&transform.op!=="delete"){let argsStr=Array.isArray(transform.args)?transform.args.join(", "):transform.args;parts.push(`= ${argsStr}`)}return parts.join(" ")}function conditionKey(c){return JSON.stringify({type:c.type,key:c.key,value:c.value})}function diffConditions(lines,prodConditions,stagingConditions){let prodKeys=prodConditions.map(conditionKey),stagingKeys=stagingConditions.map(conditionKey);for(let cond of stagingConditions){let key=conditionKey(cond);prodKeys.includes(key)?lines.push(` ${formatCondition(cond)}`):lines.push(`${import_chalk33.default.green("+")} ${formatCondition(cond)}`)}for(let cond of prodConditions){let key=conditionKey(cond);stagingKeys.includes(key)||lines.push(`${import_chalk33.default.red("-")} ${formatCondition(cond)}`)}}function formatRouteDetails(rule){let lines=[""],typeLabels=getRouteTypeLabel(rule),syntaxLabel=getSrcSyntaxLabel(rule),statusText=rule.enabled===!1?import_chalk33.default.red("Disabled"):import_chalk33.default.green("Enabled");lines.push(` ${import_chalk33.default.bold(rule.name)}`),lines.push(` ${import_chalk33.default.gray(rule.id)}`),lines.push(""),rule.description&&(lines.push(` ${rule.description}`),lines.push("")),lines.push(` ${import_chalk33.default.cyan("Status:")} ${statusText}`),rule.staged===!0?lines.push(` ${import_chalk33.default.cyan("State:")} ${import_chalk33.default.yellow("Staged (not yet published)")}`):rule.staged===!1&&lines.push(` ${import_chalk33.default.cyan("State:")} ${import_chalk33.default.green("Published")}`),lines.push(` ${import_chalk33.default.cyan("Type:")} ${typeLabels}`),lines.push(""),lines.push(import_chalk33.default.bold(" Route Configuration")),lines.push(` ${import_chalk33.default.cyan("Source:")} ${rule.route.src}`),lines.push(` ${import_chalk33.default.cyan("Syntax:")} ${syntaxLabel}`),rule.route.dest&&lines.push(` ${import_chalk33.default.cyan("Destination:")} ${rule.route.dest}`),rule.route.status&&lines.push(` ${import_chalk33.default.cyan("HTTP Status:")} ${rule.route.status}`);let responseHeaderSets=Object.entries(rule.route.headers??{}),allTransforms=rule.route.transforms??[],responseHeaderTransforms=allTransforms.filter(t=>t.type==="response.headers"),requestHeaderTransforms=allTransforms.filter(t=>t.type==="request.headers"),requestQueryTransforms=allTransforms.filter(t=>t.type==="request.query"),requestPathTransforms=allTransforms.filter(t=>t.type==="request.path");if(responseHeaderSets.length>0||responseHeaderTransforms.length>0){lines.push(""),lines.push(import_chalk33.default.bold(" Response Headers"));for(let[key,value]of responseHeaderSets)lines.push(` ${import_chalk33.default.yellow("set")} ${import_chalk33.default.cyan(key)} = ${value}`);for(let t of responseHeaderTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(requestHeaderTransforms.length>0){lines.push(""),lines.push(import_chalk33.default.bold(" Request Headers"));for(let t of requestHeaderTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(requestQueryTransforms.length>0){lines.push(""),lines.push(import_chalk33.default.bold(" Request Query"));for(let t of requestQueryTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(requestPathTransforms.length>0){lines.push(""),lines.push(import_chalk33.default.bold(" Request Path"));for(let t of requestPathTransforms)lines.push(` ${formatTransform(t,!1)}`)}if(rule.route.has&&rule.route.has.length>0){lines.push(""),lines.push(import_chalk33.default.bold(" Has Conditions"));for(let condition of rule.route.has)lines.push(` ${formatCondition(condition)}`)}if(rule.route.missing&&rule.route.missing.length>0){lines.push(""),lines.push(import_chalk33.default.bold(" Does Not Have Conditions"));for(let condition of rule.route.missing)lines.push(` ${formatCondition(condition)}`)}return lines.push(""),lines.join(`
222
+ `)}var import_chalk34=__toESM(require_source(),1);async function addRoute(client,projectId,routeInput,options={}){let{teamId,position}=options,query=new URLSearchParams;teamId&&query.set("teamId",teamId);let queryString=query.toString(),url=`/v1/projects/${projectId}/routes${queryString?`?${queryString}`:""}`,body={route:routeInput};return position&&(body.position=position),await client.fetch(url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(body)})}function shellQuoteArg(value){return/[\s"'\\]/.test(value)?`"${value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:value}function buildRoutesAddFullFlagsSuggestion(client,parsed){let{args,flags}=parsed,parts=["routes","add"],nameArg=args[0];nameArg==="add"&&args[1]&&!args[1].startsWith("-")&&(nameArg=args[1]),nameArg&&!nameArg.startsWith("-")?parts.push(shellQuoteArg(nameArg)):parts.push("<name>"),flags["--src"]?parts.push("--src",shellQuoteArg(String(flags["--src"]))):parts.push("--src","<path>"),flags["--src-syntax"]&&parts.push("--src-syntax",String(flags["--src-syntax"])),flags["--action"]?parts.push("--action",String(flags["--action"])):parts.push("--action","rewrite");let action=flags["--action"];return flags["--dest"]?parts.push("--dest",shellQuoteArg(String(flags["--dest"]))):(!action||action==="rewrite"||action==="redirect")&&parts.push("--dest","<dest>"),flags["--status"]!==void 0&&flags["--status"]!==null&&parts.push("--status",String(flags["--status"])),parts.push("--yes"),withGlobalFlags2(client,parts.join(" "))}async function add3(client,argv){let parsed=await parseSubcommandArgs(argv,addSubcommand3,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0,{args,flags}=parsed,isAgentMode=client.nonInteractive,skipPrompts=flags["--yes"]||isAgentMode,telemetry=new RoutesAddTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliFlagYes(skipPrompts),telemetry.trackCliFlagNoEnable(flags["--no-enable"]),telemetry.trackCliFlagDisabled(flags["--disabled"]),telemetry.trackCliArgumentName(args[0]),telemetry.trackCliOptionSrc(flags["--src"]),telemetry.trackCliOptionSrcSyntax(flags["--src-syntax"]),telemetry.trackCliOptionAction(flags["--action"]),telemetry.trackCliOptionDest(flags["--dest"]),telemetry.trackCliOptionStatus(flags["--status"]),telemetry.trackCliOptionPosition(flags["--position"]),telemetry.trackCliOptionDescription(flags["--description"]),telemetry.trackCliOptionSetResponseHeader(flags["--set-response-header"]),telemetry.trackCliOptionAppendResponseHeader(flags["--append-response-header"]),telemetry.trackCliOptionDeleteResponseHeader(flags["--delete-response-header"]),telemetry.trackCliOptionSetRequestHeader(flags["--set-request-header"]),telemetry.trackCliOptionAppendRequestHeader(flags["--append-request-header"]),telemetry.trackCliOptionDeleteRequestHeader(flags["--delete-request-header"]),telemetry.trackCliOptionSetRequestQuery(flags["--set-request-query"]),telemetry.trackCliOptionAppendRequestQuery(flags["--append-request-query"]),telemetry.trackCliOptionDeleteRequestQuery(flags["--delete-request-query"]),telemetry.trackCliOptionHas(flags["--has"]),telemetry.trackCliOptionMissing(flags["--missing"]),telemetry.trackCliOptionAi(flags["--ai"]),flags["--disabled"]&&warnDeprecatedInput(client,"--disabled","--no-enable");let aiPrompt=flags["--ai"];if(isAgentMode&&!aiPrompt&&!flags["--src"]){let fullFlagsCmd=buildRoutesAddFullFlagsSuggestion(client,parsed);outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"In non-interactive mode pass either full route flags (name, --src, --action, --dest, --yes) or --ai <description> with --yes. For --src use a URL path pattern that starts with a forward slash / (e.g. /about, /api/:path*). With --src-syntax regex you may use a regex such as ^/api/.*. Run vercel routes add --help for options.",next:[{command:withGlobalFlags2(client,"routes add --ai <description> --yes"),when:"AI generates the route and creates it without prompts when generation succeeds (replace <description>)"},{command:fullFlagsCmd,when:"add missing --src/--dest (or other placeholders) to this command"}],hint:"Requires a CLI with the routes command. --src is a URL path: leading character must be / (forward slash). --ai --yes is non-interactive when the API returns a route; if it fails twice, use full flags or rephrase."},2)}if(aiPrompt){let usedConflicts=["--src","--src-syntax","--action","--dest","--status","--has","--missing","--set-response-header","--append-response-header","--delete-response-header","--set-request-header","--append-request-header","--delete-request-header","--set-request-query","--append-request-query","--delete-request-query","--description","--no-enable","--disabled","--position"].filter(f=>flags[f]!==void 0);return usedConflicts.length>0?(output_manager_default.error(`Cannot use --ai with ${usedConflicts.join(", ")}. Use --ai alone to generate a route from a description.`),1):await handleAIAdd(client,project.id,teamId,aiPrompt,skipPrompts,parsed)}let{versions}=await getRouteVersions(client,project.id,{teamId}),existingStagingVersion=versions.find(v=>v.isStaging),name,nameArg=args[0];if(nameArg){if(nameArg.length>MAX_NAME_LENGTH)return output_manager_default.error(`Route name must be ${MAX_NAME_LENGTH} characters or less.`),1;name=nameArg}else if(skipPrompts){if(isAgentMode){let fullFlagsCmd=buildRoutesAddFullFlagsSuggestion(client,parsed);outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"In non-interactive mode route name is required as the first argument.",next:[{command:fullFlagsCmd,when:"replace <name> and any remaining placeholders"}]},2)}return output_manager_default.error(`Route name is required when using --yes. Usage: ${withGlobalFlags2(client,'routes add "Route Name" --src "/path" --action rewrite --dest "/destination" --yes')}`),2}else{if(!(flags["--src"]!==void 0||flags["--dest"]!==void 0||flags["--status"]!==void 0)&&await client.input.select({message:"How would you like to create this route?",choices:[{name:"Describe what you want (AI-powered)",value:"ai"},{name:"Build manually (step by step)",value:"manual"}]})==="ai")return telemetry.trackCliOptionAi("interactive"),await handleAIAdd(client,project.id,teamId,void 0,skipPrompts,parsed);output_manager_default.log(`Add a new route
223
+ `),name=await client.input.text({message:"Route name:",validate:val=>val?val.length>MAX_NAME_LENGTH?`Name must be ${MAX_NAME_LENGTH} characters or less`:!0:"Route name is required"})}let src,syntax="regex";if(flags["--src-syntax"]){let syntaxArg=flags["--src-syntax"];if(!VALID_SYNTAXES.includes(syntaxArg))return output_manager_default.error(`Invalid syntax: "${syntaxArg}". Valid options: ${VALID_SYNTAXES.join(", ")}.`),1;syntax=syntaxArg}if(flags["--src"])src=stripQuotes(flags["--src"]);else{if(skipPrompts)return isAgentMode&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"In non-interactive mode --src is required. It must be a URL path pattern starting with forward slash / (e.g. /old-page, /api/:path*). Not a Windows path and not backslash. Use --src-syntax regex only if you need a regex pattern.",next:[{command:buildRoutesAddFullFlagsSuggestion(client,parsed),when:"set --src to a path starting with /"}]},2),output_manager_default.error(`Source path is required when using --yes. Usage: ${withGlobalFlags2(client,'routes add "Name" --src "/path" --action rewrite --dest "/dest" --yes')}`),2;{syntax=await client.input.select({message:"How do you want to specify the path?",choices:[{name:"Path pattern (e.g., /api/:version/users/:id)",value:"path-to-regexp"},{name:"Exact match (e.g., /about)",value:"equals"},{name:"Regular expression (e.g., ^/api/(.*)$)",value:"regex"}]});let syntaxHelp=syntax==="path-to-regexp"?"Use :param for parameters, :param* for optional wildcard":syntax==="equals"?"Enter the exact path to match":"Enter a regular expression pattern";src=await client.input.text({message:`Path pattern (${syntaxHelp}):`,validate:val=>val?syntax!=="regex"&&!val.startsWith("/")?"Path must start with / and be a valid URL path":!0:"Path pattern is required"})}}if(syntax!=="regex"&&!src.startsWith("/")){let pathMsg="--src must start with a forward slash / (URL path root). Examples: /about, /api/:path*. Backslash \\ is wrong. If you need a regex, pass --src-syntax regex and a pattern like ^/api/.*";return isAgentMode&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:pathMsg,next:[{command:buildRoutesAddFullFlagsSuggestion(client,parsed),when:"prefix --src with / or use --src-syntax regex"}],hint:"Route source is matched against request URL paths; they always begin with /."},2),output_manager_default.error("Path must start with / (forward slash). Use --src-syntax regex for regex patterns."),2}let actionFlag=flags["--action"],dest=flags["--dest"]?stripQuotes(flags["--dest"]):void 0,status=flags["--status"],actionError=validateActionFlags(actionFlag,dest,status);if(actionError)return isAgentMode&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:actionError,next:[{command:buildRoutesAddFullFlagsSuggestion(client,parsed),when:"fix flags per message (e.g. add --dest for rewrite, --status for redirect)"}]},2),output_manager_default.error(actionError),2;let headers={},transforms=[];try{let transformFlags=extractTransformFlags(flags),collected=collectHeadersAndTransforms(transformFlags);headers=collected.headers,transforms=collected.transforms}catch(e){return output_manager_default.error(`Invalid transform format. ${e instanceof Error?e.message:""}`),1}let hasAnyAction=dest||status||Object.keys(headers).length>0||transforms.length>0;if(!hasAnyAction&&skipPrompts)return isAgentMode&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"In non-interactive mode at least one action is required. Use --action with --dest or --status, or header/transform flags.",next:[{command:buildRoutesAddFullFlagsSuggestion(client,parsed),when:"example rewrite action; adjust --action/--dest/--status as needed"}]},2),output_manager_default.error("At least one action is required when using --yes. Use --action with --dest/--status, or header/transform flags."),2;if(!hasAnyAction&&!skipPrompts){await client.input.confirm("Add conditions (has/does not have)?",!1)&&await collectInteractiveConditions(client,flags);let availableActions=[...ALL_ACTION_CHOICES],actionCount=0;for(;;){let choices=[...availableActions];actionCount>0&&choices.push({name:"Done",value:"done"});let actionType=await client.input.select({message:actionCount===0?"What action should this route perform?":"Add another action:",choices:choices.map(c=>({name:c.name,value:c.value}))});if(actionType==="done")break;if(await collectActionDetails(client,actionType,flags),actionCount++,ALL_ACTION_CHOICES.find(c=>c.value===actionType)?.exclusive){let exclusiveValues=ALL_ACTION_CHOICES.filter(c=>c.exclusive).map(c=>c.value);for(let val of exclusiveValues){let idx=availableActions.findIndex(a=>a.value===val);idx!==-1&&availableActions.splice(idx,1)}}if(availableActions.length===0)break}if(await client.input.confirm("Add a description?",!1)){let desc=await client.input.text({message:"Description:",validate:val=>val&&val.length>MAX_DESCRIPTION_LENGTH?`Description must be ${MAX_DESCRIPTION_LENGTH} characters or less`:!0});desc&&Object.assign(flags,{"--description":desc})}if(await client.input.confirm("Set route position? (default: end)",!1)){let positionChoice=await client.input.select({message:"Position:",choices:[{name:"Start - First route (highest priority)",value:"start"},{name:"End - Last route (lowest priority)",value:"end"},{name:"Before specific route",value:"before"},{name:"After specific route",value:"after"}]});if(positionChoice==="before"||positionChoice==="after"){let refId=await client.input.text({message:`Route ID to place ${positionChoice}:`,validate:val=>val?!0:"Route ID is required"});Object.assign(flags,{"--position":`${positionChoice}:${refId}`})}else Object.assign(flags,{"--position":positionChoice})}}let finalDest=flags["--dest"]?stripQuotes(flags["--dest"]):void 0,finalStatus=flags["--status"];try{let finalTransformFlags=extractTransformFlags(flags),collected=collectHeadersAndTransforms(finalTransformFlags);headers=collected.headers,transforms=collected.transforms}catch(e){return output_manager_default.error(`Invalid transform format. ${e instanceof Error?e.message:""}`),1}let hasConditions=[],missingConditions=[],hasFlags=flags["--has"],missingFlags=flags["--missing"];try{hasFlags&&(hasConditions=parseConditions(hasFlags)),missingFlags&&(missingConditions=parseConditions(missingFlags))}catch(e){return output_manager_default.error(e instanceof Error?e.message:"Invalid condition format"),1}let totalConditions=hasConditions.length+missingConditions.length;if(totalConditions>MAX_CONDITIONS)return output_manager_default.error(`Too many conditions: ${totalConditions}. Maximum is ${MAX_CONDITIONS}.`),1;let description=flags["--description"];if(description&&description.length>MAX_DESCRIPTION_LENGTH)return output_manager_default.error(`Description must be ${MAX_DESCRIPTION_LENGTH} characters or less.`),1;let position,positionFlag=flags["--position"];if(positionFlag)try{position=parsePosition(positionFlag)}catch(e){return output_manager_default.error(`${e instanceof Error?e.message:"Invalid position"}`),1}let isRedirect=finalDest&&finalStatus&&REDIRECT_STATUS_CODES.includes(finalStatus);telemetry.trackCliFlagHasConditions(hasConditions.length>0),telemetry.trackCliFlagMissingConditions(missingConditions.length>0),telemetry.trackCliFlagResponseHeaders(Object.keys(headers).length>0),telemetry.trackCliFlagRequestTransforms(transforms.length>0),isRedirect?telemetry.trackCliActionType("redirect"):finalDest?telemetry.trackCliActionType("rewrite"):finalStatus?telemetry.trackCliActionType("set-status"):(Object.keys(headers).length>0||transforms.length>0)&&telemetry.trackCliActionType("modify");let routeInput={name,description,enabled:!(flags["--no-enable"]||flags["--disabled"]),srcSyntax:syntax,route:{src,...finalDest&&{dest:finalDest},...finalStatus&&{status:finalStatus},...Object.keys(headers).length>0&&{headers},...transforms.length>0&&{transforms},...hasConditions.length>0&&{has:hasConditions},...missingConditions.length>0&&{missing:missingConditions}}};populateRouteEnv(routeInput.route,routeInput.srcSyntax);let addStamp=stamp_default();output_manager_default.spinner(`Adding route "${name}"`);try{let{route:route2,version}=await addRoute(client,project.id,routeInput,{teamId,position});if(isAgentMode){output_manager_default.stopSpinner();let jsonOutput={status:"ok",route:{id:route2.id,name:route2.name,src,...finalDest&&{dest:finalDest},...finalStatus&&{status:finalStatus}},version:{id:version.id,...version.alias&&{alias:version.alias}},...!existingStagingVersion&&{next:[{command:withGlobalFlags2(client,"routes publish --yes"),when:"to promote this version to production"}]},...existingStagingVersion&&{hint:"Review staged changes with vercel routes list --diff before promoting."}};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
224
+ `),0}if(output_manager_default.log(`${import_chalk34.default.cyan("Created")} route "${name}" ${import_chalk34.default.gray(addStamp())}`),output_manager_default.print(`
225
+ ${import_chalk34.default.bold("Route:")} ${route2.name}
226
+ `),output_manager_default.print(` ${import_chalk34.default.gray("ID:")} ${route2.id}
227
+ `),output_manager_default.print(` ${import_chalk34.default.gray("Path:")} ${src}
228
+ `),finalDest?isRedirect?output_manager_default.print(` ${import_chalk34.default.gray("Redirect:")} ${finalDest} (${finalStatus})
229
+ `):output_manager_default.print(` ${import_chalk34.default.gray("Rewrite:")} ${finalDest}
230
+ `):finalStatus&&output_manager_default.print(` ${import_chalk34.default.gray("Status:")} ${finalStatus}
231
+ `),Object.keys(headers).length>0&&output_manager_default.print(` ${import_chalk34.default.gray("Headers:")} ${Object.keys(headers).length} header(s)
232
+ `),transforms.length>0&&output_manager_default.print(` ${import_chalk34.default.gray("Transforms:")} ${transforms.length} transform(s)
233
+ `),(hasConditions.length>0||missingConditions.length>0)&&output_manager_default.print(` ${import_chalk34.default.gray("Conditions:")} ${hasConditions.length} has, ${missingConditions.length} missing
234
+ `),version.alias){let testPath="/";syntax==="equals"?testPath=src:syntax==="path-to-regexp"?testPath=src.replace(/:\w+\*/g,"test").replace(/:\w+/g,"test"):src.startsWith("/")&&(testPath="/"),output_manager_default.print(`
235
+ ${import_chalk34.default.bold("Test your changes:")} ${import_chalk34.default.cyan(`https://${version.alias}${testPath}`)}
236
+ `)}return output_manager_default.print(`
237
+ ${import_chalk34.default.bold("Staging version:")} ${version.id}
238
+ `),await offerAutoPromote(client,project.id,version,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e){let error=e;return isAgentMode&&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}}async function handleAIAdd(client,projectId,teamId,aiPrompt,skipPrompts,parsedForSuggestion){let{versions}=await getRouteVersions(client,projectId,{teamId}),existingStagingVersion=versions.find(v=>v.isStaging),prompt=aiPrompt,currentGenerated,nonInteractiveGenerationRetries=0;for(;;){prompt||(prompt=await client.input.text({message:"Describe the route you want to create:",validate:val=>val?val.length>2e3?"Description must be 2000 characters or less":!0:"A description is required"})),output_manager_default.spinner("Generating route...");let errorMessage;try{let result=await generateRoute(client,projectId,{prompt},{teamId});result.error?errorMessage=result.error:result.route?currentGenerated=result.route:errorMessage="Could not generate a route from that description. Try rephrasing."}catch(e){errorMessage=e.message||"Failed to generate route"}if(currentGenerated)break;if(client.nonInteractive||skipPrompts||!client.stdin.isTTY){if(skipPrompts&&nonInteractiveGenerationRetries<1){nonInteractiveGenerationRetries++,output_manager_default.stopSpinner(),output_manager_default.spinner("Generating route... (retry)");continue}outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ROUTE_GENERATION_FAILED,message:errorMessage||"Could not generate a route after retry. Rephrase --ai description or use full route flags.",next:[{command:withGlobalFlags2(client,"routes add --ai <description> --yes"),when:"retry with a clearer description (replace <description>)"},{command:parsedForSuggestion?buildRoutesAddFullFlagsSuggestion(client,parsedForSuggestion):withGlobalFlags2(client,"routes add <name> --src <path> --action rewrite --dest <dest> --yes"),when:"add with explicit flags if AI keeps failing"}],hint:"Non-interactive --ai runs up to two generation attempts then exits with JSON."},1)}if(output_manager_default.error(errorMessage),skipPrompts||!client.stdin.isTTY)return 1;if(await client.input.select({message:"What would you like to do?",choices:[{name:"Try again with a different description",value:"retry"},{name:"Cancel",value:"cancel"}]})==="cancel")return output_manager_default.log("Cancelled."),0;prompt=void 0}if(printGeneratedRoutePreview(currentGenerated),skipPrompts)return await createFromGenerated(client,projectId,teamId,currentGenerated,existingStagingVersion,skipPrompts);if(!client.stdin.isTTY)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"Route creation from AI preview requires a TTY to confirm, or use full flags with --yes non-interactively.",next:[{command:parsedForSuggestion?buildRoutesAddFullFlagsSuggestion(client,parsedForSuggestion):withGlobalFlags2(client,"routes add <name> --src <path> --action rewrite --dest <dest> --yes"),when:"non-interactive add without AI preview"}]},1),output_manager_default.error(`Cannot interactively confirm route creation in a non-TTY environment. Use full route flags with ${withGlobalFlags2(client,"routes add <name> --src ... --yes")}, or run in a TTY.`),1;for(;;){let choice=await client.input.select({message:"What would you like to do?",choices:[{name:"Create this route",value:"create"},{name:"Edit with AI (describe changes)",value:"ai-edit"},{name:"Edit manually",value:"manual"},{name:"Discard",value:"discard"}],pageSize:4,loop:!1});if(choice==="create")return await createFromGenerated(client,projectId,teamId,currentGenerated,existingStagingVersion,skipPrompts);if(choice==="ai-edit"){let editPrompt=await client.input.text({message:"Describe what you'd like to change:",validate:val=>val?val.length>2e3?"Description must be 2000 characters or less":!0:"A description is required"});output_manager_default.spinner("Updating route...");try{let editResult=await generateRoute(client,projectId,{prompt:editPrompt,currentRoute:convertRouteToCurrentRoute(currentGenerated)},{teamId});if(editResult.error){output_manager_default.error(editResult.error),output_manager_default.log("Keeping previous route:"),printGeneratedRoutePreview(currentGenerated);continue}if(!editResult.route){output_manager_default.error("Could not apply changes. Try rephrasing."),output_manager_default.log("Keeping previous route:"),printGeneratedRoutePreview(currentGenerated);continue}currentGenerated=editResult.route,printGeneratedRoutePreview(currentGenerated)}catch(e){let error=e;output_manager_default.error(error.message||"Failed to update route"),output_manager_default.log("Keeping previous route:"),printGeneratedRoutePreview(currentGenerated)}continue}if(choice==="manual"){let routeInput=generatedRouteToAddInput(currentGenerated),tempRule={name:routeInput.name,description:routeInput.description,enabled:!0,srcSyntax:routeInput.srcSyntax,route:routeInput.route};await runInteractiveEditLoop(client,tempRule),populateRouteEnv(tempRule.route,tempRule.srcSyntax);let addStamp=stamp_default();output_manager_default.spinner(`Adding route "${tempRule.name}"`);try{let{route:route2,version}=await addRoute(client,projectId,{name:tempRule.name,description:tempRule.description,srcSyntax:tempRule.srcSyntax,route:tempRule.route},{teamId});return output_manager_default.log(`${import_chalk34.default.cyan("Created")} route "${route2.name}" ${import_chalk34.default.gray(addStamp())}`),output_manager_default.print(`
239
+ ${import_chalk34.default.bold("Route:")} ${route2.name}
240
+ `),output_manager_default.print(` ${import_chalk34.default.gray("ID:")} ${route2.id}
241
+ `),output_manager_default.print(`
242
+ ${import_chalk34.default.bold("Staging version:")} ${version.id}
243
+ `),await offerAutoPromote(client,projectId,version,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e){let error=e;return output_manager_default.error(error.message||"Failed to create route"),1}}return output_manager_default.log("Discarded."),0}}async function createFromGenerated(client,projectId,teamId,generated,existingStagingVersion,skipPrompts){let routeInput=generatedRouteToAddInput(generated);populateRouteEnv(routeInput.route,routeInput.srcSyntax);let addStamp=stamp_default();output_manager_default.spinner(`Adding route "${routeInput.name}"`);try{let{route:route2,version}=await addRoute(client,projectId,routeInput,{teamId});if(client.nonInteractive){output_manager_default.stopSpinner();let jsonOutput={status:"ok",route:{id:route2.id,name:route2.name,src:routeInput.route.src},version:{id:version.id,...version.alias&&{alias:version.alias}},...!existingStagingVersion&&{next:[{command:withGlobalFlags2(client,"routes publish --yes"),when:"to promote this version to production"}]},...existingStagingVersion&&{hint:"Review staged changes with vercel routes list --diff before promoting."}};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
244
+ `),0}return output_manager_default.log(`${import_chalk34.default.cyan("Created")} route "${route2.name}" ${import_chalk34.default.gray(addStamp())}`),output_manager_default.print(`
245
+ ${import_chalk34.default.bold("Route:")} ${route2.name}
246
+ `),output_manager_default.print(` ${import_chalk34.default.gray("ID:")} ${route2.id}
247
+ `),output_manager_default.print(`
248
+ ${import_chalk34.default.bold("Staging version:")} ${version.id}
249
+ `),await offerAutoPromote(client,projectId,version,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e){let error=e;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_CONFIG5={list:getCommandAliases(listSubcommand5),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand4),add:getCommandAliases(addSubcommand3),update:getCommandAliases(editSubcommand),remove:getCommandAliases(deleteSubcommand2),enable:getCommandAliases(enableSubcommand),disable:getCommandAliases(disableSubcommand),move:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand)};async function main4(client){let telemetry=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand2(subArgs,COMMAND_CONFIG5),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand5),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list3(client,args));case"list-versions":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),0):(telemetry.trackCliSubcommandListVersions(subcommandOriginal),subcommandOriginal==="ls-versions"&&warnDeprecatedSubcommand(client,"routes ls-versions","routes list-versions"),listVersions2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand4),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect3(client,args));case"add":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand3),0):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add3(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"routes edit","routes update"),(await import("./chunks/edit-TM7YCWBU.js")).default(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand2),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"routes delete","routes remove"),(await import("./chunks/delete-EM4JZPFA.js")).default(client,args));case"enable":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand),0):(telemetry.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-72C3QX34.js")).default(client,args));case"disable":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand),0):(telemetry.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-QOM7UHQC.js")).default(client,args));case"move":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),0):(telemetry.trackCliSubcommandMove(subcommandOriginal),subcommandOriginal==="reorder"&&warnDeprecatedSubcommand(client,"routes reorder","routes move"),(await import("./chunks/reorder-B4OXSYCI.js")).default(client,args));case"export":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),0):(telemetry.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-EPLYZF2Q.js")).default(client,args));case"publish":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand),0):(telemetry.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-2HEK5UMJ.js")).default(client,args));case"restore":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),0):(telemetry.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-Q25KRZPH.js")).default(client,args));case"discard-staging":return needHelp?(telemetry.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand),0):(telemetry.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-L5ZH7P5B.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG5)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var import_ms8=__toESM(require_ms(),1);var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFor(duration){duration&&this.trackCliOption({option:"for",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(local){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again."+(local?` Inspect the ${getCommandName("dev")} output for local executions.`:""),retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError(context.local):context.local?{reason:AGENT_REASON.API_ERROR,message:`${error instanceof Error?asSentence(error.message):"Failed to connect to local Schedules."} Check the local session and restart ${getCommandName("dev")} in this project if needed.`,retryable:!1,userActionRequired:!0}:{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(context.local&&context.action==="invoke"&&error.status>=500)return ambiguousInvokeError(!0);if(context.local&&(error.status===401||error.status===402||error.status===403||/(?:project|session)_(?:mismatch|not_found|expired)/.test(error.code??"")||/^(?:local )?(?:project|session)\b/.test(serverMessage??"")))return{reason:AGENT_REASON.API_ERROR,message:`${apiErrorDetail(error)??"The local Schedules session is unavailable."} Restart ${getCommandName("dev")} in this project and use its local session.`,retryable:!1,userActionRequired:!0};if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_single_at_passed")return{reason:AGENT_REASON.SCHEDULE_SINGLE_AT_PASSED,message:context.name?`Schedule ${context.namespace}/${context.name} has passed its scheduled time and can't be modified. Delete it or create a new schedule.`:"The schedule has passed its scheduled time and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="schedule_already_active"){let schedule=context.name?[quoteArg(context.name),`--namespace ${quoteArg(context.namespace)}`,...context.trackArgs??[]].join(" "):void 0;return{reason:AGENT_REASON.SCHEDULE_ALREADY_ACTIVE,message:context.name?`Schedule ${context.namespace}/${context.name} is already enabled without an end time. Disable it first, then enable it with --until or --for.`:"The schedule is already enabled without an end time. Disable it first, then enable it with --until or --for.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes","--until","--for"]}),when:"Disable the schedule before enabling it with an end time"}]}}}if(error.code==="static_schedule"){let schedule=context.name?[quoteArg(context.name),`--namespace ${quoteArg(context.namespace)}`,...context.trackArgs??[]].join(" "):void 0;return{reason:AGENT_REASON.STATIC_SCHEDULE,message:context.name?`Static schedule ${context.namespace}/${context.name} can't be updated or deleted. Enable or disable it instead.`:"Static schedules can't be updated or deleted. Enable or disable them instead.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules enable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Enable the static schedule"},{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Disable the static schedule"}]}}}if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="single_at_too_soon")return{reason:AGENT_REASON.SINGLE_AT_TOO_SOON,message:`${apiErrorDetail(error)??"The one-time schedule is too soon."} Choose a later value for \`--at\`.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||!context.local&&error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError(context.local):{reason:AGENT_REASON.API_ERROR,message:context.local?`Local Schedules is unavailable. Check the ${getCommandName("dev")} output and restart the local session if needed.`:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details},1),1):(output_manager_default.fatal(details.message),1)}var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default",DEFAULT_SCHEDULES_LIMIT=20,LocalSchedulesError=class extends Error{constructor(message){super(message),this.name="LocalSchedulesError"}};function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;if("local"in options){if(!isLocalSchedulesOrigin(options.local.origin))throw new LocalSchedulesError("Local Schedules requires an HTTP 127.0.0.1 endpoint with a valid port.");this.baseUrl=new URL(options.local.origin);return}this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}get localOrigin(){return"local"in this.options?this.baseUrl.origin:void 0}async request(path,options={}){let url=new URL(path,this.baseUrl);if("local"in this.options){let session=this.options.local;url.searchParams.set("projectId",session.projectId);let response;try{response=await directFetch(url.href,{method:options.method??"GET",headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id,...options.body===void 0?{}:{"content-type":"application/json"}},body:options.body===void 0?void 0:JSON.stringify(options.body),redirect:"manual",signal:AbortSignal.timeout(3e4)})}catch{throw new LocalSchedulesError(`Could not reach local Schedules at ${session.origin}. No cloud request was made.`)}if(response.status>=300&&response.status<400||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session changed or returned an unexpected response. Restart vercel dev and try again.");if(!response.ok)throw await responseError(response);if(response.status===204)return;try{return await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned an invalid JSON response.")}}return url.searchParams.set("projectId",this.options.projectId),this.options.environment!==void 0&&url.searchParams.set("env",this.options.environment),this.options.gitBranch!==void 0&&url.searchParams.set("branch",this.options.gitBranch),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,limit=DEFAULT_SCHEDULES_LIMIT}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor!==void 0&&searchParams.set("cursor",cursor);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,activeUntil}){return this.changeState(name,namespace,"enable",activeUntil===void 0?void 0:{until:activeUntil})}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action,body){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0,...body&&{body}});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor,limit=DEFAULT_SCHEDULES_LIMIT,sort,from,to,executionId}){if("local"in this.options)throw new LocalSchedulesError("Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.");let searchParams=new URLSearchParams({limit:String(limit)});return cursor!==void 0&&searchParams.set("cursor",cursor),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};async function createLocalSchedulesClient(client){let sessions=await readLocalSchedulesSessions(client.cwd);if(sessions.length===0)throw new LocalSchedulesError("No running local Schedules session was found in this directory. Start vercel dev here, or use --cwd to select its project directory.");if(sessions.length>1)throw new LocalSchedulesError("Multiple vercel dev sessions are running in this directory. Stop the extra instances before using schedules --local.");let[session]=sessions,response;try{response=await directFetch(`${session.origin}/v1/info`,{headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id},redirect:"manual",signal:AbortSignal.timeout(2e3)})}catch{throw new LocalSchedulesError(`The local Schedules session at ${session.origin} is unavailable. Restart vercel dev in this directory. No cloud request was made.`)}if(!response.ok||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session is stale, not ready, or incompatible. Restart vercel dev in this directory.");let info;try{info=await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned invalid metadata. Restart vercel dev in this directory.")}if(!info||info.version!==session.version||info.id!==session.id||info.pid!==session.pid||info.cwd!==session.cwd||info.origin!==session.origin||info.projectId!==session.projectId)throw new LocalSchedulesError("The local Schedules session does not match this project instance. Restart vercel dev in this directory.");return new SchedulesClient(client,{local:session})}var import_ms7=__toESM(require_ms(),1),MAX_IDENTIFIER_LENGTH=256,IDENTIFIER_PATTERN=/^[0-9A-Za-z][0-9A-Za-z._-]*$/,MAX_QUEUE_TOPIC_LENGTH=256,QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/,MAX_JITTER_MINUTES=15,LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>MAX_IDENTIFIER_LENGTH)return`${label} must be at most ${MAX_IDENTIFIER_LENGTH} characters.`;if(!IDENTIFIER_PATTERN.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>MAX_QUEUE_TOPIC_LENGTH||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>MAX_JITTER_MINUTES?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}var UNIX_MILLISECONDS_PATTERN=/^\d+$/,ISO_DATE_PATTERN=/^(\d{4})-(\d{2})-(\d{2})/,DURATION_PATTERN=/^\d+(?:\.\d+)?\s*[a-z]+$/i;function parseEnableUntil(until,duration,now=Date.now()){if(until!==void 0&&duration!==void 0)return{valid:!1,error:"`--until` and `--for` cannot be used together."};if(duration!==void 0){let durationMs=DURATION_PATTERN.test(duration.trim())?(0,import_ms7.default)(duration.trim()):void 0;return durationMs===void 0||!(durationMs>0)?{valid:!1,error:"`--for` must be a duration such as 30m, 5h, or 10s."}:{valid:!0,value:now+durationMs}}if(until===void 0)return{valid:!0,value:void 0};let untilMs,isoDate=ISO_DATE_PATTERN.exec(until);if(UNIX_MILLISECONDS_PATTERN.test(until))untilMs=Number(until);else if(isoDate){let[,year,month,day]=isoDate.map(Number),daysInMonth=new Date(Date.UTC(year,month,0)).getUTCDate();untilMs=day>=1&&day<=daysInMonth?Date.parse(until):NaN}else return{valid:!1,error:DURATION_PATTERN.test(until.trim())?`\`--until\` must be a time, not a duration. Use \`--for ${until.trim()}\` instead.`:"`--until` must be an ISO 8601 time or Unix milliseconds."};return Number.isFinite(untilMs)?untilMs<=now?{valid:!1,error:"`--until` must be in the future."}:{valid:!0,value:untilMs}:{valid:!1,error:"`--until` must be an ISO 8601 time or Unix milliseconds."}}var routingFlags2=getFlagsSpecification([...schedulesCommand.subcommands.flatMap(command2=>[...command2.options]),...executionsListSubcommand.options]);function takeScheduleCommand(argv){return takeCommand(argv,routingFlags2)}function scheduleCommandWithGlobalFlags(client,usage){let local=!1;try{local=!!parseArguments(client.argv.slice(2),routingFlags2,{permissive:!0}).flags["--local"]}catch{}return buildCommandWithGlobalFlags(client.argv,`${usage}${local?" --local":""}`,void 0,{excludeFlags:local?["--scope","--team"]:[]})}function validateLocalScheduleFlags(client,flags,usage){if(flags["--environment"]!==void 0&&flags["--git-branch"]!==void 0)return invalidScheduleArguments(client,usage,"Use either --environment or --git-branch, not both.");if(!flags["--local"])return;for(let flag of["--environment","--git-branch"])if(flags[flag]!==void 0)return invalidScheduleArguments(client,usage,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`);let originalFlags;try{originalFlags=parseArguments(client.argv.slice(2),routingFlags2,{permissive:!0}).flags}catch(error){return invalidScheduleArguments(client,usage,error instanceof Error?error.message:String(error))}for(let flag of["--scope","--team","--token"])if(flags[flag]!==void 0||originalFlags[flag]!==void 0)return invalidScheduleArguments(client,usage,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`)}function unsupportedLocalExecutions(client){let message="Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.";return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}async function resolveSchedulesClient(client,flags){if(flags["--local"])try{let schedules=await createLocalSchedulesClient(client);return output_manager_default.log(`Using local Schedules at ${schedules.localOrigin}`),schedules}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}let link=await requireProjectContext(client,"schedules");return typeof link=="number"?link:new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id,environment:flags["--environment"],gitBranch:flags["--git-branch"]})}function scheduleTrackArgs(flags){let args=[];return flags["--environment"]!==void 0&&args.push(`--environment ${quoteArg(flags["--environment"])}`),flags["--git-branch"]!==void 0&&args.push(`--git-branch ${quoteArg(flags["--git-branch"])}`),args}function invalidScheduleArguments(client,usage,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,usage),when:"Provide valid schedule arguments"}]}),2):(output_manager_default.fatal(message),2)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage,`Expected one schedule name. Usage: ${getCommandName(usage)}`)};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,usage,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage,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)}
250
+ `)}else output_manager_default.success(message);return 0}async function runScheduleAction(client,argv,action){let subcommand=action==="enable"?enableSubcommand2:action==="disable"?disableSubcommand2:invokeSubcommand,usage=`schedules ${action} <name>`,telemetry=new SchedulesActionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(subcommand.options))}catch(error){return invalidScheduleArguments(client,usage,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs,enableFlags=flags;telemetry.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,usage);if(conflict!==void 0)return conflict;telemetry.trackCliArgumentName(args[0]),telemetry.trackCliOptionNamespace(flags["--namespace"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliOptionGitBranch(flags["--git-branch"]),telemetry.trackCliOptionUntil(enableFlags["--until"]),telemetry.trackCliOptionFor(enableFlags["--for"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],usage);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,usage,flags);if(!outputMode.valid)return outputMode.exitCode;let activeUntil=parseEnableUntil(enableFlags["--until"],enableFlags["--for"]);if(!activeUntil.valid)return invalidScheduleArguments(client,usage,activeUntil.error);if(flags["--local"]&&activeUntil.value!==void 0)return invalidScheduleArguments(client,usage,"Cannot combine --local with --until or --for. Local Schedules does not support enabling a schedule until a time.");let schedulesClient=await resolveSchedulesClient(client,flags);if(typeof schedulesClient=="number")return schedulesClient;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedule;try{action==="enable"?schedule=await schedulesClient.enable({...identifier,activeUntil:activeUntil.value}):action==="disable"?schedule=await schedulesClient.disable(identifier):await schedulesClient.invoke(identifier)}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action,local:flags["--local"],name:identifier.name,namespace:identifier.namespace,trackArgs:scheduleTrackArgs(flags)})}output_manager_default.stopSpinner();let pastTense=action==="enable"?"Enabled":action==="disable"?"Disabled":"Invoked",enabledUntil=schedule?.activeUntil??activeUntil.value,message=action==="enable"&&enabledUntil!==void 0?`${pastTense} schedule ${identifier.namespace}/${identifier.name} until ${new Date(enabledUntil).toISOString()} (in ${(0,import_ms8.default)(Math.max(enabledUntil-Date.now(),1e3),{long:!0})}).`:`${pastTense} schedule ${identifier.namespace}/${identifier.name}.`;if(schedule)return writeScheduleMutationResult(client,schedule,message,outputMode.json);if(outputMode.json){let result=client.nonInteractive?{status:AGENT_STATUS.OK,message}:{invoked:!0,name:identifier.name,namespace:identifier.namespace};client.stdout.write(`${JSON.stringify(result,null,2)}
251
+ `)}else output_manager_default.success(message);return 0}var SchedulesCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",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(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE14="schedules create <name> --cron <expression> --topic <topic>";async function create(client,argv){let telemetry=new SchedulesCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(createSubcommand2.options))}catch(error){return invalidScheduleArguments(client,USAGE14,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE14);if(conflict!==void 0)return conflict;telemetry.trackCliArgumentName(args[0]),telemetry.trackCliOptionNamespace(flags["--namespace"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliOptionGitBranch(flags["--git-branch"]),telemetry.trackCliOptionCron(flags["--cron"]),telemetry.trackCliOptionAt(flags["--at"]),telemetry.trackCliOptionTimezone(flags["--timezone"]),telemetry.trackCliOptionJitter(flags["--jitter"]),telemetry.trackCliOptionTopic(flags["--topic"]),telemetry.trackCliOptionPayload(flags["--payload"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE14);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!0);if(!expression.valid)return invalidScheduleArguments(client,USAGE14,expression.error);let topic=flags["--topic"];if(!topic?.trim())return invalidScheduleArguments(client,USAGE14,"A target queue topic is required. Use `--topic`.");let topicError=validateScheduleQueueTopic(topic);if(topicError)return invalidScheduleArguments(client,USAGE14,topicError);let jitter=parseCreateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE14,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE14,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE14,payload.error);let outputMode=parseScheduleOutput(client,USAGE14,flags);if(!outputMode.valid)return outputMode.exitCode;let schedules=await resolveSchedulesClient(client,flags);if(typeof schedules=="number")return schedules;outputMode.json||output_manager_default.spinner("Creating schedule\u2026");let schedule;try{schedule=await schedules.create({name:identifier.name,namespace:identifier.namespace,expression:expression.value,target:{topic},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...jitter.value!==void 0&&{jitter:jitter.value},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"create",local:flags["--local"],name:identifier.name,namespace:identifier.namespace,trackArgs:scheduleTrackArgs(flags)})}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})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules delete <name> --yes";async function deleteSchedule(client,argv){let telemetry=new SchedulesDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(deleteSubcommand3.options))}catch(error){return invalidScheduleArguments(client,USAGE15,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE15);if(conflict!==void 0)return conflict;telemetry.trackCliArgumentName(args[0]),telemetry.trackCliOptionNamespace(flags["--namespace"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliOptionGitBranch(flags["--git-branch"]),telemetry.trackCliFlagYes(flags["--yes"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE15);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,USAGE15,flags);if(!outputMode.valid)return outputMode.exitCode;let skipConfirmation=flags["--yes"]??!1;if(client.nonInteractive&&!skipConfirmation)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:flags["--local"]?"Deleting a local schedule requires confirmation. Re-run with `--yes`.":"Deleting a schedule requires confirmation. Re-run with `--yes`.",next:[{command:flags["--local"]?scheduleCommandWithGlobalFlags(client,`schedules delete ${quoteArg(identifier.name)} --namespace ${quoteArg(identifier.namespace)} --yes`):buildCommandWithYes(client.argv)}]},1),1;let schedules=await resolveSchedulesClient(client,flags);if(typeof schedules=="number")return schedules;let target=flags["--local"]?"local schedule":"schedule";if(!skipConfirmation&&!await client.input.confirm(`Delete ${target} ${identifier.namespace}/${identifier.name}? This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;outputMode.json||output_manager_default.spinner("Deleting schedule\u2026");let deletedScheduleId;try{deletedScheduleId=(await schedules.delete(identifier)).scheduleId}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"delete",local:flags["--local"],name:identifier.name,namespace:identifier.namespace,trackArgs:scheduleTrackArgs(flags)})}output_manager_default.stopSpinner();let message=`Deleted ${target} ${identifier.namespace}/${identifier.name}.`;if(outputMode.json){let deleted={name:identifier.name,namespace:identifier.namespace,scheduleId:deletedScheduleId},result=client.nonInteractive?{status:AGENT_STATUS.OK,deleted,message}:{deleted:!0,...deleted};client.stdout.write(`${JSON.stringify(result,null,2)}
252
+ `)}else output_manager_default.success(message);return 0}var import_chalk35=__toESM(require_source(),1);var SchedulesListExecutionsTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from!==void 0&&this.trackCliOption({option:"from",value:String(from)})}trackCliOptionTo(to){to!==void 0&&this.trackCliOption({option:"to",value:String(to)})}trackCliOptionExecution(execution){execution&&this.trackCliOption({option:"execution",value:this.redactedValue})}trackCliOptionExecutionId(executionId){executionId&&this.trackCliOption({option:"execution-id",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE16="schedules executions list <name>",MAX_EXECUTION_RANGE_MS=30*864e5;function invalidArguments(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE16),when:"List schedule executions with valid options"}]}),2):(output_manager_default.fatal(message),2)}function capitalize(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExecutionStatus(status){return status==="succeeded"?import_chalk35.default.green("Succeeded"):status==="failed"?import_chalk35.default.red("Failed"):import_chalk35.default.gray("Unavailable")}function formatPercentage2(value){return value===null?import_chalk35.default.gray("-"):`${Number((value*100).toFixed(2))}%`}function formatDuration(value){return value===null?import_chalk35.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(metrics){return[formatAlignedLabel("Range",`${formatDate(metrics.from)} \u2013 ${formatDate(metrics.to)}`),formatAlignedLabel("Recorded",formatInvocationCount(metrics.recordedInvocations)),formatAlignedLabel("Failed",formatInvocationCount(metrics.failedInvocations)),formatAlignedLabel("Error Rate",formatPercentage2(metrics.errorRate)),formatAlignedLabel("Avg Duration",formatDuration(metrics.averageDurationMs))].join(`
253
+ `)}function executionTable(executions2){let rows=[["Execution ID","Status","Source","Fired At"].map(header=>import_chalk35.default.dim(header)),...executions2.map(execution=>[import_chalk35.default.bold(execution.executionId),formatExecutionStatus(execution.status),execution.invokeSource?capitalize(execution.invokeSource):import_chalk35.default.gray("-"),execution.firedAt===null?import_chalk35.default.gray("-"):formatDate(execution.firedAt)])];return table(rows,{hsep:3}).split(`
254
+ `).map(line=>line.trimEnd()).join(`
255
+ `).replace(/^/gm," ")}function nextPageCommand(client,name,namespace,options){let parts=["schedules executions list",quoteArg(name)];return options.namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),parts.push(...options.trackArgs),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(`--since ${new Date(options.from).toISOString()} --until ${new Date(options.to).toISOString()}`),options.executionId!==void 0&&parts.push(`--execution ${quoteArg(options.executionId)}`),parts.push(`--next ${quoteArg(options.cursor)}`),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function resolveTimeBound(flag,value,legacyFlag,legacyValue){if(value!==void 0&&legacyValue!==void 0)return{error:`Pass only one of \`${flag}\` or \`${legacyFlag}\`. (\`${legacyFlag}\` is deprecated.)`};if(legacyValue!==void 0)return!Number.isInteger(legacyValue)||legacyValue<0?{error:`\`${legacyFlag}\` must be a non-negative integer (Unix milliseconds).`}:{value:legacyValue};if(value===void 0)return{};if(!value.trim())return{error:`\`${flag}\` cannot be empty.`};let result=validateTimeBound(value);return result.valid?{value:result.value?.getTime()}:{error:`\`${flag}\`: ${result.message}`}}function resolveTimeRange2(since,until,legacyFrom,legacyTo){let now=Date.now(),start=resolveTimeBound("--since",since,"--from",legacyFrom);if("error"in start)return start;let end=resolveTimeBound("--until",until,"--to",legacyTo);if("error"in end)return end;let sinceName=legacyFrom!==void 0?"--from":"--since",untilName=legacyTo!==void 0?"--to":"--until",from=start.value;if(from===void 0)return end.value!==void 0?{error:`\`${untilName}\` requires \`--since\`.`}:{};let to=end.value??now;return to<=from?{error:`\`${untilName}\` must be after \`${sinceName}\`.`}:to-from>MAX_EXECUTION_RANGE_MS?{error:"The time range must be at most 30 days."}:{from,to}}async function list4(client,argv){let telemetry=new SchedulesListExecutionsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(executionsListSubcommand.options))}catch(error){return invalidArguments(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE16);if(conflict!==void 0)return conflict;if(flags["--local"])return unsupportedLocalExecutions(client);let[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:DEFAULT_SCHEDULES_LIMIT}),sort=flags["--sort"],execution=getRenamedOption(flags,"--execution","--execution-id",{json:wantsMachineReadableOutput(void 0,client.argv)||client.nonInteractive});if(telemetry.trackCliArgumentName(name),telemetry.trackCliOptionNamespace(flags["--namespace"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliOptionGitBranch(flags["--git-branch"]),telemetry.trackCliOptionLimit(flags["--limit"]),telemetry.trackCliOptionNext(flags["--next"]),telemetry.trackCliOptionSort(sort),telemetry.trackCliOptionSince(flags["--since"]),telemetry.trackCliOptionUntil(flags["--until"]),telemetry.trackCliOptionFrom(flags["--from"]),telemetry.trackCliOptionTo(flags["--to"]),telemetry.trackCliOptionExecution(flags["--execution"]),telemetry.trackCliOptionExecutionId(flags["--execution-id"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),"error"in execution)return invalidArguments(client,execution.error);let executionId=execution.value;if(!name)return invalidArguments(client,`A schedule name is required. Usage: ${getCommandName(USAGE16)}`);if(args.length!==1)return invalidArguments(client,`Expected one schedule name. Usage: ${getCommandName(USAGE16)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments(client,namespaceError);if(!limitResult.valid)return invalidArguments(client,limitResult.message);if(sort!==void 0&&sort!=="asc"&&sort!=="desc")return invalidArguments(client,"`--sort` must be `asc` or `desc`.");let timeRange=resolveTimeRange2(flags["--since"],flags["--until"],flags["--from"],flags["--to"]);if("error"in timeRange)return invalidArguments(client,timeRange.error);let{from,to}=timeRange;if(flags["--from"]!==void 0&&output_manager_default.warn("`--from` is deprecated, please use `--since` instead"),flags["--to"]!==void 0&&output_manager_default.warn("`--to` is deprecated, please use `--until` instead"),executionId!==void 0&&!executionId.trim()){let typed=flags["--execution-id"]!==void 0?"--execution-id":"--execution";return invalidArguments(client,`\`${typed}\` cannot be empty.`)}let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,schedules=await resolveSchedulesClient(client,flags);if(typeof schedules=="number")return schedules;asJson||output_manager_default.spinner(`Fetching executions for ${namespace}/${name}\u2026`);let result;try{result=await schedules.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",local:flags["--local"],name,namespace,trackArgs:scheduleTrackArgs(flags)})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,pagination:{next:result.cursor??null},metrics:result.metrics,message:`Found ${result.data.length} execution${result.data.length===1?"":"s"} for schedule ${namespace}/${name}.`}:{...result,pagination:{next:result.cursor??null}};return client.stdout.write(`${JSON.stringify(withWarnings(jsonOutput,[execution.warning]),null,2)}
256
+ `),0}if(output_manager_default.print(`Executions for schedule ${import_chalk35.default.bold(`${namespace}/${name}`)}
257
+
258
+ ${executionMetrics(result.metrics)}
259
+ `),result.data.length===0)return output_manager_default.print(`
260
+ No executions found for schedule ${import_chalk35.default.bold(`${namespace}/${name}`)}.
261
+ `),0;if(output_manager_default.print(`
262
+ ${executionTable(result.data)}
263
+ `),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,trackArgs:scheduleTrackArgs(flags),cursor:result.cursor});output_manager_default.print(`
264
+ `),printNextPageCommand(next)}return 0}var COMMAND_CONFIG6={list:getCommandAliases(executionsListSubcommand)};async function executions(client,args,telemetry){let parsedArgs,commandArgs;try{commandArgs=takeScheduleCommand(args),parsedArgs=parseArguments(commandArgs.args,getFlagsSpecification(executionsListSubcommand.options),{warnDeprecated:!1})}catch(error){return client.nonInteractive?invalidScheduleArguments(client,"schedules executions",error instanceof Error?error.message:String(error)):(printError(error),2)}let{subcommand,subcommandOriginal}=getSubcommand2(commandArgs.command?[commandArgs.command]:[],COMMAND_CONFIG6),subArgs=commandArgs.args,needHelp=parsedArgs.flags["--help"],conflict=validateLocalScheduleFlags(client,parsedArgs.flags,"schedules executions");if(conflict!==void 0)return conflict;if(parsedArgs.flags["--local"]&&!needHelp)return unsupportedLocalExecutions(client);function printHelp(command2,nested){return output_manager_default.print(help(command2,{parent:nested?{...schedulesCommand,name:"schedules executions"}:schedulesCommand,columns:client.stderr.columns})),0}return subcommand?subcommand==="list"?needHelp?(telemetry.trackCliFlagHelp("schedules",`executions:${subcommandOriginal}`),printHelp(executionsListSubcommand,!0)):(telemetry.trackCliSubcommandExecutionsList(subcommandOriginal),list4(client,subArgs)):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG6)),printHelp(executionsSubcommand,!1)):needHelp?(telemetry.trackCliFlagHelp("schedules","executions"),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),0):(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG6)),output_manager_default.print(help(executionsSubcommand,{parent:schedulesCommand,columns:client.stderr.columns})),2)}var import_chalk36=__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 target.service===void 0?`Function: ${target.function}`:`Function: ${target.function} (service ${target.service})`}}function formatScheduleTargetDetail(target){switch(target.type){case"queue":return`${target.topic} ${import_chalk36.default.gray("(Queue)")}`;case"path":return`${target.path} ${import_chalk36.default.gray("(Path)")}`;case"function":return target.service===void 0?`${target.function} ${import_chalk36.default.gray("(Function)")}`:`${target.function} ${import_chalk36.default.gray(`(Function in service ${target.service})`)}`}}var SchedulesGetTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE17="schedules inspect <name>";function invalidArguments2(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,USAGE17),when:"Provide a valid schedule name"}]}),2):(output_manager_default.fatal(message),2)}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 get(client,argv){let telemetry=new SchedulesGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(getSubcommand.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)}),2):(output_manager_default.fatal(error instanceof Error?error.message:String(error)),2)}let{args,flags}=parsedArgs;telemetry.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE17);if(conflict!==void 0)return conflict;let[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE;if(telemetry.trackCliArgumentName(name),telemetry.trackCliOptionNamespace(flags["--namespace"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliOptionGitBranch(flags["--git-branch"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),!name)return invalidArguments2(client,"A schedule name is required");if(args.length!==1)return invalidArguments2(client,`Expected one schedule name. Usage: ${getCommandName(USAGE17)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments2(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments2(client,namespaceError);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments2(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,schedules=await resolveSchedulesClient(client,flags);if(typeof schedules=="number")return schedules;asJson||output_manager_default.spinner("Fetching schedule\u2026");let schedule;try{schedule=await schedules.get({name,namespace})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"get",local:flags["--local"],name,namespace,trackArgs:scheduleTrackArgs(flags)})}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)}
265
+ `),0}return printSchedule(schedule),0}var import_chalk37=__toESM(require_source(),1);var SchedulesListTelemetryClient=class extends TelemetryClient{trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",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})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE18="schedules list";function invalidArguments3(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,USAGE18),when:"List schedules with valid options"}]}),2):(output_manager_default.fatal(message),2)}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_chalk37.default.dim(header)),...schedules.map(schedule=>[import_chalk37.default.bold(schedule.name),capitalize3(schedule.state),capitalize3(schedule.expression.type),formatExpression2(schedule.expression),formatScheduleTarget(schedule.target)])];return table(rows,{hsep:3}).split(`
266
+ `).map(line=>line.trimEnd()).join(`
267
+ `).replace(/^/gm," ")}function nextPageCommand2(client,namespace,namespaceWasExplicit,limit,limitWasExplicit,trackArgs,cursor){let parts=["schedules list"];return namespaceWasExplicit&&parts.push(`--namespace ${quoteArg(namespace)}`),parts.push(...trackArgs),limitWasExplicit&&parts.push(`--limit ${limit}`),parts.push(`--next ${quoteArg(cursor)}`),scheduleCommandWithGlobalFlags(client,parts.join(" "))}async function list5(client,argv){let telemetry=new SchedulesListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(listSubcommand6.options))}catch(error){return invalidArguments3(client,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE18);if(conflict!==void 0)return conflict;let namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE,limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:100,defaultValue:DEFAULT_SCHEDULES_LIMIT});if(telemetry.trackCliOptionNamespace(flags["--namespace"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliOptionGitBranch(flags["--git-branch"]),telemetry.trackCliOptionLimit(flags["--limit"]),telemetry.trackCliOptionNext(flags["--next"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),args.length!==0)return invalidArguments3(client,`Expected no arguments. Usage: ${getCommandName(USAGE18)}`);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments3(client,namespaceError);if(!limitResult.valid)return invalidArguments3(client,limitResult.message);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments3(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,schedules=await resolveSchedulesClient(client,flags);if(typeof schedules=="number")return schedules;asJson||output_manager_default.spinner("Fetching schedules\u2026");let result;try{result=await schedules.list({namespace,cursor:flags["--next"],limit:limitResult.value})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"list",local:flags["--local"],namespace,trackArgs:scheduleTrackArgs(flags)})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,data:result.data,cursor:result.cursor,pagination:{next:result.cursor??null},message:`Found ${result.data.length} schedule${result.data.length===1?"":"s"} in namespace ${namespace}.`}:{...result,pagination:{next:result.cursor??null}};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
268
+ `),0}if(result.data.length===0)return output_manager_default.print(`No schedules found in namespace ${namespace}.
269
+ `),0;if(output_manager_default.print(`Schedules in namespace ${import_chalk37.default.bold(namespace)}
270
+
271
+ ${scheduleTable(result.data)}
272
+ `),result.cursor){let next=nextPageCommand2(client,namespace,flags["--namespace"]!==void 0,limitResult.value,flags["--limit"]!==void 0,scheduleTrackArgs(flags),result.cursor);output_manager_default.print(`
273
+ `),printNextPageCommand(next)}return 0}var SchedulesUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionCron(cron){cron&&this.trackCliOption({option:"cron",value:this.redactedValue})}trackCliOptionAt(at){at&&this.trackCliOption({option:"at",value:this.redactedValue})}trackCliOptionTimezone(timezone){timezone&&this.trackCliOption({option:"timezone",value:timezone})}trackCliOptionJitter(jitter){jitter!==void 0&&this.trackCliOption({option:"jitter",value:jitter})}trackCliOptionTopic(topic){topic&&this.trackCliOption({option:"topic",value:this.redactedValue})}trackCliOptionPayload(payload){payload!==void 0&&this.trackCliOption({option:"payload",value:this.redactedValue})}trackCliOptionFormat(format2){format2&&this.trackCliOption({option:"format",value:format2})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE19="schedules update <name> [options]";async function update2(client,argv){let telemetry=new SchedulesUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(updateSubcommand3.options))}catch(error){return invalidScheduleArguments(client,USAGE19,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE19);if(conflict!==void 0)return conflict;telemetry.trackCliArgumentName(args[0]),telemetry.trackCliOptionNamespace(flags["--namespace"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliOptionGitBranch(flags["--git-branch"]),telemetry.trackCliOptionCron(flags["--cron"]),telemetry.trackCliOptionAt(flags["--at"]),telemetry.trackCliOptionTimezone(flags["--timezone"]),telemetry.trackCliOptionJitter(flags["--jitter"]),telemetry.trackCliOptionTopic(flags["--topic"]),telemetry.trackCliOptionPayload(flags["--payload"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE19);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!1);if(!expression.valid)return invalidScheduleArguments(client,USAGE19,expression.error);let jitter=parseUpdateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE19,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE19,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE19,payload.error);if(!(expression.value!==void 0||flags["--timezone"]!==void 0||flags["--jitter"]!==void 0||flags["--topic"]!==void 0||flags["--payload"]!==void 0))return invalidScheduleArguments(client,USAGE19,"At least one update option is required.");if(flags["--topic"]!==void 0&&!flags["--topic"].trim())return invalidScheduleArguments(client,USAGE19,"`--topic` cannot be empty.");if(flags["--topic"]!==void 0){let topicError=validateScheduleQueueTopic(flags["--topic"]);if(topicError)return invalidScheduleArguments(client,USAGE19,topicError)}let outputMode=parseScheduleOutput(client,USAGE19,flags);if(!outputMode.valid)return outputMode.exitCode;let schedules=await resolveSchedulesClient(client,flags);if(typeof schedules=="number")return schedules;outputMode.json||output_manager_default.spinner("Updating schedule\u2026");let schedule;try{schedule=await schedules.update({name:identifier.name,namespace:identifier.namespace,...expression.value!==void 0&&{expression:expression.value},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...flags["--jitter"]!==void 0&&{jitter:jitter.value},...flags["--topic"]!==void 0&&{target:{topic:flags["--topic"]}},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"update",local:flags["--local"],name:identifier.name,namespace:identifier.namespace,trackArgs:scheduleTrackArgs(flags)})}return output_manager_default.stopSpinner(),writeScheduleMutationResult(client,schedule,`Updated schedule ${identifier.namespace}/${identifier.name}.`,outputMode.json)}var COMMAND_CONFIG7={create:getCommandAliases(createSubcommand2),delete:getCommandAliases(deleteSubcommand3),disable:getCommandAliases(disableSubcommand2),enable:getCommandAliases(enableSubcommand2),executions:getCommandAliases(executionsSubcommand),inspect:getCommandAliases(getSubcommand),invoke:getCommandAliases(invokeSubcommand),list:getCommandAliases(listSubcommand6),update:getCommandAliases(updateSubcommand3)};async function main5(client){let parsedArgs,commandArgs,selectedCommand;try{let group=takeScheduleCommand(client.argv.slice(2));commandArgs=takeScheduleCommand(group.args),selectedCommand=schedulesCommand.subcommands.find(command2=>getCommandAliases(command2).includes(commandArgs.command)),parsedArgs=parseArguments(commandArgs.args,getFlagsSpecification(selectedCommand?.options??schedulesCommand.options),{permissive:selectedCommand?.name==="executions",warnDeprecated:!1})}catch(error){return client.nonInteractive?invalidScheduleArguments(client,"schedules",error instanceof Error?error.message:String(error)):(printError(error),2)}let telemetry=new SchedulesTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,subcommandOriginal}=getSubcommand2(commandArgs.command?[commandArgs.command]:[],COMMAND_CONFIG7),args=commandArgs.args,needHelp=parsedArgs.flags["--help"];(!subcommand||needHelp||subcommand==="executions")&&telemetry.trackCliFlagLocal(parsedArgs.flags["--local"]);let conflict=validateLocalScheduleFlags(client,parsedArgs.flags,"schedules");if(conflict!==void 0)return conflict;function printHelp(command2,parent){return output_manager_default.print(help(command2,{parent:parent??(command2===schedulesCommand?void 0:schedulesCommand),columns:client.stderr.columns})),0}return subcommand?needHelp&&subcommand!=="executions"?(telemetry.trackCliFlagHelp("schedules",subcommandOriginal),printHelp(subcommand==="create"?createSubcommand2:subcommand==="delete"?deleteSubcommand3:subcommand==="disable"?disableSubcommand2:subcommand==="enable"?enableSubcommand2:subcommand==="inspect"?getSubcommand:subcommand==="invoke"?invokeSubcommand:subcommand==="update"?updateSubcommand3:listSubcommand6)):subcommand==="inspect"?(telemetry.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"schedules get","schedules inspect"),get(client,args)):subcommand==="list"?(telemetry.trackCliSubcommandList(subcommandOriginal),list5(client,args)):subcommand==="executions"?(telemetry.trackCliSubcommandExecutions(subcommandOriginal),executions(client,args,telemetry)):subcommand==="create"?(telemetry.trackCliSubcommandCreate(subcommandOriginal),create(client,args)):subcommand==="delete"?(telemetry.trackCliSubcommandDelete(subcommandOriginal),deleteSchedule(client,args)):subcommand==="update"?(telemetry.trackCliSubcommandUpdate(subcommandOriginal),update2(client,args)):subcommand==="enable"?(telemetry.trackCliSubcommandEnable(subcommandOriginal),runScheduleAction(client,args,"enable")):subcommand==="disable"?(telemetry.trackCliSubcommandDisable(subcommandOriginal),runScheduleAction(client,args,"disable")):(telemetry.trackCliSubcommandInvoke(subcommandOriginal),runScheduleAction(client,args,"invoke")):(commandArgs.command&&output_manager_default.fatal(getInvalidSubcommand(COMMAND_CONFIG7)),needHelp&&telemetry.trackCliFlagHelp("schedules"),printHelp(schedulesCommand))}export{daemons,experiments,main as kms,main2 as microfrontends,redeploy,main3 as redirects,remove2 as remove,main4 as routes,main5 as schedules};