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