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
@@ -0,0 +1,76 @@
1
+ import { FunctionType } from "./api.js";
2
+ import { FunctionVisibility } from "./registration.js";
3
+
4
+ /**
5
+ * Used and remaining amounts for a single transaction limit.
6
+ *
7
+ * @public
8
+ */
9
+ export type TransactionMetric = {
10
+ used: number;
11
+ remaining: number;
12
+ };
13
+
14
+ /**
15
+ * The remaining headroom for a transaction before hitting limits.
16
+ *
17
+ * See https://docs.convex.dev/production/state/limits
18
+ *
19
+ * @public
20
+ */
21
+ export type TransactionMetrics = {
22
+ bytesRead: TransactionMetric;
23
+ bytesWritten: TransactionMetric;
24
+ databaseQueries: TransactionMetric;
25
+ documentsRead: TransactionMetric;
26
+ documentsWritten: TransactionMetric;
27
+ functionsScheduled: TransactionMetric;
28
+ scheduledFunctionArgsBytes: TransactionMetric;
29
+ };
30
+
31
+ /**
32
+ * Metadata about the currently executing Convex function.
33
+ *
34
+ * @public
35
+ */
36
+ export type FunctionMetadata = {
37
+ /**
38
+ * The name of the function, in the format `"path/to/module:functionName"`
39
+ */
40
+ name: string;
41
+ /**
42
+ * The path of the component this function belongs to.
43
+ * This is an empty string `""` for the app.
44
+ */
45
+ componentPath: string;
46
+ /** Whether it's a query, mutation, or action. */
47
+ type: FunctionType;
48
+ /** Whether the function is public or internal. */
49
+ visibility: FunctionVisibility;
50
+ };
51
+
52
+ /**
53
+ * Extra context available in Convex query functions.
54
+ *
55
+ * @public
56
+ */
57
+ export interface QueryMeta {
58
+ getFunctionMetadata(): Promise<FunctionMetadata>;
59
+ getTransactionMetrics(): Promise<TransactionMetrics>;
60
+ }
61
+
62
+ /**
63
+ * Extra context available in Convex mutation functions.
64
+ *
65
+ * @public
66
+ */
67
+ export interface MutationMeta extends QueryMeta {}
68
+
69
+ /**
70
+ * Extra context available in Convex action functions.
71
+ *
72
+ * @public
73
+ */
74
+ export interface ActionMeta {
75
+ getFunctionMetadata(): Promise<FunctionMetadata>;
76
+ }
@@ -8,6 +8,7 @@ import {
8
8
  StorageReader,
9
9
  StorageWriter,
10
10
  } from "./index.js";
11
+ import { ActionMeta, MutationMeta, QueryMeta } from "./meta.js";
11
12
  import {
12
13
  FunctionReference,
13
14
  FunctionReturnType,
@@ -147,6 +148,9 @@ export interface GenericMutationCtx<DataModel extends GenericDataModel> {
147
148
  mutation: Mutation,
148
149
  ...args: OptionalRestArgs<Mutation>
149
150
  ) => Promise<FunctionReturnType<Mutation>>;
151
+
152
+ /** @internal */
153
+ meta: MutationMeta;
150
154
  }
151
155
 
152
156
  /**
@@ -238,6 +242,9 @@ export interface GenericQueryCtx<DataModel extends GenericDataModel> {
238
242
  query: Query,
239
243
  ...args: OptionalRestArgs<Query>
240
244
  ) => Promise<FunctionReturnType<Query>>;
245
+
246
+ /** @internal */
247
+ meta: QueryMeta;
241
248
  }
242
249
 
243
250
  /**
@@ -398,6 +405,9 @@ export interface GenericActionCtx<DataModel extends GenericDataModel> {
398
405
  VectorSearchQuery<NamedTableInfo<DataModel, TableName>, IndexName>
399
406
  >,
400
407
  ): Promise<Array<{ _id: Id<TableName>; _score: number }>>;
408
+
409
+ /** @internal */
410
+ meta: ActionMeta;
401
411
  }
402
412
 
