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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/utils.ts"],
4
- "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport crypto from \"crypto\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n startPort,\n }: {\n count: number;\n requestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function isOffline(): Promise<boolean> {\n // TODO(ENG-7080) -- implement this for real\n return false;\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n logMessage(\n chalkStderr.cyan(\n \"To opt out at any time, run `npx convex disable-local-deployments`\",\n ),\n );\n}\n\nexport function generateInstanceSecret(): string {\n return crypto.randomBytes(32).toString(\"hex\");\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
5
- "mappings": ";AACA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,OAAO,YAAY;AACnB,SAAS,mBAAmB;AAE5B,sBAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAKwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,MAAM,OAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,MAAM,OAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,sBAAsB,YAA8B;AAElD,SAAO;AACT;AAEO,gBAAS,qCAAqC;AACnD;AAAA,IACE,YAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,gBAAS,yBAAiC;AAC/C,SAAO,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;AAEO,aAAM,gCACX;",
4
+ "sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport crypto from \"crypto\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n startPort,\n }: {\n count: number;\n requestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n ports?: { cloud?: number | null; site?: number | null },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [ports?.cloud ?? null, ports?.site ?? null],\n });\n return { cloudPort, sitePort };\n}\n\nexport async function isOffline(): Promise<boolean> {\n // TODO(ENG-7080) -- implement this for real\n return false;\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n logMessage(\n chalkStderr.cyan(\n \"To opt out at any time, run `npx convex disable-local-deployments`\",\n ),\n );\n}\n\nexport function generateInstanceSecret(): string {\n return crypto.randomBytes(32).toString(\"hex\");\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
5
+ "mappings": ";AACA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,OAAO,YAAY;AACnB,SAAS,mBAAmB;AAE5B,sBAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAKwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,MAAM,OAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,MAAM,OAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,sBAAsB,wBACpB,KACA,OACkD;AAClD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB,CAAC,OAAO,SAAS,MAAM,OAAO,QAAQ,IAAI;AAAA,EAC5D,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEA,sBAAsB,YAA8B;AAElD,SAAO;AACT;AAEO,gBAAS,qCAAqC;AACnD;AAAA,IACE,YAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,gBAAS,yBAAiC;AAC/C,SAAO,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;AAEO,aAAM,gCACX;",
6
6
  "names": []
7
7
  }
@@ -86,7 +86,7 @@ export const StatusTool = {
86
86
  )
87
87
  }
88
88
  ];
