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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/logout.ts"],
4
- "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep } from \"../bundler/log.js\";\nimport { recursivelyDelete } from \"./lib/fsUtils.js\";\nimport { globalConfigPath } from \"./lib/utils/globalConfig.js\";\n\nexport const logout = new Command(\"logout\")\n .description(\"Log out of Convex on this machine\")\n .allowExcessArguments(false)\n .action(async () => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n if (ctx.fs.exists(globalConfigPath())) {\n recursivelyDelete(ctx, globalConfigPath());\n }\n\n logFinishedStep(\n \"You have been logged out of Convex.\\n Run `npx convex dev` to log in.\",\n );\n });\n"],
5
- "mappings": ";AAAA,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AAE1B,aAAM,SAAS,IAAI,QAAQ,QAAQ,EACvC,YAAY,mCAAmC,EAC/C,qBAAqB,KAAK,EAC1B,OAAO,YAAY;AAClB,QAAM,MAAM,MAAM,cAAc;AAAA,IAC9B,KAAK;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,EACX,CAAC;AAED,MAAI,IAAI,GAAG,OAAO,iBAAiB,CAAC,GAAG;AACrC,sBAAkB,KAAK,iBAAiB,CAAC;AAAA,EAC3C;AAEA;AAAA,IACE;AAAA,EACF;AACF,CAAC;",
4
+ "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, logWarning } from \"../bundler/log.js\";\nimport { recursivelyDelete } from \"./lib/fsUtils.js\";\nimport { globalConfigPath } from \"./lib/utils/globalConfig.js\";\nimport {\n getProfileSelection,\n profileConfigPath,\n readProfileToken,\n readProfileSettings,\n updateProfileSettings,\n savedProfileNames,\n} from \"./lib/profiles.js\";\nimport path from \"path\";\nimport { rootDirectory } from \"./lib/utils/utils.js\";\nimport { promptOptions } from \"./lib/utils/prompts.js\";\n\nexport function createLogoutCommand() {\n return new Command(\"logout\")\n .description(\n \"Log out of the selected account. Directory selections are preserved.\",\n )\n .option(\"--account <name>\", \"Remove only this account's saved credentials\")\n .option(\n \"--all\",\n \"Remove all saved account credentials, preserving account selections\",\n )\n .allowExcessArguments(false)\n .action(async (options, cmd) => {\n if (options.all && options.account !== undefined)\n cmd.error(\"Pass either --account or --all, not both.\");\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n skipAuth: true,\n });\n\n let all = !!options.all;\n let profile = all\n ? null\n : await getProfileSelection(ctx, { name: options.account });\n if (\n !all &&\n options.account === undefined &&\n process.stdin.isTTY &&\n profile !== null\n ) {\n const token = readProfileToken(ctx, profile.name);\n const settings = await readProfileSettings(ctx);\n const selectedName = profile.name;\n // A matching compatibility token is another copy of this account's login.\n const hasOtherLogins =\n savedProfileNames(ctx).some((name) => name !== selectedName) ||\n (typeof settings.accessToken === \"string\" &&\n settings.accessToken.length > 0 &&\n settings.accessToken !== token);\n if (hasOtherLogins) {\n const scope = await promptOptions(ctx, {\n message: \"Which saved logins would you like to log out of?\",\n choices: [\n { name: `Only account \"${profile.name}\"`, value: \"profile\" },\n { name: \"All saved logins on this device\", value: \"all\" },\n ],\n default: \"profile\",\n });\n if (scope === \"all\") {\n profile = null;\n all = true;\n }\n }\n }\n\n let warnAboutLegacyCredentials = false;\n if (profile !== null) {\n const selectedName = profile.name;\n await updateProfileSettings(\n ctx,\n (settings) => {\n const token = readProfileToken(ctx, selectedName);\n // A migrated account can share its token with old CLI versions.\n if (token !== null && settings.accessToken === token) {\n delete settings.accessToken;\n } else if (\n settings.defaultProfile === selectedName &&\n typeof settings.accessToken === \"string\" &&\n settings.accessToken.length > 0\n ) {\n // Editing the default or logging in with an older CLI can leave this\n // token belonging to a different account.\n warnAboutLegacyCredentials = true;\n }\n },\n () => {\n const configPath = profileConfigPath(selectedName);\n recursivelyDelete(ctx, configPath, {\n force: true,\n followSymlinks: false,\n });\n },\n );\n } else {\n await updateProfileSettings(\n ctx,\n async (settings) => {\n if (\n !all &&\n savedProfileNames(ctx).length > 0 &&\n settings.accessToken === undefined\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No account is selected. Use `npx convex logout --account <name>` or `npx convex logout --all`.\",\n });\n }\n delete settings.accessToken;\n },\n () => {\n const profilesDir = path.join(rootDirectory(), \"profiles\");\n if (all)\n recursivelyDelete(ctx, profilesDir, {\n force: true,\n followSymlinks: false,\n });\n },\n );\n }\n\n logFinishedStep(\n profile !== null\n ? `Removed credentials for account \"${profile.name}\".\\n Run \\`npx convex login --account ${profile.name}\\` to log in.`\n : `${all ? \"Removed all saved Convex account credentials.\" : \"Removed your saved Convex login credentials.\"}\\n Run \\`npx convex login\\` to log in.`,\n );\n if (warnAboutLegacyCredentials) {\n logWarning(\n `Saved credentials remain in ${globalConfigPath()} for older CLI versions. To remove all saved account credentials, run \\`npx convex logout --all\\`.`,\n );\n }\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n logMessage(\n \"CONVEX_OVERRIDE_ACCESS_TOKEN still supplies credentials. Unset it to stop using that token.\",\n );\n }\n });\n}\n\nexport const logout = createLogoutCommand();\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ import path from "path";
2
3
  import { Command, Option } from "@commander-js/extra-typings";
3
4
  import { oneoffContext } from "../bundler/context.js";
4
5
  import { logError } from "../bundler/log.js";
@@ -7,6 +8,7 @@ import { serveStdio } from "@modelcontextprotocol/server/stdio";
7
8
  import { actionDescription } from "./lib/command.js";
8
9
  import { checkAuthorization } from "./lib/login.js";
9
10
  import {
11
+ encodeDeploymentSelector,
10
12
  RequestContext,
11
13
  RequestCrash
12
14
  } from "./lib/mcp/requestContext.js";