403
413
  /**
@@ -7,8 +7,16 @@ import {
7
7
  defineSchema,
8
8
  defineTable,
9
9
  DataModelFromSchemaDefinition,
10
+ GenericSchema,
11
+ SchemaDefinition,
10
12
  } from "./schema.js";
11
13
  import { v, Infer } from "../values/validator.js";
14
+ import {
15
+ AnyDataModel,
16
+ GenericDataModel,
17
+ IndexNames,
18
+ NamedTableInfo,
19
+ } from "./data_model.js";
12
20
 
13
21
  describe("DataModelFromSchemaDefinition", () => {
14
22
  test("defineSchema produces the correct data model for basic types", () => {
@@ -405,7 +413,7 @@ describe("DataModelFromSchemaDefinition", () => {
405
413
  [tableName: string]: {
406
414
  document: any;
407
415
  fieldPaths: string;
408
- indexes: {};
416
+ indexes: SystemIndexes;
409
417
  searchIndexes: {};
410
418
  vectorIndexes: {};
411
419
  };
@@ -890,6 +898,75 @@ describe("defineSchema/defineTable expose table validators", () => {
890
898
  });
891
899
  });
892
900
 
901
+ describe("GenericSchema assignability", () => {
902
+ test("DataModelFromSchemaDefinition<GenericSchema> extends GenericDataModel", () => {
903
+ type GenericDM = DataModelFromSchemaDefinition<
904
+ SchemaDefinition<GenericSchema, boolean>
905
+ >;
906
+ type _check = GenericDM extends GenericDataModel ? true : false;
907
+ assert<Equals<_check, true>>();
908
+ });
909
+
910
+ test("a specific schema’s DataModel extends GenericDataModel", () => {
911
+ const specificSchema = defineSchema({
912
+ users: defineTable({ name: v.string() }).index("by_name", ["name"]),
913
+ });
914
+ type SpecificDM = DataModelFromSchemaDefinition<typeof specificSchema>;
915
+
916
+ // This is the key assignability check: specific DataModels must extend
917
+ // GenericDataModel so that generic code can accept any schema.
918
+ type _check = SpecificDM extends GenericDataModel ? true : false;
919
+ assert<Equals<_check, true>>();
920
+ });
921
+
922
+ test("SchemaDefinition<SpecificSchema> extends SchemaDefinition<GenericSchema, boolean>", () => {
923
+ const specificSchema = defineSchema({
924
+ messages: defineTable({ body: v.string() }),
925
+ });
926
+ type SpecificSD = typeof specificSchema;
927
+ type GenericSD = SchemaDefinition<GenericSchema, boolean>;
928
+
929
+ type _check = SpecificSD extends GenericSD ? true : false;
930
+ assert<Equals<_check, true>>();
931
+ });
932
+
933
+ test("specific DM from boolean-strict schema extends generic DM", () => {
934
+ // This mirrors the convexTest() return type: Schema is specific, but
935
+ // StrictTableNameTypes is widened to boolean.
936
+ const specificSchema = defineSchema({
937
+ users: defineTable({ name: v.string() }).index("by_name", ["name"]),
938
+ });
939
+ type SpecificDM = DataModelFromSchemaDefinition<
940
+ SchemaDefinition<(typeof specificSchema)["tables"], boolean>
941
+ >;
942
+ type GenericDM = DataModelFromSchemaDefinition<
943
+ SchemaDefinition<GenericSchema, boolean>
944
+ >;
945
+
946
+ // The specific DM must extend the generic DM for TestConvex covariance.
947
+ type _check = SpecificDM extends GenericDM ? true : false;
948
+ assert<Equals<_check, true>>();
949
+ });
950
+
951
+ test("AnyDataModel exposes system indexes", () => {
952
+ // AnyDataModel is used as the DataModel when no schema is defined.
953
+ // Verify that system indexes (by_id, by_creation_time) are available,
954
+ // since every table always has them.
955
+ type AnyTable = NamedTableInfo<AnyDataModel, string>;
956
+ type AnyIndexNames = IndexNames<AnyTable>;
957
+ type _check = "by_id" | "by_creation_time" extends AnyIndexNames
958
+ ? true
959
+ : false;
960
+ assert<Equals<_check, true>>();
961
+ });
962
+
963
+ // SpecificDM extends GenericDM because:
964
+ // 1. GenericSchema uses TableDefinition defaults (Validator<any,any,any>)
965
+ // producing document: any and fieldPaths: any
966
+ // 2. AnyDataModel includes SystemIndexes, so the loose variant's index
967
+ // signature satisfies GenericDM's SystemIndexes requirement
968
+ });
969
+
893
970
  test("defineTable fails if it can’t export the validator", () => {
894
971
  const table = defineTable(
895
972
  // @ts-expect-error
@@ -1,171 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var config_exports = {};
30
- __export(config_exports, {
31
- aiFilesStateSchema: () => aiFilesStateSchema,
32
- hasAiFilesConfig: () => hasAiFilesConfig,
33
- readAiConfig: () => readAiConfig,
34
- writeAiConfig: () => writeAiConfig,
35
- writeAiEnabledToProjectConfig: () => writeAiEnabledToProjectConfig
36
- });
37
- module.exports = __toCommonJS(config_exports);
38
- var Sentry = __toESM(require("@sentry/node"), 1);
39
- var import_fs = require("fs");
40
- var import_path = __toESM(require("path"), 1);
41
- var import_zod = require("zod");
42
- var import_paths = require("./paths.js");
43
- var import_utils = require("./utils.js");
44
- const aiFilesStateSchema = import_zod.z.object({
45
- guidelinesHash: import_zod.z.string().nullable(),
46
- agentsMdSectionHash: import_zod.z.string().nullable(),
47
- claudeMdHash: import_zod.z.string().nullable(),
48
- // Commit SHA from get-convex/agent-skills that was current when skills were
49
- // last installed. Used to detect when newer skills are available.
50
- agentSkillsSha: import_zod.z.string().nullable(),
51
- // Names of skills installed by `npx skills add`, used by `remove` to
52
- // only remove Convex-managed skills.
53
- installedSkillNames: import_zod.z.array(import_zod.z.string()).default([])
54
- });
55
- const aiFilesProjectConfigSchema = import_zod.z.object({
56
- aiFiles: import_zod.z.object({
57
- // `enabled` is the canonical field. When present it takes full
58
- // precedence - `enabled: true` will re-enable even if the legacy
59
- // disableStalenessMessage field is still `true` in the file.
60
- enabled: import_zod.z.boolean().optional(),
61
- // @deprecated - use `enabled` instead. Read for backward compat;
62
- // new writes always emit `enabled` and drop this key.
63
- disableStalenessMessage: import_zod.z.boolean().optional()
64
- }).default({})
65
- }).passthrough();
66
- const EMPTY_AI_STATE = {
67
- guidelinesHash: null,
68
- agentsMdSectionHash: null,
69
- claudeMdHash: null,
70
- agentSkillsSha: null,
71
- installedSkillNames: []
72
- };
73
- async function readAiEnabledFromProjectConfig(projectDir) {
74
- const raw = await (0, import_utils.readFileSafe)(import_path.default.join(projectDir, "convex.json"));
75
- if (raw === null) return true;
76
- try {
77
- const parsed = aiFilesProjectConfigSchema.parse(JSON.parse(raw));
78
- if (parsed.aiFiles.enabled !== void 0) return parsed.aiFiles.enabled;
79
- return !(parsed.aiFiles.disableStalenessMessage ?? false);
80
- } catch (err) {
81
- Sentry.captureException(err);
82
- return true;
83
- }
84
- }
85
- async function writeAiEnabledToProjectConfig({
86
- projectDir,
87
- enabled
88
- }) {
89
- const filePath = import_path.default.join(projectDir, "convex.json");
90
- const existing = await (0, import_utils.iife)(async () => {
91
- try {
92
- return JSON.parse(await import_fs.promises.readFile(filePath, "utf8"));
93
- } catch {
94
- return {};
95
- }
96
- });
97
- const base = existing !== null && typeof existing === "object" && !Array.isArray(existing) ? existing : {};
98
- const aiFilesValue = base.aiFiles !== null && typeof base.aiFiles === "object" && !Array.isArray(base.aiFiles) ? base.aiFiles : {};
99
- const { $schema, ...rest } = base;
100
- const { disableStalenessMessage: _legacy, ...restAiFiles } = aiFilesValue;
101
- const next = {
102
- $schema: $schema ?? "node_modules/convex/schemas/convex.schema.json",
103
- ...rest,
104
- aiFiles: { ...restAiFiles, enabled }
105
- };
106
- await import_fs.promises.writeFile(filePath, JSON.stringify(next, null, 2) + "\n", "utf8");
107
- }
108
- async function readAiConfig({
109
- projectDir,
110
- convexDir
111
- }) {
112
- const enabled = await readAiEnabledFromProjectConfig(projectDir);
113
- const rawState = await (0, import_utils.readFileSafe)((0, import_paths.aiFilesStatePathForConvexDir)(convexDir));
114
- if (rawState === null) {
115
- return !enabled ? { ...EMPTY_AI_STATE, enabled } : null;
116
- }
117
- try {
118
- const state = aiFilesStateSchema.parse(JSON.parse(rawState));
119
- return { ...state, enabled };
120
- } catch (err) {
121
- Sentry.captureException(err);
122
- return null;
123
- }
124
- }
125
- async function hasAiFilesConfig({
126
- projectDir,
127
- convexDir
128
- }) {
129
- if (!await readAiEnabledFromProjectConfig(projectDir)) {
130
- return true;
131
- }
132
- try {
133
- const rawState = await import_fs.promises.readFile(
134
- (0, import_paths.aiFilesStatePathForConvexDir)(convexDir),
135
- "utf8"
136
- );
137
- aiFilesStateSchema.parse(JSON.parse(rawState));
138
- return true;
139
- } catch (err) {
140
- if (err.code !== "ENOENT") {
141
- Sentry.captureException(err);
142
- }
143
- return false;
144
- }
145
- }
146
- async function writeAiConfig({
147
- config,
148
- projectDir,
149
- convexDir,
150
- options
151
- }) {
152
- const state = aiFilesStateSchema.parse({
153
- guidelinesHash: config.guidelinesHash,
154
- agentsMdSectionHash: config.agentsMdSectionHash,
155
- claudeMdHash: config.claudeMdHash,
156
- agentSkillsSha: config.agentSkillsSha,
157
- installedSkillNames: config.installedSkillNames
158
- });
159
- await import_fs.promises.writeFile(
160
- (0, import_paths.aiFilesStatePathForConvexDir)(convexDir),
161
- JSON.stringify(state, null, 2) + "\n",
162
- "utf8"
163
- );
164
- const persistMode = options?.persistEnabledPreference ?? "ifFalse";
165
- if (persistMode === "always" || persistMode === "ifFalse" && !config.enabled)
166
- await writeAiEnabledToProjectConfig({
167
- projectDir,
168
- enabled: config.enabled
169
- });
170
- }
171
- //# sourceMappingURL=config.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/cli/lib/aiFiles/config.ts"],
4
- "sourcesContent": ["import * as Sentry from \"@sentry/node\";\n// Use raw fs (not ctx.fs) so these operations run asynchronously and don't\n// interfere with the file-watcher used by `convex dev`.\n// eslint-disable-next-line no-restricted-imports\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { z } from \"zod\";\nimport { aiFilesStatePathForConvexDir } from \"./paths.js\";\nimport { iife, readFileSafe } from \"./utils.js\";\n\nexport const aiFilesStateSchema = z.object({\n guidelinesHash: z.string().nullable(),\n agentsMdSectionHash: z.string().nullable(),\n claudeMdHash: z.string().nullable(),\n // Commit SHA from get-convex/agent-skills that was current when skills were\n // last installed. Used to detect when newer skills are available.\n agentSkillsSha: z.string().nullable(),\n // Names of skills installed by `npx skills add`, used by `remove` to\n // only remove Convex-managed skills.\n installedSkillNames: z.array(z.string()).default([]),\n});\n\nconst aiFilesProjectConfigSchema = z\n .object({\n aiFiles: z\n .object({\n // `enabled` is the canonical field. When present it takes full\n // precedence - `enabled: true` will re-enable even if the legacy\n // disableStalenessMessage field is still `true` in the file.\n enabled: z.boolean().optional(),\n // @deprecated - use `enabled` instead. Read for backward compat;\n // new writes always emit `enabled` and drop this key.\n disableStalenessMessage: z.boolean().optional(),\n })\n .default({}),\n })\n .passthrough();\n\ntype AiFilesState = z.infer<typeof aiFilesStateSchema>;\nexport type AiFilesConfig = AiFilesState & {\n enabled: boolean;\n};\n\nconst EMPTY_AI_STATE: AiFilesState = {\n guidelinesHash: null,\n agentsMdSectionHash: null,\n claudeMdHash: null,\n agentSkillsSha: null,\n installedSkillNames: [],\n};\n\nasync function readAiEnabledFromProjectConfig(\n projectDir: string,\n): Promise<boolean> {\n const raw = await readFileSafe(path.join(projectDir, \"convex.json\"));\n if (raw === null) return true;\n try {\n const parsed = aiFilesProjectConfigSchema.parse(JSON.parse(raw));\n // `enabled` takes full precedence when explicitly set.\n if (parsed.aiFiles.enabled !== undefined) return parsed.aiFiles.enabled;\n // Legacy `disableStalenessMessage` - invert it.\n return !(parsed.aiFiles.disableStalenessMessage ?? false);\n } catch (err) {\n Sentry.captureException(err);\n return true;\n }\n}\n\nexport async function writeAiEnabledToProjectConfig({\n projectDir,\n enabled,\n}: {\n projectDir: string;\n enabled: boolean;\n}): Promise<void> {\n const filePath = path.join(projectDir, \"convex.json\");\n const existing = await iife(async () => {\n try {\n return JSON.parse(await fs.readFile(filePath, \"utf8\")) as unknown;\n } catch {\n return {} as unknown;\n }\n });\n const base =\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing)\n ? (existing as Record<string, unknown>)\n : {};\n const aiFilesValue =\n base.aiFiles !== null &&\n typeof base.aiFiles === \"object\" &&\n !Array.isArray(base.aiFiles)\n ? (base.aiFiles as Record<string, unknown>)\n : {};\n const { $schema, ...rest } = base;\n // Remove legacy keys on every write.\n const { disableStalenessMessage: _legacy, ...restAiFiles } = aiFilesValue;\n const next: Record<string, unknown> = {\n $schema: $schema ?? \"node_modules/convex/schemas/convex.schema.json\",\n ...rest,\n aiFiles: { ...restAiFiles, enabled },\n };\n await fs.writeFile(filePath, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function readAiConfig({\n projectDir,\n convexDir,\n}: {\n projectDir: string;\n convexDir: string;\n}): Promise<AiFilesConfig | null> {\n const enabled = await readAiEnabledFromProjectConfig(projectDir);\n const rawState = await readFileSafe(aiFilesStatePathForConvexDir(convexDir));\n if (rawState === null) {\n // No state file means AI files are not installed, unless the user has\n // explicitly disabled in convex.json.\n return !enabled ? { ...EMPTY_AI_STATE, enabled } : null;\n }\n try {\n const state = aiFilesStateSchema.parse(JSON.parse(rawState));\n return { ...state, enabled };\n } catch (err) {\n Sentry.captureException(err);\n return null;\n }\n}\n\nexport async function hasAiFilesConfig({\n projectDir,\n convexDir,\n}: {\n projectDir: string;\n convexDir: string;\n}): Promise<boolean> {\n if (!(await readAiEnabledFromProjectConfig(projectDir))) {\n return true;\n }\n try {\n const rawState = await fs.readFile(\n aiFilesStatePathForConvexDir(convexDir),\n \"utf8\",\n );\n aiFilesStateSchema.parse(JSON.parse(rawState));\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n Sentry.captureException(err);\n }\n return false;\n }\n}\n\nexport async function writeAiConfig({\n config,\n projectDir,\n convexDir,\n options,\n}: {\n config: AiFilesConfig;\n projectDir: string;\n convexDir: string;\n options?: { persistEnabledPreference?: \"ifFalse\" | \"always\" | \"never\" };\n}): Promise<void> {\n const state = aiFilesStateSchema.parse({\n guidelinesHash: config.guidelinesHash,\n agentsMdSectionHash: config.agentsMdSectionHash,\n claudeMdHash: config.claudeMdHash,\n agentSkillsSha: config.agentSkillsSha,\n installedSkillNames: config.installedSkillNames,\n });\n await fs.writeFile(\n aiFilesStatePathForConvexDir(convexDir),\n JSON.stringify(state, null, 2) + \"\\n\",\n \"utf8\",\n );\n\n const persistMode = options?.persistEnabledPreference ?? \"ifFalse\";\n if (\n persistMode === \"always\" ||\n (persistMode === \"ifFalse\" && !config.enabled)\n )\n await writeAiEnabledToProjectConfig({\n projectDir,\n enabled: config.enabled,\n });\n}\n"],
5
- "mappings": "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",
6
- "names": ["path", "fs"]
7
- }
@@ -1,46 +0,0 @@
1
- import { z } from "zod";
2
- export declare const aiFilesStateSchema: z.ZodObject<{
3
- guidelinesHash: z.ZodNullable<z.ZodString>;
4
- agentsMdSectionHash: z.ZodNullable<z.ZodString>;
5
- claudeMdHash: z.ZodNullable<z.ZodString>;
6
- agentSkillsSha: z.ZodNullable<z.ZodString>;
7
- installedSkillNames: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
8
- }, "strip", z.ZodTypeAny, {
9
- guidelinesHash: string | null;
10
- agentsMdSectionHash: string | null;
11
- claudeMdHash: string | null;
12
- agentSkillsSha: string | null;
13
- installedSkillNames: string[];
14
- }, {
15
- guidelinesHash: string | null;
16
- agentsMdSectionHash: string | null;
17
- claudeMdHash: string | null;
18
- agentSkillsSha: string | null;
19
- installedSkillNames?: string[] | undefined;
20
- }>;
21
- type AiFilesState = z.infer<typeof aiFilesStateSchema>;
22
- export type AiFilesConfig = AiFilesState & {
23
- enabled: boolean;
24
- };
25
- export declare function writeAiEnabledToProjectConfig({ projectDir, enabled, }: {
26
- projectDir: string;
27
- enabled: boolean;
28
- }): Promise<void>;
29
- export declare function readAiConfig({ projectDir, convexDir, }: {
30
- projectDir: string;
31
- convexDir: string;
32
- }): Promise<AiFilesConfig | null>;
33
- export declare function hasAiFilesConfig({ projectDir, convexDir, }: {
34
- projectDir: string;
35
- convexDir: string;
36
- }): Promise<boolean>;
37
- export declare function writeAiConfig({ config, projectDir, convexDir, options, }: {
38
- config: AiFilesConfig;
39
- projectDir: string;
40
- convexDir: string;
41
- options?: {
42
- persistEnabledPreference?: "ifFalse" | "always" | "never";
43
- };
44
- }): Promise<void>;
45
- export {};
46
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/aiFiles/config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAU7B,CAAC;AAkBH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG;IACzC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AA2BF,wBAAsB,6BAA6B,CAAC,EAClD,UAAU,EACV,OAAO,GACR,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB;AAED,wBAAsB,YAAY,CAAC,EACjC,UAAU,EACV,SAAS,GACV,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAehC;AAED,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,SAAS,GACV,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBnB;AAED,wBAAsB,aAAa,CAAC,EAClC,MAAM,EACN,UAAU,EACV,SAAS,EACT,OAAO,GACR,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,wBAAwB,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;KAAE,CAAC;CACzE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/lib/aiFiles/config.test.ts"],"names":[],"mappings":""}
@@ -1,135 +0,0 @@
1
- "use strict";
2
- import * as Sentry from "@sentry/node";
3
- import { promises as fs } from "fs";
4
- import path from "path";
5
- import { z } from "zod";
6
- import { aiFilesStatePathForConvexDir } from "./paths.js";
7
- import { iife, readFileSafe } from "./utils.js";
8
- export const aiFilesStateSchema = z.object({
9
- guidelinesHash: z.string().nullable(),
10
- agentsMdSectionHash: z.string().nullable(),
11
- claudeMdHash: z.string().nullable(),
12
- // Commit SHA from get-convex/agent-skills that was current when skills were
13
- // last installed. Used to detect when newer skills are available.
14
- agentSkillsSha: z.string().nullable(),
15
- // Names of skills installed by `npx skills add`, used by `remove` to
16
- // only remove Convex-managed skills.
17
- installedSkillNames: z.array(z.string()).default([])
18
- });
19
- const aiFilesProjectConfigSchema = z.object({
20
- aiFiles: z.object({
21
- // `enabled` is the canonical field. When present it takes full
22
- // precedence - `enabled: true` will re-enable even if the legacy
23
- // disableStalenessMessage field is still `true` in the file.
24
- enabled: z.boolean().optional(),
25
- // @deprecated - use `enabled` instead. Read for backward compat;
26
- // new writes always emit `enabled` and drop this key.
27
- disableStalenessMessage: z.boolean().optional()
28
- }).default({})
29
- }).passthrough();
30
- const EMPTY_AI_STATE = {
31
- guidelinesHash: null,
32
- agentsMdSectionHash: null,
33
- claudeMdHash: null,
34
- agentSkillsSha: null,
35
- installedSkillNames: []
36
- };
37
- async function readAiEnabledFromProjectConfig(projectDir) {
38
- const raw = await readFileSafe(path.join(projectDir, "convex.json"));
39
- if (raw === null) return true;
40
- try {
41
- const parsed = aiFilesProjectConfigSchema.parse(JSON.parse(raw));
42
- if (parsed.aiFiles.enabled !== void 0) return parsed.aiFiles.enabled;
43
- return !(parsed.aiFiles.disableStalenessMessage ?? false);
44
- } catch (err) {
45
- Sentry.captureException(err);
46
- return true;
47
- }
48
- }
49
- export async function writeAiEnabledToProjectConfig({
50
- projectDir,
51
- enabled
52
- }) {
53
- const filePath = path.join(projectDir, "convex.json");
54
- const existing = await iife(async () => {
55
- try {
56
- return JSON.parse(await fs.readFile(filePath, "utf8"));
57
- } catch {
58
- return {};
59
- }
60
- });
61
- const base = existing !== null && typeof existing === "object" && !Array.isArray(existing) ? existing : {};
62
- const aiFilesValue = base.aiFiles !== null && typeof base.aiFiles === "object" && !Array.isArray(base.aiFiles) ? base.aiFiles : {};
63
- const { $schema, ...rest } = base;
64
- const { disableStalenessMessage: _legacy, ...restAiFiles } = aiFilesValue;
65
- const next = {
66
- $schema: $schema ?? "node_modules/convex/schemas/convex.schema.json",
67
- ...rest,
68
- aiFiles: { ...restAiFiles, enabled }
69
- };
70
- await fs.writeFile(filePath, JSON.stringify(next, null, 2) + "\n", "utf8");
71
- }
72
- export async function readAiConfig({
73
- projectDir,
74
- convexDir
75
- }) {
76
- const enabled = await readAiEnabledFromProjectConfig(projectDir);
77
- const rawState = await readFileSafe(aiFilesStatePathForConvexDir(convexDir));
78
- if (rawState === null) {
79
- return !enabled ? { ...EMPTY_AI_STATE, enabled } : null;
80
- }
81
- try {
82
- const state = aiFilesStateSchema.parse(JSON.parse(rawState));
83
- return { ...state, enabled };
84
- } catch (err) {
85
- Sentry.captureException(err);
86
- return null;
87
- }
88
- }
89
- export async function hasAiFilesConfig({
90
- projectDir,
91
- convexDir
92
- }) {
93
- if (!await readAiEnabledFromProjectConfig(projectDir)) {
94
- return true;
95
- }
96
- try {
97
- const rawState = await fs.readFile(
98
- aiFilesStatePathForConvexDir(convexDir),
99
- "utf8"
100
- );
101
- aiFilesStateSchema.parse(JSON.parse(rawState));
102
- return true;
103
- } catch (err) {
104
- if (err.code !== "ENOENT") {
105
- Sentry.captureException(err);
106
- }
107
- return false;
108
- }
109
- }
110
- export async function writeAiConfig({
111
- config,
112
- projectDir,
113
- convexDir,
114
- options
115
- }) {
116
- const state = aiFilesStateSchema.parse({
117
- guidelinesHash: config.guidelinesHash,
118
- agentsMdSectionHash: config.agentsMdSectionHash,
119
- claudeMdHash: config.claudeMdHash,
120
- agentSkillsSha: config.agentSkillsSha,
121
- installedSkillNames: config.installedSkillNames
122
- });
123
- await fs.writeFile(
124
- aiFilesStatePathForConvexDir(convexDir),
125
- JSON.stringify(state, null, 2) + "\n",
126
- "utf8"
127
- );
128
- const persistMode = options?.persistEnabledPreference ?? "ifFalse";
129
- if (persistMode === "always" || persistMode === "ifFalse" && !config.enabled)
130
- await writeAiEnabledToProjectConfig({
131
- projectDir,
132
- enabled: config.enabled
133
- });
134
- }
135
- //# sourceMappingURL=config.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/cli/lib/aiFiles/config.ts"],
4
- "sourcesContent": ["import * as Sentry from \"@sentry/node\";\n// Use raw fs (not ctx.fs) so these operations run asynchronously and don't\n// interfere with the file-watcher used by `convex dev`.\n// eslint-disable-next-line no-restricted-imports\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { z } from \"zod\";\nimport { aiFilesStatePathForConvexDir } from \"./paths.js\";\nimport { iife, readFileSafe } from \"./utils.js\";\n\nexport const aiFilesStateSchema = z.object({\n guidelinesHash: z.string().nullable(),\n agentsMdSectionHash: z.string().nullable(),\n claudeMdHash: z.string().nullable(),\n // Commit SHA from get-convex/agent-skills that was current when skills were\n // last installed. Used to detect when newer skills are available.\n agentSkillsSha: z.string().nullable(),\n // Names of skills installed by `npx skills add`, used by `remove` to\n // only remove Convex-managed skills.\n installedSkillNames: z.array(z.string()).default([]),\n});\n\nconst aiFilesProjectConfigSchema = z\n .object({\n aiFiles: z\n .object({\n // `enabled` is the canonical field. When present it takes full\n // precedence - `enabled: true` will re-enable even if the legacy\n // disableStalenessMessage field is still `true` in the file.\n enabled: z.boolean().optional(),\n // @deprecated - use `enabled` instead. Read for backward compat;\n // new writes always emit `enabled` and drop this key.\n disableStalenessMessage: z.boolean().optional(),\n })\n .default({}),\n })\n .passthrough();\n\ntype AiFilesState = z.infer<typeof aiFilesStateSchema>;\nexport type AiFilesConfig = AiFilesState & {\n enabled: boolean;\n};\n\nconst EMPTY_AI_STATE: AiFilesState = {\n guidelinesHash: null,\n agentsMdSectionHash: null,\n claudeMdHash: null,\n agentSkillsSha: null,\n installedSkillNames: [],\n};\n\nasync function readAiEnabledFromProjectConfig(\n projectDir: string,\n): Promise<boolean> {\n const raw = await readFileSafe(path.join(projectDir, \"convex.json\"));\n if (raw === null) return true;\n try {\n const parsed = aiFilesProjectConfigSchema.parse(JSON.parse(raw));\n // `enabled` takes full precedence when explicitly set.\n if (parsed.aiFiles.enabled !== undefined) return parsed.aiFiles.enabled;\n // Legacy `disableStalenessMessage` - invert it.\n return !(parsed.aiFiles.disableStalenessMessage ?? false);\n } catch (err) {\n Sentry.captureException(err);\n return true;\n }\n}\n\nexport async function writeAiEnabledToProjectConfig({\n projectDir,\n enabled,\n}: {\n projectDir: string;\n enabled: boolean;\n}): Promise<void> {\n const filePath = path.join(projectDir, \"convex.json\");\n const existing = await iife(async () => {\n try {\n return JSON.parse(await fs.readFile(filePath, \"utf8\")) as unknown;\n } catch {\n return {} as unknown;\n }\n });\n const base =\n existing !== null &&\n typeof existing === \"object\" &&\n !Array.isArray(existing)\n ? (existing as Record<string, unknown>)\n : {};\n const aiFilesValue =\n base.aiFiles !== null &&\n typeof base.aiFiles === \"object\" &&\n !Array.isArray(base.aiFiles)\n ? (base.aiFiles as Record<string, unknown>)\n : {};\n const { $schema, ...rest } = base;\n // Remove legacy keys on every write.\n const { disableStalenessMessage: _legacy, ...restAiFiles } = aiFilesValue;\n const next: Record<string, unknown> = {\n $schema: $schema ?? \"node_modules/convex/schemas/convex.schema.json\",\n ...rest,\n aiFiles: { ...restAiFiles, enabled },\n };\n await fs.writeFile(filePath, JSON.stringify(next, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function readAiConfig({\n projectDir,\n convexDir,\n}: {\n projectDir: string;\n convexDir: string;\n}): Promise<AiFilesConfig | null> {\n const enabled = await readAiEnabledFromProjectConfig(projectDir);\n const rawState = await readFileSafe(aiFilesStatePathForConvexDir(convexDir));\n if (rawState === null) {\n // No state file means AI files are not installed, unless the user has\n // explicitly disabled in convex.json.\n return !enabled ? { ...EMPTY_AI_STATE, enabled } : null;\n }\n try {\n const state = aiFilesStateSchema.parse(JSON.parse(rawState));\n return { ...state, enabled };\n } catch (err) {\n Sentry.captureException(err);\n return null;\n }\n}\n\nexport async function hasAiFilesConfig({\n projectDir,\n convexDir,\n}: {\n projectDir: string;\n convexDir: string;\n}): Promise<boolean> {\n if (!(await readAiEnabledFromProjectConfig(projectDir))) {\n return true;\n }\n try {\n const rawState = await fs.readFile(\n aiFilesStatePathForConvexDir(convexDir),\n \"utf8\",\n );\n aiFilesStateSchema.parse(JSON.parse(rawState));\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n Sentry.captureException(err);\n }\n return false;\n }\n}\n\nexport async function writeAiConfig({\n config,\n projectDir,\n convexDir,\n options,\n}: {\n config: AiFilesConfig;\n projectDir: string;\n convexDir: string;\n options?: { persistEnabledPreference?: \"ifFalse\" | \"always\" | \"never\" };\n}): Promise<void> {\n const state = aiFilesStateSchema.parse({\n guidelinesHash: config.guidelinesHash,\n agentsMdSectionHash: config.agentsMdSectionHash,\n claudeMdHash: config.claudeMdHash,\n agentSkillsSha: config.agentSkillsSha,\n installedSkillNames: config.installedSkillNames,\n });\n await fs.writeFile(\n aiFilesStatePathForConvexDir(convexDir),\n JSON.stringify(state, null, 2) + \"\\n\",\n \"utf8\",\n );\n\n const persistMode = options?.persistEnabledPreference ?? \"ifFalse\";\n if (\n persistMode === \"always\" ||\n (persistMode === \"ifFalse\" && !config.enabled)\n )\n await writeAiEnabledToProjectConfig({\n projectDir,\n enabled: config.enabled,\n });\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }