convex 1.34.1 → 1.35.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/CHANGELOG.md +86 -43
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/cli/aiFiles.js +31 -13
  5. package/dist/cjs/cli/aiFiles.js.map +3 -3
  6. package/dist/cjs/cli/configure.js +21 -24
  7. package/dist/cjs/cli/configure.js.map +2 -2
  8. package/dist/cjs/cli/deploy.js +8 -9
  9. package/dist/cjs/cli/deploy.js.map +2 -2
  10. package/dist/cjs/cli/deploymentCreate.js +225 -40
  11. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  12. package/dist/cjs/cli/deploymentSelect.js +14 -13
  13. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  14. package/dist/cjs/cli/dev.js +30 -11
  15. package/dist/cjs/cli/dev.js.map +2 -2
  16. package/dist/cjs/cli/docs.js +1 -1
  17. package/dist/cjs/cli/docs.js.map +2 -2
  18. package/dist/cjs/cli/init.js +1 -1
  19. package/dist/cjs/cli/init.js.map +2 -2
  20. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
  21. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
  22. package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
  23. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
  24. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
  25. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  26. package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
  27. package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
  28. package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
  29. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  31. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  32. package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
  33. package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
  34. package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
  35. package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
  36. package/dist/cjs/cli/lib/api.js +70 -7
  37. package/dist/cjs/cli/lib/api.js.map +2 -2
  38. package/dist/cjs/cli/lib/command.js +4 -5
  39. package/dist/cjs/cli/lib/command.js.map +2 -2
  40. package/dist/cjs/cli/lib/config.js +41 -4
  41. package/dist/cjs/cli/lib/config.js.map +3 -3
  42. package/dist/cjs/cli/lib/deploy2.js +9 -26
  43. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  44. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  45. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  46. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  47. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  48. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  49. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  50. package/dist/cjs/cli/lib/dev.js +162 -117
  51. package/dist/cjs/cli/lib/dev.js.map +2 -2
  52. package/dist/cjs/cli/lib/env.js +1 -13
  53. package/dist/cjs/cli/lib/env.js.map +2 -2
  54. package/dist/cjs/cli/lib/envvars.js +8 -1
  55. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  56. package/dist/cjs/cli/lib/expiration.js +104 -0
  57. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  58. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  59. package/dist/cjs/cli/lib/init.js +4 -3
  60. package/dist/cjs/cli/lib/init.js.map +2 -2
  61. package/dist/cjs/cli/lib/insights.js +1 -1
  62. package/dist/cjs/cli/lib/insights.js.map +2 -2
  63. package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
  64. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  65. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  66. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  67. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  68. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  69. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  70. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  71. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  72. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  73. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  74. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  75. package/dist/cjs/cli/lib/updates.js +8 -9
  76. package/dist/cjs/cli/lib/updates.js.map +2 -2
  77. package/dist/cjs/cli/lib/usage.js +2 -1
  78. package/dist/cjs/cli/lib/usage.js.map +2 -2
  79. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  80. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  81. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  82. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  83. package/dist/cjs/index.js +1 -1
  84. package/dist/cjs/index.js.map +1 -1
  85. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  86. package/dist/cjs/server/components/definition.js.map +1 -1
  87. package/dist/cjs/server/components/index.js +40 -4
  88. package/dist/cjs/server/components/index.js.map +2 -2
  89. package/dist/cjs/server/data_model.js.map +1 -1
  90. package/dist/cjs/server/impl/meta_impl.js +78 -0
  91. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  92. package/dist/cjs/server/impl/registration_impl.js +16 -11
  93. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  94. package/dist/cjs/server/index.js.map +2 -2
  95. package/dist/cjs/server/meta.js +17 -0
  96. package/dist/cjs/server/meta.js.map +7 -0
  97. package/dist/cjs/server/registration.js.map +1 -1
  98. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  99. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  100. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  101. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  102. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  103. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  104. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  105. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  106. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  107. package/dist/cjs-types/cli/dev.d.ts +3 -1
  108. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  109. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  110. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  112. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  114. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  115. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
  116. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
  118. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  120. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  121. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  122. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  123. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
  124. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
  126. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  128. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  129. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  130. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  132. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/config.d.ts +17 -6
  134. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  135. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  136. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  137. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  138. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +12 -12
  140. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +25 -16
  141. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  142. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  143. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  144. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  146. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  147. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  148. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  149. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  150. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  151. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  152. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  153. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  154. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  155. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  156. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  157. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  159. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  161. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  162. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  163. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  164. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  165. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  166. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  167. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  168. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  169. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  170. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  171. package/dist/cjs-types/index.d.ts +1 -1
  172. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  173. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  174. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  175. package/dist/cjs-types/server/components/index.d.ts +5 -1
  176. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  177. package/dist/cjs-types/server/data_model.d.ts +2 -1
  178. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  179. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  180. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  181. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  182. package/dist/cjs-types/server/index.d.ts +1 -0
  183. package/dist/cjs-types/server/index.d.ts.map +1 -1
  184. package/dist/cjs-types/server/meta.d.ts +72 -0
  185. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  186. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  187. package/dist/cli.bundle.cjs +1665 -1215
  188. package/dist/cli.bundle.cjs.map +4 -4
  189. package/dist/esm/cli/aiFiles.js +33 -15
  190. package/dist/esm/cli/aiFiles.js.map +2 -2
  191. package/dist/esm/cli/configure.js +23 -26
  192. package/dist/esm/cli/configure.js.map +2 -2
  193. package/dist/esm/cli/deploy.js +12 -11
  194. package/dist/esm/cli/deploy.js.map +2 -2
  195. package/dist/esm/cli/deploymentCreate.js +238 -42
  196. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  197. package/dist/esm/cli/deploymentSelect.js +13 -12
  198. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  199. package/dist/esm/cli/dev.js +34 -13
  200. package/dist/esm/cli/dev.js.map +2 -2
  201. package/dist/esm/cli/docs.js +1 -1
  202. package/dist/esm/cli/docs.js.map +2 -2
  203. package/dist/esm/cli/init.js +2 -2
  204. package/dist/esm/cli/init.js.map +2 -2
  205. package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
  206. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
  207. package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
  208. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
  209. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
  210. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  211. package/dist/esm/cli/lib/aiFiles/index.js +72 -89
  212. package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
  213. package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
  214. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  215. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  216. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  217. package/dist/esm/cli/lib/aiFiles/status.js +32 -29
  218. package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
  219. package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
  220. package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
  221. package/dist/esm/cli/lib/api.js +70 -7
  222. package/dist/esm/cli/lib/api.js.map +2 -2
  223. package/dist/esm/cli/lib/command.js +4 -5
  224. package/dist/esm/cli/lib/command.js.map +2 -2
  225. package/dist/esm/cli/lib/config.js +39 -3
  226. package/dist/esm/cli/lib/config.js.map +2 -2
  227. package/dist/esm/cli/lib/deploy2.js +13 -26
  228. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  229. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  230. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  231. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  232. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  233. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  234. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  235. package/dist/esm/cli/lib/dev.js +162 -118
  236. package/dist/esm/cli/lib/dev.js.map +2 -2
  237. package/dist/esm/cli/lib/env.js +0 -11
  238. package/dist/esm/cli/lib/env.js.map +2 -2
  239. package/dist/esm/cli/lib/envvars.js +8 -1
  240. package/dist/esm/cli/lib/envvars.js.map +2 -2
  241. package/dist/esm/cli/lib/expiration.js +80 -0
  242. package/dist/esm/cli/lib/expiration.js.map +7 -0
  243. package/dist/esm/cli/lib/init.js +4 -3
  244. package/dist/esm/cli/lib/init.js.map +2 -2
  245. package/dist/esm/cli/lib/insights.js +1 -1
  246. package/dist/esm/cli/lib/insights.js.map +2 -2
  247. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  248. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  249. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  250. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  251. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  252. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  253. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  254. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  255. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  256. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  257. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  258. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  259. package/dist/esm/cli/lib/updates.js +11 -9
  260. package/dist/esm/cli/lib/updates.js.map +2 -2
  261. package/dist/esm/cli/lib/usage.js +2 -1
  262. package/dist/esm/cli/lib/usage.js.map +2 -2
  263. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  264. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  265. package/dist/esm/cli/lib/utils/utils.js +45 -20
  266. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  267. package/dist/esm/index.js +1 -1
  268. package/dist/esm/index.js.map +1 -1
  269. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  270. package/dist/esm/server/components/index.js +40 -4
  271. package/dist/esm/server/components/index.js.map +2 -2
  272. package/dist/esm/server/impl/meta_impl.js +54 -0
  273. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  274. package/dist/esm/server/impl/registration_impl.js +20 -11
  275. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  276. package/dist/esm/server/index.js.map +2 -2
  277. package/dist/esm/server/meta.js +2 -0
  278. package/dist/esm/server/meta.js.map +7 -0
  279. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  280. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  281. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  282. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  283. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  284. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  285. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  286. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  287. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  288. package/dist/esm-types/cli/dev.d.ts +3 -1
  289. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  290. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  291. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  292. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  293. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  294. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  295. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  296. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
  297. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  298. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
  299. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  300. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  301. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  302. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  303. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  304. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
  305. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  306. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
  307. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  308. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  309. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  310. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  311. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  312. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  313. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  314. package/dist/esm-types/cli/lib/config.d.ts +17 -6
  315. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  316. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  317. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  318. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  319. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  320. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +12 -12
  321. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +25 -16
  322. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  323. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  324. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  325. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  326. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  327. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  328. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  329. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  330. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  331. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  332. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  333. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  334. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  335. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  336. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  337. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  338. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  339. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  340. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  341. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  342. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  343. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  344. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  345. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  346. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  347. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  348. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  349. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  350. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  351. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  352. package/dist/esm-types/index.d.ts +1 -1
  353. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  354. package/dist/esm-types/server/components/definition.d.ts +1 -0
  355. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  356. package/dist/esm-types/server/components/index.d.ts +5 -1
  357. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  358. package/dist/esm-types/server/data_model.d.ts +2 -1
  359. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  360. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  361. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  362. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  363. package/dist/esm-types/server/index.d.ts +1 -0
  364. package/dist/esm-types/server/index.d.ts.map +1 -1
  365. package/dist/esm-types/server/meta.d.ts +72 -0
  366. package/dist/esm-types/server/meta.d.ts.map +1 -0
  367. package/dist/esm-types/server/registration.d.ts.map +1 -1
  368. package/dist/react.bundle.js +1 -1
  369. package/dist/react.bundle.js.map +1 -1
  370. package/package.json +11 -7
  371. package/schemas/convex.schema.json +15 -2
  372. package/src/cli/aiFiles.ts +44 -14
  373. package/src/cli/configure.test.ts +138 -0
  374. package/src/cli/configure.ts +48 -47
  375. package/src/cli/deploy.ts +13 -10
  376. package/src/cli/deploymentCreate.test.ts +349 -14
  377. package/src/cli/deploymentCreate.ts +268 -41
  378. package/src/cli/deploymentSelect.test.ts +136 -27
  379. package/src/cli/deploymentSelect.ts +50 -41
  380. package/src/cli/deploymentSelection.test.ts +343 -35
  381. package/src/cli/dev.ts +49 -14
  382. package/src/cli/docs.ts +1 -1
  383. package/src/cli/init.ts +2 -2
  384. package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
  385. package/src/cli/lib/aiFiles/claudemd.ts +15 -11
  386. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
  387. package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
  388. package/src/cli/lib/aiFiles/index.test.ts +188 -222
  389. package/src/cli/lib/aiFiles/index.ts +119 -125
  390. package/src/cli/lib/aiFiles/integration.test.ts +112 -45
  391. package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
  392. package/src/cli/lib/aiFiles/skills.ts +46 -16
  393. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  394. package/src/cli/lib/aiFiles/state.ts +82 -0
  395. package/src/cli/lib/aiFiles/status.ts +45 -39
  396. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  397. package/src/cli/lib/aiFiles/utils.ts +38 -10
  398. package/src/cli/lib/api.ts +88 -7
  399. package/src/cli/lib/command.ts +12 -7
  400. package/src/cli/lib/config.test.ts +184 -7
  401. package/src/cli/lib/config.ts +67 -7
  402. package/src/cli/lib/deploy2.ts +14 -27
  403. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  404. package/src/cli/lib/deploymentSelection.ts +59 -6
  405. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  406. package/src/cli/lib/deploymentSelector.ts +2 -0
  407. package/src/cli/lib/dev.ts +202 -153
  408. package/src/cli/lib/env.ts +0 -15
  409. package/src/cli/lib/envvars.ts +16 -1
  410. package/src/cli/lib/expiration.test.ts +159 -0
  411. package/src/cli/lib/expiration.ts +124 -0
  412. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  413. package/src/cli/lib/init.ts +6 -2
  414. package/src/cli/lib/insights.ts +1 -1
  415. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  416. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  417. package/src/cli/lib/localDeployment/run.ts +1 -1
  418. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  419. package/src/cli/lib/localDeployment/utils.ts +12 -0
  420. package/src/cli/lib/mcp/tools/status.ts +1 -1
  421. package/src/cli/lib/updates.test.ts +102 -75
  422. package/src/cli/lib/updates.ts +14 -12
  423. package/src/cli/lib/usage.ts +3 -1
  424. package/src/cli/lib/utils/prompts.ts +2 -0
  425. package/src/cli/lib/utils/utils.test.ts +6 -6
  426. package/src/cli/lib/utils/utils.ts +66 -27
  427. package/src/index.ts +1 -1
  428. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  429. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  430. package/src/server/components/definition.ts +3 -0
  431. package/src/server/components/index.ts +62 -5
  432. package/src/server/data_model.ts +2 -1
  433. package/src/server/impl/meta_impl.ts +74 -0
  434. package/src/server/impl/registration_impl.ts +21 -9
  435. package/src/server/index.ts +8 -0
  436. package/src/server/meta.ts +76 -0
  437. package/src/server/registration.ts +10 -0
  438. package/src/server/schema.test.ts +78 -1
  439. package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
  440. package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
  441. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
  442. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  443. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  444. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  445. package/dist/esm/cli/lib/aiFiles/config.js +0 -135
  446. package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
  447. package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
  448. package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  449. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  450. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  451. package/src/cli/lib/aiFiles/config.test.ts +0 -460
  452. package/src/cli/lib/aiFiles/config.ts +0 -188
  453. package/src/values/.claude/settings.local.json +0 -10
