convex 1.34.1 → 1.35.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 (512) hide show
  1. package/CHANGELOG.md +86 -43
  2. package/dist/browser.bundle.js +8 -2
  3. package/dist/browser.bundle.js.map +3 -3
  4. package/dist/cjs/browser/index-node.js +3 -1
  5. package/dist/cjs/browser/index.js +3 -1
  6. package/dist/cjs/browser/index.js.map +2 -2
  7. package/dist/cjs/browser/query_options.js.map +2 -2
  8. package/dist/cjs/cli/aiFiles.js +31 -13
  9. package/dist/cjs/cli/aiFiles.js.map +3 -3
  10. package/dist/cjs/cli/codegen_templates/readme.js +14 -1
  11. package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
  12. package/dist/cjs/cli/configure.js +21 -24
  13. package/dist/cjs/cli/configure.js.map +2 -2
  14. package/dist/cjs/cli/deploy.js +7 -8
  15. package/dist/cjs/cli/deploy.js.map +2 -2
  16. package/dist/cjs/cli/deploymentCreate.js +225 -40
  17. package/dist/cjs/cli/deploymentCreate.js.map +3 -3
  18. package/dist/cjs/cli/deploymentSelect.js +14 -13
  19. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  20. package/dist/cjs/cli/dev.js +30 -11
  21. package/dist/cjs/cli/dev.js.map +2 -2
  22. package/dist/cjs/cli/docs.js +1 -1
  23. package/dist/cjs/cli/docs.js.map +2 -2
  24. package/dist/cjs/cli/init.js +1 -1
  25. package/dist/cjs/cli/init.js.map +2 -2
  26. package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
  27. package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
  28. package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
  29. package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
  30. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
  31. package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  32. package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
  33. package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
  34. package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
  35. package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
  36. package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
  37. package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
  38. package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
  39. package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
  40. package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
  41. package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
  42. package/dist/cjs/cli/lib/api.js +70 -7
  43. package/dist/cjs/cli/lib/api.js.map +2 -2
  44. package/dist/cjs/cli/lib/command.js +4 -5
  45. package/dist/cjs/cli/lib/command.js.map +2 -2
  46. package/dist/cjs/cli/lib/config.js +41 -4
  47. package/dist/cjs/cli/lib/config.js.map +3 -3
  48. package/dist/cjs/cli/lib/deploy2.js +9 -26
  49. package/dist/cjs/cli/lib/deploy2.js.map +2 -2
  50. package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
  51. package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
  52. package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
  53. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  54. package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
  55. package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
  56. package/dist/cjs/cli/lib/dev.js +162 -117
  57. package/dist/cjs/cli/lib/dev.js.map +2 -2
  58. package/dist/cjs/cli/lib/env.js +1 -13
  59. package/dist/cjs/cli/lib/env.js.map +2 -2
  60. package/dist/cjs/cli/lib/expiration.js +104 -0
  61. package/dist/cjs/cli/lib/expiration.js.map +7 -0
  62. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  63. package/dist/cjs/cli/lib/init.js +4 -3
  64. package/dist/cjs/cli/lib/init.js.map +2 -2
  65. package/dist/cjs/cli/lib/insights.js +1 -1
  66. package/dist/cjs/cli/lib/insights.js.map +2 -2
  67. package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
  68. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  69. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
  70. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  71. package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
  72. package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
  73. package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
  74. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
  75. package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
  76. package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
  77. package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
  78. package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
  79. package/dist/cjs/cli/lib/updates.js +8 -9
  80. package/dist/cjs/cli/lib/updates.js.map +2 -2
  81. package/dist/cjs/cli/lib/usage.js +2 -1
  82. package/dist/cjs/cli/lib/usage.js.map +2 -2
  83. package/dist/cjs/cli/lib/utils/prompts.js +2 -1
  84. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  85. package/dist/cjs/cli/lib/utils/utils.js +46 -20
  86. package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
  87. package/dist/cjs/index.js +1 -1
  88. package/dist/cjs/index.js.map +1 -1
  89. package/dist/cjs/react/client.js +43 -6
  90. package/dist/cjs/react/client.js.map +2 -2
  91. package/dist/cjs/react/index.js +2 -0
  92. package/dist/cjs/react/index.js.map +2 -2
  93. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  94. package/dist/cjs/server/api.js.map +2 -2
  95. package/dist/cjs/server/components/definition.js.map +1 -1
  96. package/dist/cjs/server/components/index.js +40 -4
  97. package/dist/cjs/server/components/index.js.map +2 -2
  98. package/dist/cjs/server/data_model.js.map +1 -1
  99. package/dist/cjs/server/impl/meta_impl.js +78 -0
  100. package/dist/cjs/server/impl/meta_impl.js.map +7 -0
  101. package/dist/cjs/server/impl/registration_impl.js +16 -11
  102. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  103. package/dist/cjs/server/index.js.map +2 -2
  104. package/dist/cjs/server/meta.js +17 -0
  105. package/dist/cjs/server/meta.js.map +7 -0
  106. package/dist/cjs/server/registration.js.map +1 -1
  107. package/dist/cjs-types/browser/index.d.ts +1 -0
  108. package/dist/cjs-types/browser/index.d.ts.map +1 -1
  109. package/dist/cjs-types/browser/query_options.d.ts +12 -9
  110. package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
  111. package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
  112. package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
  113. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  114. package/dist/cjs-types/cli/configure.test.d.ts +2 -0
  115. package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
  116. package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
  117. package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
  118. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  119. package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
  120. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  121. package/dist/cjs-types/cli/dev.d.ts +3 -1
  122. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  123. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  124. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  125. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  126. package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  127. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  128. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  129. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
  130. package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  131. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
  132. package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  133. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
  134. package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  135. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  136. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  137. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
  138. package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  139. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
  140. package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  141. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  142. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  143. package/dist/cjs-types/cli/lib/api.d.ts +3 -3
  144. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  145. package/dist/cjs-types/cli/lib/command.d.ts +2 -1
  146. package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
  147. package/dist/cjs-types/cli/lib/config.d.ts +17 -6
  148. package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
  149. package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
  150. package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
  151. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  152. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  153. package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  154. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
  155. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
  156. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  157. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  158. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
  159. package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  160. package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
  161. package/dist/cjs-types/cli/lib/env.d.ts +0 -4
  162. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  163. package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
  164. package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
  165. package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
  166. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
  167. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  168. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  169. package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
  170. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  171. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  172. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
  173. package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  174. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  175. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
  176. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  177. package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
  178. package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  179. package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
  180. package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
  181. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  182. package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
  183. package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
  184. package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
  185. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  186. package/dist/cjs-types/index.d.ts +1 -1
  187. package/dist/cjs-types/react/client.d.ts +54 -2
  188. package/dist/cjs-types/react/client.d.ts.map +1 -1
  189. package/dist/cjs-types/react/index.d.ts +7 -2
  190. package/dist/cjs-types/react/index.d.ts.map +1 -1
  191. package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
  192. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
  193. package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
  194. package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
  195. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  196. package/dist/cjs-types/server/api.d.ts +5 -1
  197. package/dist/cjs-types/server/api.d.ts.map +1 -1
  198. package/dist/cjs-types/server/components/definition.d.ts +1 -0
  199. package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
  200. package/dist/cjs-types/server/components/index.d.ts +5 -1
  201. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  202. package/dist/cjs-types/server/data_model.d.ts +2 -1
  203. package/dist/cjs-types/server/data_model.d.ts.map +1 -1
  204. package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
  205. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
  206. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  207. package/dist/cjs-types/server/index.d.ts +1 -0
  208. package/dist/cjs-types/server/index.d.ts.map +1 -1
  209. package/dist/cjs-types/server/meta.d.ts +72 -0
  210. package/dist/cjs-types/server/meta.d.ts.map +1 -0
  211. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  212. package/dist/cli.bundle.cjs +1670 -1214
  213. package/dist/cli.bundle.cjs.map +4 -4
  214. package/dist/esm/browser/index-node.js +1 -0
  215. package/dist/esm/browser/index.js +1 -0
  216. package/dist/esm/browser/index.js.map +2 -2
  217. package/dist/esm/browser/query_options.js.map +2 -2
  218. package/dist/esm/cli/aiFiles.js +33 -15
  219. package/dist/esm/cli/aiFiles.js.map +2 -2
  220. package/dist/esm/cli/codegen_templates/readme.js +14 -1
  221. package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
  222. package/dist/esm/cli/configure.js +23 -26
  223. package/dist/esm/cli/configure.js.map +2 -2
  224. package/dist/esm/cli/deploy.js +11 -10
  225. package/dist/esm/cli/deploy.js.map +2 -2
  226. package/dist/esm/cli/deploymentCreate.js +238 -42
  227. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  228. package/dist/esm/cli/deploymentSelect.js +13 -12
  229. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  230. package/dist/esm/cli/dev.js +34 -13
  231. package/dist/esm/cli/dev.js.map +2 -2
  232. package/dist/esm/cli/docs.js +1 -1
  233. package/dist/esm/cli/docs.js.map +2 -2
  234. package/dist/esm/cli/init.js +2 -2
  235. package/dist/esm/cli/init.js.map +2 -2
  236. package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
  237. package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
  238. package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
  239. package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
  240. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
  241. package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
  242. package/dist/esm/cli/lib/aiFiles/index.js +72 -89
  243. package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
  244. package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
  245. package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
  246. package/dist/esm/cli/lib/aiFiles/state.js +60 -0
  247. package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
  248. package/dist/esm/cli/lib/aiFiles/status.js +32 -29
  249. package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
  250. package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
  251. package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
  252. package/dist/esm/cli/lib/api.js +70 -7
  253. package/dist/esm/cli/lib/api.js.map +2 -2
  254. package/dist/esm/cli/lib/command.js +4 -5
  255. package/dist/esm/cli/lib/command.js.map +2 -2
  256. package/dist/esm/cli/lib/config.js +39 -3
  257. package/dist/esm/cli/lib/config.js.map +2 -2
  258. package/dist/esm/cli/lib/deploy2.js +13 -26
  259. package/dist/esm/cli/lib/deploy2.js.map +2 -2
  260. package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
  261. package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
  262. package/dist/esm/cli/lib/deploymentSelection.js +46 -2
  263. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  264. package/dist/esm/cli/lib/deploymentSelector.js +1 -0
  265. package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
  266. package/dist/esm/cli/lib/dev.js +162 -118
  267. package/dist/esm/cli/lib/dev.js.map +2 -2
  268. package/dist/esm/cli/lib/env.js +0 -11
  269. package/dist/esm/cli/lib/env.js.map +2 -2
  270. package/dist/esm/cli/lib/expiration.js +80 -0
  271. package/dist/esm/cli/lib/expiration.js.map +7 -0
  272. package/dist/esm/cli/lib/init.js +4 -3
  273. package/dist/esm/cli/lib/init.js.map +2 -2
  274. package/dist/esm/cli/lib/insights.js +1 -1
  275. package/dist/esm/cli/lib/insights.js.map +2 -2
  276. package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
  277. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  278. package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
  279. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  280. package/dist/esm/cli/lib/localDeployment/run.js +1 -1
  281. package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
  282. package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
  283. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  284. package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
  285. package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
  286. package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
  287. package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
  288. package/dist/esm/cli/lib/updates.js +11 -9
  289. package/dist/esm/cli/lib/updates.js.map +2 -2
  290. package/dist/esm/cli/lib/usage.js +2 -1
  291. package/dist/esm/cli/lib/usage.js.map +2 -2
  292. package/dist/esm/cli/lib/utils/prompts.js +2 -1
  293. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  294. package/dist/esm/cli/lib/utils/utils.js +45 -20
  295. package/dist/esm/cli/lib/utils/utils.js.map +3 -3
  296. package/dist/esm/index.js +1 -1
  297. package/dist/esm/index.js.map +1 -1
  298. package/dist/esm/react/client.js +43 -6
  299. package/dist/esm/react/client.js.map +2 -2
  300. package/dist/esm/react/index.js +1 -0
  301. package/dist/esm/react/index.js.map +2 -2
  302. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
  303. package/dist/esm/server/api.js.map +2 -2
  304. package/dist/esm/server/components/index.js +40 -4
  305. package/dist/esm/server/components/index.js.map +2 -2
  306. package/dist/esm/server/impl/meta_impl.js +54 -0
  307. package/dist/esm/server/impl/meta_impl.js.map +7 -0
  308. package/dist/esm/server/impl/registration_impl.js +20 -11
  309. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  310. package/dist/esm/server/index.js.map +2 -2
  311. package/dist/esm/server/meta.js +2 -0
  312. package/dist/esm/server/meta.js.map +7 -0
  313. package/dist/esm-types/browser/index.d.ts +1 -0
  314. package/dist/esm-types/browser/index.d.ts.map +1 -1
  315. package/dist/esm-types/browser/query_options.d.ts +12 -9
  316. package/dist/esm-types/browser/query_options.d.ts.map +1 -1
  317. package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
  318. package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
  319. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  320. package/dist/esm-types/cli/configure.test.d.ts +2 -0
  321. package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
  322. package/dist/esm-types/cli/deploy.d.ts.map +1 -1
  323. package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
  324. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  325. package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
  326. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  327. package/dist/esm-types/cli/dev.d.ts +3 -1
  328. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  329. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
  330. package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
  331. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
  332. package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
  333. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
  334. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
  335. package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
  336. package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
  337. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
  338. package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
  339. package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
  340. package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
  341. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
  342. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
  343. package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
  344. package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
  345. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
  346. package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
  347. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
  348. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
  349. package/dist/esm-types/cli/lib/api.d.ts +3 -3
  350. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  351. package/dist/esm-types/cli/lib/command.d.ts +2 -1
  352. package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
  353. package/dist/esm-types/cli/lib/config.d.ts +17 -6
  354. package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
  355. package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
  356. package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
  357. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
  358. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
  359. package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
  360. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
  361. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
  362. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
  363. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  364. package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
  365. package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
  366. package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
  367. package/dist/esm-types/cli/lib/env.d.ts +0 -4
  368. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  369. package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
  370. package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
  371. package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
  372. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
  373. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
  374. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  375. package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
  376. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  377. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  378. package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
  379. package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
  380. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  381. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
  382. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  383. package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
  384. package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
  385. package/dist/esm-types/cli/lib/updates.d.ts +4 -3
  386. package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
  387. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  388. package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
  389. package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
  390. package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
  391. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  392. package/dist/esm-types/index.d.ts +1 -1
  393. package/dist/esm-types/react/client.d.ts +54 -2
  394. package/dist/esm-types/react/client.d.ts.map +1 -1
  395. package/dist/esm-types/react/index.d.ts +7 -2
  396. package/dist/esm-types/react/index.d.ts.map +1 -1
  397. package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
  398. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
  399. package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
  400. package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
  401. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
  402. package/dist/esm-types/server/api.d.ts +5 -1
  403. package/dist/esm-types/server/api.d.ts.map +1 -1
  404. package/dist/esm-types/server/components/definition.d.ts +1 -0
  405. package/dist/esm-types/server/components/definition.d.ts.map +1 -1
  406. package/dist/esm-types/server/components/index.d.ts +5 -1
  407. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  408. package/dist/esm-types/server/data_model.d.ts +2 -1
  409. package/dist/esm-types/server/data_model.d.ts.map +1 -1
  410. package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
  411. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
  412. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  413. package/dist/esm-types/server/index.d.ts +1 -0
  414. package/dist/esm-types/server/index.d.ts.map +1 -1
  415. package/dist/esm-types/server/meta.d.ts +72 -0
  416. package/dist/esm-types/server/meta.d.ts.map +1 -0
  417. package/dist/esm-types/server/registration.d.ts.map +1 -1
  418. package/dist/react.bundle.js +50 -7
  419. package/dist/react.bundle.js.map +3 -3
  420. package/package.json +11 -7
  421. package/schemas/convex.schema.json +15 -2
  422. package/src/browser/index.ts +3 -0
  423. package/src/browser/query_options.test.ts +0 -9
  424. package/src/browser/query_options.ts +36 -15
  425. package/src/cli/aiFiles.ts +44 -14
  426. package/src/cli/codegen_templates/readme.ts +14 -1
  427. package/src/cli/configure.test.ts +138 -0
  428. package/src/cli/configure.ts +48 -47
  429. package/src/cli/deploy.ts +12 -9
  430. package/src/cli/deploymentCreate.test.ts +349 -14
  431. package/src/cli/deploymentCreate.ts +268 -41
  432. package/src/cli/deploymentSelect.test.ts +136 -27
  433. package/src/cli/deploymentSelect.ts +50 -41
  434. package/src/cli/deploymentSelection.test.ts +343 -35
  435. package/src/cli/dev.ts +49 -14
  436. package/src/cli/docs.ts +1 -1
  437. package/src/cli/init.ts +2 -2
  438. package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
  439. package/src/cli/lib/aiFiles/claudemd.ts +15 -11
  440. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
  441. package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
  442. package/src/cli/lib/aiFiles/index.test.ts +188 -222
  443. package/src/cli/lib/aiFiles/index.ts +119 -125
  444. package/src/cli/lib/aiFiles/integration.test.ts +112 -45
  445. package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
  446. package/src/cli/lib/aiFiles/skills.ts +46 -16
  447. package/src/cli/lib/aiFiles/state.test.ts +280 -0
  448. package/src/cli/lib/aiFiles/state.ts +82 -0
  449. package/src/cli/lib/aiFiles/status.ts +45 -39
  450. package/src/cli/lib/aiFiles/utils.test.ts +50 -0
  451. package/src/cli/lib/aiFiles/utils.ts +38 -10
  452. package/src/cli/lib/api.ts +88 -7
  453. package/src/cli/lib/command.ts +12 -7
  454. package/src/cli/lib/config.test.ts +184 -7
  455. package/src/cli/lib/config.ts +67 -7
  456. package/src/cli/lib/deploy2.ts +14 -27
  457. package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
  458. package/src/cli/lib/deploymentSelection.ts +59 -6
  459. package/src/cli/lib/deploymentSelector.test.ts +6 -0
  460. package/src/cli/lib/deploymentSelector.ts +2 -0
  461. package/src/cli/lib/dev.ts +202 -153
  462. package/src/cli/lib/env.ts +0 -15
  463. package/src/cli/lib/expiration.test.ts +159 -0
  464. package/src/cli/lib/expiration.ts +124 -0
  465. package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
  466. package/src/cli/lib/init.ts +6 -2
  467. package/src/cli/lib/insights.ts +1 -1
  468. package/src/cli/lib/localDeployment/anonymous.ts +19 -9
  469. package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
  470. package/src/cli/lib/localDeployment/run.ts +1 -1
  471. package/src/cli/lib/localDeployment/upgrade.ts +12 -10
  472. package/src/cli/lib/localDeployment/utils.ts +12 -0
  473. package/src/cli/lib/mcp/tools/status.ts +1 -1
  474. package/src/cli/lib/updates.test.ts +102 -75
  475. package/src/cli/lib/updates.ts +14 -12
  476. package/src/cli/lib/usage.ts +3 -1
  477. package/src/cli/lib/utils/prompts.ts +2 -0
  478. package/src/cli/lib/utils/utils.test.ts +6 -6
  479. package/src/cli/lib/utils/utils.ts +66 -27
  480. package/src/index.ts +1 -1
  481. package/src/react/client.test.tsx +65 -0
  482. package/src/react/client.ts +129 -13
  483. package/src/react/index.ts +9 -1
  484. package/src/react/use_query_object_options.test.ts +50 -0
  485. package/src/react/use_query_result.test.ts +41 -0
  486. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
  487. package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
  488. package/src/server/api.ts +5 -1
  489. package/src/server/components/definition.ts +3 -0
  490. package/src/server/components/index.ts +62 -5
  491. package/src/server/data_model.ts +2 -1
  492. package/src/server/impl/meta_impl.ts +74 -0
  493. package/src/server/impl/registration_impl.ts +21 -9
  494. package/src/server/index.ts +8 -0
  495. package/src/server/meta.ts +76 -0
  496. package/src/server/registration.ts +10 -0
  497. package/src/server/schema.test.ts +78 -1
  498. package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
  499. package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
  500. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
  501. package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  502. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  503. package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  504. package/dist/esm/cli/lib/aiFiles/config.js +0 -135
  505. package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
  506. package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
  507. package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
  508. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
  509. package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
  510. package/src/cli/lib/aiFiles/config.test.ts +0 -460
  511. package/src/cli/lib/aiFiles/config.ts +0 -188
  512. package/src/values/.claude/settings.local.json +0 -10
