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.
- package/CHANGELOG.md +86 -43
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/cli/aiFiles.js +31 -13
- package/dist/cjs/cli/aiFiles.js.map +3 -3
- package/dist/cjs/cli/configure.js +21 -24
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deploy.js +8 -9
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/deploymentCreate.js +225 -40
- package/dist/cjs/cli/deploymentCreate.js.map +3 -3
- package/dist/cjs/cli/deploymentSelect.js +14 -13
- package/dist/cjs/cli/deploymentSelect.js.map +2 -2
- package/dist/cjs/cli/dev.js +30 -11
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/docs.js +1 -1
- package/dist/cjs/cli/docs.js.map +2 -2
- package/dist/cjs/cli/init.js +1 -1
- package/dist/cjs/cli/init.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
- package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
- package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
- package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
- package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
- package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
- package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
- package/dist/cjs/cli/lib/api.js +70 -7
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/command.js +4 -5
- package/dist/cjs/cli/lib/command.js.map +2 -2
- package/dist/cjs/cli/lib/config.js +41 -4
- package/dist/cjs/cli/lib/config.js.map +3 -3
- package/dist/cjs/cli/lib/deploy2.js +9 -26
- package/dist/cjs/cli/lib/deploy2.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
- package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +162 -117
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/env.js +1 -13
- package/dist/cjs/cli/lib/env.js.map +2 -2
- package/dist/cjs/cli/lib/envvars.js +8 -1
- package/dist/cjs/cli/lib/envvars.js.map +2 -2
- package/dist/cjs/cli/lib/expiration.js +104 -0
- package/dist/cjs/cli/lib/expiration.js.map +7 -0
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/init.js +4 -3
- package/dist/cjs/cli/lib/init.js.map +2 -2
- package/dist/cjs/cli/lib/insights.js +1 -1
- package/dist/cjs/cli/lib/insights.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
- package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
- package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
- package/dist/cjs/cli/lib/updates.js +8 -9
- package/dist/cjs/cli/lib/updates.js.map +2 -2
- package/dist/cjs/cli/lib/usage.js +2 -1
- package/dist/cjs/cli/lib/usage.js.map +2 -2
- package/dist/cjs/cli/lib/utils/prompts.js +2 -1
- package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +46 -20
- package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- package/dist/cjs/server/components/definition.js.map +1 -1
- package/dist/cjs/server/components/index.js +40 -4
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/data_model.js.map +1 -1
- package/dist/cjs/server/impl/meta_impl.js +78 -0
- package/dist/cjs/server/impl/meta_impl.js.map +7 -0
- package/dist/cjs/server/impl/registration_impl.js +16 -11
- package/dist/cjs/server/impl/registration_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/meta.js +17 -0
- package/dist/cjs/server/meta.js.map +7 -0
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.test.d.ts +2 -0
- package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
- package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
- package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts +3 -1
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/api.d.ts +3 -3
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/command.d.ts +2 -1
- package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/config.d.ts +17 -6
- package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
- package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +12 -12
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +25 -16
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
- package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.d.ts +0 -4
- package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
- package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
- package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
- package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
- package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
- package/dist/cjs-types/server/components/definition.d.ts +1 -0
- package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +5 -1
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/data_model.d.ts +2 -1
- package/dist/cjs-types/server/data_model.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
- package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
- package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -0
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +72 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -0
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +1665 -1215
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/cli/aiFiles.js +33 -15
- package/dist/esm/cli/aiFiles.js.map +2 -2
- package/dist/esm/cli/configure.js +23 -26
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deploy.js +12 -11
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/deploymentCreate.js +238 -42
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/deploymentSelect.js +13 -12
- package/dist/esm/cli/deploymentSelect.js.map +2 -2
- package/dist/esm/cli/dev.js +34 -13
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/docs.js +1 -1
- package/dist/esm/cli/docs.js.map +2 -2
- package/dist/esm/cli/init.js +2 -2
- package/dist/esm/cli/init.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
- package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
- package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/index.js +72 -89
- package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
- package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/state.js +60 -0
- package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/status.js +32 -29
- package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
- package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
- package/dist/esm/cli/lib/api.js +70 -7
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/command.js +4 -5
- package/dist/esm/cli/lib/command.js.map +2 -2
- package/dist/esm/cli/lib/config.js +39 -3
- package/dist/esm/cli/lib/config.js.map +2 -2
- package/dist/esm/cli/lib/deploy2.js +13 -26
- package/dist/esm/cli/lib/deploy2.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
- package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelection.js +46 -2
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelector.js +1 -0
- package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +162 -118
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/env.js +0 -11
- package/dist/esm/cli/lib/env.js.map +2 -2
- package/dist/esm/cli/lib/envvars.js +8 -1
- package/dist/esm/cli/lib/envvars.js.map +2 -2
- package/dist/esm/cli/lib/expiration.js +80 -0
- package/dist/esm/cli/lib/expiration.js.map +7 -0
- package/dist/esm/cli/lib/init.js +4 -3
- package/dist/esm/cli/lib/init.js.map +2 -2
- package/dist/esm/cli/lib/insights.js +1 -1
- package/dist/esm/cli/lib/insights.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
- package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/run.js +1 -1
- package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
- package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
- package/dist/esm/cli/lib/updates.js +11 -9
- package/dist/esm/cli/lib/updates.js.map +2 -2
- package/dist/esm/cli/lib/usage.js +2 -1
- package/dist/esm/cli/lib/usage.js.map +2 -2
- package/dist/esm/cli/lib/utils/prompts.js +2 -1
- package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +45 -20
- package/dist/esm/cli/lib/utils/utils.js.map +3 -3
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- package/dist/esm/server/components/index.js +40 -4
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/impl/meta_impl.js +54 -0
- package/dist/esm/server/impl/meta_impl.js.map +7 -0
- package/dist/esm/server/impl/registration_impl.js +20 -11
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/meta.js +2 -0
- package/dist/esm/server/meta.js.map +7 -0
- package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.test.d.ts +2 -0
- package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
- package/dist/esm-types/cli/deploy.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
- package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
- package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts +3 -1
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
- package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/api.d.ts +3 -3
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/command.d.ts +2 -1
- package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/config.d.ts +17 -6
- package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
- package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/modules.d.ts +12 -12
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +25 -16
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
- package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.d.ts +0 -4
- package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
- package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
- package/dist/esm-types/cli/lib/updates.d.ts +4 -3
- package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
- package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
- package/dist/esm-types/server/components/definition.d.ts +1 -0
- package/dist/esm-types/server/components/definition.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +5 -1
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/data_model.d.ts +2 -1
- package/dist/esm-types/server/data_model.d.ts.map +1 -1
- package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
- package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
- package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -0
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +72 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -0
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +11 -7
- package/schemas/convex.schema.json +15 -2
- package/src/cli/aiFiles.ts +44 -14
- package/src/cli/configure.test.ts +138 -0
- package/src/cli/configure.ts +48 -47
- package/src/cli/deploy.ts +13 -10
- package/src/cli/deploymentCreate.test.ts +349 -14
- package/src/cli/deploymentCreate.ts +268 -41
- package/src/cli/deploymentSelect.test.ts +136 -27
- package/src/cli/deploymentSelect.ts +50 -41
- package/src/cli/deploymentSelection.test.ts +343 -35
- package/src/cli/dev.ts +49 -14
- package/src/cli/docs.ts +1 -1
- package/src/cli/init.ts +2 -2
- package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
- package/src/cli/lib/aiFiles/claudemd.ts +15 -11
- package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
- package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
- package/src/cli/lib/aiFiles/index.test.ts +188 -222
- package/src/cli/lib/aiFiles/index.ts +119 -125
- package/src/cli/lib/aiFiles/integration.test.ts +112 -45
- package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
- package/src/cli/lib/aiFiles/skills.ts +46 -16
- package/src/cli/lib/aiFiles/state.test.ts +280 -0
- package/src/cli/lib/aiFiles/state.ts +82 -0
- package/src/cli/lib/aiFiles/status.ts +45 -39
- package/src/cli/lib/aiFiles/utils.test.ts +50 -0
- package/src/cli/lib/aiFiles/utils.ts +38 -10
- package/src/cli/lib/api.ts +88 -7
- package/src/cli/lib/command.ts +12 -7
- package/src/cli/lib/config.test.ts +184 -7
- package/src/cli/lib/config.ts +67 -7
- package/src/cli/lib/deploy2.ts +14 -27
- package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
- package/src/cli/lib/deploymentSelection.ts +59 -6
- package/src/cli/lib/deploymentSelector.test.ts +6 -0
- package/src/cli/lib/deploymentSelector.ts +2 -0
- package/src/cli/lib/dev.ts +202 -153
- package/src/cli/lib/env.ts +0 -15
- package/src/cli/lib/envvars.ts +16 -1
- package/src/cli/lib/expiration.test.ts +159 -0
- package/src/cli/lib/expiration.ts +124 -0
- package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
- package/src/cli/lib/init.ts +6 -2
- package/src/cli/lib/insights.ts +1 -1
- package/src/cli/lib/localDeployment/anonymous.ts +19 -9
- package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
- package/src/cli/lib/localDeployment/run.ts +1 -1
- package/src/cli/lib/localDeployment/upgrade.ts +12 -10
- package/src/cli/lib/localDeployment/utils.ts +12 -0
- package/src/cli/lib/mcp/tools/status.ts +1 -1
- package/src/cli/lib/updates.test.ts +102 -75
- package/src/cli/lib/updates.ts +14 -12
- package/src/cli/lib/usage.ts +3 -1
- package/src/cli/lib/utils/prompts.ts +2 -0
- package/src/cli/lib/utils/utils.test.ts +6 -6
- package/src/cli/lib/utils/utils.ts +66 -27
- package/src/index.ts +1 -1
- package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
- package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
- package/src/server/components/definition.ts +3 -0
- package/src/server/components/index.ts +62 -5
- package/src/server/data_model.ts +2 -1
- package/src/server/impl/meta_impl.ts +74 -0
- package/src/server/impl/registration_impl.ts +21 -9
- package/src/server/index.ts +8 -0
- package/src/server/meta.ts +76 -0
- package/src/server/registration.ts +10 -0
- package/src/server/schema.test.ts +78 -1
- package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
- package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
- package/dist/esm/cli/lib/aiFiles/config.js +0 -135
- package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
- package/src/cli/lib/aiFiles/config.test.ts +0 -460
- package/src/cli/lib/aiFiles/config.ts +0 -188
- package/src/values/.claude/settings.local.json +0 -10
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
type ParsedExpirationSuccess =
|
|
2
|
+
| { kind: "none" }
|
|
3
|
+
| { kind: "absolute"; timestampMs: number }
|
|
4
|
+
| { kind: "relative"; amount: number; unit: "minute" | "hour" | "day" };
|
|
5
|
+
|
|
6
|
+
type ParsedExpiration =
|
|
7
|
+
| ParsedExpirationSuccess
|
|
8
|
+
| { kind: "error"; message: string };
|
|
9
|
+
|
|
10
|
+
const PARSE_ERROR_MESSAGE =
|
|
11
|
+
`Supported formats:\n` +
|
|
12
|
+
` "none" — no expiration\n` +
|
|
13
|
+
` "in 7 days" — relative (minutes, hours, days)\n` +
|
|
14
|
+
` "2026-04-01T00:00:00Z" — UTC datetime\n` +
|
|
15
|
+
` "1711828382" — Unix timestamp (seconds)\n` +
|
|
16
|
+
` "1711828382000" — Unix timestamp (milliseconds)`;
|
|
17
|
+
|
|
18
|
+
const UNIT_MS = {
|
|
19
|
+
minute: 60 * 1000,
|
|
20
|
+
hour: 60 * 60 * 1000,
|
|
21
|
+
day: 24 * 60 * 60 * 1000,
|
|
22
|
+
} as const;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Parse an expiration input string into a structured representation.
|
|
26
|
+
* Does not depend on the current time.
|
|
27
|
+
*/
|
|
28
|
+
export function parseExpiration(input: string): ParsedExpiration {
|
|
29
|
+
const trimmed = input.trim();
|
|
30
|
+
|
|
31
|
+
if (trimmed.toLowerCase() === "none") {
|
|
32
|
+
return { kind: "none" };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// All digits → Unix timestamp
|
|
36
|
+
if (/^\d+$/.test(trimmed)) {
|
|
37
|
+
const n = Number(trimmed);
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
kind: "absolute",
|
|
41
|
+
timestampMs:
|
|
42
|
+
n < 1e12 // 1e12 milliseconds is a date in 2001 → unambiguous
|
|
43
|
+
? n * 1000 // seconds → convert to ms
|
|
44
|
+
: n, // already milliseconds
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// UTC datetime: "2026-04-01T00:00:00Z"
|
|
49
|
+
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(trimmed)) {
|
|
50
|
+
const date = new Date(trimmed);
|
|
51
|
+
if (isNaN(date.getTime())) {
|
|
52
|
+
return {
|
|
53
|
+
kind: "error",
|
|
54
|
+
message: `Invalid UTC datetime: "${trimmed}". ${PARSE_ERROR_MESSAGE}`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return { kind: "absolute", timestampMs: date.getTime() };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Relative: "in 3 hours", "in 1 day", "in 45 minutes"
|
|
61
|
+
const relativeMatch = trimmed.match(/^in\s+(\d+)\s+(minute|hour|day)s?$/i);
|
|
62
|
+
if (relativeMatch) {
|
|
63
|
+
const amount = Number(relativeMatch[1]);
|
|
64
|
+
const unit = relativeMatch[2].toLowerCase() as "minute" | "hour" | "day";
|
|
65
|
+
return { kind: "relative", amount, unit };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
kind: "error",
|
|
70
|
+
message: `Invalid expiration format: "${trimmed}". ${PARSE_ERROR_MESSAGE}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a parsed expiration into a timestamp in milliseconds, or null for "none".
|
|
76
|
+
*/
|
|
77
|
+
export function resolveExpiration(
|
|
78
|
+
parsed: ParsedExpirationSuccess,
|
|
79
|
+
now?: number,
|
|
80
|
+
): number | null {
|
|
81
|
+
switch (parsed.kind) {
|
|
82
|
+
case "none":
|
|
83
|
+
return null;
|
|
84
|
+
case "absolute":
|
|
85
|
+
return parsed.timestampMs;
|
|
86
|
+
case "relative": {
|
|
87
|
+
const base = now ?? Date.now();
|
|
88
|
+
return base + parsed.amount * UNIT_MS[parsed.unit];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
type ValidationResult =
|
|
94
|
+
| { kind: "success" }
|
|
95
|
+
| { kind: "error"; message: string };
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Validate that a resolved expiration timestamp is acceptable.
|
|
99
|
+
*/
|
|
100
|
+
export function validateExpiration(
|
|
101
|
+
timestampMs: number,
|
|
102
|
+
now?: number,
|
|
103
|
+
): ValidationResult {
|
|
104
|
+
const base = now ?? Date.now();
|
|
105
|
+
const thirtyMinutes = 30 * 60 * 1000;
|
|
106
|
+
const oneYear = 365 * 24 * 60 * 60 * 1000;
|
|
107
|
+
|
|
108
|
+
if (timestampMs <= base) {
|
|
109
|
+
return { kind: "error", message: "Expiration must be in the future." };
|
|
110
|
+
}
|
|
111
|
+
if (timestampMs - base < thirtyMinutes) {
|
|
112
|
+
return {
|
|
113
|
+
kind: "error",
|
|
114
|
+
message: "Expiration must be at least 30 minutes from now.",
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (timestampMs - base > oneYear) {
|
|
118
|
+
return {
|
|
119
|
+
kind: "error",
|
|
120
|
+
message: "Expiration must be at most 1 year from now.",
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { kind: "success" };
|
|
124
|
+
}
|
|
@@ -33,6 +33,8 @@ export interface components {
|
|
|
33
33
|
timestamp: number;
|
|
34
34
|
udfType: components["schemas"]["UdfTypeJson"];
|
|
35
35
|
usageStats: components["schemas"]["UsageStatsJson"];
|
|
36
|
+
/** Format: double */
|
|
37
|
+
userExecutionTime?: number | null;
|
|
36
38
|
} | {
|
|
37
39
|
componentPath?: string | null;
|
|
38
40
|
executionId: string;
|
|
@@ -58,9 +60,10 @@ export interface components {
|
|
|
58
60
|
udfPath?: string | null;
|
|
59
61
|
};
|
|
60
62
|
OccInfoJson: {
|
|
63
|
+
componentPath?: string | null;
|
|
61
64
|
documentId?: string | null;
|
|
62
65
|
/** Format: int64 */
|
|
63
|
-
retryCount
|
|
66
|
+
retryCount?: number | null;
|
|
64
67
|
tableName?: string | null;
|
|
65
68
|
writeSource?: string | null;
|
|
66
69
|
};
|
|
@@ -86,6 +89,10 @@ export interface components {
|
|
|
86
89
|
/** @enum {string} */
|
|
87
90
|
UdfTypeJson: "Query" | "Mutation" | "Action" | "HttpAction";
|
|
88
91
|
UsageStatsJson: {
|
|
92
|
+
/** Format: int64 */
|
|
93
|
+
databaseIoReadBytes: number;
|
|
94
|
+
/** Format: int64 */
|
|
95
|
+
databaseIoWriteBytes: number;
|
|
89
96
|
/** Format: int64 */
|
|
90
97
|
databaseReadBytes: number;
|
|
91
98
|
/** Format: int64 */
|
|
@@ -99,9 +106,17 @@ export interface components {
|
|
|
99
106
|
/** Format: int64 */
|
|
100
107
|
storageWriteBytes: number;
|
|
101
108
|
/** Format: int64 */
|
|
109
|
+
textIndexQueryBytes: number;
|
|
110
|
+
/** Format: int64 */
|
|
111
|
+
textIndexWriteQueryBytes: number;
|
|
112
|
+
/** Format: int64 */
|
|
102
113
|
vectorIndexReadBytes: number;
|
|
103
114
|
/** Format: int64 */
|
|
115
|
+
vectorIndexReadQueryBytes: number;
|
|
116
|
+
/** Format: int64 */
|
|
104
117
|
vectorIndexWriteBytes: number;
|
|
118
|
+
/** Format: int64 */
|
|
119
|
+
vectorIndexWriteQueryBytes: number;
|
|
105
120
|
};
|
|
106
121
|
Value: unknown;
|
|
107
122
|
};
|
package/src/cli/lib/init.ts
CHANGED
|
@@ -26,6 +26,9 @@ export async function finalizeConfiguration(
|
|
|
26
26
|
(envFileConfig.convexUrlEnvVar || envFileConfig.siteUrlEnvVar);
|
|
27
27
|
|
|
28
28
|
if (isEnvFileConfigChanged) {
|
|
29
|
+
const deploymentEnvVarMessage = options.changedDeploymentEnvVar
|
|
30
|
+
? ` name as CONVEX_DEPLOYMENT\n`
|
|
31
|
+
: "";
|
|
29
32
|
const urlUpdateMessages = [];
|
|
30
33
|
if (envFileConfig.convexUrlEnvVar) {
|
|
31
34
|
urlUpdateMessages.push(
|
|
@@ -39,7 +42,7 @@ export async function finalizeConfiguration(
|
|
|
39
42
|
}
|
|
40
43
|
logFinishedStep(
|
|
41
44
|
`${messageForDeploymentType(options.deploymentType, options.url)} and saved its:\n` +
|
|
42
|
-
|
|
45
|
+
deploymentEnvVarMessage +
|
|
43
46
|
urlUpdateMessages.join("") +
|
|
44
47
|
` to ${envFileConfig.envFile}`,
|
|
45
48
|
);
|
|
@@ -53,7 +56,8 @@ export async function finalizeConfiguration(
|
|
|
53
56
|
}
|
|
54
57
|
if (
|
|
55
58
|
options.deploymentType === "anonymous" &&
|
|
56
|
-
process.env.CONVEX_AGENT_MODE !== "anonymous"
|
|
59
|
+
process.env.CONVEX_AGENT_MODE !== "anonymous" &&
|
|
60
|
+
ctx.bigBrainAuth() === null
|
|
57
61
|
) {
|
|
58
62
|
logMessage(
|
|
59
63
|
`Run \`npx convex login\` at any time to create an account and link this deployment.`,
|
package/src/cli/lib/insights.ts
CHANGED
|
@@ -163,7 +163,7 @@ export async function fetchRawInsightsData(
|
|
|
163
163
|
from: fromDate,
|
|
164
164
|
to: toDate,
|
|
165
165
|
});
|
|
166
|
-
const bbFetch =
|
|
166
|
+
const bbFetch = bigBrainFetch(ctx);
|
|
167
167
|
const res = await bbFetch(
|
|
168
168
|
new URL(
|
|
169
169
|
`dashboard/teams/${teamId}/usage/query?${queryParams.toString()}`,
|
|
@@ -35,7 +35,7 @@ import { handlePotentialUpgrade } from "./upgrade.js";
|
|
|
35
35
|
import {
|
|
36
36
|
isOffline,
|
|
37
37
|
generateInstanceSecret,
|
|
38
|
-
|
|
38
|
+
chooseLocalBackendPorts,
|
|
39
39
|
LOCAL_BACKEND_INSTANCE_SECRET,
|
|
40
40
|
} from "./utils.js";
|
|
41
41
|
import { handleDashboard } from "./dashboard.js";
|
|
@@ -48,7 +48,7 @@ import { nodeFs } from "../../../bundler/fs.js";
|
|
|
48
48
|
import { doInitConvexFolder } from "../codegen.js";
|
|
49
49
|
import { readProjectConfig } from "../config.js";
|
|
50
50
|
import { functionsDir } from "../utils/utils.js";
|
|
51
|
-
import {
|
|
51
|
+
import { attemptSetupAiFiles } from "../aiFiles/index.js";
|
|
52
52
|
|
|
53
53
|
export async function handleAnonymousDeployment(
|
|
54
54
|
ctx: Context,
|
|
@@ -80,7 +80,8 @@ export async function handleAnonymousDeployment(
|
|
|
80
80
|
});
|
|
81
81
|
if (
|
|
82
82
|
deployment.kind === "first" &&
|
|
83
|
-
process.env.CONVEX_AGENT_MODE !== "anonymous"
|
|
83
|
+
process.env.CONVEX_AGENT_MODE !== "anonymous" &&
|
|
84
|
+
process.stdin.isTTY
|
|
84
85
|
) {
|
|
85
86
|
logMessage(
|
|
86
87
|
"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.",
|
|
@@ -146,11 +147,10 @@ export async function handleAnonymousDeployment(
|
|
|
146
147
|
adminKey = data.adminKey;
|
|
147
148
|
}
|
|
148
149
|
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
});
|
|
150
|
+
const { cloudPort, sitePort } = await chooseLocalBackendPorts(
|
|
151
|
+
ctx,
|
|
152
|
+
options.ports,
|
|
153
|
+
);
|
|
154
154
|
const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {
|
|
155
155
|
await ensureBackendRunning(ctx, {
|
|
156
156
|
cloudPort,
|
|
@@ -187,7 +187,12 @@ export async function handleAnonymousDeployment(
|
|
|
187
187
|
const { configPath, projectConfig } = await readProjectConfig(ctx);
|
|
188
188
|
const convexDir = path.resolve(functionsDir(configPath, projectConfig));
|
|
189
189
|
const projectDir = path.resolve(path.dirname(configPath));
|
|
190
|
-
await
|
|
190
|
+
await attemptSetupAiFiles({
|
|
191
|
+
ctx,
|
|
192
|
+
aiFilesConfig: projectConfig.aiFiles,
|
|
193
|
+
convexDir,
|
|
194
|
+
projectDir,
|
|
195
|
+
});
|
|
191
196
|
}
|
|
192
197
|
return {
|
|
193
198
|
adminKey,
|
|
@@ -354,6 +359,11 @@ async function chooseDeployment(
|
|
|
354
359
|
return { deploymentName: generateDeploymentName(), kind: "new" };
|
|
355
360
|
}
|
|
356
361
|
|
|
362
|
+
// Non-interactive terminal - auto-create a new deployment
|
|
363
|
+
if (!process.stdin.isTTY) {
|
|
364
|
+
return { deploymentName: generateDeploymentName(), kind: "new" };
|
|
365
|
+
}
|
|
366
|
+
|
|
357
367
|
// Legacy deployments exist - prompt user to choose
|
|
358
368
|
const newOrExisting = await promptSearch(ctx, {
|
|
359
369
|
message: "Which project would you like to use?",
|
|
@@ -25,7 +25,7 @@ import { OnDeploymentActivityFunc } from "../deployment.js";
|
|
|
25
25
|
import { promptSearch } from "../utils/prompts.js";
|
|
26
26
|
import { LocalDeploymentError, printLocalDeploymentOnError } from "./errors.js";
|
|
27
27
|
import {
|
|
28
|
-
|
|
28
|
+
chooseLocalBackendPorts,
|
|
29
29
|
printLocalDeploymentWelcomeMessage,
|
|
30
30
|
isOffline,
|
|
31
31
|
LOCAL_BACKEND_INSTANCE_SECRET,
|
|
@@ -93,11 +93,10 @@ export async function handleLocalDeployment(
|
|
|
93
93
|
}
|
|
94
94
|
: { kind: "version", version: options.backendVersion },
|
|
95
95
|
);
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
});
|
|
96
|
+
const { cloudPort, sitePort } = await chooseLocalBackendPorts(
|
|
97
|
+
ctx,
|
|
98
|
+
options.ports,
|
|
99
|
+
);
|
|
101
100
|
const { deploymentName, adminKey } = await bigBrainStart(ctx, {
|
|
102
101
|
port: cloudPort,
|
|
103
102
|
projectSlug: options.projectSlug,
|
|
@@ -207,11 +206,10 @@ async function handleOffline(
|
|
|
207
206
|
kind: "version",
|
|
208
207
|
version: config.backendVersion,
|
|
209
208
|
});
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
});
|
|
209
|
+
const { cloudPort, sitePort } = await chooseLocalBackendPorts(
|
|
210
|
+
ctx,
|
|
211
|
+
options.ports,
|
|
212
|
+
);
|
|
215
213
|
saveDeploymentConfig(ctx, "local", deploymentName, config);
|
|
216
214
|
await runLocalBackend(ctx, {
|
|
217
215
|
binaryPath,
|
|
@@ -295,7 +295,7 @@ type LocalBackendStatus =
|
|
|
295
295
|
| { kind: "different"; name: string }
|
|
296
296
|
| { kind: "not-running" };
|
|
297
297
|
|
|
298
|
-
async function fetchLocalBackendStatus(args: {
|
|
298
|
+
export async function fetchLocalBackendStatus(args: {
|
|
299
299
|
url: string;
|
|
300
300
|
deploymentName: string;
|
|
301
301
|
}): Promise<LocalBackendStatus> {
|
|
@@ -76,6 +76,7 @@ export async function handlePotentialUpgrade(
|
|
|
76
76
|
);
|
|
77
77
|
const confirmed =
|
|
78
78
|
args.forceUpgrade ||
|
|
79
|
+
!process.stdin.isTTY ||
|
|
79
80
|
(await promptYesNo(ctx, {
|
|
80
81
|
message: `This deployment is using an older version of the Convex backend. Upgrade now?`,
|
|
81
82
|
default: true,
|
|
@@ -102,16 +103,17 @@ export async function handlePotentialUpgrade(
|
|
|
102
103
|
isLatestVersion: false,
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
|
-
const choice =
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
106
|
+
const choice =
|
|
107
|
+
args.forceUpgrade || !process.stdin.isTTY
|
|
108
|
+
? "transfer"
|
|
109
|
+
: await promptOptions(ctx, {
|
|
110
|
+
message: "Transfer data from existing deployment?",
|
|
111
|
+
default: "transfer",
|
|
112
|
+
choices: [
|
|
113
|
+
{ name: "transfer data", value: "transfer" },
|
|
114
|
+
{ name: "start fresh", value: "reset" },
|
|
115
|
+
],
|
|
116
|
+
});
|
|
115
117
|
const deploymentStatePath = deploymentStateDir(
|
|
116
118
|
ctx,
|
|
117
119
|
args.deploymentKind,
|
|
@@ -39,6 +39,18 @@ export async function choosePorts(
|
|
|
39
39
|
return ports;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
export async function chooseLocalBackendPorts(
|
|
43
|
+
ctx: Context,
|
|
44
|
+
ports?: { cloud?: number | null; site?: number | null },
|
|
45
|
+
): Promise<{ cloudPort: number; sitePort: number }> {
|
|
46
|
+
const [cloudPort, sitePort] = await choosePorts(ctx, {
|
|
47
|
+
count: 2,
|
|
48
|
+
startPort: 3210,
|
|
49
|
+
requestedPorts: [ports?.cloud ?? null, ports?.site ?? null],
|
|
50
|
+
});
|
|
51
|
+
return { cloudPort, sitePort };
|
|
52
|
+
}
|
|
53
|
+
|
|
42
54
|
export async function isOffline(): Promise<boolean> {
|
|
43
55
|
// TODO(ENG-7080) -- implement this for real
|
|
44
56
|
return false;
|
|
@@ -97,7 +97,7 @@ export const StatusTool: ConvexTool<typeof inputSchema, typeof outputSchema> = {
|
|
|
97
97
|
];
|
|
98
98
|
// Also get the prod cloud deployment if we're using a cloud-hosted dev-deployment
|
|
99
99
|
if (
|
|
100
|
-
selectionWithinProject.kind === "
|
|
100
|
+
selectionWithinProject.kind === "unspecified" &&
|
|
101
101
|
!(
|
|
102
102
|
deploymentSelection.kind === "existingDeployment" &&
|
|
103
103
|
deploymentSelection.deploymentToActOn.deploymentFields === null
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import { checkVersionAndAiFilesStaleness } from "./updates.js";
|
|
3
3
|
import { getVersion } from "./versionApi.js";
|
|
4
4
|
import { logMessage } from "../../bundler/log.js";
|
|
5
|
-
import {
|
|
5
|
+
import { checkAiFilesStalenessAndLog } from "./aiFiles/index.js";
|
|
6
6
|
import { readProjectConfig } from "./config.js";
|
|
7
7
|
import type { Context } from "../../bundler/context.js";
|
|
8
8
|
|
|
@@ -11,7 +11,12 @@ vi.mock("./versionApi.js", () => ({
|
|
|
11
11
|
}));
|
|
12
12
|
|
|
13
13
|
vi.mock("./aiFiles/index.js", () => ({
|
|
14
|
-
|
|
14
|
+
checkAiFilesStalenessAndLog: vi.fn(),
|
|
15
|
+
isAiFilesDisabled: vi.fn((aiFilesConfig) =>
|
|
16
|
+
aiFilesConfig?.enabled !== undefined
|
|
17
|
+
? aiFilesConfig.enabled === false
|
|
18
|
+
: aiFilesConfig?.disableStalenessMessage === true,
|
|
19
|
+
),
|
|
15
20
|
}));
|
|
16
21
|
|
|
17
22
|
vi.mock("../../bundler/log.js", () => ({
|
|
@@ -24,15 +29,26 @@ vi.mock("./config.js", () => ({
|
|
|
24
29
|
|
|
25
30
|
const mockGetVersion = vi.mocked(getVersion);
|
|
26
31
|
const mockLogMessage = vi.mocked(logMessage);
|
|
27
|
-
const
|
|
32
|
+
const mockCheckAiFilesStalenessAndLog = vi.mocked(checkAiFilesStalenessAndLog);
|
|
28
33
|
const mockReadProjectConfig = vi.mocked(readProjectConfig);
|
|
29
34
|
|
|
30
35
|
const fakeCtx = {} as Context;
|
|
31
36
|
|
|
32
|
-
|
|
37
|
+
const okVersion = (overrides?: object) => ({
|
|
38
|
+
kind: "ok" as const,
|
|
39
|
+
data: {
|
|
40
|
+
message: null,
|
|
41
|
+
guidelinesHash: "abc-guidelines-hash",
|
|
42
|
+
agentSkillsSha: "abc-skills-sha",
|
|
43
|
+
disableSkillsCli: false,
|
|
44
|
+
...overrides,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("checkVersionAndAiFilesStaleness", () => {
|
|
33
49
|
beforeEach(() => {
|
|
34
50
|
vi.clearAllMocks();
|
|
35
|
-
|
|
51
|
+
mockCheckAiFilesStalenessAndLog.mockResolvedValue(undefined);
|
|
36
52
|
mockReadProjectConfig.mockResolvedValue({
|
|
37
53
|
projectConfig: {
|
|
38
54
|
functions: "convex",
|
|
@@ -48,82 +64,93 @@ describe("updates", () => {
|
|
|
48
64
|
vi.resetAllMocks();
|
|
49
65
|
});
|
|
50
66
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
await checkVersion(fakeCtx);
|
|
66
|
-
|
|
67
|
-
expect(mockGetVersion).toHaveBeenCalled();
|
|
68
|
-
expect(mockLogMessage).toHaveBeenCalledWith(
|
|
69
|
-
"New version available: 1.2.3",
|
|
70
|
-
);
|
|
71
|
-
expect(mockCheckAiFilesStaleness).toHaveBeenCalledWith({
|
|
72
|
-
canonicalGuidelinesHash:
|
|
73
|
-
"02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
|
|
74
|
-
canonicalAgentSkillsSha: sha,
|
|
75
|
-
projectDir: expect.any(String),
|
|
76
|
-
convexDir: expect.any(String),
|
|
77
|
-
});
|
|
78
|
-
});
|
|
67
|
+
it("logs version message when server provides one", async () => {
|
|
68
|
+
mockGetVersion.mockResolvedValue(
|
|
69
|
+
okVersion({ message: "New version available: 1.2.3" }),
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
await checkVersionAndAiFilesStaleness(fakeCtx);
|
|
73
|
+
|
|
74
|
+
expect(mockLogMessage).toHaveBeenCalledWith("New version available: 1.2.3");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("does not log when version has no message", async () => {
|
|
78
|
+
mockGetVersion.mockResolvedValue(okVersion());
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
80
|
+
await checkVersionAndAiFilesStaleness(fakeCtx);
|
|
81
|
+
|
|
82
|
+
expect(mockLogMessage).not.toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("does nothing when getVersion returns error", async () => {
|
|
86
|
+
mockGetVersion.mockResolvedValue({ kind: "error" });
|
|
87
|
+
|
|
88
|
+
await checkVersionAndAiFilesStaleness(fakeCtx);
|
|
89
|
+
|
|
90
|
+
expect(mockLogMessage).not.toHaveBeenCalled();
|
|
91
|
+
expect(mockCheckAiFilesStalenessAndLog).not.toHaveBeenCalled();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("passes hashes and project paths to staleness check", async () => {
|
|
95
|
+
mockGetVersion.mockResolvedValue(
|
|
96
|
+
okVersion({
|
|
97
|
+
guidelinesHash:
|
|
98
|
+
"02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
|
|
99
|
+
agentSkillsSha: "abc123def456abc123def456abc123def456abc1",
|
|
100
|
+
}),
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
await checkVersionAndAiFilesStaleness(fakeCtx);
|
|
104
|
+
|
|
105
|
+
expect(mockCheckAiFilesStalenessAndLog).toHaveBeenCalledWith({
|
|
106
|
+
canonicalGuidelinesHash:
|
|
107
|
+
"02e43fc1ff0ee48db8da468f5c7525877d8056fcd56c77d78a166ac447efb91c",
|
|
108
|
+
canonicalAgentSkillsSha: "abc123def456abc123def456abc123def456abc1",
|
|
109
|
+
projectDir: expect.any(String),
|
|
110
|
+
convexDir: expect.any(String),
|
|
96
111
|
});
|
|
112
|
+
});
|
|
97
113
|
|
|
98
|
-
|
|
99
|
-
|
|
114
|
+
it("passes null hashes when version has none", async () => {
|
|
115
|
+
mockGetVersion.mockResolvedValue(
|
|
116
|
+
okVersion({ guidelinesHash: null, agentSkillsSha: null }),
|
|
117
|
+
);
|
|
100
118
|
|
|
101
|
-
|
|
119
|
+
await checkVersionAndAiFilesStaleness(fakeCtx);
|
|
102
120
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
121
|
+
expect(mockCheckAiFilesStalenessAndLog).toHaveBeenCalledWith({
|
|
122
|
+
canonicalGuidelinesHash: null,
|
|
123
|
+
canonicalAgentSkillsSha: null,
|
|
124
|
+
projectDir: expect.any(String),
|
|
125
|
+
convexDir: expect.any(String),
|
|
106
126
|
});
|
|
127
|
+
});
|
|
107
128
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
},
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
await checkVersion(fakeCtx);
|
|
120
|
-
|
|
121
|
-
expect(mockCheckAiFilesStaleness).toHaveBeenCalledWith({
|
|
122
|
-
canonicalGuidelinesHash: null,
|
|
123
|
-
canonicalAgentSkillsSha: null,
|
|
124
|
-
projectDir: expect.any(String),
|
|
125
|
-
convexDir: expect.any(String),
|
|
126
|
-
});
|
|
129
|
+
it("skips staleness check when aiFiles.disableStalenessMessage is true", async () => {
|
|
130
|
+
mockGetVersion.mockResolvedValue(okVersion());
|
|
131
|
+
mockReadProjectConfig.mockResolvedValue({
|
|
132
|
+
projectConfig: {
|
|
133
|
+
functions: "convex",
|
|
134
|
+
node: { externalPackages: [] },
|
|
135
|
+
generateCommonJSApi: false,
|
|
136
|
+
codegen: { staticApi: true, staticDataModel: true },
|
|
137
|
+
aiFiles: { disableStalenessMessage: true },
|
|
138
|
+
},
|
|
139
|
+
configPath: "convex.json",
|
|
127
140
|
});
|
|
141
|
+
|
|
142
|
+
await checkVersionAndAiFilesStaleness(fakeCtx);
|
|
143
|
+
|
|
144
|
+
expect(mockCheckAiFilesStalenessAndLog).not.toHaveBeenCalled();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("silently skips staleness check when project config cannot be resolved", async () => {
|
|
148
|
+
mockGetVersion.mockResolvedValue(okVersion());
|
|
149
|
+
mockReadProjectConfig.mockRejectedValue(new Error("no convex.json"));
|
|
150
|
+
|
|
151
|
+
await expect(
|
|
152
|
+
checkVersionAndAiFilesStaleness(fakeCtx),
|
|
153
|
+
).resolves.toBeUndefined();
|
|
154
|
+
expect(mockCheckAiFilesStalenessAndLog).not.toHaveBeenCalled();
|
|
128
155
|
});
|
|
129
156
|
});
|
package/src/cli/lib/updates.ts
CHANGED
|
@@ -3,31 +3,33 @@ import { logMessage } from "../../bundler/log.js";
|
|
|
3
3
|
import type { Context } from "../../bundler/context.js";
|
|
4
4
|
import { readProjectConfig } from "./config.js";
|
|
5
5
|
import { functionsDir } from "./utils/utils.js";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
checkAiFilesStalenessAndLog,
|
|
8
|
+
isAiFilesDisabled,
|
|
9
|
+
} from "./aiFiles/index.js";
|
|
7
10
|
import { getVersion } from "./versionApi.js";
|
|
8
11
|
|
|
9
12
|
/**
|
|
10
|
-
*
|
|
11
|
-
* are out of date.
|
|
13
|
+
* Fetch the latest version data, log any server nag message, and warn if
|
|
14
|
+
* Convex AI files are out of date. Both checks share the one getVersion()
|
|
15
|
+
* round-trip.
|
|
12
16
|
*/
|
|
13
|
-
export async function
|
|
17
|
+
export async function checkVersionAndAiFilesStaleness(ctx: Context) {
|
|
14
18
|
const version = await getVersion();
|
|
19
|
+
if (version.kind === "error") return;
|
|
15
20
|
|
|
16
|
-
if (version.
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (version.data.message) {
|
|
21
|
-
logMessage(version.data.message);
|
|
22
|
-
}
|
|
21
|
+
if (version.data.message) logMessage(version.data.message);
|
|
23
22
|
|
|
24
23
|
try {
|
|
25
24
|
const { configPath, projectConfig } = await readProjectConfig(ctx);
|
|
25
|
+
const aiFilesConfig = projectConfig.aiFiles;
|
|
26
|
+
if (isAiFilesDisabled(aiFilesConfig)) return;
|
|
26
27
|
const convexDir = path.resolve(functionsDir(configPath, projectConfig));
|
|
27
28
|
const projectDir = path.resolve(path.dirname(configPath));
|
|
28
|
-
await
|
|
29
|
+
await checkAiFilesStalenessAndLog({
|
|
29
30
|
canonicalGuidelinesHash: version.data.guidelinesHash,
|
|
30
31
|
canonicalAgentSkillsSha: version.data.agentSkillsSha,
|
|
32
|
+
aiFilesConfig,
|
|
31
33
|
projectDir,
|
|
32
34
|
convexDir,
|
|
33
35
|
});
|