convex 1.40.0 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/browser/simple_client-node.js +85 -27
  5. package/dist/cjs/browser/simple_client-node.js.map +3 -3
  6. package/dist/cjs/cli/aiFiles.js +2 -2
  7. package/dist/cjs/cli/aiFiles.js.map +1 -1
  8. package/dist/cjs/cli/configure.js +1 -4
  9. package/dist/cjs/cli/configure.js.map +2 -2
  10. package/dist/cjs/cli/convexExport.js +3 -3
  11. package/dist/cjs/cli/convexExport.js.map +1 -1
  12. package/dist/cjs/cli/convexImport.js +2 -2
  13. package/dist/cjs/cli/convexImport.js.map +1 -1
  14. package/dist/cjs/cli/dashboard.js +19 -6
  15. package/dist/cjs/cli/dashboard.js.map +3 -3
  16. package/dist/cjs/cli/data.js +2 -2
  17. package/dist/cjs/cli/data.js.map +1 -1
  18. package/dist/cjs/cli/deploy.js +5 -5
  19. package/dist/cjs/cli/deploy.js.map +2 -2
  20. package/dist/cjs/cli/deploymentCreate.js +11 -5
  21. package/dist/cjs/cli/deploymentCreate.js.map +2 -2
  22. package/dist/cjs/cli/deploymentSelect.js +5 -5
  23. package/dist/cjs/cli/deploymentSelect.js.map +1 -1
  24. package/dist/cjs/cli/deploymentTokenCreate.js +5 -13
  25. package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
  26. package/dist/cjs/cli/deploymentTokenDelete.js +4 -11
  27. package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
  28. package/dist/cjs/cli/dev.js +6 -5
  29. package/dist/cjs/cli/dev.js.map +2 -2
  30. package/dist/cjs/cli/env.js +25 -18
  31. package/dist/cjs/cli/env.js.map +2 -2
  32. package/dist/cjs/cli/envDefault.js +20 -15
  33. package/dist/cjs/cli/envDefault.js.map +2 -2
  34. package/dist/cjs/cli/insights.js +14 -4
  35. package/dist/cjs/cli/insights.js.map +2 -2
  36. package/dist/cjs/cli/lib/aiFiles/skills.js +2 -2
  37. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  38. package/dist/cjs/cli/lib/command.js +1 -1
  39. package/dist/cjs/cli/lib/command.js.map +1 -1
  40. package/dist/cjs/cli/lib/deployment.js.map +1 -1
  41. package/dist/cjs/cli/lib/deploymentSelection.js +39 -0
  42. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  43. package/dist/cjs/cli/lib/dev.js +31 -0
  44. package/dist/cjs/cli/lib/dev.js.map +2 -2
  45. package/dist/cjs/cli/lib/env.js +5 -1
  46. package/dist/cjs/cli/lib/env.js.map +2 -2
  47. package/dist/cjs/cli/lib/generateDocs.js +256 -0
  48. package/dist/cjs/cli/lib/generateDocs.js.map +7 -0
  49. package/dist/cjs/cli/lib/localDeployment/anonymous.js +24 -49
  50. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +3 -3
  51. package/dist/cjs/cli/lib/localDeployment/bigBrain.js +0 -9
  52. package/dist/cjs/cli/lib/localDeployment/bigBrain.js.map +2 -2
  53. package/dist/cjs/cli/lib/localDeployment/dashboard.js +30 -68
  54. package/dist/cjs/cli/lib/localDeployment/dashboard.js.map +2 -2
  55. package/dist/cjs/cli/lib/localDeployment/download.js +14 -1
  56. package/dist/cjs/cli/lib/localDeployment/download.js.map +2 -2
  57. package/dist/cjs/cli/lib/localDeployment/filePaths.js +33 -4
  58. package/dist/cjs/cli/lib/localDeployment/filePaths.js.map +2 -2
  59. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +37 -126
  60. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +3 -3
  61. package/dist/cjs/cli/lib/localDeployment/secrets.js +91 -0
  62. package/dist/cjs/cli/lib/localDeployment/secrets.js.map +7 -0
  63. package/dist/cjs/cli/lib/localDeployment/upgrade.js +43 -28
  64. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
  65. package/dist/cjs/cli/lib/localDeployment/utils.js +0 -19
  66. package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
  67. package/dist/cjs/cli/lib/login.js +16 -12
  68. package/dist/cjs/cli/lib/login.js.map +2 -2
  69. package/dist/cjs/cli/lib/logs.js +4 -1
  70. package/dist/cjs/cli/lib/logs.js.map +2 -2
  71. package/dist/cjs/cli/lib/run.js +27 -2
  72. package/dist/cjs/cli/lib/run.js.map +2 -2
  73. package/dist/cjs/cli/lib/runTestFunction.js +3 -3
  74. package/dist/cjs/cli/lib/runTestFunction.js.map +1 -1
  75. package/dist/cjs/cli/lib/utils/utils.js +30 -0
  76. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  77. package/dist/cjs/cli/program.js +2 -1
  78. package/dist/cjs/cli/program.js.map +2 -2
  79. package/dist/cjs/cli/project.js +27 -0
  80. package/dist/cjs/cli/project.js.map +7 -0
  81. package/dist/cjs/cli/projectCreate.js +90 -0
  82. package/dist/cjs/cli/projectCreate.js.map +7 -0
  83. package/dist/cjs/cli/run.js +5 -5
  84. package/dist/cjs/cli/run.js.map +1 -1
  85. package/dist/cjs/index.js +1 -1
  86. package/dist/cjs/index.js.map +1 -1
  87. package/dist/cjs/server/database.js.map +1 -1
  88. package/dist/cjs/server/impl/meta_impl.js +6 -6
  89. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  90. package/dist/cjs/server/impl/registration_impl.js +9 -3
  91. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  92. package/dist/cjs/server/index.js.map +2 -2
  93. package/dist/cjs/server/meta.js.map +1 -1
  94. package/dist/cjs/server/query.js.map +1 -1
  95. package/dist/cjs/server/registration.js.map +1 -1
  96. package/dist/cjs/server/storage.js.map +1 -1
  97. package/dist/cjs/server/system_fields.js.map +1 -1
  98. package/dist/cjs-types/cli/configure.d.ts +3 -2
  99. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/dashboard.d.ts.map +1 -1
  101. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  102. package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  104. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  105. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  106. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  107. package/dist/cjs-types/cli/insights.d.ts +1 -0
  108. package/dist/cjs-types/cli/insights.d.ts.map +1 -1
  109. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  110. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +16 -16
  111. package/dist/cjs-types/cli/lib/deployment.d.ts +0 -2
  112. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +7 -0
  114. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  115. package/dist/cjs-types/cli/lib/dev.d.ts +2 -1
  116. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/lib/env.d.ts +3 -1
  118. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/lib/env.test.d.ts +2 -0
  120. package/dist/cjs-types/cli/lib/env.test.d.ts.map +1 -0
  121. package/dist/cjs-types/cli/lib/generateDocs.d.ts +20 -0
  122. package/dist/cjs-types/cli/lib/generateDocs.d.ts.map +1 -0
  123. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +2 -0
  124. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  125. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  126. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  128. package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  130. package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts +11 -1
  132. package/dist/cjs-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  134. package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  136. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  137. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  138. package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  139. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  140. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  141. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  142. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  143. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +0 -2
  144. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  146. package/dist/cjs-types/cli/lib/logs.d.ts +1 -1
  147. package/dist/cjs-types/cli/lib/logs.d.ts.map +1 -1
  148. package/dist/cjs-types/cli/lib/run.d.ts +1 -1
  149. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  150. package/dist/cjs-types/cli/lib/utils/utils.d.ts +10 -0
  151. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  152. package/dist/cjs-types/cli/lib/versionApi.d.ts +2 -2
  153. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  154. package/dist/cjs-types/cli/project.d.ts +3 -0
  155. package/dist/cjs-types/cli/project.d.ts.map +1 -0
  156. package/dist/cjs-types/cli/projectCreate.d.ts +5 -0
  157. package/dist/cjs-types/cli/projectCreate.d.ts.map +1 -0
  158. package/dist/cjs-types/index.d.ts +1 -1
  159. package/dist/cjs-types/server/database.d.ts +21 -3
  160. package/dist/cjs-types/server/database.d.ts.map +1 -1
  161. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  162. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  163. package/dist/cjs-types/server/index.d.ts +2 -2
  164. package/dist/cjs-types/server/index.d.ts.map +1 -1
  165. package/dist/cjs-types/server/meta.d.ts +26 -0
  166. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  167. package/dist/cjs-types/server/query.d.ts +1 -1
  168. package/dist/cjs-types/server/registration.d.ts +23 -5
  169. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  170. package/dist/cjs-types/server/storage.d.ts +20 -3
  171. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  172. package/dist/cli.bundle.cjs +67155 -68245
  173. package/dist/cli.bundle.cjs.map +4 -4
  174. package/dist/esm/browser/simple_client-node.js +85 -27
  175. package/dist/esm/browser/simple_client-node.js.map +3 -3
  176. package/dist/esm/cli/aiFiles.js +2 -2
  177. package/dist/esm/cli/aiFiles.js.map +1 -1
  178. package/dist/esm/cli/configure.js +1 -4
  179. package/dist/esm/cli/configure.js.map +2 -2
  180. package/dist/esm/cli/convexExport.js +3 -3
  181. package/dist/esm/cli/convexExport.js.map +1 -1
  182. package/dist/esm/cli/convexImport.js +2 -2
  183. package/dist/esm/cli/convexImport.js.map +1 -1
  184. package/dist/esm/cli/dashboard.js +16 -3
  185. package/dist/esm/cli/dashboard.js.map +2 -2
  186. package/dist/esm/cli/data.js +2 -2
  187. package/dist/esm/cli/data.js.map +1 -1
  188. package/dist/esm/cli/deploy.js +5 -5
  189. package/dist/esm/cli/deploy.js.map +2 -2
  190. package/dist/esm/cli/deploymentCreate.js +13 -9
  191. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  192. package/dist/esm/cli/deploymentSelect.js +5 -5
  193. package/dist/esm/cli/deploymentSelect.js.map +1 -1
  194. package/dist/esm/cli/deploymentTokenCreate.js +9 -15
  195. package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
  196. package/dist/esm/cli/deploymentTokenDelete.js +8 -16
  197. package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
  198. package/dist/esm/cli/dev.js +6 -5
  199. package/dist/esm/cli/dev.js.map +2 -2
  200. package/dist/esm/cli/env.js +25 -18
  201. package/dist/esm/cli/env.js.map +2 -2
  202. package/dist/esm/cli/envDefault.js +20 -15
  203. package/dist/esm/cli/envDefault.js.map +2 -2
  204. package/dist/esm/cli/insights.js +14 -4
  205. package/dist/esm/cli/insights.js.map +2 -2
  206. package/dist/esm/cli/lib/aiFiles/skills.js +2 -2
  207. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  208. package/dist/esm/cli/lib/command.js +1 -1
  209. package/dist/esm/cli/lib/command.js.map +1 -1
  210. package/dist/esm/cli/lib/deployment.js.map +1 -1
  211. package/dist/esm/cli/lib/deploymentSelection.js +38 -0
  212. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  213. package/dist/esm/cli/lib/dev.js +31 -0
  214. package/dist/esm/cli/lib/dev.js.map +2 -2
  215. package/dist/esm/cli/lib/env.js +5 -1
  216. package/dist/esm/cli/lib/env.js.map +2 -2
  217. package/dist/esm/cli/lib/generateDocs.js +233 -0
  218. package/dist/esm/cli/lib/generateDocs.js.map +7 -0
  219. package/dist/esm/cli/lib/localDeployment/anonymous.js +30 -61
  220. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +3 -3
  221. package/dist/esm/cli/lib/localDeployment/bigBrain.js +0 -8
  222. package/dist/esm/cli/lib/localDeployment/bigBrain.js.map +2 -2
  223. package/dist/esm/cli/lib/localDeployment/dashboard.js +36 -69
  224. package/dist/esm/cli/lib/localDeployment/dashboard.js.map +2 -2
  225. package/dist/esm/cli/lib/localDeployment/download.js +15 -2
  226. package/dist/esm/cli/lib/localDeployment/download.js.map +2 -2
  227. package/dist/esm/cli/lib/localDeployment/filePaths.js +29 -2
  228. package/dist/esm/cli/lib/localDeployment/filePaths.js.map +2 -2
  229. package/dist/esm/cli/lib/localDeployment/localDeployment.js +40 -134
  230. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +3 -3
  231. package/dist/esm/cli/lib/localDeployment/secrets.js +57 -0
  232. package/dist/esm/cli/lib/localDeployment/secrets.js.map +7 -0
  233. package/dist/esm/cli/lib/localDeployment/upgrade.js +45 -28
  234. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +3 -3
  235. package/dist/esm/cli/lib/localDeployment/utils.js +0 -7
  236. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  237. package/dist/esm/cli/lib/login.js +18 -13
  238. package/dist/esm/cli/lib/login.js.map +2 -2
  239. package/dist/esm/cli/lib/logs.js +5 -2
  240. package/dist/esm/cli/lib/logs.js.map +2 -2
  241. package/dist/esm/cli/lib/run.js +32 -3
  242. package/dist/esm/cli/lib/run.js.map +2 -2
  243. package/dist/esm/cli/lib/runTestFunction.js +3 -3
  244. package/dist/esm/cli/lib/runTestFunction.js.map +1 -1
  245. package/dist/esm/cli/lib/utils/utils.js +29 -0
  246. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  247. package/dist/esm/cli/program.js +2 -1
  248. package/dist/esm/cli/program.js.map +2 -2
  249. package/dist/esm/cli/project.js +5 -0
  250. package/dist/esm/cli/project.js.map +7 -0
  251. package/dist/esm/cli/projectCreate.js +68 -0
  252. package/dist/esm/cli/projectCreate.js.map +7 -0
  253. package/dist/esm/cli/run.js +5 -5
  254. package/dist/esm/cli/run.js.map +1 -1
  255. package/dist/esm/index.js +1 -1
  256. package/dist/esm/index.js.map +1 -1
  257. package/dist/esm/server/impl/meta_impl.js +6 -6
  258. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  259. package/dist/esm/server/impl/registration_impl.js +9 -3
  260. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  261. package/dist/esm/server/index.js.map +2 -2
  262. package/dist/esm-types/cli/configure.d.ts +3 -2
  263. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  264. package/dist/esm-types/cli/dashboard.d.ts.map +1 -1
  265. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  266. package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  267. package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  268. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  269. package/dist/esm-types/cli/env.d.ts.map +1 -1
  270. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  271. package/dist/esm-types/cli/insights.d.ts +1 -0
  272. package/dist/esm-types/cli/insights.d.ts.map +1 -1
  273. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
  274. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +16 -16
  275. package/dist/esm-types/cli/lib/deployment.d.ts +0 -2
  276. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  277. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +7 -0
  278. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  279. package/dist/esm-types/cli/lib/dev.d.ts +2 -1
  280. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  281. package/dist/esm-types/cli/lib/env.d.ts +3 -1
  282. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  283. package/dist/esm-types/cli/lib/env.test.d.ts +2 -0
  284. package/dist/esm-types/cli/lib/env.test.d.ts.map +1 -0
  285. package/dist/esm-types/cli/lib/generateDocs.d.ts +20 -0
  286. package/dist/esm-types/cli/lib/generateDocs.d.ts.map +1 -0
  287. package/dist/esm-types/cli/lib/generateDocs.test.d.ts +2 -0
  288. package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +1 -0
  289. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
  290. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  291. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
  292. package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
  293. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
  294. package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
  295. package/dist/esm-types/cli/lib/localDeployment/download.d.ts +11 -1
  296. package/dist/esm-types/cli/lib/localDeployment/download.d.ts.map +1 -1
  297. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
  298. package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
  299. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
  300. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  301. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts +31 -0
  302. package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
  303. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
  304. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
  305. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
  306. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  307. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +0 -2
  308. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  309. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  310. package/dist/esm-types/cli/lib/logs.d.ts +1 -1
  311. package/dist/esm-types/cli/lib/logs.d.ts.map +1 -1
  312. package/dist/esm-types/cli/lib/run.d.ts +1 -1
  313. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  314. package/dist/esm-types/cli/lib/utils/utils.d.ts +10 -0
  315. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  316. package/dist/esm-types/cli/lib/versionApi.d.ts +2 -2
  317. package/dist/esm-types/cli/program.d.ts.map +1 -1
  318. package/dist/esm-types/cli/project.d.ts +3 -0
  319. package/dist/esm-types/cli/project.d.ts.map +1 -0
  320. package/dist/esm-types/cli/projectCreate.d.ts +5 -0
  321. package/dist/esm-types/cli/projectCreate.d.ts.map +1 -0
  322. package/dist/esm-types/index.d.ts +1 -1
  323. package/dist/esm-types/server/database.d.ts +21 -3
  324. package/dist/esm-types/server/database.d.ts.map +1 -1
  325. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  326. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  327. package/dist/esm-types/server/index.d.ts +2 -2
  328. package/dist/esm-types/server/index.d.ts.map +1 -1
  329. package/dist/esm-types/server/meta.d.ts +26 -0
  330. package/dist/esm-types/server/meta.d.ts.map +1 -1
  331. package/dist/esm-types/server/query.d.ts +1 -1
  332. package/dist/esm-types/server/registration.d.ts +23 -5
  333. package/dist/esm-types/server/registration.d.ts.map +1 -1
  334. package/dist/esm-types/server/storage.d.ts +20 -3
  335. package/dist/esm-types/server/storage.d.ts.map +1 -1
  336. package/dist/react.bundle.js +1 -1
  337. package/dist/react.bundle.js.map +1 -1
  338. package/package.json +7 -5
  339. package/src/browser/sync/request_manager.test.ts +2 -2
  340. package/src/cli/aiFiles.ts +2 -2
  341. package/src/cli/configure.ts +4 -6
  342. package/src/cli/convexExport.ts +3 -3
  343. package/src/cli/convexImport.ts +2 -2
  344. package/src/cli/dashboard.ts +29 -3
  345. package/src/cli/data.ts +2 -2
  346. package/src/cli/deploy.ts +5 -5
  347. package/src/cli/deploymentCreate.test.ts +151 -24
  348. package/src/cli/deploymentCreate.ts +21 -11
  349. package/src/cli/deploymentSelect.ts +5 -5
  350. package/src/cli/deploymentSelection.test.ts +0 -3
  351. package/src/cli/deploymentToken.test.ts +34 -23
  352. package/src/cli/deploymentTokenCreate.ts +9 -21
  353. package/src/cli/deploymentTokenDelete.ts +8 -23
  354. package/src/cli/dev.ts +5 -4
  355. package/src/cli/env.ts +29 -19
  356. package/src/cli/envDefault.ts +21 -15
  357. package/src/cli/insights.ts +15 -3
  358. package/src/cli/lib/aiFiles/integration.test.ts +2 -0
  359. package/src/cli/lib/aiFiles/skills.ts +3 -3
  360. package/src/cli/lib/command.ts +2 -2
  361. package/src/cli/lib/deployment.ts +0 -5
  362. package/src/cli/lib/deploymentSelection.ts +67 -0
  363. package/src/cli/lib/dev.ts +39 -0
  364. package/src/cli/lib/env.test.ts +60 -0
  365. package/src/cli/lib/env.ts +9 -1
  366. package/src/cli/lib/generateDocs.test.ts +326 -0
  367. package/src/cli/lib/generateDocs.ts +393 -0
  368. package/src/cli/lib/localDeployment/anonymous.ts +48 -72
  369. package/src/cli/lib/localDeployment/bigBrain.ts +7 -15
  370. package/src/cli/lib/localDeployment/dashboard.ts +48 -80
  371. package/src/cli/lib/localDeployment/download.ts +34 -3
  372. package/src/cli/lib/localDeployment/filePaths.ts +66 -6
  373. package/src/cli/lib/localDeployment/localDeployment.ts +46 -184
  374. package/src/cli/lib/localDeployment/run.test.ts +6 -6
  375. package/src/cli/lib/localDeployment/secrets.test.ts +53 -0
  376. package/src/cli/lib/localDeployment/secrets.ts +93 -0
  377. package/src/cli/lib/localDeployment/tests/keygenFailure.mjs +9 -0
  378. package/src/cli/lib/localDeployment/tests/keygenSuccess.mjs +31 -0
  379. package/src/cli/lib/localDeployment/upgrade.ts +52 -38
  380. package/src/cli/lib/localDeployment/utils.ts +0 -10
  381. package/src/cli/lib/login.ts +18 -18
  382. package/src/cli/lib/logs.ts +7 -2
  383. package/src/cli/lib/run.ts +37 -3
  384. package/src/cli/lib/runTestFunction.ts +3 -3
  385. package/src/cli/lib/utils/utils.ts +56 -0
  386. package/src/cli/program.ts +2 -0
  387. package/src/cli/project.ts +7 -0
  388. package/src/cli/projectCreate.ts +99 -0
  389. package/src/cli/run.ts +5 -5
  390. package/src/index.ts +1 -1
  391. package/src/server/database.ts +21 -3
  392. package/src/server/impl/meta_impl.ts +7 -6
  393. package/src/server/impl/registration_impl.ts +11 -5
  394. package/src/server/index.ts +2 -0
  395. package/src/server/meta.ts +27 -0
  396. package/src/server/query.ts +1 -1
  397. package/src/server/registration.test.ts +16 -25
  398. package/src/server/registration.ts +25 -19
  399. package/src/server/storage.ts +22 -3
  400. package/src/server/system_fields.ts +1 -1