89
- if (selectionWithinProject.kind === "ownDev" && !(deploymentSelection.kind === "existingDeployment" && deploymentSelection.deploymentToActOn.deploymentFields === null)) {
89
+ if (selectionWithinProject.kind === "unspecified" && !(deploymentSelection.kind === "existingDeployment" && deploymentSelection.deploymentToActOn.deploymentFields === null)) {
90
90
  const prodSelectionWithinProject = {
91
91
  kind: "prod"
92
92
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/cli/lib/mcp/tools/status.ts"],
4
- "sourcesContent": ["import {\n encodeDeploymentSelector,\n getMcpDeploymentSelection,\n RequestContext,\n} from \"../requestContext.js\";\nimport {\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n loadSelectedDeploymentCredentials,\n} from \"../../api.js\";\nimport { z } from \"zod\";\nimport { ConvexTool } from \"./index.js\";\nimport { deploymentDashboardUrlPage } from \"../../../lib/dashboard.js\";\nimport { getDeploymentSelection } from \"../../../lib/deploymentSelection.js\";\n\nconst projectDirDescription = `\nThe root directory of the Convex project. This is usually the editor's workspace directory\nand often includes the 'package.json' file and the 'convex/' folder.\n\nPass this option unless explicitly instructed not to.\n`;\n\nconst inputSchema = z.object({\n projectDir: z.string().optional().describe(projectDirDescription),\n});\nconst outputSchema = z.object({\n availableDeployments: z.array(\n z.object({\n kind: z.string(),\n deploymentSelector: z.string(),\n url: z.string(),\n dashboardUrl: z.string().optional(),\n readOnly: z.boolean().optional(),\n }),\n ),\n});\n\nconst description = `\nGet all available deployments for a given Convex project directory.\n\nUse this tool to find the deployment selector, URL, and dashboard URL for each\ndeployment associated with the project. Pass the deployment selector to other\ntools to target a specific deployment.\n\nWhen deployed to Convex Cloud, projects have a development ({\"kind\": \"ownDev\"}) and\nproduction ({\"kind\": \"prod\"}) deployment. Generally default to using the development\ndeployment unless you'd specifically like to debug issues in production.\n\nWhen running locally, there will be a single \"urlWithAdminKey\" deployment.\n\nIf a deployment has \"readOnly: true\", it can only be used with read-only tools\nthat don't expose PII (\\`insights\\`, \\`functionSpec\\`, \\`tables\\`). Tools that read\nuser data (\\`data\\`, \\`logs\\`, \\`runOneoffQuery\\`) and mutating tools will reject it.\n\nIf \"readOnly\" is false or absent, all tools can be used with the deployment.\n`.trim();\n\nexport const StatusTool: ConvexTool<typeof inputSchema, typeof outputSchema> = {\n name: \"status\",\n description,\n inputSchema,\n outputSchema,\n handler: async (ctx: RequestContext, input) => {\n const projectDir = input.projectDir ?? ctx.options.projectDir;\n if (projectDir === undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project directory provided. Either provide the `projectDir` argument or configure the MCP server with the `--project-dir` flag.\",\n });\n }\n process.chdir(projectDir);\n const selectionWithinProject = deploymentSelectionWithinProjectFromOptions(\n ctx.options,\n );\n const deploymentSelection = await getDeploymentSelection(ctx, ctx.options);\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n let availableDeployments = [\n {\n kind: selectionWithinProject.kind,\n deploymentSelector: encodeDeploymentSelector(\n projectDir,\n selectionWithinProject,\n ),\n url: credentials.url,\n dashboardUrl:\n credentials.deploymentFields?.deploymentName &&\n deploymentDashboardUrlPage(\n credentials.deploymentFields.deploymentName,\n \"\",\n ),\n },\n ];\n // Also get the prod cloud deployment if we're using a cloud-hosted dev-deployment\n if (\n selectionWithinProject.kind === \"ownDev\" &&\n !(\n deploymentSelection.kind === \"existingDeployment\" &&\n deploymentSelection.deploymentToActOn.deploymentFields === null\n )\n ) {\n const prodSelectionWithinProject: DeploymentSelectionWithinProject = {\n kind: \"prod\",\n };\n const prodDeploymentSelection = await getMcpDeploymentSelection(\n ctx,\n prodSelectionWithinProject,\n );\n const prodCredentials = await loadSelectedDeploymentCredentials(\n ctx,\n prodDeploymentSelection,\n );\n if (\n prodCredentials.deploymentFields?.deploymentName &&\n prodCredentials.deploymentFields.deploymentType\n ) {\n availableDeployments.push({\n kind: prodSelectionWithinProject.kind,\n deploymentSelector: encodeDeploymentSelector(\n projectDir,\n prodSelectionWithinProject,\n ),\n url: prodCredentials.url,\n dashboardUrl: deploymentDashboardUrlPage(\n prodCredentials.deploymentFields.deploymentName,\n \"\",\n ),\n });\n }\n }\n if (ctx.productionDeploymentsDisabled) {\n const readOnly = ctx.productionPiiAllowed ? false : true;\n return {\n availableDeployments: availableDeployments.map((d) =>\n d.kind === \"prod\" ? { ...d, readOnly } : d,\n ),\n };\n }\n return { availableDeployments };\n },\n};\n"],
5
- "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAElB,SAAS,kCAAkC;AAC3C,SAAS,8BAA8B;AAEvC,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO9B,MAAM,cAAc,EAAE,OAAO;AAAA,EAC3B,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAClE,CAAC;AACD,MAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,sBAAsB,EAAE;AAAA,IACtB,EAAE,OAAO;AAAA,MACP,MAAM,EAAE,OAAO;AAAA,MACf,oBAAoB,EAAE,OAAO;AAAA,MAC7B,KAAK,EAAE,OAAO;AAAA,MACd,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,MAClC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,EACH;AACF,CAAC;AAED,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBlB,KAAK;AAEA,aAAM,aAAkE;AAAA,EAC7E,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,OAAO,KAAqB,UAAU;AAC7C,UAAM,aAAa,MAAM,cAAc,IAAI,QAAQ;AACnD,QAAI,eAAe,QAAW;AAC5B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,YAAQ,MAAM,UAAU;AACxB,UAAM,yBAAyB;AAAA,MAC7B,IAAI;AAAA,IACN;AACA,UAAM,sBAAsB,MAAM,uBAAuB,KAAK,IAAI,OAAO;AACzE,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AACA,QAAI,uBAAuB;AAAA,MACzB;AAAA,QACE,MAAM,uBAAuB;AAAA,QAC7B,oBAAoB;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AAAA,QACjB,cACE,YAAY,kBAAkB,kBAC9B;AAAA,UACE,YAAY,iBAAiB;AAAA,UAC7B;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,QACE,uBAAuB,SAAS,YAChC,EACE,oBAAoB,SAAS,wBAC7B,oBAAoB,kBAAkB,qBAAqB,OAE7D;AACA,YAAM,6BAA+D;AAAA,QACnE,MAAM;AAAA,MACR;AACA,YAAM,0BAA0B,MAAM;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AACA,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,UACE,gBAAgB,kBAAkB,kBAClC,gBAAgB,iBAAiB,gBACjC;AACA,6BAAqB,KAAK;AAAA,UACxB,MAAM,2BAA2B;AAAA,UACjC,oBAAoB;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,UACA,KAAK,gBAAgB;AAAA,UACrB,cAAc;AAAA,YACZ,gBAAgB,iBAAiB;AAAA,YACjC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,IAAI,+BAA+B;AACrC,YAAM,WAAW,IAAI,uBAAuB,QAAQ;AACpD,aAAO;AAAA,QACL,sBAAsB,qBAAqB;AAAA,UAAI,CAAC,MAC9C,EAAE,SAAS,SAAS,EAAE,GAAG,GAAG,SAAS,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,qBAAqB;AAAA,EAChC;AACF;",
4
+ "sourcesContent": ["import {\n encodeDeploymentSelector,\n getMcpDeploymentSelection,\n RequestContext,\n} from \"../requestContext.js\";\nimport {\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n loadSelectedDeploymentCredentials,\n} from \"../../api.js\";\nimport { z } from \"zod\";\nimport { ConvexTool } from \"./index.js\";\nimport { deploymentDashboardUrlPage } from \"../../../lib/dashboard.js\";\nimport { getDeploymentSelection } from \"../../../lib/deploymentSelection.js\";\n\nconst projectDirDescription = `\nThe root directory of the Convex project. This is usually the editor's workspace directory\nand often includes the 'package.json' file and the 'convex/' folder.\n\nPass this option unless explicitly instructed not to.\n`;\n\nconst inputSchema = z.object({\n projectDir: z.string().optional().describe(projectDirDescription),\n});\nconst outputSchema = z.object({\n availableDeployments: z.array(\n z.object({\n kind: z.string(),\n deploymentSelector: z.string(),\n url: z.string(),\n dashboardUrl: z.string().optional(),\n readOnly: z.boolean().optional(),\n }),\n ),\n});\n\nconst description = `\nGet all available deployments for a given Convex project directory.\n\nUse this tool to find the deployment selector, URL, and dashboard URL for each\ndeployment associated with the project. Pass the deployment selector to other\ntools to target a specific deployment.\n\nWhen deployed to Convex Cloud, projects have a development ({\"kind\": \"ownDev\"}) and\nproduction ({\"kind\": \"prod\"}) deployment. Generally default to using the development\ndeployment unless you'd specifically like to debug issues in production.\n\nWhen running locally, there will be a single \"urlWithAdminKey\" deployment.\n\nIf a deployment has \"readOnly: true\", it can only be used with read-only tools\nthat don't expose PII (\\`insights\\`, \\`functionSpec\\`, \\`tables\\`). Tools that read\nuser data (\\`data\\`, \\`logs\\`, \\`runOneoffQuery\\`) and mutating tools will reject it.\n\nIf \"readOnly\" is false or absent, all tools can be used with the deployment.\n`.trim();\n\nexport const StatusTool: ConvexTool<typeof inputSchema, typeof outputSchema> = {\n name: \"status\",\n description,\n inputSchema,\n outputSchema,\n handler: async (ctx: RequestContext, input) => {\n const projectDir = input.projectDir ?? ctx.options.projectDir;\n if (projectDir === undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project directory provided. Either provide the `projectDir` argument or configure the MCP server with the `--project-dir` flag.\",\n });\n }\n process.chdir(projectDir);\n const selectionWithinProject = deploymentSelectionWithinProjectFromOptions(\n ctx.options,\n );\n const deploymentSelection = await getDeploymentSelection(ctx, ctx.options);\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n let availableDeployments = [\n {\n kind: selectionWithinProject.kind,\n deploymentSelector: encodeDeploymentSelector(\n projectDir,\n selectionWithinProject,\n ),\n url: credentials.url,\n dashboardUrl:\n credentials.deploymentFields?.deploymentName &&\n deploymentDashboardUrlPage(\n credentials.deploymentFields.deploymentName,\n \"\",\n ),\n },\n ];\n // Also get the prod cloud deployment if we're using a cloud-hosted dev-deployment\n if (\n selectionWithinProject.kind === \"unspecified\" &&\n !(\n deploymentSelection.kind === \"existingDeployment\" &&\n deploymentSelection.deploymentToActOn.deploymentFields === null\n )\n ) {\n const prodSelectionWithinProject: DeploymentSelectionWithinProject = {\n kind: \"prod\",\n };\n const prodDeploymentSelection = await getMcpDeploymentSelection(\n ctx,\n prodSelectionWithinProject,\n );\n const prodCredentials = await loadSelectedDeploymentCredentials(\n ctx,\n prodDeploymentSelection,\n );\n if (\n prodCredentials.deploymentFields?.deploymentName &&\n prodCredentials.deploymentFields.deploymentType\n ) {\n availableDeployments.push({\n kind: prodSelectionWithinProject.kind,\n deploymentSelector: encodeDeploymentSelector(\n projectDir,\n prodSelectionWithinProject,\n ),\n url: prodCredentials.url,\n dashboardUrl: deploymentDashboardUrlPage(\n prodCredentials.deploymentFields.deploymentName,\n \"\",\n ),\n });\n }\n }\n if (ctx.productionDeploymentsDisabled) {\n const readOnly = ctx.productionPiiAllowed ? false : true;\n return {\n availableDeployments: availableDeployments.map((d) =>\n d.kind === \"prod\" ? { ...d, readOnly } : d,\n ),\n };\n }\n return { availableDeployments };\n },\n};\n"],
5
+ "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAElB,SAAS,kCAAkC;AAC3C,SAAS,8BAA8B;AAEvC,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO9B,MAAM,cAAc,EAAE,OAAO;AAAA,EAC3B,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAClE,CAAC;AACD,MAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,sBAAsB,EAAE;AAAA,IACtB,EAAE,OAAO;AAAA,MACP,MAAM,EAAE,OAAO;AAAA,MACf,oBAAoB,EAAE,OAAO;AAAA,MAC7B,KAAK,EAAE,OAAO;AAAA,MACd,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,MAClC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,EACH;AACF,CAAC;AAED,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBlB,KAAK;AAEA,aAAM,aAAkE;AAAA,EAC7E,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,OAAO,KAAqB,UAAU;AAC7C,UAAM,aAAa,MAAM,cAAc,IAAI,QAAQ;AACnD,QAAI,eAAe,QAAW;AAC5B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,YAAQ,MAAM,UAAU;AACxB,UAAM,yBAAyB;AAAA,MAC7B,IAAI;AAAA,IACN;AACA,UAAM,sBAAsB,MAAM,uBAAuB,KAAK,IAAI,OAAO;AACzE,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AACA,QAAI,uBAAuB;AAAA,MACzB;AAAA,QACE,MAAM,uBAAuB;AAAA,QAC7B,oBAAoB;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AAAA,QACjB,cACE,YAAY,kBAAkB,kBAC9B;AAAA,UACE,YAAY,iBAAiB;AAAA,UAC7B;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,QACE,uBAAuB,SAAS,iBAChC,EACE,oBAAoB,SAAS,wBAC7B,oBAAoB,kBAAkB,qBAAqB,OAE7D;AACA,YAAM,6BAA+D;AAAA,QACnE,MAAM;AAAA,MACR;AACA,YAAM,0BAA0B,MAAM;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AACA,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,UACE,gBAAgB,kBAAkB,kBAClC,gBAAgB,iBAAiB,gBACjC;AACA,6BAAqB,KAAK;AAAA,UACxB,MAAM,2BAA2B;AAAA,UACjC,oBAAoB;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,UACA,KAAK,gBAAgB;AAAA,UACrB,cAAc;AAAA,YACZ,gBAAgB,iBAAiB;AAAA,YACjC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,IAAI,+BAA+B;AACrC,YAAM,WAAW,IAAI,uBAAuB,QAAQ;AACpD,aAAO;AAAA,QACL,sBAAsB,qBAAqB;AAAA,UAAI,CAAC,MAC9C,EAAE,SAAS,SAAS,EAAE,GAAG,GAAG,SAAS,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,qBAAqB;AAAA,EAChC;AACF;",
6
6
  "names": []
7
7
  }
@@ -3,23 +3,25 @@ import path from "path";
3
3
  import { logMessage } from "../../bundler/log.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
- export async function checkVersion(ctx) {
11
+ export async function checkVersionAndAiFilesStaleness(ctx) {
9
12
  const version = await getVersion();
10
- if (version.kind === "error") {
11
- return;
12
- }
13
- if (version.data.message) {
14
- logMessage(version.data.message);
15
- }
13
+ if (version.kind === "error") return;
14
+ if (version.data.message) logMessage(version.data.message);
16
15
  try {
17
16
  const { configPath, projectConfig } = await readProjectConfig(ctx);
17
+ const aiFilesConfig = projectConfig.aiFiles;
18
+ if (isAiFilesDisabled(aiFilesConfig)) return;
18
19
  const convexDir = path.resolve(functionsDir(configPath, projectConfig));
19
20
  const projectDir = path.resolve(path.dirname(configPath));
20
- await checkAiFilesStaleness({
21
+ await checkAiFilesStalenessAndLog({
21
22
  canonicalGuidelinesHash: version.data.guidelinesHash,
22
23
  canonicalAgentSkillsSha: version.data.agentSkillsSha,
24
+ aiFilesConfig,
23
25
  projectDir,
24
26
  convexDir
25
27
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/updates.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { checkAiFilesStaleness } from \"./aiFiles/index.js\";\nimport { getVersion } from \"./versionApi.js\";\n\n/**\n * Check the version of the `convex` NPM package and nag if Convex AI files\n * are out of date.\n */\nexport async function checkVersion(ctx: Context) {\n const version = await getVersion();\n\n if (version.kind === \"error\") {\n return;\n }\n\n if (version.data.message) {\n logMessage(version.data.message);\n }\n\n try {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await checkAiFilesStaleness({\n canonicalGuidelinesHash: version.data.guidelinesHash,\n canonicalAgentSkillsSha: version.data.agentSkillsSha,\n projectDir,\n convexDir,\n });\n } catch {\n // Non-fatal: skip staleness check if project config can't be resolved.\n }\n}\n"],
5
- "mappings": ";AAAA,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAE3B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAM3B,sBAAsB,aAAa,KAAc;AAC/C,QAAM,UAAU,MAAM,WAAW;AAEjC,MAAI,QAAQ,SAAS,SAAS;AAC5B;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,SAAS;AACxB,eAAW,QAAQ,KAAK,OAAO;AAAA,EACjC;AAEA,MAAI;AACF,UAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,UAAM,YAAY,KAAK,QAAQ,aAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,UAAU,CAAC;AACxD,UAAM,sBAAsB;AAAA,MAC1B,yBAAyB,QAAQ,KAAK;AAAA,MACtC,yBAAyB,QAAQ,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;",
4
+ "sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport {\n checkAiFilesStalenessAndLog,\n isAiFilesDisabled,\n} from \"./aiFiles/index.js\";\nimport { getVersion } from \"./versionApi.js\";\n\n/**\n * Fetch the latest version data, log any server nag message, and warn if\n * Convex AI files are out of date. Both checks share the one getVersion()\n * round-trip.\n */\nexport async function checkVersionAndAiFilesStaleness(ctx: Context) {\n const version = await getVersion();\n if (version.kind === \"error\") return;\n\n if (version.data.message) logMessage(version.data.message);\n\n try {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const aiFilesConfig = projectConfig.aiFiles;\n if (isAiFilesDisabled(aiFilesConfig)) return;\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await checkAiFilesStalenessAndLog({\n canonicalGuidelinesHash: version.data.guidelinesHash,\n canonicalAgentSkillsSha: version.data.agentSkillsSha,\n aiFilesConfig,\n projectDir,\n convexDir,\n });\n } catch {\n // Non-fatal: skip staleness check if project config can't be resolved.\n }\n}\n"],
5
+ "mappings": ";AAAA,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAE3B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAO3B,sBAAsB,gCAAgC,KAAc;AAClE,QAAM,UAAU,MAAM,WAAW;AACjC,MAAI,QAAQ,SAAS,QAAS;AAE9B,MAAI,QAAQ,KAAK,QAAS,YAAW,QAAQ,KAAK,OAAO;AAEzD,MAAI;AACF,UAAM,EAAE,YAAY,cAAc,IAAI,MAAM,kBAAkB,GAAG;AACjE,UAAM,gBAAgB,cAAc;AACpC,QAAI,kBAAkB,aAAa,EAAG;AACtC,UAAM,YAAY,KAAK,QAAQ,aAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,UAAU,CAAC;AACxD,UAAM,4BAA4B;AAAA,MAChC,yBAAyB,QAAQ,KAAK;AAAA,MACtC,yBAAyB,QAAQ,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,7 @@ import { chalkStderr } from "chalk";
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
  async function warn(ctx, options) {
8
9
  const { title, subtitle, teamSlug } = options;
@@ -30,7 +31,7 @@ async function teamSpendingLimitsState(ctx, teamId) {
30
31
  }
31
32
  export async function usageStateWarning(ctx, targetDeployment) {
32
33
  const auth = ctx.bigBrainAuth();
33
- if (auth === null || auth.kind === "projectKey" || auth.kind === "deploymentKey" || process.env.CONVEX_AGENT_MODE === "anonymous") {
34
+ if (auth === null || auth.kind === "projectKey" || auth.kind === "deploymentKey" || process.env.CONVEX_AGENT_MODE === "anonymous" || isAnonymousDeployment(targetDeployment)) {
34
35
  return;
35
36
  }
36
37
  const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/usage.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport { teamDashboardUrl } from \"./dashboard.js\";\nimport { fetchTeamAndProject } from \"./api.js\";\nimport { bigBrainAPI } from \"./utils/utils.js\";\n\nasync function warn(\n ctx: Context,\n options: { title: string; subtitle: string; teamSlug: string },\n) {\n const { title, subtitle, teamSlug } = options;\n logWarning(chalkStderr.bold.yellow(title));\n logWarning(chalkStderr.yellow(subtitle));\n logWarning(\n chalkStderr.yellow(`Visit ${teamDashboardUrl(teamSlug)} to learn more.`),\n );\n}\n\nasync function teamUsageState(ctx: Context, teamId: number) {\n const { usageState } = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/usage/team_usage_state\",\n })) as {\n usageState: \"Default\" | \"Approaching\" | \"Exceeded\" | \"Disabled\" | \"Paused\";\n };\n\n return usageState;\n}\n\nasync function teamSpendingLimitsState(ctx: Context, teamId: number) {\n const response = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/get_spending_limits\",\n })) as {\n disableThresholdCents: number | null;\n state: null | \"Running\" | \"Disabled\" | \"Warning\";\n };\n\n return response.state;\n}\n\nexport async function usageStateWarning(\n ctx: Context,\n targetDeployment: string,\n) {\n // Skip the warning if the user doesn\u2019t have an auth token\n // (which can happen for instance when using a deploy key)\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"projectKey\" ||\n auth.kind === \"deploymentKey\" ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\"\n ) {\n return;\n }\n const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);\n\n const [usageState, spendingLimitsState] = await Promise.all([\n teamUsageState(ctx, teamId),\n teamSpendingLimitsState(ctx, teamId),\n ]);\n if (spendingLimitsState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because you exceeded your spending limit.\",\n subtitle: \"Increase it from the dashboard to re-enable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Approaching\") {\n await warn(ctx, {\n title: \"Your projects are approaching the Free plan limits.\",\n subtitle: \"Consider upgrading to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Exceeded\") {\n await warn(ctx, {\n title: \"Your projects are above the Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team exceeded Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to reenable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Paused\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team previously exceeded Free plan limits.\",\n subtitle: \"Restore your projects by going to the dashboard.\",\n teamSlug: team,\n });\n }\n}\n"],
5
- "mappings": ";AAAA,SAAS,mBAAmB;AAE5B,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AACpC,SAAS,mBAAmB;AAE5B,eAAe,KACb,KACA,SACA;AACA,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,aAAW,YAAY,KAAK,OAAO,KAAK,CAAC;AACzC,aAAW,YAAY,OAAO,QAAQ,CAAC;AACvC;AAAA,IACE,YAAY,OAAO,SAAS,iBAAiB,QAAQ,CAAC,iBAAiB;AAAA,EACzE;AACF;AAEA,eAAe,eAAe,KAAc,QAAgB;AAC1D,QAAM,EAAE,WAAW,IAAK,MAAM,YAAY;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAID,SAAO;AACT;AAEA,eAAe,wBAAwB,KAAc,QAAgB;AACnE,QAAM,WAAY,MAAM,YAAY;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAKD,SAAO,SAAS;AAClB;AAEA,sBAAsB,kBACpB,KACA,kBACA;AAGA,QAAM,OAAO,IAAI,aAAa;AAC9B,MACE,SAAS,QACT,KAAK,SAAS,gBACd,KAAK,SAAS,mBACd,QAAQ,IAAI,sBAAsB,aAClC;AACA;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,oBAAoB,KAAK,gBAAgB;AAExE,QAAM,CAAC,YAAY,mBAAmB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1D,eAAe,KAAK,MAAM;AAAA,IAC1B,wBAAwB,KAAK,MAAM;AAAA,EACrC,CAAC;AACD,MAAI,wBAAwB,YAAY;AACtC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,eAAe;AACvC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,UAAU;AAClC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport { teamDashboardUrl } from \"./dashboard.js\";\nimport { fetchTeamAndProject } from \"./api.js\";\nimport { isAnonymousDeployment } from \"./deployment.js\";\nimport { bigBrainAPI } from \"./utils/utils.js\";\n\nasync function warn(\n ctx: Context,\n options: { title: string; subtitle: string; teamSlug: string },\n) {\n const { title, subtitle, teamSlug } = options;\n logWarning(chalkStderr.bold.yellow(title));\n logWarning(chalkStderr.yellow(subtitle));\n logWarning(\n chalkStderr.yellow(`Visit ${teamDashboardUrl(teamSlug)} to learn more.`),\n );\n}\n\nasync function teamUsageState(ctx: Context, teamId: number) {\n const { usageState } = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/usage/team_usage_state\",\n })) as {\n usageState: \"Default\" | \"Approaching\" | \"Exceeded\" | \"Disabled\" | \"Paused\";\n };\n\n return usageState;\n}\n\nasync function teamSpendingLimitsState(ctx: Context, teamId: number) {\n const response = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/get_spending_limits\",\n })) as {\n disableThresholdCents: number | null;\n state: null | \"Running\" | \"Disabled\" | \"Warning\";\n };\n\n return response.state;\n}\n\nexport async function usageStateWarning(\n ctx: Context,\n targetDeployment: string,\n) {\n // Skip the warning if the user doesn\u2019t have an auth token\n // (which can happen for instance when using a deploy key)\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"projectKey\" ||\n auth.kind === \"deploymentKey\" ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n isAnonymousDeployment(targetDeployment)\n ) {\n return;\n }\n const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);\n\n const [usageState, spendingLimitsState] = await Promise.all([\n teamUsageState(ctx, teamId),\n teamSpendingLimitsState(ctx, teamId),\n ]);\n if (spendingLimitsState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because you exceeded your spending limit.\",\n subtitle: \"Increase it from the dashboard to re-enable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Approaching\") {\n await warn(ctx, {\n title: \"Your projects are approaching the Free plan limits.\",\n subtitle: \"Consider upgrading to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Exceeded\") {\n await warn(ctx, {\n title: \"Your projects are above the Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team exceeded Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to reenable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Paused\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team previously exceeded Free plan limits.\",\n subtitle: \"Restore your projects by going to the dashboard.\",\n teamSlug: team,\n });\n }\n}\n"],
5
+ "mappings": ";AAAA,SAAS,mBAAmB;AAE5B,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AACpC,SAAS,6BAA6B;AACtC,SAAS,mBAAmB;AAE5B,eAAe,KACb,KACA,SACA;AACA,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,aAAW,YAAY,KAAK,OAAO,KAAK,CAAC;AACzC,aAAW,YAAY,OAAO,QAAQ,CAAC;AACvC;AAAA,IACE,YAAY,OAAO,SAAS,iBAAiB,QAAQ,CAAC,iBAAiB;AAAA,EACzE;AACF;AAEA,eAAe,eAAe,KAAc,QAAgB;AAC1D,QAAM,EAAE,WAAW,IAAK,MAAM,YAAY;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAID,SAAO;AACT;AAEA,eAAe,wBAAwB,KAAc,QAAgB;AACnE,QAAM,WAAY,MAAM,YAAY;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAKD,SAAO,SAAS;AAClB;AAEA,sBAAsB,kBACpB,KACA,kBACA;AAGA,QAAM,OAAO,IAAI,aAAa;AAC9B,MACE,SAAS,QACT,KAAK,SAAS,gBACd,KAAK,SAAS,mBACd,QAAQ,IAAI,sBAAsB,eAClC,sBAAsB,gBAAgB,GACtC;AACA;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,KAAK,IAAI,MAAM,oBAAoB,KAAK,gBAAgB;AAExE,QAAM,CAAC,YAAY,mBAAmB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1D,eAAe,KAAK,MAAM;AAAA,IAC1B,wBAAwB,KAAK,MAAM;AAAA,EACrC,CAAC;AACD,MAAI,wBAAwB,YAAY;AACtC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,eAAe;AACvC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,UAAU;AAClC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
@@ -21,7 +21,8 @@ export const promptString = async (ctx, options) => {
21
21
  if (process.stdin.isTTY) {
22
22
  return input({
23
23
  message: options.message,
24
- ...options.default !== void 0 ? { default: options.default } : {}
24
+ ...options.default !== void 0 ? { default: options.default } : {},
25
+ ...options.validate !== void 0 ? { validate: options.validate } : {}
25
26
  }).catch(handlePromptError(ctx));
26
27
  } else {
27
28
  return ctx.crash({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/utils/prompts.ts"],
4
- "sourcesContent": ["import input from \"@inquirer/input\";\nimport select from \"@inquirer/select\";\nimport search from \"@inquirer/search\";\nimport confirm from \"@inquirer/confirm\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logOutput } from \"../../../bundler/log.js\";\n\n/**\n * Handle ExitPromptError thrown by @inquirer/* packages when the user\n * presses Ctrl+C. Instead of printing an ugly stack trace, exit cleanly.\n * For unexpected errors, use ctx.crash to report to Sentry.\n */\nfunction handlePromptError(ctx: Context) {\n return async (error: unknown): Promise<never> => {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n // User pressed Ctrl+C \u2014 exit silently with code 130 (standard for SIGINT)\n process.exit(130);\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected prompt error: ${String(error)}`,\n errForSentry: error instanceof Error ? error : undefined,\n });\n };\n}\n\nexport const promptString = async (\n ctx: Context,\n options: {\n message: string;\n default?: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSecret = async (\n ctx: Context,\n options: {\n message: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n transformer: (val, { isFinal }) =>\n isFinal ? \"*\".repeat(val.length) : val,\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptOptions = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n prefix?: string;\n suffix?: string;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return select<V>({\n message: options.message + (options.suffix ?? \"\"),\n choices: options.choices,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSearch = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return search<V>({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n source: (input: string | undefined) => {\n if (!input) return options.choices;\n const term = input.toLowerCase();\n return options.choices.filter((c) =>\n c.name.toLowerCase().includes(term),\n );\n },\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptYesNo = async (\n ctx: Context,\n options: {\n message: string;\n default?: boolean;\n prefix?: string;\n nonInteractiveError?: string;\n },\n): Promise<boolean> => {\n if (process.stdin.isTTY) {\n return confirm({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n logOutput(options.message);\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n options.nonInteractiveError ??\n `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import input from \"@inquirer/input\";\nimport select from \"@inquirer/select\";\nimport search from \"@inquirer/search\";\nimport confirm from \"@inquirer/confirm\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logOutput } from \"../../../bundler/log.js\";\n\n/**\n * Handle ExitPromptError thrown by @inquirer/* packages when the user\n * presses Ctrl+C. Instead of printing an ugly stack trace, exit cleanly.\n * For unexpected errors, use ctx.crash to report to Sentry.\n */\nfunction handlePromptError(ctx: Context) {\n return async (error: unknown): Promise<never> => {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n // User pressed Ctrl+C \u2014 exit silently with code 130 (standard for SIGINT)\n process.exit(130);\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected prompt error: ${String(error)}`,\n errForSentry: error instanceof Error ? error : undefined,\n });\n };\n}\n\nexport const promptString = async (\n ctx: Context,\n options: {\n message: string;\n default?: string;\n validate?: (value: string) => boolean | string | Promise<string | boolean>;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.validate !== undefined ? { validate: options.validate } : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSecret = async (\n ctx: Context,\n options: {\n message: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n transformer: (val, { isFinal }) =>\n isFinal ? \"*\".repeat(val.length) : val,\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptOptions = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n prefix?: string;\n suffix?: string;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return select<V>({\n message: options.message + (options.suffix ?? \"\"),\n choices: options.choices,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSearch = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return search<V>({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n source: (input: string | undefined) => {\n if (!input) return options.choices;\n const term = input.toLowerCase();\n return options.choices.filter((c) =>\n c.name.toLowerCase().includes(term),\n );\n },\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptYesNo = async (\n ctx: Context,\n options: {\n message: string;\n default?: boolean;\n prefix?: string;\n nonInteractiveError?: string;\n },\n): Promise<boolean> => {\n if (process.stdin.isTTY) {\n return confirm({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n logOutput(options.message);\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n options.nonInteractiveError ??\n `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["input"]
7
7
  }
@@ -480,7 +480,7 @@ export function cacheDir() {
480
480
  }
481
481
  return path.join(os.homedir(), ".cache", name);
482
482
  }
483
- export async function bigBrainFetch(ctx) {
483
+ export function bigBrainFetch(ctx) {
484
484
  const authHeader = ctx.bigBrainAuth()?.header;
485
485
  const bigBrainHeaders = authHeader ? {
486
486
  Authorization: authHeader,
@@ -521,16 +521,13 @@ export async function bigBrainAPI({
521
521
  return await logAndHandleFetchError(ctx, err);
522
522
  }
523
523
  }
524
- function typedBigBrainClientFactory(baseUrl) {
524
+ function typedApiClientFactory(baseUrl, fetchBuilder) {
525
525
  return (ctx, options = {}) => {
526
- const bigBrainClient = createClient({
526
+ const client = createClient({
527
527
  baseUrl,
528
- fetch: async (resource, options2) => {
529
- const fetch2 = await bigBrainFetch(ctx);
530
- return fetch2(resource, options2);
531
- }
528
+ fetch: fetchBuilder(ctx)
532
529
  });
533
- return new Proxy(bigBrainClient, {
530
+ return new Proxy(client, {
534
531
  get(target, prop) {
535
532
  const originalMethod = target[prop];
536
533
  if (prop === "GET" || prop === "POST" || prop === "HEAD" || prop === "OPTIONS" || prop === "PUT" || prop === "DELETE" || prop === "PATCH" || prop === "TRACE") {
@@ -550,17 +547,30 @@ function typedBigBrainClientFactory(baseUrl) {
550
547
  });
551
548
  };
552
549
  }
553
- export const typedBigBrainClient = typedBigBrainClientFactory(BIG_BRAIN_URL);
554
- export const typedPlatformClient = typedBigBrainClientFactory(
555
- PLATFORM_MANAGEMENT_API_URL
550
+ export const typedBigBrainClient = typedApiClientFactory(
551
+ BIG_BRAIN_URL,
552
+ bigBrainFetch
553
+ );
554
+ export const typedPlatformClient = typedApiClientFactory(
555
+ PLATFORM_MANAGEMENT_API_URL,
556
+ bigBrainFetch
556
557
  );
558
+ export function typedDeploymentClient(ctx, args, options = {}) {
559
+ return typedApiClientFactory(
560
+ `${args.deploymentUrl}/api/v1`,
561
+ (ctx2) => deploymentFetch(ctx2, {
562
+ deploymentUrl: args.deploymentUrl,
563
+ adminKey: args.adminKey
564
+ })
565
+ )(ctx, options);
566
+ }
557
567
  export async function bigBrainAPIMaybeThrows({
558
568
  ctx,
559
569
  method,
560
570
  path: path2,
561
571
  data
562
572
  }) {
563
- const fetch2 = await bigBrainFetch(ctx);
573
+ const fetch2 = bigBrainFetch(ctx);
564
574
  const dataString = data === void 0 ? method === "POST" ? JSON.stringify({}) : void 0 : typeof data === "string" ? data : JSON.stringify(data);
565
575
  const res = await fetch2(new URL(path2, BIG_BRAIN_URL), {
566
576
  method,
@@ -596,17 +606,32 @@ export function waitUntilCalled() {
596
606
  const waitPromise = new Promise((resolve) => onCalled = resolve);
597
607
  return [waitPromise, () => onCalled(null)];
598
608
  }
609
+ const BYTE_UNITS = [
610
+ [1 << 30, "GiB"],
611
+ [1e9, "GB"],
612
+ [1 << 20, "MiB"],
613
+ [1e6, "MB"],
614
+ [1 << 10, "KiB"],
615
+ [1e3, "KB"]
616
+ ];
599
617
  export function formatSize(n) {
600
- if (n < 1024) {
601
- return `${n} B`;
602
- }
603
- if (n < 1024 * 1024) {
604
- return `${(n / 1024).toFixed(1)} KB`;
618
+ if (n === 0) {
619
+ return "0 bytes";
605
620
  }
606
- if (n < 1024 * 1024 * 1024) {
607
- return `${(n / 1024 / 1024).toFixed(1)} MB`;
621
+ for (const [unitSize, unitName] of BYTE_UNITS) {
622
+ if (n < unitSize) {
623
+ continue;
624
+ }
625
+ if (n % unitSize === 0) {
626
+ return `${n / unitSize} ${unitName}`;
627
+ }
628
+ if (n * 10 % unitSize === 0) {
629
+ const whole = Math.floor(n / unitSize);
630
+ const frac = Math.floor(n * 10 / unitSize) % 10;
631
+ return `${whole}.${frac} ${unitName}`;
632
+ }
608
633
  }
609
- return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;
634
+ return `${n} bytes`;
610
635
  }
611
636
  export function formatDuration(ms) {
612
637
  const twoDigits = (n, unit) => `${n.toLocaleString("en-US", { maximumFractionDigits: 2 })}${unit}`;