@@ -79,6 +81,11 @@ function enabledTools(options) {
79
81
  export function makeServer(options) {
80
82
  const enabledToolsByName = enabledTools(options);
81
83
  const mutex = new Mutex();
84
+ const serverDirectory = process.cwd();
85
+ options = {
86
+ ...options,
87
+ envFile: options.envFile === void 0 ? void 0 : path.resolve(serverDirectory, options.envFile)
88
+ };
82
89
  const server = new Server(
83
90
  {
84
91
  name: "Convex MCP Server",
@@ -92,16 +99,7 @@ export function makeServer(options) {
92
99
  );
93
100
  server.setRequestHandler("tools/call", async (request) => {
94
101
  const ctx = new RequestContext(options);
95
- await initializeBigBrainAuth(ctx, options);
96
102
  try {
97
- const authorized = await checkAuthorization(ctx, false);
98
- if (!authorized) {
99
- await ctx.crash({
100
- exitCode: 1,
101
- errorType: "fatal",
102
- printedMessage: "Not Authorized: Run `npx convex dev` to login to your Convex project."
103
- });
104
- }
105
103
  if (!request.params.arguments) {
106
104
  await ctx.crash({
107
105
  exitCode: 1,
@@ -119,7 +117,33 @@ export function makeServer(options) {
119
117
  }
120
118
  const input = convexTool.inputSchema.parse(request.params.arguments);
121
119
  const result = await mutex.runExclusive(async () => {
122
- return await convexTool.handler(ctx, input);
120
+ const projectDir = "deploymentSelector" in input ? ctx.decodeDeploymentSelectorUnchecked(input.deploymentSelector).projectDir : ("projectDir" in input ? input.projectDir : void 0) ?? options.projectDir;
121
+ const previousDirectory = process.cwd();
122
+ try {
123
+ if (projectDir !== void 0)
124
+ process.chdir(path.resolve(serverDirectory, projectDir));
125
+ await initializeBigBrainAuth(ctx, options);
126
+ if (!await checkAuthorization(ctx, false)) {
127
+ await ctx.crash({
128
+ exitCode: 1,
129
+ errorType: "fatal",
130
+ printedMessage: "Not Authorized: Run `npx convex dev` to login to your Convex project."
131
+ });
132
+ }
133
+ const absoluteDirectory = process.cwd();
134
+ const resolvedInput = "deploymentSelector" in input ? {
135
+ ...input,
136
+ deploymentSelector: encodeDeploymentSelector(
137
+ absoluteDirectory,
138
+ ctx.decodeDeploymentSelectorUnchecked(
139
+ input.deploymentSelector
140
+ ).deployment
141
+ )
142
+ } : projectDir === void 0 ? input : { ...input, projectDir: absoluteDirectory };
143
+ return await convexTool.handler(ctx, resolvedInput);
144
+ } finally {
145
+ process.chdir(previousDirectory);
146
+ }
123
147
  });
124
148
  return {
125
149
  content: [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/mcp.ts"],
4
- "sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logError } from \"../bundler/log.js\";\nimport { CallToolRequest, Server } from \"@modelcontextprotocol/server\";\nimport { serveStdio } from \"@modelcontextprotocol/server/stdio\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { checkAuthorization } from \"./lib/login.js\";\nimport {\n McpOptions,\n RequestContext,\n RequestCrash,\n} from \"./lib/mcp/requestContext.js\";\nimport { mcpTool, convexTools, ConvexTool } from \"./lib/mcp/tools/index.js\";\nimport { Mutex } from \"./lib/utils/mutex.js\";\nimport { initializeBigBrainAuth } from \"./lib/deploymentSelection.js\";\n\nconst allToolNames = convexTools.map((t) => t.name).sort();\n\nexport const mcp = new Command(\"mcp\")\n .summary(\"Manage the Model Context Protocol server for Convex [BETA]\")\n .description(\n \"Commands to initialize and run a Model Context Protocol server for Convex that can be used with AI tools.\\n\" +\n \"This server exposes your Convex codebase to AI tools in a structured way.\",\n )\n .allowExcessArguments(false);\n\nmcp\n .command(\"start\")\n .summary(\"Start the MCP server\")\n .description(\n \"Start the Model Context Protocol server for Convex that can be used with AI tools.\",\n )\n .option(\n \"--project-dir <project-dir>\",\n \"Run the MCP server for a single project. By default, the MCP server can run for multiple projects, and each tool call specifies its project directory.\",\n )\n .option(\n \"--disable-tools <tool-names>\",\n `Comma separated list of tool names to disable (options: ${allToolNames.join(\", \")})`,\n )\n .option(\n \"--cautiously-allow-production-pii\",\n \"Allow read-only tools (data, logs, queries) on production deployments. These tools may expose PII. Defaults to false.\",\n false,\n )\n .option(\n \"--dangerously-enable-production-deployments\",\n \"DANGEROUSLY allow the MCP server to access production deployments, including mutating tools. Defaults to false.\",\n false,\n )\n // Deprecated option, we swapped the default. no-op.\n .addOption(\n new Option(\"--disable-production-deployments\")\n .conflicts(\"--dangerously-enable-production-deployments\")\n .hideHelp(),\n )\n .addDeploymentSelectionOptions(actionDescription(\"Run the MCP server on\"))\n .action(async (options) => {\n const ctx = await oneoffContext(options);\n try {\n // `serveStdio` only calls the factory once a client connects, and answers\n // a factory throw with an opaque `-32603`, so reject a bad\n // `--disable-tools` here instead.\n enabledTools(options);\n } catch (error: any) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: `Failed to start MCP server: ${error}`,\n printedMessage: `Failed to start MCP server: ${error}`,\n });\n }\n // The SDK picks the era from the client's opening message: a request\n // carrying the 2026-07-28 `_meta` envelope pins a stateless connection,\n // while an `initialize` is still served by the same factory over the legacy\n // protocol.\n // The returned handle's `close()` is intentionally never called: the\n // server lives until the client kills the process, and process exit tears\n // the transport down.\n serveStdio(() => makeServer(options), {\n legacy: \"serve\",\n // The only channel for out-of-band failures (transport errors, dropped\n // malformed notifications). stdout carries the protocol, so they go to\n // stderr.\n onerror: (error) => logError(`MCP server error: ${error.message}`),\n });\n // Keep the process running\n await new Promise(() => {});\n });\n\nfunction enabledTools(\n options: McpOptions,\n): Record<string, ConvexTool<any, any>> {\n const disabledToolNames = new Set<string>();\n for (const toolName of options.disableTools?.split(\",\") ?? []) {\n const name = toolName.trim();\n if (!allToolNames.includes(name)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n `Disabled tool ${name} not found (valid tools: ${allToolNames.join(\", \")})`,\n );\n }\n disabledToolNames.add(name);\n }\n\n const enabledToolsByName: Record<string, ConvexTool<any, any>> = {};\n for (const tool of convexTools) {\n if (!disabledToolNames.has(tool.name)) {\n enabledToolsByName[tool.name] = tool;\n }\n }\n return enabledToolsByName;\n}\n\nexport function makeServer(options: McpOptions) {\n const enabledToolsByName = enabledTools(options);\n const mutex = new Mutex();\n const server = new Server(\n {\n name: \"Convex MCP Server\",\n version: \"0.0.1\",\n },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n server.setRequestHandler(\"tools/call\", async (request: CallToolRequest) => {\n const ctx = new RequestContext(options);\n await initializeBigBrainAuth(ctx, options);\n try {\n const authorized = await checkAuthorization(ctx, false);\n if (!authorized) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Not Authorized: Run `npx convex dev` to login to your Convex project.\",\n });\n }\n if (!request.params.arguments) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"No arguments provided\",\n });\n }\n const convexTool = enabledToolsByName[request.params.name];\n if (!convexTool) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Tool ${request.params.name} not found`,\n });\n }\n const input = convexTool.inputSchema.parse(request.params.arguments);\n\n // Serialize tool handlers since they're mutating the current working directory.\n const result = await mutex.runExclusive(async () => {\n return await convexTool.handler(ctx, input);\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result),\n },\n ],\n };\n } catch (error: any) {\n let message: string;\n if (error instanceof RequestCrash) {\n message = error.printedMessage;\n } else if (error instanceof Error) {\n message = error.message;\n } else {\n message = String(error);\n }\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: message }),\n },\n ],\n isError: true,\n };\n }\n });\n server.setRequestHandler(\"tools/list\", async () => {\n return {\n tools: Object.values(enabledToolsByName).map(mcpTool),\n };\n });\n return server;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import path from \"path\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logError } from \"../bundler/log.js\";\nimport { CallToolRequest, Server } from \"@modelcontextprotocol/server\";\nimport { serveStdio } from \"@modelcontextprotocol/server/stdio\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { checkAuthorization } from \"./lib/login.js\";\nimport {\n encodeDeploymentSelector,\n McpOptions,\n RequestContext,\n RequestCrash,\n} from \"./lib/mcp/requestContext.js\";\nimport { mcpTool, convexTools, ConvexTool } from \"./lib/mcp/tools/index.js\";\nimport { Mutex } from \"./lib/utils/mutex.js\";\nimport { initializeBigBrainAuth } from \"./lib/deploymentSelection.js\";\n\nconst allToolNames = convexTools.map((t) => t.name).sort();\n\nexport const mcp = new Command(\"mcp\")\n .summary(\"Manage the Model Context Protocol server for Convex [BETA]\")\n .description(\n \"Commands to initialize and run a Model Context Protocol server for Convex that can be used with AI tools.\\n\" +\n \"This server exposes your Convex codebase to AI tools in a structured way.\",\n )\n .allowExcessArguments(false);\n\nmcp\n .command(\"start\")\n .summary(\"Start the MCP server\")\n .description(\n \"Start the Model Context Protocol server for Convex that can be used with AI tools.\",\n )\n .option(\n \"--project-dir <project-dir>\",\n \"Run the MCP server for a single project. By default, the MCP server can run for multiple projects, and each tool call specifies its project directory.\",\n )\n .option(\n \"--disable-tools <tool-names>\",\n `Comma separated list of tool names to disable (options: ${allToolNames.join(\", \")})`,\n )\n .option(\n \"--cautiously-allow-production-pii\",\n \"Allow read-only tools (data, logs, queries) on production deployments. These tools may expose PII. Defaults to false.\",\n false,\n )\n .option(\n \"--dangerously-enable-production-deployments\",\n \"DANGEROUSLY allow the MCP server to access production deployments, including mutating tools. Defaults to false.\",\n false,\n )\n // Deprecated option, we swapped the default. no-op.\n .addOption(\n new Option(\"--disable-production-deployments\")\n .conflicts(\"--dangerously-enable-production-deployments\")\n .hideHelp(),\n )\n .addDeploymentSelectionOptions(actionDescription(\"Run the MCP server on\"))\n .action(async (options) => {\n const ctx = await oneoffContext(options);\n try {\n // `serveStdio` only calls the factory once a client connects, and answers\n // a factory throw with an opaque `-32603`, so reject a bad\n // `--disable-tools` here instead.\n enabledTools(options);\n } catch (error: any) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: `Failed to start MCP server: ${error}`,\n printedMessage: `Failed to start MCP server: ${error}`,\n });\n }\n // The SDK picks the era from the client's opening message: a request\n // carrying the 2026-07-28 `_meta` envelope pins a stateless connection,\n // while an `initialize` is still served by the same factory over the legacy\n // protocol.\n // The returned handle's `close()` is intentionally never called: the\n // server lives until the client kills the process, and process exit tears\n // the transport down.\n serveStdio(() => makeServer(options), {\n legacy: \"serve\",\n // The only channel for out-of-band failures (transport errors, dropped\n // malformed notifications). stdout carries the protocol, so they go to\n // stderr.\n onerror: (error) => logError(`MCP server error: ${error.message}`),\n });\n // Keep the process running\n await new Promise(() => {});\n });\n\nfunction enabledTools(\n options: McpOptions,\n): Record<string, ConvexTool<any, any>> {\n const disabledToolNames = new Set<string>();\n for (const toolName of options.disableTools?.split(\",\") ?? []) {\n const name = toolName.trim();\n if (!allToolNames.includes(name)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n `Disabled tool ${name} not found (valid tools: ${allToolNames.join(\", \")})`,\n );\n }\n disabledToolNames.add(name);\n }\n\n const enabledToolsByName: Record<string, ConvexTool<any, any>> = {};\n for (const tool of convexTools) {\n if (!disabledToolNames.has(tool.name)) {\n enabledToolsByName[tool.name] = tool;\n }\n }\n return enabledToolsByName;\n}\n\nexport function makeServer(options: McpOptions) {\n const enabledToolsByName = enabledTools(options);\n const mutex = new Mutex();\n const serverDirectory = process.cwd();\n options = {\n ...options,\n envFile:\n options.envFile === undefined\n ? undefined\n : path.resolve(serverDirectory, options.envFile),\n };\n const server = new Server(\n {\n name: \"Convex MCP Server\",\n version: \"0.0.1\",\n },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n server.setRequestHandler(\"tools/call\", async (request: CallToolRequest) => {\n const ctx = new RequestContext(options);\n try {\n if (!request.params.arguments) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"No arguments provided\",\n });\n }\n const convexTool = enabledToolsByName[request.params.name];\n if (!convexTool) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Tool ${request.params.name} not found`,\n });\n }\n const input = convexTool.inputSchema.parse(request.params.arguments);\n\n // Serialize tool handlers since they're mutating the current working directory.\n const result = await mutex.runExclusive(async () => {\n const projectDir =\n \"deploymentSelector\" in input\n ? ctx.decodeDeploymentSelectorUnchecked(input.deploymentSelector)\n .projectDir\n : ((\"projectDir\" in input ? input.projectDir : undefined) ??\n options.projectDir);\n const previousDirectory = process.cwd();\n try {\n if (projectDir !== undefined)\n process.chdir(path.resolve(serverDirectory, projectDir));\n await initializeBigBrainAuth(ctx, options);\n if (!(await checkAuthorization(ctx, false))) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Not Authorized: Run `npx convex dev` to login to your Convex project.\",\n });\n }\n const absoluteDirectory = process.cwd();\n const resolvedInput =\n \"deploymentSelector\" in input\n ? {\n ...input,\n deploymentSelector: encodeDeploymentSelector(\n absoluteDirectory,\n ctx.decodeDeploymentSelectorUnchecked(\n input.deploymentSelector,\n ).deployment,\n ),\n }\n : projectDir === undefined\n ? input\n : { ...input, projectDir: absoluteDirectory };\n return await convexTool.handler(ctx, resolvedInput);\n } finally {\n process.chdir(previousDirectory);\n }\n });\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result),\n },\n ],\n };\n } catch (error: any) {\n let message: string;\n if (error instanceof RequestCrash) {\n message = error.printedMessage;\n } else if (error instanceof Error) {\n message = error.message;\n } else {\n message = String(error);\n }\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: message }),\n },\n ],\n isError: true,\n };\n }\n });\n server.setRequestHandler(\"tools/list\", async () => {\n return {\n tools: Object.values(enabledToolsByName).map(mcpTool),\n };\n });\n return server;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -22,6 +22,7 @@ import { logout } from "./logout.js";
22
22
  import { logs } from "./logs.js";
23
23
  import { mcp } from "./mcp.js";
24
24
  import { networkTest } from "./network_test.js";
25
+ import { account } from "./account.js";
25
26
  import { project } from "./project.js";
26
27
  import { reinit } from "./reinit.js";
27
28
  import { run } from "./run.js";
@@ -30,6 +31,6 @@ import { update } from "./update.js";
30
31
  import { version } from "./version.js";
31
32
  export function buildProgram() {
32
33
  const program = new Command();
33
- return program.name("convex").usage("<command> [options]").description("Start developing with Convex by running `npx convex dev`.").addCommand(login, { hidden: true }).addCommand(init, { hidden: true }).addCommand(reinit, { hidden: true }).addCommand(dev).addCommand(deploy).addCommand(deployments, { hidden: true }).addCommand(run).addCommand(convexImport).addCommand(dashboard).addCommand(docs).addCommand(logs).addCommand(typecheck, { hidden: true }).addCommand(auth, { hidden: true }).addCommand(convexExport).addCommand(env).addCommand(data).addCommand(deployment).addCommand(project).addCommand(codegen).addCommand(update).addCommand(logout).addCommand(networkTest, { hidden: true }).addCommand(integration, { hidden: true }).addCommand(functionSpec).addCommand(insights).addCommand(mcp).addCommand(aiFiles).helpCommand("help <command>", "Show help for given <command>").version(version).configureHelp({ visibleOptions: () => [] }).showHelpAfterError();
34
+ return program.name("convex").usage("<command> [options]").description("Start developing with Convex by running `npx convex dev`.").addCommand(login, { hidden: true }).addCommand(init, { hidden: true }).addCommand(reinit, { hidden: true }).addCommand(dev).addCommand(deploy).addCommand(deployments, { hidden: true }).addCommand(run).addCommand(convexImport).addCommand(dashboard).addCommand(docs).addCommand(logs).addCommand(typecheck, { hidden: true }).addCommand(auth, { hidden: true }).addCommand(convexExport).addCommand(env).addCommand(data).addCommand(deployment).addCommand(project).addCommand(codegen).addCommand(update).addCommand(logout).addCommand(account).addCommand(networkTest, { hidden: true }).addCommand(integration, { hidden: true }).addCommand(functionSpec).addCommand(insights).addCommand(mcp).addCommand(aiFiles).helpCommand("help <command>", "Show help for given <command>").version(version).configureHelp({ visibleOptions: () => [] }).showHelpAfterError();
34
35
  }
35
36
  //# sourceMappingURL=program.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/program.ts"],
4
- "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { aiFiles } from \"./aiFiles.js\";\nimport { auth } from \"./auth.js\";\nimport { codegen } from \"./codegen.js\";\nimport { convexExport } from \"./convexExport.js\";\nimport { convexImport } from \"./convexImport.js\";\nimport { dashboard } from \"./dashboard.js\";\nimport { data } from \"./data.js\";\nimport { deploy } from \"./deploy.js\";\nimport { deployment } from \"./deployment.js\";\nimport { deployments } from \"./deployments.js\";\nimport { dev } from \"./dev.js\";\nimport { docs } from \"./docs.js\";\nimport { env } from \"./env.js\";\nimport { functionSpec } from \"./functionSpec.js\";\nimport { init } from \"./init.js\";\nimport { insights } from \"./insights.js\";\nimport { integration } from \"./integration.js\";\nimport { login } from \"./login.js\";\nimport { logout } from \"./logout.js\";\nimport { logs } from \"./logs.js\";\nimport { mcp } from \"./mcp.js\";\nimport { networkTest } from \"./network_test.js\";\nimport { project } from \"./project.js\";\nimport { reinit } from \"./reinit.js\";\nimport { run } from \"./run.js\";\nimport { typecheck } from \"./typecheck.js\";\nimport { update } from \"./update.js\";\nimport { version } from \"./version.js\";\n\nexport function buildProgram() {\n const program = new Command();\n return (\n program\n .name(\"convex\")\n .usage(\"<command> [options]\")\n .description(\"Start developing with Convex by running `npx convex dev`.\")\n .addCommand(login, { hidden: true })\n .addCommand(init, { hidden: true })\n .addCommand(reinit, { hidden: true })\n .addCommand(dev)\n .addCommand(deploy)\n .addCommand(deployments, { hidden: true })\n .addCommand(run)\n .addCommand(convexImport)\n .addCommand(dashboard)\n .addCommand(docs)\n .addCommand(logs)\n .addCommand(typecheck, { hidden: true })\n .addCommand(auth, { hidden: true })\n .addCommand(convexExport)\n .addCommand(env)\n .addCommand(data)\n .addCommand(deployment)\n .addCommand(project)\n .addCommand(codegen)\n .addCommand(update)\n .addCommand(logout)\n .addCommand(networkTest, { hidden: true })\n .addCommand(integration, { hidden: true })\n .addCommand(functionSpec)\n .addCommand(insights)\n .addCommand(mcp)\n .addCommand(aiFiles)\n .helpCommand(\"help <command>\", \"Show help for given <command>\")\n .version(version)\n // Hide version and help so they don't clutter\n // the list of commands.\n .configureHelp({ visibleOptions: () => [] })\n .showHelpAfterError()\n );\n}\n"],
5
- "mappings": ";AAAA,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,WAAW;AACpB,SAAS,YAAY;AACrB,SAAS,WAAW;AACpB,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AACrB,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,WAAW;AACpB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,WAAW;AACpB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,eAAe;AAEjB,gBAAS,eAAe;AAC7B,QAAM,UAAU,IAAI,QAAQ;AAC5B,SACE,QACG,KAAK,QAAQ,EACb,MAAM,qBAAqB,EAC3B,YAAY,2DAA2D,EACvE,WAAW,OAAO,EAAE,QAAQ,KAAK,CAAC,EAClC,WAAW,MAAM,EAAE,QAAQ,KAAK,CAAC,EACjC,WAAW,QAAQ,EAAE,QAAQ,KAAK,CAAC,EACnC,WAAW,GAAG,EACd,WAAW,MAAM,EACjB,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC,EACxC,WAAW,GAAG,EACd,WAAW,YAAY,EACvB,WAAW,SAAS,EACpB,WAAW,IAAI,EACf,WAAW,IAAI,EACf,WAAW,WAAW,EAAE,QAAQ,KAAK,CAAC,EACtC,WAAW,MAAM,EAAE,QAAQ,KAAK,CAAC,EACjC,WAAW,YAAY,EACvB,WAAW,GAAG,EACd,WAAW,IAAI,EACf,WAAW,UAAU,EACrB,WAAW,OAAO,EAClB,WAAW,OAAO,EAClB,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC,EACxC,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC,EACxC,WAAW,YAAY,EACvB,WAAW,QAAQ,EACnB,WAAW,GAAG,EACd,WAAW,OAAO,EAClB,YAAY,kBAAkB,+BAA+B,EAC7D,QAAQ,OAAO,EAGf,cAAc,EAAE,gBAAgB,MAAM,CAAC,EAAE,CAAC,EAC1C,mBAAmB;AAE1B;",
4
+ "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { aiFiles } from \"./aiFiles.js\";\nimport { auth } from \"./auth.js\";\nimport { codegen } from \"./codegen.js\";\nimport { convexExport } from \"./convexExport.js\";\nimport { convexImport } from \"./convexImport.js\";\nimport { dashboard } from \"./dashboard.js\";\nimport { data } from \"./data.js\";\nimport { deploy } from \"./deploy.js\";\nimport { deployment } from \"./deployment.js\";\nimport { deployments } from \"./deployments.js\";\nimport { dev } from \"./dev.js\";\nimport { docs } from \"./docs.js\";\nimport { env } from \"./env.js\";\nimport { functionSpec } from \"./functionSpec.js\";\nimport { init } from \"./init.js\";\nimport { insights } from \"./insights.js\";\nimport { integration } from \"./integration.js\";\nimport { login } from \"./login.js\";\nimport { logout } from \"./logout.js\";\nimport { logs } from \"./logs.js\";\nimport { mcp } from \"./mcp.js\";\nimport { networkTest } from \"./network_test.js\";\nimport { account } from \"./account.js\";\nimport { project } from \"./project.js\";\nimport { reinit } from \"./reinit.js\";\nimport { run } from \"./run.js\";\nimport { typecheck } from \"./typecheck.js\";\nimport { update } from \"./update.js\";\nimport { version } from \"./version.js\";\n\nexport function buildProgram() {\n const program = new Command();\n return (\n program\n .name(\"convex\")\n .usage(\"<command> [options]\")\n .description(\"Start developing with Convex by running `npx convex dev`.\")\n .addCommand(login, { hidden: true })\n .addCommand(init, { hidden: true })\n .addCommand(reinit, { hidden: true })\n .addCommand(dev)\n .addCommand(deploy)\n .addCommand(deployments, { hidden: true })\n .addCommand(run)\n .addCommand(convexImport)\n .addCommand(dashboard)\n .addCommand(docs)\n .addCommand(logs)\n .addCommand(typecheck, { hidden: true })\n .addCommand(auth, { hidden: true })\n .addCommand(convexExport)\n .addCommand(env)\n .addCommand(data)\n .addCommand(deployment)\n .addCommand(project)\n .addCommand(codegen)\n .addCommand(update)\n .addCommand(logout)\n .addCommand(account)\n .addCommand(networkTest, { hidden: true })\n .addCommand(integration, { hidden: true })\n .addCommand(functionSpec)\n .addCommand(insights)\n .addCommand(mcp)\n .addCommand(aiFiles)\n .helpCommand(\"help <command>\", \"Show help for given <command>\")\n .version(version)\n // Hide version and help so they don't clutter\n // the list of commands.\n .configureHelp({ visibleOptions: () => [] })\n .showHelpAfterError()\n );\n}\n"],
5
+ "mappings": ";AAAA,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,WAAW;AACpB,SAAS,YAAY;AACrB,SAAS,WAAW;AACpB,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AACrB,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,WAAW;AACpB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,WAAW;AACpB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,eAAe;AAEjB,gBAAS,eAAe;AAC7B,QAAM,UAAU,IAAI,QAAQ;AAC5B,SACE,QACG,KAAK,QAAQ,EACb,MAAM,qBAAqB,EAC3B,YAAY,2DAA2D,EACvE,WAAW,OAAO,EAAE,QAAQ,KAAK,CAAC,EAClC,WAAW,MAAM,EAAE,QAAQ,KAAK,CAAC,EACjC,WAAW,QAAQ,EAAE,QAAQ,KAAK,CAAC,EACnC,WAAW,GAAG,EACd,WAAW,MAAM,EACjB,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC,EACxC,WAAW,GAAG,EACd,WAAW,YAAY,EACvB,WAAW,SAAS,EACpB,WAAW,IAAI,EACf,WAAW,IAAI,EACf,WAAW,WAAW,EAAE,QAAQ,KAAK,CAAC,EACtC,WAAW,MAAM,EAAE,QAAQ,KAAK,CAAC,EACjC,WAAW,YAAY,EACvB,WAAW,GAAG,EACd,WAAW,IAAI,EACf,WAAW,UAAU,EACrB,WAAW,OAAO,EAClB,WAAW,OAAO,EAClB,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,WAAW,OAAO,EAClB,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC,EACxC,WAAW,aAAa,EAAE,QAAQ,KAAK,CAAC,EACxC,WAAW,YAAY,EACvB,WAAW,QAAQ,EACnB,WAAW,GAAG,EACd,WAAW,OAAO,EAClB,YAAY,kBAAkB,+BAA+B,EAC7D,QAAQ,OAAO,EAGf,cAAc,EAAE,gBAAgB,MAAM,CAAC,EAAE,CAAC,EAC1C,mBAAmB;AAE1B;",
6
6
  "names": []
7
7
  }
@@ -42,7 +42,7 @@ async function runProjectCreate(nameArg, options) {
42
42
  );
43
43
  logMessage(
44
44
  chalkStderr.gray(
45
- `Next, add a deployment with \`npx convex deployment create ${team.slug}:${projectSlug}:dev --type dev\` (pass \`--region us\` to choose a region).`
45
+ `Next, add a deployment with \`npx convex deployment create ${team.slug}:${projectSlug}:dev/my-feature --type dev --select\` (pass \`--region us\` to choose a region).`
46
46
  )
47
47
  );
48
48
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/projectCreate.ts"],
4
- "sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, showSpinner } from \"../bundler/log.js\";\nimport { chalkStderr } from \"chalk\";\nimport { createProject } from \"./lib/api.js\";\nimport { ensureAuthCanCreateDeployment } from \"./lib/deploymentSelection.js\";\nimport { validateOrSelectTeam } from \"./lib/utils/utils.js\";\nimport { promptString } from \"./lib/utils/prompts.js\";\nimport { projectDashboardUrl } from \"./lib/dashboard.js\";\n\ntype ProjectCreateOptions = {\n team?: string | undefined;\n};\n\nasync function runProjectCreate(\n nameArg: string | undefined,\n options: ProjectCreateOptions,\n): Promise<void> {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Creating a project goes through the platform API, which accepts personal\n // access tokens and project keys but not deployment/preview deploy keys.\n // Fail fast (and clearly) for the unsupported keys rather than surfacing an\n // opaque error later.\n await ensureAuthCanCreateDeployment(ctx);\n\n const { team } = await validateOrSelectTeam(ctx, options.team, \"Team:\");\n\n let projectName = nameArg;\n if (!projectName) {\n if (!process.stdin.isTTY) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Specify a project name:\\n\" + \" `npx convex project create my-app`\",\n });\n }\n projectName = await promptString(ctx, {\n message: \"Project name:\",\n });\n }\n\n showSpinner(`Creating project ${projectName}...`);\n // `project create` only creates the project. Provisioning a deployment is a\n // separate, explicit step (`npx convex deployment create`) so this command\n // doesn't have to mirror every deployment setting (region, class, ...).\n const { projectSlug } = await createProject(ctx, {\n teamId: team.id,\n projectName,\n deploymentToProvision: null,\n });\n\n logFinishedStep(\n `Created project ${chalkStderr.bold(projectSlug)} in team ` +\n `${chalkStderr.bold(team.slug)}, manage it at ${chalkStderr.bold(\n projectDashboardUrl(team.slug, projectSlug),\n )}`,\n );\n logMessage(\n chalkStderr.gray(\n `Next, add a deployment with ` +\n `\\`npx convex deployment create ${team.slug}:${projectSlug}:dev --type dev\\` ` +\n `(pass \\`--region us\\` to choose a region).`,\n ),\n );\n}\n\nexport const projectCreate = new Command(\"create\")\n .summary(\"Create a new project\")\n .description(\n [\n \"Create a new project.\",\n \"\",\n \"Provisioning a deployment is a separate step \u2014 after creating the\",\n \"project, run `npx convex deployment create` to add one.\",\n \"\",\n \"\u2022 Create a project in your only team: `npx convex project create my-app`\",\n \"\u2022 Pick the team: `npx convex project create my-app --team my-team`\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .argument(\n \"[name]\",\n \"The name of the new project. Prompted for when omitted in an \" +\n \"interactive terminal; required otherwise.\",\n )\n .addOption(\n new Option(\n \"--team <team_slug>\",\n \"The team to create the project in. Defaults to your only team, or \" +\n \"prompts when you belong to several.\",\n ),\n )\n .action(runProjectCreate);\n"],
4
+ "sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, showSpinner } from \"../bundler/log.js\";\nimport { chalkStderr } from \"chalk\";\nimport { createProject } from \"./lib/api.js\";\nimport { ensureAuthCanCreateDeployment } from \"./lib/deploymentSelection.js\";\nimport { validateOrSelectTeam } from \"./lib/utils/utils.js\";\nimport { promptString } from \"./lib/utils/prompts.js\";\nimport { projectDashboardUrl } from \"./lib/dashboard.js\";\n\ntype ProjectCreateOptions = {\n team?: string | undefined;\n};\n\nasync function runProjectCreate(\n nameArg: string | undefined,\n options: ProjectCreateOptions,\n): Promise<void> {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Creating a project goes through the platform API, which accepts personal\n // access tokens and project keys but not deployment/preview deploy keys.\n // Fail fast (and clearly) for the unsupported keys rather than surfacing an\n // opaque error later.\n await ensureAuthCanCreateDeployment(ctx);\n\n const { team } = await validateOrSelectTeam(ctx, options.team, \"Team:\");\n\n let projectName = nameArg;\n if (!projectName) {\n if (!process.stdin.isTTY) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Specify a project name:\\n\" + \" `npx convex project create my-app`\",\n });\n }\n projectName = await promptString(ctx, {\n message: \"Project name:\",\n });\n }\n\n showSpinner(`Creating project ${projectName}...`);\n // `project create` only creates the project. Provisioning a deployment is a\n // separate, explicit step (`npx convex deployment create`) so this command\n // doesn't have to mirror every deployment setting (region, class, ...).\n const { projectSlug } = await createProject(ctx, {\n teamId: team.id,\n projectName,\n deploymentToProvision: null,\n });\n\n logFinishedStep(\n `Created project ${chalkStderr.bold(projectSlug)} in team ` +\n `${chalkStderr.bold(team.slug)}, manage it at ${chalkStderr.bold(\n projectDashboardUrl(team.slug, projectSlug),\n )}`,\n );\n logMessage(\n chalkStderr.gray(\n `Next, add a deployment with ` +\n `\\`npx convex deployment create ${team.slug}:${projectSlug}:dev/my-feature --type dev --select\\` ` +\n `(pass \\`--region us\\` to choose a region).`,\n ),\n );\n}\n\nexport const projectCreate = new Command(\"create\")\n .summary(\"Create a new project\")\n .description(\n [\n \"Create a new project.\",\n \"\",\n \"Provisioning a deployment is a separate step \u2014 after creating the\",\n \"project, run `npx convex deployment create` to add one.\",\n \"\",\n \"\u2022 Create a project in your only team: `npx convex project create my-app`\",\n \"\u2022 Pick the team: `npx convex project create my-app --team my-team`\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .argument(\n \"[name]\",\n \"The name of the new project. Prompted for when omitted in an \" +\n \"interactive terminal; required otherwise.\",\n )\n .addOption(\n new Option(\n \"--team <team_slug>\",\n \"The team to create the project in. Defaults to your only team, or \" +\n \"prompts when you belong to several.\",\n ),\n )\n .action(runProjectCreate);\n"],
5
5
  "mappings": ";AAAA,SAAS,SAAS,cAAc;AAChC,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB,YAAY,mBAAmB;AACzD,SAAS,mBAAmB;AAC5B,SAAS,qBAAqB;AAC9B,SAAS,qCAAqC;AAC9C,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAMpC,eAAe,iBACb,SACA,SACe;AACf,QAAM,MAAM,MAAM,cAAc;AAAA,IAC9B,KAAK;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,EACX,CAAC;AAMD,QAAM,8BAA8B,GAAG;AAEvC,QAAM,EAAE,KAAK,IAAI,MAAM,qBAAqB,KAAK,QAAQ,MAAM,OAAO;AAEtE,MAAI,cAAc;AAClB,MAAI,CAAC,aAAa;AAChB,QAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,kBAAc,MAAM,aAAa,KAAK;AAAA,MACpC,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,cAAY,oBAAoB,WAAW,KAAK;AAIhD,QAAM,EAAE,YAAY,IAAI,MAAM,cAAc,KAAK;AAAA,IAC/C,QAAQ,KAAK;AAAA,IACb;AAAA,IACA,uBAAuB;AAAA,EACzB,CAAC;AAED;AAAA,IACE,mBAAmB,YAAY,KAAK,WAAW,CAAC,YAC3C,YAAY,KAAK,KAAK,IAAI,CAAC,kBAAkB,YAAY;AAAA,MAC1D,oBAAoB,KAAK,MAAM,WAAW;AAAA,IAC5C,CAAC;AAAA,EACL;AACA;AAAA,IACE,YAAY;AAAA,MACV,8DACoC,KAAK,IAAI,IAAI,WAAW;AAAA,IAE9D;AAAA,EACF;AACF;AAEO,aAAM,gBAAgB,IAAI,QAAQ,QAAQ,EAC9C,QAAQ,sBAAsB,EAC9B;AAAA,EACC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb,EACC,qBAAqB,KAAK,EAC1B;AAAA,EACC;AAAA,EACA;AAEF,EACC;AAAA,EACC,IAAI;AAAA,IACF;AAAA,IACA;AAAA,EAEF;AACF,EACC,OAAO,gBAAgB;",
6
6
  "names": []
7
7
  }
package/dist/esm/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
- export const version = "1.46.0";
2
+ export const version = "1.48.0-alpha.0";
3
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export const version = \"1.46.0\";\n"],
4
+ "sourcesContent": ["export const version = \"1.48.0-alpha.0\";\n"],
5
5
  "mappings": ";AAAO,aAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -41,12 +41,16 @@ export function setupActionCalls(requestId) {
41
41
  }
42
42
  export async function getServiceToken(service) {
43
43
  validateArg(service, 1, "getServiceToken", "service");
44
- if (service !== "ai-gateway") {
45
- throw new Error(`Unsupported service "${String(service)}"`);
46
- }
47
44
  return await performAsyncSyscall("1.0/createServiceToken", {
48
45
  service,
49
46
  version
50
47
  });
51
48
  }
49
+ export async function getServiceUrl(service) {
50
+ validateArg(service, 1, "getServiceUrl", "service");
51
+ return await performAsyncSyscall("1.0/getServiceUrl", {
52
+ service,
53
+ version
54
+ });
55
+ }
52
56
  //# sourceMappingURL=actions_impl.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/server/impl/actions_impl.ts"],
4
- "sourcesContent": ["import { convexToJson, jsonToConvex, Value } from \"../../values/index.js\";\nimport { version } from \"../../index.js\";\nimport { performAsyncSyscall } from \"./syscall.js\";\nimport { parseArgs } from \"../../common/index.js\";\nimport {\n FunctionReference,\n FunctionReference_future,\n} from \"../../server/api.js\";\nimport { getFunctionAddress } from \"../components/paths.js\";\nimport { validateArg } from \"./validate.js\";\n\nfunction syscallArgs(\n requestId: string,\n functionReference: any,\n args?: Record<string, Value>,\n) {\n const address = getFunctionAddress(functionReference);\n return {\n ...address,\n args: convexToJson(parseArgs(args)),\n version,\n requestId,\n };\n}\n\nexport function setupActionCalls(requestId: string) {\n return {\n runQuery: async (\n query:\n | FunctionReference<\"query\", \"public\" | \"internal\">\n | FunctionReference_future<\"query\", \"public\" | \"internal\">,\n args?: Record<string, Value>,\n ): Promise<any> => {\n const result = await performAsyncSyscall(\n \"1.0/actions/query\",\n syscallArgs(requestId, query, args),\n );\n return jsonToConvex(result);\n },\n runMutation: async (\n mutation:\n | FunctionReference<\"mutation\", \"public\" | \"internal\">\n | FunctionReference_future<\"mutation\", \"public\" | \"internal\">,\n args?: Record<string, Value>,\n ): Promise<any> => {\n const result = await performAsyncSyscall(\n \"1.0/actions/mutation\",\n syscallArgs(requestId, mutation, args),\n );\n return jsonToConvex(result);\n },\n runAction: async (\n action:\n | FunctionReference<\"action\", \"public\" | \"internal\">\n | FunctionReference_future<\"action\", \"public\" | \"internal\">,\n args?: Record<string, Value>,\n ): Promise<any> => {\n const result = await performAsyncSyscall(\n \"1.0/actions/action\",\n syscallArgs(requestId, action, args),\n );\n return jsonToConvex(result);\n },\n };\n}\n\n/**\n * Get a short-lived credential for calling a Convex-managed service.\n *\n * This function can only be called while an action is running. The credential\n * is scoped to the current deployment and should be sent as a bearer token.\n * Repeated calls in the same action reuse one token; a failed mint is not\n * cached, so a later call retries.\n *\n * @param service - The service the credential may access.\n * @returns A JWT to send as `Authorization: Bearer <token>`. Keep it inside\n * the action: don't return it to clients or store it in environment\n * variables.\n */\nexport async function getServiceToken(service: \"ai-gateway\"): Promise<string> {\n validateArg(service, 1, \"getServiceToken\", \"service\");\n if (service !== \"ai-gateway\") {\n throw new Error(`Unsupported service \"${String(service)}\"`);\n }\n return await performAsyncSyscall(\"1.0/createServiceToken\", {\n service,\n version,\n });\n}\n"],
5
- "mappings": ";AAAA,SAAS,cAAc,oBAA2B;AAClD,SAAS,eAAe;AACxB,SAAS,2BAA2B;AACpC,SAAS,iBAAiB;AAK1B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAE5B,SAAS,YACP,WACA,mBACA,MACA;AACA,QAAM,UAAU,mBAAmB,iBAAiB;AACpD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,aAAa,UAAU,IAAI,CAAC;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF;AAEO,gBAAS,iBAAiB,WAAmB;AAClD,SAAO;AAAA,IACL,UAAU,OACR,OAGA,SACiB;AACjB,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,YAAY,WAAW,OAAO,IAAI;AAAA,MACpC;AACA,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,aAAa,OACX,UAGA,SACiB;AACjB,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,YAAY,WAAW,UAAU,IAAI;AAAA,MACvC;AACA,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,WAAW,OACT,QAGA,SACiB;AACjB,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,YAAY,WAAW,QAAQ,IAAI;AAAA,MACrC;AACA,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,EACF;AACF;AAeA,sBAAsB,gBAAgB,SAAwC;AAC5E,cAAY,SAAS,GAAG,mBAAmB,SAAS;AACpD,MAAI,YAAY,cAAc;AAC5B,UAAM,IAAI,MAAM,wBAAwB,OAAO,OAAO,CAAC,GAAG;AAAA,EAC5D;AACA,SAAO,MAAM,oBAAoB,0BAA0B;AAAA,IACzD;AAAA,IACA;AAAA,EACF,CAAC;AACH;",
4
+ "sourcesContent": ["import { convexToJson, jsonToConvex, Value } from \"../../values/index.js\";\nimport { version } from \"../../index.js\";\nimport { performAsyncSyscall } from \"./syscall.js\";\nimport { parseArgs } from \"../../common/index.js\";\nimport {\n FunctionReference,\n FunctionReference_future,\n} from \"../../server/api.js\";\nimport { getFunctionAddress } from \"../components/paths.js\";\nimport { validateArg } from \"./validate.js\";\n\nfunction syscallArgs(\n requestId: string,\n functionReference: any,\n args?: Record<string, Value>,\n) {\n const address = getFunctionAddress(functionReference);\n return {\n ...address,\n args: convexToJson(parseArgs(args)),\n version,\n requestId,\n };\n}\n\nexport function setupActionCalls(requestId: string) {\n return {\n runQuery: async (\n query:\n | FunctionReference<\"query\", \"public\" | \"internal\">\n | FunctionReference_future<\"query\", \"public\" | \"internal\">,\n args?: Record<string, Value>,\n ): Promise<any> => {\n const result = await performAsyncSyscall(\n \"1.0/actions/query\",\n syscallArgs(requestId, query, args),\n );\n return jsonToConvex(result);\n },\n runMutation: async (\n mutation:\n | FunctionReference<\"mutation\", \"public\" | \"internal\">\n | FunctionReference_future<\"mutation\", \"public\" | \"internal\">,\n args?: Record<string, Value>,\n ): Promise<any> => {\n const result = await performAsyncSyscall(\n \"1.0/actions/mutation\",\n syscallArgs(requestId, mutation, args),\n );\n return jsonToConvex(result);\n },\n runAction: async (\n action:\n | FunctionReference<\"action\", \"public\" | \"internal\">\n | FunctionReference_future<\"action\", \"public\" | \"internal\">,\n args?: Record<string, Value>,\n ): Promise<any> => {\n const result = await performAsyncSyscall(\n \"1.0/actions/action\",\n syscallArgs(requestId, action, args),\n );\n return jsonToConvex(result);\n },\n };\n}\n\n/**\n * A Convex-managed service. The backend decides which names it accepts; this\n * type lists the ones the current release knows about.\n */\nexport type ServiceName = \"ai-gateway\";\n\n/**\n * Get a short-lived credential for calling a Convex-managed service.\n *\n * This function can only be called while an action is running. The credential\n * is scoped to the current deployment and should be sent as a bearer token.\n * The action runtime caches and refreshes credentials as needed, so call\n * this function whenever making a service request.\n *\n * @param service - The service the credential may access.\n * @returns A JWT to send as `Authorization: Bearer <token>`. Keep it inside\n * the action: don't return it to clients or store it in environment\n * variables.\n */\nexport async function getServiceToken(service: ServiceName): Promise<string> {\n validateArg(service, 1, \"getServiceToken\", \"service\");\n return await performAsyncSyscall(\"1.0/createServiceToken\", {\n service,\n version,\n });\n}\n\n/**\n * Get the base URL of a Convex-managed service.\n *\n * This function can only be called while an action is running. Pair it with\n * {@link getServiceToken} to reach the service.\n *\n * @param service - The service to address.\n * @returns The service's origin, without a trailing slash.\n */\nexport async function getServiceUrl(service: ServiceName): Promise<string> {\n validateArg(service, 1, \"getServiceUrl\", \"service\");\n return await performAsyncSyscall(\"1.0/getServiceUrl\", {\n service,\n version,\n });\n}\n"],
5
+ "mappings": ";AAAA,SAAS,cAAc,oBAA2B;AAClD,SAAS,eAAe;AACxB,SAAS,2BAA2B;AACpC,SAAS,iBAAiB;AAK1B,SAAS,0BAA0B;AACnC,SAAS,mBAAmB;AAE5B,SAAS,YACP,WACA,mBACA,MACA;AACA,QAAM,UAAU,mBAAmB,iBAAiB;AACpD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,aAAa,UAAU,IAAI,CAAC;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF;AAEO,gBAAS,iBAAiB,WAAmB;AAClD,SAAO;AAAA,IACL,UAAU,OACR,OAGA,SACiB;AACjB,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,YAAY,WAAW,OAAO,IAAI;AAAA,MACpC;AACA,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,aAAa,OACX,UAGA,SACiB;AACjB,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,YAAY,WAAW,UAAU,IAAI;AAAA,MACvC;AACA,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,WAAW,OACT,QAGA,SACiB;AACjB,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,YAAY,WAAW,QAAQ,IAAI;AAAA,MACrC;AACA,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,EACF;AACF;AAqBA,sBAAsB,gBAAgB,SAAuC;AAC3E,cAAY,SAAS,GAAG,mBAAmB,SAAS;AACpD,SAAO,MAAM,oBAAoB,0BAA0B;AAAA,IACzD;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAWA,sBAAsB,cAAc,SAAuC;AACzE,cAAY,SAAS,GAAG,iBAAiB,SAAS;AAClD,SAAO,MAAM,oBAAoB,qBAAqB;AAAA,IACpD;AAAA,IACA;AAAA,EACF,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  import { version } from "../../index.js";
3
+ import { fromByteArray, toByteArray } from "../../values/base64.js";
3
4
  import { performAsyncSyscall, performJsSyscall } from "./syscall.js";
4
5
  import { validateArg } from "./validate.js";
5
6
  export function setupStorageReader(requestId) {
@@ -37,6 +38,34 @@ export function setupStorageWriter(requestId) {
37
38
  storageId
38
39
  });
39
40
  },
41
+ store: async (blob, options) => {
42
+ if (!(blob instanceof Blob)) {
43
+ throw new Error(
44
+ "store() expects a Blob. If you are trying to store a Request, `await request.blob()` will give you the correct input."
45
+ );
46
+ }
47
+ const bytes = new Uint8Array(await blob.arrayBuffer());
48
+ return await performAsyncSyscall("1.0/storageStore", {
49
+ requestId,
50
+ version,
51
+ blob: fromByteArray(bytes),
52
+ contentType: blob.type,
53
+ sha256: options?.sha256
54
+ });
55
+ },
56
+ get: async (storageId) => {
57
+ const result = await performAsyncSyscall("1.0/storageGet", {
58
+ requestId,
59
+ version,
60
+ storageId
61
+ });
62
+ if (result === null) {
63
+ return null;
64
+ }
65
+ return new Blob([toByteArray(result.blob)], {
66
+ type: result.contentType ?? ""
67
+ });
68
+ },
40
69
  getUrl: reader.getUrl,
41
70
  getMetadata: reader.getMetadata
42
71
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/server/impl/storage_impl.ts"],
4
- "sourcesContent": ["import {\n FileMetadata,\n StorageActionWriter,\n FileStorageId,\n StorageReader,\n StorageWriter,\n} from \"../storage.js\";\nimport { version } from \"../../index.js\";\nimport { performAsyncSyscall, performJsSyscall } from \"./syscall.js\";\nimport { validateArg } from \"./validate.js\";\n\nexport function setupStorageReader(requestId: string): StorageReader {\n return {\n getUrl: async (storageId: FileStorageId) => {\n validateArg(storageId, 1, \"getUrl\", \"storageId\");\n return await performAsyncSyscall(\"1.0/storageGetUrl\", {\n requestId,\n version,\n storageId,\n });\n },\n getMetadata: async (storageId: FileStorageId): Promise<FileMetadata> => {\n return await performAsyncSyscall(\"1.0/storageGetMetadata\", {\n requestId,\n version,\n storageId,\n });\n },\n };\n}\n\nexport function setupStorageWriter(requestId: string): StorageWriter {\n const reader = setupStorageReader(requestId);\n return {\n generateUploadUrl: async () => {\n return await performAsyncSyscall(\"1.0/storageGenerateUploadUrl\", {\n requestId,\n version,\n });\n },\n delete: async (storageId: FileStorageId) => {\n await performAsyncSyscall(\"1.0/storageDelete\", {\n requestId,\n version,\n storageId,\n });\n },\n getUrl: reader.getUrl,\n getMetadata: reader.getMetadata,\n };\n}\n\nexport function setupStorageActionWriter(\n requestId: string,\n): StorageActionWriter {\n const writer = setupStorageWriter(requestId);\n return {\n ...writer,\n store: async (blob: Blob, options?: { sha256?: string }) => {\n return await performJsSyscall(\"storage/storeBlob\", {\n requestId,\n version,\n blob,\n options,\n });\n },\n get: async (storageId: FileStorageId) => {\n return await performJsSyscall(\"storage/getBlob\", {\n requestId,\n version,\n storageId,\n });\n },\n };\n}\n"],
5
- "mappings": ";AAOA,SAAS,eAAe;AACxB,SAAS,qBAAqB,wBAAwB;AACtD,SAAS,mBAAmB;AAErB,gBAAS,mBAAmB,WAAkC;AACnE,SAAO;AAAA,IACL,QAAQ,OAAO,cAA6B;AAC1C,kBAAY,WAAW,GAAG,UAAU,WAAW;AAC/C,aAAO,MAAM,oBAAoB,qBAAqB;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,aAAa,OAAO,cAAoD;AACtE,aAAO,MAAM,oBAAoB,0BAA0B;AAAA,QACzD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,gBAAS,mBAAmB,WAAkC;AACnE,QAAM,SAAS,mBAAmB,SAAS;AAC3C,SAAO;AAAA,IACL,mBAAmB,YAAY;AAC7B,aAAO,MAAM,oBAAoB,gCAAgC;AAAA,QAC/D;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,OAAO,cAA6B;AAC1C,YAAM,oBAAoB,qBAAqB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO;AAAA,EACtB;AACF;AAEO,gBAAS,yBACd,WACqB;AACrB,QAAM,SAAS,mBAAmB,SAAS;AAC3C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,OAAO,MAAY,YAAkC;AAC1D,aAAO,MAAM,iBAAiB,qBAAqB;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,KAAK,OAAO,cAA6B;AACvC,aAAO,MAAM,iBAAiB,mBAAmB;AAAA,QAC/C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import {\n FileMetadata,\n StorageActionWriter,\n FileStorageId,\n StorageReader,\n StorageWriter,\n} from \"../storage.js\";\nimport { version } from \"../../index.js\";\nimport { fromByteArray, toByteArray } from \"../../values/base64.js\";\nimport { performAsyncSyscall, performJsSyscall } from \"./syscall.js\";\nimport { validateArg } from \"./validate.js\";\n\nexport function setupStorageReader(requestId: string): StorageReader {\n return {\n getUrl: async (storageId: FileStorageId) => {\n validateArg(storageId, 1, \"getUrl\", \"storageId\");\n return await performAsyncSyscall(\"1.0/storageGetUrl\", {\n requestId,\n version,\n storageId,\n });\n },\n getMetadata: async (storageId: FileStorageId): Promise<FileMetadata> => {\n return await performAsyncSyscall(\"1.0/storageGetMetadata\", {\n requestId,\n version,\n storageId,\n });\n },\n };\n}\n\nexport function setupStorageWriter(requestId: string): StorageWriter {\n const reader = setupStorageReader(requestId);\n return {\n generateUploadUrl: async () => {\n return await performAsyncSyscall(\"1.0/storageGenerateUploadUrl\", {\n requestId,\n version,\n });\n },\n delete: async (storageId: FileStorageId) => {\n await performAsyncSyscall(\"1.0/storageDelete\", {\n requestId,\n version,\n storageId,\n });\n },\n store: async (blob: Blob, options?: { sha256?: string }) => {\n if (!(blob instanceof Blob)) {\n throw new Error(\n \"store() expects a Blob. If you are trying to store a Request, `await request.blob()` will give you the correct input.\",\n );\n }\n const bytes = new Uint8Array(await blob.arrayBuffer());\n return await performAsyncSyscall(\"1.0/storageStore\", {\n requestId,\n version,\n blob: fromByteArray(bytes),\n contentType: blob.type,\n sha256: options?.sha256,\n });\n },\n get: async (storageId: FileStorageId) => {\n const result: { blob: string; contentType: string | null } | null =\n await performAsyncSyscall(\"1.0/storageGet\", {\n requestId,\n version,\n storageId,\n });\n if (result === null) {\n return null;\n }\n return new Blob([toByteArray(result.blob)], {\n type: result.contentType ?? \"\",\n });\n },\n getUrl: reader.getUrl,\n getMetadata: reader.getMetadata,\n };\n}\n\nexport function setupStorageActionWriter(\n requestId: string,\n): StorageActionWriter {\n const writer = setupStorageWriter(requestId);\n return {\n ...writer,\n store: async (blob: Blob, options?: { sha256?: string }) => {\n return await performJsSyscall(\"storage/storeBlob\", {\n requestId,\n version,\n blob,\n options,\n });\n },\n get: async (storageId: FileStorageId) => {\n return await performJsSyscall(\"storage/getBlob\", {\n requestId,\n version,\n storageId,\n });\n },\n };\n}\n"],
5
+ "mappings": ";AAOA,SAAS,eAAe;AACxB,SAAS,eAAe,mBAAmB;AAC3C,SAAS,qBAAqB,wBAAwB;AACtD,SAAS,mBAAmB;AAErB,gBAAS,mBAAmB,WAAkC;AACnE,SAAO;AAAA,IACL,QAAQ,OAAO,cAA6B;AAC1C,kBAAY,WAAW,GAAG,UAAU,WAAW;AAC/C,aAAO,MAAM,oBAAoB,qBAAqB;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,aAAa,OAAO,cAAoD;AACtE,aAAO,MAAM,oBAAoB,0BAA0B;AAAA,QACzD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,gBAAS,mBAAmB,WAAkC;AACnE,QAAM,SAAS,mBAAmB,SAAS;AAC3C,SAAO;AAAA,IACL,mBAAmB,YAAY;AAC7B,aAAO,MAAM,oBAAoB,gCAAgC;AAAA,QAC/D;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,OAAO,cAA6B;AAC1C,YAAM,oBAAoB,qBAAqB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,OAAO,MAAY,YAAkC;AAC1D,UAAI,EAAE,gBAAgB,OAAO;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,QAAQ,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AACrD,aAAO,MAAM,oBAAoB,oBAAoB;AAAA,QACnD;AAAA,QACA;AAAA,QACA,MAAM,cAAc,KAAK;AAAA,QACzB,aAAa,KAAK;AAAA,QAClB,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,KAAK,OAAO,cAA6B;AACvC,YAAM,SACJ,MAAM,oBAAoB,kBAAkB;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACH,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AACA,aAAO,IAAI,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,GAAG;AAAA,QAC1C,MAAM,OAAO,eAAe;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO;AAAA,EACtB;AACF;AAEO,gBAAS,yBACd,WACqB;AACrB,QAAM,SAAS,mBAAmB,SAAS;AAC3C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,OAAO,MAAY,YAAkC;AAC1D,aAAO,MAAM,iBAAiB,qBAAqB;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,KAAK,OAAO,cAA6B;AACvC,aAAO,MAAM,iBAAiB,mBAAmB;AAAA,QAC/C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -9,7 +9,10 @@ export {
9
9
  internalMutationGeneric,
10
10
  internalQueryGeneric
11
11
  } from "./impl/registration_impl.js";
12
- export { getServiceToken } from "./impl/actions_impl.js";
12
+ export {
13
+ getServiceToken,
14
+ getServiceUrl
15
+ } from "./impl/actions_impl.js";
13
16
  export * from "./pagination.js";
14
17
  export * from "./search_filter_builder.js";
15
18
  export * from "./storage.js";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/server/index.ts"],
4
- "sourcesContent": ["/**\n * Utilities for implementing server-side Convex query and mutation functions.\n *\n * ## Usage\n *\n * ### Code Generation\n *\n * This module is typically used alongside generated server code.\n *\n * To generate the server code, run `npx convex dev` in your Convex project.\n * This will create a `convex/_generated/server.js` file with the following\n * functions, typed for your schema:\n * - [query](https://docs.convex.dev/generated-api/server#query)\n * - [mutation](https://docs.convex.dev/generated-api/server#mutation)\n *\n * If you aren't using TypeScript and code generation, you can use these untyped\n * functions instead:\n * - {@link queryGeneric}\n * - {@link mutationGeneric}\n *\n * ### Example\n *\n * Convex functions are defined by using either the `query` or\n * `mutation` wrappers.\n *\n * Queries receive a `db` that implements the {@link GenericDatabaseReader} interface.\n *\n * ```js\n * import { query } from \"./_generated/server\";\n *\n * export default query({\n * handler: async ({ db }, { arg1, arg2 }) => {\n * // Your (read-only) code here!\n * },\n * });\n * ```\n *\n * If your function needs to write to the database, such as inserting, updating,\n * or deleting documents, use `mutation` instead which provides a `db` that\n * implements the {@link GenericDatabaseWriter} interface.\n *\n * ```js\n * import { mutation } from \"./_generated/server\";\n *\n * export default mutation({\n * handler: async ({ db }, { arg1, arg2 }) => {\n * // Your mutation code here!\n * },\n * });\n * ```\n * @module\n */\n\nexport type {\n Auth,\n AuthConfig,\n AuthProvider,\n UserIdentity,\n UserIdentityAttributes,\n} from \"./authentication.js\";\nexport * from \"./database.js\";\nexport type {\n GenericDocument,\n GenericFieldPaths,\n GenericIndexFields,\n GenericTableIndexes,\n GenericSearchIndexConfig,\n GenericTableSearchIndexes,\n GenericVectorIndexConfig,\n GenericTableVectorIndexes,\n FieldTypeFromFieldPath,\n FieldTypeFromFieldPathInner,\n GenericTableInfo,\n DocumentByInfo,\n FieldPaths,\n Indexes,\n IndexNames,\n NamedIndex,\n SearchIndexes,\n SearchIndexNames,\n NamedSearchIndex,\n VectorIndexes,\n VectorIndexNames,\n NamedVectorIndex,\n GenericDataModel,\n AnyDataModel,\n TableNamesInDataModel,\n NamedTableInfo,\n DocumentByName,\n} from \"./data_model.js\";\n\nexport type {\n Expression,\n ExpressionOrValue,\n FilterBuilder,\n} from \"./filter_builder.js\";\nexport {\n actionGeneric,\n httpActionGeneric,\n mutationGeneric,\n queryGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n} from \"./impl/registration_impl.js\";\nexport { getServiceToken } from \"./impl/actions_impl.js\";\nexport type {\n TransactionMetric,\n TransactionMetrics,\n TransactionLimits,\n FunctionMetadata,\n DeploymentMetadata,\n RequestMetadata,\n QueryMeta,\n MutationMeta,\n ActionMeta,\n} from \"./meta.js\";\nexport type { IndexRange, IndexRangeBuilder } from \"./index_range_builder.js\";\nexport * from \"./pagination.js\";\nexport type { OrderedQuery, Query, QueryInitializer } from \"./query.js\";\nexport type {\n AdvancedRunQueryOptions,\n ArgsArray,\n DefaultFunctionArgs,\n FunctionVisibility,\n ActionBuilder,\n MutationBuilder,\n MutationBuilderWithTable,\n QueryBuilder,\n QueryBuilderWithTable,\n HttpActionBuilder,\n GenericActionCtx,\n GenericMutationCtx,\n GenericMutationCtxWithTable,\n GenericQueryCtx,\n GenericQueryCtxWithTable,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery,\n PublicHttpAction,\n UnvalidatedFunction,\n ValidatedFunction,\n ReturnValueForOptionalValidator,\n ArgsArrayForOptionalValidator,\n ArgsArrayToObject,\n DefaultArgsForOptionalValidator,\n} from \"./registration.js\";\nexport * from \"./search_filter_builder.js\";\nexport * from \"./storage.js\";\nexport type { Scheduler, SchedulableFunctionReference } from \"./scheduler.js\";\nexport { cronJobs } from \"./cron.js\";\nexport type { CronJob, Crons } from \"./cron.js\";\nexport type {\n SystemFields,\n IdField,\n WithoutSystemFields,\n WithOptionalSystemFields,\n SystemIndexes,\n IndexTiebreakerField,\n} from \"./system_fields.js\";\nexport { httpRouter, HttpRouter, ROUTABLE_HTTP_METHODS } from \"./router.js\";\nexport type {\n RoutableMethod,\n RouteSpec,\n RouteSpecWithPath,\n RouteSpecWithPathPrefix,\n} from \"./router.js\";\nexport {\n anyApi,\n getFunctionName,\n makeFunctionReference,\n filterApi,\n} from \"./api.js\";\nexport type {\n ApiFromModules,\n AnyApi,\n FunctionReference_future,\n FilterApi,\n FunctionType,\n FunctionReference,\n FunctionArgs,\n OptionalRestArgs,\n PartialApi,\n ArgsAndOptions,\n FunctionReturnType,\n ValidatorTypeToReturnType,\n} from \"./api.js\";\nexport {\n defineApp,\n defineComponent,\n componentsGeneric,\n createFunctionHandle,\n type AnyChildComponents,\n type EnvDefinition,\n type EnvFromDefinition,\n type EnvFromAppDefinition,\n type AppDefinition,\n} from \"./components/index.js\";\n/**\n * @internal\n */\nexport { currentSystemUdfInComponent } from \"./components/index.js\";\nexport { getFunctionAddress } from \"./components/index.js\";\nexport type {\n ComponentDefinition,\n AnyComponents,\n FunctionHandle,\n} from \"./components/index.js\";\n\n/**\n * @internal\n */\nexport type { Index, SearchIndex, VectorIndex } from \"./schema.js\";\n\nexport { log } from \"./log.js\";\nexport type { AuditLogBody, AuditLogValue } from \"./audit_logging.js\";\n\nexport type {\n SearchIndexConfig,\n VectorIndexConfig,\n TableDefinition,\n SchemaDefinition,\n DefineSchemaOptions,\n GenericSchema,\n DataModelFromSchemaDefinition,\n SystemDataModel,\n SystemTableNames,\n DocValidator,\n SystemFieldValidators,\n} from \"./schema.js\";\nexport { defineTable, defineSchema, docValidator } from \"./schema.js\";\n\nexport type {\n VectorSearch,\n VectorSearchQuery,\n VectorFilterBuilder,\n FilterExpression,\n} from \"./vector_search.js\";\n\n/**\n * @public\n */\nexport type { BetterOmit, Expand } from \"../type_utils.js\";\n"],
5
- "mappings": ";AA4DA,cAAc;AAoCd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAahC,cAAc;AA6Bd,cAAc;AACd,cAAc;AAEd,SAAS,gBAAgB;AAUzB,SAAS,YAAY,YAAY,6BAA6B;AAO9D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AAIP,SAAS,mCAAmC;AAC5C,SAAS,0BAA0B;AAYnC,SAAS,WAAW;AAgBpB,SAAS,aAAa,cAAc,oBAAoB;",
4
+ "sourcesContent": ["/**\n * Utilities for implementing server-side Convex query and mutation functions.\n *\n * ## Usage\n *\n * ### Code Generation\n *\n * This module is typically used alongside generated server code.\n *\n * To generate the server code, run `npx convex dev` in your Convex project.\n * This will create a `convex/_generated/server.js` file with the following\n * functions, typed for your schema:\n * - [query](https://docs.convex.dev/generated-api/server#query)\n * - [mutation](https://docs.convex.dev/generated-api/server#mutation)\n *\n * If you aren't using TypeScript and code generation, you can use these untyped\n * functions instead:\n * - {@link queryGeneric}\n * - {@link mutationGeneric}\n *\n * ### Example\n *\n * Convex functions are defined by using either the `query` or\n * `mutation` wrappers.\n *\n * Queries receive a `db` that implements the {@link GenericDatabaseReader} interface.\n *\n * ```js\n * import { query } from \"./_generated/server\";\n *\n * export default query({\n * handler: async ({ db }, { arg1, arg2 }) => {\n * // Your (read-only) code here!\n * },\n * });\n * ```\n *\n * If your function needs to write to the database, such as inserting, updating,\n * or deleting documents, use `mutation` instead which provides a `db` that\n * implements the {@link GenericDatabaseWriter} interface.\n *\n * ```js\n * import { mutation } from \"./_generated/server\";\n *\n * export default mutation({\n * handler: async ({ db }, { arg1, arg2 }) => {\n * // Your mutation code here!\n * },\n * });\n * ```\n * @module\n */\n\nexport type {\n Auth,\n AuthConfig,\n AuthProvider,\n UserIdentity,\n UserIdentityAttributes,\n} from \"./authentication.js\";\nexport * from \"./database.js\";\nexport type {\n GenericDocument,\n GenericFieldPaths,\n GenericIndexFields,\n GenericTableIndexes,\n GenericSearchIndexConfig,\n GenericTableSearchIndexes,\n GenericVectorIndexConfig,\n GenericTableVectorIndexes,\n FieldTypeFromFieldPath,\n FieldTypeFromFieldPathInner,\n GenericTableInfo,\n DocumentByInfo,\n FieldPaths,\n Indexes,\n IndexNames,\n NamedIndex,\n SearchIndexes,\n SearchIndexNames,\n NamedSearchIndex,\n VectorIndexes,\n VectorIndexNames,\n NamedVectorIndex,\n GenericDataModel,\n AnyDataModel,\n TableNamesInDataModel,\n NamedTableInfo,\n DocumentByName,\n} from \"./data_model.js\";\n\nexport type {\n Expression,\n ExpressionOrValue,\n FilterBuilder,\n} from \"./filter_builder.js\";\nexport {\n actionGeneric,\n httpActionGeneric,\n mutationGeneric,\n queryGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n} from \"./impl/registration_impl.js\";\nexport {\n getServiceToken,\n getServiceUrl,\n type ServiceName,\n} from \"./impl/actions_impl.js\";\nexport type {\n TransactionMetric,\n TransactionMetrics,\n TransactionLimits,\n FunctionMetadata,\n DeploymentMetadata,\n RequestMetadata,\n QueryMeta,\n MutationMeta,\n ActionMeta,\n} from \"./meta.js\";\nexport type { IndexRange, IndexRangeBuilder } from \"./index_range_builder.js\";\nexport * from \"./pagination.js\";\nexport type { OrderedQuery, Query, QueryInitializer } from \"./query.js\";\nexport type {\n AdvancedRunQueryOptions,\n ArgsArray,\n DefaultFunctionArgs,\n FunctionVisibility,\n ActionBuilder,\n MutationBuilder,\n MutationBuilderWithTable,\n QueryBuilder,\n QueryBuilderWithTable,\n HttpActionBuilder,\n GenericActionCtx,\n GenericMutationCtx,\n GenericMutationCtxWithTable,\n GenericQueryCtx,\n GenericQueryCtxWithTable,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery,\n PublicHttpAction,\n UnvalidatedFunction,\n ValidatedFunction,\n ReturnValueForOptionalValidator,\n ArgsArrayForOptionalValidator,\n ArgsArrayToObject,\n DefaultArgsForOptionalValidator,\n} from \"./registration.js\";\nexport * from \"./search_filter_builder.js\";\nexport * from \"./storage.js\";\nexport type { Scheduler, SchedulableFunctionReference } from \"./scheduler.js\";\nexport { cronJobs } from \"./cron.js\";\nexport type { CronJob, Crons } from \"./cron.js\";\nexport type {\n SystemFields,\n IdField,\n WithoutSystemFields,\n WithOptionalSystemFields,\n SystemIndexes,\n IndexTiebreakerField,\n} from \"./system_fields.js\";\nexport { httpRouter, HttpRouter, ROUTABLE_HTTP_METHODS } from \"./router.js\";\nexport type {\n RoutableMethod,\n RouteSpec,\n RouteSpecWithPath,\n RouteSpecWithPathPrefix,\n} from \"./router.js\";\nexport {\n anyApi,\n getFunctionName,\n makeFunctionReference,\n filterApi,\n} from \"./api.js\";\nexport type {\n ApiFromModules,\n AnyApi,\n FunctionReference_future,\n FilterApi,\n FunctionType,\n FunctionReference,\n FunctionArgs,\n OptionalRestArgs,\n PartialApi,\n ArgsAndOptions,\n FunctionReturnType,\n ValidatorTypeToReturnType,\n} from \"./api.js\";\nexport {\n defineApp,\n defineComponent,\n componentsGeneric,\n createFunctionHandle,\n type AnyChildComponents,\n type EnvDefinition,\n type EnvFromDefinition,\n type EnvFromAppDefinition,\n type AppDefinition,\n} from \"./components/index.js\";\n/**\n * @internal\n */\nexport { currentSystemUdfInComponent } from \"./components/index.js\";\nexport { getFunctionAddress } from \"./components/index.js\";\nexport type {\n ComponentDefinition,\n AnyComponents,\n FunctionHandle,\n} from \"./components/index.js\";\n\n/**\n * @internal\n */\nexport type { Index, SearchIndex, VectorIndex } from \"./schema.js\";\n\nexport { log } from \"./log.js\";\nexport type { AuditLogBody, AuditLogValue } from \"./audit_logging.js\";\n\nexport type {\n SearchIndexConfig,\n VectorIndexConfig,\n TableDefinition,\n SchemaDefinition,\n DefineSchemaOptions,\n GenericSchema,\n DataModelFromSchemaDefinition,\n SystemDataModel,\n SystemTableNames,\n DocValidator,\n SystemFieldValidators,\n} from \"./schema.js\";\nexport { defineTable, defineSchema, docValidator } from \"./schema.js\";\n\nexport type {\n VectorSearch,\n VectorSearchQuery,\n VectorFilterBuilder,\n FilterExpression,\n} from \"./vector_search.js\";\n\n/**\n * @public\n */\nexport type { BetterOmit, Expand } from \"../type_utils.js\";\n"],
5
+ "mappings": ";AA4DA,cAAc;AAoCd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAaP,cAAc;AA6Bd,cAAc;AACd,cAAc;AAEd,SAAS,gBAAgB;AAUzB,SAAS,YAAY,YAAY,6BAA6B;AAO9D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AAIP,SAAS,mCAAmC;AAC5C,SAAS,0BAA0B;AAYnC,SAAS,WAAW;AAgBpB,SAAS,aAAa,cAAc,oBAAoB;",
6
6
  "names": []
7
7
  }