@@ -44,10 +44,8 @@ var import_errors = require("./errors.js");
44
44
  var import_filePaths = require("./filePaths.js");
45
45
  var import_filePaths2 = require("./filePaths.js");
46
46
  var import_run = require("./run.js");
47
- var import_run2 = require("./run.js");
48
47
  var import_upgrade = require("./upgrade.js");
49
48
  var import_utils = require("./utils.js");
50
- var import_dashboard = require("./dashboard.js");
51
49
  var import_fsUtils = require("../fsUtils.js");
52
50
  var import_download = require("./download.js");
53
51
  var import_deployment = require("../deployment.js");
@@ -58,14 +56,8 @@ var import_codegen = require("../codegen.js");
58
56
  var import_config = require("../config.js");
59
57
  var import_utils2 = require("../utils/utils.js");
60
58
  var import_aiFiles = require("../aiFiles/index.js");
59
+ var import_secrets = require("./secrets.js");
61
60
  async function handleAnonymousDeployment(ctx, options) {
62
- if (await (0, import_utils.isOffline)()) {
63
- return await ctx.crash({
64
- exitCode: 1,
65
- errorType: "fatal",
66
- printedMessage: "Cannot run a local deployment while offline"
67
- });
68
- }
69
61
  const deployment = await chooseDeployment(ctx, {
70
62
  deploymentName: options.deploymentName,
71
63
  chosenConfiguration: options.chosenConfiguration
@@ -106,12 +98,11 @@ async function handleAnonymousDeployment(ctx, options) {
106
98
  kind: "latest"
107
99
  } : { kind: "version", version: options.backendVersion }
108
100
  );
109
- await (0, import_dashboard.handleDashboard)(ctx, version);
110
- let adminKey;
111
- let instanceSecret;
101
+ const existingCredentials = deployment.kind === "existing" ? {
102
+ adminKey: deployment.config.adminKey,
103
+ instanceSecret: deployment.config.instanceSecret ?? import_secrets.LEGACY_LOCAL_BACKEND_INSTANCE_SECRET
104
+ } : null;
112
105
  if (deployment.kind === "existing") {
113
- adminKey = deployment.config.adminKey;
114
- instanceSecret = deployment.config.instanceSecret ?? import_utils.LOCAL_BACKEND_INSTANCE_SECRET;
115
106
  await (0, import_run.ensureBackendStopped)(ctx, {
116
107
  ports: {
117
108
  cloud: deployment.config.ports.cloud
@@ -120,41 +111,26 @@ async function handleAnonymousDeployment(ctx, options) {
120
111
  deploymentName: deployment.deploymentName,
121
112
  allowOtherDeployments: true
122
113
  });
123
- } else {
124
- instanceSecret = (0, import_utils.generateInstanceSecret)();
125
- const data = await (0, import_bigBrain.bigBrainGenerateAdminKeyForAnonymousDeployment)(ctx, {
126
- instanceName: deployment.deploymentName,
127
- instanceSecret
128
- });
129
- adminKey = data.adminKey;
130
114
  }
131
115
  const { cloudPort, sitePort } = await (0, import_utils.chooseLocalBackendPorts)(ctx, {
132
116
  requestedPorts: options.ports,
133
117
  suggestedPorts: deployment.kind === "existing" ? deployment.config.ports : void 0
134
118
  });
135
- const onActivity = async (isOffline2, _wasOffline) => {
136
- await (0, import_run2.ensureBackendRunning)(ctx, {
137
- cloudPort,
119
+ const { cleanupHandle, adminKey } = await (0, import_upgrade.handlePotentialUpgradeAndStart)(
120
+ ctx,
121
+ {
138
122
  deploymentName: deployment.deploymentName,
139
- maxTimeSecs: 5
140
- });
141
- if (isOffline2) {
142
- return;
123
+ deploymentKind: "anonymous",
124
+ oldVersion: deployment.kind === "existing" ? deployment.config.backendVersion : null,
125
+ newBinaryPath: binaryPath,
126
+ newVersion: version,
127
+ ports: { cloud: cloudPort, site: sitePort },
128
+ existingCredentials,
129
+ forceUpgrade: options.forceUpgrade,
130
+ // Anonymous deployments aren't registered against a cloud project.
131
+ cloudProjectId: void 0
143
132
  }
144
- };
145
- const { cleanupHandle } = await (0, import_upgrade.handlePotentialUpgrade)(ctx, {
146
- deploymentName: deployment.deploymentName,
147
- deploymentKind: "anonymous",
148
- oldVersion: deployment.kind === "existing" ? deployment.config.backendVersion : null,
149
- newBinaryPath: binaryPath,
150
- newVersion: version,
151
- ports: { cloud: cloudPort, site: sitePort },
152
- adminKey,
153
- instanceSecret,
154
- forceUpgrade: options.forceUpgrade,
155
- // Anonymous deployments aren't registered against a cloud project.
156
- cloudProjectId: void 0
157
- });
133
+ );
158
134
  const cleanupFunc = ctx.removeCleanup(cleanupHandle);
159
135
  ctx.registerCleanup(async (exitCode, err) => {
160
136
  if (cleanupFunc !== null) {
@@ -178,8 +154,7 @@ async function handleAnonymousDeployment(ctx, options) {
178
154
  deploymentName: deployment.deploymentName,
179
155
  deploymentUrl: (0, import_run.localDeploymentUrl)(cloudPort),
180
156
  reference: null,
181
- isDefault: false,
182
- onActivity
157
+ isDefault: false
183
158
  };
184
159
  }
185
160
  async function loadAnonymousDeployment(ctx, deploymentName) {
@@ -343,16 +318,15 @@ async function handleLinkToProject(ctx, args) {
343
318
  projectSlug = newProjectSlug;
344
319
  }
345
320
  (0, import_log.logVerbose)(`Creating local deployment in project ${projectSlug}`);
346
- const {
347
- deploymentName: localDeploymentName,
348
- adminKey,
349
- projectId
350
- } = await (0, import_bigBrain.bigBrainStart)(ctx, {
321
+ const { deploymentName: localDeploymentName, projectId } = await (0, import_bigBrain.bigBrainStart)(ctx, {
351
322
  port: config.ports.cloud,
352
323
  projectSlug,
353
324
  teamSlug: args.teamSlug,
354
325
  instanceName: null
355
326
  });
327
+ const { instanceSecret, adminKey } = await (0, import_secrets.generateLocalDevSecretsWithLatestBinary)(ctx, {
328
+ deploymentName: localDeploymentName
329
+ });
356
330
  const localConfig = (0, import_filePaths.loadDeploymentConfig)(ctx, "local", localDeploymentName);
357
331
  if (localConfig !== null) {
358
332
  return ctx.crash({
@@ -375,6 +349,7 @@ async function handleLinkToProject(ctx, args) {
375
349
  );
376
350
  (0, import_log.logVerbose)(`Saving deployment config for ${localDeploymentName}`);
377
351
  (0, import_filePaths.saveDeploymentConfig)(ctx, "local", localDeploymentName, {
352
+ instanceSecret,
378
353
  adminKey,
379
354
  backendVersion: config.backendVersion,
380
355
  ports: config.ports,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/anonymous.ts"],
4
- "sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { promptSearch, promptYesNo } from \"../utils/prompts.js\";\nimport {\n bigBrainGenerateAdminKeyForAnonymousDeployment,\n bigBrainPause,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n legacyDeploymentStateDir,\n loadDeploymentConfig,\n loadDeploymentConfigFromDir,\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { DeploymentDetails } from \"./localDeployment.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { ensureBackendRunning } from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport {\n isOffline,\n generateInstanceSecret,\n chooseLocalBackendPorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { handleDashboard } from \"./dashboard.js\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { isAnonymousDeployment } from \"../deployment.js\";\nimport { createProject } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\nimport { doInitConvexFolder } from \"../codegen.js\";\nimport { readProjectConfig } from \"../config.js\";\nimport { functionsDir } from \"../utils/utils.js\";\nimport { attemptSetupAiFiles } from \"../aiFiles/index.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Cannot run a local deployment while offline\",\n });\n }\n\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (\n deployment.kind === \"first\" &&\n process.env.CONVEX_AGENT_MODE !== \"anonymous\" &&\n process.stdin.isTTY\n ) {\n logMessage(\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n await handleDashboard(ctx, version);\n let adminKey: string;\n let instanceSecret: string;\n if (deployment.kind === \"existing\") {\n adminKey = deployment.config.adminKey;\n instanceSecret =\n deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n } else {\n instanceSecret = generateInstanceSecret();\n const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {\n instanceName: deployment.deploymentName,\n instanceSecret,\n });\n adminKey = data.adminKey;\n }\n\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {\n requestedPorts: options.ports,\n suggestedPorts:\n deployment.kind === \"existing\" ? deployment.config.ports : undefined,\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName: deployment.deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\" ? deployment.config.backendVersion : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n forceUpgrade: options.forceUpgrade,\n // Anonymous deployments aren't registered against a cloud project.\n cloudProjectId: undefined,\n });\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n if (deployment.kind === \"new\") {\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await attemptSetupAiFiles({\n ctx,\n aiFilesConfig: projectConfig.aiFiles,\n convexDir,\n projectDir,\n });\n }\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n reference: null,\n isDefault: false,\n onActivity,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\n/**\n * List legacy anonymous deployments from the home directory.\n * These are deployments stored in ~/.convex/anonymous-convex-backend-state/\n */\nexport function listLegacyAnonymousDeployments(ctx: Context): Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n}> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (ctx.fs.exists(dir)) {\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n for (const deploymentName of deploymentNames) {\n const legacyDir = legacyDeploymentStateDir(\"anonymous\", deploymentName);\n const config = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (config !== null) {\n deployments.push({ deploymentName, config });\n }\n }\n }\n\n return deployments;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n // Check project-local storage first\n const projectLocal = loadProjectLocalConfig(ctx);\n if (\n projectLocal !== null &&\n isAnonymousDeployment(projectLocal.deploymentName)\n ) {\n deployments.push(projectLocal);\n }\n\n // Check legacy home directory, avoiding duplicates\n for (const legacy of listLegacyAnonymousDeployments(ctx)) {\n if (!deployments.some((d) => d.deploymentName === legacy.deploymentName)) {\n deployments.push(legacy);\n }\n }\n\n return deployments;\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n // Check for existing project-local deployment first - use it if it exists\n const projectLocal = loadProjectLocalConfig(ctx);\n if (projectLocal !== null) {\n if (isAnonymousDeployment(projectLocal.deploymentName)) {\n // Already an anonymous deployment - use it as-is\n return {\n kind: \"existing\",\n deploymentName: projectLocal.deploymentName,\n config: projectLocal.config,\n };\n }\n // Project-local has data from a different deployment type (e.g., \"local-*\")\n // Create a new anonymous deployment that will reuse this data and update the config\n logVerbose(\n `Project-local has ${projectLocal.deploymentName}, switching to anonymous`,\n );\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Check if a specific deployment name was requested (legacy support)\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const deployments = await listExistingAnonymousDeployments(ctx);\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(`Could not find project with name ${options.deploymentName}!`);\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n\n // Handle agent mode - use fixed name since there's one deployment per project\n if (process.env.CONVEX_AGENT_MODE === \"anonymous\") {\n const deploymentName = \"anonymous-agent\";\n logVerbose(`Deployment name: ${deploymentName}`);\n return {\n kind: \"new\",\n deploymentName,\n };\n }\n\n // No project-local data - check for legacy deployments in home directory\n const legacyDeployments = listLegacyAnonymousDeployments(ctx);\n\n // No legacy deployments - auto-create a new project without prompting\n if (legacyDeployments.length === 0) {\n logMessage(\"Setting up a new project...\");\n return { deploymentName: generateDeploymentName(), kind: \"first\" };\n }\n\n // User explicitly wants a new deployment - create without prompting for name\n if (options.chosenConfiguration === \"new\") {\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Non-interactive terminal - auto-create a new deployment\n if (!process.stdin.isTTY) {\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Legacy deployments exist - prompt user to choose\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...legacyDeployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = legacyDeployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n\n // User chose to create a new one - no name prompt needed\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n}\n\n/**\n * Returns a name for a new anonymous deployment.\n */\nfunction generateDeploymentName() {\n const baseName = path.basename(process.cwd());\n const deploymentName = `anonymous-${baseName}`;\n logVerbose(`Deployment name: ${deploymentName}`);\n return deploymentName;\n}\n\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n teamId: number;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = loadDeploymentConfig(ctx, \"anonymous\", args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Failed to load deployment config - try running `npx convex dev --configure`\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } = await createProject(ctx, {\n teamId: args.teamId,\n projectName,\n deploymentToProvision: null,\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(`Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const {\n deploymentName: localDeploymentName,\n adminKey,\n projectId,\n } = await bigBrainStart(ctx, {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n });\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(`Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(`Saving deployment config for ${localDeploymentName}`);\n saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n cloudProjectId: projectId,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(`Linked ${args.deploymentName} to project ${projectSlug}`);\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n ctx,\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n ctx,\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n\n // If both paths are the same (project-local storage), no file movement needed.\n // The config will be updated separately by saveDeploymentConfig.\n if (oldPath === newPath) {\n logVerbose(\n `Source and destination are the same (${oldPath}), skipping file copy`,\n );\n return;\n }\n\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAEjB,iBAKO;AACP,qBAA0C;AAC1C,sBAIO;AACP,oBAAkE;AAClE,uBASO;AACP,IAAAA,oBAAuC;AAGvC,iBAAyD;AACzD,IAAAC,cAAqC;AACrC,qBAAuC;AACvC,mBAKO;AACP,uBAAgC;AAChC,qBAAmD;AACnD,sBAA8C;AAC9C,wBAAsC;AACtC,iBAA8B;AAC9B,IAAAC,qBAAsC;AACtC,gBAAuB;AACvB,qBAAmC;AACnC,oBAAkC;AAClC,IAAAC,gBAA6B;AAC7B,qBAAoC;AAEpC,eAAsB,0BACpB,KACA,SAW4B;AAC5B,MAAI,UAAM,wBAAU,GAAG;AACrB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,MAAM,iBAAiB,KAAK;AAAA,IAC7C,gBAAgB,QAAQ;AAAA,IACxB,qBAAqB,QAAQ;AAAA,EAC/B,CAAC;AACD,MACE,WAAW,SAAS,WACpB,QAAQ,IAAI,sBAAsB,eAClC,QAAQ,MAAM,OACd;AACA;AAAA,MACE;AAAA,IACF;AACA;AAAA,MACE;AAAA,IACF;AACA;AAAA,MACE;AAAA,IACF;AACA,qDAA2B,GAAG;AAC9B,QAAI,QAAQ,MAAM,OAAO;AACvB,YAAM,SAAS,UAAM,4BAAY,KAAK;AAAA,QACpC,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,UAAI,CAAC,QAAQ;AACX,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,gBAAgB,OAAO,WAAW,QAAQ;AAC5C,QAAI,eAAe,oCAAsB;AACvC,qDAA4B;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,QAAM,EAAE,YAAY,QAAQ,IAAI,UAAM;AAAA,IACpC;AAAA,IACA,QAAQ,mBAAmB,SACvB;AAAA,MACE,MAAM;AAAA,IACR,IACA,EAAE,MAAM,WAAW,SAAS,QAAQ,eAAe;AAAA,EACzD;AACA,YAAM,kCAAgB,KAAK,OAAO;AAClC,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,SAAS,YAAY;AAClC,eAAW,WAAW,OAAO;AAC7B,qBACE,WAAW,OAAO,kBAAkB;AAItC,cAAM,iCAAqB,KAAK;AAAA,MAC9B,OAAO;AAAA,QACL,OAAO,WAAW,OAAO,MAAM;AAAA,MACjC;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB,WAAW;AAAA,MAC3B,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH,OAAO;AACL,yBAAiB,qCAAuB;AACxC,UAAM,OAAO,UAAM,gEAA+C,KAAK;AAAA,MACrE,cAAc,WAAW;AAAA,MACzB;AAAA,IACF,CAAC;AACD,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,EAAE,WAAW,SAAS,IAAI,UAAM,sCAAwB,KAAK;AAAA,IACjE,gBAAgB,QAAQ;AAAA,IACxB,gBACE,WAAW,SAAS,aAAa,WAAW,OAAO,QAAQ;AAAA,EAC/D,CAAC;AACD,QAAM,aAAa,OAAOC,YAAoB,gBAAyB;AACrE,cAAM,kCAAqB,KAAK;AAAA,MAC9B;AAAA,MACA,gBAAgB,WAAW;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,QAAIA,YAAW;AACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,cAAc,IAAI,UAAM,uCAAuB,KAAK;AAAA,IAC1D,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB;AAAA,IAChB,YACE,WAAW,SAAS,aAAa,WAAW,OAAO,iBAAiB;AAAA,IACtE,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,OAAO,EAAE,OAAO,WAAW,MAAM,SAAS;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,cAAc,QAAQ;AAAA;AAAA,IAEtB,gBAAgB;AAAA,EAClB,CAAC;AAED,QAAM,cAAc,IAAI,cAAc,aAAa;AACnD,MAAI,gBAAgB,OAAO,UAAU,QAAQ;AAC3C,QAAI,gBAAgB,MAAM;AACxB,YAAM,YAAY,UAAU,GAAG;AAAA,IACjC;AAAA,EACF,CAAC;AAED,MAAI,WAAW,SAAS,OAAO;AAC7B,cAAM,mCAAmB,GAAG;AAC5B,UAAM,EAAE,YAAY,cAAc,IAAI,UAAM,iCAAkB,GAAG;AACjE,UAAM,YAAY,YAAAC,QAAK,YAAQ,4BAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,UAAU,CAAC;AACxD,cAAM,oCAAoB;AAAA,MACxB;AAAA,MACA,eAAe,cAAc;AAAA,MAC7B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,WAAW;AAAA,IAC3B,mBAAe,+BAAmB,SAAS;AAAA,IAC3C,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,KACA,gBACgC;AAChC,QAAM,aAAS,uCAAqB,KAAK,aAAa,cAAc;AACpE,MAAI,WAAW,MAAM;AACnB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,uCAAuC,cAAc;AAAA,IACvE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAMO,SAAS,+BAA+B,KAG5C;AACD,QAAM,cAGD,CAAC;AAEN,QAAM,UAAM,0CAAuB,WAAW;AAC9C,MAAI,IAAI,GAAG,OAAO,GAAG,GAAG;AACtB,UAAM,kBAAkB,IAAI,GACzB,QAAQ,GAAG,EACX,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,CAAC,UAAM,yCAAsB,CAAC,CAAC;AACzC,eAAW,kBAAkB,iBAAiB;AAC5C,YAAM,gBAAY,2CAAyB,aAAa,cAAc;AACtE,YAAM,aAAS,8CAA4B,KAAK,SAAS;AACzD,UAAI,WAAW,MAAM;AACnB,oBAAY,KAAK,EAAE,gBAAgB,OAAO,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,iCAAiC,KAKrD;AACA,QAAM,cAGD,CAAC;AAGN,QAAM,mBAAe,yCAAuB,GAAG;AAC/C,MACE,iBAAiB,YACjB,yCAAsB,aAAa,cAAc,GACjD;AACA,gBAAY,KAAK,YAAY;AAAA,EAC/B;AAGA,aAAW,UAAU,+BAA+B,GAAG,GAAG;AACxD,QAAI,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,mBAAmB,OAAO,cAAc,GAAG;AACxE,kBAAY,KAAK,MAAM;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,iBACb,KACA,SAkBA;AAEA,QAAM,mBAAe,yCAAuB,GAAG;AAC/C,MAAI,iBAAiB,MAAM;AACzB,YAAI,yCAAsB,aAAa,cAAc,GAAG;AAEtD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB,aAAa;AAAA,QAC7B,QAAQ,aAAa;AAAA,MACvB;AAAA,IACF;AAGA;AAAA,MACE,qBAAqB,aAAa,cAAc;AAAA,IAClD;AACA,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AAAA,EACjE;AAGA,MAAI,QAAQ,mBAAmB,QAAQ,QAAQ,wBAAwB,MAAM;AAC3E,UAAM,cAAc,MAAM,iCAAiC,GAAG;AAC9D,UAAM,WAAW,YAAY;AAAA,MAC3B,CAAC,MAAM,EAAE,mBAAmB,QAAQ;AAAA,IACtC;AACA,QAAI,aAAa,QAAW;AAC1B,iCAAW,oCAAoC,QAAQ,cAAc,GAAG;AAAA,IAC1E,OAAO;AACL,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB,SAAS;AAAA,QACzB,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,IAAI,sBAAsB,aAAa;AACjD,UAAM,iBAAiB;AACvB,+BAAW,oBAAoB,cAAc,EAAE;AAC/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAAoB,+BAA+B,GAAG;AAG5D,MAAI,kBAAkB,WAAW,GAAG;AAClC,+BAAW,6BAA6B;AACxC,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,QAAQ;AAAA,EACnE;AAGA,MAAI,QAAQ,wBAAwB,OAAO;AACzC,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AAAA,EACjE;AAGA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AAAA,EACjE;AAGA,QAAM,gBAAgB,UAAM,6BAAa,KAAK;AAAA,IAC5C,SAAS;AAAA,IACT,SAAS;AAAA,MACP,GAAI,QAAQ,wBAAwB,aAChC,CAAC,IACD;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACJ,GAAG,kBAAkB,IAAI,CAAC,OAAO;AAAA,QAC/B,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,MAAI,kBAAkB,OAAO;AAC3B,UAAM,qBAAqB,kBAAkB;AAAA,MAC3C,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC9B;AACA,QAAI,uBAAuB,QAAW;AACpC,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,oCAAoC,aAAa;AAAA,MACnE,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB,mBAAmB;AAAA,MACnC,QAAQ,mBAAmB;AAAA,IAC7B;AAAA,EACF;AAGA,SAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AACjE;AAKA,SAAS,yBAAyB;AAChC,QAAM,WAAW,YAAAA,QAAK,SAAS,QAAQ,IAAI,CAAC;AAC5C,QAAM,iBAAiB,aAAa,QAAQ;AAC5C,6BAAW,oBAAoB,cAAc,EAAE;AAC/C,SAAO;AACT;AAMA,eAAsB,oBACpB,KACA,MAUC;AACD;AAAA,IACE,WAAW,KAAK,cAAc,yBAAyB,KAAK,QAAQ;AAAA,EACtE;AACA,QAAM,aAAS,uCAAqB,KAAK,aAAa,KAAK,cAAc;AACzE,MAAI,WAAW,MAAM;AACnB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,YAAM,iCAAqB,KAAK;AAAA,IAC9B,OAAO;AAAA,MACL,OAAO,OAAO,MAAM;AAAA,IACtB;AAAA,IACA,gBAAgB,KAAK;AAAA,IACrB,uBAAuB;AAAA,IACvB,aAAa;AAAA,EACf,CAAC;AACD,QAAM,kBAAc,0CAAsB,KAAK,cAAc;AAC7D,MAAI;AACJ,MAAI,KAAK,gBAAgB,MAAM;AAC7B,kBAAc,KAAK;AAAA,EACrB,OAAO;AACL,UAAM,EAAE,aAAa,eAAe,IAAI,UAAM,0BAAc,KAAK;AAAA,MAC/D,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,uBAAuB;AAAA,IACzB,CAAC;AACD,kBAAc;AAAA,EAChB;AACA,6BAAW,wCAAwC,WAAW,EAAE;AAEhE,QAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,EACF,IAAI,UAAM,+BAAc,KAAK;AAAA,IAC3B,MAAM,OAAO,MAAM;AAAA,IACnB;AAAA,IACA,UAAU,KAAK;AAAA,IACf,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,kBAAc,uCAAqB,KAAK,SAAS,mBAAmB;AAC1E,MAAI,gBAAgB,MAAM;AACxB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,WAAW,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AACA,6BAAW,UAAU,KAAK,cAAc,OAAO,mBAAmB,EAAE;AACpE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,gBAAgB,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA,EACF;AACA,6BAAW,gCAAgC,mBAAmB,EAAE;AAChE,6CAAqB,KAAK,SAAS,qBAAqB;AAAA,IACtD;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA,IACd,gBAAgB;AAAA,EAClB,CAAC;AACD,YAAM,+BAAc,KAAK;AAAA,IACvB;AAAA,IACA,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,kCAAgB,UAAU,KAAK,cAAc,eAAe,WAAW,EAAE;AACzE,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB,mBAAe,+BAAmB,OAAO,MAAM,KAAK;AAAA,EACtD;AACF;AAEA,eAAsB,eACpB,KACA,eAIA,eAIA;AACA,QAAM,cAAU;AAAA,IACd;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACA,QAAM,cAAU;AAAA,IACd;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAIA,MAAI,YAAY,SAAS;AACvB;AAAA,MACE,wCAAwC,OAAO;AAAA,IACjD;AACA;AAAA,EACF;AAEA,YAAM,gCAAgB,KAAK,kBAAQ,SAAS,OAAO;AACnD,wCAAkB,KAAK,OAAO;AAChC;",
6
- "names": ["import_filePaths", "import_run", "import_deployment", "import_utils", "isOffline", "path"]
4
+ "sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { promptSearch, promptYesNo } from \"../utils/prompts.js\";\nimport { bigBrainPause, bigBrainStart } from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n legacyDeploymentStateDir,\n loadDeploymentConfig,\n loadDeploymentConfigFromDir,\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { handlePotentialUpgradeAndStart } from \"./upgrade.js\";\nimport { chooseLocalBackendPorts } from \"./utils.js\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { DeploymentDetails, isAnonymousDeployment } from \"../deployment.js\";\nimport { createProject } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\nimport { doInitConvexFolder } from \"../codegen.js\";\nimport { readProjectConfig } from \"../config.js\";\nimport { functionsDir } from \"../utils/utils.js\";\nimport { attemptSetupAiFiles } from \"../aiFiles/index.js\";\nimport {\n generateLocalDevSecretsWithLatestBinary,\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./secrets.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (\n deployment.kind === \"first\" &&\n process.env.CONVEX_AGENT_MODE !== \"anonymous\" &&\n process.stdin.isTTY\n ) {\n logMessage(\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n\n const existingCredentials =\n deployment.kind === \"existing\"\n ? {\n adminKey: deployment.config.adminKey,\n instanceSecret:\n deployment.config.instanceSecret ??\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n }\n : null;\n if (deployment.kind === \"existing\") {\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n }\n\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {\n requestedPorts: options.ports,\n suggestedPorts:\n deployment.kind === \"existing\" ? deployment.config.ports : undefined,\n });\n\n const { cleanupHandle, adminKey } = await handlePotentialUpgradeAndStart(\n ctx,\n {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\"\n ? deployment.config.backendVersion\n : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n existingCredentials,\n forceUpgrade: options.forceUpgrade,\n // Anonymous deployments aren't registered against a cloud project.\n cloudProjectId: undefined,\n },\n );\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n if (deployment.kind === \"new\") {\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await attemptSetupAiFiles({\n ctx,\n aiFilesConfig: projectConfig.aiFiles,\n convexDir,\n projectDir,\n });\n }\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n reference: null,\n isDefault: false,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\n/**\n * List legacy anonymous deployments from the home directory.\n * These are deployments stored in ~/.convex/anonymous-convex-backend-state/\n */\nexport function listLegacyAnonymousDeployments(ctx: Context): Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n}> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (ctx.fs.exists(dir)) {\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n for (const deploymentName of deploymentNames) {\n const legacyDir = legacyDeploymentStateDir(\"anonymous\", deploymentName);\n const config = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (config !== null) {\n deployments.push({ deploymentName, config });\n }\n }\n }\n\n return deployments;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n // Check project-local storage first\n const projectLocal = loadProjectLocalConfig(ctx);\n if (\n projectLocal !== null &&\n isAnonymousDeployment(projectLocal.deploymentName)\n ) {\n deployments.push(projectLocal);\n }\n\n // Check legacy home directory, avoiding duplicates\n for (const legacy of listLegacyAnonymousDeployments(ctx)) {\n if (!deployments.some((d) => d.deploymentName === legacy.deploymentName)) {\n deployments.push(legacy);\n }\n }\n\n return deployments;\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n // Check for existing project-local deployment first - use it if it exists\n const projectLocal = loadProjectLocalConfig(ctx);\n if (projectLocal !== null) {\n if (isAnonymousDeployment(projectLocal.deploymentName)) {\n // Already an anonymous deployment - use it as-is\n return {\n kind: \"existing\",\n deploymentName: projectLocal.deploymentName,\n config: projectLocal.config,\n };\n }\n // Project-local has data from a different deployment type (e.g., \"local-*\")\n // Create a new anonymous deployment that will reuse this data and update the config\n logVerbose(\n `Project-local has ${projectLocal.deploymentName}, switching to anonymous`,\n );\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Check if a specific deployment name was requested (legacy support)\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const deployments = await listExistingAnonymousDeployments(ctx);\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(`Could not find project with name ${options.deploymentName}!`);\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n\n // Handle agent mode - use fixed name since there's one deployment per project\n if (process.env.CONVEX_AGENT_MODE === \"anonymous\") {\n const deploymentName = \"anonymous-agent\";\n logVerbose(`Deployment name: ${deploymentName}`);\n return {\n kind: \"new\",\n deploymentName,\n };\n }\n\n // No project-local data - check for legacy deployments in home directory\n const legacyDeployments = listLegacyAnonymousDeployments(ctx);\n\n // No legacy deployments - auto-create a new project without prompting\n if (legacyDeployments.length === 0) {\n logMessage(\"Setting up a new project...\");\n return { deploymentName: generateDeploymentName(), kind: \"first\" };\n }\n\n // User explicitly wants a new deployment - create without prompting for name\n if (options.chosenConfiguration === \"new\") {\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Non-interactive terminal - auto-create a new deployment\n if (!process.stdin.isTTY) {\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Legacy deployments exist - prompt user to choose\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...legacyDeployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = legacyDeployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n\n // User chose to create a new one - no name prompt needed\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n}\n\n/**\n * Returns a name for a new anonymous deployment.\n */\nfunction generateDeploymentName() {\n const baseName = path.basename(process.cwd());\n const deploymentName = `anonymous-${baseName}`;\n logVerbose(`Deployment name: ${deploymentName}`);\n return deploymentName;\n}\n\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n teamId: number;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = loadDeploymentConfig(ctx, \"anonymous\", args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Failed to load deployment config - try running `npx convex dev --configure`\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } = await createProject(ctx, {\n teamId: args.teamId,\n projectName,\n deploymentToProvision: null,\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(`Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const { deploymentName: localDeploymentName, projectId } =\n await bigBrainStart(ctx, {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n });\n const { instanceSecret, adminKey } =\n await generateLocalDevSecretsWithLatestBinary(ctx, {\n deploymentName: localDeploymentName,\n });\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(`Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(`Saving deployment config for ${localDeploymentName}`);\n saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n instanceSecret,\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n cloudProjectId: projectId,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(`Linked ${args.deploymentName} to project ${projectSlug}`);\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n ctx,\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n ctx,\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n\n // If both paths are the same (project-local storage), no file movement needed.\n // The config will be updated separately by saveDeploymentConfig.\n if (oldPath === newPath) {\n logVerbose(\n `Source and destination are the same (${oldPath}), skipping file copy`,\n );\n return;\n }\n\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAEjB,iBAKO;AACP,qBAA0C;AAC1C,sBAA6C;AAC7C,oBAAkE;AAClE,uBASO;AACP,IAAAA,oBAAuC;AAEvC,iBAAyD;AACzD,qBAA+C;AAC/C,mBAAwC;AACxC,qBAAmD;AACnD,sBAA8C;AAC9C,wBAAyD;AACzD,iBAA8B;AAC9B,IAAAC,qBAAsC;AACtC,gBAAuB;AACvB,qBAAmC;AACnC,oBAAkC;AAClC,IAAAC,gBAA6B;AAC7B,qBAAoC;AACpC,qBAGO;AAEP,eAAsB,0BACpB,KACA,SAW4B;AAC5B,QAAM,aAAa,MAAM,iBAAiB,KAAK;AAAA,IAC7C,gBAAgB,QAAQ;AAAA,IACxB,qBAAqB,QAAQ;AAAA,EAC/B,CAAC;AACD,MACE,WAAW,SAAS,WACpB,QAAQ,IAAI,sBAAsB,eAClC,QAAQ,MAAM,OACd;AACA;AAAA,MACE;AAAA,IACF;AACA;AAAA,MACE;AAAA,IACF;AACA;AAAA,MACE;AAAA,IACF;AACA,qDAA2B,GAAG;AAC9B,QAAI,QAAQ,MAAM,OAAO;AACvB,YAAM,SAAS,UAAM,4BAAY,KAAK;AAAA,QACpC,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,UAAI,CAAC,QAAQ;AACX,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,gBAAgB,OAAO,WAAW,QAAQ;AAC5C,QAAI,eAAe,oCAAsB;AACvC,qDAA4B;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,QAAM,EAAE,YAAY,QAAQ,IAAI,UAAM;AAAA,IACpC;AAAA,IACA,QAAQ,mBAAmB,SACvB;AAAA,MACE,MAAM;AAAA,IACR,IACA,EAAE,MAAM,WAAW,SAAS,QAAQ,eAAe;AAAA,EACzD;AAEA,QAAM,sBACJ,WAAW,SAAS,aAChB;AAAA,IACE,UAAU,WAAW,OAAO;AAAA,IAC5B,gBACE,WAAW,OAAO,kBAClB;AAAA,EACJ,IACA;AACN,MAAI,WAAW,SAAS,YAAY;AAIlC,cAAM,iCAAqB,KAAK;AAAA,MAC9B,OAAO;AAAA,QACL,OAAO,WAAW,OAAO,MAAM;AAAA,MACjC;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB,WAAW;AAAA,MAC3B,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,QAAM,EAAE,WAAW,SAAS,IAAI,UAAM,sCAAwB,KAAK;AAAA,IACjE,gBAAgB,QAAQ;AAAA,IACxB,gBACE,WAAW,SAAS,aAAa,WAAW,OAAO,QAAQ;AAAA,EAC/D,CAAC;AAED,QAAM,EAAE,eAAe,SAAS,IAAI,UAAM;AAAA,IACxC;AAAA,IACA;AAAA,MACE,gBAAgB,WAAW;AAAA,MAC3B,gBAAgB;AAAA,MAChB,YACE,WAAW,SAAS,aAChB,WAAW,OAAO,iBAClB;AAAA,MACN,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO,EAAE,OAAO,WAAW,MAAM,SAAS;AAAA,MAC1C;AAAA,MACA,cAAc,QAAQ;AAAA;AAAA,MAEtB,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,cAAc,IAAI,cAAc,aAAa;AACnD,MAAI,gBAAgB,OAAO,UAAU,QAAQ;AAC3C,QAAI,gBAAgB,MAAM;AACxB,YAAM,YAAY,UAAU,GAAG;AAAA,IACjC;AAAA,EACF,CAAC;AAED,MAAI,WAAW,SAAS,OAAO;AAC7B,cAAM,mCAAmB,GAAG;AAC5B,UAAM,EAAE,YAAY,cAAc,IAAI,UAAM,iCAAkB,GAAG;AACjE,UAAM,YAAY,YAAAC,QAAK,YAAQ,4BAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,UAAU,CAAC;AACxD,cAAM,oCAAoB;AAAA,MACxB;AAAA,MACA,eAAe,cAAc;AAAA,MAC7B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,WAAW;AAAA,IAC3B,mBAAe,+BAAmB,SAAS;AAAA,IAC3C,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAEA,eAAsB,wBACpB,KACA,gBACgC;AAChC,QAAM,aAAS,uCAAqB,KAAK,aAAa,cAAc;AACpE,MAAI,WAAW,MAAM;AACnB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,uCAAuC,cAAc;AAAA,IACvE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAMO,SAAS,+BAA+B,KAG5C;AACD,QAAM,cAGD,CAAC;AAEN,QAAM,UAAM,0CAAuB,WAAW;AAC9C,MAAI,IAAI,GAAG,OAAO,GAAG,GAAG;AACtB,UAAM,kBAAkB,IAAI,GACzB,QAAQ,GAAG,EACX,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,CAAC,UAAM,yCAAsB,CAAC,CAAC;AACzC,eAAW,kBAAkB,iBAAiB;AAC5C,YAAM,gBAAY,2CAAyB,aAAa,cAAc;AACtE,YAAM,aAAS,8CAA4B,KAAK,SAAS;AACzD,UAAI,WAAW,MAAM;AACnB,oBAAY,KAAK,EAAE,gBAAgB,OAAO,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,iCAAiC,KAKrD;AACA,QAAM,cAGD,CAAC;AAGN,QAAM,mBAAe,yCAAuB,GAAG;AAC/C,MACE,iBAAiB,YACjB,yCAAsB,aAAa,cAAc,GACjD;AACA,gBAAY,KAAK,YAAY;AAAA,EAC/B;AAGA,aAAW,UAAU,+BAA+B,GAAG,GAAG;AACxD,QAAI,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,mBAAmB,OAAO,cAAc,GAAG;AACxE,kBAAY,KAAK,MAAM;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,iBACb,KACA,SAkBA;AAEA,QAAM,mBAAe,yCAAuB,GAAG;AAC/C,MAAI,iBAAiB,MAAM;AACzB,YAAI,yCAAsB,aAAa,cAAc,GAAG;AAEtD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB,aAAa;AAAA,QAC7B,QAAQ,aAAa;AAAA,MACvB;AAAA,IACF;AAGA;AAAA,MACE,qBAAqB,aAAa,cAAc;AAAA,IAClD;AACA,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AAAA,EACjE;AAGA,MAAI,QAAQ,mBAAmB,QAAQ,QAAQ,wBAAwB,MAAM;AAC3E,UAAM,cAAc,MAAM,iCAAiC,GAAG;AAC9D,UAAM,WAAW,YAAY;AAAA,MAC3B,CAAC,MAAM,EAAE,mBAAmB,QAAQ;AAAA,IACtC;AACA,QAAI,aAAa,QAAW;AAC1B,iCAAW,oCAAoC,QAAQ,cAAc,GAAG;AAAA,IAC1E,OAAO;AACL,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB,SAAS;AAAA,QACzB,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,IAAI,sBAAsB,aAAa;AACjD,UAAM,iBAAiB;AACvB,+BAAW,oBAAoB,cAAc,EAAE;AAC/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAAoB,+BAA+B,GAAG;AAG5D,MAAI,kBAAkB,WAAW,GAAG;AAClC,+BAAW,6BAA6B;AACxC,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,QAAQ;AAAA,EACnE;AAGA,MAAI,QAAQ,wBAAwB,OAAO;AACzC,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AAAA,EACjE;AAGA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,WAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AAAA,EACjE;AAGA,QAAM,gBAAgB,UAAM,6BAAa,KAAK;AAAA,IAC5C,SAAS;AAAA,IACT,SAAS;AAAA,MACP,GAAI,QAAQ,wBAAwB,aAChC,CAAC,IACD;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACJ,GAAG,kBAAkB,IAAI,CAAC,OAAO;AAAA,QAC/B,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,MAAI,kBAAkB,OAAO;AAC3B,UAAM,qBAAqB,kBAAkB;AAAA,MAC3C,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC9B;AACA,QAAI,uBAAuB,QAAW;AACpC,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,oCAAoC,aAAa;AAAA,MACnE,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB,mBAAmB;AAAA,MACnC,QAAQ,mBAAmB;AAAA,IAC7B;AAAA,EACF;AAGA,SAAO,EAAE,gBAAgB,uBAAuB,GAAG,MAAM,MAAM;AACjE;AAKA,SAAS,yBAAyB;AAChC,QAAM,WAAW,YAAAA,QAAK,SAAS,QAAQ,IAAI,CAAC;AAC5C,QAAM,iBAAiB,aAAa,QAAQ;AAC5C,6BAAW,oBAAoB,cAAc,EAAE;AAC/C,SAAO;AACT;AAMA,eAAsB,oBACpB,KACA,MAUC;AACD;AAAA,IACE,WAAW,KAAK,cAAc,yBAAyB,KAAK,QAAQ;AAAA,EACtE;AACA,QAAM,aAAS,uCAAqB,KAAK,aAAa,KAAK,cAAc;AACzE,MAAI,WAAW,MAAM;AACnB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,YAAM,iCAAqB,KAAK;AAAA,IAC9B,OAAO;AAAA,MACL,OAAO,OAAO,MAAM;AAAA,IACtB;AAAA,IACA,gBAAgB,KAAK;AAAA,IACrB,uBAAuB;AAAA,IACvB,aAAa;AAAA,EACf,CAAC;AACD,QAAM,kBAAc,0CAAsB,KAAK,cAAc;AAC7D,MAAI;AACJ,MAAI,KAAK,gBAAgB,MAAM;AAC7B,kBAAc,KAAK;AAAA,EACrB,OAAO;AACL,UAAM,EAAE,aAAa,eAAe,IAAI,UAAM,0BAAc,KAAK;AAAA,MAC/D,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,uBAAuB;AAAA,IACzB,CAAC;AACD,kBAAc;AAAA,EAChB;AACA,6BAAW,wCAAwC,WAAW,EAAE;AAEhE,QAAM,EAAE,gBAAgB,qBAAqB,UAAU,IACrD,UAAM,+BAAc,KAAK;AAAA,IACvB,MAAM,OAAO,MAAM;AAAA,IACnB;AAAA,IACA,UAAU,KAAK;AAAA,IACf,cAAc;AAAA,EAChB,CAAC;AACH,QAAM,EAAE,gBAAgB,SAAS,IAC/B,UAAM,wDAAwC,KAAK;AAAA,IACjD,gBAAgB;AAAA,EAClB,CAAC;AACH,QAAM,kBAAc,uCAAqB,KAAK,SAAS,mBAAmB;AAC1E,MAAI,gBAAgB,MAAM;AACxB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,WAAW,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AACA,6BAAW,UAAU,KAAK,cAAc,OAAO,mBAAmB,EAAE;AACpE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,gBAAgB,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA,EACF;AACA,6BAAW,gCAAgC,mBAAmB,EAAE;AAChE,6CAAqB,KAAK,SAAS,qBAAqB;AAAA,IACtD;AAAA,IACA;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA,IACd,gBAAgB;AAAA,EAClB,CAAC;AACD,YAAM,+BAAc,KAAK;AAAA,IACvB;AAAA,IACA,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,kCAAgB,UAAU,KAAK,cAAc,eAAe,WAAW,EAAE;AACzE,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB,mBAAe,+BAAmB,OAAO,MAAM,KAAK;AAAA,EACtD;AACF;AAEA,eAAsB,eACpB,KACA,eAIA,eAIA;AACA,QAAM,cAAU;AAAA,IACd;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACA,QAAM,cAAU;AAAA,IACd;AAAA,IACA,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAIA,MAAI,YAAY,SAAS;AACvB;AAAA,MACE,wCAAwC,OAAO;AAAA,IACjD;AACA;AAAA,EACF;AAEA,YAAM,gCAAgB,KAAK,kBAAQ,SAAS,OAAO;AACnD,wCAAkB,KAAK,OAAO;AAChC;",
6
+ "names": ["import_filePaths", "import_deployment", "import_utils", "path"]
7
7
  }
@@ -19,7 +19,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var bigBrain_exports = {};
20
20
  __export(bigBrain_exports, {
21
21
  bigBrainEnableFeatureMetadata: () => bigBrainEnableFeatureMetadata,
22
- bigBrainGenerateAdminKeyForAnonymousDeployment: () => bigBrainGenerateAdminKeyForAnonymousDeployment,
23
22
  bigBrainPause: () => bigBrainPause,
24
23
  bigBrainRecordActivity: () => bigBrainRecordActivity,
25
24
  bigBrainStart: () => bigBrainStart,
@@ -59,14 +58,6 @@ async function bigBrainEnableFeatureMetadata(ctx) {
59
58
  data: {}
60
59
  });
61
60
  }
62
- async function bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, data) {
63
- return (0, import_utils.bigBrainAPI)({
64
- ctx,
65
- method: "POST",
66
- path: "local_deployment/generate_admin_key",
67
- data
68
- });
69
- }
70
61
  async function projectHasExistingCloudDev(ctx, {
71
62
  projectSlug,
72
63
  teamSlug
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/bigBrain.ts"],
4
- "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { bigBrainAPI } from \"../utils/utils.js\";\n\nexport async function bigBrainStart(\n ctx: Context,\n data: {\n // cloud port\n port: number;\n projectSlug: string;\n teamSlug: string;\n instanceName: string | null;\n },\n): Promise<{ deploymentName: string; adminKey: string; projectId: number }> {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/start\",\n data,\n });\n}\n\nexport async function bigBrainPause(\n ctx: Context,\n data: {\n projectSlug: string;\n teamSlug: string;\n },\n): Promise<void> {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/pause\",\n data,\n });\n}\n\nexport async function bigBrainRecordActivity(\n ctx: Context,\n data: {\n instanceName: string;\n },\n) {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/record_activity\",\n data,\n });\n}\n\nexport async function bigBrainEnableFeatureMetadata(\n ctx: Context,\n): Promise<{ totalProjects: { kind: \"none\" | \"one\" | \"multiple\" } }> {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/enable_feature_metadata\",\n data: {},\n });\n}\n\nexport async function bigBrainGenerateAdminKeyForAnonymousDeployment(\n ctx: Context,\n data: {\n instanceName: string;\n instanceSecret: string;\n },\n) {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/generate_admin_key\",\n data,\n });\n}\n/** Whether a project already has a cloud dev deployment for this user. */\nexport async function projectHasExistingCloudDev(\n ctx: Context,\n {\n projectSlug,\n teamSlug,\n }: {\n projectSlug: string;\n teamSlug: string;\n },\n) {\n const response = await bigBrainAPI<\n | {\n kind: \"Exists\";\n }\n | {\n kind: \"DoesNotExist\";\n }\n >({\n ctx,\n method: \"POST\",\n path: \"deployment/existing_dev\",\n data: { projectSlug, teamSlug },\n });\n if (response.kind === \"Exists\") {\n return true;\n } else if (response.kind === \"DoesNotExist\") {\n return false;\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected /api/deployment/existing_dev response: ${JSON.stringify(response, null, 2)}`,\n });\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA4B;AAE5B,eAAsB,cACpB,KACA,MAO0E;AAC1E,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,cACpB,KACA,MAIe;AACf,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,uBACpB,KACA,MAGA;AACA,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,8BACpB,KACmE;AACnE,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM,CAAC;AAAA,EACT,CAAC;AACH;AAEA,eAAsB,+CACpB,KACA,MAIA;AACA,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,2BACpB,KACA;AAAA,EACE;AAAA,EACA;AACF,GAIA;AACA,QAAM,WAAW,UAAM,0BAOrB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM,EAAE,aAAa,SAAS;AAAA,EAChC,CAAC;AACD,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,SAAS,SAAS,gBAAgB;AAC3C,WAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,MAAM;AAAA,IACrB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB,qDAAqD,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,EACxG,CAAC;AACH;",
4
+ "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { bigBrainAPI } from \"../utils/utils.js\";\n\nexport async function bigBrainStart(\n ctx: Context,\n data: {\n // cloud port\n port: number;\n projectSlug: string;\n teamSlug: string;\n instanceName: string | null;\n },\n): Promise<{\n deploymentName: string;\n /** @deprecated */\n adminKey: string;\n projectId: number;\n}> {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/start\",\n data,\n });\n}\n\nexport async function bigBrainPause(\n ctx: Context,\n data: {\n projectSlug: string;\n teamSlug: string;\n },\n): Promise<void> {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/pause\",\n data,\n });\n}\n\nexport async function bigBrainRecordActivity(\n ctx: Context,\n data: {\n instanceName: string;\n adminKey: string;\n },\n) {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/record_activity\",\n data,\n });\n}\n\nexport async function bigBrainEnableFeatureMetadata(\n ctx: Context,\n): Promise<{ totalProjects: { kind: \"none\" | \"one\" | \"multiple\" } }> {\n return bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"local_deployment/enable_feature_metadata\",\n data: {},\n });\n}\n\n/** Whether a project already has a cloud dev deployment for this user. */\nexport async function projectHasExistingCloudDev(\n ctx: Context,\n {\n projectSlug,\n teamSlug,\n }: {\n projectSlug: string;\n teamSlug: string;\n },\n) {\n const response = await bigBrainAPI<\n | {\n kind: \"Exists\";\n }\n | {\n kind: \"DoesNotExist\";\n }\n >({\n ctx,\n method: \"POST\",\n path: \"deployment/existing_dev\",\n data: { projectSlug, teamSlug },\n });\n if (response.kind === \"Exists\") {\n return true;\n } else if (response.kind === \"DoesNotExist\") {\n return false;\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected /api/deployment/existing_dev response: ${JSON.stringify(response, null, 2)}`,\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA4B;AAE5B,eAAsB,cACpB,KACA,MAYC;AACD,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,cACpB,KACA,MAIe;AACf,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,uBACpB,KACA,MAIA;AACA,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,8BACpB,KACmE;AACnE,aAAO,0BAAY;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM,CAAC;AAAA,EACT,CAAC;AACH;AAGA,eAAsB,2BACpB,KACA;AAAA,EACE;AAAA,EACA;AACF,GAIA;AACA,QAAM,WAAW,UAAM,0BAOrB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM,EAAE,aAAa,SAAS;AAAA,EAChC,CAAC;AACD,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,SAAS,SAAS,gBAAgB;AAC3C,WAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,MAAM;AAAA,IACrB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB,qDAAqD,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,EACxG,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -28,9 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var dashboard_exports = {};
30
30
  __export(dashboard_exports, {
31
- DEFAULT_LOCAL_DASHBOARD_API_PORT: () => DEFAULT_LOCAL_DASHBOARD_API_PORT,
32
31
  DEFAULT_LOCAL_DASHBOARD_PORT: () => DEFAULT_LOCAL_DASHBOARD_PORT,
33
- checkIfDashboardIsRunning: () => checkIfDashboardIsRunning,
34
32
  dashboardUrl: () => dashboardUrl,
35
33
  handleDashboard: () => handleDashboard
36
34
  });
@@ -38,35 +36,49 @@ module.exports = __toCommonJS(dashboard_exports);
38
36
  var import_filePaths = require("./filePaths.js");
39
37
  var import_utils = require("./utils.js");
40
38
  var import_serve = require("./serve.js");
41
- var import_anonymous = require("./anonymous.js");
42
39
  var import_run = require("./run.js");
43
40
  var import_serve_handler = __toESM(require("serve-handler"), 1);
44
41
  var import_download = require("./download.js");
45
42
  var import_utils2 = require("../utils/utils.js");
46
43
  const DEFAULT_LOCAL_DASHBOARD_PORT = 6790;
47
- const DEFAULT_LOCAL_DASHBOARD_API_PORT = 6791;
48
- async function handleDashboard(ctx, version) {
44
+ async function handleDashboard(ctx, deployment, options) {
45
+ const { version } = await (0, import_download.ensureBackendBinaryDownloaded)(
46
+ ctx,
47
+ options.backendVersion === void 0 ? { kind: "latest" } : { kind: "version", version: options.backendVersion }
48
+ );
49
49
  const anonymousId = (0, import_filePaths.loadUuidForAnonymousUser)(ctx) ?? void 0;
50
- const isRunning = await checkIfDashboardIsRunning(ctx);
51
- if (isRunning) {
52
- return;
53
- }
54
50
  await (0, import_download.ensureDashboardDownloaded)(ctx, version);
55
- const [dashboardPort, apiPort] = await (0, import_utils.choosePorts)(ctx, {
56
- count: 2,
51
+ const [dashboardPort] = await (0, import_utils.choosePorts)(ctx, {
52
+ count: 1,
57
53
  startPort: DEFAULT_LOCAL_DASHBOARD_PORT,
58
54
  requestedPorts: [null, null]
59
55
  });
60
- await (0, import_filePaths.saveDashboardConfig)(ctx, {
61
- port: dashboardPort,
62
- apiPort,
63
- version
56
+ (0, import_filePaths.saveProjectDashboardConfig)(ctx, deployment.name, {
57
+ port: dashboardPort
64
58
  });
65
59
  let hasReportedSelfHostedEvent = false;
60
+ const serverOptions = { cors: false };
66
61
  const { cleanupHandle } = await (0, import_serve.startServer)(
67
62
  ctx,
68
63
  dashboardPort,
69
64
  async (request, response) => {
65
+ const pathname = new URL(
66
+ request.url ?? "/",
67
+ // We only want to extract the pathname so the base doesn’t matter
68
+ "http://localhost"
69
+ ).pathname;
70
+ if (pathname === "/api/current_deployment") {
71
+ serverOptions;
72
+ response.setHeader("Content-Type", "application/json");
73
+ response.end(
74
+ JSON.stringify({
75
+ name: deployment.name,
76
+ url: (0, import_run.localDeploymentUrl)(deployment.cloudPort),
77
+ adminKey: deployment.adminKey
78
+ })
79
+ );
80
+ return;
81
+ }
70
82
  if (!hasReportedSelfHostedEvent) {
71
83
  hasReportedSelfHostedEvent = true;
72
84
  void reportSelfHostedEvent(ctx, {
@@ -79,9 +91,8 @@ async function handleDashboard(ctx, version) {
79
91
  public: (0, import_filePaths.dashboardOutDir)()
80
92
  });
81
93
  },
82
- {}
94
+ serverOptions
83
95
  );
84
- await startServingListDeploymentsApi(ctx, apiPort);
85
96
  return {
86
97
  dashboardPort,
87
98
  cleanupHandle
@@ -108,60 +119,11 @@ async function reportSelfHostedEvent(ctx, {
108
119
  } catch {
109
120
  }
110
121
  }
111
- async function startServingListDeploymentsApi(ctx, port) {
112
- await (0, import_serve.startServer)(
113
- ctx,
114
- port,
115
- async (request, response) => {
116
- const deployments = await (0, import_anonymous.listExistingAnonymousDeployments)(ctx);
117
- const deploymentsJson = deployments.map((d) => ({
118
- name: d.deploymentName,
119
- url: (0, import_run.localDeploymentUrl)(d.config.ports.cloud),
120
- adminKey: d.config.adminKey
121
- }));
122
- response.setHeader("Content-Type", "application/json");
123
- response.end(JSON.stringify({ deployments: deploymentsJson }));
124
- },
125
- {
126
- cors: true
127
- }
128
- );
129
- }
130
- async function checkIfDashboardIsRunning(ctx) {
131
- const dashboardConfig = (0, import_filePaths.loadDashboardConfig)(ctx);
132
- if (dashboardConfig === null) {
133
- return false;
134
- }
135
- let resp;
136
- try {
137
- resp = await fetch(`http://127.0.0.1:${dashboardConfig.apiPort}`);
138
- } catch {
139
- return false;
140
- }
141
- if (!resp.ok) {
142
- return false;
143
- }
144
- let data;
145
- try {
146
- data = await resp.json();
147
- } catch {
148
- return false;
149
- }
150
- return Array.isArray(data.deployments);
151
- }
152
122
  function dashboardUrl(ctx, deploymentName) {
153
- const dashboardConfig = (0, import_filePaths.loadDashboardConfig)(ctx);
123
+ const dashboardConfig = (0, import_filePaths.loadProjectDashboardConfig)(ctx, deploymentName);
154
124
  if (dashboardConfig === null) {
155
125
  return null;
156
126
  }
157
- const queryParams = new URLSearchParams();
158
- if (dashboardConfig.apiPort !== DEFAULT_LOCAL_DASHBOARD_API_PORT) {
159
- queryParams.set("a", dashboardConfig.apiPort.toString());
160
- }
161
- queryParams.set("d", deploymentName);
162
- const queryString = queryParams.toString();
163
- const url = new URL(`http://127.0.0.1:${dashboardConfig.port}`);
164
- url.search = queryString;
165
- return url.href;
127
+ return `http://127.0.0.1:${dashboardConfig.port}/`;
166
128
  }
167
129
  //# sourceMappingURL=dashboard.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/dashboard.ts"],
4
- "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n dashboardOutDir,\n loadDashboardConfig,\n loadUuidForAnonymousUser,\n saveDashboardConfig,\n} from \"./filePaths.js\";\nimport { choosePorts } from \"./utils.js\";\nimport { startServer } from \"./serve.js\";\nimport { listExistingAnonymousDeployments } from \"./anonymous.js\";\nimport { localDeploymentUrl, selfHostedEventTag } from \"./run.js\";\nimport serveHandler from \"serve-handler\";\nimport { ensureDashboardDownloaded } from \"./download.js\";\nimport { bigBrainAPIMaybeThrows } from \"../utils/utils.js\";\n\nexport const DEFAULT_LOCAL_DASHBOARD_PORT = 6790;\nexport const DEFAULT_LOCAL_DASHBOARD_API_PORT = 6791;\n\n/**\n * This runs the `dashboard-self-hosted` app locally.\n * It's currently just used for the `anonymous` flow, while everything else\n * uses `dashboard.convex.dev`, and some of the code below is written\n * assuming this is only used for `anonymous`.\n */\nexport async function handleDashboard(ctx: Context, version: string) {\n const anonymousId = loadUuidForAnonymousUser(ctx) ?? undefined;\n const isRunning = await checkIfDashboardIsRunning(ctx);\n if (isRunning) {\n // It's possible this is running with a different version, but\n // let's not worry about that for now.\n return;\n }\n await ensureDashboardDownloaded(ctx, version);\n const [dashboardPort, apiPort] = await choosePorts(ctx, {\n count: 2,\n startPort: DEFAULT_LOCAL_DASHBOARD_PORT,\n requestedPorts: [null, null],\n });\n await saveDashboardConfig(ctx, {\n port: dashboardPort,\n apiPort,\n version,\n });\n\n let hasReportedSelfHostedEvent = false;\n\n const { cleanupHandle } = await startServer(\n ctx,\n dashboardPort,\n async (request, response) => {\n if (!hasReportedSelfHostedEvent) {\n hasReportedSelfHostedEvent = true;\n void reportSelfHostedEvent(ctx, {\n anonymousId,\n eventName: \"self_host_dashboard_connected\",\n tag: selfHostedEventTag(\"anonymous\"),\n });\n }\n await serveHandler(request, response, {\n public: dashboardOutDir(),\n });\n },\n {},\n );\n await startServingListDeploymentsApi(ctx, apiPort);\n return {\n dashboardPort,\n cleanupHandle,\n };\n}\n\nasync function reportSelfHostedEvent(\n ctx: Context,\n {\n anonymousId,\n eventName,\n eventFields,\n tag,\n }: {\n anonymousId: string | undefined;\n eventName: string;\n eventFields?: Record<string, unknown>;\n tag: string | undefined;\n },\n) {\n try {\n await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"self_hosted_event\",\n data: {\n selfHostedUuid: anonymousId,\n eventName,\n eventFields,\n tag,\n },\n });\n } catch {\n // ignore\n }\n}\n\n/**\n * This serves a really basic API that just returns a JSON blob with the deployments\n * and their credentials.\n * The locally running dashboard can hit this API.\n */\nasync function startServingListDeploymentsApi(ctx: Context, port: number) {\n await startServer(\n ctx,\n port,\n async (request, response) => {\n const deployments = await listExistingAnonymousDeployments(ctx);\n const deploymentsJson = deployments.map((d) => ({\n name: d.deploymentName,\n url: localDeploymentUrl(d.config.ports.cloud),\n adminKey: d.config.adminKey,\n }));\n response.setHeader(\"Content-Type\", \"application/json\");\n response.end(JSON.stringify({ deployments: deploymentsJson }));\n },\n {\n cors: true,\n },\n );\n}\n\nexport async function checkIfDashboardIsRunning(ctx: Context) {\n const dashboardConfig = loadDashboardConfig(ctx);\n if (dashboardConfig === null) {\n return false;\n }\n // We're checking if the mini API server is running and has a response that\n // looks like a list of deployments, since it's easier than checking the\n // dashboard UI + won't trigger the event for the developer opening the dashboard.\n let resp: Response;\n try {\n resp = await fetch(`http://127.0.0.1:${dashboardConfig.apiPort}`);\n } catch {\n return false;\n }\n if (!resp.ok) {\n return false;\n }\n let data: { deployments: { name: string; url: string; adminKey: string }[] };\n try {\n data = await resp.json();\n } catch {\n return false;\n }\n return Array.isArray(data.deployments);\n}\n\nexport function dashboardUrl(ctx: Context, deploymentName: string) {\n const dashboardConfig = loadDashboardConfig(ctx);\n if (dashboardConfig === null) {\n return null;\n }\n\n const queryParams = new URLSearchParams();\n if (dashboardConfig.apiPort !== DEFAULT_LOCAL_DASHBOARD_API_PORT) {\n queryParams.set(\"a\", dashboardConfig.apiPort.toString());\n }\n queryParams.set(\"d\", deploymentName);\n const queryString = queryParams.toString();\n const url = new URL(`http://127.0.0.1:${dashboardConfig.port}`);\n url.search = queryString;\n return url.href;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n dashboardOutDir,\n loadProjectDashboardConfig,\n loadUuidForAnonymousUser,\n saveProjectDashboardConfig,\n} from \"./filePaths.js\";\nimport { choosePorts } from \"./utils.js\";\nimport { startServer } from \"./serve.js\";\nimport { localDeploymentUrl, selfHostedEventTag } from \"./run.js\";\nimport serveHandler from \"serve-handler\";\nimport {\n ensureBackendBinaryDownloaded,\n ensureDashboardDownloaded,\n} from \"./download.js\";\nimport { bigBrainAPIMaybeThrows } from \"../utils/utils.js\";\n\nexport const DEFAULT_LOCAL_DASHBOARD_PORT = 6790;\n\n/**\n * This runs the `dashboard-self-hosted` app locally.\n * It's currently just used for the `anonymous` flow, while everything else\n * uses `dashboard.convex.dev`, and some of the code below is written\n * assuming this is only used for `anonymous`.\n */\nexport async function handleDashboard(\n ctx: Context,\n deployment: { name: string; cloudPort: number; adminKey: string },\n options: {\n /** The backend version to use if the user overrides the default version with the --local-backend-version flag */\n backendVersion: string | undefined;\n },\n) {\n // We call `ensureBackendBinaryDownloaded` here to get the version,\n // but `handleAnonymousDeployment` has already downloaded it.\n const { version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? { kind: \"latest\" }\n : { kind: \"version\", version: options.backendVersion },\n );\n const anonymousId = loadUuidForAnonymousUser(ctx) ?? undefined;\n await ensureDashboardDownloaded(ctx, version);\n const [dashboardPort] = await choosePorts(ctx, {\n count: 1,\n startPort: DEFAULT_LOCAL_DASHBOARD_PORT,\n requestedPorts: [null, null],\n });\n saveProjectDashboardConfig(ctx, deployment.name, {\n port: dashboardPort,\n });\n\n let hasReportedSelfHostedEvent = false;\n\n const serverOptions = { cors: false } as const;\n const { cleanupHandle } = await startServer(\n ctx,\n dashboardPort,\n async (request, response) => {\n const pathname = new URL(\n request.url ?? \"/\",\n // We only want to extract the pathname so the base doesn\u2019t matter\n \"http://localhost\",\n ).pathname;\n\n if (pathname === \"/api/current_deployment\") {\n serverOptions satisfies { cors: false };\n response.setHeader(\"Content-Type\", \"application/json\");\n response.end(\n JSON.stringify({\n name: deployment.name,\n url: localDeploymentUrl(deployment.cloudPort),\n adminKey: deployment.adminKey,\n }),\n );\n return;\n }\n\n if (!hasReportedSelfHostedEvent) {\n hasReportedSelfHostedEvent = true;\n void reportSelfHostedEvent(ctx, {\n anonymousId,\n eventName: \"self_host_dashboard_connected\",\n tag: selfHostedEventTag(\"anonymous\"),\n });\n }\n await serveHandler(request, response, {\n public: dashboardOutDir(),\n });\n },\n serverOptions,\n );\n return {\n dashboardPort,\n cleanupHandle,\n };\n}\n\nasync function reportSelfHostedEvent(\n ctx: Context,\n {\n anonymousId,\n eventName,\n eventFields,\n tag,\n }: {\n anonymousId: string | undefined;\n eventName: string;\n eventFields?: Record<string, unknown>;\n tag: string | undefined;\n },\n) {\n try {\n await bigBrainAPIMaybeThrows({\n ctx,\n method: \"POST\",\n path: \"self_hosted_event\",\n data: {\n selfHostedUuid: anonymousId,\n eventName,\n eventFields,\n tag,\n },\n });\n } catch {\n // ignore\n }\n}\n\nexport function dashboardUrl(ctx: Context, deploymentName: string) {\n const dashboardConfig = loadProjectDashboardConfig(ctx, deploymentName);\n if (dashboardConfig === null) {\n return null;\n }\n\n return `http://127.0.0.1:${dashboardConfig.port}/`;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,uBAKO;AACP,mBAA4B;AAC5B,mBAA4B;AAC5B,iBAAuD;AACvD,2BAAyB;AACzB,sBAGO;AACP,IAAAA,gBAAuC;AAEhC,MAAM,+BAA+B;AAQ5C,eAAsB,gBACpB,KACA,YACA,SAIA;AAGA,QAAM,EAAE,QAAQ,IAAI,UAAM;AAAA,IACxB;AAAA,IACA,QAAQ,mBAAmB,SACvB,EAAE,MAAM,SAAS,IACjB,EAAE,MAAM,WAAW,SAAS,QAAQ,eAAe;AAAA,EACzD;AACA,QAAM,kBAAc,2CAAyB,GAAG,KAAK;AACrD,YAAM,2CAA0B,KAAK,OAAO;AAC5C,QAAM,CAAC,aAAa,IAAI,UAAM,0BAAY,KAAK;AAAA,IAC7C,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB,CAAC,MAAM,IAAI;AAAA,EAC7B,CAAC;AACD,mDAA2B,KAAK,WAAW,MAAM;AAAA,IAC/C,MAAM;AAAA,EACR,CAAC;AAED,MAAI,6BAA6B;AAEjC,QAAM,gBAAgB,EAAE,MAAM,MAAM;AACpC,QAAM,EAAE,cAAc,IAAI,UAAM;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,OAAO,SAAS,aAAa;AAC3B,YAAM,WAAW,IAAI;AAAA,QACnB,QAAQ,OAAO;AAAA;AAAA,QAEf;AAAA,MACF,EAAE;AAEF,UAAI,aAAa,2BAA2B;AAC1C;AACA,iBAAS,UAAU,gBAAgB,kBAAkB;AACrD,iBAAS;AAAA,UACP,KAAK,UAAU;AAAA,YACb,MAAM,WAAW;AAAA,YACjB,SAAK,+BAAmB,WAAW,SAAS;AAAA,YAC5C,UAAU,WAAW;AAAA,UACvB,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,UAAI,CAAC,4BAA4B;AAC/B,qCAA6B;AAC7B,aAAK,sBAAsB,KAAK;AAAA,UAC9B;AAAA,UACA,WAAW;AAAA,UACX,SAAK,+BAAmB,WAAW;AAAA,QACrC,CAAC;AAAA,MACH;AACA,gBAAM,qBAAAC,SAAa,SAAS,UAAU;AAAA,QACpC,YAAQ,kCAAgB;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,sBACb,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMA;AACA,MAAI;AACF,cAAM,sCAAuB;AAAA,MAC3B;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,aAAa,KAAc,gBAAwB;AACjE,QAAM,sBAAkB,6CAA2B,KAAK,cAAc;AACtE,MAAI,oBAAoB,MAAM;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,gBAAgB,IAAI;AACjD;",
6
6
  "names": ["import_utils", "serveHandler"]
7
7
  }
@@ -28,6 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var download_exports = {};
30
30
  __export(download_exports, {
31
+ _findLatestVersionWithBinary: () => _findLatestVersionWithBinary,
31
32
  ensureBackendBinaryDownloaded: () => ensureBackendBinaryDownloaded,
32
33
  ensureDashboardDownloaded: () => ensureDashboardDownloaded,
33
34
  findLatestVersionWithBinary: () => findLatestVersionWithBinary
@@ -85,7 +86,18 @@ async function _ensureBackendBinaryDownloaded(ctx, version) {
85
86
  const binaryPath = await downloadBackendBinary(ctx, version);
86
87
  return { version, binaryPath };
87
88
  }
89
+ let cachedLatestVersion = null;
88
90
  async function findLatestVersionWithBinary(ctx, requireSuccess) {
91
+ if (cachedLatestVersion !== null) {
92
+ return cachedLatestVersion;
93
+ }
94
+ const result = await _findLatestVersionWithBinary(ctx, requireSuccess);
95
+ if (result !== null) {
96
+ cachedLatestVersion = result;
97
+ }
98
+ return result;
99
+ }
100
+ async function _findLatestVersionWithBinary(ctx, requireSuccess) {
89
101
  async function maybeCrash(...args) {
90
102
  if (requireSuccess) {
91
103
  return await ctx.crash(...args);
@@ -252,12 +264,13 @@ async function downloadZipFile(ctx, args) {
252
264
  return (0, import_filePaths.executablePath)(version);
253
265
  }
254
266
  async function ensureDashboardDownloaded(ctx, version) {
255
- const config = (0, import_filePaths.loadDashboardConfig)(ctx);
267
+ const config = (0, import_filePaths.loadGlobalDashboardConfig)(ctx);
256
268
  if (config !== null && config.version === version) {
257
269
  return;
258
270
  }
259
271
  await (0, import_filePaths.resetDashboardDir)(ctx);
260
272
  await _ensureDashboardDownloaded(ctx, version);
273
+ (0, import_filePaths.saveGlobalDashboardConfig)(ctx, { version });
261
274
  }
262
275
  async function _ensureDashboardDownloaded(ctx, version) {
263
276
  const zipLocation = (0, import_filePaths.dashboardZip)();