mammoth-cli 2.2.47__tar.gz → 2.2.49__tar.gz
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.
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/PKG-INFO +2 -2
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +1 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +5 -2
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +3 -3
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +10 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +31 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +3 -2
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +3 -2
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/auth.py +51 -23
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/dashboard.py +34 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/job.py +3 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/project.py +2 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/registry.py +4 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/schema.py +15 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/view.py +77 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/view_ops.py +69 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/context/oauth.py +122 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/errors/envelope.py +4 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dataset_health.py +2 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/command_contract.py +19 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/input_fields.py +12 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/job_outcome.py +23 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/mapping.py +22 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/positionals.py +13 -0
- mammoth_cli-2.2.49/mammoth_cli/services/view_variants.py +164 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/pyproject.toml +2 -2
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/dashboard.yaml +52 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/view.yaml +150 -3
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/edits-target.source.yaml +2 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/sdk-catalog.source.yaml +21 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/sdk-methods.yaml +37 -1
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/.gitignore +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/LICENSE +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/README.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/app.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-style.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-template.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/link.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/resolve.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/token.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/database-import.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/link.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/resolve.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/view_profile.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/embed.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/dryrun_targets.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/executor.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/intent_only.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/invocation.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/locked_files.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/session.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/state.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/append_blank_columns.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/board_values.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/conditional_format.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_filters.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/data_profile.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/listing.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/local_time.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/read_queries.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/sdk_service.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/sql_check.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/stored_stats.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/text_dates.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/view_analysis.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/services/write_impact.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/link.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/resolve.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/token.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mammoth-cli
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.49
|
|
4
4
|
Summary: Command-line interface for the Mammoth Analytics platform
|
|
5
5
|
Project-URL: homepage, https://mammoth.io
|
|
6
6
|
Project-URL: repository, https://github.com/EdgeMetric/mammothsdk
|
|
@@ -17,7 +17,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
17
17
|
Requires-Python: <3.15,>=3.12
|
|
18
18
|
Requires-Dist: jsonschema>=4.20
|
|
19
19
|
Requires-Dist: keyring<26,>=25.7
|
|
20
|
-
Requires-Dist: mammoth-io<0.9,>=0.8.
|
|
20
|
+
Requires-Dist: mammoth-io<0.9,>=0.8.27
|
|
21
21
|
Requires-Dist: platformdirs<5,>=4.10
|
|
22
22
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
23
23
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -49,7 +49,7 @@ MAMMOTH_OUTPUT=json MAMMOTH_NO_INPUT=1` once.
|
|
|
49
49
|
Use the project you are given; never `project ensure`. No `doctor`, auth,
|
|
50
50
|
profiles, `config set`, `upgrade`, `skill install`, env vars, local files,
|
|
51
51
|
stdin, `--input FILE` or `output_path` (they fail `not_available_embedded`);
|
|
52
|
-
downloads return `download_url`.
|
|
52
|
+
downloads return `download_url`. Ask for a reload on `authentication_failed` only; on a 403 check ids and scope.
|
|
53
53
|
|
|
54
54
|
## Defaults you do not repeat
|
|
55
55
|
|
{mammoth_cli-2.2.47 → mammoth_cli-2.2.49}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md
RENAMED
|
@@ -17,8 +17,11 @@ created without a project.
|
|
|
17
17
|
`mammoth auth login --method oauth` signs the operator in through the browser (PKCE, loopback
|
|
18
18
|
`127.0.0.1`). The CLI keeps a 1 h `mm_` token and refreshes it under a file lock. `auth status`
|
|
19
19
|
reports `credential: oauth` and `expires_at`. A refresh that fails exits 4 with `login_expired`:
|
|
20
|
-
tell the operator to run `mammoth auth login` again. `--no-browser` prints the URL.
|
|
21
|
-
|
|
20
|
+
tell the operator to run `mammoth auth login` again. `--no-browser` prints the URL. `--device` is the sign-in for a
|
|
21
|
+
machine with no browser: it prints a short code and a URL for the operator to approve on another
|
|
22
|
+
device, then polls. Browser and device sign-in are for the operator's own terminal; an agent never
|
|
23
|
+
runs them. A key made with `token create` expires after 30 days: `cli_key_expired` means run
|
|
24
|
+
`mammoth auth login` again. `auth logout` also revokes the
|
|
22
25
|
connection on the server, and warns (still clearing local state) if it cannot.
|
|
23
26
|
|
|
24
27
|
`mammoth token create NAME`, `token list`, `token revoke KEY` are aliases of `client-app create`,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Published CLI command catalog
|
|
2
2
|
|
|
3
|
-
This generated catalog is a lookup table for every command in the published CLI manifest, currently
|
|
3
|
+
This generated catalog is a lookup table for every command in the published CLI manifest, currently 660; each entry carries its release status line. It is a command-contract index, not an assertion that every backend/OpenAPI operation has a CLI binding. For an exact local CLI contract, run `mammoth schema get COMMAND_ID`; `mammoth capability list` is an API-binding inventory and can omit typed/local CLI routes. For focused workflows, read the [recipes index](recipes/index.md). Sensitive structured input must come from a private file or pipe; never put secrets in literal argv.
|
|
4
4
|
|
|
5
5
|
Load only the applicable domain file:
|
|
6
6
|
|
|
@@ -24,7 +24,7 @@ Load only the applicable domain file:
|
|
|
24
24
|
- [dashboard-qa](commands/dashboard-qa.md) — 14 published commands
|
|
25
25
|
- [dashboard-template](commands/dashboard-template.md) — 12 published commands
|
|
26
26
|
- [dashboard-style](commands/dashboard-style.md) — 10 published commands
|
|
27
|
-
- [dashboard](commands/dashboard.md) —
|
|
27
|
+
- [dashboard](commands/dashboard.md) — 99 published commands
|
|
28
28
|
- [data-app](commands/data-app.md) — 12 published commands
|
|
29
29
|
- [dataset](commands/dataset.md) — 22 published commands
|
|
30
30
|
- [doctor](commands/doctor.md) — 1 published commands
|
|
@@ -51,7 +51,7 @@ Load only the applicable domain file:
|
|
|
51
51
|
- [user](commands/user.md) — 8 published commands
|
|
52
52
|
- [version](commands/version.md) — 1 published commands
|
|
53
53
|
- [view-transform](commands/view-transform.md) — 32 published commands
|
|
54
|
-
- [view](commands/view.md) —
|
|
54
|
+
- [view](commands/view.md) — 97 published commands
|
|
55
55
|
- [webhook](commands/webhook.md) — 7 published commands
|
|
56
56
|
- [workflow](commands/workflow.md) — 16 published commands
|
|
57
57
|
- [workspace](commands/workspace.md) — 26 published commands
|
|
@@ -422,6 +422,16 @@ Result: `DashboardFigureIntentResult`; mutation `benign_mutation`, confirmation
|
|
|
422
422
|
|
|
423
423
|
Status on release: ran once on CLI 2.0.14 — dashboard re-verification 2026-09-18: exit 0 on release with CLI 2.0.14. CLI defect fixed, confirmed: returned a full matched structured body ({"added":{...},"kind":"bar","spec":{...},"intentApplied":true,...}) instead of raising ValidationError on an unmatch…
|
|
424
424
|
|
|
425
|
+
### `dashboard.figure.add`
|
|
426
|
+
|
|
427
|
+
Run: `mammoth dashboard figure add`. Exact input fields: `mammoth schema get dashboard.figure.add`.
|
|
428
|
+
|
|
429
|
+
Example: `mammoth dashboard figure add 123 --input '{"dataview_id": 1, "figure": {"kind": "hbar", "title": "Revenue by region", "dim": "Region", "measure": "Revenue", "agg": "sum"}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
430
|
+
|
|
431
|
+
Result: `DashboardFigureAddResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
432
|
+
|
|
433
|
+
Status on release: untried; no live run recorded.
|
|
434
|
+
|
|
425
435
|
### `dashboard.filter.add`
|
|
426
436
|
|
|
427
437
|
Run: `mammoth dashboard filter add`. Exact input fields: `mammoth schema get dashboard.filter.add`.
|
|
@@ -412,6 +412,26 @@ Result: `ViewDraftSubmitResult`; mutation `reversible_pipeline`, confirmation `n
|
|
|
412
412
|
|
|
413
413
|
Status on release: untried; no live run recorded.
|
|
414
414
|
|
|
415
|
+
### `view.explore-panel.get`
|
|
416
|
+
|
|
417
|
+
Run: `mammoth view explore-panel get`. Exact input fields: `mammoth schema get view.explore-panel.get`.
|
|
418
|
+
|
|
419
|
+
Example: `mammoth view explore-panel get 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
420
|
+
|
|
421
|
+
Result: `ViewExplorePanelGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
422
|
+
|
|
423
|
+
Status on release: untried; no live run recorded.
|
|
424
|
+
|
|
425
|
+
### `view.explore-panel.set`
|
|
426
|
+
|
|
427
|
+
Run: `mammoth view explore-panel set`. Exact input fields: `mammoth schema get view.explore-panel.set`.
|
|
428
|
+
|
|
429
|
+
Example: `mammoth view explore-panel set 123 --input '{"panel": {"open": true, "items": [{"column": "column_1", "renderType": "chart"}]}}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
430
|
+
|
|
431
|
+
Result: `ViewExplorePanelSetResult`; mutation `benign_mutation`, confirmation `none`, wait policy `not_async`.
|
|
432
|
+
|
|
433
|
+
Status on release: untried; no live run recorded.
|
|
434
|
+
|
|
415
435
|
### `view.export.azure-blob`
|
|
416
436
|
|
|
417
437
|
Run: `mammoth view export azure-blob`. Exact input fields: `mammoth schema get view.export.azure-blob`.
|
|
@@ -738,7 +758,7 @@ Status on release: ran once on CLI 2.0.21 — ergonomics sweep 2026-09-19: exit
|
|
|
738
758
|
|
|
739
759
|
Run: `mammoth view optimize`. Exact input fields: `mammoth schema get view.optimize`.
|
|
740
760
|
|
|
741
|
-
Example: `mammoth view optimize 123
|
|
761
|
+
Example: `mammoth view optimize 123`. Illustrative only: append `--yes` after observing an owned target.
|
|
742
762
|
|
|
743
763
|
Result: `ViewOptimizeResult`; mutation `reversible_pipeline`, confirmation `prompt_or_yes`, wait policy `start_or_wait`.
|
|
744
764
|
|
|
@@ -914,6 +934,16 @@ Result: `ViewUpdateResult`; mutation `benign_mutation`, confirmation `none`, wai
|
|
|
914
934
|
|
|
915
935
|
Status on release: untried; no live run recorded.
|
|
916
936
|
|
|
937
|
+
### `view.variants.create`
|
|
938
|
+
|
|
939
|
+
Run: `mammoth view variants create`. Exact input fields: `mammoth schema get view.variants.create`.
|
|
940
|
+
|
|
941
|
+
Example: `mammoth view variants create 123 --input '{"from_view": 456, "column": "Region", "values": ["East", "West"]}'`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
942
|
+
|
|
943
|
+
Result: `ViewVariantsCreateResult`; mutation `benign_mutation`, confirmation `none`, wait policy `always_wait`.
|
|
944
|
+
|
|
945
|
+
Status on release: untried; no live run recorded.
|
|
946
|
+
|
|
917
947
|
### `view.version.apply`
|
|
918
948
|
|
|
919
949
|
Run: `mammoth view version apply`. Exact input fields: `mammoth schema get view.version.apply`.
|
|
@@ -19,5 +19,6 @@ condition, not permission to retry mutations. The credential rule lives in
|
|
|
19
19
|
Exit 4 is auth/authorization; preserve the structured error and stop safely.
|
|
20
20
|
|
|
21
21
|
In the Mammoth app none of the above applies: there is no `auth status`,
|
|
22
|
-
`doctor` or profile, and the app passes the login and project. On
|
|
23
|
-
the user to reload the page
|
|
22
|
+
`doctor` or profile, and the app passes the login and project. On `authentication_failed` or
|
|
23
|
+
`not_authenticated` ask the user to reload the page; on `authorization_required` (403)
|
|
24
|
+
check the ids and scope first, since a reload does not fix them.
|
|
@@ -7,7 +7,8 @@ these commands are not blanket permission to replay a mutation.
|
|
|
7
7
|
|
|
8
8
|
| exit | error.code (examples) | next step |
|
|
9
9
|
|---|---|---|
|
|
10
|
-
| 4 | not_authenticated, authentication_failed | `mammoth auth login`; in the Mammoth app, ask the user to reload the page |
|
|
10
|
+
| 4 | not_authenticated, authentication_failed | `mammoth auth login`; in the Mammoth app, ask the user to reload the page (an expired or invalid sign-in only) |
|
|
11
|
+
| 4 | authorization_required (403) | check the view, dataset and project ids and the scope first; a reload does not fix a wrong id |
|
|
11
12
|
| 2 | keyring_unavailable, keyring_unresponsive | operator runs `mammoth auth login --storage file` (or unlocks the OS keychain); not seen in the app |
|
|
12
13
|
| 5 | resource_not_found | re-list to find the correct id |
|
|
13
14
|
| 2 | project_required | `mammoth context project use ID` or `--project` (in the app: `--project` only) |
|
|
@@ -48,7 +49,7 @@ the `run_id` when you report a backend fault.
|
|
|
48
49
|
|
|
49
50
|
Do not run the next mutation on any of these; report the state (with
|
|
50
51
|
`log_ref.run_id`) and either recover per the tables above or hand off:
|
|
51
|
-
- `auth status` is missing or its `endpoint` does not match the intended environment (in the app there is no `auth status` or `doctor`:
|
|
52
|
+
- `auth status` is missing or its `endpoint` does not match the intended environment (in the app there is no `auth status` or `doctor`: a sign-in error (`authentication_failed`, `not_authenticated`) means ask the user to reload the page; `authorization_required` means check the ids and scope)
|
|
52
53
|
- `mammoth doctor` fails (CLI only)
|
|
53
54
|
- a dataset is still `need_action` after the settings update
|
|
54
55
|
- a read-back after a value-changing step shows a uniform column (all 0 / all one value / all null) or a changed row the condition should not have touched
|
|
@@ -270,13 +270,13 @@ def _verify_login(invocation: Invocation, *, base_url: str, api_token: str) -> i
|
|
|
270
270
|
return workspace_id
|
|
271
271
|
|
|
272
272
|
|
|
273
|
-
_LOGIN_METHODS = ("oauth", "token")
|
|
273
|
+
_LOGIN_METHODS = ("oauth", "device", "token")
|
|
274
274
|
|
|
275
275
|
|
|
276
276
|
def _choose_method(
|
|
277
277
|
method: str | None, invocation: Invocation, *, server_prefix: str | None, blockers: list[str]
|
|
278
278
|
) -> str:
|
|
279
|
-
"""Pick ``oauth`` or ``token``: explicit, implied by ``--input``, or asked.
|
|
279
|
+
"""Pick ``oauth``, ``device`` or ``token``: explicit, implied by ``--input``, or asked.
|
|
280
280
|
|
|
281
281
|
A server with no CLI OAuth client, a non-interactive run, and ``--input``
|
|
282
282
|
all keep the token login that existed before browser sign-in.
|
|
@@ -289,10 +289,10 @@ def _choose_method(
|
|
|
289
289
|
exit_status=EXIT_USAGE,
|
|
290
290
|
hint=f"Use one of: {', '.join(_LOGIN_METHODS)}.",
|
|
291
291
|
)
|
|
292
|
-
if method
|
|
292
|
+
if method != "token" and invocation.input_file is not None:
|
|
293
293
|
raise CliError(
|
|
294
294
|
code="invalid_argument_combination",
|
|
295
|
-
message="--input is for token logins; it cannot be used with --method
|
|
295
|
+
message=f"--input is for token logins; it cannot be used with --method {method}.",
|
|
296
296
|
exit_status=EXIT_USAGE,
|
|
297
297
|
)
|
|
298
298
|
return method
|
|
@@ -302,16 +302,18 @@ def _choose_method(
|
|
|
302
302
|
return "token"
|
|
303
303
|
typer.echo("How do you want to sign in?", err=True)
|
|
304
304
|
typer.echo(" 1) Browser (OAuth) recommended", err=True)
|
|
305
|
+
typer.echo(" 2) Device code no browser on this machine", err=True)
|
|
305
306
|
typer.echo(" 3) Paste an API token for CI and scripts", err=True)
|
|
306
307
|
choice = typer.prompt("Choose", default="1", show_default=False).strip()
|
|
307
|
-
|
|
308
|
+
methods = {"1": "oauth", "2": "device", "3": "token"}
|
|
309
|
+
if choice not in methods:
|
|
308
310
|
raise CliError(
|
|
309
311
|
code="invalid_login_method",
|
|
310
312
|
message=f"'{choice}' is not one of the choices.",
|
|
311
313
|
exit_status=EXIT_USAGE,
|
|
312
|
-
hint="Enter 1 for the browser or 3 to paste an API token.",
|
|
314
|
+
hint="Enter 1 for the browser, 2 for a device code or 3 to paste an API token.",
|
|
313
315
|
)
|
|
314
|
-
return
|
|
316
|
+
return methods[choice]
|
|
315
317
|
|
|
316
318
|
|
|
317
319
|
def _iso(epoch: int) -> str:
|
|
@@ -325,16 +327,18 @@ def _run_oauth_login(
|
|
|
325
327
|
storage: str,
|
|
326
328
|
open_browser: bool,
|
|
327
329
|
interactive: bool,
|
|
330
|
+
device: bool = False,
|
|
328
331
|
) -> tuple[dict[str, Any], dict[str, Any]]:
|
|
329
|
-
"""Sign in through the browser and persist the refreshable session."""
|
|
332
|
+
"""Sign in through the browser (or a device code) and persist the refreshable session."""
|
|
330
333
|
base_url = resolve_base_url(server_prefix)
|
|
331
334
|
client_id = oauth.client_id_for(server_prefix)
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
client_id=client_id,
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
335
|
+
say = lambda line: typer.echo(line, err=True) # noqa: E731
|
|
336
|
+
if device:
|
|
337
|
+
session = oauth.device_login(base_url, client_id=client_id, say=say)
|
|
338
|
+
else:
|
|
339
|
+
session = oauth.browser_login(
|
|
340
|
+
base_url, client_id=client_id, open_browser=open_browser, say=say
|
|
341
|
+
)
|
|
338
342
|
workspace_id = _verify_login(invocation, base_url=base_url, api_token=session.access)
|
|
339
343
|
|
|
340
344
|
profile_name = invocation.profile or profiles.DEFAULT_PROFILE_NAME
|
|
@@ -378,8 +382,18 @@ def _run_login(
|
|
|
378
382
|
storage: str,
|
|
379
383
|
method: str | None = None,
|
|
380
384
|
no_browser: bool = False,
|
|
385
|
+
device: bool = False,
|
|
381
386
|
) -> tuple[dict[str, Any], dict[str, Any]]:
|
|
382
387
|
"""Validate, connection-check, and persist one `auth login` invocation."""
|
|
388
|
+
if device:
|
|
389
|
+
if method not in (None, "device"):
|
|
390
|
+
raise CliError(
|
|
391
|
+
code="invalid_argument_combination",
|
|
392
|
+
message=f"--device cannot be used with --method {method}.",
|
|
393
|
+
exit_status=EXIT_USAGE,
|
|
394
|
+
hint="Use --device alone, or --method device.",
|
|
395
|
+
)
|
|
396
|
+
method = "device"
|
|
383
397
|
if storage not in _STORAGE_MODES:
|
|
384
398
|
raise CliError(
|
|
385
399
|
code="invalid_storage_mode",
|
|
@@ -390,16 +404,15 @@ def _run_login(
|
|
|
390
404
|
|
|
391
405
|
blockers = _prompt_blockers(invocation)
|
|
392
406
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
== "oauth"
|
|
396
|
-
):
|
|
407
|
+
chosen = _choose_method(method, invocation, server_prefix=server_prefix, blockers=blockers)
|
|
408
|
+
if chosen in ("oauth", "device"):
|
|
397
409
|
return _run_oauth_login(
|
|
398
410
|
invocation,
|
|
399
411
|
server_prefix=server_prefix,
|
|
400
412
|
storage=storage,
|
|
401
413
|
open_browser=not no_browser,
|
|
402
414
|
interactive=not blockers,
|
|
415
|
+
device=chosen == "device",
|
|
403
416
|
)
|
|
404
417
|
|
|
405
418
|
if invocation.input_file is not None:
|
|
@@ -488,19 +501,33 @@ def auth_login(
|
|
|
488
501
|
method: str | None = typer.Option(
|
|
489
502
|
None,
|
|
490
503
|
"--method",
|
|
491
|
-
help=
|
|
492
|
-
|
|
504
|
+
help=(
|
|
505
|
+
"How to sign in: a browser (oauth), a code typed on another device (device) "
|
|
506
|
+
"or a pasted API token (token)."
|
|
507
|
+
),
|
|
508
|
+
metavar="oauth|device|token",
|
|
493
509
|
),
|
|
494
510
|
no_browser: bool = typer.Option(
|
|
495
511
|
False, "--no-browser", help="Print the sign-in URL instead of opening a browser."
|
|
496
512
|
),
|
|
513
|
+
device: bool = typer.Option(
|
|
514
|
+
False,
|
|
515
|
+
"--device",
|
|
516
|
+
help=(
|
|
517
|
+
"Sign in with a device code, for a machine with no browser: the CLI prints "
|
|
518
|
+
"a short code and a URL, you approve on any other device, and the CLI "
|
|
519
|
+
"polls until you do. Same as --method device."
|
|
520
|
+
),
|
|
521
|
+
),
|
|
497
522
|
) -> None:
|
|
498
523
|
"""Log in and store one profile's credentials.
|
|
499
524
|
|
|
500
525
|
In a terminal, choose a browser sign-in (OAuth; the CLI keeps a token that
|
|
501
|
-
refreshes itself)
|
|
502
|
-
|
|
503
|
-
(
|
|
526
|
+
refreshes itself), a device code (``--device``: for a machine with no
|
|
527
|
+
browser, you type a short code on any other device) or paste an API token
|
|
528
|
+
(mm_..., from Workspace settings -> API Tokens). The token names its
|
|
529
|
+
workspace. For non-interactive use (agents, CI), pass ``--input FILE`` with
|
|
530
|
+
{"api_token": ...} instead.
|
|
504
531
|
Performs a lightweight connection check before saving anything; a failed
|
|
505
532
|
check leaves existing profile state unchanged.
|
|
506
533
|
"""
|
|
@@ -531,6 +558,7 @@ def auth_login(
|
|
|
531
558
|
storage=storage,
|
|
532
559
|
method=method,
|
|
533
560
|
no_browser=no_browser,
|
|
561
|
+
device=device,
|
|
534
562
|
)
|
|
535
563
|
|
|
536
564
|
executor.run(
|
|
@@ -608,6 +608,40 @@ def dashboard_share(invocation: Invocation) -> HandlerResult:
|
|
|
608
608
|
return data, _meta(invocation, auth.workspace_id)
|
|
609
609
|
|
|
610
610
|
|
|
611
|
+
def _figure_page_kwargs(page: Any) -> dict[str, Any]:
|
|
612
|
+
"""Map the endpoint's ``page`` ({"id"} or {"new_title"}) onto the SDK's page arguments."""
|
|
613
|
+
if not isinstance(page, dict) or set(page) not in ({"id"}, {"new_title"}):
|
|
614
|
+
raise CliError(
|
|
615
|
+
code=CODE_INVALID_ARGUMENT,
|
|
616
|
+
message='The \'page\' input field must be {"id": ...} or {"new_title": ...}.',
|
|
617
|
+
exit_status=EXIT_USAGE,
|
|
618
|
+
)
|
|
619
|
+
if "id" in page:
|
|
620
|
+
return {"page_id": page["id"]}
|
|
621
|
+
return {"page_new_title": page["new_title"]}
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
def dashboard_figure_add(invocation: Invocation) -> HandlerResult:
|
|
625
|
+
"""Add one figure to a dashboard. The input is the endpoint's own shape.
|
|
626
|
+
|
|
627
|
+
``dataview_id`` and ``figure`` are required; ``banded`` and ``page`` (``{"id": ...}``
|
|
628
|
+
or ``{"new_title": ...}``) are optional. The result carries ``bake_job_id``.
|
|
629
|
+
"""
|
|
630
|
+
dashboard_id = _require_int_positional(invocation, "dashboard id")
|
|
631
|
+
document = _bound_document(invocation)
|
|
632
|
+
kwargs: dict[str, Any] = {
|
|
633
|
+
"dashboard_id": dashboard_id,
|
|
634
|
+
"dataview_id": _require_field(document, "dataview_id"),
|
|
635
|
+
"figure": _require_field(document, "figure"),
|
|
636
|
+
}
|
|
637
|
+
_forward_optional(document, kwargs, ("banded",))
|
|
638
|
+
if document.get("page") is not None:
|
|
639
|
+
kwargs.update(_figure_page_kwargs(document["page"]))
|
|
640
|
+
with open_service(invocation) as (service, auth):
|
|
641
|
+
data = service.call(_symbol(invocation), **kwargs)
|
|
642
|
+
return data, _meta(invocation, auth.workspace_id)
|
|
643
|
+
|
|
644
|
+
|
|
611
645
|
def dashboard_cancel_generation(invocation: Invocation) -> HandlerResult:
|
|
612
646
|
"""Cancel an in-progress dashboard generation."""
|
|
613
647
|
dashboard_id = _require_int_positional(invocation, "dashboard id")
|
|
@@ -199,7 +199,9 @@ def _with_outcome(service: Any, data: dict[str, Any]) -> dict[str, Any]:
|
|
|
199
199
|
gets its copied counts and per-view runs (no read). The job succeeded either way, so
|
|
200
200
|
a view that cannot be read is an ``outcome_error``, never a failed wait.
|
|
201
201
|
"""
|
|
202
|
-
|
|
202
|
+
result = job_outcome.with_derived_datasets(data.get("result"))
|
|
203
|
+
data = {**data, "result": result} if result is not data.get("result") else data
|
|
204
|
+
copied = job_outcome.copy_outcome(result)
|
|
203
205
|
if copied is not None and data.get("operation") == job_outcome.COPY_PROJECT_OPERATION:
|
|
204
206
|
return {**data, "outcome": copied}
|
|
205
207
|
target = job_outcome.view_target(data)
|
|
@@ -36,6 +36,7 @@ from mammoth_cli.runtime.confirm import (
|
|
|
36
36
|
)
|
|
37
37
|
from mammoth_cli.runtime.invocation import Invocation
|
|
38
38
|
from mammoth_cli.runtime.session import open_service, resolved_project
|
|
39
|
+
from mammoth_cli.services import job_outcome
|
|
39
40
|
|
|
40
41
|
HandlerResult = tuple[Any, dict[str, Any]]
|
|
41
42
|
|
|
@@ -299,7 +300,7 @@ def project_copy(invocation: Invocation) -> HandlerResult:
|
|
|
299
300
|
_forward_optional(document, kwargs, _COPY_OPTIONAL)
|
|
300
301
|
with open_service(invocation) as (service, auth):
|
|
301
302
|
queued = service.call(_symbol(invocation), **kwargs)
|
|
302
|
-
data = service.wait_if_job(queued)
|
|
303
|
+
data = job_outcome.with_derived_datasets(service.wait_if_job(queued))
|
|
303
304
|
return data, _meta(invocation, auth.workspace_id, source_id)
|
|
304
305
|
|
|
305
306
|
|
|
@@ -483,6 +483,7 @@ HANDLERS: dict[str, Handler] = {
|
|
|
483
483
|
"dashboard.tags.merge": dashboard_cmd.dashboard_tags_merge,
|
|
484
484
|
"dashboard.published-data-by-url": dashboard_cmd.dashboard_published_data_by_url,
|
|
485
485
|
"dashboard.restore": dashboard_cmd.dashboard_restore,
|
|
486
|
+
"dashboard.figure.add": dashboard_cmd.dashboard_figure_add,
|
|
486
487
|
"dashboard.share": dashboard_cmd.dashboard_share,
|
|
487
488
|
"dashboard.source.list": dashboard_cmd.dashboard_source_list,
|
|
488
489
|
"dashboard.trash": dashboard_cmd.dashboard_trash,
|
|
@@ -777,6 +778,8 @@ HANDLERS: dict[str, Handler] = {
|
|
|
777
778
|
"view.optimize": view_cmd.view_optimize,
|
|
778
779
|
"view.compare": view_cmd.view_compare,
|
|
779
780
|
"view.update": view_cmd.view_update,
|
|
781
|
+
"view.explore-panel.get": view_cmd.view_explore_panel_get,
|
|
782
|
+
"view.explore-panel.set": view_cmd.view_explore_panel_set,
|
|
780
783
|
"view.data.get": view_cmd.view_data_get,
|
|
781
784
|
"view.data.query": view_cmd.view_data_query,
|
|
782
785
|
"view.data.aggregate": view_cmd.view_data_aggregate_rounded,
|
|
@@ -852,6 +855,7 @@ HANDLERS: dict[str, Handler] = {
|
|
|
852
855
|
"view.export.tableau": view_cmd.view_export_specialized,
|
|
853
856
|
# view family (View-object: create/get/delete, draft, transforms)
|
|
854
857
|
"view.create": view_ops_cmd.view_create,
|
|
858
|
+
"view.variants.create": view_ops_cmd.view_variants_create,
|
|
855
859
|
"view.get": view_ops_cmd.view_get,
|
|
856
860
|
"view.delete": view_ops_cmd.view_delete,
|
|
857
861
|
"view.draft.enter": view_ops_cmd.view_draft_enter,
|
|
@@ -45,8 +45,18 @@ _PROTECTED_INPUT_PATH = "/private/path/request.json"
|
|
|
45
45
|
# Commands whose useful example the SDK signature cannot express: a distinct
|
|
46
46
|
# second id, an optional-but-central input field, or two views to compare.
|
|
47
47
|
_FIXED_EXAMPLES: dict[str, tuple[tuple[str, ...], dict[str, Any]]] = {
|
|
48
|
+
"view.optimize": (("123",), {}),
|
|
49
|
+
"view.explore-panel.get": (("123",), {}),
|
|
50
|
+
"view.explore-panel.set": (
|
|
51
|
+
("123",),
|
|
52
|
+
{"panel": {"open": True, "items": [{"column": "column_1", "renderType": "chart"}]}},
|
|
53
|
+
),
|
|
48
54
|
"project.check": (("123", "456"), {}),
|
|
49
55
|
"view.data.profile": (("123",), {"target": "Churn"}),
|
|
56
|
+
"view.variants.create": (
|
|
57
|
+
("123",),
|
|
58
|
+
{"from_view": 456, "column": "Region", "values": ["East", "West"]},
|
|
59
|
+
),
|
|
50
60
|
"workflow.canvas": (
|
|
51
61
|
("12",),
|
|
52
62
|
{
|
|
@@ -96,6 +106,11 @@ _GROUP_DISCOVERY_PURPOSES = {
|
|
|
96
106
|
|
|
97
107
|
_COMMAND_DISCOVERY_PURPOSES = {
|
|
98
108
|
"view.update": "rename change name to a new name title relabel",
|
|
109
|
+
"view.explore-panel.get": "explore cards saved panel the data editor explore side panel read",
|
|
110
|
+
"view.explore-panel.set": "save replace explore cards panel items chart a column in the editor",
|
|
111
|
+
"dashboard.figure.add": (
|
|
112
|
+
"append an explore card figure tile to a dashboard from a payload, no chat turn"
|
|
113
|
+
),
|
|
99
114
|
"file.upload": (
|
|
100
115
|
"upload import CSV spreadsheet XLSX source data append add rows union stack "
|
|
101
116
|
"a file into an existing dataset excel workbook tabs sheets drop in"
|
|
@@ -213,6 +213,48 @@ def _resolve_dataset_id(
|
|
|
213
213
|
return dataset_id
|
|
214
214
|
|
|
215
215
|
|
|
216
|
+
def _check_parent_matches(view_id: int, given: int, real: int) -> None:
|
|
217
|
+
"""Refuse a DATASET_ID that is not the view's parent, before any write."""
|
|
218
|
+
if given == real:
|
|
219
|
+
return
|
|
220
|
+
raise CliError(
|
|
221
|
+
code=CODE_INVALID_ARGUMENT,
|
|
222
|
+
message=f"view {view_id} belongs to dataset {real}, not {given}",
|
|
223
|
+
exit_status=EXIT_USAGE,
|
|
224
|
+
hint=f"Run it again with dataset {real}, or leave DATASET_ID out: mammoth looks it up.",
|
|
225
|
+
details={"view_id": view_id, "given_dataset_id": given, "dataset_id": real},
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def _view_parent_dataset_id(service: Any, invocation: Invocation, view_id: int) -> int:
|
|
230
|
+
"""The view's own dataset: the remembered parent, else one read of the view's row."""
|
|
231
|
+
profile_name = _profile_name(invocation)
|
|
232
|
+
workspace_id = getattr(service, "_workspace_id", None)
|
|
233
|
+
remembered = parents.lookup(profile_name, workspace_id, view_id)
|
|
234
|
+
if remembered is not None:
|
|
235
|
+
return remembered
|
|
236
|
+
dataset_id = int(service.call(_FIND_DATASET_SYMBOL, dataview_id=view_id))
|
|
237
|
+
parents.remember(profile_name, workspace_id, {view_id: dataset_id})
|
|
238
|
+
return dataset_id
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _verified_dataset_id(
|
|
242
|
+
service: Any, invocation: Invocation, view_id: int, document: dict[str, Any]
|
|
243
|
+
) -> int:
|
|
244
|
+
"""The view's dataset for a write, so the caller never has to supply it.
|
|
245
|
+
|
|
246
|
+
A DATASET_ID (positional or ``dataset_id`` input field) is checked against the
|
|
247
|
+
view's real parent and refused when it differs; with none, the parent is looked up.
|
|
248
|
+
"""
|
|
249
|
+
explicit = _int_positional_at(invocation, 1, "dataset id")
|
|
250
|
+
if explicit is None and document.get(_DATASET_ID_FIELD) is not None:
|
|
251
|
+
explicit = _int_field(document[_DATASET_ID_FIELD], _DATASET_ID_FIELD)
|
|
252
|
+
real = _view_parent_dataset_id(service, invocation, view_id)
|
|
253
|
+
if explicit is not None:
|
|
254
|
+
_check_parent_matches(view_id, explicit, real)
|
|
255
|
+
return real
|
|
256
|
+
|
|
257
|
+
|
|
216
258
|
def _resolve_dataset_id_for_settle(
|
|
217
259
|
service: Any,
|
|
218
260
|
invocation: Invocation,
|
|
@@ -1030,7 +1072,7 @@ def view_optimize(invocation: Invocation) -> HandlerResult:
|
|
|
1030
1072
|
kwargs: dict[str, Any] = {"dataview_id": dataview_id, "project_id": project_id}
|
|
1031
1073
|
_forward_optional(document, kwargs, ("apply_rules",))
|
|
1032
1074
|
with open_service(invocation) as (service, auth):
|
|
1033
|
-
kwargs["dataset_id"] =
|
|
1075
|
+
kwargs["dataset_id"] = _verified_dataset_id(service, invocation, dataview_id, document)
|
|
1034
1076
|
data = service.call(_symbol(invocation), **kwargs)
|
|
1035
1077
|
if isinstance(data, dict) and data.get("job_id") is not None:
|
|
1036
1078
|
settled = service.wait_if_job({"job_id": data["job_id"]})
|
|
@@ -1073,6 +1115,40 @@ def view_update(invocation: Invocation) -> HandlerResult:
|
|
|
1073
1115
|
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1074
1116
|
|
|
1075
1117
|
|
|
1118
|
+
def view_explore_panel_get(invocation: Invocation) -> HandlerResult:
|
|
1119
|
+
"""Read the Explore panel the caller saved on a view (empty when none is saved)."""
|
|
1120
|
+
project_id = require_project(invocation)
|
|
1121
|
+
dataview_id = _require_int_positional_at(invocation, 0, "view id")
|
|
1122
|
+
document = invocation.load_input() or {}
|
|
1123
|
+
with open_service(invocation) as (service, auth):
|
|
1124
|
+
dataset_id = _resolve_dataset_id(service, invocation, dataview_id, document)
|
|
1125
|
+
data = service.call(
|
|
1126
|
+
_symbol(invocation),
|
|
1127
|
+
dataset_id=dataset_id,
|
|
1128
|
+
dataview_id=dataview_id,
|
|
1129
|
+
project_id=project_id,
|
|
1130
|
+
)
|
|
1131
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
def view_explore_panel_set(invocation: Invocation) -> HandlerResult:
|
|
1135
|
+
"""Replace the caller's saved Explore panel with the ``panel`` input field."""
|
|
1136
|
+
project_id = require_project(invocation)
|
|
1137
|
+
dataview_id = _require_int_positional_at(invocation, 0, "view id")
|
|
1138
|
+
document = invocation.load_input() or {}
|
|
1139
|
+
panel = _require_field(document, "panel")
|
|
1140
|
+
with open_service(invocation) as (service, auth):
|
|
1141
|
+
dataset_id = _verified_dataset_id(service, invocation, dataview_id, document)
|
|
1142
|
+
data = service.call(
|
|
1143
|
+
_symbol(invocation),
|
|
1144
|
+
dataset_id=dataset_id,
|
|
1145
|
+
dataview_id=dataview_id,
|
|
1146
|
+
panel=panel,
|
|
1147
|
+
project_id=project_id,
|
|
1148
|
+
)
|
|
1149
|
+
return data, _meta(invocation, auth.workspace_id, project_id)
|
|
1150
|
+
|
|
1151
|
+
|
|
1076
1152
|
def _untyped_patch_error(invocation: Invocation) -> CliError:
|
|
1077
1153
|
"""The refusal for a view patch that is not the typed rename."""
|
|
1078
1154
|
return CliError(
|