convex 1.46.0 → 1.48.0-alpha.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 (479) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/dist/browser.bundle.js +7 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/bundler/context.js +7 -5
  5. package/dist/cjs/bundler/context.js.map +2 -2
  6. package/dist/cjs/bundler/fs.js +47 -6
  7. package/dist/cjs/bundler/fs.js.map +2 -2
  8. package/dist/cjs/bundler/index.js +5 -4
  9. package/dist/cjs/bundler/index.js.map +2 -2
  10. package/dist/cjs/cli/account.js +237 -0
  11. package/dist/cjs/cli/account.js.map +7 -0
  12. package/dist/cjs/cli/codegen.js +0 -4
  13. package/dist/cjs/cli/codegen.js.map +2 -2
  14. package/dist/cjs/cli/configure.js +28 -6
  15. package/dist/cjs/cli/configure.js.map +2 -2
  16. package/dist/cjs/cli/deploy.js +27 -2
  17. package/dist/cjs/cli/deploy.js.map +2 -2
  18. package/dist/cjs/cli/deploymentSelect.js +2 -2
  19. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  20. package/dist/cjs/cli/dev.js +6 -0
  21. package/dist/cjs/cli/dev.js.map +2 -2
  22. package/dist/cjs/cli/env.js +10 -5
  23. package/dist/cjs/cli/env.js.map +2 -2
  24. package/dist/cjs/cli/envDefault.js +7 -2
  25. package/dist/cjs/cli/envDefault.js.map +2 -2
  26. package/dist/cjs/cli/generatedApi.js.map +1 -1
  27. package/dist/cjs/cli/lib/api.js +2 -0
  28. package/dist/cjs/cli/lib/api.js.map +2 -2
  29. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js +113 -0
  30. package/dist/cjs/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  31. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +36 -47
  32. package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  33. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +58 -39
  34. package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  35. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js +90 -0
  36. package/dist/cjs/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  37. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  38. package/dist/cjs/cli/lib/command.js +2 -1
  39. package/dist/cjs/cli/lib/command.js.map +2 -2
  40. package/dist/cjs/cli/lib/components/definition/bundle.js +37 -11
  41. package/dist/cjs/cli/lib/components/definition/bundle.js.map +2 -2
  42. package/dist/cjs/cli/lib/components.js +48 -5
  43. package/dist/cjs/cli/lib/components.js.map +2 -2
  44. package/dist/cjs/cli/lib/config.js +56 -17
  45. package/dist/cjs/cli/lib/config.js.map +2 -2
  46. package/dist/cjs/cli/lib/deploy2.js +3 -1
  47. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  48. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +30 -2
  49. package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  50. package/dist/cjs/cli/lib/deployKeyWarning.js +43 -0
  51. package/dist/cjs/cli/lib/deployKeyWarning.js.map +7 -0
  52. package/dist/cjs/cli/lib/deployment.js +2 -0
  53. package/dist/cjs/cli/lib/deployment.js.map +2 -2
  54. package/dist/cjs/cli/lib/deploymentSelection.js +27 -18
  55. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  56. package/dist/cjs/cli/lib/dev.js +5 -0
  57. package/dist/cjs/cli/lib/dev.js.map +2 -2
  58. package/dist/cjs/cli/lib/envvars.js +32 -0
  59. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  60. package/dist/cjs/cli/lib/formatValidationProgress.js +47 -0
  61. package/dist/cjs/cli/lib/formatValidationProgress.js.map +7 -0
  62. package/dist/cjs/cli/lib/fsUtils.js +1 -1
  63. package/dist/cjs/cli/lib/fsUtils.js.map +2 -2
  64. package/dist/cjs/cli/lib/generateDocs.js +1 -1
  65. package/dist/cjs/cli/lib/generateDocs.js.map +1 -1
  66. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  67. package/dist/cjs/cli/lib/login.js +28 -4
  68. package/dist/cjs/cli/lib/login.js.map +2 -2
  69. package/dist/cjs/cli/lib/mcp/requestContext.js +5 -1
  70. package/dist/cjs/cli/lib/mcp/requestContext.js.map +2 -2
  71. package/dist/cjs/cli/lib/mcp/tools/env.js +10 -3
  72. package/dist/cjs/cli/lib/mcp/tools/env.js.map +2 -2
  73. package/dist/cjs/cli/lib/profileManagement.js +196 -0
  74. package/dist/cjs/cli/lib/profileManagement.js.map +7 -0
  75. package/dist/cjs/cli/lib/profiles.js +333 -0
  76. package/dist/cjs/cli/lib/profiles.js.map +7 -0
  77. package/dist/cjs/cli/lib/run.js +4 -0
  78. package/dist/cjs/cli/lib/run.js.map +2 -2
  79. package/dist/cjs/cli/lib/schemaEvaluation.js +62 -0
  80. package/dist/cjs/cli/lib/schemaEvaluation.js.map +7 -0
  81. package/dist/cjs/cli/lib/usageLimits.js +4 -2
  82. package/dist/cjs/cli/lib/usageLimits.js.map +2 -2
  83. package/dist/cjs/cli/lib/utils/mutex.js +9 -24
  84. package/dist/cjs/cli/lib/utils/mutex.js.map +2 -2
  85. package/dist/cjs/cli/lib/utils/utils.js +66 -27
  86. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  87. package/dist/cjs/cli/login.js +213 -114
  88. package/dist/cjs/cli/login.js.map +3 -3
  89. package/dist/cjs/cli/logout.js +113 -12
  90. package/dist/cjs/cli/logout.js.map +3 -3
  91. package/dist/cjs/cli/mcp.js +43 -10
  92. package/dist/cjs/cli/mcp.js.map +3 -3
  93. package/dist/cjs/cli/program.js +2 -1
  94. package/dist/cjs/cli/program.js.map +2 -2
  95. package/dist/cjs/cli/projectCreate.js +1 -1
  96. package/dist/cjs/cli/projectCreate.js.map +1 -1
  97. package/dist/cjs/index.js +1 -1
  98. package/dist/cjs/index.js.map +1 -1
  99. package/dist/cjs/server/impl/actions_impl.js +8 -3
  100. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  101. package/dist/cjs/server/impl/storage_impl.js +29 -0
  102. package/dist/cjs/server/impl/storage_impl.js.map +2 -2
  103. package/dist/cjs/server/index.js +1 -0
  104. package/dist/cjs/server/index.js.map +2 -2
  105. package/dist/cjs/server/meta.js.map +1 -1
  106. package/dist/cjs/server/registration.js.map +1 -1
  107. package/dist/cjs/server/schema.js +34 -12
  108. package/dist/cjs/server/schema.js.map +2 -2
  109. package/dist/cjs/server/storage.js.map +1 -1
  110. package/dist/cjs/values/validators.js +1 -1
  111. package/dist/cjs/values/validators.js.map +2 -2
  112. package/dist/cjs/values/value.js +6 -0
  113. package/dist/cjs/values/value.js.map +2 -2
  114. package/dist/cjs-types/bundler/context.d.ts +5 -0
  115. package/dist/cjs-types/bundler/context.d.ts.map +1 -1
  116. package/dist/cjs-types/bundler/fs.d.ts +7 -2
  117. package/dist/cjs-types/bundler/fs.d.ts.map +1 -1
  118. package/dist/cjs-types/bundler/index.d.ts +9 -2
  119. package/dist/cjs-types/bundler/index.d.ts.map +1 -1
  120. package/dist/cjs-types/cli/account.d.ts +6 -0
  121. package/dist/cjs-types/cli/account.d.ts.map +1 -0
  122. package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
  123. package/dist/cjs-types/cli/configure.d.ts +6 -0
  124. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/deploy.d.ts +2 -0
  126. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/deploymentCreate.d.ts +6 -6
  128. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/dev.d.ts +1 -0
  130. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  132. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
  134. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  136. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  137. package/dist/cjs-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  138. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  139. package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  140. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  141. package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  142. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  143. package/dist/cjs-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  144. package/dist/cjs-types/cli/lib/codegen.d.ts +0 -3
  145. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  146. package/dist/cjs-types/cli/lib/command.d.ts +2 -0
  147. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  148. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts +13 -0
  149. package/dist/cjs-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  150. package/dist/cjs-types/cli/lib/components.d.ts +4 -0
  151. package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
  152. package/dist/cjs-types/cli/lib/config.d.ts +2 -1
  153. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  154. package/dist/cjs-types/cli/lib/deploy2.d.ts +2 -0
  155. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  156. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  157. package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts +3 -0
  159. package/dist/cjs-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  160. package/dist/cjs-types/cli/lib/deployment.d.ts +2 -0
  161. package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
  162. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -1
  163. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  164. package/dist/cjs-types/cli/lib/dev.d.ts +1 -0
  165. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  166. package/dist/cjs-types/cli/lib/envvars.d.ts +6 -0
  167. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  168. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts +8 -0
  169. package/dist/cjs-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  170. package/dist/cjs-types/cli/lib/fsUtils.d.ts +1 -0
  171. package/dist/cjs-types/cli/lib/fsUtils.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/login.d.ts +3 -1
  173. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  174. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts +8 -5
  176. package/dist/cjs-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  178. package/dist/cjs-types/cli/lib/profileManagement.d.ts +10 -0
  179. package/dist/cjs-types/cli/lib/profileManagement.d.ts.map +1 -0
  180. package/dist/cjs-types/cli/lib/profiles.d.ts +59 -0
  181. package/dist/cjs-types/cli/lib/profiles.d.ts.map +1 -0
  182. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  183. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts +33 -0
  184. package/dist/cjs-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  185. package/dist/cjs-types/cli/lib/usageLimits.d.ts +1 -1
  186. package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -1
  187. package/dist/cjs-types/cli/lib/utils/mutex.d.ts +1 -3
  188. package/dist/cjs-types/cli/lib/utils/mutex.d.ts.map +1 -1
  189. package/dist/cjs-types/cli/lib/utils/utils.d.ts +15 -2
  190. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  191. package/dist/cjs-types/cli/login.d.ts +21 -0
  192. package/dist/cjs-types/cli/login.d.ts.map +1 -1
  193. package/dist/cjs-types/cli/logout.d.ts +8 -1
  194. package/dist/cjs-types/cli/logout.d.ts.map +1 -1
  195. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  196. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  197. package/dist/cjs-types/index.d.ts +1 -1
  198. package/dist/cjs-types/index.d.ts.map +1 -1
  199. package/dist/cjs-types/server/impl/actions_impl.d.ts +18 -3
  200. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  201. package/dist/cjs-types/server/impl/storage_impl.d.ts.map +1 -1
  202. package/dist/cjs-types/server/index.d.ts +1 -1
  203. package/dist/cjs-types/server/index.d.ts.map +1 -1
  204. package/dist/cjs-types/server/meta.d.ts +63 -0
  205. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  206. package/dist/cjs-types/server/registration.d.ts +10 -0
  207. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  208. package/dist/cjs-types/server/schema.d.ts +33 -0
  209. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  210. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  211. package/dist/cjs-types/values/value.d.ts.map +1 -1
  212. package/dist/cli.bundle.cjs +4889 -2980
  213. package/dist/cli.bundle.cjs.map +4 -4
  214. package/dist/esm/bundler/context.js +7 -5
  215. package/dist/esm/bundler/context.js.map +2 -2
  216. package/dist/esm/bundler/fs.js +47 -6
  217. package/dist/esm/bundler/fs.js.map +2 -2
  218. package/dist/esm/bundler/index.js +5 -4
  219. package/dist/esm/bundler/index.js.map +2 -2
  220. package/dist/esm/cli/account.js +221 -0
  221. package/dist/esm/cli/account.js.map +7 -0
  222. package/dist/esm/cli/codegen.js +0 -4
  223. package/dist/esm/cli/codegen.js.map +2 -2
  224. package/dist/esm/cli/configure.js +27 -6
  225. package/dist/esm/cli/configure.js.map +2 -2
  226. package/dist/esm/cli/deploy.js +27 -2
  227. package/dist/esm/cli/deploy.js.map +2 -2
  228. package/dist/esm/cli/deploymentSelect.js +6 -3
  229. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  230. package/dist/esm/cli/dev.js +6 -0
  231. package/dist/esm/cli/dev.js.map +2 -2
  232. package/dist/esm/cli/env.js +11 -6
  233. package/dist/esm/cli/env.js.map +2 -2
  234. package/dist/esm/cli/envDefault.js +7 -2
  235. package/dist/esm/cli/envDefault.js.map +2 -2
  236. package/dist/esm/cli/lib/api.js +2 -0
  237. package/dist/esm/cli/lib/api.js.map +2 -2
  238. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js +95 -0
  239. package/dist/esm/cli/lib/checkForLargeIndexBackfill.js.map +7 -0
  240. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +37 -48
  241. package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
  242. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +63 -41
  243. package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +2 -2
  244. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js +68 -0
  245. package/dist/esm/cli/lib/checkForStagedValidatorDeletion.js.map +7 -0
  246. package/dist/esm/cli/lib/codegen.js.map +2 -2
  247. package/dist/esm/cli/lib/command.js +2 -1
  248. package/dist/esm/cli/lib/command.js.map +2 -2
  249. package/dist/esm/cli/lib/components/definition/bundle.js +37 -11
  250. package/dist/esm/cli/lib/components/definition/bundle.js.map +2 -2
  251. package/dist/esm/cli/lib/components.js +55 -5
  252. package/dist/esm/cli/lib/components.js.map +2 -2
  253. package/dist/esm/cli/lib/config.js +55 -17
  254. package/dist/esm/cli/lib/config.js.map +2 -2
  255. package/dist/esm/cli/lib/deploy2.js +3 -1
  256. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  257. package/dist/esm/cli/lib/deployApi/evaluateSchema.js +28 -2
  258. package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +2 -2
  259. package/dist/esm/cli/lib/deployKeyWarning.js +27 -0
  260. package/dist/esm/cli/lib/deployKeyWarning.js.map +7 -0
  261. package/dist/esm/cli/lib/deployment.js +2 -2
  262. package/dist/esm/cli/lib/deployment.js.map +2 -2
  263. package/dist/esm/cli/lib/deploymentSelection.js +35 -20
  264. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  265. package/dist/esm/cli/lib/dev.js +5 -0
  266. package/dist/esm/cli/lib/dev.js.map +2 -2
  267. package/dist/esm/cli/lib/envvars.js +35 -1
  268. package/dist/esm/cli/lib/envvars.js.map +2 -2
  269. package/dist/esm/cli/lib/formatValidationProgress.js +24 -0
  270. package/dist/esm/cli/lib/formatValidationProgress.js.map +7 -0
  271. package/dist/esm/cli/lib/fsUtils.js +1 -1
  272. package/dist/esm/cli/lib/fsUtils.js.map +2 -2
  273. package/dist/esm/cli/lib/generateDocs.js +1 -1
  274. package/dist/esm/cli/lib/generateDocs.js.map +1 -1
  275. package/dist/esm/cli/lib/indexes.js.map +1 -1
  276. package/dist/esm/cli/lib/login.js +36 -4
  277. package/dist/esm/cli/lib/login.js.map +2 -2
  278. package/dist/esm/cli/lib/mcp/requestContext.js +5 -1
  279. package/dist/esm/cli/lib/mcp/requestContext.js.map +2 -2
  280. package/dist/esm/cli/lib/mcp/tools/env.js +10 -3
  281. package/dist/esm/cli/lib/mcp/tools/env.js.map +2 -2
  282. package/dist/esm/cli/lib/profileManagement.js +179 -0
  283. package/dist/esm/cli/lib/profileManagement.js.map +7 -0
  284. package/dist/esm/cli/lib/profiles.js +288 -0
  285. package/dist/esm/cli/lib/profiles.js.map +7 -0
  286. package/dist/esm/cli/lib/run.js +4 -0
  287. package/dist/esm/cli/lib/run.js.map +2 -2
  288. package/dist/esm/cli/lib/schemaEvaluation.js +39 -0
  289. package/dist/esm/cli/lib/schemaEvaluation.js.map +7 -0
  290. package/dist/esm/cli/lib/usageLimits.js +4 -2
  291. package/dist/esm/cli/lib/usageLimits.js.map +2 -2
  292. package/dist/esm/cli/lib/utils/mutex.js +9 -24
  293. package/dist/esm/cli/lib/utils/mutex.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/utils.js +63 -27
  295. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  296. package/dist/esm/cli/login.js +225 -112
  297. package/dist/esm/cli/login.js.map +3 -3
  298. package/dist/esm/cli/logout.js +110 -13
  299. package/dist/esm/cli/logout.js.map +2 -2
  300. package/dist/esm/cli/mcp.js +34 -10
  301. package/dist/esm/cli/mcp.js.map +2 -2
  302. package/dist/esm/cli/program.js +2 -1
  303. package/dist/esm/cli/program.js.map +2 -2
  304. package/dist/esm/cli/projectCreate.js +1 -1
  305. package/dist/esm/cli/projectCreate.js.map +1 -1
  306. package/dist/esm/index.js +1 -1
  307. package/dist/esm/index.js.map +1 -1
  308. package/dist/esm/server/impl/actions_impl.js +7 -3
  309. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  310. package/dist/esm/server/impl/storage_impl.js +29 -0
  311. package/dist/esm/server/impl/storage_impl.js.map +2 -2
  312. package/dist/esm/server/index.js +4 -1
  313. package/dist/esm/server/index.js.map +2 -2
  314. package/dist/esm/server/schema.js +34 -12
  315. package/dist/esm/server/schema.js.map +2 -2
  316. package/dist/esm/values/validators.js +1 -1
  317. package/dist/esm/values/validators.js.map +2 -2
  318. package/dist/esm/values/value.js +6 -0
  319. package/dist/esm/values/value.js.map +2 -2
  320. package/dist/esm-types/bundler/context.d.ts +5 -0
  321. package/dist/esm-types/bundler/context.d.ts.map +1 -1
  322. package/dist/esm-types/bundler/fs.d.ts +7 -2
  323. package/dist/esm-types/bundler/fs.d.ts.map +1 -1
  324. package/dist/esm-types/bundler/index.d.ts +9 -2
  325. package/dist/esm-types/bundler/index.d.ts.map +1 -1
  326. package/dist/esm-types/cli/account.d.ts +6 -0
  327. package/dist/esm-types/cli/account.d.ts.map +1 -0
  328. package/dist/esm-types/cli/codegen.d.ts.map +1 -1
  329. package/dist/esm-types/cli/configure.d.ts +6 -0
  330. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  331. package/dist/esm-types/cli/deploy.d.ts +2 -0
  332. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  333. package/dist/esm-types/cli/deploymentCreate.d.ts +6 -6
  334. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  335. package/dist/esm-types/cli/dev.d.ts +1 -0
  336. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  337. package/dist/esm-types/cli/env.d.ts.map +1 -1
  338. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  339. package/dist/esm-types/cli/generatedApi.d.ts +1 -1
  340. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  341. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  342. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts +30 -0
  343. package/dist/esm-types/cli/lib/checkForLargeIndexBackfill.d.ts.map +1 -0
  344. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +5 -7
  345. package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
  346. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +4 -10
  347. package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -1
  348. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts +17 -0
  349. package/dist/esm-types/cli/lib/checkForStagedValidatorDeletion.d.ts.map +1 -0
  350. package/dist/esm-types/cli/lib/codegen.d.ts +0 -3
  351. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  352. package/dist/esm-types/cli/lib/command.d.ts +2 -0
  353. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  354. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts +13 -0
  355. package/dist/esm-types/cli/lib/components/definition/bundle.d.ts.map +1 -1
  356. package/dist/esm-types/cli/lib/components.d.ts +4 -0
  357. package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
  358. package/dist/esm-types/cli/lib/config.d.ts +2 -1
  359. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  360. package/dist/esm-types/cli/lib/deploy2.d.ts +2 -0
  361. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  362. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +460 -16
  363. package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -1
  364. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts +3 -0
  365. package/dist/esm-types/cli/lib/deployKeyWarning.d.ts.map +1 -0
  366. package/dist/esm-types/cli/lib/deployment.d.ts +2 -0
  367. package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
  368. package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -1
  369. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  370. package/dist/esm-types/cli/lib/dev.d.ts +1 -0
  371. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  372. package/dist/esm-types/cli/lib/envvars.d.ts +6 -0
  373. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  374. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts +8 -0
  375. package/dist/esm-types/cli/lib/formatValidationProgress.d.ts.map +1 -0
  376. package/dist/esm-types/cli/lib/fsUtils.d.ts +1 -0
  377. package/dist/esm-types/cli/lib/fsUtils.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/login.d.ts +3 -1
  379. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  380. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts.map +1 -1
  381. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts +8 -5
  382. package/dist/esm-types/cli/lib/mcp/tools/env.d.ts.map +1 -1
  383. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  384. package/dist/esm-types/cli/lib/profileManagement.d.ts +10 -0
  385. package/dist/esm-types/cli/lib/profileManagement.d.ts.map +1 -0
  386. package/dist/esm-types/cli/lib/profiles.d.ts +59 -0
  387. package/dist/esm-types/cli/lib/profiles.d.ts.map +1 -0
  388. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  389. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts +33 -0
  390. package/dist/esm-types/cli/lib/schemaEvaluation.d.ts.map +1 -0
  391. package/dist/esm-types/cli/lib/usageLimits.d.ts +1 -1
  392. package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -1
  393. package/dist/esm-types/cli/lib/utils/mutex.d.ts +1 -3
  394. package/dist/esm-types/cli/lib/utils/mutex.d.ts.map +1 -1
  395. package/dist/esm-types/cli/lib/utils/utils.d.ts +15 -2
  396. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  397. package/dist/esm-types/cli/login.d.ts +21 -0
  398. package/dist/esm-types/cli/login.d.ts.map +1 -1
  399. package/dist/esm-types/cli/logout.d.ts +8 -1
  400. package/dist/esm-types/cli/logout.d.ts.map +1 -1
  401. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  402. package/dist/esm-types/cli/program.d.ts.map +1 -1
  403. package/dist/esm-types/index.d.ts +1 -1
  404. package/dist/esm-types/index.d.ts.map +1 -1
  405. package/dist/esm-types/server/impl/actions_impl.d.ts +18 -3
  406. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  407. package/dist/esm-types/server/impl/storage_impl.d.ts.map +1 -1
  408. package/dist/esm-types/server/index.d.ts +1 -1
  409. package/dist/esm-types/server/index.d.ts.map +1 -1
  410. package/dist/esm-types/server/meta.d.ts +63 -0
  411. package/dist/esm-types/server/meta.d.ts.map +1 -1
  412. package/dist/esm-types/server/registration.d.ts +10 -0
  413. package/dist/esm-types/server/registration.d.ts.map +1 -1
  414. package/dist/esm-types/server/schema.d.ts +33 -0
  415. package/dist/esm-types/server/schema.d.ts.map +1 -1
  416. package/dist/esm-types/server/storage.d.ts.map +1 -1
  417. package/dist/esm-types/values/value.d.ts.map +1 -1
  418. package/dist/react.bundle.js +7 -1
  419. package/dist/react.bundle.js.map +2 -2
  420. package/package.json +5 -5
  421. package/schemas/convex.schema.json +5 -5
  422. package/src/bundler/context.ts +9 -5
  423. package/src/bundler/fs.ts +54 -5
  424. package/src/bundler/index.ts +9 -4
  425. package/src/cli/account.ts +320 -0
  426. package/src/cli/codegen.ts +0 -2
  427. package/src/cli/configure.ts +45 -9
  428. package/src/cli/deploy.ts +36 -5
  429. package/src/cli/deploymentSelect.ts +7 -4
  430. package/src/cli/dev.ts +9 -0
  431. package/src/cli/env.ts +12 -6
  432. package/src/cli/envDefault.ts +8 -2
  433. package/src/cli/generatedApi.ts +1 -1
  434. package/src/cli/lib/api.ts +5 -1
  435. package/src/cli/lib/checkForLargeIndexBackfill.ts +173 -0
  436. package/src/cli/lib/checkForLargeIndexDeletion.ts +45 -58
  437. package/src/cli/lib/checkForSlowSchemaValidation.ts +76 -65
  438. package/src/cli/lib/checkForStagedValidatorDeletion.ts +104 -0
  439. package/src/cli/lib/codegen.ts +0 -3
  440. package/src/cli/lib/command.ts +3 -0
  441. package/src/cli/lib/components/definition/bundle.ts +68 -14
  442. package/src/cli/lib/components.ts +71 -4
  443. package/src/cli/lib/config.ts +85 -18
  444. package/src/cli/lib/deploy2.ts +10 -1
  445. package/src/cli/lib/deployApi/evaluateSchema.ts +35 -0
  446. package/src/cli/lib/deployKeyWarning.ts +43 -0
  447. package/src/cli/lib/deployment.ts +2 -2
  448. package/src/cli/lib/deploymentSelection.ts +37 -18
  449. package/src/cli/lib/dev.ts +14 -0
  450. package/src/cli/lib/envvars.ts +43 -1
  451. package/src/cli/lib/formatValidationProgress.ts +35 -0
  452. package/src/cli/lib/fsUtils.ts +5 -2
  453. package/src/cli/lib/generateDocs.ts +1 -1
  454. package/src/cli/lib/indexes.ts +1 -1
  455. package/src/cli/lib/login.ts +47 -3
  456. package/src/cli/lib/mcp/requestContext.ts +7 -1
  457. package/src/cli/lib/mcp/tools/env.ts +17 -3
  458. package/src/cli/lib/profileManagement.ts +262 -0
  459. package/src/cli/lib/profiles.ts +398 -0
  460. package/src/cli/lib/run.ts +2 -0
  461. package/src/cli/lib/schemaEvaluation.ts +88 -0
  462. package/src/cli/lib/usageLimits.ts +2 -0
  463. package/src/cli/lib/utils/mutex.ts +9 -27
  464. package/src/cli/lib/utils/utils.ts +83 -36
  465. package/src/cli/login.ts +293 -168
  466. package/src/cli/logout.ts +142 -17
  467. package/src/cli/mcp.ts +48 -11
  468. package/src/cli/program.ts +2 -0
  469. package/src/cli/projectCreate.ts +1 -1
  470. package/src/index.ts +1 -1
  471. package/src/server/impl/actions_impl.ts +26 -6
  472. package/src/server/impl/storage_impl.ts +30 -0
  473. package/src/server/index.ts +5 -1
  474. package/src/server/meta.ts +56 -2
  475. package/src/server/registration.ts +10 -0
  476. package/src/server/schema.ts +37 -15
  477. package/src/server/storage.ts +17 -0
  478. package/src/values/validators.ts +1 -1
  479. package/src/values/value.ts +9 -5