@@ -0,0 +1,124 @@
1
+ type ParsedExpirationSuccess =
2
+ | { kind: "none" }
3
+ | { kind: "absolute"; timestampMs: number }
4
+ | { kind: "relative"; amount: number; unit: "minute" | "hour" | "day" };
5
+
6
+ type ParsedExpiration =
7
+ | ParsedExpirationSuccess
8
+ | { kind: "error"; message: string };
9
+
10
+ const PARSE_ERROR_MESSAGE =
11
+ `Supported formats:\n` +
12
+ ` "none" — no expiration\n` +
13
+ ` "in 7 days" — relative (minutes, hours, days)\n` +
14
+ ` "2026-04-01T00:00:00Z" — UTC datetime\n` +
15
+ ` "1711828382" — Unix timestamp (seconds)\n` +
16
+ ` "1711828382000" — Unix timestamp (milliseconds)`;
17
+
18
+ const UNIT_MS = {
19
+ minute: 60 * 1000,
20
+ hour: 60 * 60 * 1000,
21
+ day: 24 * 60 * 60 * 1000,
22
+ } as const;
23
+
24
+ /**
25
+ * Parse an expiration input string into a structured representation.
26
+ * Does not depend on the current time.
27
+ */
28
+ export function parseExpiration(input: string): ParsedExpiration {
29
+ const trimmed = input.trim();
30
+
31
+ if (trimmed.toLowerCase() === "none") {
32
+ return { kind: "none" };
33
+ }
34
+
35
+ // All digits → Unix timestamp
36
+ if (/^\d+$/.test(trimmed)) {
37
+ const n = Number(trimmed);
38
+
39
+ return {
40
+ kind: "absolute",
41
+ timestampMs:
42
+ n < 1e12 // 1e12 milliseconds is a date in 2001 → unambiguous
43
+ ? n * 1000 // seconds → convert to ms
44
+ : n, // already milliseconds
45
+ };
46
+ }
47
+
48
+ // UTC datetime: "2026-04-01T00:00:00Z"
49
+ if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(trimmed)) {
50
+ const date = new Date(trimmed);
51
+ if (isNaN(date.getTime())) {
52
+ return {
53
+ kind: "error",
54
+ message: `Invalid UTC datetime: "${trimmed}". ${PARSE_ERROR_MESSAGE}`,
55
+ };
56
+ }
57
+ return { kind: "absolute", timestampMs: date.getTime() };
58
+ }
59
+
60
+ // Relative: "in 3 hours", "in 1 day", "in 45 minutes"
61
+ const relativeMatch = trimmed.match(/^in\s+(\d+)\s+(minute|hour|day)s?$/i);
62
+ if (relativeMatch) {
63
+ const amount = Number(relativeMatch[1]);
64
+ const unit = relativeMatch[2].toLowerCase() as "minute" | "hour" | "day";
65
+ return { kind: "relative", amount, unit };
66
+ }
67
+
68
+ return {
69
+ kind: "error",
70
+ message: `Invalid expiration format: "${trimmed}". ${PARSE_ERROR_MESSAGE}`,
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Resolve a parsed expiration into a timestamp in milliseconds, or null for "none".
76
+ */
77
+ export function resolveExpiration(
78
+ parsed: ParsedExpirationSuccess,
79
+ now?: number,
80
+ ): number | null {
81
+ switch (parsed.kind) {
82
+ case "none":
83
+ return null;
84
+ case "absolute":
85
+ return parsed.timestampMs;
86
+ case "relative": {
87
+ const base = now ?? Date.now();
88
+ return base + parsed.amount * UNIT_MS[parsed.unit];
89
+ }
90
+ }
91
+ }
92
+
93
+ type ValidationResult =
94
+ | { kind: "success" }
95
+ | { kind: "error"; message: string };
96
+
97
+ /**
98
+ * Validate that a resolved expiration timestamp is acceptable.
99
+ */
100
+ export function validateExpiration(
101
+ timestampMs: number,
102
+ now?: number,
103
+ ): ValidationResult {
104
+ const base = now ?? Date.now();
105
+ const thirtyMinutes = 30 * 60 * 1000;
106
+ const oneYear = 365 * 24 * 60 * 60 * 1000;
107
+
108
+ if (timestampMs <= base) {
109
+ return { kind: "error", message: "Expiration must be in the future." };
110
+ }
111
+ if (timestampMs - base < thirtyMinutes) {
112
+ return {
113
+ kind: "error",
114
+ message: "Expiration must be at least 30 minutes from now.",
115
+ };
116
+ }
117
+ if (timestampMs - base > oneYear) {
118
+ return {
119
+ kind: "error",
120
+ message: "Expiration must be at most 1 year from now.",
121
+ };
122
+ }
123
+ return { kind: "success" };
124
+ }
@@ -33,6 +33,8 @@ export interface components {
33
33
  timestamp: number;
34
34
  udfType: components["schemas"]["UdfTypeJson"];
35
35
  usageStats: components["schemas"]["UsageStatsJson"];
36
+ /** Format: double */
37
+ userExecutionTime?: number | null;
36
38
  } | {
37
39
  componentPath?: string | null;
38
40
  executionId: string;
@@ -58,9 +60,10 @@ export interface components {
58
60
  udfPath?: string | null;
59
61
  };
60
62
  OccInfoJson: {
63
+ componentPath?: string | null;
61
64
  documentId?: string | null;
62
65
  /** Format: int64 */
63
- retryCount: number;
66
+ retryCount?: number | null;
64
67
  tableName?: string | null;
65
68
  writeSource?: string | null;
66
69
  };
@@ -86,6 +89,10 @@ export interface components {
86
89
  /** @enum {string} */
87
90
  UdfTypeJson: "Query" | "Mutation" | "Action" | "HttpAction";
88
91
  UsageStatsJson: {
92
+ /** Format: int64 */
93
+ databaseIoReadBytes: number;
94
+ /** Format: int64 */
95
+ databaseIoWriteBytes: number;
89
96
  /** Format: int64 */
90
97
  databaseReadBytes: number;
91
98
  /** Format: int64 */
@@ -99,9 +106,17 @@ export interface components {
99
106
  /** Format: int64 */
100
107
  storageWriteBytes: number;
101
108
  /** Format: int64 */
109
+ textIndexQueryBytes: number;
110
+ /** Format: int64 */
111
+ textIndexWriteQueryBytes: number;
112
+ /** Format: int64 */
102
113
  vectorIndexReadBytes: number;
103
114
  /** Format: int64 */
115
+ vectorIndexReadQueryBytes: number;
116
+ /** Format: int64 */
104
117
  vectorIndexWriteBytes: number;
118
+ /** Format: int64 */
119
+ vectorIndexWriteQueryBytes: number;
105
120
  };
106
121
  Value: unknown;
107
122
  };
@@ -26,6 +26,9 @@ export async function finalizeConfiguration(
26
26
  (envFileConfig.convexUrlEnvVar || envFileConfig.siteUrlEnvVar);
27
27
 
28
28
  if (isEnvFileConfigChanged) {
29
+ const deploymentEnvVarMessage = options.changedDeploymentEnvVar
30
+ ? ` name as CONVEX_DEPLOYMENT\n`
31
+ : "";
29
32
  const urlUpdateMessages = [];
30
33
  if (envFileConfig.convexUrlEnvVar) {
31
34
  urlUpdateMessages.push(
@@ -39,7 +42,7 @@ export async function finalizeConfiguration(
39
42
  }
40
43
  logFinishedStep(
41
44
  `${messageForDeploymentType(options.deploymentType, options.url)} and saved its:\n` +
42
- ` name as CONVEX_DEPLOYMENT\n` +
45
+ deploymentEnvVarMessage +
43
46
  urlUpdateMessages.join("") +
44
47
  ` to ${envFileConfig.envFile}`,
45
48
  );
@@ -53,7 +56,8 @@ export async function finalizeConfiguration(
53
56
  }
54
57
  if (
55
58
  options.deploymentType === "anonymous" &&
56
- process.env.CONVEX_AGENT_MODE !== "anonymous"
59
+ process.env.CONVEX_AGENT_MODE !== "anonymous" &&
60
+ ctx.bigBrainAuth() === null
57
61
  ) {
58
62
  logMessage(
59
63
  `Run \`npx convex login\` at any time to create an account and link this deployment.`,
@@ -163,7 +163,7 @@ export async function fetchRawInsightsData(
163
163
  from: fromDate,
164
164
  to: toDate,
165
165
  });
166
- const bbFetch = await bigBrainFetch(ctx);
166
+ const bbFetch = bigBrainFetch(ctx);
167
167
  const res = await bbFetch(
168
168
  new URL(
169
169
  `dashboard/teams/${teamId}/usage/query?${queryParams.toString()}`,
@@ -35,7 +35,7 @@ import { handlePotentialUpgrade } from "./upgrade.js";
35
35
  import {
36
36
  isOffline,
37
37
  generateInstanceSecret,
38
- choosePorts,
38
+ chooseLocalBackendPorts,
39
39
  LOCAL_BACKEND_INSTANCE_SECRET,
40
40
  } from "./utils.js";
41
41
  import { handleDashboard } from "./dashboard.js";
@@ -48,7 +48,7 @@ import { nodeFs } from "../../../bundler/fs.js";
48
48
  import { doInitConvexFolder } from "../codegen.js";
49
49
  import { readProjectConfig } from "../config.js";
50
50
  import { functionsDir } from "../utils/utils.js";
51
- import { maybeSetupAiFiles } from "../aiFiles/index.js";
51
+ import { attemptSetupAiFiles } from "../aiFiles/index.js";
52
52
 
53
53
  export async function handleAnonymousDeployment(
54
54
  ctx: Context,
@@ -80,7 +80,8 @@ export async function handleAnonymousDeployment(
80
80
  });
81
81
  if (
82
82
  deployment.kind === "first" &&
83
- process.env.CONVEX_AGENT_MODE !== "anonymous"
83
+ process.env.CONVEX_AGENT_MODE !== "anonymous" &&
84
+ process.stdin.isTTY
84
85
  ) {
85
86
  logMessage(
86
87
  "This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.",
@@ -146,11 +147,10 @@ export async function handleAnonymousDeployment(
146
147
  adminKey = data.adminKey;
147
148
  }
148
149
 
149
- const [cloudPort, sitePort] = await choosePorts(ctx, {
150
- count: 2,
151
- startPort: 3210,
152
- requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],
153
- });
150
+ const { cloudPort, sitePort } = await chooseLocalBackendPorts(
151
+ ctx,
152
+ options.ports,
153
+ );
154
154
  const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {
155
155
  await ensureBackendRunning(ctx, {
156
156
  cloudPort,
@@ -187,7 +187,12 @@ export async function handleAnonymousDeployment(
187
187
  const { configPath, projectConfig } = await readProjectConfig(ctx);
188
188
  const convexDir = path.resolve(functionsDir(configPath, projectConfig));
189
189
  const projectDir = path.resolve(path.dirname(configPath));
190
- await maybeSetupAiFiles({ ctx, convexDir, projectDir });
190
+ await attemptSetupAiFiles({
191
+ ctx,
192
+ aiFilesConfig: projectConfig.aiFiles,
193
+ convexDir,
194
+ projectDir,
195
+ });
191
196
  }
192
197
  return {
193
198
  adminKey,
@@ -354,6 +359,11 @@ async function chooseDeployment(
354
359
  return { deploymentName: generateDeploymentName(), kind: "new" };
355
360
  }
356
361
 
362
+ // Non-interactive terminal - auto-create a new deployment
363
+ if (!process.stdin.isTTY) {
364
+ return { deploymentName: generateDeploymentName(), kind: "new" };
365
+ }
366
+
357
367
  // Legacy deployments exist - prompt user to choose
358
368
  const newOrExisting = await promptSearch(ctx, {
359
369
  message: "Which project would you like to use?",
@@ -25,7 +25,7 @@ import { OnDeploymentActivityFunc } from "../deployment.js";
25
25
  import { promptSearch } from "../utils/prompts.js";
26
26
  import { LocalDeploymentError, printLocalDeploymentOnError } from "./errors.js";
27
27
  import {
28
- choosePorts,
28
+ chooseLocalBackendPorts,
29
29
  printLocalDeploymentWelcomeMessage,
30
30
  isOffline,
31
31
  LOCAL_BACKEND_INSTANCE_SECRET,
@@ -93,11 +93,10 @@ export async function handleLocalDeployment(
93
93
  }
94
94
  : { kind: "version", version: options.backendVersion },
95
95
  );
96
- const [cloudPort, sitePort] = await choosePorts(ctx, {
97
- count: 2,
98
- startPort: 3210,
99
- requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],
100
- });
96
+ const { cloudPort, sitePort } = await chooseLocalBackendPorts(
97
+ ctx,
98
+ options.ports,
99
+ );
101
100
  const { deploymentName, adminKey } = await bigBrainStart(ctx, {
102
101
  port: cloudPort,
103
102
  projectSlug: options.projectSlug,
@@ -207,11 +206,10 @@ async function handleOffline(
207
206
  kind: "version",
208
207
  version: config.backendVersion,
209
208
  });
210
- const [cloudPort, sitePort] = await choosePorts(ctx, {
211
- count: 2,
212
- startPort: 3210,
213
- requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],
214
- });
209
+ const { cloudPort, sitePort } = await chooseLocalBackendPorts(
210
+ ctx,
211
+ options.ports,
212
+ );
215
213
  saveDeploymentConfig(ctx, "local", deploymentName, config);
216
214
  await runLocalBackend(ctx, {
217
215
  binaryPath,
@@ -295,7 +295,7 @@ type LocalBackendStatus =
295
295
  | { kind: "different"; name: string }
296
296
  | { kind: "not-running" };
297
297
 
298
- async function fetchLocalBackendStatus(args: {
298
+ export async function fetchLocalBackendStatus(args: {
299
299
  url: string;
300
300
  deploymentName: string;
301
301
  }): Promise<LocalBackendStatus> {
@@ -76,6 +76,7 @@ export async function handlePotentialUpgrade(
76
76
  );
77
77
  const confirmed =
78
78
  args.forceUpgrade ||
79
+ !process.stdin.isTTY ||
79
80
  (await promptYesNo(ctx, {
80
81
  message: `This deployment is using an older version of the Convex backend. Upgrade now?`,
81
82
  default: true,
@@ -102,16 +103,17 @@ export async function handlePotentialUpgrade(
102
103
  isLatestVersion: false,
103
104
  });
104
105
  }
105
- const choice = args.forceUpgrade
106
- ? "transfer"
107
- : await promptOptions(ctx, {
108
- message: "Transfer data from existing deployment?",
109
- default: "transfer",
110
- choices: [
111
- { name: "transfer data", value: "transfer" },
112
- { name: "start fresh", value: "reset" },
113
- ],
114
- });
106
+ const choice =
107
+ args.forceUpgrade || !process.stdin.isTTY
108
+ ? "transfer"
109
+ : await promptOptions(ctx, {
110
+ message: "Transfer data from existing deployment?",
111
+ default: "transfer",
112
+ choices: [
113
+ { name: "transfer data", value: "transfer" },
114
+ { name: "start fresh", value: "reset" },
115
+ ],
116
+ });
115
117
  const deploymentStatePath = deploymentStateDir(
116
118
  ctx,
117
119
  args.deploymentKind,
@@ -39,6 +39,18 @@ export async function choosePorts(
39
39
  return ports;
40
40
  }
41
41
 
42
+ export async function chooseLocalBackendPorts(
43
+ ctx: Context,
44
+ ports?: { cloud?: number | null; site?: number | null },
45
+ ): Promise<{ cloudPort: number; sitePort: number }> {
46
+ const [cloudPort, sitePort] = await choosePorts(ctx, {
47
+ count: 2,
48
+ startPort: 3210,
49
+ requestedPorts: [ports?.cloud ?? null, ports?.site ?? null],
50
+ });
51
+ return { cloudPort, sitePort };
52
+ }
53
+
42
54
  export async function isOffline(): Promise<boolean> {
43
55
  // TODO(ENG-7080) -- implement this for real
44
56
  return false;
@@ -97,7 +97,7 @@ export const StatusTool: ConvexTool<typeof inputSchema, typeof outputSchema> = {
97
97
  ];
98
98
  // Also get the prod cloud deployment if we're using a cloud-hosted dev-deployment
99
99
  if (
100
- selectionWithinProject.kind === "ownDev" &&
100
+ selectionWithinProject.kind === "unspecified" &&
101
101
  !(
102
102
  deploymentSelection.kind === "existingDeployment" &&
103
103
  deploymentSelection.deploymentToActOn.deploymentFields === null
@@ -1,8 +1,8 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- import { checkVersion } from "./updates.js";
2
+ import { checkVersionAndAiFilesStaleness } from "./updates.js";
3
3
  import { getVersion } from "./versionApi.js";
4
4
  import { logMessage } from "../../bundler/log.js";
5
- import { checkAiFilesStaleness } from "./aiFiles/index.js";
5
+ import { checkAiFilesStalenessAndLog } from "./aiFiles/index.js";
6
6
  import { readProjectConfig } from "./config.js";
7
7
  import type { Context } from "../../bundler/context.js";
8
8
 
@@ -11,7 +11,12 @@ vi.mock("./versionApi.js", () => ({
11
11
  }));
12
12
 
13
13
  vi.mock("./aiFiles/index.js", () => ({
14
- checkAiFilesStaleness: vi.fn(),
14
+ checkAiFilesStalenessAndLog: vi.fn(),
15
+ isAiFilesDisabled: vi.fn((aiFilesConfig) =>
16
+ aiFilesConfig?.enabled !== undefined
17
+ ? aiFilesConfig.enabled === false
18
+ : aiFilesConfig?.disableStalenessMessage === true,
19
+ ),
15
20
  }));
16
21
 
17
22
  vi.mock("../../bundler/log.js", () => ({
@@ -24,15 +29,26 @@ vi.mock("./config.js", () => ({
24
29
 
25
30
  const mockGetVersion = vi.mocked(getVersion);
26
31
  const mockLogMessage = vi.mocked(logMessage);
27
- const mockCheckAiFilesStaleness = vi.mocked(checkAiFilesStaleness);
32
+ const mockCheckAiFilesStalenessAndLog = vi.mocked(checkAiFilesStalenessAndLog);
28
33
  const mockReadProjectConfig = vi.mocked(readProjectConfig);
29
34
 
30
35
  const fakeCtx = {} as Context;
31
36
 
32
- describe("updates", () => {
37
+ const okVersion = (overrides?: object) => ({
38
+ kind: "ok" as const,
39
+ data: {
40
+ message: null,
41
+ guidelinesHash: "abc-guidelines-hash",
42
+ agentSkillsSha: "abc-skills-sha",
43
+ disableSkillsCli: false,
44
+ ...overrides,
45
+ },
46
+ });
47
+
48
+ describe("checkVersionAndAiFilesStaleness", () => {
33
49
  beforeEach(() => {
34
50
  vi.clearAllMocks();
35
- mockCheckAiFilesStaleness.mockResolvedValue(undefined);
51
+ mockCheckAiFilesStalenessAndLog.mockResolvedValue(undefined);
36
52
  mockReadProjectConfig.mockResolvedValue({
37
53
  projectConfig: {
38
54
  functions: "convex",
@@ -48,82 +64,93 @@ describe("updates", () => {
48
64
  vi.resetAllMocks();
49
65
  });
50
66
 
51
- describe("checkVersion", () => {
52
- it("logs message and passes both hashes to staleness check", async () => {
53
- const sha = "abc123def456abc123def456abc123def456abc1";
54
- mockGetVersion.mockResolvedValue({
55
- kind: "ok",
56
- data: {
57
- message: "New version available: 1.2.3",
58
- guidelinesHash:
59
- "02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
60
- agentSkillsSha: sha,
61
- disableSkillsCli: false,
62
- },
63
- });
64
-
65
- await checkVersion(fakeCtx);
66
-
67
- expect(mockGetVersion).toHaveBeenCalled();
68
- expect(mockLogMessage).toHaveBeenCalledWith(
69
- "New version available: 1.2.3",
70
- );
71
- expect(mockCheckAiFilesStaleness).toHaveBeenCalledWith({
72
- canonicalGuidelinesHash:
73
- "02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
74
- canonicalAgentSkillsSha: sha,
75
- projectDir: expect.any(String),
76
- convexDir: expect.any(String),
77
- });
78
- });
67
+ it("logs version message when server provides one", async () => {
68
+ mockGetVersion.mockResolvedValue(
69
+ okVersion({ message: "New version available: 1.2.3" }),
70
+ );
71
+
72
+ await checkVersionAndAiFilesStaleness(fakeCtx);
73
+
74
+ expect(mockLogMessage).toHaveBeenCalledWith("New version available: 1.2.3");
75
+ });
76
+
77
+ it("does not log when version has no message", async () => {
78
+ mockGetVersion.mockResolvedValue(okVersion());
79
79
 
80
- it("does not log when version has no message", async () => {
81
- mockGetVersion.mockResolvedValue({
82
- kind: "ok",
83
- data: {
84
- message: null,
85
- guidelinesHash:
86
- "02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
87
- agentSkillsSha: null,
88
- disableSkillsCli: false,
89
- },
90
- });
91
-
92
- await checkVersion(fakeCtx);
93
-
94
- expect(mockGetVersion).toHaveBeenCalled();
95
- expect(mockLogMessage).not.toHaveBeenCalled();
80
+ await checkVersionAndAiFilesStaleness(fakeCtx);
81
+
82
+ expect(mockLogMessage).not.toHaveBeenCalled();
83
+ });
84
+
85
+ it("does nothing when getVersion returns error", async () => {
86
+ mockGetVersion.mockResolvedValue({ kind: "error" });
87
+
88
+ await checkVersionAndAiFilesStaleness(fakeCtx);
89
+
90
+ expect(mockLogMessage).not.toHaveBeenCalled();
91
+ expect(mockCheckAiFilesStalenessAndLog).not.toHaveBeenCalled();
92
+ });
93
+
94
+ it("passes hashes and project paths to staleness check", async () => {
95
+ mockGetVersion.mockResolvedValue(
96
+ okVersion({
97
+ guidelinesHash:
98
+ "02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
99
+ agentSkillsSha: "abc123def456abc123def456abc123def456abc1",
100
+ }),
101
+ );
102
+
103
+ await checkVersionAndAiFilesStaleness(fakeCtx);
104
+
105
+ expect(mockCheckAiFilesStalenessAndLog).toHaveBeenCalledWith({
106
+ canonicalGuidelinesHash:
107
+ "02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
108
+ canonicalAgentSkillsSha: "abc123def456abc123def456abc123def456abc1",
109
+ projectDir: expect.any(String),
110
+ convexDir: expect.any(String),
96
111
  });
112
+ });
97
113
 
98
- it("doesn't do anything when getVersion returns error", async () => {
99
- mockGetVersion.mockResolvedValue({ kind: "error" });
114
+ it("passes null hashes when version has none", async () => {
115
+ mockGetVersion.mockResolvedValue(
116
+ okVersion({ guidelinesHash: null, agentSkillsSha: null }),
117
+ );
100
118
 
101
- await checkVersion(fakeCtx);
119
+ await checkVersionAndAiFilesStaleness(fakeCtx);
102
120
 
103
- expect(mockGetVersion).toHaveBeenCalled();
104
- expect(mockLogMessage).not.toHaveBeenCalled();
105
- expect(mockCheckAiFilesStaleness).not.toHaveBeenCalled();
121
+ expect(mockCheckAiFilesStalenessAndLog).toHaveBeenCalledWith({
122
+ canonicalGuidelinesHash: null,
123
+ canonicalAgentSkillsSha: null,
124
+ projectDir: expect.any(String),
125
+ convexDir: expect.any(String),
106
126
  });
127
+ });
107
128
 
108
- it("passes null hashes to staleness check when version has none", async () => {
109
- mockGetVersion.mockResolvedValue({
110
- kind: "ok",
111
- data: {
112
- message: "New version available: 1.2.3",
113
- guidelinesHash: null,
114
- agentSkillsSha: null,
115
- disableSkillsCli: false,
116
- },
117
- });
118
-
119
- await checkVersion(fakeCtx);
120
-
121
- expect(mockCheckAiFilesStaleness).toHaveBeenCalledWith({
122
- canonicalGuidelinesHash: null,
123
- canonicalAgentSkillsSha: null,
124
- projectDir: expect.any(String),
125
- convexDir: expect.any(String),
126
- });
129
+ it("skips staleness check when aiFiles.disableStalenessMessage is true", async () => {
130
+ mockGetVersion.mockResolvedValue(okVersion());
131
+ mockReadProjectConfig.mockResolvedValue({
132
+ projectConfig: {
133
+ functions: "convex",
134
+ node: { externalPackages: [] },
135
+ generateCommonJSApi: false,
136
+ codegen: { staticApi: true, staticDataModel: true },
137
+ aiFiles: { disableStalenessMessage: true },
138
+ },
139
+ configPath: "convex.json",
127
140
  });
141
+
142
+ await checkVersionAndAiFilesStaleness(fakeCtx);
143
+
144
+ expect(mockCheckAiFilesStalenessAndLog).not.toHaveBeenCalled();
145
+ });
146
+
147
+ it("silently skips staleness check when project config cannot be resolved", async () => {
148
+ mockGetVersion.mockResolvedValue(okVersion());
149
+ mockReadProjectConfig.mockRejectedValue(new Error("no convex.json"));
150
+
151
+ await expect(
152
+ checkVersionAndAiFilesStaleness(fakeCtx),
153
+ ).resolves.toBeUndefined();
154
+ expect(mockCheckAiFilesStalenessAndLog).not.toHaveBeenCalled();
128
155
  });
129
156
  });
@@ -3,31 +3,33 @@ import { logMessage } from "../../bundler/log.js";
3
3
  import type { Context } from "../../bundler/context.js";
4
4
  import { readProjectConfig } from "./config.js";
5
5
  import { functionsDir } from "./utils/utils.js";
6
- import { checkAiFilesStaleness } from "./aiFiles/index.js";
6
+ import {
7
+ checkAiFilesStalenessAndLog,
8
+ isAiFilesDisabled,
9
+ } from "./aiFiles/index.js";
7
10
  import { getVersion } from "./versionApi.js";
8
11
 
9
12
  /**
10
- * Check the version of the `convex` NPM package and nag if Convex AI files
11
- * are out of date.
13
+ * Fetch the latest version data, log any server nag message, and warn if
14
+ * Convex AI files are out of date. Both checks share the one getVersion()
15
+ * round-trip.
12
16
  */
13
- export async function checkVersion(ctx: Context) {
17
+ export async function checkVersionAndAiFilesStaleness(ctx: Context) {
14
18
  const version = await getVersion();
19
+ if (version.kind === "error") return;
15
20
 
16
- if (version.kind === "error") {
17
- return;
18
- }
19
-
20
- if (version.data.message) {
21
- logMessage(version.data.message);
22
- }
21
+ if (version.data.message) logMessage(version.data.message);
23
22
 
24
23
  try {
25
24
  const { configPath, projectConfig } = await readProjectConfig(ctx);
25
+ const aiFilesConfig = projectConfig.aiFiles;
26
+ if (isAiFilesDisabled(aiFilesConfig)) return;
26
27
  const convexDir = path.resolve(functionsDir(configPath, projectConfig));
27
28
  const projectDir = path.resolve(path.dirname(configPath));
28
- await checkAiFilesStaleness({
29
+ await checkAiFilesStalenessAndLog({
29
30
  canonicalGuidelinesHash: version.data.guidelinesHash,
30
31
  canonicalAgentSkillsSha: version.data.agentSkillsSha,
32
+ aiFilesConfig,
31
33
  projectDir,
32
34
  convexDir,
33
35
  });