@vercel/cli-support 0.0.0 → 65.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +100 -3
  3. package/dist/chunks/add-5YZQTIQM.js +8 -0
  4. package/dist/chunks/add-A524QQ2H.js +8 -0
  5. package/dist/chunks/add-V4JMUHKO.js +8 -0
  6. package/dist/chunks/build-K2PVDJZ4.js +7 -0
  7. package/dist/chunks/chunk-22FDWPWY.js +7 -0
  8. package/dist/chunks/chunk-25565AGS.js +7 -0
  9. package/dist/chunks/chunk-2ACMWVTB.js +12 -0
  10. package/dist/chunks/chunk-2EYYB6YN.js +7 -0
  11. package/dist/chunks/chunk-2GHZGOWT.js +7 -0
  12. package/dist/chunks/chunk-2H3SB5RP.js +9 -0
  13. package/dist/chunks/chunk-2NABMKFV.js +29 -0
  14. package/dist/chunks/chunk-2PKEEQ5W.js +25 -0
  15. package/dist/chunks/chunk-2S6PE6GB.js +7 -0
  16. package/dist/chunks/chunk-2U7DJZSQ.js +21 -0
  17. package/dist/chunks/chunk-2WYYGGEO.js +7 -0
  18. package/dist/chunks/chunk-3ADDGPEN.js +7 -0
  19. package/dist/chunks/chunk-3AYYFYZG.js +7 -0
  20. package/dist/chunks/chunk-3G3FQYMW.js +7 -0
  21. package/dist/chunks/chunk-3JGBBS6V.js +7 -0
  22. package/dist/chunks/chunk-3KKFLKQG.js +7 -0
  23. package/dist/chunks/chunk-3LIKVGFT.js +8 -0
  24. package/dist/chunks/chunk-3XW7N4W3.js +9 -0
  25. package/dist/chunks/chunk-43GBAKL2.js +86 -0
  26. package/dist/chunks/chunk-4CACOKMS.js +7 -0
  27. package/dist/chunks/chunk-4NTBYNFR.js +17 -0
  28. package/dist/chunks/chunk-4SAVH3H7.js +7 -0
  29. package/dist/chunks/chunk-4UGHFESV.js +8 -0
  30. package/dist/chunks/chunk-4VFYJU37.js +7 -0
  31. package/dist/chunks/chunk-5IASAERQ.js +7 -0
  32. package/dist/chunks/chunk-5RMIM4S2.js +7 -0
  33. package/dist/chunks/chunk-67GZ5REA.js +7 -0
  34. package/dist/chunks/chunk-6IDNVZZR.js +7 -0
  35. package/dist/chunks/chunk-6ISAISGD.js +16 -0
  36. package/dist/chunks/chunk-6KVHNQW4.js +17 -0
  37. package/dist/chunks/chunk-6OVX3PWM.js +7 -0
  38. package/dist/chunks/chunk-6QKS6QK7.js +7 -0
  39. package/dist/chunks/chunk-6VH56CX2.js +19 -0
  40. package/dist/chunks/chunk-6Y2ZL5XJ.js +98 -0
  41. package/dist/chunks/chunk-76KGQU2G.js +7 -0
  42. package/dist/chunks/chunk-76SVVWPH.js +7 -0
  43. package/dist/chunks/chunk-773GOZIR.js +13 -0
  44. package/dist/chunks/chunk-7BGKE3JW.js +10 -0
  45. package/dist/chunks/chunk-7EJQLVWX.js +7 -0
  46. package/dist/chunks/chunk-7HV7O6DM.js +7 -0
  47. package/dist/chunks/chunk-7L2K4OKM.js +63 -0
  48. package/dist/chunks/chunk-7Y46LB43.js +14 -0
  49. package/dist/chunks/chunk-7YKFF6CE.js +7 -0
  50. package/dist/chunks/chunk-7Z3WUAO5.js +10 -0
  51. package/dist/chunks/chunk-A2RZZQEP.js +7 -0
  52. package/dist/chunks/chunk-ABZEMNDR.js +7 -0
  53. package/dist/chunks/chunk-ADLBLGT3.js +8 -0
  54. package/dist/chunks/chunk-AM46JVVN.js +7 -0
  55. package/dist/chunks/chunk-ANMDN3EG.js +9 -0
  56. package/dist/chunks/chunk-APZULWJC.js +8 -0
  57. package/dist/chunks/chunk-AWMQGOS2.js +7 -0
  58. package/dist/chunks/chunk-B4UE4LVE.js +7 -0
  59. package/dist/chunks/chunk-B4YYOSPY.js +7 -0
  60. package/dist/chunks/chunk-BBKEP7RO.js +7 -0
  61. package/dist/chunks/chunk-BL3HBRF6.js +12 -0
  62. package/dist/chunks/chunk-BLUPZPAS.js +7 -0
  63. package/dist/chunks/chunk-BPUANOGW.js +7 -0
  64. package/dist/chunks/chunk-BRQUZ5NC.js +7 -0
  65. package/dist/chunks/chunk-BS32OUOC.js +7 -0
  66. package/dist/chunks/chunk-BTI5TG6Q.js +7 -0
  67. package/dist/chunks/chunk-BUJITHGZ.js +8 -0
  68. package/dist/chunks/chunk-BVH2AEFE.js +7 -0
  69. package/dist/chunks/chunk-BZENIQ7N.js +7 -0
  70. package/dist/chunks/chunk-C6GY2G73.js +7 -0
  71. package/dist/chunks/chunk-CEMPU323.js +7 -0
  72. package/dist/chunks/chunk-COD3WAUI.js +7 -0
  73. package/dist/chunks/chunk-COM5YCHF.js +9 -0
  74. package/dist/chunks/chunk-CZSOZKHX.js +7 -0
  75. package/dist/chunks/chunk-D2BZMGHP.js +7 -0
  76. package/dist/chunks/chunk-D3AHZ5LI.js +7 -0
  77. package/dist/chunks/chunk-D6REP5QQ.js +15 -0
  78. package/dist/chunks/chunk-DFVNL5ML.js +7 -0
  79. package/dist/chunks/chunk-DGYHWXD2.js +10 -0
  80. package/dist/chunks/chunk-DUT4U5YY.js +7 -0
  81. package/dist/chunks/chunk-DWZBL4NK.js +7 -0
  82. package/dist/chunks/chunk-E2SADN6I.js +7 -0
  83. package/dist/chunks/chunk-E6CO6TUM.js +7 -0
  84. package/dist/chunks/chunk-EAUDC24V.js +9 -0
  85. package/dist/chunks/chunk-ECQIO5K3.js +7 -0
  86. package/dist/chunks/chunk-ETV3C2CV.js +7 -0
  87. package/dist/chunks/chunk-F2SWJEYV.js +8 -0
  88. package/dist/chunks/chunk-F4KY2TOK.js +7 -0
  89. package/dist/chunks/chunk-F53OKXYI.js +7 -0
  90. package/dist/chunks/chunk-F7AVGV4Y.js +7 -0
  91. package/dist/chunks/chunk-FBYA6LLM.js +7 -0
  92. package/dist/chunks/chunk-FDNYYENK.js +11 -0
  93. package/dist/chunks/chunk-FGFLTLEA.js +7 -0
  94. package/dist/chunks/chunk-FUX6LKNP.js +7 -0
  95. package/dist/chunks/chunk-G4T7VBGN.js +9 -0
  96. package/dist/chunks/chunk-GA277JFB.js +20 -0
  97. package/dist/chunks/chunk-GD7AV7BO.js +9 -0
  98. package/dist/chunks/chunk-GG5RME4X.js +7 -0
  99. package/dist/chunks/chunk-GHAY4PSD.js +7 -0
  100. package/dist/chunks/chunk-GVTXA6HG.js +7 -0
  101. package/dist/chunks/chunk-GYVJIIYL.js +7 -0
  102. package/dist/chunks/chunk-GZNDA6SV.js +8 -0
  103. package/dist/chunks/chunk-HCRD3JFL.js +7 -0
  104. package/dist/chunks/chunk-HEGJZJO7.js +7 -0
  105. package/dist/chunks/chunk-HRR57QNP.js +7 -0
  106. package/dist/chunks/chunk-IA3MXJRC.js +8 -0
  107. package/dist/chunks/chunk-ID663OJ7.js +7 -0
  108. package/dist/chunks/chunk-IEPW2YRH.js +7 -0
  109. package/dist/chunks/chunk-IGDG5CWT.js +7 -0
  110. package/dist/chunks/chunk-IKQTP764.js +7 -0
  111. package/dist/chunks/chunk-IQ7FPAI4.js +7 -0
  112. package/dist/chunks/chunk-IQKGQ2Y2.js +15 -0
  113. package/dist/chunks/chunk-ISWW3DKF.js +7 -0
  114. package/dist/chunks/chunk-IUXSJWL3.js +7 -0
  115. package/dist/chunks/chunk-IVSC7ZFJ.js +7 -0
  116. package/dist/chunks/chunk-IVSSTHB6.js +7 -0
  117. package/dist/chunks/chunk-J24BABG4.js +21 -0
  118. package/dist/chunks/chunk-JALVF3C2.js +7 -0
  119. package/dist/chunks/chunk-JELLVPCM.js +8 -0
  120. package/dist/chunks/chunk-JESNVRVR.js +7 -0
  121. package/dist/chunks/chunk-JLEJB6KM.js +7 -0
  122. package/dist/chunks/chunk-KH6565YH.js +8 -0
  123. package/dist/chunks/chunk-KNLGWGUE.js +57 -0
  124. package/dist/chunks/chunk-KRPY5FHJ.js +7 -0
  125. package/dist/chunks/chunk-KW6GSQXV.js +7 -0
  126. package/dist/chunks/chunk-L4NSF346.js +22 -0
  127. package/dist/chunks/chunk-LCHECISY.js +7 -0
  128. package/dist/chunks/chunk-LJBUJ23M.js +7 -0
  129. package/dist/chunks/chunk-LKLH6DZP.js +9 -0
  130. package/dist/chunks/chunk-LRYGNQ6C.js +8 -0
  131. package/dist/chunks/chunk-LSF7FY6X.js +7 -0
  132. package/dist/chunks/chunk-LSQREJXO.js +11 -0
  133. package/dist/chunks/chunk-LT3UK4K6.js +10 -0
  134. package/dist/chunks/chunk-LUBUI5GF.js +7 -0
  135. package/dist/chunks/chunk-MCRKBVZA.js +7 -0
  136. package/dist/chunks/chunk-MVGTMPMI.js +23 -0
  137. package/dist/chunks/chunk-MXTC4ZAQ.js +7 -0
  138. package/dist/chunks/chunk-NB2WLB3J.js +12 -0
  139. package/dist/chunks/chunk-NEFDNROD.js +7 -0
  140. package/dist/chunks/chunk-NQWGRKF4.js +7 -0
  141. package/dist/chunks/chunk-NTZ5WWYV.js +7 -0
  142. package/dist/chunks/chunk-NWGBDBZI.js +7 -0
  143. package/dist/chunks/chunk-NZ2TFADV.js +7 -0
  144. package/dist/chunks/chunk-OAM5NJCU.js +9 -0
  145. package/dist/chunks/chunk-OCQPXOTX.js +11 -0
  146. package/dist/chunks/chunk-OCR5CRTH.js +10 -0
  147. package/dist/chunks/chunk-OFDTADPQ.js +7 -0
  148. package/dist/chunks/chunk-OGPENBY2.js +7 -0
  149. package/dist/chunks/chunk-OKEBIUKZ.js +7 -0
  150. package/dist/chunks/chunk-OMCGXRSA.js +21 -0
  151. package/dist/chunks/chunk-OO572JUC.js +7 -0
  152. package/dist/chunks/chunk-OPORM35X.js +7 -0
  153. package/dist/chunks/chunk-OQCMRU3J.js +10 -0
  154. package/dist/chunks/chunk-OQPXJCMK.js +32 -0
  155. package/dist/chunks/chunk-OWOWPOIE.js +23 -0
  156. package/dist/chunks/chunk-PADL3C6Z.js +7 -0
  157. package/dist/chunks/chunk-PFD7LETF.js +7 -0
  158. package/dist/chunks/chunk-PFNYWWLI.js +7 -0
  159. package/dist/chunks/chunk-PFPJLIFF.js +33 -0
  160. package/dist/chunks/chunk-PSOVLGHP.js +7 -0
  161. package/dist/chunks/chunk-PUKYAALC.js +7 -0
  162. package/dist/chunks/chunk-PVASGBEF.js +7 -0
  163. package/dist/chunks/chunk-Q5ODLDCU.js +7 -0
  164. package/dist/chunks/chunk-Q7D7RGXM.js +7 -0
  165. package/dist/chunks/chunk-QB7F3UAP.js +7 -0
  166. package/dist/chunks/chunk-QHJLRTVY.js +7 -0
  167. package/dist/chunks/chunk-QMCHGGDX.js +10 -0
  168. package/dist/chunks/chunk-QZX7VG2V.js +9 -0
  169. package/dist/chunks/chunk-R6BEOVTU.js +7 -0
  170. package/dist/chunks/chunk-RLKS5G6C.js +12 -0
  171. package/dist/chunks/chunk-RM3ZDRYE.js +7 -0
  172. package/dist/chunks/chunk-RRDNKB2X.js +7 -0
  173. package/dist/chunks/chunk-RRREFECI.js +7 -0
  174. package/dist/chunks/chunk-RUXO73ON.js +7 -0
  175. package/dist/chunks/chunk-RW3X523R.js +8 -0
  176. package/dist/chunks/chunk-S3L2OHPO.js +7 -0
  177. package/dist/chunks/chunk-S4SJ7GIZ.js +7 -0
  178. package/dist/chunks/chunk-S5IWVPYT.js +32 -0
  179. package/dist/chunks/chunk-SACGQMVQ.js +13 -0
  180. package/dist/chunks/chunk-SCV7XEEO.js +7 -0
  181. package/dist/chunks/chunk-SF4E3AQ3.js +7 -0
  182. package/dist/chunks/chunk-SKYDLHEZ.js +7 -0
  183. package/dist/chunks/chunk-SLI2O5X7.js +63 -0
  184. package/dist/chunks/chunk-SXOSF4O6.js +39 -0
  185. package/dist/chunks/chunk-TAAWMNNL.js +7 -0
  186. package/dist/chunks/chunk-TG2RCYTH.js +7 -0
  187. package/dist/chunks/chunk-TKBORMUF.js +7 -0
  188. package/dist/chunks/chunk-TO5PJDEN.js +7 -0
  189. package/dist/chunks/chunk-TPNOSQZ3.js +15 -0
  190. package/dist/chunks/chunk-TZFDVQ72.js +27 -0
  191. package/dist/chunks/chunk-U4Z2MMOF.js +301 -0
  192. package/dist/chunks/chunk-U56NHYAH.js +7 -0
  193. package/dist/chunks/chunk-UJSW56GS.js +9 -0
  194. package/dist/chunks/chunk-UKQMYTWW.js +9 -0
  195. package/dist/chunks/chunk-ULHNMQ7C.js +7 -0
  196. package/dist/chunks/chunk-UNEGQPD3.js +7 -0
  197. package/dist/chunks/chunk-URPEIX6M.js +7 -0
  198. package/dist/chunks/chunk-UVHKXCR5.js +11 -0
  199. package/dist/chunks/chunk-V6Y6UK6B.js +43 -0
  200. package/dist/chunks/chunk-V7BEC3E4.js +10 -0
  201. package/dist/chunks/chunk-VMMMBWD3.js +7 -0
  202. package/dist/chunks/chunk-VOCZ34ON.js +7 -0
  203. package/dist/chunks/chunk-VQSLPYAF.js +7 -0
  204. package/dist/chunks/chunk-VT6RIZJH.js +7 -0
  205. package/dist/chunks/chunk-WBF36MYT.js +16 -0
  206. package/dist/chunks/chunk-WCWP4GBR.js +7 -0
  207. package/dist/chunks/chunk-WGXKX24Q.js +7 -0
  208. package/dist/chunks/chunk-X4762EE4.js +7 -0
  209. package/dist/chunks/chunk-XB4SKARZ.js +29 -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-XXXRTHTP.js +8 -0
  215. package/dist/chunks/chunk-XZV4BFM5.js +7 -0
  216. package/dist/chunks/chunk-Y6AGOERS.js +8 -0
  217. package/dist/chunks/chunk-YHPPP3SF.js +7 -0
  218. package/dist/chunks/chunk-YHQ7PPXP.js +7 -0
  219. package/dist/chunks/chunk-YK7XLFU2.js +24 -0
  220. package/dist/chunks/chunk-YN3C5BL5.js +7 -0
  221. package/dist/chunks/chunk-ZF27J6FQ.js +7 -0
  222. package/dist/chunks/chunk-ZFRNVIHI.js +7 -0
  223. package/dist/chunks/chunk-ZH6KHD55.js +20 -0
  224. package/dist/chunks/cjs-2SMN43VH.js +54 -0
  225. package/dist/chunks/clear-ZS4KQ7OT.js +8 -0
  226. package/dist/chunks/compile-vercel-config-3IYM2CHC.js +7 -0
  227. package/dist/chunks/config-N2SBVW4T.js +8 -0
  228. package/dist/chunks/config-ZFIC7N4D.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-ICJL2EO5.js +7 -0
  232. package/dist/chunks/create-project-IKCB6MB2.js +7 -0
  233. package/dist/chunks/delete-2ZE2NVHI.js +10 -0
  234. package/dist/chunks/delete-AL57HZDQ.js +9 -0
  235. package/dist/chunks/detect-projects-OD4JEAW2.js +7 -0
  236. package/dist/chunks/detect-services-MOXTX5XG.js +7 -0
  237. package/dist/chunks/disable-MKI3BKNH.js +7 -0
  238. package/dist/chunks/discard-SI4H7ST3.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-DNWH6SPE.js +8 -0
  242. package/dist/chunks/edit-WYNWDFUJ.js +9 -0
  243. package/dist/chunks/enable-J6MMYPYF.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-MHSH7QCX.js +19 -0
  253. package/dist/chunks/fetch-proxy-45DGILKR.js +67 -0
  254. package/dist/chunks/future-FFOGTKMF.js +7 -0
  255. package/dist/chunks/generate-cert-for-deploy-YZKNGAEQ.js +7 -0
  256. package/dist/chunks/image-7METSS6F.js +7 -0
  257. package/dist/chunks/import-builders-GM2SERWV.js +7 -0
  258. package/dist/chunks/inspect-A7WJQQZO.js +15 -0
  259. package/dist/chunks/inspect-DI434TAM.js +19 -0
  260. package/dist/chunks/inspect-H2Q7XOWN.js +13 -0
  261. package/dist/chunks/inspect-H5JC2XKI.js +9 -0
  262. package/dist/chunks/inspect-IAWVHJXQ.js +20 -0
  263. package/dist/chunks/list-ELEUTZWJ.js +12 -0
  264. package/dist/chunks/list-INRPH25K.js +10 -0
  265. package/dist/chunks/list-WWU734RK.js +16 -0
  266. package/dist/chunks/login-R5NQRPQC.js +7 -0
  267. package/dist/chunks/login-ZF2TLCQB.js +9 -0
  268. package/dist/chunks/logs-UD7FEXZ7.js +7 -0
  269. package/dist/chunks/ls-5ZEAKKPQ.js +8 -0
  270. package/dist/chunks/ls-IXRLAJ4L.js +11 -0
  271. package/dist/chunks/ls-LIGIBVAT.js +12 -0
  272. package/dist/chunks/ls-MCQ2NS65.js +8 -0
  273. package/dist/chunks/ls-S5E2NQMI.js +12 -0
  274. package/dist/chunks/ls-V2ZSIVO3.js +12 -0
  275. package/dist/chunks/ls-VXH4QYF5.js +12 -0
  276. package/dist/chunks/mutate-OQWOKLIW.js +9 -0
  277. package/dist/chunks/notifications-KFZ333V5.js +7 -0
  278. package/dist/chunks/open-HH6K7ZRC.js +7 -0
  279. package/dist/chunks/openapi-JGYEFJJV.js +7 -0
  280. package/dist/chunks/permissions-ZSHKMXBZ.js +7 -0
  281. package/dist/chunks/pkg-EDJQLCNP.js +7 -0
  282. package/dist/chunks/plugin-offer-Z6FCPQFD.js +9 -0
  283. package/dist/chunks/prompt-missing-credentials-KOA7C4QC.js +7 -0
  284. package/dist/chunks/publish-FPNQ2US4.js +15 -0
  285. package/dist/chunks/pull-7OGOIKB3.js +7 -0
  286. package/dist/chunks/purchase-domain-if-available-F4LKHVBD.js +7 -0
  287. package/dist/chunks/push-NY3SIK2C.js +7 -0
  288. package/dist/chunks/query-JGPO7TNY.js +12 -0
  289. package/dist/chunks/reauthenticate-OZRQFR66.js +7 -0
  290. package/dist/chunks/reorder-4J2STFUS.js +10 -0
  291. package/dist/chunks/reply-EO4NTTPW.js +9 -0
  292. package/dist/chunks/repo-info-to-url-XQSULSEO.js +7 -0
  293. package/dist/chunks/resolve-RPHHRPNM.js +12 -0
  294. package/dist/chunks/resolve-agent-team-KX77HEAF.js +7 -0
  295. package/dist/chunks/resolve-deployment-framework-preset-AXXYBFCL.js +7 -0
  296. package/dist/chunks/restore-TEA6TSVK.js +16 -0
  297. package/dist/chunks/rm-BPILSPUI.js +8 -0
  298. package/dist/chunks/rm-F6XVUDBM.js +8 -0
  299. package/dist/chunks/rm-JCPXV2FN.js +8 -0
  300. package/dist/chunks/rm-LPQRGX7N.js +8 -0
  301. package/dist/chunks/rm-WHUGT6TE.js +8 -0
  302. package/dist/chunks/routes-P6LKQCWH.js +7 -0
  303. package/dist/chunks/rule-inspect-BOETGPFO.js +8 -0
  304. package/dist/chunks/schema-BEUO7G52.js +44 -0
  305. package/dist/chunks/schema-YOEAK4VX.js +14 -0
  306. package/dist/chunks/select-org-OMLGQEKK.js +7 -0
  307. package/dist/chunks/set-5XY27S7R.js +7 -0
  308. package/dist/chunks/setup-and-link-A7M3QT52.js +7 -0
  309. package/dist/chunks/skills-4J2NC2QI.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-ZXZQEXOV.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-SK6J2HFE.js +14 -0
  316. package/dist/chunks/update-25CKNOY5.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 +25 -0
  344. package/dist/internal-build-worker.js +10 -0
  345. package/dist/internal-build.js +11 -0
  346. package/dist/package.json +265 -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 +393 -0
  353. package/dist/version.mjs +2 -0
  354. package/package.json +224 -14
  355. package/index.js +0 -1
@@ -0,0 +1,200 @@
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{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,backupFile,claudeCode,codex,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,readFileOrNull,resolveGatewayBaseUrl,setupCodexPlugin,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-PFPJLIFF.js";import{selectOrg}from"./chunks/chunk-Y6AGOERS.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{init_main,parse as parse2}from"./chunks/chunk-J24BABG4.js";import{init_dist,parse,stringify}from"./chunks/chunk-U4Z2MMOF.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import{CHECKBOX_INSTRUCTIONS}from"./chunks/chunk-OFDTADPQ.js";import{tokensAfterCommand}from"./chunks/chunk-V7BEC3E4.js";import"./chunks/chunk-2EYYB6YN.js";import{amountMatchesPrice,buy,canPromptForCharge,chargeFailureReason,deleteCertById,formatAmountArg,formatTerm,formatUsd,getDomains,getTeamMemberByIdentifier,getTeamMembersByIds,isDomainExternal,parseAmount,printChargeRecovery,refuseUnnamedTeam,removeAliasById,reportChargeFailure,reportPriceChanged,reportUnknownOutcome,reportUsageError,teamMemberLabel,writeChargeAction}from"./chunks/chunk-6KVHNQW4.js";import{addDomain,getDomainByName,require_cjs}from"./chunks/chunk-DUT4U5YY.js";import{getDomainPrice,getDomainStatus,getOrderOutcome,pollForOrder}from"./chunks/chunk-76SVVWPH.js";import{external_exports}from"./chunks/chunk-2NABMKFV.js";import{getAliases}from"./chunks/chunk-SKYDLHEZ.js";import{require_execa}from"./chunks/chunk-BUJITHGZ.js";import{InvalidNextError,getPaginationOpts}from"./chunks/chunk-C6GY2G73.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import{formatTable}from"./chunks/chunk-LSQREJXO.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-FBYA6LLM.js";import{readOnOffOption}from"./chunks/chunk-IKQTP764.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import"./chunks/chunk-GD7AV7BO.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{DEFAULT_LIST_LIMIT,PaginationError,fetchAllPages,parseListLimit,printNextPageCommand,printNextPageHint}from"./chunks/chunk-QMCHGGDX.js";import"./chunks/chunk-PFD7LETF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{validateLsArgs}from"./chunks/chunk-KW6GSQXV.js";import"./chunks/chunk-SCV7XEEO.js";import{addSubcommand,aiGatewayCommand,apiKeysSubcommand,autoRenewSubcommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buySubcommand,checkSubcommand,codingAgentsSubcommand,createSubcommand,domainsCommand,getCommandAliases,inspectSubcommand2 as inspectSubcommand,inspectSubcommand3 as inspectSubcommand2,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listSubcommand2 as listSubcommand,listSubcommand4 as listSubcommand2,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,priceSubcommand,removeSubcommand,removeSubcommand3 as removeSubcommand2,renewSubcommand,rulesAddSubcommand,rulesEditSubcommand,rulesListSubcommand,rulesRemoveSubcommand,rulesSubcommand,searchSubcommand,setupSubcommand,transferInSubcommand,verifySubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand}from"./chunks/chunk-TPNOSQZ3.js";import"./chunks/chunk-LUBUI5GF.js";import"./chunks/chunk-GVTXA6HG.js";import"./chunks/chunk-5IASAERQ.js";import{gatewaySubcommand,pluginSubcommand,setupCommand,skillsSubcommand}from"./chunks/chunk-WGXKX24Q.js";import"./chunks/chunk-E2SADN6I.js";import"./chunks/chunk-ABZEMNDR.js";import"./chunks/chunk-3AYYFYZG.js";import"./chunks/chunk-76KGQU2G.js";import"./chunks/chunk-UNEGQPD3.js";import"./chunks/chunk-YHQ7PPXP.js";import"./chunks/chunk-NQWGRKF4.js";import"./chunks/chunk-IGDG5CWT.js";import"./chunks/chunk-QZX7VG2V.js";import"./chunks/chunk-3ADDGPEN.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-PFNYWWLI.js";import"./chunks/chunk-NTZ5WWYV.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-LJBUJ23M.js";import"./chunks/chunk-OKEBIUKZ.js";import{help}from"./chunks/chunk-KH6565YH.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-G4T7VBGN.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{TelemetryClient}from"./chunks/chunk-2PKEEQ5W.js";import"./chunks/chunk-PUKYAALC.js";import{getContextName,getScope}from"./chunks/chunk-B4UE4LVE.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import{getTeams}from"./chunks/chunk-FGFLTLEA.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,getExitCodeForReason,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags}from"./chunks/chunk-DGYHWXD2.js";import"./chunks/chunk-IUXSJWL3.js";import{getLinkedProject,getProjectByNameOrId,getUser,require_pluralize}from"./chunks/chunk-KNLGWGUE.js";import{ALIGNED_LABEL_WIDTH,printAlignedLabel}from"./chunks/chunk-ADLBLGT3.js";import"./chunks/chunk-BBKEP7RO.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments}from"./chunks/chunk-VOCZ34ON.js";import{getTeamByIdOrSlug,quoteArg}from"./chunks/chunk-F53OKXYI.js";import{getFlagsSpecification,stripSensitiveAuthArgs,validateJsonOutput,warnDeprecatedSubcommand}from"./chunks/chunk-AWMQGOS2.js";import"./chunks/chunk-FUX6LKNP.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{APIError,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainRemovalConflict,InvalidDomain,InvalidMoveDestination,ProjectNotFound,UnexpectedDomainTransferError,UnsupportedTLD,code,isAPIError}from"./chunks/chunk-6VH56CX2.js";import{getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-JESNVRVR.js";import{chars_default,output_manager_default}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 import_chalk=__toESM(require_source(),1);var MAX_PAGE_SIZE=100,MAX_SEARCH_QUERY_CHARS=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search2=identifier.length<=MAX_SEARCH_QUERY_CHARS?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search2})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget){budget!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token=>token.trim()).filter(token=>token.length>0);for(let token of tokens){let num=Number(token);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"],tokenPass2=opts["--token-pass"];if(telemetry.trackCliOptionName(name),telemetry.trackCliOptionBudget(budgetFlag),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliFlagIncludeByok(includeByok),telemetry.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry.trackCliOptionExpiration(expiration),telemetry.trackCliFlagZdrExempt(zdrExempt),telemetry.trackCliFlagBypassAllSettings(bypassAll),telemetry.trackCliFlagTokenPass(tokenPass2),tokenPass2&&(zdrExempt||bypassAll)){let message="Cannot combine --token-pass with --zdr-exempt or --bypass-all-settings. Remove the exemption flags to create a Token Pass key.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --token-pass")}]},2),output_manager_default.error(message),2}if(budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget=limitFlag??budgetFlag;if(budget!==void 0&&budget<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget,refreshPeriod,includeByok,alertThresholds});if(!await client.resolveCurrentTeam()){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...tokenPass2&&{tokenPass:!0},...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
8
+ `),output_manager_default.success(`API key ${import_chalk.default.bold(result.apiKey.name)} (${result.apiKey.id}) created ${createStamp()}`),output_manager_default.log(budget!==void 0?`Spend on this key also counts toward any user and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`:`No key budget set. Spend still counts toward any API key default, user, and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`),client.isAgent&&output_manager_default.log(`Prefer OIDC over long-lived API keys: code on Vercel can authenticate to AI Gateway with VERCEL_OIDC_TOKEN, and local development can get one with ${getCommandName("link")} and ${getCommandName("env pull")}. Revoke this key with ${getCommandName(`ai-gateway api-keys revoke ${result.apiKey.id} --yes`)} if you don't need it.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk2=__toESM(require_source(),1);var import_async_sema=__toESM(require_async_sema(),1);var DIRECTORY_KEY_SORTS=["createdAt:desc","createdAt:asc","lastActiveAt:desc","lastActiveAt:asc","name:asc","name:desc","expiresAt:asc","expiresAt:desc"],DIRECTORY_KEY_STATES=["active","expired","deleted","purged","any"],MAX_DIRECTORY_RESOLVE_IDS=100,FETCH_OPTS={retry:{retries:0},bailOn429:!0},DIRECTORY_KILL_SWITCH="VERCEL_AI_GATEWAY_DIRECTORY";function isDirectoryEnabledByEnv(env=process.env){let value=env[DIRECTORY_KILL_SWITCH]?.trim().toLowerCase();return value!=="0"&&value!=="false"}async function listDirectoryKeysPage(client,opts={}){let query=new URLSearchParams,search2=opts.search?.trim();search2&&query.set("search",search2),opts.createdBy&&query.set("createdBy",opts.createdBy),opts.accessPolicyId&&query.set("accessPolicyId",opts.accessPolicyId),opts.state&&query.set("state",opts.state),opts.sort&&query.set("sort",opts.sort),opts.cursor&&query.set("cursor",opts.cursor),opts.limit!==void 0&&query.set("limit",String(opts.limit));let qs=query.toString(),page=await client.fetch(`/ai-gateway/directory/keys${qs?`?${qs}`:""}`,{method:"GET",...FETCH_OPTS});return{items:page.data??[],next:page.cursor??null}}function chunk(items,size){let chunks=[];for(let i=0;i<items.length;i+=size)chunks.push(items.slice(i,i+size));return chunks}var BATCH_CONCURRENCY=4;async function mapConcurrent(items,fn){let sema=new import_async_sema.default(BATCH_CONCURRENCY);return Promise.all(items.map(async item=>{await sema.acquire();try{return await fn(item)}finally{sema.release()}}))}async function resolveDirectoryIdentities(client,input){let keyChunks=chunk([...new Set(input.keyIds??[])],MAX_DIRECTORY_RESOLVE_IDS),userChunks=chunk([...new Set(input.userIds??[])],MAX_DIRECTORY_RESOLVE_IDS),requests=Math.max(keyChunks.length,userChunks.length),bodies=Array.from({length:requests},(_,i)=>{let body={};return keyChunks[i]?.length&&(body.keyIds=keyChunks[i]),userChunks[i]?.length&&(body.userIds=userChunks[i]),body}),pages=await mapConcurrent(bodies,body=>client.fetch("/ai-gateway/directory/identities/resolve",{method:"POST",body,...FETCH_OPTS})),keys=new Map,users=new Map;return pages.forEach((res,i)=>{for(let key of res.data?.keys??[])keys.set(key.keyId,key);if(Array.isArray(res.data?.users))for(let user of res.data.users)users?.set(user.uid,user);else bodies[i].userIds&&(users=null)}),{keys,users}}async function resolveDirectoryKeyQuotas(client,keyIds){let pages=await mapConcurrent(chunk([...new Set(keyIds)],MAX_DIRECTORY_RESOLVE_IDS),ids=>client.fetch("/ai-gateway/directory/keys/quotas",{method:"POST",body:{keyIds:ids},...FETCH_OPTS})),quotas=new Map;for(let res of pages)for(let quota of res.data?.quotas??[])quotas.set(quota.apiKeyId,quota);return quotas}function isDirectoryUnavailable(err){return isAPIError(err)&&(err.status===429||err.status>=500)}function isDirectoryCursor(cursor2){try{let parsed=JSON.parse(Buffer.from(cursor2,"base64url").toString());return typeof parsed=="object"&&parsed!==null&&parsed.v===1&&typeof parsed.fp=="string"&&Array.isArray(parsed.sa)}catch{return!1}}function toApiKey(key,quota){let apiKey={id:key.keyId,name:key.name,partialKey:key.suffix??"",teamId:key.teamId,purpose:"ai-gateway",projectId:key.projectId??null,expiresAt:key.expiresAt??null,activeAt:key.lastActiveAt??key.createdAt,createdAt:key.createdAt,createdBy:key.createdBy??"",leakedAt:key.leakedAt??null,leakedUrl:null,createdByAppId:key.attribution?.createdByAppId??null};if(quota){let{apiKeyId:_apiKeyId,...rest}=quota;apiKey.quota=rest}return apiKey}async function ensureTeam(client){if(await client.resolveCurrentTeam())return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionQuery(query){query&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(search2){search2&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionCreator(creator){creator&&this.trackCliOption({option:"creator",value:creator==="me"?"me":this.redactedValue})}trackCliOptionState(state){state&&this.trackCliOption({option:"state",value:state})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function renderResource(client,{asJson,spinnerText,fetch,toJSON,isEmpty,emptyMessage:emptyMessage2,header,renderTable:renderTable2,notFoundMessage,next}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&&notFoundMessage?notFoundMessage:err.message),1;if(err instanceof PaginationError)return output_manager_default.error(err.message),1;throw err}if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
9
+ `),0;if(isEmpty(data)){let nextCursor=next?.(data)??null;return nextCursor?(output_manager_default.log("No results on this page."),printNextPageHint(client,nextCursor),0):(output_manager_default.log(emptyMessage2),0)}return output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),next&&printNextPageHint(client,next(data)),0}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function listBudgetsPage(client,opts){let query=new URLSearchParams;opts.scopeType&&query.set("scopeType",opts.scopeType),query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next),opts.includeDefaultCovered!==void 0&&query.set("includeDefaultCovered",String(opts.includeDefaultCovered));let{budgets:budgets2,nextCursor,defaultCoveredCounts}=await client.fetch(`/ai-gateway/budgets/list?${query.toString()}`,{method:"GET"});return{items:budgets2??[],next:nextCursor??null,defaultCoveredCounts:defaultCoveredCounts??{}}}async function setBudget(client,input){return client.fetch("/ai-gateway/budgets",{method:"PUT",body:input})}async function removeBudget(client,scopeType,opts={}){let params=new URLSearchParams({scopeType});opts.projectId&&params.set("projectId",opts.projectId),opts.userId&&params.set("userId",opts.userId),await client.fetch(`/ai-gateway/budgets?${params.toString()}`,{method:"DELETE"})}var BUDGET_DEFAULT_SCOPE_TYPES=["project","api-key","user"],BUDGET_DEFAULT_COVERED={project:"Projects","api-key":"API keys",user:"Team members"},BUDGET_DEFAULT_APPLIES_TO={project:"every project without its own budget","api-key":"every API key without its own budget",user:"every team member without their own budget"};function parseBudgetDefaultScope(args){let[scopeArg,...rest]=args;return scopeArg?BUDGET_DEFAULT_SCOPE_TYPES.includes(scopeArg)?rest.length>0?{error:`Unexpected argument "${rest[0]}".`}:{scopeType:scopeArg}:{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_DEFAULT_SCOPE_TYPES.join(", ")}.`}:{error:`Expected a scope. Specify ${BUDGET_DEFAULT_SCOPE_TYPES.join(" or ")}.`}}async function listScopeBudgetDefaults(client){let{defaults}=await client.fetch("/ai-gateway/budgets/defaults/list",{method:"GET"});return defaults??[]}async function upsertScopeBudgetDefault(client,input){return client.fetch("/ai-gateway/budgets/defaults",{method:"PUT",body:input})}async function deleteScopeBudgetDefault(client,scopeType){let params=new URLSearchParams({scopeType});await client.fetch(`/ai-gateway/budgets/defaults?${params.toString()}`,{method:"DELETE"})}var STATE_FLAG_VALUES=DIRECTORY_KEY_STATES.filter(s=>s!=="purged"),SORT_FIELDS=["createdAt","lastActiveAt","name","expiresAt"],DEFAULT_STATE="active",DEFAULT_SORT="lastActiveAt:desc";async function list(client,argv){let telemetry=new AiGatewayApiKeysListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,queryFlag=opts["--query"],searchFlag=opts["--search"],search2=queryFlag??searchFlag,creator=opts["--creator"],stateFlag=opts["--state"],sortFlag=opts["--sort"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliOptionQuery(queryFlag),telemetry.trackCliOptionSearch(searchFlag),telemetry.trackCliOptionCreator(creator),telemetry.trackCliOptionState(stateFlag),telemetry.trackCliOptionSort(sortFlag),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(queryFlag!==void 0&&searchFlag!==void 0&&queryFlag!==searchFlag)return usageError(client,"Pass only one of --query or --search.");if(search2!==void 0&&search2.trim().length===0)return usageError(client,"The --query option requires some text.");if(search2&&search2.length>MAX_SEARCH_QUERY_CHARS)return usageError(client,`The --query option must be at most ${MAX_SEARCH_QUERY_CHARS} characters.`);if(stateFlag!==void 0&&!STATE_FLAG_VALUES.includes(stateFlag))return usageError(client,`The --state option must be one of: ${STATE_FLAG_VALUES.join(", ")}.`);let sort=sortFlag===void 0?void 0:parseSortFlag(sortFlag);if(sortFlag!==void 0&&!sort)return usageError(client,`The --sort option must be one of ${SORT_FIELDS.join(", ")}, optionally followed by :asc or :desc.`);if(creator!==void 0&&creator.trim().length===0)return usageError(client,"The --creator option requires a team member.");let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}let directoryOnly=creator!==void 0||stateFlag!==void 0||sortFlag!==void 0||next!==void 0&&isDirectoryCursor(next),legacyOnly=!isDirectoryEnabledByEnv()||next!==void 0&&!isDirectoryCursor(next);if(directoryOnly&&legacyOnly){let message;return isDirectoryEnabledByEnv()?message="The --next cursor does not belong to this query. Rerun without --next to start from the first page.":next!==void 0&&isDirectoryCursor(next)?message=`The --next cursor came from the AI Gateway key directory, which ${DIRECTORY_KILL_SWITCH} disables in this environment. Rerun without --next to start from the first page.`:message=`The --creator, --state, and --sort options need the AI Gateway key directory, which ${DIRECTORY_KILL_SWITCH} disables in this environment.`,usageError(client,message)}let createdBy;if(creator!==void 0)try{createdBy=await resolveCreator(client,creator.trim())}catch(err){if(err instanceof UnknownCreatorError)return usageError(client,err.message);if(isAPIError(err))return output_manager_default.error(`Could not look up team member "${creator}": ${err.message}`),1;throw err}let legacyPage=async()=>({...await listApiKeysPage(client,{limit,next,search:search2}),metadataKnown:!0}),fetch=async()=>{if(legacyOnly)return legacyPage();try{return await fetchDirectoryPage(client,{search:search2,createdBy,state:stateFlag??DEFAULT_STATE,sort:sort??DEFAULT_SORT,cursor:next,limit})}catch(err){if(!isDirectoryUnavailable(err))throw err;if(output_manager_default.debug(`AI Gateway key directory unavailable: ${err instanceof Error?err.message:String(err)}`),directoryOnly)throw new DirectoryUnavailableError;return legacyPage()}};try{return await renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch,toJSON:page=>({apiKeys:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:emptyMessage({next,search:search2,creator,stateFlag}),header:()=>"API keys",renderTable:page=>printApiKeysTable(page.items,keyDefault,page.metadataKnown),next:page=>page.next})}catch(err){if(err instanceof DirectoryUnavailableError)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:err.message,next:[{command:getCommandNamePlain("ai-gateway api-keys list")}]},1),output_manager_default.error(err.message),1;throw err}}var DirectoryUnavailableError=class extends Error{constructor(){super("The AI Gateway key directory is temporarily unavailable, so --creator, --state, --sort, and directory cursors cannot be served. Retry shortly, or list without those options."),this.name="DirectoryUnavailableError"}};function usageError(client,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys list")}]},2),output_manager_default.error(message),2}function parseSortFlag(value){if(DIRECTORY_KEY_SORTS.includes(value))return value;if(SORT_FIELDS.includes(value))return`${value}:${value==="name"?"asc":"desc"}`}var UnknownCreatorError=class extends Error{constructor(identifier){super(`No team member matches "${identifier}".`),this.name="UnknownCreatorError"}};async function resolveCreator(client,identifier){if(identifier==="me")return(await getUser(client)).id;let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,identifier);if(member)return member.uid;if(identifier.includes("@"))throw new UnknownCreatorError(identifier);return output_manager_default.debug(`No team member matches "${identifier}"; using it as a user id.`),identifier}async function fetchDirectoryPage(client,opts){let page=await listDirectoryKeysPage(client,opts),liveIds=page.items.filter(key=>key.state==="active").map(key=>key.keyId),quotas=new Map;if(liveIds.length>0)try{quotas=await resolveDirectoryKeyQuotas(client,liveIds)}catch(err){output_manager_default.debug(`Skipping AI Gateway key budgets in list output: ${err instanceof Error?err.message:String(err)}`)}return{items:page.items.map(key=>toApiKey(key,quotas.get(key.keyId))),next:page.next,metadataKnown:!1}}function emptyMessage({next,search:search2,creator,stateFlag}){return next?"No more API keys.":search2||creator||stateFlag?"No API keys match these filters.":`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`}function printApiKeysTable(apiKeys2,keyDefault,metadataKnown){return`${table([["id","name","key","token pass","budget","spend","refresh","created"].map(header=>import_chalk2.default.gray(header)),...apiKeys2.map(apiKey=>[apiKey.id,apiKey.name||import_chalk2.default.gray("\u2013"),apiKey.partialKey?`\u2026${apiKey.partialKey}`:import_chalk2.default.gray("\u2013"),metadataKnown?apiKey.metadata?.tokenPass?"yes":"no":import_chalk2.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.limitAmount}`:keyDefault?`$${keyDefault.limitAmount} ${import_chalk2.default.gray("(default)")}`:import_chalk2.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.currentSpend}`:import_chalk2.default.gray("\u2013"),apiKey.quota?.refreshPeriod??keyDefault?.refreshPeriod??import_chalk2.default.gray("\u2013"),apiKey.createdAt?new Date(apiKey.createdAt).toLocaleDateString():import_chalk2.default.gray("\u2013")])],{align:["l","l","l","l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
10
+
11
+ `}var import_chalk3=__toESM(require_source(),1);var AiGatewayApiKeysInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect(client,argv){let telemetry=new AiGatewayApiKeysInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id]=args;telemetry.trackCliArgumentId(id),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(!id)return output_manager_default.error(`${getCommandName("ai-gateway api-keys inspect <id>")} expects an API key id.`),2;if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}return renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API key",fetch:()=>getApiKey(client,id),toJSON:apiKey=>({apiKey}),isEmpty:()=>!1,emptyMessage:"",header:apiKey=>`API key ${import_chalk3.default.bold(apiKey.name||apiKey.id)}`,renderTable:apiKey=>printApiKeyDetails(apiKey,keyDefault)})}function dim(value){return import_chalk3.default.gray(value)}function yesNo(value){return value?"yes":"no"}function printApiKeyDetails(apiKey,keyDefault){let rows=[["id",apiKey.id],["name",apiKey.name||dim("\u2013")],["key",apiKey.partialKey?`\u2026${apiKey.partialKey}`:dim("\u2013")],["token pass",yesNo(apiKey.metadata?.tokenPass??!1)],["purpose",apiKey.purpose],["project",apiKey.projectId??dim("all projects")],["created",apiKey.createdAt?new Date(apiKey.createdAt).toLocaleString():dim("\u2013")],["last used",apiKey.activeAt?new Date(apiKey.activeAt).toLocaleString():dim("never")],["expires",apiKey.expiresAt?new Date(apiKey.expiresAt).toLocaleString():dim("never")],["created by",apiKey.createdBy||dim("\u2013")]];apiKey.metadata?.zdr?.enableNonZdrModels&&rows.push(["zdr exempt","yes"]),apiKey.metadata?.bypassAll&&rows.push(["bypass all settings","yes"]);let quota=apiKey.quota;return quota?rows.push(["budget",`$${quota.limitAmount}`],["spend",`$${quota.currentSpend}`],["byok spend",`$${quota.currentByokSpend}`],["include byok",yesNo(quota.includeByokInQuota)],["refresh",quota.refreshPeriod],["alerts",quota.alertThresholds&&quota.alertThresholds.length>0?quota.alertThresholds.map(threshold=>`${threshold}%`).join(", "):dim("none")],["active",yesNo(quota.active)]):keyDefault?rows.push(["budget",`${formatBudgetCap(keyDefault.limitAmount,keyDefault.refreshPeriod)} ${dim("(default)")}`]):rows.push(["budget",dim("none")]),`${table(rows.map(([label,value])=>[dim(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
12
+
13
+ `}var import_chalk4=__toESM(require_source(),1);var AiGatewayApiKeysRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove(client,argv){let telemetry=new AiGatewayApiKeysRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[id]=args,yes=opts["--yes"];telemetry.trackCliArgumentId(id),telemetry.trackCliFlagYes(yes),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!id)return output_manager_default.error(`${getCommandName("ai-gateway api-keys revoke <id>")} expects an API key id.`),2;if(!await ensureTeam(client))return 1;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("To revoke in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Revoke API key ${import_chalk4.default.bold(id)}?`,!1))return output_manager_default.log("Canceled"),0}let removeStamp=stamp_default();output_manager_default.spinner("Revoking API key");try{return await deleteApiKey(client,id),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({id,removed:!0},null,2)}
14
+ `):output_manager_default.success(`API key ${import_chalk4.default.bold(id)} revoked ${removeStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`API key "${id}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayApiKeysTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRevoke(actual){this.trackCliSubcommand({subcommand:"revoke",value:actual})}};var COMMAND_CONFIG={create:getCommandAliases(createSubcommand),list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),revoke:getCommandAliases(removeSubcommand)};async function apiKeys(client){let telemetry=new AiGatewayApiKeysTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(apiKeysSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommand),output_manager_default.print(help(apiKeysSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:apiKeysSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(createSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),create(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(listSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect(client,args));case"revoke":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway api-keys",subcommandOriginal),printHelp(removeSubcommand),0):(telemetry.trackCliSubcommandRevoke(subcommandOriginal),subcommandOriginal!=="revoke"&&warnDeprecatedSubcommand(client,`ai-gateway api-keys ${subcommandOriginal}`,"ai-gateway api-keys revoke"),remove(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG)),output_manager_default.print(help(apiKeysSubcommand,{columns:client.stderr.columns})),2}}async function setScopeDefault(client,opts){output_manager_default.spinner("Setting budget default\u2026");try{let budgetDefault=await upsertScopeBudgetDefault(client,{scopeType:opts.scopeType,limitAmount:opts.limit,...opts.refreshPeriod?{refreshPeriod:opts.refreshPeriod}:{}});return output_manager_default.stopSpinner(),opts.asJson?client.stdout.write(`${JSON.stringify(budgetDefault,null,2)}
15
+ `):(printAlignedLabel("Set default",opts.scopeType,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budgetDefault.limitAmount}`),printAlignedLabel("Refresh",budgetDefault.refreshPeriod),printAlignedLabel("Applies to",`${BUDGET_DEFAULT_APPLIES_TO[opts.scopeType]}, including existing ones`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}async function removeScopeDefault(client,scopeType,{yes,asJson}){if(!yes&&(client.nonInteractive||!client.stdin.isTTY))return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(await listScopeBudgetDefaults(client).then(defaults=>defaults.find(d=>d.scopeType===scopeType&&d.active!==!1)??null).catch(()=>{})===null)return output_manager_default.error(`No ${scopeType} budget default set. Set one with ${getCommandName(`ai-gateway budgets set ${scopeType} --default`)}.`),1;if(!yes){let affected=BUDGET_DEFAULT_COVERED[scopeType];if(!await client.input.confirm(`Remove the ${scopeType} budget default? ${affected} without their own budget will have no default cap.`,!1))return output_manager_default.log("Canceled"),0}output_manager_default.spinner("Removing budget default\u2026");try{return await deleteScopeBudgetDefault(client,scopeType),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({scopeType,removed:!0},null,2)}
16
+ `):printAlignedLabel("Removed",`${scopeType} default`,{gutter:"\u2713"}),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayBudgetsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var REFRESH_PERIODS=["daily","weekly","monthly","none"];async function set(client,argv){let telemetry=new AiGatewayBudgetsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,limit=opts["--limit"],refreshPeriod=opts["--refresh-period"],isDefault=opts["--default"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliArgumentName(args[1]),telemetry.trackCliOptionLimit(limit),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliFlagDefault(isDefault),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(limit===void 0||Number.isNaN(limit)||limit<1)return output_manager_default.error("The --limit flag is required and must be at least 1."),2;if(refreshPeriod!==void 0&&!REFRESH_PERIODS.includes(refreshPeriod))return output_manager_default.error(`The --refresh-period flag must be one of: ${REFRESH_PERIODS.join(", ")}.`),2;if(!await ensureTeam(client))return 1;if(scope.isDefault)return await setScopeDefault(client,{scopeType:scope.scopeType,limit,refreshPeriod,asJson});let projectId,userId,apiKeyId,scopeLabel="team";if(scope.scopeType==="api-key"){let resolved=await findApiKeyByIdOrName(client,scope.name);if("error"in resolved)return output_manager_default.error(describeApiKeyLookupError(scope.name,resolved)),1;apiKeyId=resolved.apiKey.id,scopeLabel=`api key ${resolved.apiKey.name||apiKeyId}`}else if(scope.scopeType==="project"){let resolved=await getProjectByNameOrId(client,scope.name);if(resolved instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${scope.name}`),1;projectId=resolved.id,scopeLabel=`project ${scope.name}`}else if(scope.scopeType==="user"){let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,scope.name);if(!member)return output_manager_default.error(`Team member not found: ${scope.name}`),1;userId=member.uid,scopeLabel=`user ${teamMemberLabel(member)}`}output_manager_default.spinner("Setting budget\u2026");try{let budget=scope.scopeType==="api-key"?(await updateApiKeyQuota(client,apiKeyId,{limitAmount:limit,...refreshPeriod?{refreshPeriod}:{},active:!0,archived:!1})).quota:await setBudget(client,{scopeType:scope.scopeType,...projectId?{projectId}:{},...userId?{userId}:{},limitAmount:limit,...refreshPeriod?{refreshPeriod}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(budget,null,2)}
17
+ `):(printAlignedLabel("Set budget",scopeLabel,{gutter:"\u2713"}),printAlignedLabel("Limit",`$${budget.limitAmount}`),printAlignedLabel("Refresh",budget.refreshPeriod)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk5=__toESM(require_source(),1),import_async_sema2=__toESM(require_async_sema(),1);var AiGatewayBudgetsListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliOptionScopeType(scopeType){scopeType&&this.trackCliOption({option:"scope-type",value:scopeType})}trackCliFlagDefaults(defaults){defaults&&this.trackCliFlag("defaults")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list2(client,argv){let telemetry=new AiGatewayBudgetsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,scopeType=opts["--scope-type"],showDefaults=opts["--defaults"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliOptionScopeType(scopeType),telemetry.trackCliFlagDefaults(showDefaults);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(scopeType!==void 0&&!BUDGET_SCOPE_TYPES.includes(scopeType))return output_manager_default.error(`The --scope-type flag must be one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`),2;let scopeFilter=scopeType;if(showDefaults&&scopeFilter==="team")return output_manager_default.error("The team scope does not support --default. Drop --defaults to list the team budget."),1;if(showDefaults&&(limitFlag!==void 0||next!==void 0))return output_manager_default.error("The --limit and --next options do not apply to --defaults, which lists every default in one page."),1;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;if(showDefaults)return await listDefaults(client,{scopeType:scopeFilter,asJson});output_manager_default.spinner("Fetching budgets\u2026");let page,defaults;try{[page,defaults]=await Promise.all([listBudgetsPage(client,{scopeType:scopeFilter,limit,next,includeDefaultCovered:!1}),asJson||next?[]:listScopeBudgetDefaults(client).catch(err=>(output_manager_default.debug(`Skipping budget defaults in list output: ${err instanceof Error?err.message:String(err)}`),[]))])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}let configured=page.items,counts=page.defaultCoveredCounts;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({budgets:configured,pagination:{next:page.next},defaultCoveredCounts:counts},null,2)}
18
+ `),0;if(configured.length===0)return output_manager_default.stopSpinner(),next?(output_manager_default.log("No more budgets."),0):(output_manager_default.log(scopeType?`No ${scopeType} budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`:`No budgets found. Set one with ${getCommandName("ai-gateway budgets set")}.`),printDefaultsSection(defaults,counts,scopeFilter),printNextPageHint(client,page.next),0);let names=await resolveScopeNames(client,configured);return output_manager_default.stopSpinner(),printDefaultsSection(defaults,counts,scopeFilter),output_manager_default.log("Custom budgets"),client.stdout.write(printBudgetsTable(configured,names)),printNextPageHint(client,page.next),0}var KEY_LOOKUP_BY_ID_MAX=DEFAULT_LIST_LIMIT,KEY_LOOKUP_CONCURRENCY=5,KEY_ROSTER_PAGE_SIZE=100,KEY_ROSTER_MAX_PAGES=1e3,DIRECTORY_SKIPPED={keys:new Map,users:null};async function resolveDirectoryLabels(client,input){if(!isDirectoryEnabledByEnv()||input.keyIds.length===0&&input.userIds.length===0)return DIRECTORY_SKIPPED;try{return await resolveDirectoryIdentities(client,input)}catch(err){return output_manager_default.debug(`Skipping AI Gateway key directory labels: ${err instanceof Error?err.message:String(err)}`),DIRECTORY_SKIPPED}}async function resolveApiKeyNames(client,ids,{directoryAnswered=!1}={}){let names=new Map;if(ids.length===0)return names;if(directoryAnswered&&(ids=ids.slice(0,KEY_LOOKUP_BY_ID_MAX)),ids.length<=KEY_LOOKUP_BY_ID_MAX){let sema=new import_async_sema2.default(KEY_LOOKUP_CONCURRENCY);return await Promise.all(ids.map(async id=>{await sema.acquire();try{let key=await getApiKey(client,id).catch(()=>null);key?.name&&names.set(id,key.name)}finally{sema.release()}})),names}let wanted=new Set(ids),seen=new Set,next;try{for(let pages=0;pages<KEY_ROSTER_MAX_PAGES;pages++){let page=await listApiKeysPage(client,{limit:KEY_ROSTER_PAGE_SIZE,next});for(let key of page.items)wanted.delete(key.id)&&key.name&&names.set(key.id,key.name);if(!page.next||wanted.size===0||seen.has(page.next))break;seen.add(page.next),next=page.next}}catch{}return names}async function resolveScopeNames(client,configured){let ids=scopeType=>[...new Set(configured.filter(b=>b.scopeType===scopeType).map(b=>b.scopeId))],userIds=ids("user").map(id=>id.replace(/^usr_/,"")),unnamedKeyIds=[...new Set(configured.filter(b=>b.scopeType==="api-key"&&!b.name).map(b=>b.scopeId))],directory=await resolveDirectoryLabels(client,{keyIds:unnamedKeyIds,userIds}),directoryAnswered=directory!==DIRECTORY_SKIPPED,apiKeyNames=new Map;for(let[id,key]of directory.keys)key.name&&apiKeyNames.set(id,key.name);let members=new Map;for(let[uid,label]of directory.users??[])members.set(uid,{uid,username:label.username,name:label.name});let leftoverKeyIds=unnamedKeyIds.filter(id=>!apiKeyNames.has(id)),leftoverUserIds=directory.users===null?userIds:userIds.filter(uid=>!members.has(uid)),[legacyKeyNames,legacyMembers,projects,teams]=await Promise.all([resolveApiKeyNames(client,leftoverKeyIds,{directoryAnswered}),leftoverUserIds.length?getTeamMembersByIds(client,client.config.currentTeam,leftoverUserIds).catch(()=>new Map):new Map,Promise.all(ids("project").map(async id=>{let project=await getProjectByNameOrId(client,id).catch(()=>null),name=project&&!(project instanceof ProjectNotFound)?project.name:void 0;return[id,name||id]})),Promise.all(ids("team").map(async id=>{let team=await getTeamByIdOrSlug(client,id).catch(()=>null);return[id,team?.slug||team?.name||id]}))]),projectNames=new Map(projects),teamNames=new Map(teams);for(let[id,name]of legacyKeyNames)apiKeyNames.set(id,name);for(let[uid,member]of legacyMembers)members.set(uid,member);return configured.map(budget=>{switch(budget.scopeType){case"team":return teamNames.get(budget.scopeId)||budget.scopeId;case"project":return projectNames.get(budget.scopeId)||budget.scopeId;case"user":{let member=members.get(budget.scopeId.replace(/^usr_/,""));return member?teamMemberLabel(member):budget.scopeId}default:return budget.name||apiKeyNames.get(budget.scopeId)||budget.scopeId}})}function defaultRows(defaults,counts,filter){return BUDGET_DEFAULT_SCOPE_TYPES.flatMap(scopeType=>{if(filter&&scopeType!==filter)return[];let row=defaults.find(d=>d.scopeType===scopeType&&d.active!==!1);if(!row)return[];let applied=counts[scopeType]??0,covered=BUDGET_DEFAULT_COVERED[scopeType],noun=applied===1?covered.toLowerCase().replace(/s$/,""):covered.toLowerCase();return[[scopeType,`$${row.limitAmount}`,row.refreshPeriod,`${applied} ${noun}`]]})}async function listDefaults(client,{scopeType,asJson}){output_manager_default.spinner("Fetching budget defaults\u2026");let counts,defaults;try{[counts,defaults]=await Promise.all([asJson?{}:fetchDefaultCoveredCounts(client,scopeType),listScopeBudgetDefaults(client)])}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let policyRows=defaults.filter(d=>BUDGET_DEFAULT_SCOPE_TYPES.includes(d.scopeType)&&(scopeType===void 0||d.scopeType===scopeType));if(asJson)return client.stdout.write(`${JSON.stringify({defaults:policyRows},null,2)}
19
+ `),0;let rows=defaultRows(defaults,counts,scopeType);return rows.length===0?(output_manager_default.log(scopeType?`No ${scopeType} budget default set. Set one with ${getCommandName(`ai-gateway budgets set ${scopeType} --default`)}.`:`No budget defaults set. Set one with ${getCommandName("ai-gateway budgets set <scope> --default")}.`),0):(output_manager_default.log("Budget defaults"),client.stdout.write(`${table([["default","limit","refresh","applied to"].map(header=>import_chalk5.default.gray(header)),...rows],{align:["l","r","l","l"],hsep:4}).replace(/^/gm," ")}
20
+ `),0)}async function fetchDefaultCoveredCounts(client,scopeType){return(await listBudgetsPage(client,{scopeType,limit:1,includeDefaultCovered:!1})).defaultCoveredCounts}function printDefaultsSection(defaults,counts,filter){let rows=defaultRows(defaults,counts,filter);rows.length!==0&&(output_manager_default.log("Scopes without their own budget inherit the following defaults:"),output_manager_default.print(`${table([["default","limit","refresh","applied to"].map(header=>import_chalk5.default.gray(header)),...rows],{align:["l","r","l","l"],hsep:4}).replace(/^/gm," ")}
21
+ `))}function printBudgetsTable(budgets2,names){return`${table([["scope","name","limit","spent","refresh"].map(header=>import_chalk5.default.gray(header)),...budgets2.map((budget,i)=>[budget.scopeType,names[i],`$${budget.limitAmount}`,`$${budget.currentSpend.toFixed(2)}`,budget.refreshPeriod])],{align:["l","l","r","r","l"],hsep:4}).replace(/^/gm," ")}
22
+
23
+ `}var AiGatewayBudgetsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect2(client,argv){let telemetry=new AiGatewayBudgetsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsInspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliArgumentName(args[1]),telemetry.trackCliFlagDefault(opts["--default"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,isDefault=opts["--default"],scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(!await ensureTeam(client))return 1;if(scope.isDefault)return await inspectScopeDefault(client,scope.scopeType,asJson);let scopeId,targetName;if(scope.scopeType==="team"){let team=await getTeamByIdOrSlug(client,client.config.currentTeam).catch(()=>null);targetName=team?.slug||team?.name}else if(scope.scopeType==="project"){let resolved=await getProjectByNameOrId(client,scope.name);if(resolved instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${scope.name}`),1;scopeId=resolved.id,targetName=resolved.name||scope.name}else if(scope.scopeType==="user"){let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,scope.name);if(!member)return output_manager_default.error(`Team member not found: ${scope.name}`),1;scopeId=member.uid,targetName=teamMemberLabel(member)}else if(scope.scopeType==="api-key"){let resolved=await findApiKeyByIdOrName(client,scope.name);if("error"in resolved)return output_manager_default.error(describeApiKeyLookupError(scope.name,resolved)),1;scopeId=resolved.apiKey.id,targetName=resolved.apiKey.name||scopeId}output_manager_default.spinner("Fetching budget\u2026");let budgets2;try{budgets2=await listBudgets(client,scope.scopeType)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let budget=budgets2.find(row=>row.scopeType===scope.scopeType&&(scope.scopeType==="team"||row.scopeId===scopeId||row.scopeId===`usr_${scopeId}`)),label=scope.scopeType==="team"?"the team":targetName;return budget?asJson?(client.stdout.write(`${JSON.stringify(budget,null,2)}
24
+ `),0):(printAlignedLabel("Scope",budget.scopeType),printAlignedLabel("Name",budget.name||targetName||budget.scopeId),printAlignedLabel("Limit",`$${budget.limitAmount}`),printAlignedLabel("Spent",`$${budget.currentSpend.toFixed(2)}`),printAlignedLabel("Refresh",budget.refreshPeriod),budget.source==="default"&&printAlignedLabel("Source",`${budget.scopeType} default`),0):(output_manager_default.error(`No budget found for ${label}.`),1)}async function inspectScopeDefault(client,scopeType,asJson){output_manager_default.spinner("Fetching budget default\u2026");let row;try{row=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType===scopeType&&d.active!==!1)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}return output_manager_default.stopSpinner(),row?asJson?(client.stdout.write(`${JSON.stringify(row,null,2)}
25
+ `),0):(printAlignedLabel("Scope",row.scopeType),printAlignedLabel("Limit",`$${row.limitAmount}`),printAlignedLabel("Refresh",row.refreshPeriod),printAlignedLabel("Applies to",BUDGET_DEFAULT_APPLIES_TO[scopeType]),0):(output_manager_default.error(`No ${scopeType} budget default set. Set one with ${getCommandName(`ai-gateway budgets set ${scopeType} --default`)}.`),1)}var import_chalk6=__toESM(require_source(),1);var AiGatewayBudgetsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagDefault(defaultValue){defaultValue&&this.trackCliFlag("default")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var SCOPE_NOUNS={team:"The team",project:"The project",user:"The user","api-key":"The API key"};async function remove2(client,argv){let telemetry=new AiGatewayBudgetsRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,yes=opts["--yes"],isDefault=opts["--default"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliArgumentName(args[1]),telemetry.trackCliFlagYes(yes),telemetry.trackCliFlagDefault(isDefault),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetScope(args,{isDefault});if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scope}=scopeResult;if(!await ensureTeam(client))return 1;if(scope.isDefault)return await removeScopeDefault(client,scope.scopeType,{yes,asJson});let projectId,userId,apiKeyId,targetName;if(scope.scopeType==="project"){let resolved=await getProjectByNameOrId(client,scope.name);if(resolved instanceof ProjectNotFound)return output_manager_default.error(`Project not found: ${scope.name}`),1;projectId=resolved.id,targetName=scope.name}else if(scope.scopeType==="user"){let member=await getTeamMemberByIdentifier(client,client.config.currentTeam,scope.name);if(!member)return output_manager_default.error(`Team member not found: ${scope.name}`),1;userId=member.uid,targetName=teamMemberLabel(member)}else if(scope.scopeType==="api-key"){let resolved=await findApiKeyByIdOrName(client,scope.name);if("error"in resolved)return output_manager_default.error(describeApiKeyLookupError(scope.name,resolved)),1;apiKeyId=resolved.apiKey.id,targetName=resolved.apiKey.name||resolved.apiKey.id}let target=scope.scopeType==="team"?"the team budget":`the budget for ${import_chalk6.default.bold(targetName)}`,defaults=await listScopeBudgetDefaults(client).catch(()=>null),fallbackDefault=defaults?.find(d=>d.scopeType===scope.scopeType&&d.active!==!1),noun=SCOPE_NOUNS[scope.scopeType],consequence=defaults?fallbackDefault?` ${noun} falls back to the ${scope.scopeType} default (${formatBudgetCap(fallbackDefault.limitAmount,fallbackDefault.refreshPeriod)}).`:` ${noun} will have no spend cap.`:"";if(!yes){if(client.nonInteractive||!client.stdin.isTTY)return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Remove ${target}?${consequence}`,!1))return output_manager_default.log("Canceled"),0}output_manager_default.spinner("Removing budget\u2026");try{if(scope.scopeType==="api-key"?await updateApiKeyQuota(client,apiKeyId,{archived:!0}):await removeBudget(client,scope.scopeType,{projectId,userId}),output_manager_default.stopSpinner(),asJson)client.stdout.write(`${JSON.stringify({scopeType:scope.scopeType,...projectId?{projectId}:{},...userId?{userId}:{},...apiKeyId?{apiKeyId}:{},removed:!0},null,2)}
26
+ `);else{let removedValue=scope.scopeType==="team"?"team budget":`budget for ${targetName}`;printAlignedLabel("Removed",removedValue,{gutter:"\u2713"}),fallbackDefault&&printAlignedLabel("Falls back to",`${scope.scopeType} default (${formatBudgetCap(fallbackDefault.limitAmount,fallbackDefault.refreshPeriod)})`)}return 0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk7=__toESM(require_source(),1);var AiGatewayBudgetsDefaultsListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};async function list3(client,argv){let telemetry=new AiGatewayBudgetsDefaultsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs;telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!await ensureTeam(client))return 1;output_manager_default.spinner("Fetching budget defaults\u2026");let defaults;try{defaults=await listScopeBudgetDefaults(client)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}output_manager_default.stopSpinner();let shown=defaults.filter(d=>BUDGET_DEFAULT_SCOPE_TYPES.includes(d.scopeType));return asJson?(client.stdout.write(`${JSON.stringify({defaults:shown},null,2)}
27
+ `),0):shown.length===0?(output_manager_default.log(`No budget defaults set. Set one with ${getCommandName("ai-gateway budgets set <scope> --default")}.`),0):(output_manager_default.log("Budget defaults"),client.stdout.write(printDefaultsTable(shown)),0)}function printDefaultsTable(defaults){return`${table([["scope","limit","refresh"].map(header=>import_chalk7.default.gray(header)),...defaults.map(d=>[d.scopeType,`$${d.limitAmount}`,d.refreshPeriod])],{align:["l","r","l"],hsep:4}).replace(/^/gm," ")}
28
+
29
+ `}var AiGatewayBudgetsDefaultsSetTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};var REFRESH_PERIODS2=["daily","weekly","monthly","none"];async function set2(client,argv){let telemetry=new AiGatewayBudgetsDefaultsSetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsSetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,limit=opts["--limit"],refreshPeriod=opts["--refresh-period"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliOptionLimit(limit),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetDefaultScope(args);if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scopeType}=scopeResult;return limit===void 0||Number.isNaN(limit)||limit<1?(output_manager_default.error("The --limit flag is required and must be at least 1."),2):refreshPeriod!==void 0&&!REFRESH_PERIODS2.includes(refreshPeriod)?(output_manager_default.error(`The --refresh-period flag must be one of: ${REFRESH_PERIODS2.join(", ")}.`),2):await ensureTeam(client)?await setScopeDefault(client,{scopeType,limit,refreshPeriod,asJson}):1}var AiGatewayBudgetsDefaultsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentScope(scope){scope&&this.trackCliArgument({arg:"scope",value:scope})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}};async function remove3(client,argv){let telemetry=new AiGatewayBudgetsDefaultsRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(budgetsDefaultsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,yes=opts["--yes"];telemetry.trackCliArgumentScope(args[0]),telemetry.trackCliFlagYes(yes),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,scopeResult=parseBudgetDefaultScope(args);if("error"in scopeResult)return output_manager_default.error(scopeResult.error),2;let{scopeType}=scopeResult;return await ensureTeam(client)?await removeScopeDefault(client,scopeType,{yes,asJson}):1}var AiGatewayBudgetsDefaultsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG2={list:getCommandAliases(budgetsDefaultsListSubcommand),set:getCommandAliases(budgetsDefaultsSetSubcommand),remove:getCommandAliases(budgetsDefaultsRemoveSubcommand)};async function budgetsDefaults(client){let telemetry=new AiGatewayBudgetsDefaultsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(budgetsDefaultsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(3),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),output_manager_default.print(help(budgetsDefaultsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:budgetsDefaultsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list3(client,args));case"set":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsSetSubcommand),0):(telemetry.trackCliSubcommandSet(subcommandOriginal),set2(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets defaults",subcommandOriginal),printHelp(budgetsDefaultsRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway budgets defaults delete","ai-gateway budgets defaults remove"),remove3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG2)),output_manager_default.print(help(budgetsDefaultsSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayBudgetsTelemetryClient=class extends TelemetryClient{trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandDefaults(actual){this.trackCliSubcommand({subcommand:"defaults",value:actual})}};var COMMAND_CONFIG3={set:getCommandAliases(budgetsSetSubcommand),list:getCommandAliases(budgetsListSubcommand),inspect:getCommandAliases(budgetsInspectSubcommand),remove:getCommandAliases(budgetsRemoveSubcommand),defaults:getCommandAliases(budgetsDefaultsSubcommand)};async function budgets(client){let telemetry=new AiGatewayBudgetsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(budgetsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG3),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),output_manager_default.print(help(budgetsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:budgetsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"set":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsSetSubcommand),0):(telemetry.trackCliSubcommandSet(subcommandOriginal),set(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsInspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect2(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway budgets",subcommandOriginal),printHelp(budgetsRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway budgets delete","ai-gateway budgets remove"),remove2(client,args));case"defaults":return telemetry.trackCliSubcommandDefaults(subcommandOriginal),needHelp||output_manager_default.warn(`The ${getCommandName("ai-gateway budgets defaults")} command group is deprecated. Use \`--default\` with \`budgets set\`, \`budgets inspect\`, or \`budgets remove\` (e.g. ${getCommandName("ai-gateway budgets set user --default --limit 50")}), or ${getCommandName("ai-gateway budgets ls --defaults")}.`),budgetsDefaults(client);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG3)),output_manager_default.print(help(budgetsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk8=__toESM(require_source(),1);async function createRule(client,input){return client.fetch("/ai-gateway/rules",{method:"POST",body:input})}async function listRulesPage(client,opts={}){let query=new URLSearchParams;opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next),opts.includeDisabled&&query.set("includeDisabled","true");let qs=query.toString(),{rules:rules2,nextCursor}=await client.fetch(`/ai-gateway/rules${qs?`?${qs}`:""}`,{method:"GET"});return{items:rules2??[],next:nextCursor??null}}async function updateRule(client,input){return client.fetch("/ai-gateway/rules",{method:"PATCH",body:input})}async function deleteRule(client,ruleId){await client.fetch(`/ai-gateway/rules?ruleId=${encodeURIComponent(ruleId)}`,{method:"DELETE"})}var AiGatewayRulesAddTelemetryClient=class extends TelemetryClient{trackCliOptionType(type){type&&this.trackCliOption({option:"type",value:type})}trackCliOptionSource(source){source&&this.trackCliOption({option:"source",value:this.redactedValue})}trackCliOptionDestination(destination){destination&&this.trackCliOption({option:"destination",value:this.redactedValue})}trackCliOptionReason(reason){reason&&this.trackCliOption({option:"reason",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var RULE_TYPES=["rewrite","deny"];async function add(client,argv){let telemetry=new AiGatewayRulesAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesAddSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,type=opts["--type"],source=opts["--source"],destination=opts["--destination"],reason=opts["--reason"],description=opts["--description"];telemetry.trackCliOptionType(type),telemetry.trackCliOptionSource(source),telemetry.trackCliOptionDestination(destination),telemetry.trackCliOptionReason(reason),telemetry.trackCliOptionDescription(description),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!type||!RULE_TYPES.includes(type))return output_manager_default.error(`The --type flag is required and must be one of: ${RULE_TYPES.join(", ")}.`),2;if(!source)return output_manager_default.error("The --source flag is required (the model the rule matches)."),2;if(type==="rewrite"&&!destination)return output_manager_default.error("A rewrite rule requires --destination (the model to route to)."),2;if(type==="deny"&&destination)return output_manager_default.error("A deny rule cannot set --destination."),1;let action;if(type==="rewrite"&&destination?action={rewriteModel:destination,...reason?{reason}:{}}:reason&&(action={reason}),!await ensureTeam(client))return 1;let addStamp=stamp_default();output_manager_default.spinner("Adding routing rule");try{let rule=await createRule(client,{type,match:{model:source},...action?{action}:{},...description?{description}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(rule,null,2)}
30
+ `):(client.stdout.write(`${rule.ruleId}
31
+ `),output_manager_default.success(`Routing rule ${import_chalk8.default.bold(rule.ruleId)} added ${addStamp()}`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk9=__toESM(require_source(),1);var AiGatewayRulesListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagIncludeDisabled(includeDisabled){includeDisabled&&this.trackCliFlag("include-disabled")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list4(client,argv){let telemetry=new AiGatewayRulesListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,includeDisabled=opts["--include-disabled"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliFlagIncludeDisabled(includeDisabled),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}return await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching routing rules",fetch:()=>listRulesPage(client,{limit,next,includeDisabled:!!includeDisabled}),toJSON:page=>({rules:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more rules.":`No routing rules found. Add one with ${getCommandName("ai-gateway rules add")}.`,header:()=>"Routing rules",renderTable:page=>printRulesTable(page.items),next:page=>page.next}):1}function printRulesTable(rules2){return`${table([["id","type","model","action","enabled"].map(header=>import_chalk9.default.gray(header)),...rules2.map(rule=>[rule.ruleId,rule.type,rule.match?.model??import_chalk9.default.gray("\u2013"),rule.type==="rewrite"?`\u2192 ${rule.action?.rewriteModel??import_chalk9.default.gray("\u2013")}`:import_chalk9.default.gray("deny"),rule.enabled===!1?import_chalk9.default.gray("no"):"yes"])],{align:["l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
32
+
33
+ `}var import_chalk10=__toESM(require_source(),1);var AiGatewayRulesEditTelemetryClient=class extends TelemetryClient{trackCliArgumentRuleId(ruleId){ruleId&&this.trackCliArgument({arg:"ruleId",value:this.redactedValue})}trackCliFlagEnable(enable){enable&&this.trackCliFlag("enable")}trackCliFlagNoEnable(value){value&&this.trackCliFlag("no-enable")}trackCliFlagDisable(disable){disable&&this.trackCliFlag("disable")}trackCliOptionDestination(destination){destination&&this.trackCliOption({option:"destination",value:this.redactedValue})}trackCliOptionReason(reason){reason&&this.trackCliOption({option:"reason",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function edit(client,argv){let telemetry=new AiGatewayRulesEditTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesEditSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[ruleId]=args,destination=opts["--destination"],reason=opts["--reason"],description=opts["--description"];telemetry.trackCliArgumentRuleId(ruleId),telemetry.trackCliFlagEnable(opts["--enable"]),telemetry.trackCliFlagNoEnable(opts["--no-enable"]),telemetry.trackCliFlagDisable(opts["--disable"]),telemetry.trackCliOptionDestination(destination),telemetry.trackCliOptionReason(reason),telemetry.trackCliOptionDescription(description),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!ruleId)return output_manager_default.error(`${getCommandName("ai-gateway rules update <ruleId>")} expects a rule id.`),2;let enable=readOnOffOption(client,opts,{on:"--enable",off:"--no-enable",oldOff:"--disable"});if("error"in enable)return output_manager_default.error(enable.error),2;let action=destination||reason?{...destination?{rewriteModel:destination}:{},...reason?{reason}:{}}:void 0,enabled=enable.value;if(enabled===void 0&&description===void 0&&!action)return output_manager_default.error("Nothing to edit. Pass --enable, --no-enable, --destination, --reason, or --description."),1;if(!await ensureTeam(client))return 1;let editStamp=stamp_default();output_manager_default.spinner("Updating routing rule");try{let rule=await updateRule(client,{ruleId,...enabled!==void 0?{enabled}:{},...description!==void 0?{description}:{},...action?{action}:{}});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(rule,null,2)}
34
+ `):output_manager_default.success(`Routing rule ${import_chalk10.default.bold(rule.ruleId)} updated ${editStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Routing rule "${ruleId}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk11=__toESM(require_source(),1);var AiGatewayRulesRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentRuleId(ruleId){ruleId&&this.trackCliArgument({arg:"ruleId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove4(client,argv){let telemetry=new AiGatewayRulesRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(rulesRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[ruleId]=args,yes=opts["--yes"];telemetry.trackCliArgumentRuleId(ruleId),telemetry.trackCliFlagYes(yes),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!ruleId)return output_manager_default.error(`${getCommandName("ai-gateway rules remove <ruleId>")} expects a rule id.`),2;if(!await ensureTeam(client))return 1;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("To remove in non-interactive mode, re-run with --yes."),1;if(!await client.input.confirm(`Remove routing rule ${import_chalk11.default.bold(ruleId)}?`,!1))return output_manager_default.log("Canceled"),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing routing rule");try{return await deleteRule(client,ruleId),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({ruleId,removed:!0},null,2)}
35
+ `):output_manager_default.success(`Routing rule ${import_chalk11.default.bold(ruleId)} removed ${removeStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Routing rule "${ruleId}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayRulesTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG4={add:getCommandAliases(rulesAddSubcommand),list:getCommandAliases(rulesListSubcommand),update:getCommandAliases(rulesEditSubcommand),remove:getCommandAliases(rulesRemoveSubcommand)};async function rules(client){let telemetry=new AiGatewayRulesTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(rulesSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG4),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),output_manager_default.print(help(rulesSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:rulesSubcommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&output_manager_default.warn("AI Gateway routing rules are in beta and may change. Avoid relying on them in production. Share feedback at https://vercel.com/feedback"),subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesAddSubcommand),0):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list4(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesEditSubcommand),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"ai-gateway rules edit","ai-gateway rules update"),edit(client,args));case"remove":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway rules",subcommandOriginal),printHelp(rulesRemoveSubcommand),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),subcommandOriginal==="delete"&&warnDeprecatedSubcommand(client,"ai-gateway rules delete","ai-gateway rules remove"),remove4(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG4)),output_manager_default.print(help(rulesSubcommand,{columns:client.stderr.columns})),2}}var import_chalk12=__toESM(require_source(),1);var VIRTUAL_MODEL_KINDS=["alias","relay"],MAX_PAGE_SIZE2=200;async function listVirtualModelsPage(client,opts){let query=new URLSearchParams({includeArchived:String(opts.includeArchived)});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("cursor",opts.next);let page=await client.fetch(`/ai-gateway/virtual-model-configs/list?${query.toString()}`,{method:"GET"});return{items:page.virtualModelConfigs??[],next:page.cursor??null}}async function listVirtualModels(client){return fetchAllPages(next=>listVirtualModelsPage(client,{limit:MAX_PAGE_SIZE2,next,includeArchived:!0}))}async function getVirtualModel(client,virtualModelSlug){return client.fetch(virtualModelPath(virtualModelSlug),{method:"GET"})}function virtualModelPath(virtualModelSlug){return`/ai-gateway/virtual-model-configs/${encodeURIComponent(virtualModelSlug)}`}async function createVirtualModel(client,input){return client.fetch("/ai-gateway/virtual-model-configs",{method:"POST",body:input})}async function updateVirtualModel(client,input){let{virtualModelSlug,...updates}=input;return client.fetch(virtualModelPath(virtualModelSlug),{method:"PATCH",body:updates})}async function restoreVirtualModel(client,virtualModelSlug){return client.fetch(virtualModelPath(virtualModelSlug),{method:"PATCH",body:{deleted:!1}})}async function deleteVirtualModel(client,virtualModelSlug){await client.fetch(virtualModelPath(virtualModelSlug),{method:"DELETE"})}function parseConfigFlag(raw,subject="The --config flag",settableFields=SETTABLE_FIELDS){if(!raw)return{ok:!0,value:{}};let parsed;try{parsed=JSON.parse(raw)}catch{return{ok:!1,error:`${subject} must be valid JSON.`}}if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return{ok:!1,error:`${subject} must be a JSON object.`};let unknownFields=Object.keys(parsed).filter(field=>!Object.hasOwn(settableFields,field));if(unknownFields.length>0){let objectValued=unknownFields.filter(field=>{let v=parsed[field];return typeof v=="object"&&v!==null&&!Array.isArray(v)}),hint=objectValued.length>0?` ${objectValued.length===1?"That looks":"Those look"} like provider options; wrap ${objectValued.length===1?"it":"them"} as { "providerOptions": { "${objectValued[0]}": { ... } } }.`:"";return{ok:!1,error:`${unknownFields.length===1?"Unknown field":"Unknown fields"}: ${unknownFields.join(", ")}.${hint} Settable fields are: ${Object.keys(settableFields).sort().join(", ")}.`}}for(let[field,allowed]of Object.entries(ENUM_FIELD_VALUES)){let v=parsed[field];if(v!==void 0&&(typeof v!="string"||!allowed.includes(v)))return{ok:!1,error:`Invalid ${field}: ${JSON.stringify(v)}. Valid values are: ${allowed.join(", ")}.`}}let has=parsed.has;if(has!==void 0){if(!Array.isArray(has))return{ok:!1,error:`has must be an array of: ${HAS_VALUES.join(", ")}.`};let bad2=has.find(entry2=>!HAS_VALUES.includes(entry2));if(bad2!==void 0)return{ok:!1,error:`Invalid has entry: ${JSON.stringify(bad2)}. Valid values are: ${HAS_VALUES.join(", ")}.`}}let providerOptions=parsed.providerOptions;if(providerOptions!==void 0){let shapeError=invalidProviderOptions(providerOptions);if(shapeError)return{ok:!1,error:shapeError}}for(let field of BOOLEAN_FIELDS){let v=parsed[field];if(v!==void 0&&typeof v!="boolean")return{ok:!1,error:`${field} must be true or false.`}}return{ok:!0,value:parsed}}function invalidProviderOptions(value){let isRecord=v=>typeof v=="object"&&v!==null&&!Array.isArray(v);if(!isRecord(value)||Object.values(value).some(v=>!isRecord(v)))return'providerOptions must be an object of per-provider objects, e.g. {"anthropic": {"effort": "high"}}.'}var ENUM_FIELD_VALUES={sort:["@default","cost","ttft","tps","price","latency","throughput"],serviceTier:["@default","flex","priority","fast"],caching:["@default","auto"],speed:["fast"]},HAS_VALUES=["implicit-caching","vision"],BOOLEAN_FIELDS=["zeroDataRetention","disallowPromptTraining","allowFallbackFromFast"];function splitList(value){if(value===void 0)return;let items=value.split(",").map(item=>item.trim()).filter(Boolean);return items.length>0?items:void 0}var SETTABLE_FIELDS={virtualModelSlug:!0,modelSlug:!0,kind:!0,displayName:!0,description:!0,status:!0,visibility:!0,updatedBy:!0,deleted:!0,baseUrl:!0,providerOrder:!0,providerOnly:!0,observabilityTags:!0,inferenceRegion:!0,models:!0,sort:!0,has:!0,caching:!0,serviceTier:!0,providerTimeouts:!0,providerOptions:!0,zeroDataRetention:!0,disallowPromptTraining:!0,speed:!0,allowFallbackFromFast:!0},UPDATEABLE_FIELDS={virtualModelSlug:!0,modelSlug:!0,displayName:!0,description:!0,status:!0,visibility:!0,updatedBy:!0,deleted:!0,baseUrl:!0,providerOrder:!0,providerOnly:!0,observabilityTags:!0,inferenceRegion:!0,models:!0,sort:!0,has:!0,caching:!0,serviceTier:!0,providerTimeouts:!0,providerOptions:!0,zeroDataRetention:!0,disallowPromptTraining:!0,speed:!0,allowFallbackFromFast:!0};var DEFAULT_AI_GATEWAY_URL="https://ai-gateway.vercel.sh";function gatewayBase(){return process.env.VERCEL_AI_GATEWAY_URL??DEFAULT_AI_GATEWAY_URL}async function listModels(client,opts={}){let{data}=await client.fetch(`${gatewayBase()}/v1/models`,{method:"GET",...opts});return data??[]}async function listModelEndpoints(client,model){let path=model.split("/").map(encodeURIComponent).join("/"),{data}=await client.fetch(`${gatewayBase()}/v1/models/${path}/endpoints`,{method:"GET"});return data}var AiGatewayVirtualModelsCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionKind(kind){kind&&this.trackCliOption({option:"kind",value:VIRTUAL_MODEL_KINDS.includes(kind)?kind:this.redactedValue})}trackCliOptionModel(model){model&&this.trackCliOption({option:"model",value:this.redactedValue})}trackCliOptionDisplayName(displayName){displayName&&this.trackCliOption({option:"display-name",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionProviderOrder(providerOrder){providerOrder&&this.trackCliOption({option:"provider-order",value:this.redactedValue})}trackCliOptionProviderOnly(providerOnly){providerOnly&&this.trackCliOption({option:"provider-only",value:this.redactedValue})}trackCliOptionConfig(config){config&&this.trackCliOption({option:"config",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var MAX_PROVIDERS_IN_PROMPT=8;async function create2(client,argv){let telemetry=new AiGatewayVirtualModelsCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsCreateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,config=parseConfigFlag(opts["--config"]);if(!config.ok)return output_manager_default.error(config.error),1;let[slugArg]=args,kindFlag=opts["--kind"],modelFlag=opts["--model"];telemetry.trackCliArgumentSlug(slugArg),telemetry.trackCliOptionKind(kindFlag),telemetry.trackCliOptionModel(modelFlag),telemetry.trackCliOptionDisplayName(opts["--display-name"]),telemetry.trackCliOptionDescription(opts["--description"]),telemetry.trackCliOptionProviderOrder(opts["--provider-order"]),telemetry.trackCliOptionProviderOnly(opts["--provider-only"]),telemetry.trackCliOptionConfig(opts["--config"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,merged={...config.value,...definedOnly({virtualModelSlug:slugArg,kind:kindFlag,modelSlug:modelFlag,displayName:opts["--display-name"],description:opts["--description"],providerOrder:splitList(opts["--provider-order"]),providerOnly:splitList(opts["--provider-only"])})},canPrompt2=!!client.stdin.isTTY&&!client.nonInteractive&&!client.isAgent,wizard=!1;if(!merged.virtualModelSlug){if(!canPrompt2){let message="A slug is required. Pass it as an argument, in --config, or run interactively.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway virtual-models create <slug> --model <provider/model>")}]},2),output_manager_default.error(message),2}wizard=!0,merged.virtualModelSlug=await client.input.text({message:"Slug for the virtual model (called as vmc/<slug>):",validate:async value=>{let slug=value.trim();if(!slug)return"A slug is required.";if(!/^[a-zA-Z0-9_.-]+$/.test(slug))return"Letters, numbers, hyphens, underscores, periods only.";if(!client.config.currentTeam)return!0;try{return await getVirtualModel(client,slug),"That slug is already taken."}catch{return!0}}})}if(merged.kind??="alias",!VIRTUAL_MODEL_KINDS.includes(merged.kind))return output_manager_default.error(`--kind must be one of: ${VIRTUAL_MODEL_KINDS.join(", ")}.`),2;let catalogPromise,getCatalog=()=>(catalogPromise??=listModels(client).catch(()=>[]),catalogPromise),providersPromise,getProviders=()=>(providersPromise??=listModelEndpoints(client,String(merged.modelSlug)).then(data=>[...new Set(data.endpoints.map(endpoint=>endpoint.provider_name))]).catch(()=>[]),providersPromise);if(!merged.modelSlug){if(!canPrompt2){let message="A target model is required. Pass --model, put modelSlug in --config, or run interactively.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message,next:[{command:getCommandNamePlain("ai-gateway virtual-models create <slug> --model <provider/model>")}]},2),output_manager_default.error(message),2}wizard=!0;let catalog=await getCatalog();catalog.length>0?merged.modelSlug=await client.input.search({message:`Model this virtual model points at (${catalog.length} available):`,pageSize:15,source:term=>{let searchTerm=term?.trim().toLowerCase();return(searchTerm?catalog.filter(model=>model.id.toLowerCase().includes(searchTerm)||(model.name??"").toLowerCase().includes(searchTerm)):catalog).map(model=>({name:model.id,value:model.id}))}}):merged.modelSlug=await client.input.text({message:"Model this virtual model points at (e.g. openai/gpt-5.1):",validate:value=>value.trim().length>0?!0:"A model is required."})}if(wizard&&opts["--config"]===void 0){let picked=await client.input.checkbox({message:`Which fields would you like to set?${CHECKBOX_INSTRUCTIONS}`,instructions:!1,choices:[{name:"Display name",value:"displayName"},{name:"Description",value:"description"},{name:"Model fallbacks",value:"models"},{name:"Provider order",value:"providerOrder"},{name:"Only these providers",value:"providerOnly"},{name:"Sort by",value:"sort"},{name:"Service tier",value:"serviceTier"},{name:"Prompt caching",value:"caching"},{name:"Fast mode",value:"speed"},{name:"Required capabilities",value:"has"},{name:"Observability tags",value:"observabilityTags"},{name:"Zero data retention",value:"zeroDataRetention"},{name:"Disallow prompt training",value:"disallowPromptTraining"},{name:"Provider options (JSON)",value:"providerOptions"},{name:"Other fields (raw JSON)",value:"otherJson"}]}),csvPrompt=async(message,field,validateEntry)=>{let value=splitList(await client.input.text({message,validate:async v=>{let entries=splitList(v);if(!entries)return"Enter at least one value.";if(validateEntry)for(let entry2 of entries){let result=await validateEntry(entry2);if(result!==!0)return result}return!0}}));value&&merged[field]===void 0&&(merged[field]=value)},providerEntryValidator=async entry2=>{let providers2=await getProviders();return providers2.length===0||providers2.includes(entry2)?!0:`Unknown provider: ${entry2}. This model is served by: ${providers2.join(", ")}.`},providerPrompt=async label=>{let providers2=await getProviders();if(providers2.length<2)return`${label}, comma-separated:`;let shown=providers2.slice(0,MAX_PROVIDERS_IN_PROMPT).join(", "),rest=providers2.length-MAX_PROVIDERS_IN_PROMPT;return rest>0?`${label}, comma-separated (available: ${shown}, and ${rest} more):`:`${label}, comma-separated (available: ${shown}):`},modelEntryValidator=async entry2=>{let catalog=await getCatalog();return catalog.length===0||catalog.some(model=>model.id===entry2)?!0:`Unknown model: ${entry2}.`};for(let field of picked)switch(field){case"displayName":case"description":{let label=field==="displayName"?"Display name":"Description",value=await client.input.text({message:`${label}:`});value.trim()&&merged[field]===void 0&&(merged[field]=value.trim());break}case"models":await csvPrompt("Fallback models, comma-separated (e.g. moonshotai/kimi-k2-thinking, zai/glm-5.1):","models",modelEntryValidator);break;case"providerOrder":await csvPrompt(await providerPrompt("Providers to try first"),"providerOrder",providerEntryValidator);break;case"providerOnly":await csvPrompt(await providerPrompt("Restrict to these providers"),"providerOnly",providerEntryValidator);break;case"observabilityTags":await csvPrompt("Observability tags, comma-separated (letters, numbers, . _ -):","observabilityTags",async entry2=>/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(entry2)?!0:`Invalid tag: ${entry2}. Letters, numbers, . _ -, starting alphanumeric.`);break;case"sort":{let value=await client.input.select({message:"Sort providers by:",choices:[{name:"Cost (cheapest first)",value:"cost"},{name:"Time to first token",value:"ttft"},{name:"Tokens per second",value:"tps"}]});merged.sort===void 0&&(merged.sort=value);break}case"serviceTier":{let value=await client.input.select({message:"Service tier:",choices:[{name:"Flex (cheaper, may be slower)",value:"flex"},{name:"Priority (higher per-token rate)",value:"priority"}]});merged.serviceTier===void 0&&(merged.serviceTier=value);break}case"caching":{await client.input.confirm("Enable automatic prompt caching?",!0)&&merged.caching===void 0&&(merged.caching="auto");break}case"speed":{await client.input.confirm("Enable fast mode?",!1)&&merged.speed===void 0&&(merged.speed="fast",await client.input.confirm("Allow fallback to standard providers when fast ones are unavailable?",!1)&&merged.allowFallbackFromFast===void 0&&(merged.allowFallbackFromFast=!0));break}case"has":{let value=await client.input.checkbox({message:`Require providers with these capabilities:${CHECKBOX_INSTRUCTIONS}`,instructions:!1,choices:[{name:"Implicit caching",value:"implicit-caching"},{name:"Vision",value:"vision"}]});value.length>0&&merged.has===void 0&&(merged.has=value);break}case"zeroDataRetention":case"disallowPromptTraining":{let labels={zeroDataRetention:"Require zero data retention?",disallowPromptTraining:"Disallow providers that train on prompts?"};await client.input.confirm(labels[field],!1)&&merged[field]===void 0&&(merged[field]=!0);break}case"providerOptions":{let raw=await client.input.text({message:'Provider options as JSON, e.g. {"anthropic": {"effort": "high"}}:',validate:v=>{let parsed;try{parsed=JSON.parse(v)}catch{return"Provider options must be valid JSON."}return invalidProviderOptions(parsed)??!0}});merged.providerOptions===void 0&&(merged.providerOptions=JSON.parse(raw));break}case"otherJson":{let raw=await client.input.text({message:`JSON object of additional fields.
36
+ Available: status, visibility, baseUrl, inferenceRegion,
37
+ providerTimeouts, displayName, description, models, providerOrder,
38
+ providerOnly, sort, serviceTier, caching, speed, allowFallbackFromFast,
39
+ has, providerOptions, observabilityTags, zeroDataRetention,
40
+ disallowPromptTraining.
41
+ Example: {"sort": "cost"} or {"providerOptions": {"anthropic": {"effort": "high"}}}:`,validate:v=>{let result=parseConfigFlag(v,"The value");return result.ok?!0:result.error}}),parsed=parseConfigFlag(raw,"The value");if(!parsed.ok)return output_manager_default.error(parsed.error),1;for(let[key,value]of Object.entries(parsed.value))merged[key]===void 0&&(merged[key]=value);break}}}if(!await ensureTeam(client))return 1;let createStamp=stamp_default();output_manager_default.spinner("Creating virtual model");try{let virtualModel=await createVirtualModel(client,merged);return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
42
+ `):(client.stdout.write(`${virtualModel.virtualModelSlug}
43
+ `),output_manager_default.success(`Virtual model ${import_chalk12.default.bold(virtualModel.virtualModelSlug)} created ${createStamp()}. Call it as ${import_chalk12.default.bold(`vmc/${virtualModel.virtualModelSlug}`)}.`)),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}function definedOnly(record){return Object.fromEntries(Object.entries(record).filter(([,value])=>value!==void 0))}var import_chalk13=__toESM(require_source(),1);var AiGatewayVirtualModelsListTelemetryClient=class extends TelemetryClient{trackCliFlagIncludeArchived(includeArchived){includeArchived&&this.trackCliFlag("include-archived")}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list5(client,argv){let telemetry=new AiGatewayVirtualModelsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,includeArchived=!!opts["--include-archived"],limitFlag=opts["--limit"],next=opts["--next"];telemetry.trackCliFlagIncludeArchived(opts["--include-archived"]),telemetry.trackCliOptionLimit(limitFlag),telemetry.trackCliOptionNext(next),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}return await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching virtual models",fetch:()=>listVirtualModelsPage(client,{limit,next,includeArchived}),toJSON:page=>({virtualModels:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more virtual models.":`No virtual models found. Create one with ${getCommandName("ai-gateway virtual-models create")}.`,header:()=>"Virtual models",renderTable:page=>printVirtualModelsTable(page.items),next:page=>page.next}):1}function printVirtualModelsTable(virtualModels2){return`${table([["slug","kind","model","status"].map(header=>import_chalk13.default.gray(header)),...virtualModels2.map(vm=>[vm.virtualModelSlug,vm.kind??"alias",vm.modelSlug??import_chalk13.default.gray("\u2013"),vm.status??"active"])],{align:["l","l","l","l"],hsep:4}).replace(/^/gm," ")}
44
+
45
+ `}var import_chalk14=__toESM(require_source(),1);var AiGatewayVirtualModelsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect3(client,argv){let telemetry=new AiGatewayVirtualModelsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsInspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);return formatResult.valid?slug?await ensureTeam(client)?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching virtual model ${slug}`,fetch:()=>getVirtualModel(client,slug),toJSON:virtualModel=>virtualModel,isEmpty:()=>!1,emptyMessage:"",header:virtualModel=>`Virtual model ${import_chalk14.default.bold(virtualModel.virtualModelSlug)}`,renderTable:printVirtualModelDetails,notFoundMessage:`Virtual model "${slug}" not found.`}):1:(output_manager_default.error(`${getCommandName("ai-gateway virtual-models inspect <slug>")} expects a virtual model slug.`),2):(output_manager_default.error(formatResult.error),2)}function dim2(value){return import_chalk14.default.gray(value)}function printVirtualModelDetails(vm){let rows=[["slug",vm.virtualModelSlug],["kind",vm.kind??"alias"],["model",vm.modelSlug],["display name",vm.displayName],["description",vm.description],["status",vm.status??"active"],["visibility",vm.visibility],["base url",vm.baseUrl],["fallback models",vm.models?.join(", ")],["provider order",vm.providerOrder?.join(", ")],["provider only",vm.providerOnly?.join(", ")],["observability tags",vm.observabilityTags?.join(", ")],["inference region",formatRegion(vm.inferenceRegion)],["sort",vm.sort],["has",vm.has?.join(", ")],["caching",vm.caching],["service tier",vm.serviceTier],["provider timeouts",formatTimeouts(vm.providerTimeouts)],["speed",vm.speed],["allow fallback from fast",yesNo2(vm.allowFallbackFromFast)],["zero data retention",yesNo2(vm.zeroDataRetention)],["disallow prompt training",yesNo2(vm.disallowPromptTraining)],["created",new Date(vm.createdAt).toLocaleString()],["updated",new Date(vm.updatedAt).toLocaleString()]];return`${table(rows.filter(([,value])=>value!==void 0&&value!=="").map(([label,value])=>[dim2(label),value]),{align:["l","l"],hsep:4}).replace(/^/gm," ")}
46
+
47
+ `}function yesNo2(value){return value===void 0?void 0:value?"yes":"no"}function formatRegion(region){if(!region)return;let base=[region.scope,region.geoRegion,region.providerRegion].filter(Boolean).join(" / "),providers2=region.providers?Object.entries(region.providers).map(([name,value])=>value===null?`${name}: none`:`${name}: ${[value.scope,value.geoRegion,value.providerRegion].filter(Boolean).join(" / ")}`).join(", "):void 0;return[base,providers2].filter(Boolean).join(" | ")||void 0}function formatTimeouts(timeouts){if(timeouts?.byok)return Object.entries(timeouts.byok).map(([provider,ms2])=>`${provider}: ${ms2}ms`).join(", ")}var import_chalk15=__toESM(require_source(),1);var AiGatewayVirtualModelsEditTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionModel(model){model&&this.trackCliOption({option:"model",value:this.redactedValue})}trackCliOptionDisplayName(displayName){displayName&&this.trackCliOption({option:"display-name",value:this.redactedValue})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionProviderOrder(providerOrder){providerOrder&&this.trackCliOption({option:"provider-order",value:this.redactedValue})}trackCliOptionProviderOnly(providerOnly){providerOnly&&this.trackCliOption({option:"provider-only",value:this.redactedValue})}trackCliOptionConfig(config){config&&this.trackCliOption({option:"config",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function edit2(client,argv){let telemetry=new AiGatewayVirtualModelsEditTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsEditSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,config=parseConfigFlag(opts["--config"],void 0,UPDATEABLE_FIELDS);if(!config.ok)return output_manager_default.error(config.error),1;let[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionModel(opts["--model"]),telemetry.trackCliOptionDisplayName(opts["--display-name"]),telemetry.trackCliOptionDescription(opts["--description"]),telemetry.trackCliOptionProviderOrder(opts["--provider-order"]),telemetry.trackCliOptionProviderOnly(opts["--provider-only"]),telemetry.trackCliOptionConfig(opts["--config"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models update <slug>")} expects a virtual model slug.`),2;let updates={...config.value,...definedOnly2({modelSlug:opts["--model"],displayName:opts["--display-name"],description:opts["--description"],providerOrder:splitList(opts["--provider-order"]),providerOnly:splitList(opts["--provider-only"])})};if(delete updates.virtualModelSlug,Object.keys(updates).length===0)return output_manager_default.error("Provide at least one field to change, with a flag or --config."),2;if(!await ensureTeam(client))return 1;let updateStamp=stamp_default();output_manager_default.spinner(`Updating virtual model ${slug}`);try{let virtualModel=await updateVirtualModel(client,{...updates,virtualModelSlug:slug});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
48
+ `):output_manager_default.success(`Virtual model ${import_chalk15.default.bold(virtualModel.virtualModelSlug)} updated ${updateStamp()}`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}function definedOnly2(record){return Object.fromEntries(Object.entries(record).filter(([,value])=>value!==void 0))}var import_chalk16=__toESM(require_source(),1);var AiGatewayVirtualModelsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove5(client,argv){let telemetry=new AiGatewayVirtualModelsRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models delete <slug>")} expects a virtual model slug.`),2;if(!await ensureTeam(client))return 1;let removeStamp=stamp_default();output_manager_default.spinner("Deleting virtual model");try{return await deleteVirtualModel(client,slug),output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({virtualModelSlug:slug,removed:!0},null,2)}
49
+ `):output_manager_default.success(`Virtual model ${import_chalk16.default.bold(slug)} deleted ${removeStamp()}. Restore it with ${getCommandName(`ai-gateway virtual-models restore ${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk17=__toESM(require_source(),1);var AiGatewayVirtualModelsRestoreTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function restore(client,argv){let telemetry=new AiGatewayVirtualModelsRestoreTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(virtualModelsRestoreSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[slug]=args;telemetry.trackCliArgumentSlug(slug),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(!slug)return output_manager_default.error(`${getCommandName("ai-gateway virtual-models restore <slug>")} expects a virtual model slug.`),2;if(!await ensureTeam(client))return 1;let restoreStamp=stamp_default();output_manager_default.spinner("Restoring virtual model");try{let virtualModel=await restoreVirtualModel(client,slug);return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify(virtualModel,null,2)}
50
+ `):output_manager_default.success(`Virtual model ${import_chalk17.default.bold(slug)} restored ${restoreStamp()}. Call it as ${import_chalk17.default.bold(`vmc/${slug}`)}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return output_manager_default.error(`Virtual model "${slug}" not found.`),1;if(isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var AiGatewayVirtualModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandRestore(actual){this.trackCliSubcommand({subcommand:"restore",value:actual})}};var COMMAND_CONFIG5={create:getCommandAliases(virtualModelsCreateSubcommand),list:getCommandAliases(virtualModelsListSubcommand),inspect:getCommandAliases(virtualModelsInspectSubcommand),update:getCommandAliases(virtualModelsEditSubcommand),delete:getCommandAliases(virtualModelsRemoveSubcommand),restore:getCommandAliases(virtualModelsRestoreSubcommand)};async function virtualModels(client){let telemetry=new AiGatewayVirtualModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(virtualModelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG5),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:virtualModelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"create":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsCreateSubcommand),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),create2(client,args));case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list5(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsInspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect3(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsEditSubcommand),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"ai-gateway virtual-models edit","ai-gateway virtual-models update"),edit2(client,args));case"delete":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRemoveSubcommand),0):(telemetry.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"ai-gateway virtual-models remove","ai-gateway virtual-models delete"),remove5(client,args));case"restore":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway virtual-models",subcommandOriginal),printHelp(virtualModelsRestoreSubcommand),0):(telemetry.trackCliSubcommandRestore(subcommandOriginal),restore(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG5)),output_manager_default.print(help(virtualModelsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk23=__toESM(require_source(),1);import{homedir}from"node:os";import{existsSync as existsSync2}from"node:fs";import{dirname as dirname5,resolve as resolve2}from"node:path";var import_chalk19=__toESM(require_source(),1);import{dirname,join,resolve}from"node:path";var METADATA_FILE=".aider.model.metadata.json",SETTINGS_FILE=".aider.model.settings.yml";function aiderModelId(gatewayModelId){return`openai/${gatewayModelId}`}function chatModels(ctx){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&m.context_window)}function costPerToken(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelMetadata(models3){let entries={};for(let model of models3){let input=costPerToken(model.pricing?.input),output=costPerToken(model.pricing?.output);entries[aiderModelId(model.id)]={max_input_tokens:model.context_window,...model.max_tokens?{max_output_tokens:model.max_tokens,max_tokens:model.max_tokens}:{},...input===void 0?{}:{input_cost_per_token:input},...output===void 0?{}:{output_cost_per_token:output},litellm_provider:"openai",mode:"chat"}}return entries}function modelSettings(models3){return models3.map(model=>({name:aiderModelId(model.id),settings:{edit_format:"diff",use_repo_map:!0}}))}function asObject(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertNamedYamlList(current,entries){let loaded=current?.trim()?load(current):[];if(loaded!=null&&!Array.isArray(loaded))throw new Error("existing file is not a YAML list");let list7=Array.isArray(loaded)?[...loaded]:[],indexByName=new Map;list7.forEach((item,i)=>{let name=asObject(item).name;name!==void 0&&!indexByName.has(name)&&indexByName.set(name,i)});for(let{name,settings}of entries){let index=indexByName.get(name);index===void 0?(indexByName.set(name,list7.length),list7.push({name,...settings})):list7[index]={name,...asObject(list7[index]),...settings}}return dump(list7,{lineWidth:120})}var aider={id:"aider",displayName:"Aider",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return await pathExists(join(home,".aider"))||pathExists(join(home,".aider.conf.yml"))},configPath(ctx){return ctx.overrides?.aider??join(ctx.home,".aider.conf.yml")},buildPlan(ctx){let model=aiderModelId(ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL),path=this.configPath(ctx),dir=dirname(path),metadataPath=join(dir,METADATA_FILE),settingsPath=join(dir,SETTINGS_FILE),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=chatModels(ctx),needsExplicitPaths=models3.length>0&&resolve(dir)!==resolve(ctx.home);return{fileChanges:[{path,label:"Aider config",format:"yaml",transform:current=>{let config=asObject(load(current??"")??{});return config["openai-api-base"]=base,config.model=model,needsExplicitPaths&&(config["model-metadata-file"]=metadataPath,config["model-settings-file"]=settingsPath),dump(config,{lineWidth:120})}},...models3.length?[{path:metadataPath,label:"Aider model metadata",format:"json",transform:current=>mergeJson(current,modelMetadata(models3))},{path:settingsPath,label:"Aider model settings",format:"yaml",transform:current=>upsertNamedYamlList(current,modelSettings(models3))}]:[]],envExports:[{name:"AIDER_OPENAI_API_KEY",value:ctx.apiKey}],notes:[`Aider will use the gateway with ${model}; switch with \`aider --model openai/<gateway-model-id>\` or /model in a session.`,...models3.length?[`${models3.length} gateway models are registered in ${METADATA_FILE}; re-run setup to pick up models added since.`]:[],"Open a new terminal first so AIDER_OPENAI_API_KEY is loaded."]}}};import{join as join2}from"node:path";var cline={id:"cline",displayName:"Cline",needsTopModels:!0,async detect(home){return pathExists(join2(home,".cline"))},configPath(ctx){return ctx.overrides?.cline??join2(ctx.home,".cline","data","settings","providers.json")},buildPlan(ctx){let path=this.configPath(ctx),defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,keepUpdatedAt=current=>{try{let providers2=JSON.parse(current)?.providers?.["vercel-ai-gateway"],settings=providers2?.settings;if((ctx.apiKey===KEY_PLACEHOLDER||settings?.apiKey===ctx.apiKey)&&settings?.provider==="vercel-ai-gateway"&&settings?.model===defaultModel&&providers2?.tokenSource==="manual"&&typeof providers2?.updatedAt=="string")return providers2.updatedAt}catch{}};return{fileChanges:[{path,label:"Cline providers",format:"json",mode:384,transform:current=>{let isNew=!current||!current.trim(),updatedAt=(current&&keepUpdatedAt(current))??new Date().toISOString();return mergeJson(current,{...isNew?{version:1}:{},lastUsedProvider:"vercel-ai-gateway",providers:{"vercel-ai-gateway":{settings:{provider:"vercel-ai-gateway",apiKey:ctx.apiKey,model:defaultModel},updatedAt,tokenSource:"manual"}}})}}],envExports:[],notes:[`Cline will use its native Vercel AI Gateway provider with ${defaultModel}; switch models in-session or with \`cline auth -p vercel-ai-gateway -m <gateway-model-id>\`.`,"In the VS Code extension, pick the Vercel AI Gateway provider under Settings \u2192 API Provider."]}}};import{dirname as dirname2,join as join3}from"node:path";function agenticModels(ctx,opts={}){return(ctx.gatewayModels??[]).filter(m=>m.type==="language"&&(m.tags??[]).includes("tool-use")&&!m.deprecated_at&&(!opts.requireContextWindow||!!m.context_window)&&(!opts.requireMaxTokens||!!m.max_tokens))}function defaultFirst(models3){let rest=models3.filter(m=>m.id!==GATEWAY_DEFAULT_MODEL).sort((a,b)=>a.id.localeCompare(b.id)),preferred=models3.find(m=>m.id===GATEWAY_DEFAULT_MODEL);return preferred?[preferred,...rest]:rest}function shortlistModels(ctx,opts={}){let{creator,creatorLimit=5,overallLimit=10,ensureDefault}=opts,eligible=agenticModels(ctx,opts),byId=new Map(eligible.map(m=>[m.id,m])),picked=[],take=m=>{m&&!picked.includes(m)&&picked.push(m)};if(creator){let rank=new Map((ctx.topModels??[]).map((t,i)=>[t.id,i])),unranked=Number.MAX_SAFE_INTEGER;eligible.filter(m=>m.id.startsWith(`${creator}/`)).sort((a,b)=>(rank.get(a.id)??unranked)-(rank.get(b.id)??unranked)||(b.released??b.created??0)-(a.released??a.created??0)||a.id.localeCompare(b.id)).slice(0,creatorLimit).forEach(take)}let overallStart=picked.length,room=()=>picked.length-overallStart<overallLimit;if(ensureDefault&&take(byId.get(GATEWAY_DEFAULT_MODEL)),ctx.topModels)for(let top of ctx.topModels){if(!room())break;take(byId.get(top.id))}else for(let m of defaultFirst(eligible)){if(!room())break;take(m)}return picked}var FALLBACK_MODELS=[GATEWAY_DEFAULT_MODEL];function chatModelIds(ctx){let ids=shortlistModels(ctx).map(m=>m.id);return ids.length?ids:FALLBACK_MODELS}var ONBOARDING_MARKER=".onboarding_complete",SECRET_REF="${{ secrets.AI_GATEWAY_API_KEY }}";function asObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var continueCli={id:"continue",displayName:"Continue CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join3(home,".continue"))},configPath(ctx){return ctx.overrides?.continue??join3(ctx.home,".continue","config.yaml")},buildPlan(ctx){let apiBase=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,configPath=this.configPath(ctx),modelIds=chatModelIds(ctx);return{fileChanges:[{path:configPath,label:"Continue config",format:"yaml",transform:current=>{let config=asObject2(load(current??"")??{});typeof config.name!="string"&&(config.name="Local Config"),typeof config.version!="string"&&(config.version="1.0.0"),typeof config.schema!="string"&&(config.schema="v1");let models3=Array.isArray(config.models)?[...config.models]:[],writtenIds=new Set(modelIds),kept=models3.filter(entry2=>{let e=asObject2(entry2);return!(e.apiKey===SECRET_REF||writtenIds.has(e.name))}),entries=modelIds.map(id=>({...asObject2(models3.find(m=>asObject2(m).name===id)),name:id,provider:"openai",model:id,apiBase,apiKey:SECRET_REF}));return config.models=[...kept,...entries],dump(config,{lineWidth:120})}},{path:join3(dirname2(configPath),ONBOARDING_MARKER),label:"Continue onboarding marker",format:"text",transform:current=>current??`${new Date().toISOString()}
51
+ `}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[modelIds.length>1?`Continue CLI will use the gateway with ${modelIds[0]}; /model lists the top ${modelIds.length} gateway models -- re-run setup to refresh the list.`:`Continue CLI will use the gateway with ${GATEWAY_DEFAULT_MODEL}; the gateway catalogue could not be fetched, so /model lists only that model until setup is re-run.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded, then run \`cn\`.`,`If \`cn\` ever asks for an Anthropic API key, ${ONBOARDING_MARKER} is missing next to the config -- re-run setup rather than answering the prompt, which would overwrite the gateway models.`]}}};import{join as join4}from"node:path";function copilotDir(home){let dir=process.env.COPILOT_HOME;return dir&&dir.trim()?dir:join4(home,".copilot")}var copilot={id:"copilot",needsTopModels:!0,displayName:"GitHub Copilot CLI",async detect(home){return pathExists(copilotDir(home))},configPath(ctx){return ctx.overrides?.copilot??copilotDir(ctx.home)},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[],envExports:[{name:"COPILOT_PROVIDER_BASE_URL",value:resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),plain:!0},{name:"COPILOT_PROVIDER_API_KEY",value:ctx.apiKey},{name:"COPILOT_MODEL",value:defaultModel,plain:!0}],notes:[`Copilot CLI will use the gateway with ${defaultModel}; set COPILOT_MODEL (or pass --model) to any gateway model id to switch.`,"Open a new terminal so the COPILOT_* variables are loaded; GitHub sign-in is not required in this mode."]}}};import{isAbsolute,join as join5}from"node:path";var SMALL_MODEL="anthropic/claude-haiku-4.5";function crushConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute(xdg)?xdg:join5(home,".config");return join5(base,"crush")}var crush={id:"crush",needsTopModels:!0,displayName:"Crush",async detect(home){return await pathExists(crushConfigDir(home))||pathExists(join5(home,".local","share","crush"))},configPath(ctx){return ctx.overrides?.crush??join5(crushConfigDir(ctx.home),"crush.json")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,base=ctx.baseUrlOverride?.trim();return{fileChanges:[{path:this.configPath(ctx),label:"Crush config",format:"json",transform:current=>mergeJson(current,{providers:{vercel:{api_key:`$${GATEWAY_API_KEY_ENV}`,...base?{base_url:base}:{}}},models:{large:{provider:"vercel",model:defaultModel},small:{provider:"vercel",model:SMALL_MODEL}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Crush will use its native Vercel AI Gateway provider with ${defaultModel} (${SMALL_MODEL} for small tasks); switch models in-session with ctrl+p.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join6}from"node:path";var cursor={id:"cursor",displayName:"Cursor",async detect(home){return pathExists(join6(home,".cursor"))},configPath(ctx){return ctx.overrides?.cursor??join6(ctx.home,".cursor")},buildPlan(ctx){return{fileChanges:[],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],actionRequired:!0,notes:["Cursor keeps its API-key settings in the app itself, so finish the setup there:","1. Open Cursor \u2192 Settings (Cmd+Shift+J) \u2192 Models.",`2. Under OpenAI API Key: paste your gateway key, then enable "Override OpenAI Base URL" and set it to ${ctx.baseUrlOverride??GATEWAY_CURSOR_BASE_URL}`,'3. Copy the key from a new terminal without echoing it: printf %s "$AI_GATEWAY_API_KEY" | pbcopy','4. Use "Add model" to add gateway model ids you want in the picker (e.g. anthropic/claude-fable-5, openai/gpt-5.6-sol).',"While the override is on, Cursor's built-in non-OpenAI models stop working \u2014 use gateway model ids for everything, or toggle the override off to go back.","Cursor chats are stored by its backend, so there are no local sessions to migrate.","Cursor limitations: Tab completions never use custom keys, and Agent/Auto modes may bypass the override."]}}};import{join as join7}from"node:path";var PROVIDER_KEY="vercel-ai-gateway";function profiles(models3){let out={};for(let model of models3)out[model.id]={name:model.name,...model.context_window?{max_input_tokens:model.context_window}:{},...model.max_tokens?{max_output_tokens:model.max_tokens}:{}};return out}var deepagents={id:"deepagents",displayName:"Deep Agents CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join7(home,".deepagents"))},configPath(ctx){return ctx.overrides?.deepagents??join7(ctx.home,".deepagents","config.toml")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx),ids=models3.length?models3.map(m=>m.id):[GATEWAY_DEFAULT_MODEL];return{fileChanges:[{path:this.configPath(ctx),label:"Deep Agents config",format:"toml",transform:current=>mergeToml(current,{models:{default:`${PROVIDER_KEY}:${ids[0]}`,providers:{[PROVIDER_KEY]:{display_name:"Vercel AI Gateway",api_key_env:"AI_GATEWAY_API_KEY",base_url:baseUrl,class_path:"langchain_openai:ChatOpenAI",models:ids,...models3.length?{profile:profiles(models3)}:{},params:{use_responses_api:!1}}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Deep Agents (dcode) will default to ${PROVIDER_KEY}:${ids[0]}.`,...models3.length?[`The top ${models3.length} gateway models are in the /model switcher, which filters as you type. Any other gateway id also works directly: /model ${PROVIDER_KEY}:<gateway-model-id>.`]:[],"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{join as join8}from"node:path";var PROVIDER_KEY2="vercel-ai-gateway",DEFAULT_MODEL="deepseek/deepseek-v4-flash";function asObject3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function dshDir(home){let dir=process.env.DSH_HOME;return dir&&dir.trim()?dir:join8(home,".dsh")}var deepseek={id:"deepseek",displayName:"DeepSeek Harness",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(dshDir(home))},configPath(ctx){return ctx.overrides?.deepseek??join8(dshDir(ctx.home),"settings.yaml")},buildPlan(ctx){let path=this.configPath(ctx),models3=shortlistModels(ctx,{creator:"deepseek"}).map(m=>({id:m.id,name:m.name})),defaultId=models3[0]?.id??DEFAULT_MODEL;return{fileChanges:[{path,label:"DeepSeek Harness settings",format:"yaml",transform:current=>{let config=asObject3(load(current??"")??{}),llm=asObject3(config["llm-pi-ai"]),providers2=asObject3(llm.providers),entry2=asObject3(providers2[PROVIDER_KEY2]);return delete entry2.api,delete entry2.baseURL,delete entry2.models,providers2[PROVIDER_KEY2]={...entry2,apiKeyEnv:GATEWAY_API_KEY_ENV,...models3.length?{models:models3}:{}},llm.providers=providers2,config["llm-pi-ai"]=llm,config["agent-default-model"]={provider:PROVIDER_KEY2,model:defaultId},dump(config,{lineWidth:120})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[models3.length?`DeepSeek Harness will default to ${PROVIDER_KEY2}/${defaultId}; the shortlist in settings.yaml is the picker \u2014 add any gateway model id there.`:`DeepSeek Harness will default to ${PROVIDER_KEY2}/${DEFAULT_MODEL}; every gateway model pi-ai ships is selectable with /model \u2014 no per-model config needed.`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, then run \`dsh\` \u2014 headless runs use the gateway route too.`]}}};import{join as join9}from"node:path";var API_KEY_REF="${AI_GATEWAY_API_KEY}",PROVIDER="generic-chat-completion-api",FALLBACK_MAX_OUTPUT_TOKENS=64e3;function gatewayEntries(ctx,baseUrl){let models3=shortlistModels(ctx,{requireMaxTokens:!0});return models3.length?models3.map(m=>entry(m.id,baseUrl,m.max_tokens)):[entry(GATEWAY_DEFAULT_MODEL,baseUrl,FALLBACK_MAX_OUTPUT_TOKENS)]}function entry(model,baseUrl,maxOutputTokens){return{model,displayName:model,baseUrl,apiKey:API_KEY_REF,provider:PROVIDER,maxOutputTokens}}function isOurs(value){return value?.apiKey===API_KEY_REF}function mergeCustomModels(current,entries){let existing;try{existing=current?.trim()?JSON.parse(current):{}}catch(err){throw new Error(`existing file is not valid JSON (${err.message})`)}let currentModels=existing.customModels,kept=Array.isArray(currentModels)?currentModels.filter(m=>!isOurs(m)):[];return mergeJson(current,{customModels:[...kept,...entries]})}var droid={id:"droid",displayName:"Factory Droid",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join9(home,".factory"))},configPath(ctx){return ctx.overrides?.droid??join9(ctx.home,".factory","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,entries=gatewayEntries(ctx,baseUrl);return{fileChanges:[{path:this.configPath(ctx),label:"Factory Droid settings",format:"json",transform:current=>mergeCustomModels(current,entries)}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[entries.length>1?`The top ${entries.length} gateway models are in Droid's /model picker, leaderboard order -- re-run setup to refresh the list.`:`Factory Droid gets ${GATEWAY_DEFAULT_MODEL}; pick it with /model in a session or \`droid exec -m ${GATEWAY_DEFAULT_MODEL}\`.`,`\`droid exec\` defaults to a Factory-hosted model this key cannot use -- always pass \`-m ${entries[0]?.model??GATEWAY_DEFAULT_MODEL}\` (or another gateway model above).`]}}};init_dist();import{dirname as dirname3,join as join10}from"node:path";var PROVIDER_ID="vercel-ai-gateway";function asObject4(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function upsertById(list7,merge){let index=list7.findIndex(item=>asObject4(item).id===PROVIDER_ID),merged={id:PROVIDER_ID,...merge(asObject4(list7[index]))};return index===-1?[...list7,merged]:list7.map((item,i)=>i===index?merged:item)}var forge={id:"forge",needsTopModels:!0,displayName:"ForgeCode",async detect(home){return pathExists(join10(home,".forge"))},configPath(ctx){return ctx.overrides?.forge??join10(ctx.home,".forge",".forge.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path:configPath,label:"ForgeCode config",format:"toml",transform:current=>{let config=current?.trim()?parse(current):{},providers2=Array.isArray(config.providers)?config.providers:[];return config.providers=upsertById(providers2,existing=>({...existing,url:`${base}/chat/completions`,models:`${base}/models`,api_key_vars:GATEWAY_API_KEY_ENV,response_type:"OpenAI",auth_methods:["api_key"]})),config.session={...asObject4(config.session),provider_id:PROVIDER_ID,model_id:defaultModel},`${stringify(config)}
52
+ `}},{path:join10(dirname3(configPath),".credentials.json"),label:"ForgeCode credentials",format:"json",mode:384,transform:current=>{let parsed=current?.trim()?JSON.parse(current):[];if(!Array.isArray(parsed))throw new Error("existing file is not a JSON array");return JSON.stringify(upsertById(parsed,existing=>({...existing,auth_details:{...asObject4(existing.auth_details),api_key:ctx.apiKey}})))}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`ForgeCode will use the gateway with ${defaultModel}; switch models in-session with :config-model (the picker fills from the gateway catalog).`,"Current ForgeCode reads the key from ~/.forge/.credentials.json (0600), not the environment, so the key is stored there."]}}};import{join as join11}from"node:path";var fx={id:"fx",displayName:"fx",async detect(home){return pathExists(join11(home,".fx"))},configPath(ctx){return ctx.overrides?.fx??join11(ctx.home,".fx","settings.json")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"fx settings",format:"json",transform:current=>mergeJson(current,{credential_source:"ai_gateway_api_key"})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`fx will authenticate with ${GATEWAY_API_KEY_ENV}; open a new terminal so it is loaded, then confirm with fx status.`,...ctx.tokenPass?[]:["Pick a model with /model or browse the catalog with /models \u2014 the whole gateway catalog is available."]]}}};import{dirname as dirname4,join as join12}from"node:path";var PROVIDER_ID2="vercel_ai_gateway";function contextLimits(ctx){return defaultFirst(agenticModels(ctx,{requireContextWindow:!0})).map(m=>({name:m.id,context_limit:m.context_window}))}function asObject5(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}function gooseConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join12(home,".config");return join12(base,"goose")}var goose={id:"goose",needsTopModels:!0,displayName:"Goose",needsModelCatalogue:!0,async detect(home){return pathExists(gooseConfigDir(home))},configPath(ctx){return ctx.overrides?.goose??join12(gooseConfigDir(ctx.home),"config.yaml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,configPath=this.configPath(ctx),base=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=contextLimits(ctx);return{fileChanges:[{path:configPath,label:"Goose config",format:"yaml",transform:current=>{let config=asObject5(load(current??"")??{});return config.GOOSE_PROVIDER=PROVIDER_ID2,config.GOOSE_MODEL=defaultModel,dump(config,{lineWidth:120})}},{path:join12(dirname4(configPath),"custom_providers",`${PROVIDER_ID2}.json`),label:"Goose provider",format:"json",transform:current=>mergeJson(current,{name:PROVIDER_ID2,engine:"openai",display_name:"Vercel AI Gateway",api_key_env:GATEWAY_API_KEY_ENV,base_url:`${base}/chat/completions`,...models3.length?{models:models3}:{}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Goose will use the gateway with ${defaultModel}; switch models with GOOSE_MODEL in config.yaml or \`goose configure\` (the picker fills from the gateway catalog).`,...models3.length?[`Context limits for ${models3.length} gateway models are recorded in custom_providers/${PROVIDER_ID2}.json; without them Goose sizes most models at 128k. Re-run setup to refresh.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};init_dist();import{isAbsolute as isAbsolute2,join as join13}from"node:path";import{isDeepStrictEqual}from"node:util";var PROVIDER_NAME="vercel-ai-gateway";function isTable(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function gptmeConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute2(xdg)?xdg:join13(home,".config");return join13(base,"gptme")}var gptme={id:"gptme",needsTopModels:!0,displayName:"gptme",async detect(home){return pathExists(gptmeConfigDir(home))},configPath(ctx){return ctx.overrides?.gptme??join13(gptmeConfigDir(ctx.home),"config.toml")},buildPlan(ctx){let defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,path=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path,label:"gptme config",format:"toml",transform:current=>{let doc={};if(current&&current.trim())try{doc=parse(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=Array.isArray(doc.providers)?[...doc.providers]:[],entry2={name:PROVIDER_NAME,base_url:baseUrl,api_key_env:GATEWAY_API_KEY_ENV,default_model:defaultModel},index=providers2.findIndex(value=>isTable(value)&&value.name===PROVIDER_NAME);index===-1?providers2.push(entry2):providers2[index]={...providers2[index],...entry2};let desired={...doc,providers:providers2,models:{...isTable(doc.models)?doc.models:{},default:`${PROVIDER_NAME}/${defaultModel}`}};return current&&isDeepStrictEqual(doc,desired)?current:`${stringify(desired)}
53
+ `}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`gptme will default to ${PROVIDER_NAME}/${defaultModel}; run other gateway models with -m ${PROVIDER_NAME}/<gateway-model-id>.`,`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join14}from"node:path";var MODEL_KEY="vercel-ai-gateway",DEFAULT_MODEL2="xai/grok-4.6",GROK_KEY_ENV="GROK_CODE_XAI_API_KEY";function grokDir(home){let dir=process.env.GROK_HOME;return dir&&dir.trim()?dir:join14(home,".grok")}var grok={id:"grok",displayName:"Grok Build",async detect(home){return pathExists(grokDir(home))},configPath(ctx){return ctx.overrides?.grok??join14(grokDir(ctx.home),"config.toml")},buildPlan(ctx){let path=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL);return{fileChanges:[{path,label:"Grok Build config",format:"toml",transform:current=>mergeToml(current,{endpoints:{models_base_url:baseUrl},models:{default:MODEL_KEY},model:{[MODEL_KEY]:{model:DEFAULT_MODEL2,base_url:baseUrl,name:"Grok 4.6 (Vercel AI Gateway)",env_key:GATEWAY_API_KEY_ENV,context_window:5e5}}})}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey},{name:GROK_KEY_ENV,value:ctx.apiKey}],notes:[`Grok Build will default to ${DEFAULT_MODEL2} through the gateway; Ctrl+M (or /model) lists the full catalog \u2014 open a new terminal first so ${GROK_KEY_ENV} is loaded for those models.`,"If you previously ran `grok login`, run `grok logout` so the stored xAI session does not shadow the gateway key."]}}};import{join as join15}from"node:path";var PROVIDER_KEY3="vercel-ai-gateway";function asObject6(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:{}}var hermes={id:"hermes",displayName:"Hermes",needsTopModels:!0,async detect(home){return pathExists(join15(home,".hermes"))},configPath(ctx){return ctx.overrides?.hermes??join15(ctx.home,".hermes","config.yaml")},buildPlan(ctx){let path=this.configPath(ctx),api=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,defaultModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path,label:"Hermes config",format:"yaml",transform:current=>{let config=asObject6(load(current??"")??{}),providers2=asObject6(config.providers);return providers2[PROVIDER_KEY3]={...asObject6(providers2[PROVIDER_KEY3]),api,key_env:"AI_GATEWAY_API_KEY",transport:"chat_completions",discover_models:!0},config.providers=providers2,config.model={...asObject6(config.model),provider:`custom:${PROVIDER_KEY3}`,default:defaultModel},dump(config,{lineWidth:120})}}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`Hermes will use the gateway with ${defaultModel}; switch models in-session with /model custom:${PROVIDER_KEY3}:<gateway-model-id>.`,"Open a new terminal first so AI_GATEWAY_API_KEY is loaded."]}}};import{isAbsolute as isAbsolute3,join as join16}from"node:path";var PROFILE_NAME="vercel-ai-gateway",MODEL_PROFILE_PREFIX="vercel-",PROVIDER_LABEL="Vercel AI Gateway";function junieHome(home){let env=process.env.JUNIE_HOME;return env&&isAbsolute3(env)?env:join16(home,".junie")}function profileId(modelId){return`${MODEL_PROFILE_PREFIX}${modelId.replace(/[^a-zA-Z0-9._-]+/g,"-")}`}var junie={id:"junie",displayName:"Junie CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(junieHome(home))},configPath(ctx){return ctx.overrides?.junie??join16(junieHome(ctx.home),"models",`${PROFILE_NAME}.json`)},buildPlan(ctx){let baseUrl=`${(ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL).replace(/\/+$/,"")}/chat/completions`,configPath=this.configPath(ctx),models3=shortlistModels(ctx),stableId=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,stableModel=models3.find(m=>m.id===stableId),changes=[{path:configPath,label:"Junie model profile",format:"json",transform:current=>{let isNew=!current||!current.trim();return mergeJson(current,{...isNew?{id:stableId,providerName:PROVIDER_LABEL,...stableModel?{displayName:stableModel.name,...stableModel.context_window?{maxContextLength:stableModel.context_window}:{}}:{}}:{},baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}"})}}];for(let model of models3)changes.push({path:join16(configPath,"..",`${profileId(model.id)}.json`),label:`Junie model profile (${model.id})`,format:"json",transform:current=>mergeJson(current,{id:model.id,displayName:model.name,providerName:PROVIDER_LABEL,baseUrl,apiType:"OpenAICompletion",apiKey:"${AI_GATEWAY_API_KEY}",...model.context_window?{maxContextLength:model.context_window}:{}})});return{fileChanges:changes,envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Run \`junie --model custom:${PROFILE_NAME}\` or pick the model with /model in a session; the profile defaults to ${stableId} \u2014 change its \`id\` to any gateway model.`,...models3.length?[`The top ${models3.length} gateway models are also written as their own \`custom:${MODEL_PROFILE_PREFIX}<model-id>\` profiles, grouped under ${PROVIDER_LABEL} in /model after the built-in providers \u2014 re-run setup to refresh the shortlist; profiles from earlier runs stay in place. Junie prices custom profiles at 0; it has no config hook for real rates.`]:[],`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded \u2014 Junie resolves it when the profile loads and errors if it is unset.`]}}};import{join as join17}from"node:path";function kiloConfigDir(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join17(home,".config");return join17(base,"kilo")}var kilo={id:"kilo",displayName:"Kilo Code",async detect(home){return pathExists(kiloConfigDir(home))},configPath(ctx){return ctx.overrides?.kilo??join17(kiloConfigDir(ctx.home),"kilo.json")},buildPlan(ctx){let path=this.configPath(ctx),baseURL=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL;return{fileChanges:[{path,label:"Kilo Code config",format:"json",transform:current=>mergeJson(current,{provider:{"openai-compatible":{options:{apiKey:"{env:AI_GATEWAY_API_KEY}",baseURL}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:["Kilo Code lists the gateway catalog automatically \u2014 pick a model with /models in a session (ids look like openai-compatible/anthropic/claude-fable-5).","If you keep your Kilo config in kilo.jsonc instead of kilo.json, merge the new provider block into it manually."]}}};init_dist();import{join as join18}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var PROVIDER_KEY4="vercel-ai-gateway",PREFERRED_MODEL="moonshotai/kimi-k3";function isTable2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function kimiDir(home){let dir=process.env.KIMI_SHARE_DIR;return dir&&dir.trim()?dir:join18(home,".kimi")}function shortlist(ctx){return shortlistModels(ctx,{creator:"moonshotai",requireContextWindow:!0})}function defaultModelKey(models3){return models3[0]?.id??PREFERRED_MODEL}var kimi={id:"kimi",displayName:"Kimi CLI",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(kimiDir(home))},configPath(ctx){return ctx.overrides?.kimi??join18(kimiDir(ctx.home),"config.toml")},buildPlan(ctx){let path=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=shortlist(ctx),defaultKey=defaultModelKey(models3);return{fileChanges:[{path,label:"Kimi CLI config",format:"toml",mode:384,transform:current=>{let doc={};if(current&&current.trim())try{doc=parse(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=isTable2(doc.providers)?doc.providers:{},keptModels=Object.fromEntries(Object.entries(isTable2(doc.models)?doc.models:{}).filter(([,value])=>!(isTable2(value)&&value.provider===PROVIDER_KEY4))),ours={};for(let model of models3)ours[model.id]={provider:PROVIDER_KEY4,model:model.id,max_context_size:model.context_window,display_name:model.name};models3.length||(ours[defaultKey]={provider:PROVIDER_KEY4,model:defaultKey,max_context_size:128e3});let desired={...doc,default_model:defaultKey,providers:{...providers2,[PROVIDER_KEY4]:{...isTable2(providers2[PROVIDER_KEY4])?providers2[PROVIDER_KEY4]:{},type:"openai_legacy",base_url:baseUrl,api_key:ctx.apiKey}},models:{...keptModels,...ours}};return current&&isDeepStrictEqual2(doc,desired)?current:`${stringify(desired)}
54
+ `}}],envExports:[],notes:[`Kimi CLI will use the gateway with ${defaultKey}; switch with /model.`,...models3.length?[`A shortlist of ${models3.length} gateway models is declared in config.toml; re-run setup to refresh it.`]:[],"Kimi CLI lets OPENAI_API_KEY/OPENAI_BASE_URL env vars override this provider \u2014 unset them if requests fail with auth errors."]}}};import{join as join19}from"node:path";function ompDir(home){let dir=process.env.PI_CODING_AGENT_DIR;if(dir&&dir.trim())return dir;let name=process.env.PI_CONFIG_DIR;return join19(home,name&&name.trim()?name.trim():".omp")}var omp={id:"omp",displayName:"omp",async detect(home){return pathExists(ompDir(home))},configPath(ctx){return ctx.overrides?.omp??ompDir(ctx.home)},buildPlan(ctx){return{fileChanges:[],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`omp's native Vercel AI Gateway provider reads ${GATEWAY_API_KEY_ENV} \u2014 pick a gateway model with /model or launch with --model vercel-ai-gateway/<model-id> (the picker lists the gateway catalog).`,`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded, or run: export ${GATEWAY_API_KEY_ENV}=<key>`]}}};import{join as join20}from"node:path";var PROVIDER_KEY5="vercel-ai-gateway",STARTER_MODELS=[{id:"anthropic/claude-fable-5",name:"Claude Fable 5"},{id:"anthropic/claude-opus-4.8",name:"Claude Opus 4.8"},{id:"anthropic/claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"openai/gpt-5.6-sol",name:"GPT-5.6 Sol"},{id:"google/gemini-3.6-flash",name:"Gemini 3.6 Flash"}];function entryFor(model){return{id:model.id,name:`${model.name} (Gateway)`}}function existingModels(current){if(!current?.trim())return[];try{let models3=JSON.parse(current)?.models?.providers?.[PROVIDER_KEY5]?.models;return Array.isArray(models3)?models3.filter(m=>typeof m?.id=="string"&&m.id.length>0):[]}catch{return[]}}function mergeModels(ranked,existing){let merged=[],seen=new Set;for(let model of[...ranked,...existing])seen.has(model.id)||(seen.add(model.id),merged.push(model));return merged}var openclaw={id:"openclaw",displayName:"OpenClaw",needsTopModels:!0,async detect(home){return pathExists(join20(home,".openclaw"))},configPath(ctx){return ctx.overrides?.openclaw??join20(ctx.home,".openclaw","openclaw.json")},buildPlan(ctx){let path=this.configPath(ctx),baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,ranked=(ctx.topModels??STARTER_MODELS).map(entryFor),primaryModel=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path,label:"OpenClaw config",format:"json",transform:current=>mergeJson(current,{models:{providers:{[PROVIDER_KEY5]:{baseUrl,apiKey:"${AI_GATEWAY_API_KEY}",api:"openai-completions",models:mergeModels(ranked,existingModels(current))}}},agents:{defaults:{model:{primary:`${PROVIDER_KEY5}/${primaryModel}`}}}})}],envExports:[{name:"AI_GATEWAY_API_KEY",value:ctx.apiKey}],notes:[`OpenClaw will default to ${PROVIDER_KEY5}/${primaryModel}; the model list is in openclaw.json \u2014 add any gateway model id there.`,"Restart the OpenClaw gateway process so the new provider loads."]}}};import{isAbsolute as isAbsolute4,join as join21}from"node:path";function defaultConfigPath(home){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&isAbsolute4(xdg)?xdg:join21(home,".config");return join21(base,"opencode","opencode.json")}var opencode={id:"opencode",displayName:"OpenCode",async detect(home){return pathExists(defaultConfigPath(home))},configPath(ctx){return ctx.overrides?.opencode??defaultConfigPath(ctx.home)},buildPlan(ctx){let vercel=ctx.useKeychain?{}:{options:{apiKey:ctx.apiKey}},envExports=ctx.useKeychain?[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}]:[],notes=ctx.tokenPass?[]:["OpenCode can now use the Vercel AI Gateway; pick a model like vercel/<creator>/<model>."];return ctx.useKeychain&&notes.push(`Open a new terminal so ${GATEWAY_API_KEY_ENV} is loaded (Keychain-backed).`),{fileChanges:[{path:this.configPath(ctx),label:"OpenCode config",format:"json",transform:current=>mergeJson(current,{provider:{vercel}})}],envExports,notes}}};import{join as join22}from"node:path";function persistenceDir(home){let dir=process.env.OPENHANDS_PERSISTENCE_DIR;return dir&&dir.trim()?dir:join22(home,".openhands")}function hasCondenserLlm(current){if(!current||!current.trim())return!1;try{return!!JSON.parse(current)?.condenser?.llm}catch{return!1}}function costPerToken2(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value:void 0}function modelPricing(models3,id){let model=models3?.find(m=>m.id===id),input=costPerToken2(model?.pricing?.input),output=costPerToken2(model?.pricing?.output);return input===void 0||output===void 0?{}:{input_cost_per_token:input,output_cost_per_token:output}}var openhands={id:"openhands",displayName:"OpenHands",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(persistenceDir(home))},configPath(ctx){return ctx.overrides?.openhands??join22(persistenceDir(ctx.home),"agent_settings.json")},buildPlan(ctx){let path=this.configPath(ctx),baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,pinned=ctx.topModels?.[0]?.id??GATEWAY_DEFAULT_MODEL,model=`openai/${pinned}`;return{fileChanges:[{path,label:"OpenHands agent settings",format:"json",mode:384,transform:current=>{let llm={model,api_key:ctx.apiKey,base_url:baseUrl,...modelPricing(ctx.gatewayModels,pinned)};return mergeJson(current,{llm:{...llm,usage_id:"agent"},...hasCondenserLlm(current)?{condenser:{llm}}:{}})}}],envExports:[],notes:[`OpenHands will use the gateway with ${model}; switch models in /settings with openai/<gateway-model-id>.`,"Headless runs pick this up automatically \u2014 no --override-with-envs needed."]}}};import{join as join23}from"node:path";function piAgentDir(home){let dir=process.env.PI_CODING_AGENT_DIR;return dir&&dir.trim()?dir:join23(home,".pi","agent")}var pi={id:"pi",displayName:"Pi",async detect(home){let dir=process.env.PI_CODING_AGENT_DIR;return pathExists(dir&&dir.trim()?dir:join23(home,".pi"))},configPath(ctx){return ctx.overrides?.pi??join23(piAgentDir(ctx.home),"auth.json")},buildPlan(ctx){return{fileChanges:[{path:this.configPath(ctx),label:"Pi auth",format:"json",mode:384,transform:current=>mergeJson(current,{"vercel-ai-gateway":{type:"api_key",key:ctx.apiKey}})}],envExports:[],notes:ctx.tokenPass?[]:["Pi will use the Vercel AI Gateway provider; pick a model with /model or --model."]}}};import{join as join24}from"node:path";var PREFERRED_MODEL2="alibaba/qwen3-coder-plus";function defaultModelId(models3){return models3[0]?.id??PREFERRED_MODEL2}function providerEntries(models3,baseUrl){return models3.map(m=>({id:m.id,name:m.name,baseUrl,envKey:GATEWAY_API_KEY_ENV,...m.context_window?{generationConfig:{contextWindowSize:m.context_window}}:{}}))}function isOurs2(value,writtenIds){if(typeof value!="object"||value===null)return!1;let entry2=value;return entry2.envKey===GATEWAY_API_KEY_ENV?!0:typeof entry2.id=="string"&&writtenIds.has(entry2.id)}var qwen={id:"qwen",displayName:"Qwen Code",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(join24(home,".qwen"))},configPath(ctx){return ctx.overrides?.qwen??join24(ctx.home,".qwen","settings.json")},buildPlan(ctx){let baseUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,models3=shortlistModels(ctx,{creator:"alibaba"}),defaultId=defaultModelId(models3),entries=models3.length?providerEntries(models3,baseUrl):[{id:defaultId,name:defaultId,baseUrl,envKey:GATEWAY_API_KEY_ENV}];return{fileChanges:[{path:this.configPath(ctx),label:"Qwen Code settings",format:"json",transform:current=>{let writtenIds=new Set(entries.map(e=>e.id)),kept=[];try{let existing=JSON.parse(current??"").modelProviders?.openai;Array.isArray(existing)&&(kept=existing.filter(e=>!isOurs2(e,writtenIds)))}catch{}return mergeJson(current,{modelProviders:{openai:[...kept,...entries]},security:{auth:{selectedType:"openai"}},model:{name:defaultId}})}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Qwen Code will use the gateway with ${defaultId}.`,...models3.length?[`${models3.length} shortlisted gateway models are configured \u2014 the newest Qwen models first, then the gateway's most-used. Re-run setup to refresh the list.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};init_dist();import{join as join25}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}from"node:util";var PROVIDER_KEY6="vercel-ai-gateway";function isTable3(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function vibeDir(home){let dir=process.env.VIBE_HOME;return dir&&dir.trim()?dir:join25(home,".vibe")}function shortlist2(ctx){return shortlistModels(ctx,{creator:"mistral"})}function perMillionTokens(raw){if(raw===void 0)return;let value=Number(raw);return Number.isFinite(value)?value*1e6:void 0}function modelEntry(model){let input=perMillionTokens(model.pricing?.input),output=perMillionTokens(model.pricing?.output);return{name:model.id,provider:PROVIDER_KEY6,...model.context_window?{auto_compact_threshold:model.context_window}:{},...input===void 0?{}:{input_price:input},...output===void 0?{}:{output_price:output},supports_images:(model.tags??[]).includes("vision")}}var vibe={id:"vibe",displayName:"Mistral Vibe",needsModelCatalogue:!0,needsTopModels:!0,async detect(home){return pathExists(vibeDir(home))},configPath(ctx){return ctx.overrides?.vibe??join25(vibeDir(ctx.home),"config.toml")},buildPlan(ctx){let path=this.configPath(ctx),baseUrl=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=shortlist2(ctx),activeModel=models3[0]?.id??GATEWAY_DEFAULT_MODEL;return{fileChanges:[{path,label:"Mistral Vibe config",format:"toml",transform:current=>{let doc={};if(current&&current.trim())try{doc=parse(current)}catch(err){throw new Error(`existing file is not valid TOML (${err.message})`)}let providers2=Array.isArray(doc.providers)?[...doc.providers]:[],providerEntry={name:PROVIDER_KEY6,api_base:baseUrl,api_key_env_var:GATEWAY_API_KEY_ENV,api_style:"openai",backend:"generic"},at=providers2.findIndex(v=>isTable3(v)&&v.name===PROVIDER_KEY6);at===-1?providers2.push(providerEntry):providers2[at]={...providers2[at],...providerEntry};let kept=(Array.isArray(doc.models)?doc.models:[]).filter(v=>!(isTable3(v)&&v.provider===PROVIDER_KEY6)),ours=models3.length?models3.map(modelEntry):[{name:GATEWAY_DEFAULT_MODEL,provider:PROVIDER_KEY6}],desired={...doc,providers:providers2,models:[...kept,...ours],active_model:activeModel};return current&&isDeepStrictEqual3(doc,desired)?current:`${stringify(desired)}
55
+ `}}],envExports:[{name:GATEWAY_API_KEY_ENV,value:ctx.apiKey}],notes:[`Mistral Vibe will default to ${activeModel} through the gateway; switch with /model.`,...models3.length?[`${models3.length} shortlisted gateway models are in the /model picker; it scrolls but has no type-to-filter, and Vibe's own Mistral models are listed first. Re-run setup to refresh the list.`]:[],`Open a new terminal first so ${GATEWAY_API_KEY_ENV} is loaded.`]}}};import{join as join26}from"node:path";var ZCODE_PROVIDER_KEY="c7c0f1e6-4aa2-4b7e-8f5e-2f1d9f3f7a42",ZCODE_PROVIDER_NAME="Vercel AI Gateway",ZCODE_KIND_OPENAI_COMPATIBLE="openai-compatible",VERIFIED_MODELS={[GATEWAY_DEFAULT_MODEL]:{limit:{context:1e6,output:128e3},modalities:{input:["text","image"],output:["text"]},zcode:{modalitiesConfigured:!0}},"openai/gpt-5.6-sol":{limit:{context:105e4,output:128e3},modalities:{input:["text","image"],output:["text"]},zcode:{modalitiesConfigured:!0}}};function seedModels(ctx){let ranked=shortlistModels(ctx,{requireContextWindow:!0,requireMaxTokens:!0,ensureDefault:!0});if(!ranked.length)return VERIFIED_MODELS;let models3={};for(let m of ranked)models3[m.id]=VERIFIED_MODELS[m.id]??{limit:{context:m.context_window,output:m.max_tokens}};return models3}function findExistingGatewayKey(config,targetBaseURL){let providers2=config?.provider;if(!providers2)return null;for(let[key,entry2]of Object.entries(providers2)){let baseURL=entry2?.options?.baseURL;if(entry2?.kind===ZCODE_KIND_OPENAI_COMPATIBLE&&baseURL===targetBaseURL)return key}return null}var zcode={id:"zcode",displayName:"ZCode",honorsBaseUrl:!0,needsTopModels:!0,needsModelCatalogue:!0,async detect(home){return pathExists(join26(home,".zcode"))},configPath(ctx){return ctx.overrides?.zcode??join26(ctx.home,".zcode","v2","config.json")},async warnings(){return[{code:"zcode-quit-before-setup",impact:"Quit the ZCode desktop app before continuing.",why:["ZCode keeps its provider registry in memory and rewrites its config file when it saves settings or exits, silently discarding edits made while it runs.","ZCode has no env-var lookup for custom providers, so the gateway key is stored in ~/.zcode/v2/config.json (written 0600)."],undo:'remove the "Vercel AI Gateway" provider under Settings \u2192 Model settings in ZCode',confirm:"ZCode is quit and writing the key into its config file is OK"}]},buildPlan(ctx){let baseURL=resolveGatewayBaseUrl(ctx.baseUrlOverride,GATEWAY_CODING_AGENT_BASE_URL),models3=seedModels(ctx);return{fileChanges:[{path:this.configPath(ctx),label:"ZCode providers",format:"json",mode:384,transform:current=>{let parsed=parseJsonObjectOrNull(current),existingKey=findExistingGatewayKey(parsed,baseURL);return mergeJson(current,{provider:{[existingKey??ZCODE_PROVIDER_KEY]:{...existingKey?{}:{name:ZCODE_PROVIDER_NAME},kind:ZCODE_KIND_OPENAI_COMPATIBLE,options:{apiKey:ctx.apiKey,baseURL,apiKeyRequired:!0},source:"custom",models:models3}}})}}],envExports:[],notes:[`Open ZCode and pick a model under "${ZCODE_PROVIDER_NAME}" in the chat's model picker; ${Object.keys(models3).length} gateway models are seeded and any other gateway model id can be added via Manage models \u2192 Add model.`,`Fresh install: choose "Skip for now" on ZCode's welcome screen \u2014 its API-key dropdown only takes Z.ai/BigModel accounts; the gateway provider lives in Settings \u2192 Model settings.`,"When adding gateway providers by hand, keep the API format on Chat completions: ZCode's Anthropic-messages format sends a legacy thinking parameter that current Claude models reject (zai-org/feedback#233)."]}}};init_main();import{isAbsolute as isAbsolute5,join as join27}from"node:path";var PROVIDER_ID3="vercel_ai_gateway",ZED_KEY_ENV="VERCEL_AI_GATEWAY_API_KEY";function zedConfigDir(home){if(process.platform==="win32"){let appData=process.env.APPDATA,base2=appData&&isAbsolute5(appData)?appData:join27(home,"AppData","Roaming");return join27(base2,"Zed")}let xdg=process.env.XDG_CONFIG_HOME,base=process.platform!=="darwin"&&xdg&&isAbsolute5(xdg)?xdg:join27(home,".config");return join27(base,"zed")}var zed={id:"zed",needsModelCatalogue:!0,needsTopModels:!0,displayName:"Zed",async detect(home){return pathExists(zedConfigDir(home))},configPath(ctx){return ctx.overrides?.zed??join27(zedConfigDir(ctx.home),"settings.json")},buildPlan(ctx){let apiUrl=ctx.baseUrlOverride??GATEWAY_CODING_AGENT_BASE_URL,top=(ctx.gatewayModels??[]).find(m=>m.id===ctx.topModels?.[0]?.id&&m.context_window),defaultModel=top?.id??GATEWAY_DEFAULT_MODEL,starter=top?{name:top.id,display_name:top.name,max_tokens:top.context_window,...top.max_tokens?{max_output_tokens:top.max_tokens}:{},capabilities:{tools:!0,images:(top.tags??[]).includes("vision")}}:{name:GATEWAY_DEFAULT_MODEL,display_name:"Claude Fable 5",max_tokens:1e6,max_output_tokens:128e3,capabilities:{tools:!0,images:!0}};return{fileChanges:[{path:this.configPath(ctx),label:"Zed settings",format:"json",transform:current=>{let hasModels=!!parse2(current??"")?.language_models?.[PROVIDER_ID3]?.available_models;return mergeJsonc(current,{language_models:{[PROVIDER_ID3]:{api_url:apiUrl,...hasModels?{}:{available_models:[starter]}}},agent:{default_model:{provider:PROVIDER_ID3,model:defaultModel}}})}}],envExports:[{name:ZED_KEY_ENV,value:ctx.apiKey}],notes:[`Zed's built-in Vercel AI Gateway provider now targets the coding-agent endpoint with ${defaultModel} as the Agent Panel default; the full catalog loads from /models once the key is visible.`,`Launch Zed from a new terminal (or restart it) so ${ZED_KEY_ENV} is in its environment; Settings \u2192 AI \u2192 LLM Providers also accepts the key directly.`]}}};var CODING_AGENTS=[aider,claudeCode,cline,codex,continueCli,copilot,crush,cursor,deepagents,deepseek,droid,forge,fx,goose,gptme,grok,hermes,junie,kilo,kimi,omp,openclaw,opencode,openhands,pi,qwen,vibe,zcode,zed],DEFAULT_AGENTS=CODING_AGENTS.filter(a=>!a.experimental),TOKEN_PASS_AGENTS=[fx,opencode,pi];function getAgentById(id){return CODING_AGENTS.find(a=>a.id===id)}var UNSUPPORTED_AGENTS={};var import_chalk18=__toESM(require_source(),1);import{hostname,userInfo}from"node:os";var CHILD_PROMPT=import_chalk18.default.dim("\u21B3");function defaultKeyName(tokenPass2=!1){let host="",user="";try{host=hostname()}catch{}try{user=userInfo().username}catch{}let device=host.split(".")[0].replace(/[-_]+/g," ").trim(),who=user.trim(),label=tokenPass2?"Coding Agents token-pass":"Coding Agents";return who&&device?`[${who}'s ${device}] ${label}`:device?`[${device}] ${label}`:who?`[${who}] ${label}`:label}async function promptExistingKey(client,defaultSource="create"){return await client.input.select({message:"AI Gateway API key?",choices:[{name:"Create a new key",value:"create"},{name:"Use an existing key",value:"existing"}],default:defaultSource})==="create"?void 0:(await client.input.password({message:`${CHILD_PROMPT} Paste your AI Gateway API key `,mask:!0,validate:value=>value.trim().length>0?!0:"Enter an AI Gateway API key."})).trim()}async function promptKeyName(client,tokenPass2=!1){let fallback=defaultKeyName(tokenPass2);return(await client.input.text({message:"Key name?",default:fallback})).trim()||fallback}async function promptQuota(client){if(!await client.input.confirm("Set a spend limit for this key?",!1))return{};let refreshPeriod=await client.input.select({message:`${CHILD_PROMPT} How often should the limit reset?`,choices:[{name:"Never (one-time limit)",value:"none"},{name:"Daily",value:"daily"},{name:"Weekly",value:"weekly"},{name:"Monthly",value:"monthly"}],default:"none"}),amount=await client.input.text({message:`${CHILD_PROMPT} Spend limit in USD`,default:"100",validate:value=>{let n=Number(value);return Number.isFinite(n)&&n>=1?!0:"Enter a number of dollars (minimum 1)."}});return{budget:Number(amount),refreshPeriod}}async function promptExpiry(client){if(!await client.input.confirm("Set an expiration for this key?",!1))return;let preset=await client.input.select({message:`${CHILD_PROMPT} Expires in`,choices:EXPIRY_PRESETS.map(p=>({name:p.label,value:p.value})),default:DEFAULT_EXPIRY_PRESET});return presetToExpiresAt(preset)}async function promptKeychain(client){return client.input.confirm("Store the API key in your macOS Keychain?",!0)}function hasExplicitScopeFlag(argv){return argv.slice(2).some(a=>a==="--scope"||a==="-S"||a==="--team"||a==="-T"||a.startsWith("--scope=")||a.startsWith("--team="))}async function ensureTeam2(client,opts){let{machine,canPrompt:canPrompt2,yes}=opts;if(canPrompt2&&!yes&&!hasExplicitScopeFlag(client.argv)){let org=await selectOrg(client,"Which team?",void 0,!0,void 0,opts.tokenPass?"The new Token Pass API Key will be created under this team:":"The new AI Gateway API key will be created under this team:");client.config.currentTeam=org.type==="team"?org.id:void 0;return}if(hasExplicitScopeFlag(client.argv)||await client.resolveCurrentTeam())return;let message="No team selected. Pass --scope <team-slug> or run `vercel switch` first.";return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_SCOPE,message,next:[{command:getCommandName("ai-gateway setup --scope <team-slug>")}]}),output_manager_default.error(message),1}async function createKey(client,opts){output_manager_default.spinner("Creating AI Gateway API key\u2026");try{return(await createApiKey(client,{name:opts.name,aiGatewayQuota:buildQuota({budget:opts.budget,refreshPeriod:opts.refreshPeriod,includeByok:opts.includeByok}),...opts.expiresAt!==void 0&&{expiresAt:opts.expiresAt},...opts.tokenPass&&{metadata:{tokenPass:!0}}})).apiKeyString}finally{output_manager_default.stopSpinner()}}function resolveKeyOptions(opts){return{...opts,name:opts.name??(opts.tokenPass?defaultKeyName(!0):void 0)}}async function resolveAgents(args){let{client,agentFlags,all,tokenPass:tokenPass2,canPrompt:canPrompt2,yes,home}=args,availableAgents=tokenPass2?TOKEN_PASS_AGENTS:DEFAULT_AGENTS,guidance=[],unsupported=[];if(agentFlags&&agentFlags.length>0){let selected2=[],unknown=[];for(let raw of agentFlags){let id=raw.toLowerCase(),agent=tokenPass2?availableAgents.find(a=>a.id===id):getAgentById(id);agent?selected2.includes(agent)||selected2.push(agent):!tokenPass2&&UNSUPPORTED_AGENTS[id]?(unsupported.push(id),guidance.push(`${id}: ${UNSUPPORTED_AGENTS[id]}`)):unknown.push(raw)}if(unknown.length>0){let known=availableAgents.map(a=>a.id).join(", ");return{error:`${tokenPass2?"Unsupported Token Pass":"Unknown"} agent(s): ${unknown.join(", ")}. Supported: ${known}.`,reason:AGENT_REASON.INVALID_ARGUMENTS}}return selected2.length===0?{error:"No configurable agents selected.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected:selected2,guidance,unsupported}}if(all)return{selected:availableAgents,guidance,unsupported};let detected=await Promise.all(availableAgents.map(a=>a.detect(home)));if(!canPrompt2||yes){let selected2=availableAgents.filter((_,i)=>detected[i]);return selected2.length===0?{error:"No coding agents detected on this machine. Pass --agent <name> (repeatable) or --all.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected:selected2,guidance,unsupported}}let choices=availableAgents.map((agent,i)=>({name:agent.displayName,value:agent.id,checked:detected[i]})),selected=(await client.input.checkbox({message:`Which coding agents should use the AI Gateway?
56
+ ${import_chalk19.default.dim(" Detected agents are pre-selected \xB7")}${CHECKBOX_INSTRUCTIONS}`,instructions:!1,loop:!1,pageSize:Math.max(choices.length,7),choices})).map(id=>getAgentById(id)).filter(a=>!!a);return selected.length===0?{error:"Select at least one agent to configure.",reason:AGENT_REASON.INVALID_ARGUMENTS}:{selected,guidance,unsupported}}import{join as join28}from"node:path";import{existsSync}from"node:fs";import{execFileSync}from"node:child_process";var SECURITY_BIN="/usr/bin/security",KEYCHAIN_SERVICE="Vercel AI Gateway",KEYCHAIN_ACCOUNT="vercel-ai-gateway";function isKeychainAvailable(){return process.platform==="darwin"&&existsSync(SECURITY_BIN)}function storeKeyInKeychain(key){try{return execFileSync(SECURITY_BIN,["add-generic-password","-U","-s",KEYCHAIN_SERVICE,"-a",KEYCHAIN_ACCOUNT,"-w",key],{stdio:"ignore"}),!0}catch{return!1}}function readKeyFromKeychain(){if(isKeychainAvailable())try{return execFileSync(SECURITY_BIN,["find-generic-password","-s",KEYCHAIN_SERVICE,"-a",KEYCHAIN_ACCOUNT,"-w"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}function keychainLookup(opts={}){let cmd=`${SECURITY_BIN} find-generic-password -s '${KEYCHAIN_SERVICE}' -a '${KEYCHAIN_ACCOUNT}' -w 2>/dev/null`;return opts.fish?`(${cmd})`:`$(${cmd})`}var PBCOPY_BIN="/usr/bin/pbcopy";function copyToClipboard(text){try{return execFileSync(PBCOPY_BIN,{input:text,stdio:["pipe","ignore","ignore"]}),!0}catch{return!1}}async function planSessionMigrations(agents,ctx){let migrations=[];for(let agent of agents){if(!agent.sessionMigration)continue;let migration=await agent.sessionMigration.plan(ctx);migration&&migration.itemCount>0&&migrations.push({...migration,agentId:agent.id,agent:agent.displayName})}return migrations}function detectShellRc(home,override){if(override&&override.trim())return override;let shell=process.env.SHELL??"";if(shell.includes("fish")){let xdg=process.env.XDG_CONFIG_HOME,base=xdg&&xdg.startsWith("/")?xdg:join28(home,".config");return join28(base,"fish","config.fish")}if(shell.includes("zsh")){let zdot=process.env.ZDOTDIR;return join28(zdot&&zdot.trim()?zdot:home,".zshrc")}return shell.includes("bash")?join28(home,process.platform==="darwin"?".bash_profile":".bashrc"):join28(home,".profile")}var LEGACY_MANAGED_SENTENCE="# Managed by `vercel ai-gateway coding-agents setup` \u2014 safe to remove this block.",MANAGED_SENTENCE="# Managed by `vercel ai-gateway setup` \u2014 safe to remove this block.";function normalizeManagedSentence(text){return text.split(LEGACY_MANAGED_SENTENCE).join(MANAGED_SENTENCE)}function shellQuote(value){return`'${value.split("'").join("'\\''")}'`}function fishQuote(value){return`'${value.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`}function envBlockBody(exports,useKeychain,fish){let lines=[MANAGED_SENTENCE];for(let e of exports){let fromKeychain=useKeychain&&!e.plain;fish?lines.push(fromKeychain?`set -gx ${e.name} ${keychainLookup({fish:!0})}`:`set -gx ${e.name} ${fishQuote(e.value)}`):fromKeychain?lines.push(`export ${e.name}="${keychainLookup()}"`):lines.push(`export ${e.name}=${shellQuote(e.value)}`)}return lines.join(`
57
+ `)}function preservedEnvLines(current,writtenNames){if(!current)return[];let start=current.indexOf(MANAGED_BLOCK_START),end=current.indexOf(MANAGED_BLOCK_END);if(start===-1||end===-1||end<=start)return[];let kept=[];for(let line of current.slice(start,end).split(`
58
+ `)){let match=/^(?:export|set -gx) ([A-Za-z_][A-Za-z0-9_]*)[ =]/.exec(line.trim());match&&!writtenNames.has(match[1])&&kept.push(line.trim())}return kept}function matchesWithStoredKey(current,templated){let parts=templated.split(KEY_PLACEHOLDER);if(parts.length<2)return!1;let escaped=parts.map(p=>p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=`^${escaped[0]}([^\\s"'\\\\]+)${escaped.slice(1).join("\\1")}$`;return new RegExp(pattern).test(current)}async function configsPointAtGateway(agents,ctx){let markers=[MANAGED_BLOCK_START,GATEWAY_ANTHROPIC_BASE_URL],override=ctx.baseUrlOverride?.trim();override&&markers.push(override);let paths=new Set([detectShellRc(ctx.home,ctx.shellRcOverride)]);for(let agent of agents)paths.add(agent.configPath(ctx));for(let path of paths){if(!await isFile(path))continue;let current=await readFileOrNull(path);if(current&&markers.some(m=>current.includes(m)))return!0}return!1}var MANAGED_KEY=/^(?:export|set -gx) [A-Z0-9_]+[= ]'?"?(vck_[A-Za-z0-9_-]+)/m;async function recoverStoredKey(ctx){let stored=readKeyFromKeychain();if(stored)return stored;let rc=await readFileOrNull(detectShellRc(ctx.home,ctx.shellRcOverride));if(!rc)return;let start=rc.indexOf(MANAGED_BLOCK_START),end=rc.indexOf(MANAGED_BLOCK_END);if(!(start===-1||end<=start))return rc.slice(start,end).match(MANAGED_KEY)?.[1]}async function buildSetupPlan(agents,ctx,migrations=[]){let pending=[],envExports=[],notes=[];for(let agent of agents){let plan=agent.buildPlan(ctx);for(let fc of plan.fileChanges)pending.push({...fc,owner:agent.displayName});for(let ee of plan.envExports)envExports.some(x=>x.name===ee.name)||envExports.push(ee);plan.notes.length&&notes.push({id:agent.id,displayName:agent.displayName,notes:plan.notes,actionRequired:plan.actionRequired??!1})}let shellRcPath;if(envExports.length&&process.platform==="win32"&&!ctx.shellRcOverride)notes.push({id:"environment",displayName:"Environment",actionRequired:!1,notes:[`Automatic shell setup is not supported on Windows. Set ${envExports.map(e=>e.name).join(", ")} to your API key in your environment.`]});else if(envExports.length){shellRcPath=detectShellRc(ctx.home,ctx.shellRcOverride);let body=envBlockBody(envExports,ctx.useKeychain,shellRcPath.endsWith(".fish")),writtenNames=new Set(envExports.map(e=>e.name));pending.push({path:shellRcPath,label:"Shell environment",format:"shell",owner:"Environment",transform:current=>{let preserved=preservedEnvLines(current,writtenNames);return upsertManagedBlock(current,preserved.length>0?`${body}
59
+ ${preserved.join(`
60
+ `)}`:body)}})}let byPath=new Map;for(let p of pending){let entry2=byPath.get(p.path)??{label:p.label,format:p.format,mode:p.mode,owners:[],transforms:[]};entry2.owners.includes(p.owner)||entry2.owners.push(p.owner),p.mode!==void 0&&(entry2.mode=entry2.mode===void 0?p.mode:Math.min(entry2.mode,p.mode)),entry2.transforms.push(p.transform),byPath.set(p.path,entry2)}let changes=[];for(let[path,entry2]of byPath){let current=await readFileOrNull(path),symlink=await isSymlink(path),next=null,status,error;try{let acc=current;for(let transform of entry2.transforms)acc=transform(acc);next=acc,current===null?status="create":acc===current||acc!==null&&normalizeManagedSentence(acc)===normalizeManagedSentence(current)||ctx.apiKey===KEY_PLACEHOLDER&&acc!==null&&matchesWithStoredKey(normalizeManagedSentence(current),normalizeManagedSentence(acc))?status="unchanged":status="update"}catch(err){status="error",error=err instanceof Error?err.message:String(err)}changes.push({path,label:entry2.label,format:entry2.format,mode:entry2.mode,owners:entry2.owners,current,next,status,error,symlink})}return{changes,notes,envExports,shellRcPath,migrations}}async function enforcePlanModes(plan){for(let change of plan.changes)change.status==="unchanged"&&change.mode!==void 0&&!change.symlink&&await ensureMode(change.path,change.mode)}async function applyPlan(plan,options){let results=[];await enforcePlanModes(plan);for(let change of plan.changes){if(change.status!=="create"&&change.status!=="update"||change.next===null)continue;let backupPath;options.backup&&change.current!==null&&(backupPath=await backupFile(change.path,change.mode)),await writeConfigFile(change.path,change.next,change.mode),results.push({path:change.path,label:change.label,owners:change.owners,action:change.status==="create"?"created":"updated",backupPath})}return results}async function applySessionMigrations(plan){let results=[],errors=[];for(let migration of plan.migrations)try{let result=await migration.apply(),{errors:copyErrors=[],...counts}=result;results.push({agentId:migration.agentId,agent:migration.agent,label:migration.label,...counts}),errors.push(...copyErrors.map(message=>({agentId:migration.agentId,agent:migration.agent,message})))}catch(error){errors.push({agentId:migration.agentId,agent:migration.agent,message:error instanceof Error?error.message:String(error)})}return{results,errors}}var import_chalk21=__toESM(require_source(),1);var import_chalk20=__toESM(require_source(),1);function diffLines(before,after){let a=before.length?before.split(`
61
+ `):[],b=after.length?after.split(`
62
+ `):[],m=a.length,n=b.length,lcs=Array.from({length:m+1},()=>new Array(n+1).fill(0));for(let i2=m-1;i2>=0;i2--)for(let j2=n-1;j2>=0;j2--)lcs[i2][j2]=a[i2]===b[j2]?lcs[i2+1][j2+1]+1:Math.max(lcs[i2+1][j2],lcs[i2][j2+1]);let out=[],i=0,j=0;for(;i<m&&j<n;)a[i]===b[j]?(out.push({type:" ",text:a[i]}),i++,j++):lcs[i+1][j]>=lcs[i][j+1]?(out.push({type:"-",text:a[i]}),i++):(out.push({type:"+",text:b[j]}),j++);for(;i<m;)out.push({type:"-",text:a[i++]});for(;j<n;)out.push({type:"+",text:b[j++]});return out}function maskKnownSecrets(text,secrets){let masked=text;for(let secret of secrets)secret&&(masked=masked.split(secret).join(maskSecret(secret)));return masked}function redactSecretFields(text){return text.replace(/("(?:ANTHROPIC_AUTH_TOKEN|ANTHROPIC_API_KEY|apiKey|key)"\s*:\s*)"((?:[^"\\]|\\.)+)"/g,(_match,prefix,value)=>`${prefix}"${maskSecret(value)}"`).replace(/(export\s+AI_GATEWAY_API_KEY=)(["'])(?!\$\()((?:(?!\2).)+)(\2)/g,(_match,prefix,quote,value,close)=>`${prefix}${quote}${maskSecret(value)}${close}`).replace(/(set -gx AI_GATEWAY_API_KEY )(["'])((?:(?!\2).)+)(\2)/g,(_match,prefix,quote,value,close)=>`${prefix}${quote}${maskSecret(value)}${close}`)}function mask(text,secrets){return redactSecretFields(maskKnownSecrets(text,secrets))}function renderDiff(before,after,options={}){let{secrets=[],context=2,indent:indent2=" ",color=!0}=options,dim3=color?import_chalk20.default.dim:s=>s,green=color?import_chalk20.default.green:s=>s,red=color?import_chalk20.default.red:s=>s,lines=diffLines(before,after);if(!lines.some(l=>l.type!==" "))return"";let keep=new Array(lines.length).fill(!1);lines.forEach((line,idx)=>{if(line.type!==" ")for(let k=Math.max(0,idx-context);k<=Math.min(lines.length-1,idx+context);k++)keep[k]=!0});let rendered=[],collapsed=!1;return lines.forEach((line,idx)=>{if(!keep[idx]){collapsed||(rendered.push(dim3(`${indent2} \u22EF`)),collapsed=!0);return}collapsed=!1;let text=mask(line.text,secrets);line.type==="+"?rendered.push(green(`${indent2}+ ${text}`)):line.type==="-"?rendered.push(red(`${indent2}- ${text}`)):rendered.push(dim3(`${indent2} ${text}`))}),rendered.join(`
63
+ `)}function printResolvedState(args){let{selected,willCreate,name,budget,refreshPeriod,expiresAt}=args;if(output_manager_default.print(import_chalk21.default.bold(` Summary
64
+ `)),printAlignedLabel("Agents",selected.map(a=>a.displayName).join(", ")),args.preserveKey){printAlignedLabel("API key","Existing configuration unchanged"),output_manager_default.print(`
65
+ `);return}if(!willCreate){printAlignedLabel("API key","Using provided key"),output_manager_default.print(`
66
+ `);return}printAlignedLabel("API key",name?`Creating new key "${name}"`:"Creating new key");let spendLimit="Unlimited";if(budget!==void 0){let period=refreshPeriod&&refreshPeriod!=="none"?refreshPeriod:"";spendLimit=period?`$${budget}/${period}`:`$${budget}`}printAlignedLabel("Spend limit",spendLimit),printAlignedLabel("Expires",expiresAt!==void 0?new Date(expiresAt).toISOString().slice(0,10):"Never"),args.keychain!==void 0&&printAlignedLabel("Key storage",args.keychain?"macOS Keychain":"Config files"),output_manager_default.print(`
67
+ `)}function printPlan(plan,previewKey,opts={}){output_manager_default.print(opts.backup?`${import_chalk21.default.bold(" Planned changes")} ${import_chalk21.default.dim("existing files are backed up alongside as .bak first")}
68
+ `:import_chalk21.default.bold(` Planned changes
69
+ `));for(let change of plan.changes){if(change.status==="unchanged"){output_manager_default.print(` ${import_chalk21.default.dim(`= ${change.label} (unchanged)`)} ${import_chalk21.default.dim(change.path)}
70
+ `);continue}if(change.status==="error"){output_manager_default.print(`${import_chalk21.default.yellow("!")} ${import_chalk21.default.bold(change.label)} ${import_chalk21.default.dim(change.path)}
71
+ `),output_manager_default.print(import_chalk21.default.dim(` cannot edit: ${change.error}
72
+ `));continue}let verb=change.status==="create"?"create":"update";output_manager_default.print(` ${verb==="create"?import_chalk21.default.green("+"):"~"} ${import_chalk21.default.bold(change.label)} (${verb}) ${import_chalk21.default.dim(change.path)}
73
+ `),change.symlink&&output_manager_default.print(` ${import_chalk21.default.yellow("\u21B3 warning:")} this path is a symlink; the write will follow it to its target
74
+ `),opts.backup&&change.current!==null&&output_manager_default.print(import_chalk21.default.dim(` \u21B3 backs up to ${change.path}.bak
75
+ `));let diff=renderDiff(change.current??"",change.next??"",{secrets:[previewKey],indent:" "});diff&&output_manager_default.print(`${diff}
76
+ `)}for(let migration of plan.migrations)output_manager_default.print(` ${import_chalk21.default.green("+")} ${import_chalk21.default.bold(migration.label)} (copy) ${import_chalk21.default.dim(`${migration.itemCount} ${migration.itemCount===1?"session":"sessions"}, ${formatBytes(migration.totalBytes)}`)}
77
+ `),output_manager_default.print(import_chalk21.default.dim(` \u21B3 copy only from ${migration.sourceRoots.join(", ")} to ${migration.destinationRoots.join(", ")}; originals remain unchanged
78
+ `));output_manager_default.print(`
79
+ `)}function printWarning(message){output_manager_default.print(`${import_chalk21.default.yellow("!")} ${message}
80
+ `)}function printStatus(message){output_manager_default.print(` ${message}
81
+ `)}function printReceiptPath(label,path){output_manager_default.print(` ${import_chalk21.default.bold(label.padEnd(ALIGNED_LABEL_WIDTH))}${import_chalk21.default.dim(path)}
82
+ `)}function printKeyRow(key,opts={}){printAlignedLabel(opts.created?"New API Key":"API Key",`${maskSecret(key)} \xB7 ${opts.keychain?"macOS Keychain":"Config files"}`)}function printNotes(plan){if(plan.notes.length===0)return;let sections=plan.notes.map(note=>[note.actionRequired?`${import_chalk21.default.red("!")} ${import_chalk21.default.bold(note.displayName)} ${import_chalk21.default.red("[Action Required]")}`:` ${import_chalk21.default.bold(note.displayName)}`,...formatInstructions(note.notes)].join(`
83
+ `));output_manager_default.print(`
84
+ ${import_chalk21.default.bold(" Next steps:")}
85
+
86
+ ${sections.join(`
87
+
88
+ `)}
89
+ `)}function formatInstructions(lines){let inOrderedList=!1;return lines.flatMap((line,index)=>{let trimmed=line.trimStart(),numbered=/^\d+\.\s/.test(trimmed),indented=trimmed!==line,next=lines[index+1]?.trimStart()??"";if(trimmed.endsWith(":")&&/^\d+\.\s/.test(next))return` ${line}`;if(numbered)return inOrderedList=!0,` ${line}`;if(indented)return` ${line}`;let bullet=` - ${line}`;return inOrderedList?(inOrderedList=!1,["",bullet]):bullet})}function printKey(key,opts={}){output_manager_default.print(`
90
+ `),printKeyRow(key,opts)}function buildAgentPrompt(plan,apiKey){let sections=plan.changes.filter(change=>change.status==="create"||change.status==="update").length>0?["Set up the Vercel AI Gateway for my coding agents by applying the file changes below.","For each file, create it if missing or edit it to match the diff (lines starting with `+` are added, `-` are removed; `\u22EF` marks skipped unchanged lines).",`Any masked value (e.g. ${maskSecret(apiKey)}) is my AI Gateway API key, stored in my macOS Keychain; the config and shell already reference it with \`security find-generic-password\`, so leave those lookups as-is and do not ask me to paste the key.`,""]:[];if(plan.migrations.length>0){sections.push("# Existing Codex Desktop sessions","Before editing the provider configuration, copy the sessions described below. Never move, delete, or overwrite the originals.");for(let migration of plan.migrations)sections.push("",`## ${migration.agent}: ${migration.label}`,...migration.prompt);sections.push("")}for(let change of plan.changes){if(change.status!=="create"&&change.status!=="update")continue;let diff=renderDiff(change.current??"",change.next??"",{secrets:[apiKey],indent:"",color:!1});sections.push(`# ${change.label} \u2014 ${change.path}`),diff&&sections.push(diff),sections.push("")}return`${sections.join(`
91
+ `).trimEnd()}
92
+ `}function formatBytes(bytes){return bytes<1024?`${bytes} B`:bytes<1024**2?`${(bytes/1024).toFixed(1)} KiB`:`${(bytes/1024**2).toFixed(1)} MiB`}var import_chalk22=__toESM(require_source(),1);async function collectAgentWarnings(agents,ctx){let entries=[];for(let agent of agents)for(let warning2 of await agent.warnings?.(ctx)??[])entries.push({agent,warning:warning2});return entries}function formatWarningMessage(warning2){return`${warning2.impact} ${warning2.why.join(" ")} To undo, ${warning2.undo}.`}function printAgentWarning(warning2){output_manager_default.print(`
93
+ `),printWarning(warning2.impact);for(let line of warning2.why)output_manager_default.print(import_chalk22.default.dim(` ${line}
94
+ `));output_manager_default.print(import_chalk22.default.dim(` To undo: ${warning2.undo}.
95
+ `))}function groupWarningsByAgent(entries){let grouped=new Map;for(let{agent,warning:warning2}of entries){let list7=grouped.get(agent)??[];list7.push(warning2),grouped.set(agent,list7)}return grouped}async function promptAgentConsent(client,entries){let declined=new Set;for(let[agent,warnings]of groupWarningsByAgent(entries)){for(let warning2 of warnings)printAgentWarning(warning2);let confirm=warnings.length===1?warnings[0].confirm:`Configure ${agent.displayName} anyway?`;await client.input.confirm(`${import_chalk22.default.dim("\u21B3")} ${confirm}`,!1)||declined.add(agent.id)}return declined}async function runMachine(args){let{client,selected,previewPlan,dryRun,backup,home}=args,errored=previewPlan.changes.filter(c=>c.status==="error"),skipped=errored.map(c=>({target:c.path,reason:"unparseable_config",message:c.error}));for(let id of args.unsupported)skipped.push({target:id,reason:"not_automatable",message:UNSUPPORTED_AGENTS[id]});if(skipped.push(...args.consentSkipped),dryRun)return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"dry_run",message:"Previewing AI Gateway coding-agent setup. No changes applied.",changes:previewPlan.changes.map(c=>({agent:c.owners.join(", "),file:c.path,action:c.status==="create"?"would_create":c.status==="update"?"would_update":c.status,...c.symlink?{symlink:!0}:{}})),migrations:previewPlan.migrations.map(m=>({agent:m.agentId,label:m.label,action:"would_copy",sessions:m.itemCount,bytes:m.totalBytes,sourceRoots:m.sourceRoots,destinationRoots:m.destinationRoots})),skipped,warnings:args.warnings},null,2)}
96
+ `),{exitCode:0,outcome:"dry_run"};if(args.alreadyConfigured&&!args.reconfigure){args.promptMode||await enforcePlanModes(previewPlan);let consentSkips=args.consentSkipped.length>0,message=selected.length>0?`${consentSkips?"The remaining":"All selected"} agents are already configured for the AI Gateway. Pass --reconfigure to rotate the key.`:"Every selected agent needs explicit consent (see skipped); the existing configuration already uses the AI Gateway.";if(args.useKeychain&&args.keySource){if(!storeKeyInKeychain(args.keySource.key))return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"keychain_error",message:"Failed to update the key in the macOS Keychain. Re-run with --no-keychain to write it to the config files instead.",skipped,warnings:args.warnings},null,2)}
97
+ `),{exitCode:1,outcome:"failed"};message=selected.length>0?`${consentSkips?"The remaining":"All selected"} agents are already configured; updated the macOS Keychain with the provided key.`:"The existing configuration already uses the AI Gateway; updated the macOS Keychain with the provided key."}return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"already_configured",message,configured:[],skipped,warnings:args.warnings},null,2)}
98
+ `),{exitCode:0,outcome:"already_configured"}}if(!args.keySource&&!args.reconfigure&&previewPlan.changes.every(c=>c.status==="unchanged")&&previewPlan.migrations.length>0){if(args.promptMode)return writeJson(client,{status:AGENT_STATUS.OK,reason:"agent_prompt",message:"Generated a Codex Desktop session migration prompt. No changes were applied.",prompt:buildAgentPrompt(previewPlan,""),configured:[],skipped,warnings:args.warnings}),{exitCode:0,outcome:"agent_prompt"};await enforcePlanModes(previewPlan);let migrated2=await applySessionMigrations(previewPlan);return writeJson(client,{status:migrated2.errors.length>0?AGENT_STATUS.ERROR:AGENT_STATUS.OK,reason:migrated2.errors.length>0?"session_migration_failed":"sessions_migrated",message:migrated2.errors.length>0?"One or more Codex Desktop session copies failed. Original sessions were left unchanged.":"Copied existing Codex Desktop sessions into the AI Gateway provider. Original sessions remain unchanged.",configured:[],migrated:migrated2.results,skipped:[...skipped,...migrationSkips(migrated2.errors)],warnings:args.warnings}),migrated2.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}let applicable=previewPlan.changes.filter(c=>(c.status==="create"||c.status==="update")&&c.format!=="shell");if(applicable.length===0&&errored.length>0&&(args.promptMode||previewPlan.migrations.length===0))return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"unparseable_config",message:"Couldn't write any agent configurations.",skipped,warnings:args.warnings},null,2)}
99
+ `),{exitCode:1,outcome:"failed"};let migrated=args.promptMode?{results:[],errors:[]}:await applySessionMigrations(previewPlan);if(migrated.errors.length>0)return writeJson(client,{status:AGENT_STATUS.ERROR,reason:"session_migration_failed",message:"No agent configuration was changed because one or more Codex Desktop session copies failed. Original sessions were left unchanged.",configured:[],migrated:migrated.results,skipped:[...skipped,...migrationSkips(migrated.errors)],warnings:args.warnings}),{exitCode:1,outcome:"failed"};if(applicable.length===0&&errored.length>0)return writeJson(client,{status:AGENT_STATUS.ERROR,reason:"unparseable_config",message:"Copied the eligible sessions, but couldn't write any agent configurations.",configured:[],migrated:migrated.results,skipped,warnings:args.warnings}),{exitCode:1,outcome:"failed"};let key;try{key=args.keySource?args.keySource.key:await args.createKey()}catch(err){throw isAPIError(err)&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:err.status===403?"forbidden":AGENT_REASON.API_ERROR,message:err.message,hint:`Session migrations: ${JSON.stringify(migrated.results)}`}),err}let useKeychain=args.useKeychain&&storeKeyInKeychain(key),finalPlan=await buildSetupPlan(selected,{apiKey:key,tokenPass:args.tokenPass,home,useKeychain,overrides:args.overrides,shellRcOverride:args.shellRcOverride,baseUrlOverride:args.baseUrlOverride,topModels:args.topModels,gatewayModels:args.gatewayModels},previewPlan.migrations);if(args.promptMode)return useKeychain?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"agent_prompt",message:"Created the AI Gateway key and generated an agent prompt. No files were written.",prompt:buildAgentPrompt(finalPlan,key),configured:[],skipped,warnings:args.warnings,notes:finalPlan.notes.flatMap(n=>n.notes.map(line=>`${n.displayName}: ${line}`))},null,2)}
100
+ `),{exitCode:0,outcome:"agent_prompt"}):(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"keychain_error",message:"The `--apply prompt` mode needs the key in the macOS Keychain, but storing it failed, so no prompt was produced.",skipped,warnings:args.warnings},null,2)}
101
+ `),{exitCode:1,outcome:"failed"});let results=await applyPlan(finalPlan,{backup});return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,reason:"coding_agents_configured",message:`Configured ${results.length} ${results.length===1?"file":"files"} across ${selected.length} ${selected.length===1?"agent":"agents"} to use the AI Gateway.`,apiKey:key,configured:results.map(r=>({agent:r.owners.join(", "),file:r.path,action:r.action,backup:r.backupPath})),migrated:migrated.results,skipped,warnings:args.warnings,notes:finalPlan.notes.flatMap(n=>n.notes.map(line=>`${n.displayName}: ${line}`))},null,2)}
102
+ `),{exitCode:0,outcome:"configured"}}function migrationSkips(errors){return errors.map(error=>({target:error.agentId,reason:"session_migration_failed",message:error.message}))}function writeJson(client,value){client.stdout.write(`${JSON.stringify(value,null,2)}
103
+ `)}var DEFAULT_LEADERBOARD_BASE="https://vercel.com";var LEADERBOARD_MODALITIES=["all","text","image","video"],LEADERBOARD_METRICS=["requests","tokens","spend","imageCount","videoCount"];function leaderboardBase(){return process.env.VERCEL_LEADERBOARD_URL??DEFAULT_LEADERBOARD_BASE}function buildUrl(query,format){let params=new URLSearchParams;return params.set("dataset",query.dataset),query.modality&&params.set("modality",query.modality),params.set("format",format),`${leaderboardBase()}/api/ai/leaderboard-export?${params.toString()}`}async function fetchLeaderboard(client,query,opts={}){return client.fetch(buildUrl(query,"json"),{method:"GET",teamOptional:!0,...opts})}async function fetchLeaderboardCsv(client,query){return(await client.fetch(buildUrl(query,"csv"),{method:"GET",teamOptional:!0,json:!1})).text()}function latestDate(rows){let max;for(let row of rows)(max===void 0||row.date>max)&&(max=row.date);return max}function availableDates(rows){return Array.from(new Set(rows.map(r=>r.date))).sort((a,b)=>a<b?1:a>b?-1:0)}function filterTimeseries(rows,options){let day=options.date??latestDate(rows);return rows.filter(row=>row.metric===options.metric&&row.date===day).sort((a,b)=>b.share_percent-a.share_percent)}var TOP_MODELS_LIMIT=10,TOP_MODELS_METRIC="spend",TOP_MODELS_MODALITY="text",MIN_USABLE_MODELS=3,DEFAULT_TIMEOUT_MS=2e3,OTHER_ROW_NAME="other";function normalizeName(name){return name.trim().toLowerCase()}function resolveTopModels(rows,catalog,limit=TOP_MODELS_LIMIT){let idByName=new Map;for(let model of catalog){if(!model.name||!model.id)continue;let key=normalizeName(model.name);idByName.has(key)?idByName.get(key)!==model.id&&idByName.set(key,null):idByName.set(key,model.id)}let nameById=new Map(catalog.map(model=>[model.id,model.name])),ranked=filterTimeseries(rows,{metric:TOP_MODELS_METRIC}),resolved=[],seen=new Set;for(let row of ranked){if(resolved.length>=limit)break;if(normalizeName(row.name)===OTHER_ROW_NAME)continue;let id=row.slug??idByName.get(normalizeName(row.name))??void 0;!id||seen.has(id)||(seen.add(id),resolved.push({id,name:nameById.get(id)??row.name}))}return resolved}function withTimeout(run2,ms2){let controller=new AbortController;return new Promise((resolvePromise,reject)=>{let timer=setTimeout(()=>{controller.abort(),reject(new Error(`timed out after ${ms2}ms`))},ms2);timer.unref?.(),run2(controller.signal).then(resolvePromise,reject).finally(()=>clearTimeout(timer))})}async function fetchTopModels(client,opts={}){let{limit=TOP_MODELS_LIMIT,timeoutMs=DEFAULT_TIMEOUT_MS}=opts;try{let fetchOpts={retry:{retries:0},bailOn429:!0},[leaderboard2,catalog]=await withTimeout(signal=>Promise.all([fetchLeaderboard(client,{dataset:"models",modality:TOP_MODELS_MODALITY},{signal,...fetchOpts}),listModels(client,{signal,...fetchOpts})]),timeoutMs),models3=resolveTopModels(leaderboard2.rows??[],catalog,limit);return models3.length<MIN_USABLE_MODELS?(output_manager_default.debug(`Leaderboard returned only ${models3.length} usable models; using the built-in list.`),null):models3}catch(err){return output_manager_default.debug(`Could not fetch the model leaderboard, using the built-in list: ${err.message}`),null}}var AiGatewayCodingAgentsSetupTelemetryClient=class extends TelemetryClient{trackCliOptionAgent(agents){if(agents&&agents.length)for(let agent of agents)this.trackCliOption({option:"agent",value:agent})}trackCliFlagAll(all){all&&this.trackCliFlag("all")}trackCliFlagTokenPass(tokenPass2){tokenPass2&&this.trackCliFlag("token-pass")}trackCliOptionKey(key){key&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionBudget(budget){budget!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliFlagReconfigure(reconfigure){reconfigure&&this.trackCliFlag("reconfigure")}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagNoBackup(noBackup){noBackup&&this.trackCliFlag("no-backup")}trackCliFlagNoSessionMigration(noSessionMigration){noSessionMigration&&this.trackCliFlag("no-session-migration")}trackCliFlagNoKeychain(noKeychain){noKeychain&&this.trackCliFlag("no-keychain")}trackCliOptionAgentConfig(agentConfig){agentConfig&&agentConfig.length&&this.trackCliOption({option:"agent-config",value:this.redactedValue})}trackCliOptionShellRc(shellRc){shellRc&&this.trackCliOption({option:"shell-rc",value:this.redactedValue})}trackCliOptionApply(apply){apply&&this.trackCliOption({option:"apply",value:apply})}trackCliOptionBaseUrl(baseUrl){baseUrl&&this.trackCliOption({option:"base-url",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function codingAgentsSetup(client,argv){return(await setupCodingAgents(client,argv)).exitCode}async function setupCodingAgents(client,argv){let telemetry=new AiGatewayCodingAgentsSetupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(setupSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),{exitCode:2,outcome:"failed"}}let{flags:opts}=parsedArgs,agentFlags=opts["--agent"],all=opts["--all"],providedKey=opts["--key"],tokenPass2=opts["--token-pass"];if(tokenPass2&&parsedArgs.args.length>0){let message="Token Pass setup does not accept positional arguments. Run `vercel token-pass --help` for usage.";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),output_manager_default.error(message),{exitCode:2,outcome:"failed"}}let budget=opts["--budget"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],expiration=opts["--expiration"],name=opts["--name"],reconfigure=!!(opts["--reconfigure"]||tokenPass2&&!providedKey),dryRun=opts["--dry-run"],noBackup=opts["--no-backup"],noSessionMigration=opts["--no-session-migration"],noKeychain=opts["--no-keychain"],agentConfig=opts["--agent-config"],shellRcOverride=opts["--shell-rc"],applyMode=opts["--apply"],baseUrl=opts["--base-url"],yes=opts["--yes"];telemetry.trackCliOptionAgent(agentFlags),telemetry.trackCliFlagAll(all),telemetry.trackCliOptionKey(providedKey),telemetry.trackCliFlagTokenPass(tokenPass2),telemetry.trackCliOptionBudget(budget),telemetry.trackCliOptionRefreshPeriod(refreshPeriod),telemetry.trackCliFlagIncludeByok(includeByok),telemetry.trackCliOptionExpiration(expiration),telemetry.trackCliOptionName(name),telemetry.trackCliFlagReconfigure(opts["--reconfigure"]),telemetry.trackCliFlagDryRun(dryRun),telemetry.trackCliFlagNoBackup(noBackup),telemetry.trackCliFlagNoSessionMigration(noSessionMigration),telemetry.trackCliFlagNoKeychain(noKeychain),telemetry.trackCliOptionAgentConfig(agentConfig),telemetry.trackCliOptionShellRc(shellRcOverride),telemetry.trackCliOptionApply(applyMode),telemetry.trackCliOptionBaseUrl(baseUrl),telemetry.trackCliFlagYes(yes);let machine=shouldEmitNonInteractiveCommandError(client),canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir(),wantKeychain=!noKeychain&&isKeychainAvailable();if(budget!==void 0&&(!Number.isFinite(budget)||budget<1))return failValidation(client,machine,AGENT_REASON.INVALID_BUDGET,"Budget must be a positive number in dollars (minimum 1).");if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod))return failValidation(client,machine,AGENT_REASON.INVALID_REFRESH_PERIOD,`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`);if(expiration&&!isValidExpiry(expiration))return failValidation(client,machine,AGENT_REASON.INVALID_EXPIRATION,`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`);if(applyMode!==void 0&&applyMode!=="edit"&&applyMode!=="prompt")return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --apply "${applyMode}". Must be "edit" or "prompt".`);if(baseUrl!==void 0&&!isValidBaseUrl(baseUrl))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --base-url "${baseUrl}". Must be an http(s) URL.`);let flagExpiresAt=expiration&&expiration!=="none"?presetToExpiresAt(expiration):void 0;tokenPass2&&providedKey&&printWarning("Using an existing key; make sure it was created with --token-pass or Token Pass models will not use your pass.");let overrides={};for(let pair of agentConfig??[]){let eq=pair.indexOf("="),id=eq>0?pair.slice(0,eq).trim().toLowerCase():"",path=eq>0?pair.slice(eq+1).trim():"";if(!id||!path)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Invalid --agent-config "${pair}". Use <agent>=<path>, e.g. claude-code=/path/settings.json.`);if(!getAgentById(id))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`Unknown agent "${id}" in --agent-config.`);overrides[id]=resolve2(path)}dryRun&&!machine&&printStatus(`${import_chalk23.default.bold("Dry run")}: previewing changes only. No files will be written and no API key will be created.`);let topModelsPromise=(agentFlags?.length?agentFlags.some(id=>getAgentById(id.toLowerCase())?.needsTopModels):!0)?fetchTopModels(client):Promise.resolve(null),selection=await resolveAgents({client,agentFlags,all,tokenPass:tokenPass2,canPrompt:canPrompt2,yes:!!yes,home});if("error"in selection)return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:selection.reason,message:selection.error}),output_manager_default.error(selection.error),{exitCode:tokenPass2?2:1,outcome:"failed"};let{selected,guidance,unsupported}=selection;for(let note of guidance)printWarning(note);for(let id of Object.keys(overrides))if(!selected.some(a=>a.id===id))return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,`--agent-config set for "${id}", which isn't selected. Add --agent ${id} (or --all).`);let agents=selected,gatewayModels;if(selected.some(a=>a.needsModelCatalogue))try{gatewayModels=await listModels(client)}catch(err){output_manager_default.debug(`Could not fetch the gateway model catalogue: ${err.message}`)}let agentWarnings=await collectAgentWarnings(selected,{home,overrides}),machineWarnings=agentWarnings.map(e=>({agent:e.agent.id,code:e.warning.code,message:formatWarningMessage(e.warning)})),consentSkipped=[],previewKey=providedKey??KEY_PLACEHOLDER;if(agentWarnings.length>0){let explicit=!!(agentFlags&&agentFlags.length>0||all);if(canPrompt2&&!yes&&!dryRun){let declined=await promptAgentConsent(client,agentWarnings);if(declined.size>0){agents=agents.filter(a=>!declined.has(a.id));for(let agent of selected)declined.has(agent.id)&&printStatus(`Skipped ${agent.displayName} \u2014 its configuration was left untouched.`);if(agents.length===0)return printStatus("Nothing to configure. No files were changed."),{exitCode:0,outcome:"canceled"}}}else if(explicit||canPrompt2&&!yes&&dryRun){for(let{warning:warning2}of agentWarnings)printAgentWarning(warning2);output_manager_default.print(`
104
+ `)}else{for(let[agent,warnings]of groupWarningsByAgent(agentWarnings)){let message=`${warnings.map(formatWarningMessage).join(" ")} Pass --agent ${agent.id} to configure it anyway.`;consentSkipped.push({target:agent.id,reason:AGENT_REASON.REQUIRES_CONSENT,message}),printWarning(message)}if(agents=agents.filter(a=>!consentSkipped.some(s=>s.target===a.id)),agents.length===0&&!dryRun)return failConsent(client,machine,machineWarnings,consentSkipped)}}let sessionMigrations=[];if(!noSessionMigration){try{sessionMigrations=await planSessionMigrations(agents,{home})}catch(error){return failValidation(client,machine,"session_migration_failed",`${error instanceof Error?error.message:String(error)}. No configuration was changed. Pass --no-session-migration to leave existing sessions untouched and continue.`)}if(sessionMigrations.length>0&&canPrompt2&&!yes&&!dryRun){let count2=sessionMigrations.reduce((total,migration)=>total+migration.itemCount,0),agentNames=[...new Set(sessionMigrations.map(migration=>migration.agent))].join(" and ");await client.input.confirm(count2===1?`Copy your existing ${agentNames} Desktop session so it stays visible after switching to the AI Gateway? The original will be left unchanged.`:`Copy your ${count2} existing ${agentNames} Desktop sessions so they stay visible after switching to the AI Gateway? The originals will be left unchanged.`,!0)||(sessionMigrations=[],printStatus(`Skipped ${agentNames} Desktop session migration. Your existing sessions were left unchanged.`))}}let willCreate=!providedKey,unrecoverableKey=!1,existingKey=providedKey,keyName=name,keyBudget=budget,keyRefresh=refreshPeriod,keyExpiresAt=flagExpiresAt,topModels=await topModelsPromise??void 0,preflightPlan=await buildSetupPlan(agents,{apiKey:previewKey,tokenPass:tokenPass2,home,useKeychain:wantKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations),preflightSessionOnly=!providedKey&&!reconfigure&&preflightPlan.changes.every(change=>change.status==="unchanged")&&preflightPlan.migrations.length>0;if(applyMode==="prompt"&&!wantKeychain&&!preflightSessionOnly)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");if(willCreate&&!preflightSessionOnly&&agents.length>0&&(!dryRun||canPrompt2)){let promptCreate=canPrompt2&&!yes,wired=await configsPointAtGateway(agents,{apiKey:KEY_PLACEHOLDER,home,overrides,shellRcOverride,baseUrlOverride:baseUrl});if(promptCreate&&!tokenPass2){let pasted=await promptExistingKey(client,wired?"existing":"create");pasted&&(existingKey=pasted,previewKey=pasted,willCreate=!1)}else if(wired&&!reconfigure){let stored=await recoverStoredKey({home,shellRcOverride});stored?(existingKey=stored,previewKey=stored,willCreate=!1):machine||(unrecoverableKey=!0)}if(willCreate&&!unrecoverableKey){if(await ensureTeam2(client,{machine,canPrompt:canPrompt2,yes:!!yes,tokenPass:tokenPass2}))return{exitCode:1,outcome:"failed"};if(promptCreate&&keyName===void 0&&(keyName=await promptKeyName(client,tokenPass2)),promptCreate){if(keyBudget===void 0&&keyRefresh===void 0){let quota=await promptQuota(client);keyBudget=quota.budget,keyRefresh=quota.refreshPeriod}keyExpiresAt===void 0&&!expiration&&(keyExpiresAt=await promptExpiry(client))}}}let useKeychain=wantKeychain;if(!preflightSessionOnly&&wantKeychain&&canPrompt2&&!yes&&(useKeychain=await promptKeychain(client)),canPrompt2&&!yes){let missing=agents.filter(a=>!overrides[a.id]&&!existsSync2(dirname5(a.configPath({apiKey:"",home}))));if(missing.length>0&&await client.input.confirm("Some agents weren't found at their default locations. Set custom config paths?",!1))for(let agent of missing){let resolved=agent.configPath({apiKey:"",home}),picked=(await client.input.text({message:`${agent.displayName} config path?`,default:resolved})).trim();picked&&resolve2(picked)!==resolved&&(overrides[agent.id]=resolve2(picked))}}let previewPlan=await buildSetupPlan(agents,{apiKey:previewKey,tokenPass:tokenPass2,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(baseUrl&&!machine){let target=baseUrl.trim();previewPlan.changes.some(c=>c.next?.includes(target))||previewPlan.envExports.some(e=>e.value.includes(target))||previewPlan.notes.some(n=>n.notes.some(l=>l.includes(target)))||printWarning("--base-url has no effect for the selected agents.")}let changed=previewPlan.changes.filter(c=>c.status==="create"||c.status==="update"),errored=previewPlan.changes.filter(c=>c.status==="error"),noConfigChanges=changed.length===0&&errored.length===0,alreadyConfigured=noConfigChanges&&previewPlan.migrations.length===0,sessionOnly=!existingKey&&!reconfigure&&noConfigChanges&&previewPlan.migrations.length>0,keyOptions=resolveKeyOptions({name:keyName,tokenPass:tokenPass2,budget:keyBudget,refreshPeriod:keyRefresh,includeByok,expiresAt:keyExpiresAt});if(machine)return runMachine({client,selected:agents,tokenPass:tokenPass2,unsupported,warnings:machineWarnings,consentSkipped,previewPlan,dryRun:!!dryRun,backup:!noBackup,keySource:existingKey?{key:existingKey,created:!1}:null,createKey:()=>createKey(client,keyOptions),useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,home,alreadyConfigured,gatewayModels,reconfigure:!!reconfigure&&agents.length>0,promptMode:applyMode==="prompt"});if(unrecoverableKey&&changed.length>0)return printStatus("The selected agents already use the AI Gateway and the stored key could not be read, so nothing was written. Re-run with `--key <key>` to refresh them, or `--reconfigure` to create a new key."),{exitCode:0,outcome:"skipped"};if(alreadyConfigured){let skippedSome=agents.length<selected.length;if(dryRun&&agents.length===0&&consentSkipped.length>0)return printStatus(`All selected agents need explicit consent (see the warnings above) \u2014 a real run would fail. Pass ${consentSkipped.map(s=>`--agent ${s.target}`).join(" ")} (or --all) to consent. No files would be changed.`),{exitCode:0,outcome:"dry_run"};if(!dryRun&&useKeychain&&existingKey)return applyMode!=="prompt"&&await enforcePlanModes(previewPlan),storeKeyInKeychain(existingKey)?(printStatus(agents.length===0?"The existing configuration already uses the AI Gateway; updated the macOS Keychain with the provided key.":`${skippedSome?"The remaining":"All selected"} agents are already configured; updated the macOS Keychain with the provided key.`),printKey(existingKey,{keychain:!0}),{exitCode:0,outcome:"configured"}):(output_manager_default.error("Failed to update the key in the macOS Keychain. Re-run with --no-keychain to write it to the config files instead."),{exitCode:1,outcome:"failed"});let doReconfigure=!!reconfigure&&agents.length>0;if(!doReconfigure&&agents.length>0&&canPrompt2&&!yes&&!dryRun&&(doReconfigure=await client.input.confirm("These agents are already configured for the AI Gateway. Reconfigure them?",!1)),!doReconfigure)return!dryRun&&applyMode!=="prompt"&&await enforcePlanModes(previewPlan),printStatus(agents.length===0?"Every selected agent needs explicit consent (see the warnings above); the existing configuration already uses the AI Gateway.":`${skippedSome?"The remaining":"All selected"} agents are already configured for the AI Gateway.`),existingKey&&printKey(existingKey),{exitCode:0,outcome:"already_configured"}}if(printResolvedState({selected:agents,willCreate,name:keyOptions.name,budget:keyBudget,refreshPeriod:keyRefresh,expiresAt:keyExpiresAt,keychain:wantKeychain?useKeychain:void 0,preserveKey:sessionOnly}),printPlan(previewPlan,previewKey,{backup:!noBackup}),dryRun)return printStatus(`Dry run: no files written. Re-run without ${import_chalk23.default.bold("--dry-run")} to apply.`),{exitCode:0,outcome:"dry_run"};let agentConfigChanged=changed.filter(c=>c.format!=="shell");if(agentConfigChanged.length===0&&errored.length>0&&previewPlan.migrations.length===0)return output_manager_default.error("Couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let applyAction=applyMode==="prompt"?"copy":"apply";if(applyMode===void 0&&(changed.length>0||previewPlan.migrations.length>0)&&canPrompt2&&!yes){if(useKeychain){let choice=await client.input.select({message:"Apply these changes?",choices:[{name:"Yes, write the files now",value:"apply"},{name:"Copy a prompt for my agent",value:"copy"},{name:"Cancel",value:"cancel"}],default:"apply"});if(choice==="cancel")return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"};applyAction=choice}else if(!await client.input.confirm("Apply these changes?",!0))return printStatus("Aborted. No files were changed."),{exitCode:0,outcome:"canceled"}}if(sessionOnly){if(applyAction==="copy"&&previewPlan.migrations.length>0){let promptText=buildAgentPrompt(previewPlan,KEY_PLACEHOLDER);return emitAgentPrompt(client,promptText,applyMode==="prompt","migration"),{exitCode:0,outcome:"agent_prompt"}}dryRun||await enforcePlanModes(previewPlan);let migrated2=await applySessionMigrations(previewPlan);return printSessionMigrationReceipt(migrated2,!0),migrated2.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}if(applyAction==="copy"&&!useKeychain)return failValidation(client,machine,AGENT_REASON.INVALID_ARGUMENTS,"The `--apply prompt` mode needs the macOS Keychain so the prompt never contains your plaintext key. Run on macOS without --no-keychain, or use `--apply edit`.");let migrated=applyAction==="apply"?await applySessionMigrations(previewPlan):{results:[],errors:[]};if(migrated.errors.length>0)return printSessionMigrationReceipt(migrated),output_manager_default.error("Session migration did not complete, so no agent configuration was changed. Rerun the command to retry, or pass --no-session-migration to set up without copying sessions."),{exitCode:1,outcome:"failed"};if(migrated.results.length>0&&printSessionMigrationReceipt(migrated,!0),applyAction==="apply"&&agentConfigChanged.length===0&&errored.length>0)return output_manager_default.error("Copied the eligible sessions, but couldn't write any agent configurations. Fix the files above, then re-run."),{exitCode:1,outcome:"failed"};let keySource;try{keySource=existingKey?{key:existingKey,created:!1}:{key:await createKey(client,keyOptions),created:!0}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1,outcome:"failed"};throw err}if(useKeychain&&!storeKeyInKeychain(keySource.key)){if(applyAction==="copy")return output_manager_default.error("Failed to store the key in the macOS Keychain, so a prompt would expose your plaintext key. Re-run and choose Apply, or pass --no-keychain to write the key to the config files."),{exitCode:1,outcome:"failed"};printWarning("Failed to store the key in the macOS Keychain; writing it to the config files instead."),useKeychain=!1}let applyPlanResult=await buildSetupPlan(agents,{apiKey:keySource.key,tokenPass:tokenPass2,home,useKeychain,overrides,shellRcOverride,baseUrlOverride:baseUrl,topModels,gatewayModels},sessionMigrations);if(applyAction==="copy"){let promptText=buildAgentPrompt(applyPlanResult,keySource.key);return emitAgentPrompt(client,promptText,applyMode==="prompt","setup"),printKey(keySource.key,{keychain:!0,created:keySource.created}),{exitCode:0,outcome:"agent_prompt"}}let results=await applyPlan(applyPlanResult,{backup:!noBackup});if(results.length===0&&keySource.created&&(output_manager_default.print(`
105
+ `),printAlignedLabel("Rotated","AI Gateway API key"),printKeyRow(keySource.key,{keychain:useKeychain,created:keySource.created}),output_manager_default.print(import_chalk23.default.dim(` No config files changed.
106
+ `))),results.length>0){let failed=new Set(errored.flatMap(c=>c.owners)),connected=selected.map(a=>a.displayName).filter(name2=>!failed.has(name2));output_manager_default.print(`
107
+ `),printAlignedLabel("Connected",connected.join(", "),{gutter:"\u2713"});for(let result of results)printReceiptPath(result.action==="created"?"Created":"Updated",result.path);printKeyRow(keySource.key,{keychain:useKeychain,created:keySource.created})}for(let change of errored)printWarning(`Skipped ${change.label} (${change.path}): ${change.error}. Fix or remove the file, then re-run.`);return printNotes(applyPlanResult),keySource.created&&!useKeychain&&applyPlanResult.envExports.length>0&&!applyPlanResult.shellRcPath&&client.stdout.write(`${keySource.key}
108
+ `),migrated.errors.length>0?{exitCode:1,outcome:"failed"}:{exitCode:0,outcome:"configured"}}function printSessionMigrationReceipt(migration,gutter=!1){gutter&&output_manager_default.print(`
109
+ `);for(let result of migration.results)printAlignedLabel("Sessions",`Copied ${result.copied} ${result.copied===1?"session":"sessions"} for ${result.agent}; originals unchanged`,gutter?{gutter:"\u2713"}:void 0),gutter=!1;for(let error of migration.errors)printWarning(`Could not migrate ${error.agent} sessions: ${error.message}. Original sessions were left unchanged.`)}function emitAgentPrompt(client,prompt,writeToStdout,subject){let copied=copyToClipboard(prompt);writeToStdout?(printStatus(`Generated the ${subject} prompt${copied?" (also copied to clipboard)":""}.`),client.stdout.write(`${prompt}
110
+ `)):copied?printStatus(`Prompt copied. Paste it into your coding agent for the ${subject}.`):(printStatus("Could not access the clipboard. Prompt printed below:"),client.stdout.write(`${prompt}
111
+ `))}function buildConsentCommand(argv,consentFlags){let args=stripSensitiveAuthArgs(argv.slice(2)),redacted=[];for(let i=0;i<args.length;i++){let arg=args[i];if(arg==="--key"){redacted.push(arg,"<key>"),i+1<args.length&&!args[i+1].startsWith("-")&&i++;continue}if(arg.startsWith("--key=")){redacted.push("--key=<key>");continue}redacted.push(arg)}return`${packageName} ${redacted.join(" ")} ${consentFlags}`.trim()}function failConsent(client,machine,warnings,skipped){let consentFlags=skipped.map(s=>`--agent ${s.target}`).join(" "),message=`All selected agents need explicit consent to configure. Pass ${consentFlags} (or --all) to consent, or run interactively without --yes.`;return machine?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:AGENT_REASON.REQUIRES_CONSENT,message,warnings,skipped,next:[{command:buildConsentCommand(client.argv,consentFlags)}]},null,2)}
112
+ `):output_manager_default.error(message),{exitCode:1,outcome:"failed"}}function isValidBaseUrl(value){try{let{protocol}=new URL(value);return protocol==="http:"||protocol==="https:"}catch{return!1}}function failValidation(client,machine,reason,message){return machine&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message}),output_manager_default.error(message),{exitCode:1,outcome:"failed"}}var AiGatewayCodingAgentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}};var COMMAND_CONFIG6={setup:getCommandAliases(setupSubcommand)};async function codingAgents(client){let telemetry=new AiGatewayCodingAgentsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(codingAgentsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG6),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway coding-agents",subcommand),output_manager_default.print(help(codingAgentsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:codingAgentsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"setup":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway coding-agents",subcommandOriginal),printHelp(setupSubcommand),0):(telemetry.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG6)),output_manager_default.print(help(codingAgentsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk24=__toESM(require_source(),1);var AiGatewayModelsListTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagVirtual(virtual){virtual&&this.trackCliFlag("virtual")}trackCliFlagNoVirtual(noVirtual){noVirtual&&this.trackCliFlag("no-virtual")}};async function list6(client,argv){let telemetry=new AiGatewayModelsListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsListSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs;telemetry.trackCliOptionFormat(opts["--format"]),telemetry.trackCliFlagVirtual(opts["--virtual"]),telemetry.trackCliFlagNoVirtual(opts["--no-virtual"]);let onlyVirtual=!!opts["--virtual"],hideVirtual=!!opts["--no-virtual"];if(onlyVirtual&&hideVirtual)return output_manager_default.error("Pass only one of --virtual and --no-virtual."),2;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching models",fetch:()=>fetchModels(client,{onlyVirtual,hideVirtual}),toJSON:models3=>({models:models3}),isEmpty:models3=>models3.length===0,emptyMessage:onlyVirtual?"No virtual models found.":"No models found.",header:()=>"Models",renderTable:printModelsTable}):(output_manager_default.error(formatResult.error),2)}async function fetchModels(client,filter){let fetchVirtual=(filter.hideVirtual?void 0:await client.resolveCurrentTeam({ask:filter.onlyVirtual}))&&!filter.hideVirtual?filter.onlyVirtual?listVirtualModels(client):listVirtualModels(client).catch(()=>[]):Promise.resolve([]),[catalog,virtualModels2]=await Promise.all([filter.onlyVirtual?Promise.resolve([]):listModels(client),fetchVirtual]);return[...filter.hideVirtual?catalog.filter(model=>!model.id.startsWith("vmc/")):catalog.filter(model=>!virtualModels2.some(vmc=>`vmc/${vmc.virtualModelSlug}`===model.id)),...virtualModels2.map(vmc=>({id:`vmc/${vmc.virtualModelSlug}`,object:"model",owned_by:"you",name:vmc.displayName??vmc.virtualModelSlug,type:"virtual"}))]}function printModelsTable(models3){return`${table([["id","name","owner","type"].map(header=>import_chalk24.default.gray(header)),...models3.map(model=>[model.id,model.name??import_chalk24.default.gray("\u2013"),model.owned_by??import_chalk24.default.gray("\u2013"),model.type??import_chalk24.default.gray("\u2013")])],{align:["l","l","l","l"],hsep:4}).replace(/^/gm," ")}
113
+
114
+ `}var import_chalk25=__toESM(require_source(),1);var AiGatewayModelsEndpointsTelemetryClient=class extends TelemetryClient{trackCliArgumentModel(model){model&&this.trackCliArgument({arg:"model",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function endpoints(client,argv){let telemetry=new AiGatewayModelsEndpointsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(modelsEndpointsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts,args}=parsedArgs,model=args[0];if(telemetry.trackCliArgumentModel(model),telemetry.trackCliOptionFormat(opts["--format"]),!model)return output_manager_default.error(`Specify a model. Run ${getCommandName("ai-gateway models ls")} to see available models.`),2;let formatResult=validateJsonOutput(opts);return formatResult.valid?renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:`Fetching endpoints for ${model}`,fetch:()=>listModelEndpoints(client,model),toJSON:data=>data,isEmpty:data=>(data?.endpoints??[]).length===0,emptyMessage:`No endpoints found for ${model}.`,header:data=>`Endpoints for ${data.id}`,renderTable:data=>printEndpointsTable(data.endpoints??[])}):(output_manager_default.error(formatResult.error),2)}var dash=()=>import_chalk25.default.gray("\u2013"),positive=value=>value!=null&&Number(value)>0,count=value=>value!=null&&value>0?String(value):dash();function inputPrice(p){if(positive(p?.prompt))return p?.prompt;if(positive(p?.image))return`${p?.image}/img`;let perSec=p?.video_duration_pricing?.map(v=>v.cost_per_second).filter(positive).sort((a,b)=>Number(a)-Number(b))[0];return perSec?`${perSec}/s`:positive(p?.speech_input_character_cost)?`${p?.speech_input_character_cost}/char`:positive(p?.request)?`${p?.request}/req`:dash()}function outputPrice(p){return positive(p?.completion)?p?.completion:positive(p?.image_output)?`${p?.image_output}/img`:dash()}function printEndpointsTable(list7){return`${table([["provider","context","input","output","p50 ttft","uptime"].map(header=>import_chalk25.default.gray(header)),...list7.map(e=>[e.provider_name,count(e.context_length),inputPrice(e.pricing),outputPrice(e.pricing),e.latency_last_1h?.p50!=null?`${Math.round(e.latency_last_1h.p50)}ms`:dash(),e.uptime_last_1h!=null?`${e.uptime_last_1h.toFixed(1)}%`:dash()])],{align:["l","r","r","r","r","r"],hsep:3}).replace(/^/gm," ")}
115
+
116
+ `}var AiGatewayModelsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandEndpoints(actual){this.trackCliSubcommand({subcommand:"endpoints",value:actual})}};var COMMAND_CONFIG7={list:getCommandAliases(modelsListSubcommand),endpoints:getCommandAliases(modelsEndpointsSubcommand)};async function models(client){let telemetry=new AiGatewayModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(modelsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),output_manager_default.print(help(modelsSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:modelsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsListSubcommand),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list6(client,args));case"endpoints":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway models",subcommandOriginal),printHelp(modelsEndpointsSubcommand),0):(telemetry.trackCliSubcommandEndpoints(subcommandOriginal),endpoints(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG7)),output_manager_default.print(help(modelsSubcommand,{columns:client.stderr.columns})),2}}var import_chalk26=__toESM(require_source(),1);import{writeFile}from"node:fs/promises";var dash2=()=>import_chalk26.default.gray("\u2013");function resolveFormat(client,flags){let raw=flags["--format"],out=flags["--out"];if(raw!==void 0){let format=raw.toLowerCase();return format!=="table"&&format!=="json"&&format!=="csv"?{error:`Invalid format: "${raw}". Valid formats: table, json, csv`}:format==="table"&&out!==void 0?{error:"Cannot write the table view to a file. Use --format json or --format csv with --out."}:{format}}return out!==void 0?{format:"json"}:{format:!!client.stdout.isTTY&&!client.nonInteractive?"table":"json"}}function parseEnum(value,allowed,label){if(value===void 0)return{value:void 0};let normalized=value.toLowerCase(),match=allowed.find(member=>member.toLowerCase()===normalized);return match===void 0?{error:`Invalid ${label}: "${value}". Valid values: ${allowed.join(", ")}`}:{value:match}}async function fetchWithSpinner(fetch,spinnerText){output_manager_default.spinner(spinnerText);try{let data=await fetch();return output_manager_default.stopSpinner(),{data}}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),{exitCode:1};throw err}}async function writeToFile(client,out,content,label){let writeStamp=stamp_default();try{await writeFile(out,content)}catch(err){return output_manager_default.error(`Failed to write ${out}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Wrote ${label} to ${import_chalk26.default.bold(out)} ${writeStamp()}`),0}async function runTimeseriesLeaderboard(client,flags,telemetry,config){telemetry.trackCliOptionModality(flags["--modality"]),telemetry.trackCliOptionMetric(flags["--metric"]),telemetry.trackCliOptionDate(flags["--date"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format}=formatResult,modalityResult=parseEnum(flags["--modality"],LEADERBOARD_MODALITIES,"modality");if("error"in modalityResult)return output_manager_default.error(modalityResult.error),1;let metricResult=parseEnum(flags["--metric"],LEADERBOARD_METRICS,"metric");if("error"in metricResult)return output_manager_default.error(metricResult.error),1;let modality=modalityResult.value,metric=metricResult.value;format==="table"&&canPrompt(client)&&(modality===void 0&&(modality=await client.input.select({message:"Modality",choices:LEADERBOARD_MODALITIES.map(value=>({name:value,value})),default:"all"})),metric===void 0&&(metric=await client.input.select({message:"Metric",choices:LEADERBOARD_METRICS.map(value=>({name:value,value})),default:"requests"})));let resolvedModality=modality??"all",resolvedMetric=metric??"requests";if(format==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);return"exitCode"in result2?result2.exitCode:flags["--out"]!==void 0?writeToFile(client,flags["--out"],result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset,modality:resolvedModality}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format==="json"){let content=`${JSON.stringify(data,null,2)}
117
+ `;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderTimeseriesTable(client,data,{metric:resolvedMetric,modality:resolvedModality,date:flags["--date"],entityLabel:config.entityLabel,label:config.label})}function renderTimeseriesTable(client,data,options){let rows=data.rows??[];if(options.date!==void 0&&!rows.some(r=>r.date===options.date)){let dates=availableDates(rows);return output_manager_default.error(`No data for ${options.date}.${dates.length?` Available dates: ${dates.slice(0,5).join(", ")}${dates.length>5?", \u2026":""}`:""}`),1}let filtered=filterTimeseries(rows,{metric:options.metric,date:options.date});if(filtered.length===0)return output_manager_default.log(`No ${options.label} data for ${options.metric}.`),0;let day=options.date??latestDate(rows);return output_manager_default.log(`${options.label} \xB7 ${import_chalk26.default.bold(options.metric)} \xB7 ${options.modality} \xB7 ${day}`),client.stdout.write(`${table([["#",options.entityLabel,"share"].map(header=>import_chalk26.default.gray(header)),...filtered.map((row,index)=>[String(index+1),row.name,`${row.share_percent.toFixed(2)}%`])],{align:["r","l","r"],hsep:3}).replace(/^/gm," ")}
118
+ `),printLicense(),0}async function runRankedLeaderboard(client,flags,telemetry,config){telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format}=formatResult;if(format==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset}),`Fetching ${config.label}`);return"exitCode"in result2?result2.exitCode:flags["--out"]!==void 0?writeToFile(client,flags["--out"],result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format==="json"){let content=`${JSON.stringify(data,null,2)}
119
+ `;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderRankedTable(client,data,config.label)}function renderRankedTable(client,data,label){let rows=data.rows??[];if(rows.length===0)return output_manager_default.log(`No ${label} data.`),0;let lsStamp=stamp_default(),rankedBy=rows[0]?.ranked_by;return output_manager_default.log(`${label}${rankedBy?` \xB7 ${import_chalk26.default.bold(rankedBy)}`:""} ${lsStamp()}`),client.stdout.write(`${table([["#","name","description"].map(header=>import_chalk26.default.gray(header)),...rows.map(row=>[String(row.rank),row.name,row.description?row.description:dash2()])],{align:["r","l","l"],hsep:3}).replace(/^/gm," ")}
120
+ `),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk26.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG8={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG8),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG8)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG9={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG9),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var import_chalk29=__toESM(require_source(),1);function isPublicSuffix(domainName){return domainName.endsWith(".vercel.app")||domainName.endsWith(".now.sh")}var import_tldts=__toESM(require_cjs(),1);function isRootDomain(domainName){let parsedDomain=(0,import_tldts.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;return!!(!subdomain&&rootDomain)}async function getDomainConfig(client,domainName){try{return await client.fetch(`/v6/domains/${domainName}/config`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk27=__toESM(require_source(),1);async function addDomainToProject(client,projectNameOrId,domain){output_manager_default.spinner(`Adding domain ${domain} to project ${import_chalk27.default.bold(projectNameOrId)}`);try{let aliasTarget=(await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias`,{method:"POST",body:JSON.stringify({target:"PRODUCTION",domain})})).find(aliasTarget2=>aliasTarget2.domain===domain);return aliasTarget||new Error(`Adding domain '${domain}' to project '${projectNameOrId}' did not return a matching alias in the API response. The domain may already be on another project\u2014try 'vercel domains add ${domain} ${projectNameOrId} --force' after removing it there, or run 'vercel domains inspect ${domain}'.`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}`,options)}function getProjectDomainByName(client,domainName,options={}){return fetchProjectDomain(client,`/project-domains/${encodeURIComponent(domainName)}`,options)}function verifyProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}/verify`,{...options,method:"POST"})}async function fetchProjectDomain(client,url,init){try{return await client.fetch(url,init)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk28=__toESM(require_source(),1);async function removeDomainFromProject(client,projectNameOrId,domain){output_manager_default.spinner(`Removing domain ${domain} from project ${import_chalk28.default.bold(projectNameOrId)}`);try{return await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias?domain=${encodeURIComponent(domain)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var DomainsAddTelemetryClient=class extends TelemetryClient{trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentProject(projectName){projectName&&this.trackCliArgument({arg:"project",value:this.redactedValue})}};var import_error_utils=__toESM(require_dist(),1);var VERCEL_DOMAINS_DASHBOARD="https://vercel.com/dashboard/domains";function nextCommandsForDomainsAddFailure(client,domainName,projectName,err){let next=[{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}],apiErr=err,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=err.message.toLowerCase(),status=isAPIError(err)?err.status:void 0,looksLikeOwnershipOrPurchaseIssue=code2==="not_domain_owner"||code2==="invalid_domain"||code2==="domain_not_found"||status===403&&(msg.includes("not authorized")||msg.includes("forbidden"))||msg.includes("not verified")||msg.includes("do not own")||msg.includes("not the owner"),aliasConflict=code2==="ALIAS_DOMAIN_EXIST"||status===409||msg.includes("already assigned")||msg.includes("already in use");return(looksLikeOwnershipOrPurchaseIssue||aliasConflict)&&(next.push({command:withGlobalFlags(client,`domains buy ${domainName}`),when:"to buy the domain; it returns the price and needed details, and charges nothing until a person approves the price"}),next.push({command:withGlobalFlags(client,"domains transfer-in"),when:"to transfer a domain you already own from another registrar into Vercel"}),next.push({command:openUrlInBrowserCommand(VERCEL_DOMAINS_DASHBOARD),when:"to open the Domains dashboard in your browser"})),aliasConflict&&!looksLikeOwnershipOrPurchaseIssue&&projectName&&next.push({command:withGlobalFlags(client,`domains add ${domainName} ${projectName} --force`),when:"to force move from another project (only if API returns project id\u2014otherwise remove domain from the other project first)"}),next}function nextCommandsForDomainsAddSuccess(client,domainName,projectName){return projectName?[{command:withGlobalFlags(client,`domains verify ${domainName}`),when:"to check DNS configuration and see the records you need to set"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]:[{command:withGlobalFlags(client,`domains add ${domainName} <project>`),when:"to attach this domain to a project"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]}async function printDomainConfiguration(client,domainName){if(isPublicSuffix(domainName))return output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0;let domainConfig=await getDomainConfig(client,domainName);return!(domainConfig instanceof Error)&&domainConfig.misconfigured?output_manager_default.warn(`This domain is not configured properly. Run ${getCommandName(`domains verify ${domainName}`)} to see how to configure it.`):output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0}async function add2(client,argv){let telemetry=new DomainsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags:opts}=parsedArgs,force=opts["--force"];telemetry.trackCliFlagForce(force);let contextName=await getContextName(client,{resolveLocalScope:!0});if(args.length<1||args.length>2){if(client.nonInteractive){let cmd=withGlobalFlags(client,"domains add <domain> [project]");outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`Run: ${cmd}`,next:[{command:cmd,when:"to add a domain to your team, or pass a project name to assign it to a project"}]},2)}return output_manager_default.error(`${getCommandName("domains add <domain> [project]")} expects one or two arguments.`),2}let domainName=String(args[0]),projectName=args.length===2?String(args[1]):void 0;if(telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliArgumentProject(args[1]),!projectName){if(!isPublicSuffix(domainName)&&!isRootDomain(domainName)){let cmd=withGlobalFlags(client,`domains add ${domainName} <project>`),message=`Only apex domains can be added without a project. To add the subdomain ${domainName}, pass a project: ${cmd}`;return client.nonInteractive&&outputActionRequired(client,{status:"action_required",reason:"project_required_for_subdomain",action:"add_with_project",message,next:[{command:cmd,when:"to add this subdomain to a specific project"}]},1),output_manager_default.error(message),1}let addStamp2=stamp_default(),addResult;try{addResult=await addDomain(client,domainName,contextName)}catch(err){let error=err instanceof Error?err:new Error(String(err));if(client.nonInteractive){let status=isAPIError(error)?error.status:void 0,apiErr=error,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=error.message.toLowerCase(),reason=status===403?"forbidden":status===404?"not_found":status===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils.errorToString)(error);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,"",error)},1)}return output_manager_default.prettyError(error),1}return addResult instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:(0,import_error_utils.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):addResult instanceof DomainAlreadyExists?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_already_exists",message:(0,import_error_utils.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):(client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to ${contextName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName)},0),output_manager_default.success(`Domain ${import_chalk29.default.bold(domainName)} added to ${import_chalk29.default.bold(contextName)}. ${addStamp2()}`),0)}let addStamp=stamp_default(),removedPreviousAssignment=!1,aliasTarget=await addDomainToProject(client,projectName,domainName);if(aliasTarget instanceof Error){if(aliasTarget instanceof APIError&&aliasTarget.code==="ALIAS_DOMAIN_EXIST"){let conflictProject=aliasTarget.project,alreadyOnRequestedProject=!!(conflictProject&&(conflictProject.id===projectName||conflictProject.name===projectName));if(alreadyOnRequestedProject||(alreadyOnRequestedProject=!(await getProjectDomain(client,projectName,domainName)instanceof Error)),alreadyOnRequestedProject)return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_already_assigned",message:`Domain ${domainName} is already assigned to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.log(`Domain ${import_chalk29.default.bold(domainName)} is already assigned to project ${import_chalk29.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName);if(force){let currentProjectId=conflictProject?.id;if(!currentProjectId){let currentProjectDomain=await getProjectDomainByName(client,domainName);currentProjectDomain instanceof Error||(currentProjectId=currentProjectDomain.projectId)}if(currentProjectId){let removeResponse=await removeDomainFromProject(client,currentProjectId,domainName);if(removeResponse instanceof Error)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_remove_failed",message:(0,import_error_utils.errorToString)(removeResponse)},1),output_manager_default.prettyError(removeResponse),1;removedPreviousAssignment=!0;try{aliasTarget=await addDomainToProject(client,projectName,domainName)}catch(error){aliasTarget=error instanceof Error?error:new Error((0,import_error_utils.errorToString)(error))}}}}if(aliasTarget instanceof Error){let partialReassignmentHint=removedPreviousAssignment?"Removed the previous project assignment, but could not confirm the destination assignment. Inspect the current assignment before retrying.":void 0;if(client.nonInteractive){let status=isAPIError(aliasTarget)?aliasTarget.status:void 0,apiErr=aliasTarget,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=aliasTarget.message.toLowerCase(),reason=status===403?"forbidden":status===404?"not_found":status===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils.errorToString)(aliasTarget);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,...partialReassignmentHint?{hint:partialReassignmentHint}:{},next:removedPreviousAssignment?[{command:withGlobalFlags(client,`domains inspect ${quoteArg(domainName)}`),when:"inspect the current assignment before retrying"}]:nextCommandsForDomainsAddFailure(client,domainName,projectName,aliasTarget)},1)}return output_manager_default.prettyError(aliasTarget),partialReassignmentHint&&output_manager_default.log(partialReassignmentHint),1}}return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.success(`Domain ${import_chalk29.default.bold(domainName)} added to project ${import_chalk29.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName)}var import_chalk30=__toESM(require_source(),1);async function check(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArgs,domains=args,hasMultipleInputDomains=domains.length>1,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains check <domain>`"),2;if(domains.length>50)return output_manager_default.error("Too many domains. You can check up to 50 domains per request."),1;let invalidDomains=domains.filter(domain=>!isRootDomain(domain));if(invalidDomains.length>0)return output_manager_default.error(`Invalid domain name(s): ${invalidDomains.map(domain=>param(domain)).join(", ")}. Run ${getCommandName("domains --help")}`),1;try{let results=domains.length===1?[{domain:domains[0],available:(await getDomainStatus(client,domains[0])).available}]:(await client.fetch("/v1/registrar/domains/availability",{method:"POST",body:{domains}})).results;if(formatResult.jsonOutput)return!hasMultipleInputDomains&&results.length===1?client.stdout.write(`${JSON.stringify({domain:results[0].domain,available:!!results[0].available},null,2)}
121
+ `):client.stdout.write(`${JSON.stringify({results:results.map(result=>({domain:result.domain,available:!!result.available}))},null,2)}
122
+ `),0;for(let result of results)output_manager_default.log(`The domain ${param(result.domain)} is ${import_chalk30.default.underline(result.available?"available":"unavailable")}.`);return 0}catch(error){if(isAPIError(error)){let message=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message},null,2)}
123
+ `):output_manager_default.error(message),1}return printError(error),1}}var import_chalk31=__toESM(require_source(),1);async function transferInDomain(client,name,authCode,expectedPrice,years){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"";try{let{orderId}=await client.fetch(`/v1/registrar/domains/${name}/transfer${teamParam}`,{body:{authCode,autoRenew:!0,years,expectedPrice,contactInformation:{firstName:"Vercel",lastName:"Whois",email:"domains@registrar.vercel.com",phone:"+14153985463",address1:"100 First Street, Suite 2400",city:"San Fransisco",state:"CA",zip:"94105",country:"US",companyName:"Vercel Inc."}},method:"POST"}),order=await pollForOrder(client,orderId);return order===null?new UnexpectedDomainTransferError(name):order.status==="completed"&&order.domains.find(domain2=>domain2.domainName===name)?.status==="completed"?{ok:!0}:order.error?.code==="payment-failed"?new DomainPaymentError:new UnexpectedDomainTransferError(name)}catch(err){if(isAPIError(err)){if(err.code==="invalid_name")return new InvalidDomain(name);if(err.code==="tld_not_supported")return new UnsupportedTLD(name);if(err.code==="domain_not_available")return new DomainNotAvailable(name)}throw err}}async function getAuthCode(client,code2){return isValidAuthCode(code2)?code2:client.input.text({message:"- Transfer auth code: ",validate:isValidAuthCode})}function isValidAuthCode(code2){return!!(code2&&code2.length>0)}var DomainsTransferInTelemetryClient=class extends TelemetryClient{trackCliOptionCode(code2){code2&&this.trackCliOption({option:"code",value:this.redactedValue})}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}};async function transferIn(client,argv){let telemetry=new DomainsTransferInTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(transferInSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry.trackCliOptionCode(opts["--code"]);let[domainName]=args;if(!domainName)return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),2;if(telemetry.trackCliArgumentDomain(domainName),!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name ${param(domainName)}. Run ${getCommandName("domains --help")}`),1;let availableStamp=stamp_default(),domainPrice=await getDomainPrice(client,domainName);if(domainPrice instanceof Error)return output_manager_default.prettyError(domainPrice),1;let{transferPrice,years}=domainPrice;if(transferPrice===null)return output_manager_default.error(`The domain ${param(domainName)} is not transferable.`),1;let contextName=await getContextName(client);output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk31.default.underline("available")} to transfer under ${import_chalk31.default.bold(contextName)}! ${availableStamp()}`);let authCode=await getAuthCode(client,opts["--code"]);if(!await client.input.confirm(`Transfer now with 1yr renewal for ${import_chalk31.default.bold(`$${transferPrice}`)}?`,!1))return 0;let transferStamp=stamp_default();output_manager_default.spinner(`Initiating transfer for domain ${domainName}`);let transferInResult=await transferInDomain(client,domainName,authCode,transferPrice,years);return transferInResult instanceof InvalidDomain?(output_manager_default.error(`The domain ${transferInResult.meta.domain} is not valid.`),1):transferInResult instanceof DomainNotAvailable?(output_manager_default.error(`The domain "${transferInResult.meta.domain}" is not transferable.`),1):transferInResult instanceof UnsupportedTLD?(output_manager_default.error(`The TLD for domain name ${transferInResult.meta.domain} is not supported.`),1):transferInResult instanceof DomainPaymentError?(output_manager_default.error("Your card was declined."),1):transferInResult instanceof UnexpectedDomainTransferError?(output_manager_default.error("An unexpected error happened while initiating the transfer."),1):(output_manager_default.success(`Domain ${param(domainName)} transfer started ${transferStamp()}`),output_manager_default.print(` To finalize the transfer, we are waiting for approval from your current registrar.
124
+ `),output_manager_default.print(` You will receive an email upon completion.
125
+ `),output_manager_default.warn(`Once transferred, your domain ${param(domainName)} will be using Vercel DNS.
126
+ `),output_manager_default.print(` To transfer with previous DNS records, export the zone file from your previous registrar.
127
+ `),output_manager_default.print(` Then import it to Vercel DNS by using:
128
+ `),output_manager_default.print(` ${getCommandName(`dns import ${domainName} <zonefile>`)}
129
+
130
+ `),0)}var import_chalk33=__toESM(require_source(),1);var import_chalk32=__toESM(require_source(),1);function formatNSTable(intendedNameservers,currentNameservers,{extraSpace=""}={}){let sortedIntended=intendedNameservers.sort(),sortedCurrent=currentNameservers.sort(),maxLength=Math.max(intendedNameservers.length,currentNameservers.length),rows=[];for(let i=0;i<maxLength;i++)rows.push([sortedIntended[i]||import_chalk32.default.gray("-"),sortedCurrent[i]||import_chalk32.default.gray("-"),sortedIntended[i]===sortedCurrent[i]?import_chalk32.default.green(chars_default.tick):import_chalk32.default.red(chars_default.cross)]);return table([[import_chalk32.default.gray("Intended Nameservers"),import_chalk32.default.gray("Current Nameservers"),""],...rows],{hsep:4}).replace(/^(.*)/gm,`${extraSpace}$1`)}var PROJECT_FETCH_BATCH_SIZE=10;async function getDomainAssignmentsByProject(client,domainName){let domainsByProjectId=new Map;for await(let chunk2 of client.fetchPaginated(`/v1/domains/${encodeURIComponent(domainName)}/project-domains`))for(let projectDomain of chunk2.projectDomains){let domains=domainsByProjectId.get(projectDomain.projectId)??[];domains.push(projectDomain.name),domainsByProjectId.set(projectDomain.projectId,domains)}return domainsByProjectId}async function countProjectsForDomain(client,domainName){try{return(await getDomainAssignmentsByProject(client,domainName)).size}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function findProjectsForDomain(client,domainName){try{let assignments=Array.from(await getDomainAssignmentsByProject(client,domainName)),result=[];for(let i=0;i<assignments.length;i+=PROJECT_FETCH_BATCH_SIZE){let batch=await Promise.all(assignments.slice(i,i+PROJECT_FETCH_BATCH_SIZE).map(async([projectId,domains])=>{try{return{project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`),domains}}catch(err){if(isAPIError(err)&&err.status<500)return null;throw err}}));for(let entry2 of batch)entry2&&result.push(entry2)}return result}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getDomainRegistrar(domain){return domain.boughtAt?"Vercel":typeof domain.orderedAt=="number"&&!domain.boughtAt?"Purchase in Process":"Third Party"}var DomainsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect4(client,argv){let telemetry=new DomainsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs,[domainName]=args;telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,inspectStamp=stamp_default();if(!domainName)return output_manager_default.error(`${getCommandName("domains inspect <domain>")} expects one argument`),2;if(telemetry.trackCliArgumentDomain(domainName),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("domains inspect <domain>")}`)}`),2;output_manager_default.debug("Fetching domain info");let contextName=await getContextName(client);output_manager_default.spinner(`Fetching Domain ${domainName} under ${import_chalk33.default.bold(contextName)}`);let information=await fetchInformation({client,contextName,domainName});if(typeof information=="number")return information;let{domain,projects,renewalPrice,domainConfig}=information;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({domain:{name:domain.name,registrar:getDomainRegistrar(domain),expiresAt:domain.expiresAt,creator:domain.creator.username,createdAt:domain.createdAt,edgeNetwork:!0,renewalPrice:domain.boughtAt&&renewalPrice?renewalPrice:null},nameservers:{intended:domain.intendedNameservers,current:domain.nameservers},projects:projects.map(({project,domains})=>({name:project.name,domains})),configuration:{misconfigured:domainConfig.misconfigured??null}},null,2)}
131
+ `),0;if(output_manager_default.log(`Domain ${domainName} found under ${import_chalk33.default.bold(contextName)} ${import_chalk33.default.gray(inspectStamp())}`),output_manager_default.print(`
132
+ `),output_manager_default.print(import_chalk33.default.bold(` General
133
+
134
+ `)),output_manager_default.print(` ${import_chalk33.default.cyan("Name")} ${domain.name}
135
+ `),output_manager_default.print(` ${import_chalk33.default.cyan("Registrar")} ${getDomainRegistrar(domain)}
136
+ `),output_manager_default.print(` ${import_chalk33.default.cyan("Expiration Date")} ${formatDate(domain.expiresAt)}
137
+ `),output_manager_default.print(` ${import_chalk33.default.cyan("Creator")} ${domain.creator.username}
138
+ `),output_manager_default.print(` ${import_chalk33.default.cyan("Created At")} ${formatDate(domain.createdAt)}
139
+ `),output_manager_default.print(` ${import_chalk33.default.cyan("Edge Network")} yes
140
+ `),output_manager_default.print(` ${import_chalk33.default.cyan("Renewal Price")} ${domain.boughtAt&&renewalPrice?`$${renewalPrice} USD`:import_chalk33.default.gray("-")}
141
+ `),output_manager_default.print(`
142
+ `),output_manager_default.print(import_chalk33.default.bold(` Nameservers
143
+
144
+ `)),output_manager_default.print(`${formatNSTable(domain.intendedNameservers,domain.nameservers,{extraSpace:" "})}
145
+ `),output_manager_default.print(`
146
+ `),Array.isArray(projects)&&projects.length>0){output_manager_default.print(import_chalk33.default.bold(` Projects
147
+ `));let table2=formatTable(["Project","Domains"],["l","l"],[{rows:projects.map(({project,domains})=>{let cols=domains.length?domains.join(", "):"-";return[project.name,cols]})}]);output_manager_default.print(table2.split(`
148
+ `).map(line=>` ${line}`).join(`
149
+ `)),output_manager_default.print(`
150
+ `)}if(domainConfig.misconfigured){let contextNameConst=contextName,projectNames=Array.from(new Set(projects.map(({project})=>project.name))),recordsSource=projectNames.length?"Check the project's Domains settings for the required DNS records":"Assign it to a project to see the required DNS records";output_manager_default.warn(`This domain is not configured properly. ${recordsSource}, or run ${getCommandName("domains verify --help")} for CLI verification options.`,null,null,null),projectNames.length?projectNames.forEach((name,index)=>{let prefix=index===0?" Read more:":" ".repeat(12);output_manager_default.print(`${prefix} https://vercel.com/${contextNameConst}/${name}/settings/domains
151
+ `)}):output_manager_default.print(` Read more: https://vercel.link/domain-configuration
152
+ `),output_manager_default.print(`
153
+ `)}return null}async function fetchInformation({client,contextName,domainName}){let[domain,renewalPrice]=await Promise.all([getDomainByName(client,contextName,domainName,{ignoreWait:!0}),getDomainPrice(client,domainName).then(res=>res instanceof Error?null:res.renewalPrice).catch(()=>null)]);if(domain instanceof DomainNotFound)return output_manager_default.prettyError(domain),1;if(domain instanceof DomainPermissionDenied)return output_manager_default.prettyError(domain),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let projects=await findProjectsForDomain(client,domainName);if(projects instanceof Error)return output_manager_default.prettyError(projects),1;let domainConfig=await getDomainConfig(client,domainName);return{domain,projects,renewalPrice,domainConfig}}var import_ms=__toESM(require_ms(),1),import_chalk34=__toESM(require_source(),1),import_pluralize=__toESM(require_pluralize(),1);var DomainsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let telemetry=new DomainsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"domains ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry.trackCliOptionLimit(opts["--limit"]),telemetry.trackCliOptionNext(opts["--next"]),telemetry.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),err instanceof InvalidNextError?2:1}let contextName=await getContextName(client,{resolveLocalScope:!0}),lsStamp=stamp_default();output_manager_default.spinner(`Fetching Domains under ${import_chalk34.default.bold(contextName)}`);let{domains,pagination}=await getDomains(client,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={domains:domains.map(domain=>({name:domain.name,registrar:getDomainRegistrar(domain),nameservers:isDomainExternal(domain)?"external":"vercel",expiresAt:domain.expiresAt,createdAt:domain.createdAt,creator:domain.creator.username})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
154
+ `)}else if(output_manager_default.log(`${(0,import_pluralize.default)("Domain",domains.length,!0)} found under ${import_chalk34.default.bold(contextName)} ${import_chalk34.default.gray(lsStamp())}`),domains.length>0&&(output_manager_default.print(formatDomainsTable(domains).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
155
+
156
+ `)),pagination?.next){let flags=getCommandFlags(opts,["_","--next","--format"]);printNextPageCommand(getCommandNamePlain(`domains ls${flags} --next ${pagination.next}`))}return 0}function formatDomainsTable(domains){let current=Date.now(),rows=domains.map(domain=>{let expiration=formatDateWithoutTime(domain.expiresAt),age=domain.createdAt?(0,import_ms.default)(current-domain.createdAt):"-";return[domain.name,getDomainRegistrar(domain),isDomainExternal(domain)?"Third Party":"Vercel",expiration,domain.creator.username,import_chalk34.default.gray(age)]});return formatTable(["Domain","Registrar","Nameservers","Expiration Date","Creator","Age"],["l","l","l","l","l","l"],[{rows}])}var import_chalk35=__toESM(require_source(),1),import_pluralize2=__toESM(require_pluralize(),1);async function removeDomainByName(now,contextName,domain){try{return await now.fetch(`/v3/domains/${encodeURIComponent(domain)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)){if(err.code==="not_found")return new DomainNotFound(domain);if(err.code==="forbidden")return new DomainPermissionDenied(domain,contextName);if(err.code==="domain_removal_conflict")return new DomainRemovalConflict({aliases:err.aliases,certs:err.certs,message:err.message,pendingAsyncPurchase:err.pendingAsyncPurchase,resolvable:err.resolvable,suffix:err.suffix,transferring:err.transferring})}throw err}}async function setCustomSuffix(client,contextName,domain,suffix){try{return await client.fetch("/v1/custom-suffix",{method:"PATCH",body:{suffix}})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(domain,contextName);if(err.code==="domain_external")return new DomainExternal(domain);if(err.code==="domain_invalid")return new InvalidDomain(domain);if(err.code==="domain_not_found")return new DomainNotFound(domain);if(err.code==="domain_not_verified")return new DomainNotVerified(domain);if(err.code==="domain_permission_denied")return new DomainPermissionDenied(domain,contextName)}throw err}}var DomainsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(v){v&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};async function rm(client,argv){let telemetry=new DomainsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[domainName]=args;if(telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliFlagYes(opts["--yes"]),!domainName)return output_manager_default.error(`${getCommandName("domains remove <domain>")} expects one argument`),2;let contextName=await getContextName(client);if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk35.default.cyan(`${getCommandName("domains remove <domain>")}`)}`),2;let domain=await getDomainByName(client,contextName,domainName);if(domain instanceof DomainNotFound||domain.name!==domainName)return output_manager_default.error(`Domain not found by "${domainName}" under ${import_chalk35.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(domain instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have access to the domain ${domainName} under ${import_chalk35.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let projectCount=await countProjectsForDomain(client,domain.name);typeof projectCount=="number"&&projectCount>0&&output_manager_default.warn(`The domain is currently used by ${(0,import_pluralize2.default)("project",projectCount,!0)}.`);let skipConfirmation=opts["--yes"]||!1;return!skipConfirmation&&!await client.input.confirm(`Are you sure you want to remove ${param(domainName)}?`,!1)?(output_manager_default.log("Canceled"),0):removeDomain(client,contextName,skipConfirmation,domain)}async function removeDomain(client,contextName,skipConfirmation,domain,aliasIds=[],certIds=[],suffix=!1,attempt=1){let removeStamp=stamp_default();output_manager_default.debug("Removing domain");for(let id of aliasIds){output_manager_default.debug(`Removing alias ${id}`);try{await removeAliasById(client,id)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}for(let id of certIds){output_manager_default.debug(`Removing cert ${id}`);try{await deleteCertById(client,id)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}suffix&&(output_manager_default.debug("Removing custom suffix"),await setCustomSuffix(client,contextName,domain.name,null));let removeResult=await removeDomainByName(client,contextName,domain.name);if(removeResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk35.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(removeResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk35.default.underline(removeResult.meta.domain)} under ${import_chalk35.default.bold(removeResult.meta.context)}.`),1;if(removeResult instanceof DomainRemovalConflict){if(attempt>=2)return output_manager_default.error(removeResult.message),1;let{aliases,certs,suffix:suffix2,transferring,pendingAsyncPurchase,resolvable}=removeResult.meta;return transferring?(output_manager_default.error(`${param(domain.name)} transfer should be declined or approved before removing.`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain.name)} because it is still in the process of being purchased.`),1):resolvable?(output_manager_default.log(`We found conflicts when attempting to remove ${param(domain.name)}.`),aliases.length>0&&output_manager_default.warn(`This domain's ${import_chalk35.default.bold((0,import_pluralize2.default)("alias",aliases.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),certs.length>0&&output_manager_default.warn(`This domain's ${import_chalk35.default.bold((0,import_pluralize2.default)("certificate",certs.length,!0))} will be removed. Run ${getCommandName("cert ls")} to list them.`),suffix2&&output_manager_default.warn(`The ${import_chalk35.default.bold("custom suffix")} associated with this domain.`),!skipConfirmation&&!await client.input.confirm("Remove conflicts associated with domain?",!1)?(output_manager_default.log("Canceled"),0):removeDomain(client,contextName,skipConfirmation,domain,aliases,certs,suffix2,attempt+1)):(output_manager_default.error(removeResult.message),1)}return output_manager_default.success(`Domain ${import_chalk35.default.bold(domain.name)} removed ${removeStamp()}`),0}var import_chalk36=__toESM(require_source(),1),import_pluralize3=__toESM(require_pluralize(),1);async function moveOutDomain(client,contextName,name,destination){try{return await client.fetch(`/v4/domains/${encodeURIComponent(name)}`,{body:{op:"move-out",destination},method:"PATCH"})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(name,contextName);if(err.code==="not_found")return new DomainNotFound(name);if(err.code==="invalid_move_destination")return new InvalidMoveDestination(destination);if(err.code==="domain_move_conflict"){let{pendingAsyncPurchase,resolvable,suffix,message}=err;return new DomainMoveConflict({message,pendingAsyncPurchase,resolvable,suffix})}}throw err}}async function getDomainAliases(client,domain){let{aliases}=await getAliases(client);return aliases.filter(alias=>alias.alias.endsWith(domain))}var DomainsMoveTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentDestination(destination){destination&&this.trackCliArgument({arg:"destination",value:this.redactedValue})}};async function move(client,argv){let telemetry=new DomainsMoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(moveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry.trackCliFlagYes(opts["--yes"]),telemetry.trackCliArgumentDomain(args[0]),telemetry.trackCliArgumentDestination(args[1]);let{contextName,user}=await getScope(client),{domainName,destination}=await getArgs(client,args);if(!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let domain=await getDomainByName(client,contextName,domainName);if(domain instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk36.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(domain instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk36.default.underline(domain.meta.domain)} under ${import_chalk36.default.bold(domain.meta.context)}.`),1;let teams=await getTeams(client),matchId=await findDestinationMatch(destination,user,teams);if(matchId&&user&&matchId===user.id&&user.version==="northstar")return output_manager_default.error("You may not move your domain to your user account."),1;if(!matchId&&!opts["--yes"]&&(output_manager_default.warn(`You're not a member of ${param(destination)}. ${param(destination)} will have 24 hours to accept your move request before it expires.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)} to ${param(destination)}?`,!1)))return output_manager_default.log("Canceled"),0;if(!opts["--yes"]){let aliases=await getDomainAliases(client,domainName);if(aliases.length>0&&(output_manager_default.warn(`This domain's ${import_chalk36.default.bold((0,import_pluralize3.default)("alias",aliases.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)}?`,!1)))return output_manager_default.log("Canceled"),0}let context=contextName;output_manager_default.spinner("Moving");let moveTokenResult=await moveOutDomain(client,context,domainName,matchId||destination);if(moveTokenResult instanceof DomainMoveConflict){let{suffix,pendingAsyncPurchase}=moveTokenResult.meta;return suffix?(output_manager_default.error(`Please remove custom suffix for ${param(domainName)} before moving out`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain.name)} because it is still in the process of being purchased.`),1):(output_manager_default.error(moveTokenResult.message),1)}if(moveTokenResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk36.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(moveTokenResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk36.default.underline(moveTokenResult.meta.domain)} under ${import_chalk36.default.bold(moveTokenResult.meta.context)}.`),1;if(moveTokenResult instanceof InvalidMoveDestination)return output_manager_default.error(`Destination ${import_chalk36.default.bold(destination)} is invalid. Please supply a valid username, email, team slug, user id, or team id.`),1;let{moved}=moveTokenResult;return moved?output_manager_default.success(`${param(domainName)} was moved to ${param(destination)}.`):output_manager_default.success(`Sent ${param(destination)} an email to approve the ${param(domainName)} move request.`),0}async function getArgs(client,args){let[domainName,destination]=args;return domainName||(domainName=await client.input.text({message:"- Domain name: ",validate:isRootDomain})),destination||(destination=await client.input.text({message:"- Destination: ",validate:v=>!!(v&&v.length>0)})),{domainName,destination}}async function findDestinationMatch(destination,user,teams){if(user&&(user.id===destination||user.username===destination))return user.id;for(let team of teams)if(team.id===destination||team.slug===destination)return team.id;return null}var import_chalk37=__toESM(require_source(),1);async function price(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(priceSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let domains=parsedArgs.args,hasMultipleInputDomains=domains.length>1,formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains price <domain>`"),2;try{let quotes=domains.length===1?await getSingleDomainQuote(client,domains[0]):await getBulkDomainQuotes(client,domains);if(formatResult.jsonOutput)return!hasMultipleInputDomains&&quotes.length===1?client.stdout.write(`${JSON.stringify(quotes[0],null,2)}
157
+ `):client.stdout.write(`${JSON.stringify({results:quotes},null,2)}
158
+ `),0;for(let i=0;i<quotes.length;i++){let quote=quotes[i];output_manager_default.log(`${import_chalk37.default.bold("Registrar pricing")} for ${import_chalk37.default.cyan(quote.domain)}`),output_manager_default.log(` Purchase: ${quote.purchasePrice!=null?`$${quote.purchasePrice}`:"n/a"}`),output_manager_default.log(` Renewal: ${quote.renewalPrice!=null?`$${quote.renewalPrice}`:"n/a"}`),output_manager_default.log(` Transfer: ${quote.transferPrice!=null?`$${quote.transferPrice}`:"n/a"}`),output_manager_default.log(` Term: ${quote.years} year(s)`),i<quotes.length-1&&output_manager_default.log("")}return 0}catch(error){if(isAPIError(error)){let msg=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message:msg},null,2)}
159
+ `):output_manager_default.error(msg),1}return printError(error),1}}async function getSingleDomainQuote(client,domain){let result=await getDomainPrice(client,domain);if(result instanceof UnsupportedTLD)throw createApiLikeError("unsupported_tld",`TLD not supported for price lookup: ${result.meta.domain}`);if(result instanceof InvalidDomain)throw createApiLikeError("invalid_domain",`Invalid domain: ${result.meta.domain}`);if(isAPIError(result))throw result;return[{domain,purchasePrice:result.purchasePrice,renewalPrice:result.renewalPrice,transferPrice:result.transferPrice,years:result.years}]}async function getBulkDomainQuotes(client,domains){let response=await client.fetch("/v1/registrar/domains/price",{method:"POST",body:{domains}});return Array.isArray(response)?response:response.results}function createApiLikeError(code2,serverMessage){let error=new Error(serverMessage);return error.code=code2,error.status=400,error.serverMessage=serverMessage,error}import{URLSearchParams as URLSearchParams2}from"url";var DEFAULT_LIMIT=20,MAX_LIMIT=200,DEFAULT_ORDER="relevance",ORDERS=["relevance","alphabetical","length"],SUPPORTED_TLDS_CACHE_FILE="cache/domains-search-supported-tlds.json",SUPPORTED_TLDS_CACHE_TTL_MS=30*60*1e3,supportedTldsSchema=external_exports.array(external_exports.string()),supportedTldsCacheSchema=external_exports.object({entries:external_exports.record(external_exports.string(),external_exports.object({fetchedAt:external_exports.number(),tlds:supportedTldsSchema}))}),domainSearchResultSchema=external_exports.discriminatedUnion("available",[external_exports.object({domain:external_exports.string(),available:external_exports.literal(!1)}),external_exports.object({domain:external_exports.string(),available:external_exports.literal(!0),years:external_exports.number(),price:external_exports.number(),renewalPrice:external_exports.number(),premium:external_exports.boolean()})]),domainsSearchResponseSchema=external_exports.object({results:external_exports.array(domainSearchResultSchema)});async function search(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(searchSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let queryResult=normalizeQuery(parsedArgs.args);if(!queryResult.valid)return output_manager_default.error(queryResult.error),2;let orderResult=getOrder(parsedArgs.flags["--order"]);if(!orderResult.valid)return output_manager_default.error(orderResult.error),2;let limitResult=getLimit(parsedArgs.flags["--limit"]);if(!limitResult.valid)return output_manager_default.error(limitResult.error),2;let tldsResult=normalizeTldFilters(parsedArgs.flags["--tld"]);if(!tldsResult.valid)return output_manager_default.error(tldsResult.error),2;let{query,keyword,fragment}=queryResult,order=orderResult.order,limit=limitResult.limit,tlds=tldsResult.tlds,availableOnly=parsedArgs.flags["--available"]??!1,cursorResult=decodeCursor(parsedArgs.flags["--next"]);if(!cursorResult.valid)return output_manager_default.error(cursorResult.error),1;let cursor2=cursorResult.cursor;if(cursor2&&(cursor2.query!==query||cursor2.fragment!==fragment||cursor2.order!==order||!areStringArraysEqual(cursor2.tlds,tlds)||cursor2.availableOnly!==availableOnly))return output_manager_default.error("The continuation cursor does not match the current query, order, or filters."),1;try{let supportedTlds=await getSupportedTlds(client,order),matchingTlds=filterTlds(supportedTlds,fragment,tlds,order),offsetResult=getOffset(matchingTlds,cursor2);if(!offsetResult.valid)return output_manager_default.error(offsetResult.error),1;let page=await getCandidatePage(client,keyword,matchingTlds,offsetResult.offset,limit,availableOnly),next=page.lastTld!==null&&page.hasMore?encodeCursor({query,fragment,order,tlds,availableOnly,lastTld:page.lastTld}):null;return formatResult.jsonOutput?(client.stdout.write(`${JSON.stringify({query,order,results:page.results,pagination:{next,limit}},null,2)}
160
+ `),0):(output_manager_default.log(renderTable(page.results)),next&&(output_manager_default.print(`
161
+ `),printNextPageCommand(getCommandNamePlain(getContinuationCommand(query,order,tlds,availableOnly,next)))),0)}catch(error){if(isAPIError(error)){let message=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message},null,2)}
162
+ `):output_manager_default.error(message),1}return printError(error),1}}async function getSupportedTlds(client,order){let cache=await client.maybeReadConfig(SUPPORTED_TLDS_CACHE_FILE,supportedTldsCacheSchema),cacheKey=JSON.stringify([client.config.currentTeam??null,order]),cachedEntry=cache?.entries[cacheKey];if(cachedEntry&&isSupportedTldsCacheEntryFresh(cachedEntry.fetchedAt))return output_manager_default.debug("Using cached supported TLD catalog"),cachedEntry.tlds;let params=new URLSearchParams2({order}),supportedTlds=supportedTldsSchema.parse(await client.fetch(`/v1/registrar/tlds/supported?${params}`));try{let fetchedAt=Date.now(),freshEntries=Object.fromEntries(Object.entries(cache?.entries??{}).filter(([,entry2])=>isSupportedTldsCacheEntryFresh(entry2.fetchedAt,fetchedAt)));await client.writeConfig(SUPPORTED_TLDS_CACHE_FILE,supportedTldsCacheSchema,{entries:{...freshEntries,[cacheKey]:{fetchedAt,tlds:supportedTlds}}})}catch(error){output_manager_default.debug(`Failed to cache supported TLD catalog: ${error}`)}return supportedTlds}function isSupportedTldsCacheEntryFresh(fetchedAt,now=Date.now()){let age=now-fetchedAt;return age>=0&&age<=SUPPORTED_TLDS_CACHE_TTL_MS}function encodeCursor(cursor2){return Buffer.from(JSON.stringify(cursor2),"utf8").toString("base64url")}function decodeCursor(value){if(value===void 0)return{valid:!0,cursor:null};try{if(!value||!/^[A-Za-z0-9_-]+$/.test(value))throw new Error("Invalid base64url value");let cursor2=JSON.parse(Buffer.from(value,"base64url").toString("utf8"));if(!isContinuationCursor(cursor2))throw new Error("Invalid cursor shape");return{valid:!0,cursor:cursor2}}catch{return{valid:!1,error:"Invalid continuation cursor. Run Domain Discovery again without `--next`."}}}function isContinuationCursor(value){if(!value||typeof value!="object"||Array.isArray(value))return!1;let cursor2=value,keys=Object.keys(cursor2).sort();return keys.length!==6||keys.join(",")!=="availableOnly,fragment,lastTld,order,query,tlds"?!1:typeof cursor2.query=="string"&&(typeof cursor2.fragment=="string"||cursor2.fragment===null)&&typeof cursor2.order=="string"&&ORDERS.includes(cursor2.order)&&Array.isArray(cursor2.tlds)&&cursor2.tlds.every(tld=>typeof tld=="string")&&typeof cursor2.availableOnly=="boolean"&&typeof cursor2.lastTld=="string"&&cursor2.lastTld.length>0}function getOffset(tlds,cursor2){if(!cursor2)return{valid:!0,offset:0};let lastTldIndex=tlds.indexOf(cursor2.lastTld);return lastTldIndex===-1?{valid:!1,error:"The continuation cursor is stale. Run Domain Discovery again without `--next`."}:{valid:!0,offset:lastTldIndex+1}}function normalizeQuery(args){if(args.length===0)return{valid:!1,error:"Missing query. Usage: `vercel domains search <query>`"};if(args.length>1)return{valid:!1,error:"Please provide one keyword or domain fragment."};let query=args[0].trim().toLowerCase();if(query.length===0)return{valid:!1,error:"Query cannot be empty."};if(!/^[\x00-\x7F]+$/.test(query))return{valid:!1,error:"Only ASCII queries are supported in Domain Discovery."};if(query.includes("://")||/[/?#]/.test(query))return{valid:!1,error:"URLs are not supported. Provide one keyword or domain fragment."};if(/\s/.test(query))return{valid:!1,error:"Queries cannot contain whitespace. Provide one keyword or domain fragment."};let[keyword,...fragmentParts]=query.split("."),fragment=fragmentParts.length>0?fragmentParts.join("."):null;return isValidLabel(keyword)?fragment!==null&&!fragment.split(".").every(isValidLabel)?{valid:!1,error:`Invalid TLD fragment: "${fragment}".`}:{valid:!0,query,keyword,fragment}:{valid:!1,error:`Invalid keyword: "${keyword}".`}}function isValidLabel(value){return value.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(value)}function getOrder(value){let order=value??DEFAULT_ORDER;return ORDERS.includes(order)?{valid:!0,order}:{valid:!1,error:`Invalid order: "${order}". Valid orders: ${ORDERS.join(", ")}`}}function getContinuationCommand(query,order,tlds,availableOnly,cursor2){let flags=[];return order!==DEFAULT_ORDER&&flags.push(`--order=${order}`),flags.push(...tlds.map(tld=>`--tld=${tld}`)),availableOnly&&flags.push("--available"),flags.push(`--next ${cursor2}`),`domains search ${query} ${flags.join(" ")}`}function normalizeTldFilters(values){if(values===void 0)return{valid:!0,tlds:[]};let tlds=Array.from(new Set(values.map(value=>value.trim().toLowerCase().replace(/^\./,"")))).sort(),invalidTld=tlds.find(tld=>tld.length===0||!tld.split(".").every(isValidLabel));return invalidTld!==void 0?{valid:!1,error:`Invalid TLD filter: "${invalidTld}".`}:{valid:!0,tlds}}function areStringArraysEqual(left,right){return left.length===right.length&&left.every((value,index)=>value===right[index])}function getLimit(value){let limit=value??DEFAULT_LIMIT;return!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT?{valid:!1,error:`Invalid limit: "${limit}". Provide a number from 1 to ${MAX_LIMIT}.`}:{valid:!0,limit}}function filterTlds(tlds,fragment,filters,order){let filterSet=new Set(filters),matchingTlds=tlds.filter(tld=>(fragment===null||tld.startsWith(fragment))&&(filterSet.size===0||filterSet.has(tld)));return order==="relevance"?matchingTlds.sort((a,b)=>a===fragment?-1:b===fragment?1:0):matchingTlds}async function getCandidatePage(client,keyword,tlds,offset,limit,availableOnly){let pageTlds=tlds.slice(offset,offset+limit),candidates=await quoteCandidates(client,pageTlds.map(tld=>`${keyword}.${tld}`));return{results:availableOnly?candidates.filter(candidate=>candidate.available):candidates,lastTld:pageTlds.at(-1)??null,hasMore:offset+pageTlds.length<tlds.length}}async function quoteCandidates(client,domains){if(domains.length===0)return[];let response=domainsSearchResponseSchema.parse(await client.fetch("/v1/registrar/domains/search",{method:"POST",body:{domains}})),resultsByDomain=new Map(response.results.map(result=>[result.domain,result]));return domains.map(domain=>{let result=resultsByDomain.get(domain);if(!result)throw new Error(`Missing registrar search result for ${domain}.`);return result.available?{domain:result.domain,available:!0,purchasePrice:result.price,renewalPrice:result.renewalPrice,years:result.years}:{domain:result.domain,available:!1,purchasePrice:null,renewalPrice:null,years:null}})}function renderTable(results){return table([["Domain","Availability","Purchase","Renewal"],...results.map(result=>[result.domain,result.available?"Available":"Unavailable",result.available?formatPrice(result.purchasePrice,result.years):"-",result.available?formatPrice(result.renewalPrice,result.years):"-"])])}function formatPrice(price2,years){return price2===null||years===null?"-":`$${price2} / ${years} ${years===1?"year":"years"}`}var import_chalk38=__toESM(require_source(),1),import_error_utils2=__toESM(require_dist(),1);async function updateAutoRenew(client,name,autoRenew2){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"";return client.fetch(`/v1/registrar/domains/${encodeURIComponent(name)}/auto-renew${teamParam}`,{method:"PATCH",body:{autoRenew:autoRenew2}})}var DomainsAutoRenewTelemetryClient=class extends TelemetryClient{trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentState(state){(state==="on"||state==="off")&&this.trackCliArgument({arg:"state",value:state})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var ON="on",OFF="off";async function autoRenew(client,argv){let telemetry=new DomainsAutoRenewTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(autoRenewSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),printError(error),2}let{args}=parsedArgs,action=args[0]==="enable"||args[0]==="disable"?args[0]:void 0,[domainName,state]=action?args.slice(1):args;action==="enable"?telemetry.trackCliSubcommandEnable(action):action==="disable"&&telemetry.trackCliSubcommandDisable(action),telemetry.trackCliArgumentDomain(domainName),action||telemetry.trackCliArgumentState(state),telemetry.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry.trackCliFlagJson(parsedArgs.flags["--json"]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error}),output_manager_default.error(formatResult.error),2;let{jsonOutput}=formatResult,asJson=jsonOutput||!canPrompt(client);function fail(reason,message2,humanMessage=message2){return shouldEmitNonInteractiveCommandError(client)?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:message2}),getExitCodeForReason(reason)):jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,domain:domainName,message:message2},null,2)}
163
+ `),getExitCodeForReason(reason)):(output_manager_default.error(humanMessage),getExitCodeForReason(reason))}if(args.length!==2||!domainName||!action&&!state){let usage=getCommandName(`domains auto-renew ${action??"enable|disable"} <domain>`);return fail(AGENT_REASON.MISSING_ARGUMENTS,`Invalid number of arguments. Usage: ${usage}`,`Invalid number of arguments. Usage: ${import_chalk38.default.cyan(usage)}`)}if(!isRootDomain(domainName))return fail(AGENT_REASON.INVALID_DOMAIN,`Invalid domain name "${domainName}".`,`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`);if(!action&&state!==ON&&state!==OFF)return fail(AGENT_REASON.INVALID_ARGUMENTS,`Invalid state "${state}". Expected ${ON} or ${OFF}.`,`Invalid state "${state}". Expected ${import_chalk38.default.bold(ON)} or ${import_chalk38.default.bold(OFF)}.`);let enabled=action?action==="enable":state===ON;action||warnDeprecatedSubcommand(client,`domains auto-renew ${domainName} ${state}`,`domains auto-renew ${enabled?"enable":"disable"} ${domainName}`);let contextName=await getContextName(client);asJson||output_manager_default.spinner(`${enabled?"Enabling":"Disabling"} automatic renewal for ${domainName}`);try{await updateAutoRenew(client,domainName,enabled)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))switch(err.code){case"domain_not_registered":return fail("domain_not_registered",`The domain ${domainName} is not registered with Vercel.`,`The domain ${param(domainName)} is not registered with Vercel.`);case"domain_not_found":return fail(AGENT_REASON.DOMAIN_NOT_FOUND,`Domain ${domainName} not found under ${contextName}.`,`Domain ${param(domainName)} not found under ${import_chalk38.default.bold(contextName)}.`);case"domain_not_renewable":return fail("domain_not_renewable",`The domain ${domainName} cannot be renewed, so automatic renewal can't be changed.`);case"domain_already_renewing":return fail("domain_already_renewing",`The domain ${domainName} is already renewing, so automatic renewal can't be changed right now.`);case"forbidden":return fail("forbidden",`You don't have permission to update ${domainName} under ${contextName}.`,`You don't have permission to update ${param(domainName)} under ${import_chalk38.default.bold(contextName)}.`);default:return fail(AGENT_REASON.API_ERROR,err.serverMessage||err.message)}return output_manager_default.debug(`Server response: ${(0,import_error_utils2.errorToString)(err)}`),fail(AGENT_REASON.API_ERROR,"An unexpected error occurred while updating automatic renewal. Please try again later.")}output_manager_default.stopSpinner();let message=enabled?`Automatic renewal turned on for ${domainName}`:`Automatic renewal turned off for ${domainName}`;return asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,autoRenew:enabled,message},null,2)}
164
+ `),0):(output_manager_default.success(`${enabled?"Enabled":"Disabled"} automatic renewal for ${param(domainName)}`),0)}var import_chalk39=__toESM(require_source(),1),import_error_utils3=__toESM(require_dist(),1);async function renewDomain(client,name,expectedPrice,years){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"",orderId;try{({orderId}=await client.fetch(`/v1/registrar/domains/${encodeURIComponent(name)}/renew${teamParam}`,{method:"POST",body:{expectedPrice,years},retry:{retries:0},bailOn429:!0}))}catch(err){if(isAPIError(err)&&err.status<500)throw err;return new DomainChargeOutcomeUnknown(name,"renew")}let order;try{order=await pollForOrder(client,orderId)}catch{order=null}return order??new DomainChargeOutcomeUnknown(name,"renew")}var DomainsRenewTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionAmount(amount){this.trackRedactedCliOption("amount",amount)}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function renew(client,argv){let telemetry=new DomainsRenewTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(renewSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[domainName]=args;if(telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliOptionAmount(opts["--amount"]),telemetry.trackCliFlagJson(opts["--json"]),telemetry.trackCliOptionFormat(opts["--format"]),args.length!==1||!domainName)return reportUsageError(client,AGENT_REASON.MISSING_ARGUMENTS,`Invalid number of arguments. Usage: ${getCommandNamePlain("domains renew <domain>")}`);if(!isRootDomain(domainName))return reportUsageError(client,AGENT_REASON.INVALID_DOMAIN,`Invalid domain name "${domainName}". Use a registrable root domain (no subdomain).`);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,formatResult.error);let asJson=formatResult.jsonOutput,amount=parseAmount(opts["--amount"]);if(amount instanceof Error)return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,amount.message);let{contextName,team}=await getScope(client),teamSlug=team?.slug,domainPrice=await getDomainPrice(client,domainName);if(domainPrice instanceof Error)return reportChargeFailure(client,asJson,{reason:chargeFailureReason(domainPrice),message:domainPrice.message});let{years,renewalPrice}=domainPrice;if(renewalPrice===null)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`The renewal price for ${domainName} is not available. This domain may not be renewable.`});let term=`${years}yr${years>1?"s":""}`,renewCommand=price2=>buildCommandWithGlobalFlags(client.argv,`domains renew ${domainName}${teamSlug?` --scope ${teamSlug}`:""}${price2===void 0?"":` --amount ${formatAmountArg(price2)}`}${asJson?" --json":""}`),inspectCommand=buildCommandWithGlobalFlags(client.argv,`domains inspect ${domainName}`);if(amount!==void 0&&!amountMatchesPrice(amount,renewalPrice))return reportPriceChanged(client,{verb:"renew",domain:domainName,amount,price:renewalPrice,nextCommand:renewCommand(renewalPrice),json:asJson});if(amount===void 0){if(!canPromptForCharge(client,asJson)){let headline=`Can't renew ${domainName} without an approved price (--amount) in non-interactive mode.`,priceLine=`Price: ${formatUsd(renewalPrice)} for ${formatTerm(years)}, charged to ${contextName}.`,command=renewCommand(renewalPrice);return writeChargeAction(client,asJson,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`${headline} ${priceLine}`,userActionRequired:!0,hint:"Show the user the renewal price and get their approval before running next[].",data:{domain:domainName,...teamSlug&&{team:teamSlug},amount:renewalPrice,currency:"USD",years},missing:["--amount"],next:[{command,when:`Only after a human approves: charges ${formatUsd(renewalPrice)} now`}]}),printChargeRecovery(`${headline}
165
+ ${priceLine}`,"Once a person approves the price, run",command),1}if(output_manager_default.log("An email with the invoice and transaction details will be sent to you after renewal."),!await client.input.confirm(`Renew ${param(domainName)} now for ${import_chalk39.default.bold(formatUsd(renewalPrice))} (${formatTerm(years)})?`,!1))return output_manager_default.log("Canceled"),0}if(!canPromptForCharge(client,asJson)&&team){let refused=refuseUnnamedTeam(client,asJson,{verb:"renew",domain:domainName,team,nextCommand:renewCommand(renewalPrice)});if(refused!==void 0)return refused}let renewStamp=stamp_default();output_manager_default.spinner(`Renewing ${domainName}`);let order;try{order=await renewDomain(client,domainName,renewalPrice,years)}catch(err){if(output_manager_default.stopSpinner(),output_manager_default.debug(`Server response: ${(0,import_error_utils3.errorToString)(err)}`),isAPIError(err)){if(err.code==="expected_price_mismatch")return reportPriceChanged(client,{verb:"renew",domain:domainName,amount:renewalPrice,nextCommand:renewCommand(),json:asJson});let known={domain_not_registered:[AGENT_REASON.DOMAIN_NOT_FOUND,`The domain ${domainName} is not registered with Vercel.`],domain_not_found:[AGENT_REASON.DOMAIN_NOT_FOUND,`Domain ${domainName} not found under ${contextName}.`],tld_not_supported:[AGENT_REASON.TLD_NOT_SUPPORTED,`The TLD for domain name ${domainName} is not supported.`],forbidden:[AGENT_REASON.PERMISSION_DENIED,`You don't have permission to renew ${domainName} under ${contextName}.`]},[reason,message]=known[err.code]??[];return reason&&message?reportChargeFailure(client,asJson,{reason,message}):reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The API returned an error (${err.code}). Nothing was charged.`},{apiMessage:err.serverMessage})}return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The request wasn't sent, so nothing was charged.`})}if(output_manager_default.stopSpinner(),order instanceof DomainChargeOutcomeUnknown)return reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand});let outcome=getOrderOutcome(order,domainName);return outcome==="unknown"?reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand}):outcome!=="completed"?reportChargeFailure(client,asJson,{reason:outcome==="payment_failed"?AGENT_REASON.PAYMENT_FAILED:AGENT_REASON.API_ERROR,message:{payment_failed:"Your card was declined. Nothing was charged.",refunded:`Renewal for ${domainName} failed, and the charge was refunded.`,refund_failed:`Renewal for ${domainName} failed, and refunding the charge also failed. Contact Vercel support about the charge.`,failed:`Renewal for ${domainName} failed.`}[outcome]}):asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,term,years,price:renewalPrice,charge:{amount:renewalPrice,currency:"USD"},orderId:order.orderId,message:`Domain ${domainName} renewed.`},null,2)}
166
+ `),0):(client.stdout.write(`${domainName}
167
+ `),output_manager_default.success(`Domain ${param(domainName)} renewed ${renewStamp()}`),output_manager_default.log(`Charged ${formatUsd(renewalPrice)} for ${formatTerm(years)}.`),0)}var DomainsVerifyTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagStrict(strict){strict&&this.trackCliFlag("strict")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function getDomainConfigV6(client,domainName,options={}){let query=new URLSearchParams;options.projectIdOrName&&query.set("projectIdOrName",options.projectIdOrName),options.strict&&query.set("strict","true");let queryString=query.toString();try{return await client.fetch(`/v6/domains/${encodeURIComponent(domainName)}/config${queryString?`?${queryString}`:""}`,{bailOn429:options.bailOn429})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function acquireVerificationFacts(client,options){let{domainName}=options,{contextName,team}=await getScope(client);client.config.currentTeam=team?.id;let requests=[getDomainConfigV6(client,domainName,{projectIdOrName:options.project,strict:options.strict,bailOn429:!0}),resolveProject(client,domainName,options.project),lookupOwnership(client,contextName,domainName)],[config,resolvedProject,owned]=await Promise.all(requests);if(isAPIError(config))return{ok:!1,error:{kind:errorKind(config.code),code:config.code||"api_error",message:configErrorMessage(config,domainName)}};if(resolvedProject.kind==="forbidden")return{ok:!1,error:{kind:"permission-denied",code:"forbidden",message:`You don't have access to the project ${resolvedProject.idOrName} under ${contextName}.`}};if(resolvedProject.kind==="error")return{ok:!1,error:{kind:errorKind(resolvedProject.error.code),code:resolvedProject.error.code||"api_error",message:projectErrorMessage(resolvedProject.error,resolvedProject.idOrName)}};let project=await triggerVerification(client,resolvedProject,domainName);return{ok:!0,facts:{domainName,contextName,teamId:team?.id,config,ownership:owned.ownership,intendedNameservers:owned.intendedNameservers,project}}}async function resolveProject(client,domainName,requestedProject){return requestedProject?resolveRequestedProject(client,domainName,requestedProject):await findLinkedProjectDomain(client,domainName)??await findProjectDomainByName(client,domainName)}async function resolveRequestedProject(client,domainName,idOrName){let result=await getProjectDomain(client,idOrName,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403?{kind:"forbidden",idOrName}:result.status===404?{kind:"missing",idOrName}:{kind:"error",idOrName,error:result}:attachedProject(idOrName,idOrName,result)}async function findLinkedProjectDomain(client,domainName){let link=await getLinkedProject(client);if(link.status!=="linked")return null;let result=await getProjectDomain(client,link.project.id,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403||result.status===404?null:{kind:"error",idOrName:link.project.id,error:result}:attachedProject(link.project.id,link.project.name,result)}async function findProjectDomainByName(client,domainName){let result=await getProjectDomainByName(client,domainName,{bailOn429:!0});if(isAPIError(result))return result.status===403||result.status===404?{kind:"none"}:{kind:"error",idOrName:domainName,error:result};let label=await getProjectLabel(client,result.projectId);return attachedProject(result.projectId,label,result)}function attachedProject(idOrName,label,domain){return{kind:"attached",idOrName,label,domain,verificationError:null}}async function getProjectLabel(client,projectId){try{let project=await getProjectByNameOrId(client,projectId);return project instanceof Error?projectId:project.name}catch{return projectId}}async function lookupOwnership(client,contextName,domainName){if(isPublicSuffix(domainName))return{ownership:"platform-managed",intendedNameservers:[]};try{let domain=await getDomainByName(client,contextName,domainName,{ignoreWait:!0,bailOn429:!0});return domain instanceof DomainPermissionDenied?{ownership:"other-scope",intendedNameservers:[]}:domain instanceof DomainNotFound?{ownership:"not-found",intendedNameservers:[]}:{ownership:"current-scope",intendedNameservers:domain.intendedNameservers}}catch{return{ownership:null,intendedNameservers:[]}}}async function triggerVerification(client,project,domainName){if(project.kind!=="attached"||project.domain.verified)return project;let result=await verifyProjectDomain(client,project.idOrName,domainName,{bailOn429:!0});return isAPIError(result)?{...project,verificationError:result}:{...project,domain:result}}function errorKind(errorCode){return errorCode==="invalid_name"?"invalid-domain":errorCode==="forbidden"?"permission-denied":errorCode==="timeout"?"timeout":errorCode==="unexpected_dns_response"?"unexpected-dns-response":"api-error"}function configErrorMessage(err,domainName){return err.code==="invalid_name"?`${domainName} is not a valid domain name.`:err.code==="timeout"?`Resolving the DNS configuration for ${domainName} timed out. This is usually transient \u2014 try again in a few seconds.`:err.code==="unexpected_dns_response"?`The nameservers for ${domainName} returned an unexpected response while checking its DNS configuration.`:err.serverMessage||`API error (${err.status})`}function projectErrorMessage(err,projectIdOrName){return err.serverMessage||err.message||`Could not check project ${projectIdOrName} (${err.status}).`}var import_tldts2=__toESM(require_cjs(),1);function diagnoseDomain(facts,commands){let configurationStatus=getConfigurationStatus(facts),status=getDomainStatus2(configurationStatus,facts.project),recommendedDnsRecords=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?[]:getRecommendedDnsRecords(facts),domainConnect=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?null:getDomainConnectConfiguration(facts),steps=buildSteps(facts,commands,recommendedDnsRecords,domainConnect),details=statusDetails(facts,status,steps),issues=getDomainIssues(facts,status,configurationStatus,steps),next=buildNextSteps(steps,commands,status),ok=isOkStatus(status);return{facts,status,configurationStatus,ok,exitCode:ok?0:1,details,issues,recommendedDnsRecords,steps,next}}function getConfigurationStatus(facts){let{config}=facts;return requiresScopeResolution(facts)?"scope-resolution-required":isPlatformManagedDomain(facts)?config.misconfigured?"invalid-configuration":"configured-correctly":shouldRecommendProjectAttachment(facts)?"project-attachment-recommended":config.serviceType==="zeit.world"&&config.dnssecEnabled?"dnssec-needs-to-be-disabled":config.misconfigured?"invalid-configuration":config.ipStatus==="required-change"&&hasRecommendedDnsUpdate(config)?isOwnedUnattachedHostname(facts)?"dns-change-recommended":"dns-change-required":config.ipStatus==="optional-change"&&hasRecommendedDnsUpdate(config)?"dns-change-recommended":"configured-correctly"}function getDomainStatus2(configurationStatus,project){return configurationStatus==="scope-resolution-required"?configurationStatus:project.kind==="missing"?"project-domain-missing":configurationStatus!=="configured-correctly"&&configurationStatus!=="dns-change-recommended"?configurationStatus:project.kind==="attached"&&!project.domain.verified?"verification-needed":configurationStatus}function getDomainIssues(facts,status,configurationStatus,steps){let statuses=[],addStatus=candidate=>{candidate!=="configured-correctly"&&!statuses.includes(candidate)&&statuses.push(candidate)};return addStatus(status),status!=="scope-resolution-required"&&(addStatus(configurationStatus),facts.project.kind==="missing"?addStatus("project-domain-missing"):facts.project.kind==="attached"&&!facts.project.domain.verified&&addStatus("verification-needed")),statuses.map(domainStatus=>({domainStatus,...statusDetails(facts,domainStatus,steps)}))}function statusDetails(facts,status,steps){let{domainName,project}=facts,domainConnect=getDomainConnect(steps),attachProject=steps.find(step=>step.kind==="attach-project");if(status==="configured-correctly")return{reason:AGENT_REASON.CONFIGURED_CORRECTLY,message:project.kind==="attached"?`${domainName} has a valid configuration and is verified for project ${project.label}.`:`${domainName} has a valid configuration.`};if(status==="verification-needed")return{reason:AGENT_REASON.VERIFICATION_NEEDED,message:project.kind==="attached"?`${domainName} needs ownership verification for project ${project.label}.`:`${domainName} needs ownership verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Add one of the project verification records at the DNS provider, then run the suggested verify command.")};if(status==="invalid-configuration"){if(isPlatformManagedDomain(facts))return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid Vercel-managed DNS configuration.`,userActionRequired:!0,hint:"No DNS changes are required from you. Retry the check, then contact Vercel Support if the configuration remains invalid."};if(attachProject?.kind==="attach-project"){let target=attachProject.project==="<project>"?"a project":`project ${attachProject.project}`,attachInstruction=attachProject.project==="<project>"?"Attach it to a project":"Attach it";return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} is not attached to ${target} and has an invalid DNS configuration. ${attachInstruction} and apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:attachProject.project==="<project>"?"Replace <project> in next[] with the project that should serve the domain, attach it, apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.":"Run the domains add command in next[], apply the recommended records or nameservers at the DNS provider, then run the suggested verify command."}}else return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid DNS configuration. Apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}}else return status==="dnssec-needs-to-be-disabled"?{reason:AGENT_REASON.DNSSEC_NEEDS_TO_BE_DISABLED,message:`${domainName} uses Vercel nameservers, but DNSSEC must be disabled with the domain registrar so the nameservers can resolve globally.`,userActionRequired:!0,hint:"Disable DNSSEC with the domain registrar, then run the suggested verify command."}:status==="dns-change-required"?{reason:AGENT_REASON.DNS_CHANGE_REQUIRED,message:`${domainName} requires a DNS change to avoid downtime.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}:status==="dns-change-recommended"?{reason:AGENT_REASON.DNS_CHANGE_RECOMMENDED,message:`${domainName} has a valid configuration, but Vercel recommends updating its DNS records.`,hint:dnsActionHint(facts,domainConnect,"The domain is working. Apply the recommended DNS update when convenient, then re-check.")}:status==="project-attachment-recommended"?{reason:AGENT_REASON.PROJECT_ATTACHMENT_RECOMMENDED,message:`${domainName} is owned by ${facts.contextName} but is not attached to a project.`,hint:"To use the domain, replace <project> in next[] with the project that should serve it."}:status==="scope-resolution-required"?{reason:AGENT_REASON.SCOPE_NOT_ACCESSIBLE,message:`${domainName} exists on Vercel but is not accessible under ${facts.contextName}. Retry under the owning team before evaluating its DNS or project status.`,userActionRequired:!0,hint:"Use next[] to find the team that owns the domain, then retry in that scope."}:{reason:AGENT_REASON.PROJECT_DOMAIN_MISSING,message:project.kind==="missing"?`${domainName} is not attached to project ${project.idOrName}.`:`${domainName} is not attached to the requested project.`,hint:facts.ownership==="other-scope"?"Find the team that owns the domain using next[], then retry in that scope before changing project attachments.":"Run the domains add command in next[], then retry verification."}}function dnsActionHint(facts,domainConnect,manualHint){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"?`Resolve the team that owns the domain using next[] before making DNS or project changes. ${manualHint}`:domainConnect?`Open the Cloudflare Domain Connect URL in next[] to apply the DNS changes automatically. ${manualHint}`:manualHint}function buildSteps(facts,commands,recommendedDnsRecords,domainConnect){let scope=requiresScopeResolution(facts)?{kind:"resolve-scope",contextName:facts.contextName,teamsCommand:commands.teamsList,verifyCommand:commands.verify("<team>")}:null;if(scope)return[scope];let attachProject=buildAttachProjectStep(facts,commands);if(shouldRecommendProjectAttachment(facts))return attachProject?[attachProject]:[];let steps=[];attachProject&&steps.push(attachProject);let configureDns=buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect);if(configureDns&&steps.push(configureDns),!isPlatformManagedDomain(facts)&&facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled&&steps.push({kind:"disable-dnssec"}),!isPlatformManagedDomain(facts))for(let conflict of facts.config.conflicts??[])steps.push({kind:"remove-conflict",conflict});let verification=facts.project.kind==="attached"&&!facts.project.domain.verified?{kind:"verify-ownership",challenges:facts.project.domain.verification??[],errorMessage:facts.project.verificationError?facts.project.verificationError.serverMessage||facts.project.verificationError.message:null}:null;return verification&&steps.push(verification),steps}function buildAttachProjectStep(facts,commands){return needsProjectAttachment(facts)?{kind:"attach-project",mode:facts.config.misconfigured?"required":"recommended",project:"<project>",command:commands.attachProject("<project>")}:facts.project.kind==="missing"?{kind:"attach-project",mode:"required",project:facts.project.idOrName,command:commands.attachProject(facts.project.idOrName)}:null}function buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect){if(requiresScopeResolution(facts)||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)||!needsDnsRecordChange(facts.config))return null;let methods=[];domainConnect&&methods.push({kind:"domain-connect",configuration:domainConnect});let aRecords=recommendedDnsRecords.filter(record=>record.type==="A"),cnameRecords=recommendedDnsRecords.filter(record=>record.type==="CNAME");return aRecords.length&&methods.push({kind:"a-records",records:aRecords}),cnameRecords.length&&methods.push({kind:"cname-records",records:cnameRecords}),facts.intendedNameservers.length&&!nameserversMatch(facts.config.nameservers,facts.intendedNameservers)&&methods.push({kind:"nameservers",nameservers:[...facts.intendedNameservers]}),{kind:"configure-dns",change:facts.config.misconfigured&&facts.config.configuredBy===null?"point-domain":facts.config.ipStatus==="optional-change"||isOwnedUnattachedHostname(facts)?"recommended-change":"required-change",methods}}function buildNextSteps(steps,commands,status){let next=[];for(let step of steps)if(step.kind==="resolve-scope")next.push({command:step.teamsCommand,when:"List teams to find the scope that owns the domain"},{command:step.verifyCommand,when:"Replace <team> with the owning team and retry"});else if(step.kind==="attach-project")next.push({command:step.command,when:step.project==="<project>"?"Replace <project> with the project that should serve the domain":"Attach the domain to the requested project"});else if(step.kind==="configure-dns"){let domainConnectMethod=step.methods.find(method=>method.kind==="domain-connect");domainConnectMethod?.kind==="domain-connect"&&next.push({command:commands.openUrl(domainConnectMethod.configuration.applyUrl),when:"Open Cloudflare to review and apply the DNS changes automatically with Domain Connect"})}return!steps.some(step=>step.kind==="resolve-scope")&&status!=="configured-correctly"&&status!=="project-attachment-recommended"&&next.push({command:commands.verify(),when:status==="dns-change-recommended"?"Re-check after applying the recommended DNS change":"Re-check after completing the required changes"}),next}function getDomainConnect(steps){for(let step of steps){if(step.kind!=="configure-dns")continue;let method=step.methods.find(candidate=>candidate.kind==="domain-connect");if(method?.kind==="domain-connect")return method.configuration}return null}function getRecommendedDnsRecords(facts){let recommendedA=facts.config.recommendedIPv4?.find(record=>record.rank===1)?.value??[],recommendedCNAME=facts.config.recommendedCNAME?.find(record=>record.rank===1)?.value,apexName=facts.project.kind==="attached"?facts.project.domain.apexName:(0,import_tldts2.parse)(facts.domainName.replace(/^\*\./,"")).domain,name=getDnsRecordName(facts.domainName,apexName),disableProxy=isCloudflareDns(facts.config),aRecords=recommendedA.map(value=>({type:"A",name,value,...disableProxy?{disableProxy:!0}:{}})),cnameRecords=recommendedCNAME?[{type:"CNAME",name,value:recommendedCNAME,...disableProxy?{disableProxy:!0}:{}}]:[],isApex=apexName?facts.domainName.toLowerCase()===apexName.toLowerCase():null,preferred=isApex===null?[]:isApex&&!disableProxy?aRecords:cnameRecords;return preferred.length?preferred:[...aRecords,...cnameRecords]}function getDomainConnectConfiguration(facts){if(isPlatformManagedDomain(facts)||facts.project.kind!=="attached"||isWildcardDomain(facts.domainName)||!needsDnsRecordChange(facts.config)||!isCloudflareDns(facts.config))return null;let params=new URLSearchParams;facts.teamId&&params.set("teamId",facts.teamId);let query=params.toString(),projectId=encodeURIComponent(facts.project.domain.projectId),domain=encodeURIComponent(facts.project.domain.name);return{protocol:"domain-connect",providerId:"cloudflare.com",providerName:"Cloudflare",applyUrl:`https://vercel.com/api/v9/projects/${projectId}/domains/${domain}/domain-connect/apply`+(query?`?${query}`:"")}}function hasRecommendedDnsUpdate(config){return!!(config.recommendedIPv4?.some(record=>record.rank===1&&record.value.length>0)||config.recommendedCNAME?.some(record=>record.rank===1&&!!record.value))}function needsDnsRecordChange(config){return hasRecommendedDnsUpdate(config)&&(config.ipStatus==="required-change"||config.ipStatus==="optional-change"||config.misconfigured&&config.configuredBy===null)}function isOkStatus(status){return status==="configured-correctly"||status==="dns-change-recommended"||status==="project-attachment-recommended"}function isCloudflareDns(config){return config.nameservers.length>0&&config.nameservers.every(nameserver=>nameserver.toLowerCase().replace(/\.$/,"").endsWith(".ns.cloudflare.com"))}function isWildcardDomain(domainName){return domainName.startsWith("*.")}function isOwnedUnattachedHostname(facts){return facts.ownership==="current-scope"&&facts.project.kind==="none"}function needsProjectAttachment(facts){return facts.project.kind==="none"&&(facts.ownership==="current-scope"||facts.ownership==="not-found")}function shouldRecommendProjectAttachment(facts){return isOwnedUnattachedHostname(facts)&&!facts.config.misconfigured&&!(facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled)}function requiresScopeResolution(facts){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"}function isPlatformManagedDomain(facts){return facts.ownership==="platform-managed"}function nameserversMatch(current,intended){let normalize=nameservers=>[...new Set(nameservers.map(normalizeNameserver))].sort(),normalizedCurrent=normalize(current),normalizedIntended=normalize(intended);return normalizedCurrent.length===normalizedIntended.length&&normalizedCurrent.every((nameserver,index)=>nameserver===normalizedIntended[index])}function normalizeNameserver(nameserver){return nameserver.toLowerCase().replace(/\.$/,"")}function getDnsRecordName(domain,apex){let domainName=domain.toLowerCase(),apexName=apex?.toLowerCase();if(!apexName)return domain;if(domainName===apexName)return"@";let suffix=`.${apexName}`;return domainName.endsWith(suffix)?domain.slice(0,-suffix.length):domain}var import_chalk40=__toESM(require_source(),1);function renderHumanOutput(diagnosis,elapsed){return diagnosis.status==="configured-correctly"&&diagnosis.steps.length===0?{lead:{kind:"success",message:`${successMessage(diagnosis)} ${import_chalk40.default.gray(elapsed)}`},sections:[]}:{lead:{kind:"log",message:`Checked ${diagnosis.facts.domainName} under ${import_chalk40.default.bold(diagnosis.facts.contextName)} ${import_chalk40.default.gray(elapsed)}`},sections:[renderStatus(diagnosis),renderFixes(diagnosis),renderResolvedValues(diagnosis),renderNameservers(diagnosis)].filter(section=>section!==null)}}function successMessage(diagnosis){let{facts}=diagnosis,configuredBy=describeConfiguredBy(facts.config.configuredBy),suffix=facts.project.kind==="attached"?` and verified for project ${import_chalk40.default.bold(facts.project.label)}`:"";return`Valid Configuration: ${facts.domainName} is configured${configuredBy?` (${configuredBy})`:""}${suffix}`}function describeConfiguredBy(configuredBy){return configuredBy==="A"?"A record":configuredBy==="CNAME"?"CNAME record":configuredBy==="http"?"HTTP resolution, possibly behind a proxy":configuredBy==="dns-01"?"DNS-01 challenge only, not yet resolving to Vercel":null}var good=text=>`${import_chalk40.default.green(chars_default.tick)} ${text}`,bad=text=>`${import_chalk40.default.red(chars_default.cross)} ${text}`,warning=text=>`${import_chalk40.default.yellow("!")} ${text}`;function renderStatus(diagnosis){let{facts}=diagnosis,rows=[[import_chalk40.default.cyan("DNS Configuration"),dnsStatus(diagnosis)],[import_chalk40.default.cyan("Project"),projectStatus(diagnosis)]];return facts.ownership==="other-scope"?rows.push([import_chalk40.default.cyan("Ownership"),bad(`Not accessible under ${import_chalk40.default.bold(facts.contextName)}`)]):facts.ownership==="platform-managed"&&rows.push([import_chalk40.default.cyan("Ownership"),good("Managed by Vercel")]),facts.config.dnssecEnabled&&diagnosis.configurationStatus!=="scope-resolution-required"&&rows.push([import_chalk40.default.cyan("DNSSEC"),import_chalk40.default.yellow("Enabled")]),`
168
+ ${import_chalk40.default.bold(" Status")}
169
+
170
+ ${indent(table(rows,{hsep:4}))}
171
+
172
+ `}function dnsStatus(diagnosis){if(diagnosis.configurationStatus==="invalid-configuration")return bad("Invalid Configuration");if(diagnosis.configurationStatus==="dns-change-required")return bad("DNS Change Required");if(diagnosis.configurationStatus==="dnssec-needs-to-be-disabled")return bad("DNSSEC Needs to be Disabled");if(diagnosis.configurationStatus==="dns-change-recommended")return warning("DNS Change Recommended");if(diagnosis.configurationStatus==="project-attachment-recommended")return import_chalk40.default.gray("Not assessed without a project");if(diagnosis.configurationStatus==="scope-resolution-required")return import_chalk40.default.gray("Not assessed in this scope");{let configuredBy=describeConfiguredBy(diagnosis.facts.config.configuredBy);return good(`Valid Configuration${configuredBy?` (${configuredBy})`:""}`)}}function projectStatus(diagnosis){let{facts}=diagnosis;return diagnosis.configurationStatus==="scope-resolution-required"?import_chalk40.default.gray("Not assessed in this scope"):facts.project.kind==="attached"?facts.project.domain.verified?good(`Verified for ${import_chalk40.default.bold(facts.project.label)}`):bad(`Verification Needed for ${import_chalk40.default.bold(facts.project.label)}`):facts.project.kind==="missing"?bad(`Not attached to project ${import_chalk40.default.bold(facts.project.idOrName)}`):import_chalk40.default.gray(`Not attached to any project under ${facts.contextName}`)}function renderFixes(diagnosis){if(!diagnosis.steps.length)return null;let heading=diagnosis.ok?" Recommended change":" What to fix",body=diagnosis.steps.map((step,index)=>{let rendered=renderStep(diagnosis,step,index);return`${` ${import_chalk40.default.grey(`${index+1}.`)} ${rendered}`.replace(/[ \t]+$/gm,"")}
173
+ `}).join(`
174
+ `);return`${import_chalk40.default.bold(heading)}
175
+
176
+ ${body}
177
+ `}function renderStep(diagnosis,step,index){return step.kind==="resolve-scope"?scopeStep(diagnosis,step):step.kind==="attach-project"?attachProjectStep(diagnosis,step):step.kind==="configure-dns"?configureDnsStep(diagnosis,step,index):step.kind==="disable-dnssec"?"Disable DNSSEC with your domain registrar. The domain's nameservers point to Vercel, but DNSSEC prevents them from resolving globally.":step.kind==="remove-conflict"?conflictStep(step):verificationStep(step)}function scopeStep(diagnosis,step){return`${diagnosis.facts.domainName} exists on Vercel but is not accessible under ${import_chalk40.default.bold(step.contextName)}. If it belongs to another team you are a member of, list your teams with ${code(step.teamsCommand)}, then retry with ${code(step.verifyCommand)}.`}function configureDnsStep(diagnosis,step,index){if(!step.methods.length)return`${index>0?"Then point":"Point"} the domain to Vercel by setting the recommended DNS records for your project.`;let optionPhrase=step.methods.length===1?"the following option":"one of the following options",lines=[step.change==="point-domain"?`${index>0?"Then point":"Point"} ${diagnosis.facts.domainName} to Vercel with ${optionPhrase}:`:step.change==="recommended-change"?`Vercel recommends updating the DNS records for ${diagnosis.facts.domainName} with ${optionPhrase}:`:`To avoid downtime, update the DNS records for ${diagnosis.facts.domainName} with ${optionPhrase}:`];return step.methods.forEach((method,methodIndex)=>{let letter=String.fromCharCode(97+methodIndex),title=dnsMethodTitle(method);lines.push("",`${import_chalk40.default.grey(`${letter})`)} ${title}`);for(let detail of dnsMethodDetails(method))lines.push(` ${detail}`)}),lines.join(`
178
+ `)}function dnsMethodTitle(method){return method.kind==="domain-connect"?`Auto configure with ${method.configuration.providerName} using Domain Connect:`:method.kind==="a-records"?method.records.length===1?"Add an A record:":"Add A records:":method.kind==="cname-records"?"Add a CNAME record:":"Switch to the Vercel nameservers:"}function dnsMethodDetails(method){return method.kind==="domain-connect"?[output_manager_default.link(method.configuration.applyUrl,method.configuration.applyUrl,{fallback:!1}),import_chalk40.default.gray(`Open the URL to review and approve the DNS changes in ${method.configuration.providerName}.`)]:method.kind==="nameservers"?method.nameservers.map(nameserver=>import_chalk40.default.cyan(nameserver)):method.records.map(record=>import_chalk40.default.cyan(formatDnsRecord(record)))}function formatDnsRecord(record){let columns=record.type==="A"?`A ${record.name} ${record.value}`:`CNAME ${record.name} ${record.value}`;return record.disableProxy?`${columns} (Proxy: Disabled)`:columns}function conflictStep(step){let{conflict}=step,caaHint=conflict.type==="CAA"?" (it prevents Vercel from issuing TLS certificates)":"";return`Remove the conflicting ${conflict.type} record ${code(`${conflict.type} ${conflict.name} ${conflict.value}`)}${caaHint}.`}function verificationStep(step){if(!step.challenges.length)return step.errorMessage?`Retry domain ownership verification. ${import_chalk40.default.gray(`Last attempt: ${step.errorMessage}`)}`:"Retry domain ownership verification for the project.";let lines=[step.challenges.length===1?"Verify domain ownership by adding the following record to your DNS provider. You can remove it after verification is complete:":"Verify domain ownership by adding one of the following records to your DNS provider. You can remove it after verification is complete:"];for(let[index,challenge]of step.challenges.entries()){let record=code(`${challenge.type} ${challenge.domain} "${challenge.value}"`);if(step.challenges.length===1)lines.push(record);else{let letter=String.fromCharCode(97+index);lines.push("",`${import_chalk40.default.grey(`${letter})`)} ${record}`)}}return step.errorMessage&&lines.push("",import_chalk40.default.gray(`Last attempt: ${step.errorMessage}`)),lines.join(`
179
+ `)}function attachProjectStep(diagnosis,step){return step.mode==="recommended"?`To use ${diagnosis.facts.domainName}, attach it to a project by running ${code(step.command)}.`:step.project==="<project>"?`Attach ${diagnosis.facts.domainName} to the project that should serve it by running ${code(step.command)}, replacing ${code("<project>")} with the target project.`:`Add the domain to the project by running ${code(step.command)}.`}function renderResolvedValues(diagnosis){let config=diagnosis.facts.config,rows=[...(config.aValues??[]).map(value=>["A",value]),...(config.cnames??[]).map(value=>["CNAME",value])];return rows.length?`${import_chalk40.default.bold(" Currently resolves to")}
180
+
181
+ ${indent(table([[import_chalk40.default.gray("Type"),import_chalk40.default.gray("Value")],...rows],{hsep:4}))}
182
+
183
+ `:null}function renderNameservers(diagnosis){let nameservers=diagnosis.facts.config.nameservers??[];return nameservers.length?`${import_chalk40.default.bold(" Nameservers")}
184
+
185
+ ${indent(nameservers.join(`
186
+ `))}
187
+
188
+ `:null}function indent(block){return block.split(`
189
+ `).map(line=>` ${line}`).join(`
190
+ `)}function renderStructuredOutput(diagnosis){let{facts}=diagnosis,{config}=facts,dnsMethods=getDnsMethods(diagnosis),domainConnectMethod=dnsMethods.find(method=>method.kind==="domain-connect"),domainConnect=domainConnectMethod?.kind==="domain-connect"?domainConnectMethod.configuration:null,canRecommendDns=diagnosis.configurationStatus!=="scope-resolution-required"&&diagnosis.configurationStatus!=="project-attachment-recommended"&&facts.ownership!=="platform-managed",payload={status:diagnosis.ok?AGENT_STATUS.OK:AGENT_STATUS.ACTION_REQUIRED,...diagnosis.details,...diagnosis.next.length?{next:diagnosis.next}:{},...domainConnect?{domainConnect}:{},domain:facts.domainName,domainStatus:diagnosis.status,configurationStatus:diagnosis.configurationStatus,ok:diagnosis.ok,issues:diagnosis.issues,misconfigured:config.misconfigured,configuredBy:config.configuredBy,serviceType:config.serviceType,ipStatus:config.ipStatus??null,dnssecEnabled:config.dnssecEnabled??null,acceptedChallenges:config.acceptedChallenges??[],current:{nameservers:config.nameservers??[],cnames:config.cnames??[],aValues:config.aValues??[]},recommended:{ipv4:canRecommendDns?config.recommendedIPv4??[]:[],cname:canRecommendDns?config.recommendedCNAME??[]:[],records:diagnosis.recommendedDnsRecords,nameservers:getRecommendedNameservers(dnsMethods)},conflicts:diagnosis.steps.flatMap(step=>step.kind==="remove-conflict"?[step.conflict]:[]),domainOwnership:facts.ownership,project:serializeProject(facts.project)};return`${JSON.stringify(payload,null,2)}
191
+ `}function renderStructuredError(error){return`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:error.reason,error:error.code,message:error.message,...error.next?.length?{next:error.next}:{}},null,2)}
192
+ `}function getDnsMethods(diagnosis){let step=diagnosis.steps.find(candidate=>candidate.kind==="configure-dns");return step?.kind==="configure-dns"?step.methods:[]}function getRecommendedNameservers(methods){let method=methods.find(candidate=>candidate.kind==="nameservers");return method?.kind==="nameservers"?method.nameservers:[]}function serializeProject(project){return project.kind==="none"?null:project.kind==="attached"?{idOrName:project.label,attached:!0,verified:project.domain.verified,verification:project.domain.verification??[],verificationError:project.verificationError?{code:project.verificationError.code||"verification_failed",message:project.verificationError.serverMessage||project.verificationError.message}:null}:{idOrName:project.idOrName,attached:!1}}async function verify(client,argv){let telemetry=new DomainsVerifyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(verifySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:errorMessage(error),next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify --help"),when:"See valid arguments and flags"}]})}let{args,flags}=parsedArgs,[domainName]=args;if(!domainName||args.length!==1)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.MISSING_ARGUMENTS,code:"missing_arguments",message:"A single domain is required.",next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"),when:"Replace <domain> with the domain to check"}],humanMessage:`${getCommandName("domains verify <domain>")} expects one argument`});let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:formatResult.error,next:[{command:buildCommandWithGlobalFlags(client.argv,`domains verify ${shellQuoteCommandArg(domainName)} --json`),when:"Retry with the supported JSON format"}]});telemetry.trackCliArgumentDomain(domainName),telemetry.trackCliOptionProject(flags["--project"]),telemetry.trackCliFlagStrict(flags["--strict"]),telemetry.trackCliOptionFormat(flags["--format"]);let options={domainName,project:flags["--project"],strict:!!flags["--strict"],outputMode:getOutputMode(client,formatResult.jsonOutput)};try{return await run(client,options)}catch(error){return output_manager_default.stopSpinner(),isStructuredOutput(options.outputMode)?writeCommandError(client,options.outputMode,{reason:AGENT_REASON.API_ERROR,code:"api_error",message:errorMessage(error),next:[{command:buildVerifyCommand(client,options),when:"Retry the domain check"}]}):(output_manager_default.prettyError(error),1)}}async function run(client,options){let elapsed=stamp_default();options.outputMode==="human"&&output_manager_default.spinner(`Checking DNS configuration for ${options.domainName}`);let acquisition=await acquireVerificationFacts(client,options);if(output_manager_default.stopSpinner(),!acquisition.ok)return writeCommandError(client,options.outputMode,commandErrorForAcquisition(client,options,acquisition.error));let diagnosis=diagnoseDomain(acquisition.facts,buildDiagnosisCommands(client,options));return isStructuredOutput(options.outputMode)?client.stdout.write(renderStructuredOutput(diagnosis)):writeHumanOutput(renderHumanOutput(diagnosis,elapsed())),diagnosis.exitCode}function getOutputMode(client,jsonOutput){return jsonOutput?"json":shouldEmitNonInteractiveCommandError(client)?"non-interactive":"human"}function isStructuredOutput(mode){return mode!=="human"}function buildDiagnosisCommands(client,options){return{teamsList:buildTeamsListCommand(client),verify:scopeOverride=>buildVerifyCommand(client,options,scopeOverride),attachProject:projectIdOrName=>{let projectArgument=projectIdOrName==="<project>"?projectIdOrName:shellQuoteCommandArg(projectIdOrName);return buildCommandWithGlobalFlags(client.argv,`domains add ${shellQuoteCommandArg(options.domainName)} ${projectArgument}`)},openUrl:openUrlInBrowserCommand}}function commandErrorForAcquisition(client,options,error){let next=error.kind==="permission-denied"?[{command:buildTeamsListCommand(client),when:"List teams to find the scope that owns the project"},{command:buildVerifyCommand(client,options,"<team>"),when:"Replace <team> with the owning team and retry"}]:[{command:error.kind==="invalid-domain"?buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"):buildVerifyCommand(client,options),when:error.kind==="invalid-domain"?"Replace <domain> with a valid domain name":"Retry the domain check"}];return{reason:reasonForAcquisitionError(error),code:error.code,message:error.message,next}}function reasonForAcquisitionError(error){return error.kind==="invalid-domain"?AGENT_REASON.INVALID_DOMAIN:error.kind==="permission-denied"?AGENT_REASON.PERMISSION_DENIED:error.kind==="timeout"?"timeout":error.kind==="unexpected-dns-response"?"unexpected_dns_response":AGENT_REASON.API_ERROR}function buildVerifyCommand(client,options,scopeOverride){let parts=["domains","verify",shellQuoteCommandArg(options.domainName)];return options.project&&parts.push("--project",shellQuoteCommandArg(options.project)),options.strict&&parts.push("--strict"),options.outputMode==="json"&&parts.push("--json"),scopeOverride&&parts.push("--scope",scopeOverride),buildCommandWithGlobalFlags(client.argv,parts.join(" "),packageName,scopeOverride?{excludeFlags:["--scope","--team","-S","-T"]}:void 0)}function buildTeamsListCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams ls",packageName,{excludeFlags:["--scope","--team","-S","-T"]})}function shellQuoteCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`"${value.replace(/(["\\$`])/g,"\\$1")}"`}function writeCommandError(client,outputMode,error){return output_manager_default.stopSpinner(),isStructuredOutput(outputMode)?client.stdout.write(renderStructuredError(error)):output_manager_default.error(error.humanMessage??error.message),getExitCodeForReason(error.reason)}function writeHumanOutput(result){result.lead.kind==="success"?output_manager_default.success(result.lead.message):output_manager_default.log(result.lead.message);for(let section of result.sections)output_manager_default.print(section)}function errorMessage(error){return error instanceof Error?error.message:String(error)}var DomainsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandMove(actual){this.trackCliSubcommand({subcommand:"move",value:actual})}trackCliSubcommandBuy(actual){this.trackCliSubcommand({subcommand:"buy",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandPrice(actual){this.trackCliSubcommand({subcommand:"price",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandTransferIn(actual){this.trackCliSubcommand({subcommand:"transfer-in",value:actual})}trackCliSubcommandRenew(actual){this.trackCliSubcommand({subcommand:"renew",value:actual})}trackCliSubcommandAutoRenew(actual){this.trackCliSubcommand({subcommand:"auto-renew",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandVerify(actual){this.trackCliSubcommand({subcommand:"verify",value:actual})}};var COMMAND_CONFIG10={add:["add"],buy:["buy"],check:["check"],inspect:["inspect"],ls:["ls","list"],move:["move"],price:["price"],search:["search"],rm:["rm","remove"],transferIn:["transfer-in"],renew:["renew"],autoRenew:["auto-renew"],verify:["verify"]};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(domainsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),2}let telemetry=new DomainsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("domains"),output_manager_default.print(help(domainsCommand,{columns:client.stderr.columns})),0;function printHelp(command){return output_manager_default.print(help(command,{parent:domainsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(addSubcommand)):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(inspectSubcommand2)):(telemetry.trackCliSubcommandInspect(subcommandOriginal),inspect4(client,args));case"move":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(moveSubcommand)):(telemetry.trackCliSubcommandMove(subcommandOriginal),move(client,args));case"buy":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(buySubcommand)):(telemetry.trackCliSubcommandBuy(subcommandOriginal),buy(client,args));case"check":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(checkSubcommand)):(telemetry.trackCliSubcommandCheck(subcommandOriginal),check(client,args));case"price":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(priceSubcommand)):(telemetry.trackCliSubcommandPrice(subcommandOriginal),price(client,args));case"search":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(searchSubcommand)):(telemetry.trackCliSubcommandSearch(subcommandOriginal),search(client,args));case"rm":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(removeSubcommand2)):(telemetry.trackCliSubcommandRemove(subcommandOriginal),rm(client,args));case"transferIn":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(transferInSubcommand)):(telemetry.trackCliSubcommandTransferIn(subcommandOriginal),transferIn(client,args));case"renew":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(renewSubcommand)):(telemetry.trackCliSubcommandRenew(subcommandOriginal),renew(client,args));case"autoRenew":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(autoRenewSubcommand)):(telemetry.trackCliSubcommandAutoRenew(subcommandOriginal),autoRenew(client,args));case"verify":return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(verifySubcommand)):(telemetry.trackCliSubcommandVerify(subcommandOriginal),verify(client,args));default:return needHelp?(telemetry.trackCliFlagHelp("domains",subcommandOriginal),printHelp(listSubcommand2)):(telemetry.trackCliSubcommandList(subcommandOriginal),ls(client,args))}}var import_chalk41=__toESM(require_source(),1);import{homedir as homedir2}from"node:os";var import_execa=__toESM(require_execa(),1);init_main();import{isAbsolute as isAbsolute6,join as join29}from"node:path";var PLUGIN_SOURCE="github:vercel/vercel-plugin",PLUGIN_ID="vercel-plugin";async function openCodeMajorVersion(){try{let{stdout}=await(0,import_execa.default)("opencode",["--version"],{stdin:"ignore",timeout:1e4}),match=/(\d+)\.\d+\.\d+/.exec(stdout);return match?Number(match[1]):void 0}catch{return}}function selectsPlugin(selector){return selector==="*"||(selector.endsWith(".*")?PLUGIN_ID.startsWith(selector.slice(0,-1)):selector===PLUGIN_ID)}async function pluginConfigState(home){let xdg=process.env.XDG_CONFIG_HOME,dir=process.env.OPENCODE_CONFIG_DIR||join29(xdg&&isAbsolute6(xdg)?xdg:join29(home,".config"),"opencode"),state={status:"missing"};for(let file of["opencode.json","opencode.jsonc"]){let path=join29(dir,file),text=await readFileOrNull(path);if(!text)continue;let errors=[],config=parse2(text,errors,{allowTrailingComma:!0});if(errors.length>0||!Array.isArray(config?.plugins))continue;let plugins=config.plugins;for(let entry2 of plugins){if(typeof entry2=="string"&&entry2.startsWith("-")){state.status!=="missing"&&selectsPlugin(entry2.slice(1))&&(state={status:"disabled",rule:entry2,file:path});continue}let target=typeof entry2=="string"?entry2:entry2?.package;(target===PLUGIN_SOURCE||state.status!=="missing"&&target&&selectsPlugin(target))&&(state={status:"enabled"})}}return state}async function setupOpenCodePlugin(client,opts){let majorVersion=await openCodeMajorVersion();if(majorVersion===void 0)return{status:"not_detected",message:"OpenCode was not detected on this machine."};if(majorVersion<2)return{status:"unsupported",message:"The Vercel plugin needs OpenCode 2. Upgrade OpenCode, then re-run `vercel setup plugin --agent opencode`."};let state=await pluginConfigState(opts.home);if(state.status==="disabled")return{status:"disabled",message:`The Vercel plugin is disabled by "${state.rule}" in ${state.file}. Remove that entry or add "${PLUGIN_ID}" after it to enable the plugin.`};if(state.status==="enabled")return{status:"up_to_date",message:"Vercel plugin for OpenCode is installed."};if(opts.dryRun)return{status:"dry_run",action:"install",message:"Setup would install the Vercel plugin for OpenCode."};if(!opts.yes){if(!opts.canPrompt)return{status:"confirmation_required",message:"Re-run with --yes to install the Vercel plugin for OpenCode."};if(printAlignedLabel("Plugin",`Vercel for OpenCode (${PLUGIN_SOURCE})`),!await client.input.confirm("Install this plugin?",!0))return{status:"declined",message:"Skipped the Vercel plugin for OpenCode."}}output_manager_default.spinner("Installing the Vercel plugin for OpenCode\u2026");try{await(0,import_execa.default)("opencode",["plugin","add",PLUGIN_SOURCE],{stdin:"ignore",timeout:12e4})}catch{return{status:"failed",message:`Failed to install the Vercel plugin for OpenCode. Run \`opencode plugin add ${PLUGIN_SOURCE}\` to finish setup.`}}finally{output_manager_default.stopSpinner()}return{status:"installed",message:"Installed the Vercel plugin for OpenCode. Restart OpenCode, then run /mcps to sign in to the Vercel MCP server."}}var SetupTelemetryClient=class extends TelemetryClient{trackCliSubcommandPlugin(actual){this.trackCliSubcommand({subcommand:"plugin",value:actual})}trackCliSubcommandGateway(actual){this.trackCliSubcommand({subcommand:"gateway",value:actual})}trackCliSubcommandSkills(actual){this.trackCliSubcommand({subcommand:"skills",value:actual})}trackCliOptionAgent(agents){for(let agent of agents??[])this.trackCliOption({option:"agent",value:agent})}trackCliFlagPlugin(v){v&&this.trackCliFlag("plugin")}trackCliFlagGateway(v){v&&this.trackCliFlag("gateway")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionKey(v){v!==void 0&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliFlagReconfigure(v){v&&this.trackCliFlag("reconfigure")}trackCliFlagNoSessionMigration(v){v&&this.trackCliFlag("no-session-migration")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};var COMMAND_CONFIG11={plugin:getCommandAliases(pluginSubcommand),gateway:getCommandAliases(gatewaySubcommand),skills:getCommandAliases(skillsSubcommand)},STEP_LABELS={plugin:"Vercel plugin",gateway:"AI Gateway"};async function setup(client){let machine=shouldEmitNonInteractiveCommandError(client),telemetry=new SetupTelemetryClient({opts:{store:client.telemetryEventStore}}),routingArgs;try{routingArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(setupCommand.options),{permissive:!0})}catch(error){return printError(error),2}let{subcommand,subcommandOriginal}=getSubcommand(routingArgs.args.slice(1),COMMAND_CONFIG11);if(subcommand==="skills"){if(routingArgs.flags["--help"])return telemetry.trackCliFlagHelp("setup",subcommandOriginal),output_manager_default.print(help(skillsSubcommand,{parent:setupCommand,columns:client.stderr.columns})),0;telemetry.trackCliSubcommandSkills(subcommandOriginal);let{default:setupSkills}=await import("./chunks/skills-4J2NC2QI.js");return setupSkills(client)}let stepSubcommand=subcommand==="plugin"||subcommand==="gateway"?subcommand:void 0,command=stepSubcommand==="plugin"?pluginSubcommand:stepSubcommand==="gateway"?gatewaySubcommand:setupCommand,parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(command.options))}catch(error){return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,`Invalid setup arguments. Run vercel setup${stepSubcommand?` ${stepSubcommand}`:""} --help for usage.`),printError(error),2}let flags=parsedArgs.flags;if(flags["--help"])return telemetry.trackCliFlagHelp("setup",stepSubcommand?subcommandOriginal:void 0),output_manager_default.print(help(command,{parent:stepSubcommand?setupCommand:void 0,columns:client.stderr.columns})),0;if(parsedArgs.args.length>(stepSubcommand?2:1)){let message="The setup command does not accept positional arguments. Use vercel setup plugin, gateway, or skills to run one step.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),2}flags["--plugin"]&&warnDeprecatedSubcommand(client,"setup --plugin","setup plugin"),flags["--gateway"]&&warnDeprecatedSubcommand(client,"setup --gateway","setup gateway");let onlyPlugin=stepSubcommand==="plugin"||!!flags["--plugin"],onlyGateway=stepSubcommand==="gateway"||!!flags["--gateway"],dryRun=flags["--dry-run"],yes=flags["--yes"],agents=flags["--agent"]?[...new Set(flags["--agent"].map(agent=>agent.toLowerCase()))]:void 0;if(agents?.some(agent=>!getAgentById(agent)||onlyPlugin&&!onlyGateway&&!["claude-code","codex","opencode"].includes(agent))){let message=onlyPlugin&&!onlyGateway?"Plugin setup supports --agent claude-code, --agent codex, and --agent opencode.":"Unknown coding agent. Run vercel ai-gateway setup --help for supported agents.";return machine&&writeSetupError(client,AGENT_REASON.INVALID_ARGUMENTS,message),output_manager_default.fatal(message),2}stepSubcommand==="plugin"?telemetry.trackCliSubcommandPlugin(subcommandOriginal):stepSubcommand==="gateway"&&telemetry.trackCliSubcommandGateway(subcommandOriginal),telemetry.trackCliOptionAgent(agents),telemetry.trackCliFlagPlugin(flags["--plugin"]),telemetry.trackCliFlagGateway(flags["--gateway"]),telemetry.trackCliFlagDryRun(dryRun),telemetry.trackCliFlagYes(yes),telemetry.trackCliFlagAll(flags["--all"]),telemetry.trackCliOptionKey(flags["--key"]),telemetry.trackCliFlagReconfigure(flags["--reconfigure"]),telemetry.trackCliFlagNoSessionMigration(flags["--no-session-migration"]);let steps=[];(onlyPlugin||!onlyGateway)&&steps.push("plugin"),(onlyGateway||!onlyPlugin)&&steps.push("gateway");let canPrompt2=!!client.stdin.isTTY&&!machine,home=homedir2(),outcomes=new Map;try{for(let step of steps){output_manager_default.print(`
193
+ ${import_chalk41.default.bold(` ${STEP_LABELS[step]}`)}
194
+ `);let outcome=step==="plugin"?await runPluginStep(client,{yes:!!yes,dryRun:!!dryRun,canPrompt:canPrompt2,home,machine,onlyStep:steps.length===1,agents}):await runGatewayStep(client,{yes:!!yes,dryRun:!!dryRun,agents,all:!!flags["--all"],key:flags["--key"],reconfigure:!!flags["--reconfigure"],noSessionMigration:!!flags["--no-session-migration"]});if(outcomes.set(step,outcome),machine&&!outcome.ok)break}}catch(error){return output_manager_default.stopSpinner(),machine&&writeSetupError(client,"setup_failed","Failed to complete setup."),printError(error),1}let failed=[...outcomes.values()].some(o=>!o.ok),complete=[...outcomes.values()].every(o=>o.complete),gutter=failed?import_chalk41.default.red("\u2717"):complete?import_chalk41.default.green("\u2713"):" ",heading=complete?dryRun?"Dry run complete":"Setup complete":"Setup incomplete";output_manager_default.print(`
195
+ ${gutter} ${import_chalk41.default.bold(heading)}
196
+ `);for(let[step,outcome]of outcomes)printAlignedLabel(STEP_LABELS[step],outcome.summary);return failed?1:0}function writeSetupError(client,reason,message){client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,message},null,2)}
197
+ `)}async function runPluginStep(client,opts){let targets=[{agent:"claude-code",name:"Claude Code",setup:setupVercelPlugin},{agent:"codex",name:"Codex",setup:setupCodexPlugin},{agent:"opencode",name:"OpenCode",setup:setupOpenCodePlugin}].filter(target=>!opts.agents||opts.agents.includes(target.agent)),results=[];for(let target of targets){let result2=await target.setup(client,opts);results.push({...result2,agent:target.agent,name:target.name})}let detected=results.filter(result2=>result2.status!=="not_detected"),visible=detected.length>0?detected:results;for(let result2 of visible)output_manager_default.print(` ${result2.message}
198
+ `);let result=["failed","confirmation_required","declined","disabled","installed","enabled","updated","dry_run","up_to_date","unsupported","not_detected"].map(status=>results.find(result2=>result2.status===status)).find(result2=>result2!==void 0)??{status:"not_detected",message:"No Vercel plugin is available for the selected agents."},message=visible.map(result2=>result2.message).join(" ")||result.message;visible.length===0&&output_manager_default.print(` ${message}
199
+ `);let confirmationRequired=result.status==="confirmation_required",ok=result.status!=="failed"&&!confirmationRequired;return opts.machine&&(opts.onlyStep||!ok)&&client.stdout.write(`${JSON.stringify({status:confirmationRequired?AGENT_STATUS.ACTION_REQUIRED:ok?AGENT_STATUS.OK:AGENT_STATUS.ERROR,reason:confirmationRequired?AGENT_REASON.CONFIRMATION_REQUIRED:`plugin_${result.status}`,message,plugins:results,...confirmationRequired&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`setup${opts.onlyStep?" plugin":""}${opts.agents?.map(agent=>` --agent ${agent}`).join("")??""} --yes`,void 0,{globalFlags:"all"})}]}},null,2)}
200
+ `),{ok,complete:ok&&!["declined","disabled","unsupported"].includes(result.status),summary:visible.length>0?visible.map(result2=>summarizePlugin(result2,result2.name)).join("; "):"Skipped (no plugin available for the selected agents)"}}function summarizePlugin(result,name){switch(result.status){case"installed":return`Installed for ${name}`;case"enabled":return`Enabled for ${name}`;case"updated":return`Updated for ${name}`;case"up_to_date":return`Already installed for ${name}`;case"not_detected":return`Skipped (${name} not detected)`;case"unsupported":return`Skipped (${name} needs an upgrade)`;case"disabled":return`Disabled in ${name} config`;case"declined":return`Skipped for ${name}`;case"confirmation_required":return`Confirmation required for ${name} (re-run with --yes)`;case"dry_run":return`Would ${result.action??"install"} for ${name}`;case"failed":return`Failed for ${name}`}}async function runGatewayStep(client,opts){let argv=[];opts.yes&&argv.push("--yes"),opts.dryRun&&argv.push("--dry-run");for(let agent of opts.agents??[])argv.push("--agent",agent);opts.all&&argv.push("--all"),opts.key!==void 0&&argv.push("--key",opts.key),opts.reconfigure&&argv.push("--reconfigure"),opts.noSessionMigration&&argv.push("--no-session-migration");let result=await setupCodingAgents(client,argv),summaries={configured:"Completed (see above)",already_configured:"Already configured",dry_run:"Previewed (see above)",canceled:"Canceled (no changes applied)",skipped:"Skipped (see above)",agent_prompt:"Prompt generated (apply it with your agent)",failed:"Failed \u2014 see the messages above"};return{ok:result.exitCode===0,complete:result.exitCode===0&&result.outcome!=="canceled"&&result.outcome!=="skipped"&&result.outcome!=="agent_prompt",summary:summaries[result.outcome]}}async function tokenPass(client){let originalArgv=[...client.argv],tokens=tokensAfterCommand(originalArgv),commandIndex=originalArgv.length-tokens.length-1;originalArgv[commandIndex]==="tokenpass"&&warnDeprecatedSubcommand(client,"tokenpass","token-pass");let{args}=getSubcommand(tokens,{setup:["setup"]}),forwarded=[...originalArgv.slice(2,commandIndex),"--token-pass",...args];client.setArgv([...originalArgv.slice(0,2),"ai-gateway","coding-agents","setup",...forwarded]);try{return await codingAgentsSetup(client,forwarded)}finally{client.setArgv(originalArgv)}}export{main as aiGateway,main2 as domains,setup,tokenPass};