@@ -3,6 +3,7 @@ import { Context } from "../../bundler/context.js";
3
3
  import { logWarning } from "../../bundler/log.js";
4
4
  import { teamDashboardUrl } from "./dashboard.js";
5
5
  import { fetchTeamAndProject } from "./api.js";
6
+ import { isAnonymousDeployment } from "./deployment.js";
6
7
  import { bigBrainAPI } from "./utils/utils.js";
7
8
 
8
9
  async function warn(
@@ -53,7 +54,8 @@ export async function usageStateWarning(
53
54
  auth === null ||
54
55
  auth.kind === "projectKey" ||
55
56
  auth.kind === "deploymentKey" ||
56
- process.env.CONVEX_AGENT_MODE === "anonymous"
57
+ process.env.CONVEX_AGENT_MODE === "anonymous" ||
58
+ isAnonymousDeployment(targetDeployment)
57
59
  ) {
58
60
  return;
59
61
  }
@@ -30,12 +30,14 @@ export const promptString = async (
30
30
  options: {
31
31
  message: string;
32
32
  default?: string;
33
+ validate?: (value: string) => boolean | string | Promise<string | boolean>;
33
34
  },
34
35
  ): Promise<string> => {
35
36
  if (process.stdin.isTTY) {
36
37
  return input({
37
38
  message: options.message,
38
39
  ...(options.default !== undefined ? { default: options.default } : {}),
40
+ ...(options.validate !== undefined ? { validate: options.validate } : {}),
39
41
  }).catch(handlePromptError(ctx));
40
42
  } else {
41
43
  return ctx.crash({
@@ -65,7 +65,7 @@ describe("bigBrainFetch", () => {
65
65
  const mockFetch = stubFetch();
66
66
  const ctx = makeContext(null);
67
67
 
68
- const fetch = await bigBrainFetch(ctx);
68
+ const fetch = bigBrainFetch(ctx);
69
69
  await fetch("https://api.convex.dev/api/test", { method: "GET" });
70
70
 
71
71
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -82,7 +82,7 @@ describe("bigBrainFetch", () => {
82
82
  accessToken: "test-token",
83
83
  });
84
84
 
85
- const fetch = await bigBrainFetch(ctx);
85
+ const fetch = bigBrainFetch(ctx);
86
86
  await fetch("https://api.convex.dev/api/test", { method: "GET" });
87
87
 
88
88
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -99,7 +99,7 @@ describe("bigBrainFetch", () => {
99
99
  accessToken: "original-token",
100
100
  });
101
101
 
102
- const fetch = await bigBrainFetch(ctx);
102
+ const fetch = bigBrainFetch(ctx);
103
103
  await fetch("https://api.convex.dev/api/test", {
104
104
  method: "POST",
105
105
  headers: {
@@ -124,7 +124,7 @@ describe("bigBrainFetch", () => {
124
124
  headers: { "X-Custom-Header": "custom-value" },
125
125
  });
126
126
 
127
- const fetch = await bigBrainFetch(ctx);
127
+ const fetch = bigBrainFetch(ctx);
128
128
  await fetch(request, undefined);
129
129
 
130
130
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -143,7 +143,7 @@ describe("bigBrainFetch", () => {
143
143
  headers: { "X-Custom-Header": "from-request" },
144
144
  });
145
145
 
146
- const fetch = await bigBrainFetch(ctx);
146
+ const fetch = bigBrainFetch(ctx);
147
147
  await fetch(request, {
148
148
  headers: { "X-Custom-Header": "from-options" },
149
149
  });
@@ -160,7 +160,7 @@ describe("bigBrainFetch", () => {
160
160
  method: "POST",
161
161
  });
162
162
 
163
- const fetch = await bigBrainFetch(ctx);
163
+ const fetch = bigBrainFetch(ctx);
164
164
  await fetch(request);
165
165
 
166
166
  expect(mockFetch).toHaveBeenCalledOnce();
@@ -1,3 +1,4 @@
1
+ import { paths as PlatformDeploymentPaths } from "@convex-dev/platform/deploymentApi";
1
2
  import { paths as PlatformManagementPaths } from "@convex-dev/platform/managementApi";
2
3
  import { chalkStderr } from "chalk";
3
4
  import os from "os";
@@ -692,7 +693,7 @@ export function cacheDir() {
692
693
  *
693
694
  * This fetch() also has retries and throws if the response is not ok.
694
695
  */
695
- export async function bigBrainFetch(ctx: Context): Promise<typeof fetch> {
696
+ export function bigBrainFetch(ctx: Context): typeof fetch {
696
697
  const authHeader = ctx.bigBrainAuth()?.header;
697
698
  const bigBrainHeaders: Record<string, string> = authHeader
698
699
  ? {
@@ -758,26 +759,25 @@ export async function bigBrainAPI<T = any>({
758
759
  *
759
760
  * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.
760
761
  */
761
- function typedBigBrainClientFactory<T>(baseUrl: string) {
762
+ function typedApiClientFactory<T>(
763
+ baseUrl: string,
764
+ fetchBuilder: (ctx: Context) => typeof fetch,
765
+ ) {
762
766
  return (ctx: Context, options: { throw?: boolean } = {}) => {
763
767
  type Paths = T extends CliManagementPaths
764
768
  ? CliManagementPaths
765
769
  : T extends PlatformManagementPaths
766
770
  ? PlatformManagementPaths
767
- : never;
768
- const bigBrainClient = createClient<Paths>({
771
+ : T extends PlatformDeploymentPaths
772
+ ? PlatformDeploymentPaths
773
+ : never;
774
+ const client = createClient<Paths>({
769
775
  baseUrl,
770
- fetch: async (
771
- resource: Request,
772
- options?: RequestInit,
773
- ): Promise<Response> => {
774
- const fetch = await bigBrainFetch(ctx);
775
- return fetch(resource, options);
776
- },
776
+ fetch: fetchBuilder(ctx),
777
777
  });
778
778
 
779
779
  // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors
780
- return new Proxy(bigBrainClient, {
780
+ return new Proxy(client, {
781
781
  get(target, prop) {
782
782
  const originalMethod = target[prop as keyof typeof target];
783
783
 
@@ -810,13 +810,31 @@ function typedBigBrainClientFactory<T>(baseUrl: string) {
810
810
  };
811
811
  }
812
812
 
813
- export const typedBigBrainClient =
814
- typedBigBrainClientFactory<CliManagementPaths>(BIG_BRAIN_URL);
813
+ export const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(
814
+ BIG_BRAIN_URL,
815
+ bigBrainFetch,
816
+ );
815
817
  export const typedPlatformClient =
816
- typedBigBrainClientFactory<PlatformManagementPaths>(
818
+ typedApiClientFactory<PlatformManagementPaths>(
817
819
  PLATFORM_MANAGEMENT_API_URL,
820
+ bigBrainFetch,
818
821
  );
819
822
 
823
+ export function typedDeploymentClient(
824
+ ctx: Context,
825
+ args: { deploymentUrl: string; adminKey: string },
826
+ options: { throw?: boolean } = {},
827
+ ) {
828
+ return typedApiClientFactory<PlatformDeploymentPaths>(
829
+ `${args.deploymentUrl}/api/v1`,
830
+ (ctx) =>
831
+ deploymentFetch(ctx, {
832
+ deploymentUrl: args.deploymentUrl,
833
+ adminKey: args.adminKey,
834
+ }),
835
+ )(ctx, options);
836
+ }
837
+
820
838
  export async function bigBrainAPIMaybeThrows({
821
839
  ctx,
822
840
  method,
@@ -828,7 +846,7 @@ export async function bigBrainAPIMaybeThrows({
828
846
  path: string;
829
847
  data?: any;
830
848
  }): Promise<any> {
831
- const fetch = await bigBrainFetch(ctx);
849
+ const fetch = bigBrainFetch(ctx);
832
850
  const dataString =
833
851
  data === undefined
834
852
  ? method === "POST"
@@ -894,19 +912,40 @@ export function waitUntilCalled(): [Promise<unknown>, () => void] {
894
912
  return [waitPromise, () => onCalled(null)];
895
913
  }
896
914
 
897
- // We can eventually switch to something like `filesize` for i18n and
898
- // more robust formatting, but let's keep our CLI bundle small for now.
915
+ const BYTE_UNITS: [number, string][] = [
916
+ [1 << 30, "GiB"],
917
+ [1_000_000_000, "GB"],
918
+ [1 << 20, "MiB"],
919
+ [1_000_000, "MB"],
920
+ [1 << 10, "KiB"],
921
+ [1_000, "KB"],
922
+ ];
923
+
924
+ /**
925
+ * Format a byte count into a human-friendly string.
926
+ *
927
+ * Picks the unit (binary or decimal) that divides most cleanly.
928
+ * Shows one decimal place only when it divides exactly (e.g. "4.1 MiB").
929
+ * Falls back to raw bytes when no unit divides cleanly.
930
+ */
899
931
  export function formatSize(n: number): string {
900
- if (n < 1024) {
901
- return `${n} B`;
932
+ if (n === 0) {
933
+ return "0 bytes";
902
934
  }
903
- if (n < 1024 * 1024) {
904
- return `${(n / 1024).toFixed(1)} KB`;
905
- }
906
- if (n < 1024 * 1024 * 1024) {
907
- return `${(n / 1024 / 1024).toFixed(1)} MB`;
935
+ for (const [unitSize, unitName] of BYTE_UNITS) {
936
+ if (n < unitSize) {
937
+ continue;
938
+ }
939
+ if (n % unitSize === 0) {
940
+ return `${n / unitSize} ${unitName}`;
941
+ }
942
+ if ((n * 10) % unitSize === 0) {
943
+ const whole = Math.floor(n / unitSize);
944
+ const frac = Math.floor((n * 10) / unitSize) % 10;
945
+ return `${whole}.${frac} ${unitName}`;
946
+ }
908
947
  }
909
- return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;
948
+ return `${n} bytes`;
910
949
  }
911
950
 
912
951
  export function formatDuration(ms: number): string {
@@ -1236,7 +1275,7 @@ export function deploymentFetch(
1236
1275
  adminKey: string;
1237
1276
  onError?: (err: any) => void;
1238
1277
  },
1239
- ): typeof throwingFetch {
1278
+ ): typeof fetch {
1240
1279
  const { deploymentUrl, adminKey, onError } = options;
1241
1280
  const onErrorWithAttempt = (err: any, attempt: number) => {
1242
1281
  onError?.(err);
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export const version = "1.34.1";
1
+ export const version = "1.35.1";
@@ -5,7 +5,7 @@ import { test } from "vitest";
5
5
  import React from "react";
6
6
  import { ConvexProviderWithClerk } from "./ConvexProviderWithClerk.js";
7
7
  import { ConvexReactClient } from "../react/index.js";
8
- import { useAuth } from "@clerk/clerk-react";
8
+ import { useAuth } from "@clerk/react";
9
9
 
10
10
  test("Helpers are valid children", () => {
11
11
  const convex = new ConvexReactClient("https://localhost:3001");
@@ -30,7 +30,7 @@ type UseAuth = () => {
30
30
  * authenticated with Clerk.
31
31
  *
32
32
  * It must be wrapped by a configured `ClerkProvider`, from
33
- * `@clerk/clerk-react`, `@clerk/clerk-expo`, `@clerk/nextjs` or
33
+ * `@clerk/react`, `@clerk/clerk-expo`, `@clerk/nextjs` or
34
34
  * another React-based Clerk client library and have the corresponding
35
35
  * `useAuth` hook passed in.
36
36
  *
@@ -45,6 +45,9 @@ export type ComponentDefinitionAnalysis = {
45
45
  };
46
46
  export type AppDefinitionAnalysis = {
47
47
  definitionType: AppDefinitionType;
48
+ // Top-level field (not inside definitionType) to match Rust's
49
+ // SerializedComponentDefinitionMetadata.http_prefix field.
50
+ httpPrefix?: string;
48
51
  childComponents: ComponentInstantiation[];
49
52
  httpMounts: Record<string, HttpMount>;
50
53
  exports: ComponentExport;
@@ -94,6 +94,7 @@ export type ComponentDefinition<Exports extends ComponentExports = any> = {
94
94
  definition: Definition,
95
95
  options?: {
96
96
  name?: string;
97
+ httpPrefix?: string;
97
98
  },
98
99
  ): InstalledComponent<Definition>;
99
100
 
@@ -128,6 +129,7 @@ export type AppDefinition = {
128
129
  definition: Definition,
129
130
  options?: {
130
131
  name?: string;
132
+ httpPrefix?: string;
131
133
  },
132
134
  ): InstalledComponent<Definition>;
133
135
  };
@@ -143,6 +145,7 @@ type CommonDefinitionData = {
143
145
  string,
144
146
  ImportedComponentDefinition,
145
147
  Record<string, any> | null,
148
+ string | undefined,
146
149
  ][];
147
150
  _exportTree: ExportTree;
148
151
  };
@@ -152,7 +155,9 @@ type ComponentDefinitionData = CommonDefinitionData & {
152
155
  _name: string;
153
156
  _onInitCallbacks: Record<string, (argsStr: string) => string>;
154
157
  };
155
- type AppDefinitionData = CommonDefinitionData;
158
+ type AppDefinitionData = CommonDefinitionData & {
159
+ _httpPrefix?: string;
160
+ };
156
161
 
157
162
  /**
158
163
  * Used to refer to an already-installed component.
@@ -204,6 +209,7 @@ function use<Definition extends ComponentDefinition<any>>(
204
209
  definition: Definition,
205
210
  options?: {
206
211
  name?: string;
212
+ httpPrefix?: string;
207
213
  },
208
214
  ): InstalledComponent<Definition> {
209
215
  // At runtime an imported component will have this shape.
@@ -232,7 +238,21 @@ function use<Definition extends ComponentDefinition<any>>(
232
238
  throw new Error("Component name cannot be empty.");
233
239
  }
234
240
 
235
- this._childComponents.push([name, importedComponentDefinition, {}]);
241
+ const httpPrefix = options?.httpPrefix;
242
+ if (httpPrefix !== undefined) {
243
+ if (!httpPrefix.startsWith("/")) {
244
+ throw new Error(
245
+ `httpPrefix must start with "/". Received: "${httpPrefix}"`,
246
+ );
247
+ }
248
+ }
249
+
250
+ this._childComponents.push([
251
+ name,
252
+ importedComponentDefinition,
253
+ {},
254
+ httpPrefix,
255
+ ]);
236
256
  return new InstalledComponent(definition, name);
237
257
  }
238
258
 
@@ -255,10 +275,14 @@ function exportAppForAnalysis(
255
275
  ): AppDefinitionAnalysis {
256
276
  const definitionType = { type: "app" as const };
257
277
  const childComponents = serializeChildComponents(this._childComponents);
278
+ const httpMounts = buildHttpMounts(this._childComponents);
258
279
  return {
259
280
  definitionType,
281
+ ...(this._httpPrefix !== undefined
282
+ ? { httpPrefix: normalizeHttpPrefix(this._httpPrefix) }
283
+ : {}),
260
284
  childComponents: childComponents as any,
261
- httpMounts: {},
285
+ httpMounts,
262
286
  exports: serializeExportTree(this._exportTree),
263
287
  };
264
288
  }
@@ -277,11 +301,35 @@ function serializeExportTree(tree: ExportTree): any {
277
301
  return { type: "branch", branch };
278
302
  }
279
303
 
304
+ function normalizeHttpPrefix(prefix: string): string {
305
+ // Ensure the prefix ends with "/" as required by HttpMountPath in Rust.
306
+ return prefix.endsWith("/") ? prefix : prefix + "/";
307
+ }
308
+
309
+ function buildHttpMounts(
310
+ childComponents: [
311
+ string,
312
+ ImportedComponentDefinition,
313
+ Record<string, any> | null,
314
+ string | undefined,
315
+ ][],
316
+ ): Record<string, string> {
317
+ const httpMounts: Record<string, string> = {};
318
+ for (const [name, , , httpPrefix] of childComponents) {
319
+ if (httpPrefix !== undefined) {
320
+ const normalized = normalizeHttpPrefix(httpPrefix);
321
+ httpMounts[normalized] = `_reference/childComponent/${name}`;
322
+ }
323
+ }
324
+ return httpMounts;
325
+ }
326
+
280
327
  function serializeChildComponents(
281
328
  childComponents: [
282
329
  string,
283
330
  ImportedComponentDefinition,
284
331
  Record<string, any> | null,
332
+ string | undefined,
285
333
  ][],
286
334
  ): {
287
335
  name: string;
@@ -289,6 +337,7 @@ function serializeChildComponents(
289
337
  args: [string, { type: "value"; value: string }][] | null;
290
338
  }[] {
291
339
  return childComponents.map(([name, definition, p]) => {
340
+ // Note: httpPrefix (4th element) is used separately in buildHttpMounts()
292
341
  let args: [string, { type: "value"; value: string }][] | null = null;
293
342
  if (p !== null) {
294
343
  args = [];
@@ -335,11 +384,12 @@ function exportComponentForAnalysis(
335
384
  args,
336
385
  };
337
386
  const childComponents = serializeChildComponents(this._childComponents);
387
+ const httpMounts = buildHttpMounts(this._childComponents);
338
388
  return {
339
389
  name: this._name,
340
390
  definitionType,
341
391
  childComponents: childComponents as any,
342
- httpMounts: {},
392
+ httpMounts,
343
393
  exports: serializeExportTree(this._exportTree),
344
394
  };
345
395
  }
@@ -394,11 +444,18 @@ export function defineComponent<Exports extends ComponentExports = any>(
394
444
  * This is a feature of components, which are in beta.
395
445
  * This API is unstable and may change in subsequent releases.
396
446
  */
397
- export function defineApp(): AppDefinition {
447
+ export function defineApp(options?: { httpPrefix?: string }): AppDefinition {
448
+ const httpPrefix = options?.httpPrefix;
449
+ if (httpPrefix !== undefined && !httpPrefix.startsWith("/")) {
450
+ throw new Error(
451
+ `httpPrefix must start with "/". Received: "${httpPrefix}"`,
452
+ );
453
+ }
398
454
  const ret: RuntimeAppDefinition = {
399
455
  _isRoot: true,
400
456
  _childComponents: [],
401
457
  _exportTree: {},
458
+ ...(httpPrefix !== undefined ? { _httpPrefix: httpPrefix } : {}),
402
459
 
403
460
  export: exportAppForAnalysis,
404
461
  use,
@@ -1,4 +1,5 @@
1
1
  import { Value } from "../values/index.js";
2
+ import type { SystemIndexes } from "./system_fields.js";
2
3
 
3
4
  // Document Types /////////////////////////////////////////////////////////////
4
5
 
@@ -262,7 +263,7 @@ export type AnyDataModel = {
262
263
  [tableName: string]: {
263
264
  document: any;
264
265
  fieldPaths: GenericFieldPaths;
265
- indexes: {};
266
+ indexes: SystemIndexes;
266
267
  searchIndexes: {};
267
268
  vectorIndexes: {};
268
269
  };
@@ -0,0 +1,74 @@
1
+ import { jsonToConvex } from "../../values/index.js";
2
+ import {
3
+ ActionMeta,
4
+ MutationMeta,
5
+ QueryMeta,
6
+ FunctionMetadata,
7
+ TransactionMetrics,
8
+ } from "../meta.js";
9
+ import { performAsyncSyscall } from "./syscall.js";
10
+
11
+ async function getTransactionMetrics(): Promise<TransactionMetrics> {
12
+ let syscallJSON;
13
+ try {
14
+ syscallJSON = await performAsyncSyscall("1.0/getTransactionMetrics", {});
15
+ } catch (e: any) {
16
+ if (e.message?.includes("Unknown async operation")) {
17
+ throw new Error(
18
+ "getTransactionMetrics() can only be called from a query or mutation. " +
19
+ "It is not available in actions or outside of a Convex function.",
20
+ );
21
+ }
22
+ throw e;
23
+ }
24
+ return jsonToConvex(syscallJSON) as any;
25
+ }
26
+
27
+ async function getFunctionMetadata(): Promise<{
28
+ name: string;
29
+ componentPath: string;
30
+ }> {
31
+ const { name, componentPath } = await performAsyncSyscall(
32
+ "1.0/getFunctionMetadata",
33
+ {},
34
+ );
35
+ return { name, componentPath };
36
+ }
37
+
38
+ export function setupQueryMeta(
39
+ visibility: FunctionMetadata["visibility"],
40
+ ): QueryMeta {
41
+ return {
42
+ getFunctionMetadata: async () => ({
43
+ ...(await getFunctionMetadata()),
44
+ type: "query",
45
+ visibility,
46
+ }),
47
+ getTransactionMetrics,
48
+ };
49
+ }
50
+
51
+ export function setupMutationMeta(
52
+ visibility: FunctionMetadata["visibility"],
53
+ ): MutationMeta {
54
+ return {
55
+ getFunctionMetadata: async () => ({
56
+ ...(await getFunctionMetadata()),
57
+ type: "mutation",
58
+ visibility,
59
+ }),
60
+ getTransactionMetrics,
61
+ };
62
+ }
63
+
64
+ export function setupActionMeta(
65
+ visibility: FunctionMetadata["visibility"],
66
+ ): ActionMeta {
67
+ return {
68
+ getFunctionMetadata: async () => ({
69
+ ...(await getFunctionMetadata()),
70
+ type: "action",
71
+ visibility,
72
+ }),
73
+ };
74
+ }
@@ -11,6 +11,7 @@ import { GenericDataModel } from "../data_model.js";
11
11
  import {
12
12
  ActionBuilder,
13
13
  DefaultFunctionArgs,
14
+ FunctionVisibility,
14
15
  GenericActionCtx,
15
16
  GenericMutationCtx,
16
17
  GenericQueryCtx,
@@ -39,10 +40,15 @@ import { parseArgs } from "../../common/index.js";
39
40
  import { performAsyncSyscall } from "./syscall.js";
40
41
  import { asObjectValidator } from "../../values/validator.js";
41
42
  import { getFunctionAddress } from "../components/paths.js";
43
+ import {
44
+ setupQueryMeta,
45
+ setupMutationMeta,
46
+ setupActionMeta,
47
+ } from "./meta_impl.js";
42
48
 
43
49
  async function invokeMutation<
44
50
  F extends (ctx: GenericMutationCtx<GenericDataModel>, ...args: any) => any,
45
- >(func: F, argsStr: string) {
51
+ >(func: F, argsStr: string, visibility: FunctionVisibility) {
46
52
  // TODO(presley): Change the function signature and propagate the requestId from Rust.
47
53
  // Ok, to mock it out for now, since queries are only running in V8.
48
54
  const requestId = "";
@@ -52,6 +58,7 @@ async function invokeMutation<
52
58
  auth: setupAuth(requestId),
53
59
  storage: setupStorageWriter(requestId),
54
60
  scheduler: setupMutationScheduler(),
61
+ meta: setupMutationMeta(visibility),
55
62
 
56
63
  runQuery: (reference: any, args?: any) => runUdf("query", reference, args),
57
64
  runMutation: (reference: any, args?: any) =>
@@ -247,7 +254,7 @@ export const mutationGeneric: MutationBuilder<any, "public"> = ((
247
254
  assertNotBrowser();
248
255
  func.isMutation = true;
249
256
  func.isPublic = true;
250
- func.invokeMutation = (argsStr) => invokeMutation(handler, argsStr);
257
+ func.invokeMutation = (argsStr) => invokeMutation(handler, argsStr, "public");
251
258
  func.exportArgs = exportArgs(functionDefinition);
252
259
  func.exportReturns = exportReturns(functionDefinition);
253
260
  func._handler = handler;
@@ -308,7 +315,8 @@ export const internalMutationGeneric: MutationBuilder<any, "internal"> = ((
308
315
  assertNotBrowser();
309
316
  func.isMutation = true;
310
317
  func.isInternal = true;
311
- func.invokeMutation = (argsStr) => invokeMutation(handler, argsStr);
318
+ func.invokeMutation = (argsStr) =>
319
+ invokeMutation(handler, argsStr, "internal");
312
320
  func.exportArgs = exportArgs(functionDefinition);
313
321
  func.exportReturns = exportReturns(functionDefinition);
314
322
  func._handler = handler;
@@ -317,7 +325,7 @@ export const internalMutationGeneric: MutationBuilder<any, "internal"> = ((
317
325
 
318
326
  async function invokeQuery<
319
327
  F extends (ctx: GenericQueryCtx<GenericDataModel>, ...args: any) => any,
320
- >(func: F, argsStr: string) {
328
+ >(func: F, argsStr: string, visibility: FunctionVisibility) {
321
329
  // TODO(presley): Change the function signature and propagate the requestId from Rust.
322
330
  // Ok, to mock it out for now, since queries are only running in V8.
323
331
  const requestId = "";
@@ -326,6 +334,7 @@ async function invokeQuery<
326
334
  db: setupReader(),
327
335
  auth: setupAuth(requestId),
328
336
  storage: setupStorageReader(requestId),
337
+ meta: setupQueryMeta(visibility),
329
338
  runQuery: (reference: any, args?: any) => runUdf("query", reference, args),
330
339
  };
331
340
  const result = await invokeFunction(func, queryCtx, args as any);
@@ -403,7 +412,7 @@ export const queryGeneric: QueryBuilder<any, "public"> = ((
403
412
  assertNotBrowser();
404
413
  func.isQuery = true;
405
414
  func.isPublic = true;
406
- func.invokeQuery = (argsStr) => invokeQuery(handler, argsStr);
415
+ func.invokeQuery = (argsStr) => invokeQuery(handler, argsStr, "public");
407
416
  func.exportArgs = exportArgs(functionDefinition);
408
417
  func.exportReturns = exportReturns(functionDefinition);
409
418
  func._handler = handler;
@@ -470,7 +479,8 @@ export const internalQueryGeneric: QueryBuilder<any, "internal"> = ((
470
479
  assertNotBrowser();
471
480
  func.isQuery = true;
472
481
  func.isInternal = true;
473
- func.invokeQuery = (argsStr) => invokeQuery(handler as any, argsStr);
482
+ func.invokeQuery = (argsStr) =>
483
+ invokeQuery(handler as any, argsStr, "internal");
474
484
  func.exportArgs = exportArgs(functionDefinition);
475
485
  func.exportReturns = exportReturns(functionDefinition);
476
486
  func._handler = handler;
@@ -479,7 +489,7 @@ export const internalQueryGeneric: QueryBuilder<any, "internal"> = ((
479
489
 
480
490
  async function invokeAction<
481
491
  F extends (ctx: GenericActionCtx<GenericDataModel>, ...args: any) => any,
482
- >(func: F, requestId: string, argsStr: string) {
492
+ >(func: F, requestId: string, argsStr: string, visibility: FunctionVisibility) {
483
493
  const args = jsonToConvex(JSON.parse(argsStr));
484
494
  const calls = setupActionCalls(requestId);
485
495
  const ctx = {
@@ -488,6 +498,7 @@ async function invokeAction<
488
498
  scheduler: setupActionScheduler(requestId),
489
499
  storage: setupStorageActionWriter(requestId),
490
500
  vectorSearch: setupActionVectorSearch(requestId) as any,
501
+ meta: setupActionMeta(visibility),
491
502
  };
492
503
  const result = await invokeFunction(func, ctx, args as any);
493
504
  return JSON.stringify(convexToJson(result === undefined ? null : result));
@@ -577,7 +588,7 @@ export const actionGeneric: ActionBuilder<any, "public"> = ((
577
588
  func.isAction = true;
578
589
  func.isPublic = true;
579
590
  func.invokeAction = (requestId, argsStr) =>
580
- invokeAction(handler, requestId, argsStr);
591
+ invokeAction(handler, requestId, argsStr, "public");
581
592
  func.exportArgs = exportArgs(functionDefinition);
582
593
  func.exportReturns = exportReturns(functionDefinition);
583
594
  func._handler = handler;
@@ -650,7 +661,7 @@ export const internalActionGeneric: ActionBuilder<any, "internal"> = ((
650
661
  func.isAction = true;
651
662
  func.isInternal = true;
652
663
  func.invokeAction = (requestId, argsStr) =>
653
- invokeAction(handler, requestId, argsStr);
664
+ invokeAction(handler, requestId, argsStr, "internal");
654
665
  func.exportArgs = exportArgs(functionDefinition);
655
666
  func.exportReturns = exportReturns(functionDefinition);
656
667
  func._handler = handler;
@@ -670,6 +681,7 @@ async function invokeHttpAction<
670
681
  storage: setupStorageActionWriter(requestId),
671
682
  scheduler: setupActionScheduler(requestId),
672
683
  vectorSearch: setupActionVectorSearch(requestId) as any,
684
+ meta: setupActionMeta("public"),
673
685
  };
674
686
  return await invokeFunction(func, ctx, [request]);
675
687
  }
@@ -103,6 +103,14 @@ export {
103
103
  internalMutationGeneric,
104
104
  internalQueryGeneric,
105
105
  } from "./impl/registration_impl.js";
106
+ export type {
107
+ TransactionMetric,
108
+ TransactionMetrics,
109
+ FunctionMetadata,
110
+ QueryMeta,
111
+ MutationMeta,
112
+ ActionMeta,
113
+ } from "./meta.js";
106
114
  export type { IndexRange, IndexRangeBuilder } from "./index_range_builder.js";
107
115
  export * from "./pagination.js";
108
116
  export type { OrderedQuery, Query, QueryInitializer } from "./query.js";