@@ -95,35 +95,57 @@ export class TableDefinition {
95
95
  return this;
96
96
  }
97
97
  /**
98
- * Stage a new document validator for this table.
98
+ * Stage changes to this table's document validator.
99
99
  *
100
100
  * Convex validates the staged validator against the table's existing
101
101
  * documents in the background, while the validator passed to
102
- * {@link defineTable} remains the one enforced on reads and writes. Once
103
- * the background validation succeeds, make the staged validator the
104
- * table's validator and remove `.staged()`.
102
+ * {@link defineTable} remains the one enforced on writes. Once
103
+ * the background validation succeeds, apply the staged changes
104
+ * and remove `.staged()`.
105
+ *
106
+ * For an object validator, pass only the fields to add or replace. Fields
107
+ * omitted from the changes keep their enforced validators.
108
+ * Set a field to `undefined` to remove it from the staged validator.
109
+ * For nested objects, you must specify the full object validator.
105
110
  *
106
111
  * ```ts
107
112
  * defineTable({
108
- * author: v.string(),
113
+ * apple: v.string(),
114
+ * banana: v.number(),
115
+ * legacy: v.optional(v.string()),
109
116
  * }).staged({
110
- * author: v.array(v.string()),
117
+ * banana: v.union(v.string(), v.number()),
118
+ * legacy: undefined,
111
119
  * })
112
120
  * ```
113
121
  *
114
- * TODO: link a worked staged-schema example from the docs once one exists.
122
+ * See [Staged validators](https://docs.convex.dev/database/schemas#staged-validators).
115
123
  *
116
- * @param documentSchema - The proposed next type of documents stored in
117
- * this table, as an object of field validators or a schema validator.
124
+ * @param documentSchema - Field changes for a table defined as an object or
125
+ * `v.any()`, or a full schema validator specifying the proposed next document
126
+ * type. Use a full schema validator for a table defined as a union.
118
127
  * @returns A {@link TableDefinition} with the staged validator attached.
119
- *
120
- * @internal
121
128
  */
122
129
  staged(documentSchema) {
123
130
  if (this.stagedValidator !== void 0) {
124
131
  throw new Error("Table cannot have more than one staged validator.");
125
132
  }
126
- this.stagedValidator = isValidator(documentSchema) ? documentSchema : v.object(documentSchema);
133
+ if (isValidator(documentSchema)) {
134
+ this.stagedValidator = documentSchema;
135
+ } else {
136
+ if (this.validator.kind !== "object" && this.validator.kind !== "any") {
137
+ throw new Error(
138
+ "Specifying top-level field changes is only supported for simple table definitions. For a table defined with a union or record validator, you must stage a fully defined object or union validator."
139
+ );
140
+ }
141
+ const enforcedFields = this.validator.kind === "object" ? this.validator.fields : {};
142
+ const fields = Object.fromEntries(
143
+ Object.entries({ ...enforcedFields, ...documentSchema }).filter(
144
+ (entry) => entry[1] !== void 0
145
+ )
146
+ );
147
+ this.stagedValidator = v.object(fields);
148
+ }
127
149
  return this.self();
128
150
  }
129
151
  /**