@@ -0,0 +1,35 @@
1
+ import { chalkStderr } from "chalk";
2
+ import { DiscardedStagedValidator } from "./deployApi/evaluateSchema.js";
3
+
4
+ export function formatValidationProgress({
5
+ numDocsValidated,
6
+ totalDocs,
7
+ }: {
8
+ numDocsValidated: number;
9
+ totalDocs?: number | null | undefined;
10
+ }): string {
11
+ const checked = numDocsValidated.toLocaleString();
12
+ return totalDocs === null || totalDocs === undefined
13
+ ? `${checked} documents checked`
14
+ : `${checked} of approximately ${totalDocs.toLocaleString()} documents checked`;
15
+ }
16
+
17
+ /** "validated; the push removes the staged validator" */
18
+ export function formatDiscardedStagedValidator(
19
+ validator: DiscardedStagedValidator,
20
+ ): string {
21
+ let status;
22
+ switch (validator.state.state) {
23
+ case "pending": {
24
+ status = `validating in the background (${formatValidationProgress(validator.state)})`;
25
+ break;
26
+ }
27
+ case "valid":
28
+ status = chalkStderr.green("validated");
29
+ break;
30
+ }
31
+ const action = validator.replaced
32
+ ? "the push stages a different validator"
33
+ : "the push removes the staged validator";
34
+ return `${status}; ${action}`;
35
+ }
@@ -6,12 +6,15 @@ import { NodeFs } from "../../bundler/fs.js";
6
6
  export function recursivelyDelete(
7
7
  ctx: Context,
8
8
  deletePath: string,
9
- opts?: { force?: boolean; dryRun?: boolean },
9
+ opts?: { force?: boolean; dryRun?: boolean; followSymlinks?: boolean },
10
10
  ) {
11
11
  const dryRun = !!opts?.dryRun;
12
12
  let st;
13
13
  try {
14
- st = ctx.fs.stat(deletePath);
14
+ st =
15
+ opts?.followSymlinks === false
16
+ ? ctx.fs.lstat(deletePath)
17
+ : ctx.fs.stat(deletePath);
15
18
  } catch (err: any) {
16
19
  if (err.code === "ENOENT" && opts?.force) {
17
20
  return;
@@ -299,7 +299,7 @@ function renderCopyableCommands(text: string): string {
299
299
  .map((line) =>
300
300
  /^- /.test(line)
301
301
  ? line.replace(
302
- /`(npx convex [^`]*)`/g,
302
+ /`(npx convex(?:@[^\s`]+)? [^`]*)`/g,
303
303
  (_, command) =>
304
304
  `<CodeWithCopyButton text={${JSON.stringify(command)}} />`,
305
305
  )
@@ -27,7 +27,7 @@ export type LargeIndexDeletionCheck =
27
27
  | "no verification"
28
28
  // If large indexes are being deleted, ask for confirmation (and fail in non-interactive envs)
29
29
  | "ask for confirmation"
30
- // If large indexes are being deleted, confirm (the user has used --allow-deleting-large-indexes)
30
+ // If large indexes are being deleted, confirm (the user has used --skip-large-indexes-check)
31
31
  | "has confirmation";
32
32
 
33
33
  export function addProgressLinkIfSlow(
@@ -32,6 +32,17 @@ import {
32
32
  modifyGlobalConfig,
33
33
  } from "./utils/globalConfig.js";
34
34
  import { updateBigBrainAuthAfterLogin } from "./deploymentSelection.js";
35
+ import {
36
+ getProfileSelection,
37
+ ProfileSelection,
38
+ profileConfigPath,
39
+ writeProfileCredentials,
40
+ readProfileCredentials,
41
+ } from "./profiles.js";
42
+ import {
43
+ profileLoginMetadata,
44
+ revokeReplacedProfileToken,
45
+ } from "./profileManagement.js";
35
46
 
36
47
  // Per https://github.com/panva/node-openid-client/tree/main/docs#customizing
37
48
  custom.setHttpOptionsDefaults({
@@ -291,6 +302,7 @@ export async function performLogin(
291
302
  anonymousId,
292
303
  vercel,
293
304
  vercelOverride,
305
+ profile: selectedProfile,
294
306
  }: {
295
307
  overrideAuthUrl?: string | undefined;
296
308
  overrideAuthClient?: string | undefined;
@@ -307,8 +319,16 @@ export async function performLogin(
307
319
  anonymousId?: string | undefined;
308
320
  vercel?: boolean | undefined;
309
321
  vercelOverride?: string | undefined;
322
+ profile?: ProfileSelection | null;
310
323
  } = {},
311
324
  ) {
325
+ const auth = ctx.bigBrainAuth();
326
+ const profile =
327
+ selectedProfile !== undefined
328
+ ? selectedProfile
329
+ : auth?.kind === "accessToken" && auth.profile !== undefined
330
+ ? auth.profile
331
+ : await getProfileSelection(ctx);
312
332
  loginFlow = loginFlow || "auto";
313
333
  // Get access token from big-brain
314
334
  // Default the device name to the hostname, but allow the user to change this if the terminal is interactive.
@@ -400,6 +420,12 @@ export async function performLogin(
400
420
  }
401
421
 
402
422
  // Exchange the WorkOS access token for a Convex personal access token.
423
+ const previous =
424
+ profile === null ? null : await readProfileCredentials(ctx, profile, true);
425
+ const metadata =
426
+ profile === null
427
+ ? {}
428
+ : await profileLoginMetadata(ctx, profile, accessToken, previous);
403
429
  ctx._updateBigBrainAuth({
404
430
  accessToken: accessToken,
405
431
  kind: "accessToken",
@@ -417,8 +443,19 @@ export async function performLogin(
417
443
  const newAccessToken = response.data!.accessToken;
418
444
  const globalConfig = { accessToken: newAccessToken };
419
445
  try {
420
- await modifyGlobalConfig(ctx, globalConfig);
421
- const path = globalConfigPath();
446
+ if (profile !== null) {
447
+ await writeProfileCredentials(
448
+ ctx,
449
+ profile.name,
450
+ newAccessToken,
451
+ metadata,
452
+ previous,
453
+ );
454
+ } else {
455
+ await modifyGlobalConfig(ctx, globalConfig);
456
+ }
457
+ const path =
458
+ profile !== null ? profileConfigPath(profile.name) : globalConfigPath();
422
459
  logFinishedStep(`Saved credentials to ${formatPathForPrinting(path)}`);
423
460
  } catch (err: unknown) {
424
461
  return await ctx.crash({
@@ -429,8 +466,15 @@ export async function performLogin(
429
466
  });
430
467
  }
431
468
 
469
+ if (profile !== null) {
470
+ await revokeReplacedProfileToken(
471
+ ctx,
472
+ previous?.accessToken,
473
+ newAccessToken,
474
+ );
475
+ }
432
476
  logVerbose(`performLogin: updating big brain auth after login`);
433
- await updateBigBrainAuthAfterLogin(ctx, newAccessToken);
477
+ await updateBigBrainAuthAfterLogin(ctx, newAccessToken, profile ?? undefined);
434
478
 
435
479
  logVerbose(`performLogin: checking opt ins, acceptOptIns: ${acceptOptIns}`);
436
480
  // Do opt in to TOS and Privacy Policy stuff
@@ -149,7 +149,13 @@ export function encodeDeploymentSelector(
149
149
  projectDir,
150
150
  deployment,
151
151
  };
152
- return `${deployment.kind}:${btoa(JSON.stringify(payload))}`;
152
+ // ASCII JSON escapes support Unicode paths with the existing Latin-1 decoder.
153
+ const serialized = JSON.stringify(payload).replace(
154
+ /[\u0080-\uffff]/g,
155
+ (character) =>
156
+ `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`,
157
+ );
158
+ return `${deployment.kind}:${btoa(serialized)}`;
153
159
  }
154
160
 
155
161
  const payloadSchema = z.object({
@@ -12,13 +12,22 @@ const envListInputSchema = z.object({
12
12
  .describe(
13
13
  "Deployment selector (from the status tool) to list environment variables from.",
14
14
  ),
15
+ includeValues: z
16
+ .boolean()
17
+ .optional()
18
+ .describe(
19
+ "Also return each variable's value. Values are often secrets like API keys, so leave this off unless you need every value, and use envGet to read a single variable instead.",
20
+ ),
15
21
  });
16
22
 
17
23
  const envListOutputSchema = z.object({
18
24
  variables: z.array(
19
25
  z.object({
20
26
  name: z.string(),
21
- value: z.string(),
27
+ value: z
28
+ .string()
29
+ .optional()
30
+ .describe("Only present when includeValues is true."),
22
31
  }),
23
32
  ),
24
33
  });
@@ -28,7 +37,8 @@ export const EnvListTool: ConvexTool<
28
37
  typeof envListOutputSchema
29
38
  > = {
30
39
  name: "envList",
31
- description: "List all environment variables in your Convex deployment.",
40
+ description:
41
+ "List the names of all environment variables in your Convex deployment. Values are left out unless includeValues is true.",
32
42
  inputSchema: envListInputSchema,
33
43
  outputSchema: envListOutputSchema,
34
44
  handler: async (ctx, args) => {
@@ -51,7 +61,11 @@ export const EnvListTool: ConvexTool<
51
61
  componentPath: undefined,
52
62
  args: {},
53
63
  })) as EnvVar[];
54
- return { variables };
64
+ return {
65
+ variables: variables.map(({ name, value }) =>
66
+ args.includeValues ? { name, value } : { name },
67
+ ),
68
+ };
55
69
  },
56
70
  };
57
71
 
@@ -0,0 +1,262 @@
1
+ import { ProjectSelection } from "./deploymentSelection.js";
2
+ import { Context } from "../../bundler/context.js";
3
+ import { logMessage, logWarning } from "../../bundler/log.js";
4
+ import { provisionHost } from "./config.js";
5
+ import { version } from "../version.js";
6
+ import {
7
+ isAnonymousDeployment,
8
+ getDeploymentTypeFromConfiguredDeployment,
9
+ stripDeploymentTypePrefix,
10
+ } from "./deployment.js";
11
+ import { CONVEX_DEPLOYMENT_ENV_VAR_NAME } from "./utils/utils.js";
12
+ import { promptYesNo } from "./utils/prompts.js";
13
+ import { loadProjectEnvironmentVariables } from "./envvars.js";
14
+ import {
15
+ ProfileCredentials,
16
+ ProfileSelection,
17
+ readProfileCredentials,
18
+ readProfileSettings,
19
+ readProfileToken,
20
+ savedProfileNames,
21
+ writeProfileDirectory,
22
+ } from "./profiles.js";
23
+
24
+ export async function profileApi(
25
+ token: string,
26
+ pathname: string,
27
+ body?: unknown,
28
+ ) {
29
+ return await fetch(`${provisionHost}${pathname}`, {
30
+ method: body === undefined ? "GET" : "POST",
31
+ headers: {
32
+ Authorization: `Bearer ${token}`,
33
+ "Convex-Client": `npm-cli-${version}`,
34
+ ...(body === undefined ? {} : { "Content-Type": "application/json" }),
35
+ },
36
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
37
+ signal: AbortSignal.timeout(10_000),
38
+ });
39
+ }
40
+
41
+ export async function deploymentAccess(
42
+ token: string,
43
+ deploymentName: string,
44
+ ): Promise<"yes" | "no" | "unknown"> {
45
+ try {
46
+ const response = await profileApi(
47
+ token,
48
+ `/v1/deployments/${encodeURIComponent(deploymentName)}`,
49
+ );
50
+ if (response.ok) return "yes";
51
+ return [401, 403, 404].includes(response.status) ? "no" : "unknown";
52
+ } catch {
53
+ return "unknown";
54
+ }
55
+ }
56
+
57
+ export async function projectAccess(
58
+ token: string,
59
+ target: ProjectSelection,
60
+ ): Promise<"yes" | "no" | "unknown"> {
61
+ if (target.kind === "deploymentName")
62
+ return deploymentAccess(token, target.deploymentName);
63
+ if (target.kind !== "teamAndProjectSlugs") return "unknown";
64
+ try {
65
+ const response = await profileApi(
66
+ token,
67
+ `/v1/teams/${encodeURIComponent(target.teamSlug)}/projects/${encodeURIComponent(target.projectSlug)}`,
68
+ );
69
+ if (response.ok) return "yes";
70
+ return [401, 403, 404].includes(response.status) ? "no" : "unknown";
71
+ } catch {
72
+ return "unknown";
73
+ }
74
+ }
75
+
76
+ function configuredCloudDeployment(): string | null {
77
+ const configured = process.env[CONVEX_DEPLOYMENT_ENV_VAR_NAME]?.trim();
78
+ if (
79
+ !configured ||
80
+ getDeploymentTypeFromConfiguredDeployment(configured) === "local"
81
+ )
82
+ return null;
83
+ const name = stripDeploymentTypePrefix(configured);
84
+ return isAnonymousDeployment(name) ? null : name;
85
+ }
86
+
87
+ export async function bindProfileToDirectory(
88
+ ctx: Context,
89
+ name: string,
90
+ force = false,
91
+ target?: ProjectSelection,
92
+ ): Promise<boolean> {
93
+ const credentials = await readProfileCredentials(ctx, {
94
+ name,
95
+ source: "account selection",
96
+ });
97
+ loadProjectEnvironmentVariables();
98
+ const deployment = configuredCloudDeployment();
99
+ const selectedTarget =
100
+ target ??
101
+ (deployment === null
102
+ ? null
103
+ : {
104
+ kind: "deploymentName" as const,
105
+ deploymentName: deployment,
106
+ deploymentType: null,
107
+ });
108
+ if (!force && selectedTarget !== null) {
109
+ const label =
110
+ selectedTarget.kind === "teamAndProjectSlugs"
111
+ ? `project "${selectedTarget.teamSlug}/${selectedTarget.projectSlug}"`
112
+ : `deployment "${selectedTarget.kind === "deploymentName" ? selectedTarget.deploymentName : "configured"}"`;
113
+ const access = await projectAccess(
114
+ credentials!.accessToken,
115
+ selectedTarget,
116
+ );
117
+ if (access !== "yes") {
118
+ logWarning(
119
+ access === "no"
120
+ ? `Account "${name}" cannot access ${label}.`
121
+ : `Could not verify whether account "${name}" can access ${label}.`,
122
+ );
123
+ if (
124
+ !process.stdin.isTTY ||
125
+ !(await promptYesNo(ctx, {
126
+ message: `Use account "${name}" here anyway?`,
127
+ default: false,
128
+ }))
129
+ ) {
130
+ logMessage(
131
+ `Directory selection unchanged. To select this account anyway, run \`npx convex account select ${name} --force\`.`,
132
+ );
133
+ return false;
134
+ }
135
+ }
136
+ }
137
+ await writeProfileDirectory(ctx, name);
138
+ return true;
139
+ }
140
+
141
+ export async function profileLoginMetadata(
142
+ ctx: Context,
143
+ profile: ProfileSelection,
144
+ loginToken: string,
145
+ previous: ProfileCredentials | null,
146
+ ): Promise<Omit<ProfileCredentials, "accessToken">> {
147
+ let identity: { memberId: string; email: string } | null = null;
148
+ try {
149
+ const response = await profileApi(loginToken, "/api/dashboard/profile");
150
+ if (response.ok) {
151
+ const data = await response.json();
152
+ if (
153
+ (typeof data.id === "number" || typeof data.id === "string") &&
154
+ typeof data.email === "string"
155
+ ) {
156
+ identity = { memberId: String(data.id), email: data.email };
157
+ }
158
+ }
159
+ } catch {
160
+ // Older authentication tokens can be valid without access to the dashboard profile API.
161
+ }
162
+ const sameAccount =
163
+ previous !== null && (previous.memberId === undefined || identity === null)
164
+ ? await tokensBelongToSameAccount(previous.accessToken, loginToken)
165
+ : null;
166
+ if (
167
+ previous !== null &&
168
+ (previous.memberId === undefined || identity === null
169
+ ? sameAccount !== true
170
+ : identity.memberId !== previous.memberId)
171
+ ) {
172
+ return await ctx.crash({
173
+ exitCode: 1,
174
+ errorType: "fatal",
175
+ printedMessage:
176
+ sameAccount === null &&
177
+ (previous.memberId === undefined || identity === null)
178
+ ? `Could not verify the identity of saved account "${profile.name}". To replace this saved login, run \`npx convex logout --account ${profile.name}\` followed by \`npx convex login --account ${profile.name}\`. Choose the intended account when logging in.`
179
+ : `The login does not match saved account "${profile.name}". Log in with the matching account, or choose another name with \`npx convex login --account <name>\`.`,
180
+ });
181
+ }
182
+ return {
183
+ ...(identity ??
184
+ (previous?.memberId === undefined
185
+ ? {}
186
+ : { memberId: previous.memberId, email: previous.email })),
187
+ };
188
+ }
189
+
190
+ async function tokensBelongToSameAccount(
191
+ older: string,
192
+ newer: string,
193
+ ): Promise<boolean | null> {
194
+ try {
195
+ const responses = await Promise.all(
196
+ [older, newer].map((token) =>
197
+ profileApi(token, "/v1/list_personal_access_tokens?limit=100"),
198
+ ),
199
+ );
200
+ if (responses.some((response) => !response.ok)) return null;
201
+ const lists = await Promise.all(
202
+ responses.map((response) => response.json()),
203
+ );
204
+ if (
205
+ lists.some(
206
+ (list) => !Array.isArray(list.items) || list.items.length === 0,
207
+ )
208
+ )
209
+ return null;
210
+ const ids = new Set(
211
+ lists[0].items.map((token: { id: unknown }) => String(token.id)),
212
+ );
213
+ if (
214
+ lists[1].items.some((token: { id: unknown }) => ids.has(String(token.id)))
215
+ )
216
+ return true;
217
+ // Disjoint partial pages cannot establish that the accounts differ.
218
+ return lists.some((list) => list.pagination?.hasMore !== false)
219
+ ? null
220
+ : false;
221
+ } catch {
222
+ return null;
223
+ }
224
+ }
225
+
226
+ export async function revokeReplacedProfileToken(
227
+ ctx: Context,
228
+ previous: string | undefined,
229
+ accessToken: string,
230
+ ) {
231
+ if (previous === undefined || previous === accessToken) return;
232
+ const settings = await readProfileSettings(ctx);
233
+ if (
234
+ settings.revokeReplacedTokens === false ||
235
+ settings.accessToken === previous
236
+ )
237
+ return;
238
+ for (const name of savedProfileNames(ctx)) {
239
+ const token = readProfileToken(ctx, name);
240
+ if (token === null) {
241
+ logWarning(
242
+ `The new login was saved, but account "${name}" could not be read. Skipping revocation of the replaced token.`,
243
+ );
244
+ return;
245
+ }
246
+ if (token === previous) return;
247
+ }
248
+ try {
249
+ // The API verifies token ownership using the newly authenticated account.
250
+ const response = await profileApi(
251
+ accessToken,
252
+ "/v1/delete_personal_access_token",
253
+ { id: previous },
254
+ );
255
+ if (response.ok) return;
256
+ } catch {
257
+ // The new credentials are already saved, so a failed revocation can be retried in the dashboard.
258
+ }
259
+ logWarning(
260
+ "The new login was saved, but the replaced token could not be revoked. You can remove it in the dashboard's account settings.",
261
+ );
262
+ }