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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/upgrade.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logVerbose,\n} from \"../../../bundler/log.js\";\nimport { runSystemQuery } from \"../run.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n loadDeploymentConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport {\n ensureBackendStopped,\n localDeploymentUrl,\n runLocalBackend,\n} from \"./run.js\";\nimport {\n downloadSnapshotExport,\n startSnapshotExport,\n} from \"../convexExport.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"../utils/utils.js\";\nimport {\n confirmImport,\n uploadForImport,\n waitForStableImportState,\n} from \"../convexImport.js\";\nimport { promptOptions, promptYesNo } from \"../utils/prompts.js\";\nimport { recursivelyDelete } from \"../fsUtils.js\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nexport async function handlePotentialUpgrade(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n adminKey: string;\n instanceSecret: string;\n forceUpgrade: boolean;\n },\n): Promise<{ cleanupHandle: string }> {\n const newConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.adminKey,\n instanceSecret: args.instanceSecret,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n return runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n return runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: false,\n });\n }\n const choice = args.forceUpgrade\n ? \"transfer\"\n : await promptOptions(ctx, {\n message: \"Transfer data from existing deployment?\",\n default: \"transfer\",\n choices: [\n { name: \"transfer data\", value: \"transfer\" },\n { name: \"start fresh\", value: \"reset\" },\n ],\n });\n const deploymentStatePath = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n if (choice === \"reset\") {\n recursivelyDelete(ctx, deploymentStatePath, { force: true });\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n return runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n }\n const newAdminKey = args.adminKey;\n const oldAdminKey =\n loadDeploymentConfig(ctx, args.deploymentKind, args.deploymentName)\n ?.adminKey ?? args.adminKey;\n return handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion!,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n oldAdminKey,\n newAdminKey,\n instanceSecret: args.instanceSecret,\n });\n}\n\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n // In most of the cases the admin key is the same for the old and new version.\n // This is helpful when we start generating new admin key formats that might\n // be incompatible with older backend versions.\n oldAdminKey: string;\n newAdminKey: string;\n instanceSecret: string;\n },\n): Promise<{ cleanupHandle: string }> {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n\n logVerbose(\"Running backend on old version\");\n const { cleanupHandle: oldCleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: false,\n });\n\n logVerbose(\"Downloading env vars\");\n const deploymentUrl = localDeploymentUrl(args.ports.cloud);\n const envs = (await runSystemQuery(ctx, {\n deploymentUrl,\n adminKey: args.oldAdminKey,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as Array<{\n name: string;\n value: string;\n }>;\n\n logVerbose(\"Doing a snapshot export\");\n const exportPath = path.join(\n deploymentStateDir(ctx, args.deploymentKind, args.deploymentName),\n \"export.zip\",\n );\n if (ctx.fs.exists(exportPath)) {\n ctx.fs.unlink(exportPath);\n }\n const snaphsotExportState = await startSnapshotExport(ctx, {\n deploymentUrl,\n adminKey: args.oldAdminKey,\n includeStorage: true,\n inputPath: exportPath,\n });\n if (snaphsotExportState.state !== \"completed\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to export snapshot\",\n });\n }\n await downloadSnapshotExport(ctx, {\n snapshotExportTs: snaphsotExportState.start_ts,\n inputPath: exportPath,\n adminKey: args.oldAdminKey,\n deploymentUrl,\n });\n\n logVerbose(\"Stopping the backend on the old version\");\n const oldCleanupFunc = ctx.removeCleanup(oldCleanupHandle);\n if (oldCleanupFunc) {\n await oldCleanupFunc(0);\n }\n await ensureBackendStopped(ctx, {\n ports: args.ports,\n maxTimeSecs: 5,\n deploymentName: args.deploymentName,\n allowOtherDeployments: false,\n });\n\n // TODO(ENG-7078) save old artifacts to backup files\n logVerbose(\"Running backend on new version\");\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logVerbose(\"Importing the env vars\");\n if (envs.length > 0) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl,\n adminKey: args.newAdminKey,\n });\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes: envs }),\n method: \"POST\",\n });\n } catch (e) {\n // TODO: this should ideally have a `LocalDeploymentError`\n return await logAndHandleFetchError(ctx, e);\n }\n }\n\n logVerbose(\"Doing a snapshot import\");\n const importId = await uploadForImport(ctx, {\n deploymentUrl,\n adminKey: args.newAdminKey,\n filePath: exportPath,\n importArgs: { format: \"zip\", mode: \"replace\", tableName: undefined },\n onImportFailed: async (e) => {\n logFailure(`Failed to import snapshot: ${e}`);\n },\n });\n logVerbose(`Snapshot import started`);\n let status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey: args.newAdminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n if (status.state !== \"waiting_for_confirmation\") {\n const message = \"Error while transferring data: Failed to upload snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n await confirmImport(ctx, {\n importId,\n adminKey: args.newAdminKey,\n deploymentUrl,\n onError: async (e) => {\n logFailure(`Failed to confirm import: ${e}`);\n },\n });\n logVerbose(`Snapshot import confirmed`);\n status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey: args.newAdminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n logVerbose(`Snapshot import status: ${status.state}`);\n if (status.state !== \"completed\") {\n const message = \"Error while transferring data: Failed to import snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n logFinishedStep(\"Successfully upgraded to a new backend version\");\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.newAdminKey,\n instanceSecret: args.instanceSecret,\n });\n\n return { cleanupHandle };\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AAEjB,iBAIO;AACP,iBAA+B;AAC/B,uBAKO;AACP,IAAAA,cAIO;AACP,0BAGO;AACP,mBAAwD;AACxD,0BAIO;AACP,qBAA2C;AAC3C,qBAAkC;AAClC,oBAAqC;AACrC,sBAA8C;AAC9C,eAAsB,uBACpB,KACA,MAcoC;AACpC,QAAM,YAAY;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK;AAAA,IACrB,UAAU,KAAK;AAAA,IACf,gBAAgB,KAAK;AAAA,EACvB;AACA,MAAI,KAAK,eAAe,QAAQ,KAAK,eAAe,KAAK,YAAY;AAEnE;AAAA,MACE;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IACF;AACA,eAAO,6BAAgB,KAAK;AAAA,MAC1B,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,gBAAgB,KAAK;AAAA,MACrB,OAAO,KAAK;AAAA,MACZ,gBAAgB,KAAK;AAAA,MACrB,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AACA;AAAA,IACE,4BAA4B,KAAK,UAAU,OAAO,KAAK,UAAU;AAAA,EACnE;AACA,QAAM,YACJ,KAAK,
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logVerbose,\n} from \"../../../bundler/log.js\";\nimport { runSystemQuery } from \"../run.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n loadDeploymentConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport {\n ensureBackendStopped,\n localDeploymentUrl,\n runLocalBackend,\n} from \"./run.js\";\nimport {\n downloadSnapshotExport,\n startSnapshotExport,\n} from \"../convexExport.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"../utils/utils.js\";\nimport {\n confirmImport,\n uploadForImport,\n waitForStableImportState,\n} from \"../convexImport.js\";\nimport { promptOptions, promptYesNo } from \"../utils/prompts.js\";\nimport { recursivelyDelete } from \"../fsUtils.js\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nexport async function handlePotentialUpgrade(\n ctx: Context,\n args: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n oldVersion: string | null;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n adminKey: string;\n instanceSecret: string;\n forceUpgrade: boolean;\n },\n): Promise<{ cleanupHandle: string }> {\n const newConfig = {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.adminKey,\n instanceSecret: args.instanceSecret,\n };\n if (args.oldVersion === null || args.oldVersion === args.newVersion) {\n // No upgrade needed. Save the current config and start running the backend.\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n return runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n }\n logVerbose(\n `Considering upgrade from ${args.oldVersion} to ${args.newVersion}`,\n );\n const confirmed =\n args.forceUpgrade ||\n !process.stdin.isTTY ||\n (await promptYesNo(ctx, {\n message: `This deployment is using an older version of the Convex backend. Upgrade now?`,\n default: true,\n }));\n if (!confirmed) {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n // Skipping upgrade, save the config with the old version and run.\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ...newConfig,\n backendVersion: args.oldVersion,\n });\n return runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: false,\n });\n }\n const choice =\n args.forceUpgrade || !process.stdin.isTTY\n ? \"transfer\"\n : await promptOptions(ctx, {\n message: \"Transfer data from existing deployment?\",\n default: \"transfer\",\n choices: [\n { name: \"transfer data\", value: \"transfer\" },\n { name: \"start fresh\", value: \"reset\" },\n ],\n });\n const deploymentStatePath = deploymentStateDir(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n );\n if (choice === \"reset\") {\n recursivelyDelete(ctx, deploymentStatePath, { force: true });\n saveDeploymentConfig(\n ctx,\n args.deploymentKind,\n args.deploymentName,\n newConfig,\n );\n return runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n ports: args.ports,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n }\n const newAdminKey = args.adminKey;\n const oldAdminKey =\n loadDeploymentConfig(ctx, args.deploymentKind, args.deploymentName)\n ?.adminKey ?? args.adminKey;\n return handleUpgrade(ctx, {\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n oldVersion: args.oldVersion!,\n newBinaryPath: args.newBinaryPath,\n newVersion: args.newVersion,\n ports: args.ports,\n oldAdminKey,\n newAdminKey,\n instanceSecret: args.instanceSecret,\n });\n}\n\nasync function handleUpgrade(\n ctx: Context,\n args: {\n deploymentName: string;\n deploymentKind: LocalDeploymentKind;\n oldVersion: string;\n newBinaryPath: string;\n newVersion: string;\n ports: {\n cloud: number;\n site: number;\n };\n // In most of the cases the admin key is the same for the old and new version.\n // This is helpful when we start generating new admin key formats that might\n // be incompatible with older backend versions.\n oldAdminKey: string;\n newAdminKey: string;\n instanceSecret: string;\n },\n): Promise<{ cleanupHandle: string }> {\n const { binaryPath: oldBinaryPath } = await ensureBackendBinaryDownloaded(\n ctx,\n {\n kind: \"version\",\n version: args.oldVersion,\n },\n );\n\n logVerbose(\"Running backend on old version\");\n const { cleanupHandle: oldCleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: oldBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: false,\n });\n\n logVerbose(\"Downloading env vars\");\n const deploymentUrl = localDeploymentUrl(args.ports.cloud);\n const envs = (await runSystemQuery(ctx, {\n deploymentUrl,\n adminKey: args.oldAdminKey,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as Array<{\n name: string;\n value: string;\n }>;\n\n logVerbose(\"Doing a snapshot export\");\n const exportPath = path.join(\n deploymentStateDir(ctx, args.deploymentKind, args.deploymentName),\n \"export.zip\",\n );\n if (ctx.fs.exists(exportPath)) {\n ctx.fs.unlink(exportPath);\n }\n const snaphsotExportState = await startSnapshotExport(ctx, {\n deploymentUrl,\n adminKey: args.oldAdminKey,\n includeStorage: true,\n inputPath: exportPath,\n });\n if (snaphsotExportState.state !== \"completed\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to export snapshot\",\n });\n }\n await downloadSnapshotExport(ctx, {\n snapshotExportTs: snaphsotExportState.start_ts,\n inputPath: exportPath,\n adminKey: args.oldAdminKey,\n deploymentUrl,\n });\n\n logVerbose(\"Stopping the backend on the old version\");\n const oldCleanupFunc = ctx.removeCleanup(oldCleanupHandle);\n if (oldCleanupFunc) {\n await oldCleanupFunc(0);\n }\n await ensureBackendStopped(ctx, {\n ports: args.ports,\n maxTimeSecs: 5,\n deploymentName: args.deploymentName,\n allowOtherDeployments: false,\n });\n\n // TODO(ENG-7078) save old artifacts to backup files\n logVerbose(\"Running backend on new version\");\n const { cleanupHandle } = await runLocalBackend(ctx, {\n binaryPath: args.newBinaryPath,\n ports: args.ports,\n deploymentKind: args.deploymentKind,\n deploymentName: args.deploymentName,\n instanceSecret: args.instanceSecret,\n isLatestVersion: true,\n });\n\n logVerbose(\"Importing the env vars\");\n if (envs.length > 0) {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl,\n adminKey: args.newAdminKey,\n });\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes: envs }),\n method: \"POST\",\n });\n } catch (e) {\n // TODO: this should ideally have a `LocalDeploymentError`\n return await logAndHandleFetchError(ctx, e);\n }\n }\n\n logVerbose(\"Doing a snapshot import\");\n const importId = await uploadForImport(ctx, {\n deploymentUrl,\n adminKey: args.newAdminKey,\n filePath: exportPath,\n importArgs: { format: \"zip\", mode: \"replace\", tableName: undefined },\n onImportFailed: async (e) => {\n logFailure(`Failed to import snapshot: ${e}`);\n },\n });\n logVerbose(`Snapshot import started`);\n let status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey: args.newAdminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n if (status.state !== \"waiting_for_confirmation\") {\n const message = \"Error while transferring data: Failed to upload snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n await confirmImport(ctx, {\n importId,\n adminKey: args.newAdminKey,\n deploymentUrl,\n onError: async (e) => {\n logFailure(`Failed to confirm import: ${e}`);\n },\n });\n logVerbose(`Snapshot import confirmed`);\n status = await waitForStableImportState(ctx, {\n importId,\n deploymentUrl,\n adminKey: args.newAdminKey,\n onProgress: () => {\n // do nothing for now\n return 0;\n },\n });\n logVerbose(`Snapshot import status: ${status.state}`);\n if (status.state !== \"completed\") {\n const message = \"Error while transferring data: Failed to import snapshot\";\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: message,\n errForSentry: new LocalDeploymentError(message),\n });\n }\n\n logFinishedStep(\"Successfully upgraded to a new backend version\");\n saveDeploymentConfig(ctx, args.deploymentKind, args.deploymentName, {\n ports: args.ports,\n backendVersion: args.newVersion,\n adminKey: args.newAdminKey,\n instanceSecret: args.instanceSecret,\n });\n\n return { cleanupHandle };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_run", "path"]
|
|
7
7
|
}
|
|
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var utils_exports = {};
|
|
30
30
|
__export(utils_exports, {
|
|
31
31
|
LOCAL_BACKEND_INSTANCE_SECRET: () => LOCAL_BACKEND_INSTANCE_SECRET,
|
|
32
|
+
chooseLocalBackendPorts: () => chooseLocalBackendPorts,
|
|
32
33
|
choosePorts: () => choosePorts,
|
|
33
34
|
generateInstanceSecret: () => generateInstanceSecret,
|
|
34
35
|
isOffline: () => isOffline,
|
|
@@ -65,6 +66,14 @@ async function choosePorts(ctx, {
|
|
|
65
66
|
}
|
|
66
67
|
return ports;
|
|
67
68
|
}
|
|
69
|
+
async function chooseLocalBackendPorts(ctx, ports) {
|
|
70
|
+
const [cloudPort, sitePort] = await choosePorts(ctx, {
|
|
71
|
+
count: 2,
|
|
72
|
+
startPort: 3210,
|
|
73
|
+
requestedPorts: [ports?.cloud ?? null, ports?.site ?? null]
|
|
74
|
+
});
|
|
75
|
+
return { cloudPort, sitePort };
|
|
76
|
+
}
|
|
68
77
|
async function isOffline() {
|
|
69
78
|
return false;
|
|
70
79
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport crypto from \"crypto\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n startPort,\n }: {\n count: number;\n requestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function isOffline(): Promise<boolean> {\n // TODO(ENG-7080) -- implement this for real\n return false;\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n logMessage(\n chalkStderr.cyan(\n \"To opt out at any time, run `npx convex disable-local-deployments`\",\n ),\n );\n}\n\nexport function generateInstanceSecret(): string {\n return crypto.randomBytes(32).toString(\"hex\");\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAC3B,yBAAuB;AACvB,oBAAmB;AACnB,mBAA4B;AAE5B,eAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAKwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,UAAM,2BAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,UAAM,2BAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,YAA8B;AAElD,SAAO;AACT;AAEO,SAAS,qCAAqC;AACnD;AAAA,IACE,yBAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,yBAAiC;AAC/C,SAAO,cAAAA,QAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;AAEO,MAAM,gCACX;",
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport crypto from \"crypto\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n startPort,\n }: {\n count: number;\n requestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n ports?: { cloud?: number | null; site?: number | null },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [ports?.cloud ?? null, ports?.site ?? null],\n });\n return { cloudPort, sitePort };\n}\n\nexport async function isOffline(): Promise<boolean> {\n // TODO(ENG-7080) -- implement this for real\n return false;\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n logMessage(\n chalkStderr.cyan(\n \"To opt out at any time, run `npx convex disable-local-deployments`\",\n ),\n );\n}\n\nexport function generateInstanceSecret(): string {\n return crypto.randomBytes(32).toString(\"hex\");\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA2B;AAC3B,yBAAuB;AACvB,oBAAmB;AACnB,mBAA4B;AAE5B,eAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAKwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,UAAM,2BAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,UAAM,2BAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,wBACpB,KACA,OACkD;AAClD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB,CAAC,OAAO,SAAS,MAAM,OAAO,QAAQ,IAAI;AAAA,EAC5D,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEA,eAAsB,YAA8B;AAElD,SAAO;AACT;AAEO,SAAS,qCAAqC;AACnD;AAAA,IACE,yBAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA;AAAA,IACE,yBAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,yBAAiC;AAC/C,SAAO,cAAAA,QAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAC9C;AAEO,MAAM,gCACX;",
|
|
6
6
|
"names": ["crypto"]
|
|
7
7
|
}
|
|
@@ -102,7 +102,7 @@ const StatusTool = {
|
|
|
102
102
|
)
|
|
103
103
|
}
|
|
104
104
|
];
|
|
105
|
-
if (selectionWithinProject.kind === "
|
|
105
|
+
if (selectionWithinProject.kind === "unspecified" && !(deploymentSelection.kind === "existingDeployment" && deploymentSelection.deploymentToActOn.deploymentFields === null)) {
|
|
106
106
|
const prodSelectionWithinProject = {
|
|
107
107
|
kind: "prod"
|
|
108
108
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/cli/lib/mcp/tools/status.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n encodeDeploymentSelector,\n getMcpDeploymentSelection,\n RequestContext,\n} from \"../requestContext.js\";\nimport {\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n loadSelectedDeploymentCredentials,\n} from \"../../api.js\";\nimport { z } from \"zod\";\nimport { ConvexTool } from \"./index.js\";\nimport { deploymentDashboardUrlPage } from \"../../../lib/dashboard.js\";\nimport { getDeploymentSelection } from \"../../../lib/deploymentSelection.js\";\n\nconst projectDirDescription = `\nThe root directory of the Convex project. This is usually the editor's workspace directory\nand often includes the 'package.json' file and the 'convex/' folder.\n\nPass this option unless explicitly instructed not to.\n`;\n\nconst inputSchema = z.object({\n projectDir: z.string().optional().describe(projectDirDescription),\n});\nconst outputSchema = z.object({\n availableDeployments: z.array(\n z.object({\n kind: z.string(),\n deploymentSelector: z.string(),\n url: z.string(),\n dashboardUrl: z.string().optional(),\n readOnly: z.boolean().optional(),\n }),\n ),\n});\n\nconst description = `\nGet all available deployments for a given Convex project directory.\n\nUse this tool to find the deployment selector, URL, and dashboard URL for each\ndeployment associated with the project. Pass the deployment selector to other\ntools to target a specific deployment.\n\nWhen deployed to Convex Cloud, projects have a development ({\"kind\": \"ownDev\"}) and\nproduction ({\"kind\": \"prod\"}) deployment. Generally default to using the development\ndeployment unless you'd specifically like to debug issues in production.\n\nWhen running locally, there will be a single \"urlWithAdminKey\" deployment.\n\nIf a deployment has \"readOnly: true\", it can only be used with read-only tools\nthat don't expose PII (\\`insights\\`, \\`functionSpec\\`, \\`tables\\`). Tools that read\nuser data (\\`data\\`, \\`logs\\`, \\`runOneoffQuery\\`) and mutating tools will reject it.\n\nIf \"readOnly\" is false or absent, all tools can be used with the deployment.\n`.trim();\n\nexport const StatusTool: ConvexTool<typeof inputSchema, typeof outputSchema> = {\n name: \"status\",\n description,\n inputSchema,\n outputSchema,\n handler: async (ctx: RequestContext, input) => {\n const projectDir = input.projectDir ?? ctx.options.projectDir;\n if (projectDir === undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project directory provided. Either provide the `projectDir` argument or configure the MCP server with the `--project-dir` flag.\",\n });\n }\n process.chdir(projectDir);\n const selectionWithinProject = deploymentSelectionWithinProjectFromOptions(\n ctx.options,\n );\n const deploymentSelection = await getDeploymentSelection(ctx, ctx.options);\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n let availableDeployments = [\n {\n kind: selectionWithinProject.kind,\n deploymentSelector: encodeDeploymentSelector(\n projectDir,\n selectionWithinProject,\n ),\n url: credentials.url,\n dashboardUrl:\n credentials.deploymentFields?.deploymentName &&\n deploymentDashboardUrlPage(\n credentials.deploymentFields.deploymentName,\n \"\",\n ),\n },\n ];\n // Also get the prod cloud deployment if we're using a cloud-hosted dev-deployment\n if (\n selectionWithinProject.kind === \"
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAIO;AACP,iBAIO;AACP,iBAAkB;AAElB,uBAA2C;AAC3C,iCAAuC;AAEvC,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO9B,MAAM,cAAc,aAAE,OAAO;AAAA,EAC3B,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAClE,CAAC;AACD,MAAM,eAAe,aAAE,OAAO;AAAA,EAC5B,sBAAsB,aAAE;AAAA,IACtB,aAAE,OAAO;AAAA,MACP,MAAM,aAAE,OAAO;AAAA,MACf,oBAAoB,aAAE,OAAO;AAAA,MAC7B,KAAK,aAAE,OAAO;AAAA,MACd,cAAc,aAAE,OAAO,EAAE,SAAS;AAAA,MAClC,UAAU,aAAE,QAAQ,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,EACH;AACF,CAAC;AAED,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBlB,KAAK;AAEA,MAAM,aAAkE;AAAA,EAC7E,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,OAAO,KAAqB,UAAU;AAC7C,UAAM,aAAa,MAAM,cAAc,IAAI,QAAQ;AACnD,QAAI,eAAe,QAAW;AAC5B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,YAAQ,MAAM,UAAU;AACxB,UAAM,6BAAyB;AAAA,MAC7B,IAAI;AAAA,IACN;AACA,UAAM,sBAAsB,UAAM,mDAAuB,KAAK,IAAI,OAAO;AACzE,UAAM,cAAc,UAAM;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AACA,QAAI,uBAAuB;AAAA,MACzB;AAAA,QACE,MAAM,uBAAuB;AAAA,QAC7B,wBAAoB;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AAAA,QACjB,cACE,YAAY,kBAAkB,sBAC9B;AAAA,UACE,YAAY,iBAAiB;AAAA,UAC7B;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,QACE,uBAAuB,SAAS,
|
|
4
|
+
"sourcesContent": ["import {\n encodeDeploymentSelector,\n getMcpDeploymentSelection,\n RequestContext,\n} from \"../requestContext.js\";\nimport {\n DeploymentSelectionWithinProject,\n deploymentSelectionWithinProjectFromOptions,\n loadSelectedDeploymentCredentials,\n} from \"../../api.js\";\nimport { z } from \"zod\";\nimport { ConvexTool } from \"./index.js\";\nimport { deploymentDashboardUrlPage } from \"../../../lib/dashboard.js\";\nimport { getDeploymentSelection } from \"../../../lib/deploymentSelection.js\";\n\nconst projectDirDescription = `\nThe root directory of the Convex project. This is usually the editor's workspace directory\nand often includes the 'package.json' file and the 'convex/' folder.\n\nPass this option unless explicitly instructed not to.\n`;\n\nconst inputSchema = z.object({\n projectDir: z.string().optional().describe(projectDirDescription),\n});\nconst outputSchema = z.object({\n availableDeployments: z.array(\n z.object({\n kind: z.string(),\n deploymentSelector: z.string(),\n url: z.string(),\n dashboardUrl: z.string().optional(),\n readOnly: z.boolean().optional(),\n }),\n ),\n});\n\nconst description = `\nGet all available deployments for a given Convex project directory.\n\nUse this tool to find the deployment selector, URL, and dashboard URL for each\ndeployment associated with the project. Pass the deployment selector to other\ntools to target a specific deployment.\n\nWhen deployed to Convex Cloud, projects have a development ({\"kind\": \"ownDev\"}) and\nproduction ({\"kind\": \"prod\"}) deployment. Generally default to using the development\ndeployment unless you'd specifically like to debug issues in production.\n\nWhen running locally, there will be a single \"urlWithAdminKey\" deployment.\n\nIf a deployment has \"readOnly: true\", it can only be used with read-only tools\nthat don't expose PII (\\`insights\\`, \\`functionSpec\\`, \\`tables\\`). Tools that read\nuser data (\\`data\\`, \\`logs\\`, \\`runOneoffQuery\\`) and mutating tools will reject it.\n\nIf \"readOnly\" is false or absent, all tools can be used with the deployment.\n`.trim();\n\nexport const StatusTool: ConvexTool<typeof inputSchema, typeof outputSchema> = {\n name: \"status\",\n description,\n inputSchema,\n outputSchema,\n handler: async (ctx: RequestContext, input) => {\n const projectDir = input.projectDir ?? ctx.options.projectDir;\n if (projectDir === undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project directory provided. Either provide the `projectDir` argument or configure the MCP server with the `--project-dir` flag.\",\n });\n }\n process.chdir(projectDir);\n const selectionWithinProject = deploymentSelectionWithinProjectFromOptions(\n ctx.options,\n );\n const deploymentSelection = await getDeploymentSelection(ctx, ctx.options);\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n let availableDeployments = [\n {\n kind: selectionWithinProject.kind,\n deploymentSelector: encodeDeploymentSelector(\n projectDir,\n selectionWithinProject,\n ),\n url: credentials.url,\n dashboardUrl:\n credentials.deploymentFields?.deploymentName &&\n deploymentDashboardUrlPage(\n credentials.deploymentFields.deploymentName,\n \"\",\n ),\n },\n ];\n // Also get the prod cloud deployment if we're using a cloud-hosted dev-deployment\n if (\n selectionWithinProject.kind === \"unspecified\" &&\n !(\n deploymentSelection.kind === \"existingDeployment\" &&\n deploymentSelection.deploymentToActOn.deploymentFields === null\n )\n ) {\n const prodSelectionWithinProject: DeploymentSelectionWithinProject = {\n kind: \"prod\",\n };\n const prodDeploymentSelection = await getMcpDeploymentSelection(\n ctx,\n prodSelectionWithinProject,\n );\n const prodCredentials = await loadSelectedDeploymentCredentials(\n ctx,\n prodDeploymentSelection,\n );\n if (\n prodCredentials.deploymentFields?.deploymentName &&\n prodCredentials.deploymentFields.deploymentType\n ) {\n availableDeployments.push({\n kind: prodSelectionWithinProject.kind,\n deploymentSelector: encodeDeploymentSelector(\n projectDir,\n prodSelectionWithinProject,\n ),\n url: prodCredentials.url,\n dashboardUrl: deploymentDashboardUrlPage(\n prodCredentials.deploymentFields.deploymentName,\n \"\",\n ),\n });\n }\n }\n if (ctx.productionDeploymentsDisabled) {\n const readOnly = ctx.productionPiiAllowed ? false : true;\n return {\n availableDeployments: availableDeployments.map((d) =>\n d.kind === \"prod\" ? { ...d, readOnly } : d,\n ),\n };\n }\n return { availableDeployments };\n },\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAIO;AACP,iBAIO;AACP,iBAAkB;AAElB,uBAA2C;AAC3C,iCAAuC;AAEvC,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO9B,MAAM,cAAc,aAAE,OAAO;AAAA,EAC3B,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAClE,CAAC;AACD,MAAM,eAAe,aAAE,OAAO;AAAA,EAC5B,sBAAsB,aAAE;AAAA,IACtB,aAAE,OAAO;AAAA,MACP,MAAM,aAAE,OAAO;AAAA,MACf,oBAAoB,aAAE,OAAO;AAAA,MAC7B,KAAK,aAAE,OAAO;AAAA,MACd,cAAc,aAAE,OAAO,EAAE,SAAS;AAAA,MAClC,UAAU,aAAE,QAAQ,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,EACH;AACF,CAAC;AAED,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBlB,KAAK;AAEA,MAAM,aAAkE;AAAA,EAC7E,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,OAAO,KAAqB,UAAU;AAC7C,UAAM,aAAa,MAAM,cAAc,IAAI,QAAQ;AACnD,QAAI,eAAe,QAAW;AAC5B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,YAAQ,MAAM,UAAU;AACxB,UAAM,6BAAyB;AAAA,MAC7B,IAAI;AAAA,IACN;AACA,UAAM,sBAAsB,UAAM,mDAAuB,KAAK,IAAI,OAAO;AACzE,UAAM,cAAc,UAAM;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AACA,QAAI,uBAAuB;AAAA,MACzB;AAAA,QACE,MAAM,uBAAuB;AAAA,QAC7B,wBAAoB;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AAAA,QACjB,cACE,YAAY,kBAAkB,sBAC9B;AAAA,UACE,YAAY,iBAAiB;AAAA,UAC7B;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAEA,QACE,uBAAuB,SAAS,iBAChC,EACE,oBAAoB,SAAS,wBAC7B,oBAAoB,kBAAkB,qBAAqB,OAE7D;AACA,YAAM,6BAA+D;AAAA,QACnE,MAAM;AAAA,MACR;AACA,YAAM,0BAA0B,UAAM;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AACA,YAAM,kBAAkB,UAAM;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,UACE,gBAAgB,kBAAkB,kBAClC,gBAAgB,iBAAiB,gBACjC;AACA,6BAAqB,KAAK;AAAA,UACxB,MAAM,2BAA2B;AAAA,UACjC,wBAAoB;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,UACA,KAAK,gBAAgB;AAAA,UACrB,kBAAc;AAAA,YACZ,gBAAgB,iBAAiB;AAAA,YACjC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,IAAI,+BAA+B;AACrC,YAAM,WAAW,IAAI,uBAAuB,QAAQ;AACpD,aAAO;AAAA,QACL,sBAAsB,qBAAqB;AAAA,UAAI,CAAC,MAC9C,EAAE,SAAS,SAAS,EAAE,GAAG,GAAG,SAAS,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,qBAAqB;AAAA,EAChC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -28,7 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var updates_exports = {};
|
|
30
30
|
__export(updates_exports, {
|
|
31
|
-
|
|
31
|
+
checkVersionAndAiFilesStaleness: () => checkVersionAndAiFilesStaleness
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(updates_exports);
|
|
34
34
|
var import_path = __toESM(require("path"), 1);
|
|
@@ -37,21 +37,20 @@ var import_config = require("./config.js");
|
|
|
37
37
|
var import_utils = require("./utils/utils.js");
|
|
38
38
|
var import_aiFiles = require("./aiFiles/index.js");
|
|
39
39
|
var import_versionApi = require("./versionApi.js");
|
|
40
|
-
async function
|
|
40
|
+
async function checkVersionAndAiFilesStaleness(ctx) {
|
|
41
41
|
const version = await (0, import_versionApi.getVersion)();
|
|
42
|
-
if (version.kind === "error")
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
if (version.data.message) {
|
|
46
|
-
(0, import_log.logMessage)(version.data.message);
|
|
47
|
-
}
|
|
42
|
+
if (version.kind === "error") return;
|
|
43
|
+
if (version.data.message) (0, import_log.logMessage)(version.data.message);
|
|
48
44
|
try {
|
|
49
45
|
const { configPath, projectConfig } = await (0, import_config.readProjectConfig)(ctx);
|
|
46
|
+
const aiFilesConfig = projectConfig.aiFiles;
|
|
47
|
+
if ((0, import_aiFiles.isAiFilesDisabled)(aiFilesConfig)) return;
|
|
50
48
|
const convexDir = import_path.default.resolve((0, import_utils.functionsDir)(configPath, projectConfig));
|
|
51
49
|
const projectDir = import_path.default.resolve(import_path.default.dirname(configPath));
|
|
52
|
-
await (0, import_aiFiles.
|
|
50
|
+
await (0, import_aiFiles.checkAiFilesStalenessAndLog)({
|
|
53
51
|
canonicalGuidelinesHash: version.data.guidelinesHash,
|
|
54
52
|
canonicalAgentSkillsSha: version.data.agentSkillsSha,
|
|
53
|
+
aiFilesConfig,
|
|
55
54
|
projectDir,
|
|
56
55
|
convexDir
|
|
57
56
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/updates.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,iBAA2B;AAE3B,oBAAkC;AAClC,mBAA6B;AAC7B,
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport {\n checkAiFilesStalenessAndLog,\n isAiFilesDisabled,\n} from \"./aiFiles/index.js\";\nimport { getVersion } from \"./versionApi.js\";\n\n/**\n * Fetch the latest version data, log any server nag message, and warn if\n * Convex AI files are out of date. Both checks share the one getVersion()\n * round-trip.\n */\nexport async function checkVersionAndAiFilesStaleness(ctx: Context) {\n const version = await getVersion();\n if (version.kind === \"error\") return;\n\n if (version.data.message) logMessage(version.data.message);\n\n try {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const aiFilesConfig = projectConfig.aiFiles;\n if (isAiFilesDisabled(aiFilesConfig)) return;\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await checkAiFilesStalenessAndLog({\n canonicalGuidelinesHash: version.data.guidelinesHash,\n canonicalAgentSkillsSha: version.data.agentSkillsSha,\n aiFilesConfig,\n projectDir,\n convexDir,\n });\n } catch {\n // Non-fatal: skip staleness check if project config can't be resolved.\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,iBAA2B;AAE3B,oBAAkC;AAClC,mBAA6B;AAC7B,qBAGO;AACP,wBAA2B;AAO3B,eAAsB,gCAAgC,KAAc;AAClE,QAAM,UAAU,UAAM,8BAAW;AACjC,MAAI,QAAQ,SAAS,QAAS;AAE9B,MAAI,QAAQ,KAAK,QAAS,4BAAW,QAAQ,KAAK,OAAO;AAEzD,MAAI;AACF,UAAM,EAAE,YAAY,cAAc,IAAI,UAAM,iCAAkB,GAAG;AACjE,UAAM,gBAAgB,cAAc;AACpC,YAAI,kCAAkB,aAAa,EAAG;AACtC,UAAM,YAAY,YAAAA,QAAK,YAAQ,2BAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,UAAU,CAAC;AACxD,cAAM,4CAA4B;AAAA,MAChC,yBAAyB,QAAQ,KAAK;AAAA,MACtC,yBAAyB,QAAQ,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;",
|
|
6
6
|
"names": ["path"]
|
|
7
7
|
}
|
|
@@ -25,6 +25,7 @@ var import_chalk = require("chalk");
|
|
|
25
25
|
var import_log = require("../../bundler/log.js");
|
|
26
26
|
var import_dashboard = require("./dashboard.js");
|
|
27
27
|
var import_api = require("./api.js");
|
|
28
|
+
var import_deployment = require("./deployment.js");
|
|
28
29
|
var import_utils = require("./utils/utils.js");
|
|
29
30
|
async function warn(ctx, options) {
|
|
30
31
|
const { title, subtitle, teamSlug } = options;
|
|
@@ -52,7 +53,7 @@ async function teamSpendingLimitsState(ctx, teamId) {
|
|
|
52
53
|
}
|
|
53
54
|
async function usageStateWarning(ctx, targetDeployment) {
|
|
54
55
|
const auth = ctx.bigBrainAuth();
|
|
55
|
-
if (auth === null || auth.kind === "projectKey" || auth.kind === "deploymentKey" || process.env.CONVEX_AGENT_MODE === "anonymous") {
|
|
56
|
+
if (auth === null || auth.kind === "projectKey" || auth.kind === "deploymentKey" || process.env.CONVEX_AGENT_MODE === "anonymous" || (0, import_deployment.isAnonymousDeployment)(targetDeployment)) {
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
59
|
const { teamId, team } = await (0, import_api.fetchTeamAndProject)(ctx, targetDeployment);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/usage.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport { teamDashboardUrl } from \"./dashboard.js\";\nimport { fetchTeamAndProject } from \"./api.js\";\nimport { bigBrainAPI } from \"./utils/utils.js\";\n\nasync function warn(\n ctx: Context,\n options: { title: string; subtitle: string; teamSlug: string },\n) {\n const { title, subtitle, teamSlug } = options;\n logWarning(chalkStderr.bold.yellow(title));\n logWarning(chalkStderr.yellow(subtitle));\n logWarning(\n chalkStderr.yellow(`Visit ${teamDashboardUrl(teamSlug)} to learn more.`),\n );\n}\n\nasync function teamUsageState(ctx: Context, teamId: number) {\n const { usageState } = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/usage/team_usage_state\",\n })) as {\n usageState: \"Default\" | \"Approaching\" | \"Exceeded\" | \"Disabled\" | \"Paused\";\n };\n\n return usageState;\n}\n\nasync function teamSpendingLimitsState(ctx: Context, teamId: number) {\n const response = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/get_spending_limits\",\n })) as {\n disableThresholdCents: number | null;\n state: null | \"Running\" | \"Disabled\" | \"Warning\";\n };\n\n return response.state;\n}\n\nexport async function usageStateWarning(\n ctx: Context,\n targetDeployment: string,\n) {\n // Skip the warning if the user doesn\u2019t have an auth token\n // (which can happen for instance when using a deploy key)\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"projectKey\" ||\n auth.kind === \"deploymentKey\" ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\"\n ) {\n return;\n }\n const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);\n\n const [usageState, spendingLimitsState] = await Promise.all([\n teamUsageState(ctx, teamId),\n teamSpendingLimitsState(ctx, teamId),\n ]);\n if (spendingLimitsState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because you exceeded your spending limit.\",\n subtitle: \"Increase it from the dashboard to re-enable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Approaching\") {\n await warn(ctx, {\n title: \"Your projects are approaching the Free plan limits.\",\n subtitle: \"Consider upgrading to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Exceeded\") {\n await warn(ctx, {\n title: \"Your projects are above the Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team exceeded Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to reenable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Paused\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team previously exceeded Free plan limits.\",\n subtitle: \"Restore your projects by going to the dashboard.\",\n teamSlug: team,\n });\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAA2B;AAC3B,uBAAiC;AACjC,iBAAoC;AACpC,mBAA4B;AAE5B,eAAe,KACb,KACA,SACA;AACA,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,6BAAW,yBAAY,KAAK,OAAO,KAAK,CAAC;AACzC,6BAAW,yBAAY,OAAO,QAAQ,CAAC;AACvC;AAAA,IACE,yBAAY,OAAO,aAAS,mCAAiB,QAAQ,CAAC,iBAAiB;AAAA,EACzE;AACF;AAEA,eAAe,eAAe,KAAc,QAAgB;AAC1D,QAAM,EAAE,WAAW,IAAK,UAAM,0BAAY;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAID,SAAO;AACT;AAEA,eAAe,wBAAwB,KAAc,QAAgB;AACnE,QAAM,WAAY,UAAM,0BAAY;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAKD,SAAO,SAAS;AAClB;AAEA,eAAsB,kBACpB,KACA,kBACA;AAGA,QAAM,OAAO,IAAI,aAAa;AAC9B,MACE,SAAS,QACT,KAAK,SAAS,gBACd,KAAK,SAAS,mBACd,QAAQ,IAAI,sBAAsB,
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logWarning } from \"../../bundler/log.js\";\nimport { teamDashboardUrl } from \"./dashboard.js\";\nimport { fetchTeamAndProject } from \"./api.js\";\nimport { isAnonymousDeployment } from \"./deployment.js\";\nimport { bigBrainAPI } from \"./utils/utils.js\";\n\nasync function warn(\n ctx: Context,\n options: { title: string; subtitle: string; teamSlug: string },\n) {\n const { title, subtitle, teamSlug } = options;\n logWarning(chalkStderr.bold.yellow(title));\n logWarning(chalkStderr.yellow(subtitle));\n logWarning(\n chalkStderr.yellow(`Visit ${teamDashboardUrl(teamSlug)} to learn more.`),\n );\n}\n\nasync function teamUsageState(ctx: Context, teamId: number) {\n const { usageState } = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/usage/team_usage_state\",\n })) as {\n usageState: \"Default\" | \"Approaching\" | \"Exceeded\" | \"Disabled\" | \"Paused\";\n };\n\n return usageState;\n}\n\nasync function teamSpendingLimitsState(ctx: Context, teamId: number) {\n const response = (await bigBrainAPI({\n ctx,\n method: \"GET\",\n path: \"dashboard/teams/\" + teamId + \"/get_spending_limits\",\n })) as {\n disableThresholdCents: number | null;\n state: null | \"Running\" | \"Disabled\" | \"Warning\";\n };\n\n return response.state;\n}\n\nexport async function usageStateWarning(\n ctx: Context,\n targetDeployment: string,\n) {\n // Skip the warning if the user doesn\u2019t have an auth token\n // (which can happen for instance when using a deploy key)\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"projectKey\" ||\n auth.kind === \"deploymentKey\" ||\n process.env.CONVEX_AGENT_MODE === \"anonymous\" ||\n isAnonymousDeployment(targetDeployment)\n ) {\n return;\n }\n const { teamId, team } = await fetchTeamAndProject(ctx, targetDeployment);\n\n const [usageState, spendingLimitsState] = await Promise.all([\n teamUsageState(ctx, teamId),\n teamSpendingLimitsState(ctx, teamId),\n ]);\n if (spendingLimitsState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because you exceeded your spending limit.\",\n subtitle: \"Increase it from the dashboard to re-enable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Approaching\") {\n await warn(ctx, {\n title: \"Your projects are approaching the Free plan limits.\",\n subtitle: \"Consider upgrading to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Exceeded\") {\n await warn(ctx, {\n title: \"Your projects are above the Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to avoid service interruption.\",\n teamSlug: team,\n });\n } else if (usageState === \"Disabled\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team exceeded Free plan limits.\",\n subtitle: \"Decrease your usage or upgrade to reenable your projects.\",\n teamSlug: team,\n });\n } else if (usageState === \"Paused\") {\n await warn(ctx, {\n title:\n \"Your projects are disabled because the team previously exceeded Free plan limits.\",\n subtitle: \"Restore your projects by going to the dashboard.\",\n teamSlug: team,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAA2B;AAC3B,uBAAiC;AACjC,iBAAoC;AACpC,wBAAsC;AACtC,mBAA4B;AAE5B,eAAe,KACb,KACA,SACA;AACA,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,6BAAW,yBAAY,KAAK,OAAO,KAAK,CAAC;AACzC,6BAAW,yBAAY,OAAO,QAAQ,CAAC;AACvC;AAAA,IACE,yBAAY,OAAO,aAAS,mCAAiB,QAAQ,CAAC,iBAAiB;AAAA,EACzE;AACF;AAEA,eAAe,eAAe,KAAc,QAAgB;AAC1D,QAAM,EAAE,WAAW,IAAK,UAAM,0BAAY;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAID,SAAO;AACT;AAEA,eAAe,wBAAwB,KAAc,QAAgB;AACnE,QAAM,WAAY,UAAM,0BAAY;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AAKD,SAAO,SAAS;AAClB;AAEA,eAAsB,kBACpB,KACA,kBACA;AAGA,QAAM,OAAO,IAAI,aAAa;AAC9B,MACE,SAAS,QACT,KAAK,SAAS,gBACd,KAAK,SAAS,mBACd,QAAQ,IAAI,sBAAsB,mBAClC,yCAAsB,gBAAgB,GACtC;AACA;AAAA,EACF;AACA,QAAM,EAAE,QAAQ,KAAK,IAAI,UAAM,gCAAoB,KAAK,gBAAgB;AAExE,QAAM,CAAC,YAAY,mBAAmB,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1D,eAAe,KAAK,MAAM;AAAA,IAC1B,wBAAwB,KAAK,MAAM;AAAA,EACrC,CAAC;AACD,MAAI,wBAAwB,YAAY;AACtC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,eAAe;AACvC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,YAAY;AACpC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,WAAW,eAAe,UAAU;AAClC,UAAM,KAAK,KAAK;AAAA,MACd,OACE;AAAA,MACF,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -57,7 +57,8 @@ const promptString = async (ctx, options) => {
|
|
|
57
57
|
if (process.stdin.isTTY) {
|
|
58
58
|
return (0, import_input.default)({
|
|
59
59
|
message: options.message,
|
|
60
|
-
...options.default !== void 0 ? { default: options.default } : {}
|
|
60
|
+
...options.default !== void 0 ? { default: options.default } : {},
|
|
61
|
+
...options.validate !== void 0 ? { validate: options.validate } : {}
|
|
61
62
|
}).catch(handlePromptError(ctx));
|
|
62
63
|
} else {
|
|
63
64
|
return ctx.crash({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/utils/prompts.ts"],
|
|
4
|
-
"sourcesContent": ["import input from \"@inquirer/input\";\nimport select from \"@inquirer/select\";\nimport search from \"@inquirer/search\";\nimport confirm from \"@inquirer/confirm\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logOutput } from \"../../../bundler/log.js\";\n\n/**\n * Handle ExitPromptError thrown by @inquirer/* packages when the user\n * presses Ctrl+C. Instead of printing an ugly stack trace, exit cleanly.\n * For unexpected errors, use ctx.crash to report to Sentry.\n */\nfunction handlePromptError(ctx: Context) {\n return async (error: unknown): Promise<never> => {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n // User pressed Ctrl+C \u2014 exit silently with code 130 (standard for SIGINT)\n process.exit(130);\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected prompt error: ${String(error)}`,\n errForSentry: error instanceof Error ? error : undefined,\n });\n };\n}\n\nexport const promptString = async (\n ctx: Context,\n options: {\n message: string;\n default?: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSecret = async (\n ctx: Context,\n options: {\n message: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n transformer: (val, { isFinal }) =>\n isFinal ? \"*\".repeat(val.length) : val,\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptOptions = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n prefix?: string;\n suffix?: string;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return select<V>({\n message: options.message + (options.suffix ?? \"\"),\n choices: options.choices,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSearch = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return search<V>({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n source: (input: string | undefined) => {\n if (!input) return options.choices;\n const term = input.toLowerCase();\n return options.choices.filter((c) =>\n c.name.toLowerCase().includes(term),\n );\n },\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptYesNo = async (\n ctx: Context,\n options: {\n message: string;\n default?: boolean;\n prefix?: string;\n nonInteractiveError?: string;\n },\n): Promise<boolean> => {\n if (process.stdin.isTTY) {\n return confirm({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n logOutput(options.message);\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n options.nonInteractiveError ??\n `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAClB,oBAAmB;AACnB,oBAAmB;AACnB,qBAAoB;AAEpB,iBAA0B;AAO1B,SAAS,kBAAkB,KAAc;AACvC,SAAO,OAAO,UAAmC;AAC/C,QAAI,iBAAiB,SAAS,MAAM,SAAS,mBAAmB;AAE9D,cAAQ,KAAK,GAAG;AAAA,IAClB;AACA,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,4BAA4B,OAAO,KAAK,CAAC;AAAA,MACzD,cAAc,iBAAiB,QAAQ,QAAQ;AAAA,IACjD,CAAC;AAAA,EACH;AACF;AAEO,MAAM,eAAe,OAC1B,KACA,
|
|
4
|
+
"sourcesContent": ["import input from \"@inquirer/input\";\nimport select from \"@inquirer/select\";\nimport search from \"@inquirer/search\";\nimport confirm from \"@inquirer/confirm\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logOutput } from \"../../../bundler/log.js\";\n\n/**\n * Handle ExitPromptError thrown by @inquirer/* packages when the user\n * presses Ctrl+C. Instead of printing an ugly stack trace, exit cleanly.\n * For unexpected errors, use ctx.crash to report to Sentry.\n */\nfunction handlePromptError(ctx: Context) {\n return async (error: unknown): Promise<never> => {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n // User pressed Ctrl+C \u2014 exit silently with code 130 (standard for SIGINT)\n process.exit(130);\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected prompt error: ${String(error)}`,\n errForSentry: error instanceof Error ? error : undefined,\n });\n };\n}\n\nexport const promptString = async (\n ctx: Context,\n options: {\n message: string;\n default?: string;\n validate?: (value: string) => boolean | string | Promise<string | boolean>;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.validate !== undefined ? { validate: options.validate } : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSecret = async (\n ctx: Context,\n options: {\n message: string;\n },\n): Promise<string> => {\n if (process.stdin.isTTY) {\n return input({\n message: options.message,\n transformer: (val, { isFinal }) =>\n isFinal ? \"*\".repeat(val.length) : val,\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptOptions = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n prefix?: string;\n suffix?: string;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return select<V>({\n message: options.message + (options.suffix ?? \"\"),\n choices: options.choices,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptSearch = async <V>(\n ctx: Context,\n options: {\n message: string;\n choices: Array<{ name: string; value: V }>;\n default?: V;\n },\n): Promise<V> => {\n if (process.stdin.isTTY) {\n return search<V>({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n source: (input: string | undefined) => {\n if (!input) return options.choices;\n const term = input.toLowerCase();\n return options.choices.filter((c) =>\n c.name.toLowerCase().includes(term),\n );\n },\n }).catch(handlePromptError(ctx));\n } else {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n\nexport const promptYesNo = async (\n ctx: Context,\n options: {\n message: string;\n default?: boolean;\n prefix?: string;\n nonInteractiveError?: string;\n },\n): Promise<boolean> => {\n if (process.stdin.isTTY) {\n return confirm({\n message: options.message,\n ...(options.default !== undefined ? { default: options.default } : {}),\n ...(options.prefix !== undefined\n ? { theme: { prefix: options.prefix } }\n : {}),\n }).catch(handlePromptError(ctx));\n } else {\n logOutput(options.message);\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n options.nonInteractiveError ??\n `Cannot prompt for input in non-interactive terminals. (${options.message})`,\n });\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["input", "select", "search", "confirm"]
|
|
7
7
|
}
|
|
@@ -73,6 +73,7 @@ __export(utils_exports, {
|
|
|
73
73
|
spawnAsync: () => spawnAsync,
|
|
74
74
|
throwingFetch: () => throwingFetch,
|
|
75
75
|
typedBigBrainClient: () => typedBigBrainClient,
|
|
76
|
+
typedDeploymentClient: () => typedDeploymentClient,
|
|
76
77
|
typedPlatformClient: () => typedPlatformClient,
|
|
77
78
|
validateOrSelectProject: () => validateOrSelectProject,
|
|
78
79
|
validateOrSelectTeam: () => validateOrSelectTeam,
|
|
@@ -550,7 +551,7 @@ function cacheDir() {
|
|
|
550
551
|
}
|
|
551
552
|
return import_path.default.join(import_os.default.homedir(), ".cache", name);
|
|
552
553
|
}
|
|
553
|
-
|
|
554
|
+
function bigBrainFetch(ctx) {
|
|
554
555
|
const authHeader = ctx.bigBrainAuth()?.header;
|
|
555
556
|
const bigBrainHeaders = authHeader ? {
|
|
556
557
|
Authorization: authHeader,
|
|
@@ -591,16 +592,13 @@ async function bigBrainAPI({
|
|
|
591
592
|
return await logAndHandleFetchError(ctx, err);
|
|
592
593
|
}
|
|
593
594
|
}
|
|
594
|
-
function
|
|
595
|
+
function typedApiClientFactory(baseUrl, fetchBuilder) {
|
|
595
596
|
return (ctx, options = {}) => {
|
|
596
|
-
const
|
|
597
|
+
const client = (0, import_openapi_fetch.default)({
|
|
597
598
|
baseUrl,
|
|
598
|
-
fetch:
|
|
599
|
-
const fetch2 = await bigBrainFetch(ctx);
|
|
600
|
-
return fetch2(resource, options2);
|
|
601
|
-
}
|
|
599
|
+
fetch: fetchBuilder(ctx)
|
|
602
600
|
});
|
|
603
|
-
return new Proxy(
|
|
601
|
+
return new Proxy(client, {
|
|
604
602
|
get(target, prop) {
|
|
605
603
|
const originalMethod = target[prop];
|
|
606
604
|
if (prop === "GET" || prop === "POST" || prop === "HEAD" || prop === "OPTIONS" || prop === "PUT" || prop === "DELETE" || prop === "PATCH" || prop === "TRACE") {
|
|
@@ -620,17 +618,30 @@ function typedBigBrainClientFactory(baseUrl) {
|
|
|
620
618
|
});
|
|
621
619
|
};
|
|
622
620
|
}
|
|
623
|
-
const typedBigBrainClient =
|
|
624
|
-
|
|
625
|
-
|
|
621
|
+
const typedBigBrainClient = typedApiClientFactory(
|
|
622
|
+
BIG_BRAIN_URL,
|
|
623
|
+
bigBrainFetch
|
|
624
|
+
);
|
|
625
|
+
const typedPlatformClient = typedApiClientFactory(
|
|
626
|
+
PLATFORM_MANAGEMENT_API_URL,
|
|
627
|
+
bigBrainFetch
|
|
626
628
|
);
|
|
629
|
+
function typedDeploymentClient(ctx, args, options = {}) {
|
|
630
|
+
return typedApiClientFactory(
|
|
631
|
+
`${args.deploymentUrl}/api/v1`,
|
|
632
|
+
(ctx2) => deploymentFetch(ctx2, {
|
|
633
|
+
deploymentUrl: args.deploymentUrl,
|
|
634
|
+
adminKey: args.adminKey
|
|
635
|
+
})
|
|
636
|
+
)(ctx, options);
|
|
637
|
+
}
|
|
627
638
|
async function bigBrainAPIMaybeThrows({
|
|
628
639
|
ctx,
|
|
629
640
|
method,
|
|
630
641
|
path: path2,
|
|
631
642
|
data
|
|
632
643
|
}) {
|
|
633
|
-
const fetch2 =
|
|
644
|
+
const fetch2 = bigBrainFetch(ctx);
|
|
634
645
|
const dataString = data === void 0 ? method === "POST" ? JSON.stringify({}) : void 0 : typeof data === "string" ? data : JSON.stringify(data);
|
|
635
646
|
const res = await fetch2(new URL(path2, BIG_BRAIN_URL), {
|
|
636
647
|
method,
|
|
@@ -666,17 +677,32 @@ function waitUntilCalled() {
|
|
|
666
677
|
const waitPromise = new Promise((resolve) => onCalled = resolve);
|
|
667
678
|
return [waitPromise, () => onCalled(null)];
|
|
668
679
|
}
|
|
680
|
+
const BYTE_UNITS = [
|
|
681
|
+
[1 << 30, "GiB"],
|
|
682
|
+
[1e9, "GB"],
|
|
683
|
+
[1 << 20, "MiB"],
|
|
684
|
+
[1e6, "MB"],
|
|
685
|
+
[1 << 10, "KiB"],
|
|
686
|
+
[1e3, "KB"]
|
|
687
|
+
];
|
|
669
688
|
function formatSize(n) {
|
|
670
|
-
if (n
|
|
671
|
-
return
|
|
672
|
-
}
|
|
673
|
-
if (n < 1024 * 1024) {
|
|
674
|
-
return `${(n / 1024).toFixed(1)} KB`;
|
|
689
|
+
if (n === 0) {
|
|
690
|
+
return "0 bytes";
|
|
675
691
|
}
|
|
676
|
-
|
|
677
|
-
|
|
692
|
+
for (const [unitSize, unitName] of BYTE_UNITS) {
|
|
693
|
+
if (n < unitSize) {
|
|
694
|
+
continue;
|
|
695
|
+
}
|
|
696
|
+
if (n % unitSize === 0) {
|
|
697
|
+
return `${n / unitSize} ${unitName}`;
|
|
698
|
+
}
|
|
699
|
+
if (n * 10 % unitSize === 0) {
|
|
700
|
+
const whole = Math.floor(n / unitSize);
|
|
701
|
+
const frac = Math.floor(n * 10 / unitSize) % 10;
|
|
702
|
+
return `${whole}.${frac} ${unitName}`;
|
|
703
|
+
}
|
|
678
704
|
}
|
|
679
|
-
return `${
|
|
705
|
+
return `${n} bytes`;
|
|
680
706
|
}
|
|
681
707
|
function formatDuration(ms) {
|
|
682
708
|
const twoDigits = (n, unit) => `${n.toLocaleString("en-US", { maximumFractionDigits: 2 })}${unit}`;
|