mammoth-cli 2.0.83__tar.gz → 2.0.85__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.0.83 → mammoth_cli-2.0.85}/PKG-INFO +2 -2
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/app.py +18 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -2
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +2 -2
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +2 -2
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +1 -11
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +6 -4
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +5 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/billing.py +2 -13
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/job.py +35 -6
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/registry.py +0 -1
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/embed.py +20 -1
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/executor.py +12 -3
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/invocation.py +4 -3
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/session.py +8 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/state.py +1 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/command_contract.py +3 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/mapping.py +88 -2
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/sdk_service.py +5 -2
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/pyproject.toml +2 -2
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/billing.yaml +1 -42
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/openapi-operations.yaml +10 -10
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/sdk-catalog.source.yaml +0 -7
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/sdk-methods.yaml +3 -15
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/.gitignore +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/LICENSE +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/README.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/schema.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/view.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/input_fields.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/view.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/openapi/openapi.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mammoth-cli
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.85
|
|
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.8,>=0.7.
|
|
20
|
+
Requires-Dist: mammoth-io<0.8,>=0.7.39
|
|
21
21
|
Requires-Dist: platformdirs<5,>=4.10
|
|
22
22
|
Requires-Dist: pydantic<3,>=2.12.5
|
|
23
23
|
Requires-Dist: pyyaml<7,>=6
|
|
@@ -579,6 +579,24 @@ def _shared_option_params() -> list[inspect.Parameter]:
|
|
|
579
579
|
),
|
|
580
580
|
],
|
|
581
581
|
),
|
|
582
|
+
opt(
|
|
583
|
+
"return_running",
|
|
584
|
+
False,
|
|
585
|
+
Annotated[
|
|
586
|
+
bool,
|
|
587
|
+
typer.Option(
|
|
588
|
+
"--return-running",
|
|
589
|
+
help=(
|
|
590
|
+
"When a job or pipeline wait runs out, exit 0 with "
|
|
591
|
+
"{status: running, job_id or dataview_id, resume} instead of a "
|
|
592
|
+
"timeout error; resume with 'mammoth job wait JOB_ID' "
|
|
593
|
+
"(reports success, failure or still running; waits at most "
|
|
594
|
+
"15 minutes by default)."
|
|
595
|
+
),
|
|
596
|
+
rich_help_panel="Context and timeouts",
|
|
597
|
+
),
|
|
598
|
+
],
|
|
599
|
+
),
|
|
582
600
|
opt(
|
|
583
601
|
"pipeline_timeout",
|
|
584
602
|
None,
|
|
@@ -47,8 +47,6 @@ Ran once: `billing.stripe.history`, `billing.stripe.payment-method.list`, `billi
|
|
|
47
47
|
| Command | State | Note |
|
|
48
48
|
|---|---|---|
|
|
49
49
|
| `billing.chargebee-plan` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 4SUBS014 'Chargebee plan not found for the given workspace' (workspace 4 is n |
|
|
50
|
-
| `billing.invoice.get` | observed blocker | blocked_missing_fixture: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: billing invoice list answered HTTP 500, so no invoice id was observed |
|
|
51
|
-
| `billing.invoice.list` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 500 with empty body on GET /workspaces/4/subscription_v1/invoices |
|
|
52
50
|
| `billing.stripe.preview-invoice` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 4SUBS037 'Failed to perform subscription operation' |
|
|
53
51
|
| `billing.stripe.upcoming-invoice` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 4SUBS074 'Upcoming invoice not found' (no active Stripe subscription on works |
|
|
54
52
|
| `billing.stripe.usage` | observed blocker | backend_error: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: HTTP 400 5GENR010 UNKNOWN_ERROR 'Unknown error occurred |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# What is proven on release
|
|
2
2
|
|
|
3
3
|
Generated from `docs/release-capability-matrix.json`; do not edit by hand.
|
|
4
|
-
The CLI publishes
|
|
4
|
+
The CLI publishes 573 commands. 453 of them bind one of the 528 API operations in the matrix; the remainder are local commands (`schema`, `auth`, `doctor`, `log`, ...) or typed variants that share an operation (`view transform *` commands submit through `view.task.add`, except `rename-columns` and `sort`, which set view display properties through `view.update`). 262 bound commands ran once successfully on release, 2 are not supported there, and the rest are untried. Untried is not broken: discover the contract with `mammoth schema get COMMAND_ID`, run it, and treat the structured error envelope as the answer.
|
|
5
5
|
|
|
6
6
|
Status meanings:
|
|
7
7
|
|
|
@@ -20,8 +20,8 @@ The typed `view transform *` commands all submit through `view.task.add` (`renam
|
|
|
20
20
|
| `dashboard` | 104 | 81 | 2 | 21 |
|
|
21
21
|
| `view` | 62 | 58 | 0 | 4 |
|
|
22
22
|
| `support` | 45 | 9 | 0 | 36 |
|
|
23
|
-
| `billing` | 23 | 4 | 0 | 19 |
|
|
24
23
|
| `connector` | 22 | 3 | 0 | 19 |
|
|
24
|
+
| `billing` | 21 | 4 | 0 | 17 |
|
|
25
25
|
| `workspace` | 19 | 7 | 0 | 12 |
|
|
26
26
|
| `project` | 17 | 15 | 0 | 2 |
|
|
27
27
|
| `workflow` | 16 | 9 | 0 | 7 |
|
|
@@ -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 573; 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
|
|
|
@@ -12,7 +12,7 @@ Load only the applicable domain file:
|
|
|
12
12
|
- [auth](commands/auth.md) — 3 published commands
|
|
13
13
|
- [automation](commands/automation.md) — 7 published commands
|
|
14
14
|
- [batch](commands/batch.md) — 7 published commands
|
|
15
|
-
- [billing](commands/billing.md) —
|
|
15
|
+
- [billing](commands/billing.md) — 22 published commands
|
|
16
16
|
- [browse](commands/browse.md) — 4 published commands
|
|
17
17
|
- [calc](commands/calc.md) — 1 published commands
|
|
18
18
|
- [capability](commands/capability.md) — 3 published commands
|
|
@@ -32,16 +32,6 @@ Result: `BillingInvoiceChargeResult`; mutation `high_impact`, confirmation `conf
|
|
|
32
32
|
|
|
33
33
|
Status on release: untried; no live run recorded.
|
|
34
34
|
|
|
35
|
-
### `billing.invoice.get`
|
|
36
|
-
|
|
37
|
-
Run: `mammoth billing invoice get`. Exact input fields: `mammoth schema get billing.invoice.get`.
|
|
38
|
-
|
|
39
|
-
Example: `mammoth billing invoice get 123`. Placeholders are illustrative; resolve IDs and input from observed reads.
|
|
40
|
-
|
|
41
|
-
Result: `BillingInvoiceGetResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
42
|
-
|
|
43
|
-
Status on release: observed blocker — blocked_missing_fixture: The CLI gates this GET behind --yes --confirm WORKSPACE_ID; with confirmation: billing invoice list answered HTTP 500, so no invoice id was observed. Re-check before relying on it.
|
|
44
|
-
|
|
45
35
|
### `billing.invoice.list`
|
|
46
36
|
|
|
47
37
|
Run: `mammoth billing invoice list`. Exact input fields: `mammoth schema get billing.invoice.list`.
|
|
@@ -50,7 +40,7 @@ Example: `mammoth billing invoice list`. Placeholders are illustrative; resolve
|
|
|
50
40
|
|
|
51
41
|
Result: `BillingInvoiceListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
52
42
|
|
|
53
|
-
Status on release:
|
|
43
|
+
Status on release: untried; no live run recorded.
|
|
54
44
|
|
|
55
45
|
### `billing.stripe.cancel`
|
|
56
46
|
|
|
@@ -76,7 +76,9 @@ Status on release: untried; no live run recorded.
|
|
|
76
76
|
|
|
77
77
|
Run: `mammoth connector connection create`. Exact input fields: `mammoth schema get connector.connection.create`.
|
|
78
78
|
|
|
79
|
-
Example: `mammoth connector connection create sample --input
|
|
79
|
+
Example: `mammoth connector connection create sample --input /private/path/request.json`. Illustrative only: append `--yes` after observing an owned target.
|
|
80
|
+
|
|
81
|
+
Secret fields: pass the body as `--input FILE` (mode 0600); never inline.
|
|
80
82
|
|
|
81
83
|
Result: `ConnectorConnectionCreateResult`; mutation `external_effect`, confirmation `yes_always`, wait policy `not_async`.
|
|
82
84
|
|
|
@@ -116,7 +118,9 @@ Status on release: observed blocker — server_error: see sweep report. Re-check
|
|
|
116
118
|
|
|
117
119
|
Run: `mammoth connector connection update`. Exact input fields: `mammoth schema get connector.connection.update`.
|
|
118
120
|
|
|
119
|
-
Example: `mammoth connector connection update sample sample --input
|
|
121
|
+
Example: `mammoth connector connection update sample sample --input /private/path/request.json`. Illustrative only: append `--yes` after observing an owned target.
|
|
122
|
+
|
|
123
|
+
Secret fields: pass the body as `--input FILE` (mode 0600); never inline.
|
|
120
124
|
|
|
121
125
|
Result: `ConnectorConnectionUpdateResult`; mutation `external_effect`, confirmation `yes_always`, wait policy `not_async`.
|
|
122
126
|
|
|
@@ -200,8 +204,6 @@ Example: `mammoth connector list`. Placeholders are illustrative; resolve IDs an
|
|
|
200
204
|
|
|
201
205
|
Result: `ConnectorListResult`; mutation `read`, confirmation `none`, wait policy `not_async`.
|
|
202
206
|
|
|
203
|
-
`is_premium: true` with `is_added: false` means the connector must be enabled by Mammoth sales before this workspace can use it -- not that nobody has set it up yet. Such an item also carries `availability: "premium_not_enabled"` and an `availability_note` saying so. Tell the user why (premium, not enabled here) and offer to contact Mammoth sales; there is no CLI command that enables a premium connector or contacts sales on the user's behalf.
|
|
204
|
-
|
|
205
207
|
Status on release: ran once on CLI 2.0.18 — fixture-lifecycle sweep 2026-09-19: exit 0 on release with CLI 2.0.18. Listed 42 available connectors (name_key, disp_name, api_type, is_added, is_premium). Single invocation only.
|
|
206
208
|
|
|
207
209
|
### `connector.query.generate`
|
|
@@ -24,6 +24,11 @@ or wait that job — inspect it rather than submitting the original mutation.
|
|
|
24
24
|
The `--job-timeout` /
|
|
25
25
|
`--pipeline-timeout` options bound the wait.
|
|
26
26
|
|
|
27
|
+
With `--return-running` a wait that runs out exits 0 with `{status: running, job_id, resume}`
|
|
28
|
+
(`dataview_id` for a pipeline wait). `mammoth job wait JOB_ID` resumes: it returns
|
|
29
|
+
`{status: success, job_id, result}`, a `job_failed` error with the reason, or the running handle
|
|
30
|
+
again, and waits at most 15 minutes by default.
|
|
31
|
+
|
|
27
32
|
A transport failure during a mutation without a confirmed job/resource handle
|
|
28
33
|
is `outcome_unknown`. Re-read the exact target and scope before replaying it;
|
|
29
34
|
the operation may already have committed.
|
|
@@ -171,21 +171,10 @@ def billing_invoice_charge(invocation: Invocation) -> HandlerResult:
|
|
|
171
171
|
return data, _meta(invocation, auth.workspace_id, None)
|
|
172
172
|
|
|
173
173
|
|
|
174
|
-
def billing_invoice_get(invocation: Invocation) -> HandlerResult:
|
|
175
|
-
"""Get one invoice by id."""
|
|
176
|
-
invoice_id = _require_int_positional(invocation, "invoice id")
|
|
177
|
-
with open_service(invocation) as (service, auth):
|
|
178
|
-
data = service.call(_symbol(invocation), invoice_id=invoice_id)
|
|
179
|
-
return data, _meta(invocation, auth.workspace_id, None)
|
|
180
|
-
|
|
181
|
-
|
|
182
174
|
def billing_invoice_list(invocation: Invocation) -> HandlerResult:
|
|
183
|
-
"""List invoices for the workspace."""
|
|
184
|
-
document = _bound_document(invocation)
|
|
185
|
-
kwargs: dict[str, Any] = {}
|
|
186
|
-
_forward_optional(document, kwargs, ("limit", "sort"))
|
|
175
|
+
"""List invoices for the workspace (Stripe billing history)."""
|
|
187
176
|
with open_service(invocation) as (service, auth):
|
|
188
|
-
data = service.call(_symbol(invocation)
|
|
177
|
+
data = service.call(_symbol(invocation))
|
|
189
178
|
return data, _meta(invocation, auth.workspace_id, None)
|
|
190
179
|
|
|
191
180
|
|
|
@@ -30,6 +30,7 @@ from mammoth_cli.runtime.session import open_service
|
|
|
30
30
|
HandlerResult = tuple[Any, dict[str, Any]]
|
|
31
31
|
|
|
32
32
|
_WAIT_OPTIONAL = ("timeout", "poll_interval")
|
|
33
|
+
_DASHBOARD_WAIT_SYMBOL = "mammoth.api.dashboards.DashboardsAPI.wait_for_job_by_url"
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
def _symbol(invocation: Invocation) -> str:
|
|
@@ -127,20 +128,48 @@ def job_get_many(invocation: Invocation) -> HandlerResult:
|
|
|
127
128
|
return data, _meta(invocation, auth.workspace_id)
|
|
128
129
|
|
|
129
130
|
|
|
130
|
-
def
|
|
131
|
-
|
|
131
|
+
def _wait_call(
|
|
132
|
+
invocation: Invocation, document: dict[str, Any], kwargs: dict[str, Any]
|
|
133
|
+
) -> tuple[str, dict[str, Any]]:
|
|
134
|
+
"""The SDK symbol and arguments for one job wait.
|
|
135
|
+
|
|
136
|
+
A ``dashboard_url`` field switches to the URL-scoped wait: jobs dispatched
|
|
137
|
+
by published-dashboard routes are unreadable through ``GET /jobs/{id}``.
|
|
138
|
+
"""
|
|
139
|
+
if "dashboard_url" not in document:
|
|
140
|
+
return _symbol(invocation), kwargs
|
|
141
|
+
return _DASHBOARD_WAIT_SYMBOL, {**kwargs, "url": document["dashboard_url"]}
|
|
142
|
+
|
|
132
143
|
|
|
133
|
-
|
|
134
|
-
``
|
|
135
|
-
|
|
144
|
+
def _wait_result(job_id: int, job: Any) -> dict[str, Any]:
|
|
145
|
+
"""The ``job wait`` success payload: the job's response, plus what the job was."""
|
|
146
|
+
data: dict[str, Any] = {"status": "success", "job_id": job_id}
|
|
147
|
+
if isinstance(job, dict):
|
|
148
|
+
data.update({key: job[key] for key in ("operation", "path") if job.get(key) is not None})
|
|
149
|
+
data["result"] = job.get("response", job)
|
|
150
|
+
else:
|
|
151
|
+
data["result"] = job
|
|
152
|
+
return data
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def job_wait(invocation: Invocation) -> HandlerResult:
|
|
156
|
+
"""Wait for one job and report success, failure, or still running (15 min default).
|
|
157
|
+
|
|
158
|
+
The job id is a positional argument; optional ``timeout``, ``poll_interval``
|
|
159
|
+
and ``dashboard_url`` (a published dashboard's URL slug) fields are read from
|
|
160
|
+
the ``--input`` document. Success returns ``{status, job_id, result}``; a
|
|
161
|
+
failed job is a ``job_failed`` error with its reason; a wait that runs out is
|
|
162
|
+
a ``timeout`` error, or with ``--return-running`` ``{status: running, job_id,
|
|
163
|
+
resume}``.
|
|
136
164
|
"""
|
|
137
165
|
job_id = _require_int_positional(invocation, "job id")
|
|
138
166
|
document = invocation.load_input() or {}
|
|
139
167
|
kwargs: dict[str, Any] = {"job_id": job_id}
|
|
140
168
|
_forward_optional(document, kwargs, _WAIT_OPTIONAL)
|
|
169
|
+
symbol, kwargs = _wait_call(invocation, document, kwargs)
|
|
141
170
|
try:
|
|
142
171
|
with open_service(invocation) as (service, auth):
|
|
143
|
-
data = service.call(
|
|
172
|
+
data = _wait_result(job_id, service.call(symbol, **kwargs))
|
|
144
173
|
except KeyboardInterrupt as exc:
|
|
145
174
|
# Keep the explicit handle even when the polling implementation raises
|
|
146
175
|
# a bare SIGINT. A caller can inspect/resume it without replaying the
|
|
@@ -566,7 +566,6 @@ HANDLERS: dict[str, Handler] = {
|
|
|
566
566
|
"billing.chargebee-plan": billing_cmd.billing_chargebee_plan,
|
|
567
567
|
"billing.hosted-page": billing_cmd.billing_hosted_page,
|
|
568
568
|
"billing.invoice.charge": billing_cmd.billing_invoice_charge,
|
|
569
|
-
"billing.invoice.get": billing_cmd.billing_invoice_get,
|
|
570
569
|
"billing.invoice.list": billing_cmd.billing_invoice_list,
|
|
571
570
|
"billing.stripe.cancel": billing_cmd.billing_stripe_cancel,
|
|
572
571
|
"billing.stripe.checkout-url": billing_cmd.billing_stripe_checkout_url,
|
|
@@ -41,6 +41,8 @@ def invoke(
|
|
|
41
41
|
project_id: int | None = None,
|
|
42
42
|
timeout: float | None = None,
|
|
43
43
|
pipeline_timeout: float | None = None,
|
|
44
|
+
job_timeout: float | None = None,
|
|
45
|
+
return_running: bool = False,
|
|
44
46
|
) -> dict[str, Any]:
|
|
45
47
|
"""Run ``mammoth <args>`` as ``login`` and return its envelope.
|
|
46
48
|
|
|
@@ -54,12 +56,23 @@ def invoke(
|
|
|
54
56
|
``args`` already sets one.
|
|
55
57
|
pipeline_timeout: Pipeline wait timeout in seconds, sent as
|
|
56
58
|
``--pipeline-timeout`` unless ``args`` already sets one.
|
|
59
|
+
job_timeout: Job wait timeout in seconds, sent as ``--job-timeout``
|
|
60
|
+
unless ``args`` already sets one.
|
|
61
|
+
return_running: Send ``--return-running`` so a wait that runs out
|
|
62
|
+
returns a ``status: running`` handle instead of a timeout error.
|
|
57
63
|
|
|
58
64
|
Returns:
|
|
59
65
|
The success envelope (``data`` + ``meta``) or the error envelope
|
|
60
66
|
(``error``). A CLI error is returned, never raised.
|
|
61
67
|
"""
|
|
62
|
-
argv = _argv(
|
|
68
|
+
argv = _argv(
|
|
69
|
+
args,
|
|
70
|
+
project_id=project_id,
|
|
71
|
+
timeout=timeout,
|
|
72
|
+
pipeline_timeout=pipeline_timeout,
|
|
73
|
+
job_timeout=job_timeout,
|
|
74
|
+
return_running=return_running,
|
|
75
|
+
)
|
|
63
76
|
call = embedded.EmbeddedCall(login=login)
|
|
64
77
|
token = embedded.enter(call)
|
|
65
78
|
try:
|
|
@@ -77,6 +90,8 @@ def _argv(
|
|
|
77
90
|
project_id: int | None,
|
|
78
91
|
timeout: float | None,
|
|
79
92
|
pipeline_timeout: float | None,
|
|
93
|
+
job_timeout: float | None,
|
|
94
|
+
return_running: bool,
|
|
80
95
|
) -> list[str]:
|
|
81
96
|
"""``args`` plus the options an embedded call always runs with."""
|
|
82
97
|
argv = list(args)
|
|
@@ -86,6 +101,10 @@ def _argv(
|
|
|
86
101
|
argv += ["--timeout", str(timeout)]
|
|
87
102
|
if pipeline_timeout is not None and not _has_option(argv, "--pipeline-timeout"):
|
|
88
103
|
argv += ["--pipeline-timeout", str(pipeline_timeout)]
|
|
104
|
+
if job_timeout is not None and not _has_option(argv, "--job-timeout"):
|
|
105
|
+
argv += ["--job-timeout", str(job_timeout)]
|
|
106
|
+
if return_running and not _has_option(argv, "--return-running"):
|
|
107
|
+
argv.append("--return-running")
|
|
89
108
|
# Last, so they win over any output or input option in ``args``.
|
|
90
109
|
return [*argv, "--output", "json", "--no-input"]
|
|
91
110
|
|
|
@@ -24,7 +24,7 @@ from mammoth_cli.output.render import render
|
|
|
24
24
|
from mammoth_cli.runtime import embedded, updates
|
|
25
25
|
from mammoth_cli.runtime.invocation import Invocation
|
|
26
26
|
from mammoth_cli.runtime.runlog import RunLog
|
|
27
|
-
from mammoth_cli.services.mapping import map_sdk_exception
|
|
27
|
+
from mammoth_cli.services.mapping import map_sdk_exception, running_handle
|
|
28
28
|
|
|
29
29
|
Producer = Callable[[], tuple[Any, dict[str, Any]]]
|
|
30
30
|
|
|
@@ -193,8 +193,17 @@ def run(
|
|
|
193
193
|
emit_success(command_id, data, output, update_available=update, **meta_extra)
|
|
194
194
|
updates.emit_hint(update, output=output)
|
|
195
195
|
except CliError as error:
|
|
196
|
-
|
|
197
|
-
|
|
196
|
+
running = (
|
|
197
|
+
running_handle(error, command_id)
|
|
198
|
+
if invocation is not None and invocation.return_running
|
|
199
|
+
else None
|
|
200
|
+
)
|
|
201
|
+
if running is None:
|
|
202
|
+
fail(error)
|
|
203
|
+
raise typer.Exit(error.exit_status) from None
|
|
204
|
+
# --return-running: a wait that ran out is not a failure; hand back the
|
|
205
|
+
# handle to resume with.
|
|
206
|
+
emit_success(command_id, running, output, profile=profile)
|
|
198
207
|
except KeyboardInterrupt as exc:
|
|
199
208
|
# Polling can be interrupted after a job handle was observed. Keep
|
|
200
209
|
# that handle when an SDK exception exposes one; never turn Ctrl-C
|
|
@@ -53,6 +53,7 @@ class Invocation:
|
|
|
53
53
|
timeout: float | None = None
|
|
54
54
|
job_timeout: float | None = None
|
|
55
55
|
pipeline_timeout: float | None = None
|
|
56
|
+
return_running: bool = False
|
|
56
57
|
color: str = "auto"
|
|
57
58
|
no_input: bool = False
|
|
58
59
|
no_progress: bool = False
|
|
@@ -146,7 +147,7 @@ class Invocation:
|
|
|
146
147
|
continue
|
|
147
148
|
try:
|
|
148
149
|
value = float(raw)
|
|
149
|
-
except
|
|
150
|
+
except TypeError, ValueError:
|
|
150
151
|
continue
|
|
151
152
|
if value > 0:
|
|
152
153
|
object.__setattr__(self, key, value)
|
|
@@ -228,7 +229,7 @@ class Invocation:
|
|
|
228
229
|
resource_dataset = int(resource_dataset)
|
|
229
230
|
if resource_dataset <= 0:
|
|
230
231
|
raise ValueError
|
|
231
|
-
except
|
|
232
|
+
except TypeError, ValueError:
|
|
232
233
|
raise CliError(
|
|
233
234
|
code="invalid_resource_context",
|
|
234
235
|
message="Input field 'dataset_id' must be a positive integer.",
|
|
@@ -251,7 +252,7 @@ class Invocation:
|
|
|
251
252
|
expected_tasks = int(expected_tasks)
|
|
252
253
|
if expected_tasks < 0:
|
|
253
254
|
raise ValueError
|
|
254
|
-
except
|
|
255
|
+
except TypeError, ValueError:
|
|
255
256
|
raise CliError(
|
|
256
257
|
code="invalid_resource_context",
|
|
257
258
|
message=f"Input field '{TASK_COUNT_FIELD}' must be a non-negative integer.",
|
|
@@ -32,9 +32,17 @@ from mammoth_cli.services.protocol import MammothService
|
|
|
32
32
|
#: pass ``--timeout 300`` by hand. Reads keep the SDK default.
|
|
33
33
|
DEFAULT_MUTATION_JOB_TIMEOUT = 300.0
|
|
34
34
|
|
|
35
|
+
#: Wait budget for ``job wait`` / ``job wait-many`` when no timeout was given:
|
|
36
|
+
#: long enough for a big transform, and never unbounded, so a resuming agent
|
|
37
|
+
#: is always told the job's state (success, failure, or still running).
|
|
38
|
+
DEFAULT_JOB_WAIT_TIMEOUT = 900.0
|
|
39
|
+
_JOB_WAIT_COMMANDS = ("job.wait", "job.wait-many")
|
|
40
|
+
|
|
35
41
|
|
|
36
42
|
def default_job_timeout(command_id: str) -> float | None:
|
|
37
43
|
"""The job-wait timeout for ``command_id`` when none was configured."""
|
|
44
|
+
if command_id in _JOB_WAIT_COMMANDS:
|
|
45
|
+
return DEFAULT_JOB_WAIT_TIMEOUT
|
|
38
46
|
record = command_by_id(command_id) or {}
|
|
39
47
|
if record.get("mutation_class", "read") in (None, "read"):
|
|
40
48
|
return None
|
|
@@ -187,6 +187,7 @@ def _read_invocation(command_id: str, resolved_ids: dict[str, Any], base: Invoca
|
|
|
187
187
|
timeout=base.timeout,
|
|
188
188
|
job_timeout=base.job_timeout,
|
|
189
189
|
pipeline_timeout=base.pipeline_timeout,
|
|
190
|
+
return_running=base.return_running,
|
|
190
191
|
no_input=True,
|
|
191
192
|
positionals=positionals,
|
|
192
193
|
extra_args=extra_args,
|
|
@@ -603,6 +603,9 @@ S7_COMMANDS = frozenset(
|
|
|
603
603
|
# admission, and handler binding agree instead of treating every arbitrary
|
|
604
604
|
# keyword as valid.
|
|
605
605
|
_S7_ADDITIONAL_INPUT_FIELDS: dict[str, tuple[FieldSpec, ...]] = {
|
|
606
|
+
# Published-dashboard jobs are readable only through the URL-scoped job
|
|
607
|
+
# route; ``job wait`` polls it when the dashboard URL slug is given.
|
|
608
|
+
"job.wait": (FieldSpec("dashboard_url", required=False, annotation=str | None, default=None),),
|
|
606
609
|
# The GET data route has no server-side page size; the CLI trims the row
|
|
607
610
|
# list so a read-back costs a screen of tokens, not the whole view.
|
|
608
611
|
"view.data.get": (
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
import re
|
|
6
7
|
import shlex
|
|
7
8
|
from typing import Any
|
|
@@ -13,6 +14,7 @@ from mammoth.exceptions import (
|
|
|
13
14
|
MammothError,
|
|
14
15
|
MammothJobFailedError,
|
|
15
16
|
MammothJobTimeoutError,
|
|
17
|
+
MammothPipelineTimeoutError,
|
|
16
18
|
MammothValidationError,
|
|
17
19
|
safe_response_body,
|
|
18
20
|
)
|
|
@@ -107,6 +109,23 @@ def _job_recovery(job_id: object, *, profile: str | None = None) -> list[str]:
|
|
|
107
109
|
]
|
|
108
110
|
|
|
109
111
|
|
|
112
|
+
def _pipeline_recovery(exc: MammothPipelineTimeoutError, *, profile: str | None) -> list[str]:
|
|
113
|
+
scope = f" --project {exc.project_id}" if exc.project_id is not None else ""
|
|
114
|
+
scope += f" --profile {shlex.quote(profile)}" if profile else ""
|
|
115
|
+
return [
|
|
116
|
+
f"mammoth view pipeline get {exc.dataview_id}{scope}",
|
|
117
|
+
f"mammoth view pipeline wait {exc.dataview_id}{scope}",
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _observed_job_fields(details: dict[str, Any]) -> dict[str, Any]:
|
|
122
|
+
"""The ``operation``/``path`` of the last observed job, when the server sent them."""
|
|
123
|
+
observed = details.get("observed_job")
|
|
124
|
+
if not isinstance(observed, dict):
|
|
125
|
+
return {}
|
|
126
|
+
return {key: observed[key] for key in ("operation", "path") if observed.get(key) is not None}
|
|
127
|
+
|
|
128
|
+
|
|
110
129
|
_PROJECT_DELETE = re.compile(r"/workspaces/\d+/projects/(\d+)/?$")
|
|
111
130
|
_DASHBOARD_WRITE = re.compile(r"/dashboards/(\d+)(?:/|$)")
|
|
112
131
|
_ENDPOINT_WORKSPACE = re.compile(r"/workspaces/(\d+)")
|
|
@@ -168,6 +187,49 @@ def _resource_recovery(
|
|
|
168
187
|
return []
|
|
169
188
|
|
|
170
189
|
|
|
190
|
+
def with_dashboard_scope(error: CliError, dashboard_url: str) -> CliError:
|
|
191
|
+
"""Point a timed-out published-dashboard job's recovery at the URL-scoped route.
|
|
192
|
+
|
|
193
|
+
``GET /jobs/{id}`` answers ``4PERM002`` for these jobs, so the generic
|
|
194
|
+
``job get``/``job wait`` recovery would fail; ``job wait`` takes the
|
|
195
|
+
dashboard URL as an ``--input`` field and polls the URL-scoped route.
|
|
196
|
+
"""
|
|
197
|
+
job_id = error.details.get("job_id")
|
|
198
|
+
if error.code != "timeout" or job_id is None:
|
|
199
|
+
return error
|
|
200
|
+
document = shlex.quote(json.dumps({"dashboard_url": dashboard_url}))
|
|
201
|
+
error.details["resume"] = f"mammoth job wait {job_id} --input {document}"
|
|
202
|
+
error.recovery_commands = [
|
|
203
|
+
f"mammoth dashboard job-by-url {shlex.quote(dashboard_url)} {job_id}",
|
|
204
|
+
error.details["resume"],
|
|
205
|
+
]
|
|
206
|
+
return error
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def running_handle(error: CliError, command_id: str) -> dict[str, Any] | None:
|
|
210
|
+
"""The ``status: running`` payload for a wait that ran out, else ``None``.
|
|
211
|
+
|
|
212
|
+
Used by ``--return-running``: a job wait or pipeline wait that timed out is
|
|
213
|
+
not a failure, so the caller gets the handle to resume with instead.
|
|
214
|
+
"""
|
|
215
|
+
details = error.details
|
|
216
|
+
if error.code != "timeout" or "resume" not in details:
|
|
217
|
+
return None
|
|
218
|
+
if details.get("phase") == "pipeline" and "dataview_id" in details:
|
|
219
|
+
handle: dict[str, Any] = {"dataview_id": details["dataview_id"]}
|
|
220
|
+
elif "job_id" in details:
|
|
221
|
+
handle = {"job_id": details["job_id"], **_observed_job_fields(details)}
|
|
222
|
+
else:
|
|
223
|
+
return None
|
|
224
|
+
return {
|
|
225
|
+
"status": "running",
|
|
226
|
+
**handle,
|
|
227
|
+
"command": command_id,
|
|
228
|
+
"waited_seconds": details.get("waited_seconds"),
|
|
229
|
+
"resume": details["resume"],
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
|
|
171
233
|
def map_sdk_exception(
|
|
172
234
|
exc: BaseException,
|
|
173
235
|
*,
|
|
@@ -206,6 +268,21 @@ def map_sdk_exception(
|
|
|
206
268
|
recovery_commands=["mammoth auth login"],
|
|
207
269
|
)
|
|
208
270
|
|
|
271
|
+
if isinstance(exc, MammothPipelineTimeoutError):
|
|
272
|
+
recovery = _pipeline_recovery(exc, profile=profile)
|
|
273
|
+
details = dict(exc.details)
|
|
274
|
+
details["waited_seconds"] = details.get("timeout")
|
|
275
|
+
details["resume"] = recovery[1]
|
|
276
|
+
return CliError(
|
|
277
|
+
code="timeout",
|
|
278
|
+
message="The view pipeline did not finish before the timeout.",
|
|
279
|
+
exit_status=EXIT_RETRYABLE,
|
|
280
|
+
hint="No job is involved; read the view's pipeline state and wait for it to finish.",
|
|
281
|
+
details=details,
|
|
282
|
+
retryable=True,
|
|
283
|
+
recovery_commands=recovery,
|
|
284
|
+
)
|
|
285
|
+
|
|
209
286
|
if isinstance(exc, MammothJobTimeoutError):
|
|
210
287
|
job_id = getattr(exc, "job_handle", None) or getattr(exc, "job_id", None)
|
|
211
288
|
details = dict(getattr(exc, "details", {}) or {})
|
|
@@ -213,6 +290,10 @@ def map_sdk_exception(
|
|
|
213
290
|
details.setdefault("job_id", job_id)
|
|
214
291
|
details.setdefault("operation_state", "running")
|
|
215
292
|
details.setdefault("phase", getattr(exc, "phase", None) or "polling")
|
|
293
|
+
details.update(_observed_job_fields(details))
|
|
294
|
+
details["waited_seconds"] = details.get("timeout")
|
|
295
|
+
if job_id is not None:
|
|
296
|
+
details["resume"] = _job_recovery(job_id, profile=profile)[1]
|
|
216
297
|
return CliError(
|
|
217
298
|
code="timeout",
|
|
218
299
|
message="The operation did not finish before the timeout.",
|
|
@@ -226,13 +307,18 @@ def map_sdk_exception(
|
|
|
226
307
|
if isinstance(exc, MammothJobFailedError):
|
|
227
308
|
details = dict(getattr(exc, "details", {}) or {})
|
|
228
309
|
job_id = getattr(exc, "job_handle", None) or getattr(exc, "job_id", None)
|
|
310
|
+
details["status"] = "failure"
|
|
311
|
+
details["reason"] = details.get("failure_reason") or "no reason recorded by the job"
|
|
312
|
+
details.update(_observed_job_fields(details))
|
|
229
313
|
return CliError(
|
|
230
314
|
code=CODE_JOB_FAILED,
|
|
231
|
-
message="The Mammoth job failed
|
|
315
|
+
message=f"The Mammoth job failed: {details['reason']}",
|
|
232
316
|
exit_status=EXIT_API,
|
|
233
317
|
hint="Inspect the job response for the failure reason.",
|
|
234
318
|
details=details,
|
|
235
|
-
recovery_commands=
|
|
319
|
+
recovery_commands=(
|
|
320
|
+
_job_recovery(job_id, profile=profile)[:1] if job_id is not None else []
|
|
321
|
+
),
|
|
236
322
|
)
|
|
237
323
|
|
|
238
324
|
if isinstance(exc, MammothAPIError):
|
|
@@ -32,7 +32,7 @@ from mammoth_cli.runtime import parents
|
|
|
32
32
|
from mammoth_cli.services.coerce import coerce_arguments
|
|
33
33
|
from mammoth_cli.services.conditions import CONDITION_KWARG, compile_condition
|
|
34
34
|
from mammoth_cli.services.dispatch import resolve_sdk_method
|
|
35
|
-
from mammoth_cli.services.mapping import map_sdk_exception
|
|
35
|
+
from mammoth_cli.services.mapping import map_sdk_exception, with_dashboard_scope
|
|
36
36
|
|
|
37
37
|
#: Largest ``limit`` the projects route accepts (``4GENR007`` above it).
|
|
38
38
|
_PROJECT_MISS = re.compile(r"^Project (ID \d+|'.*') not found\.")
|
|
@@ -284,7 +284,10 @@ class SdkMammothService:
|
|
|
284
284
|
fetch=lambda job_id, _remaining: dashboards.job_by_url(dashboard_url, job_id),
|
|
285
285
|
)
|
|
286
286
|
except Exception as exc:
|
|
287
|
-
|
|
287
|
+
mapped = map_sdk_exception(exc)
|
|
288
|
+
if dashboard_url is not None:
|
|
289
|
+
mapped = with_dashboard_scope(mapped, dashboard_url)
|
|
290
|
+
raise mapped from exc
|
|
288
291
|
|
|
289
292
|
def call_view(
|
|
290
293
|
self,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mammoth-cli"
|
|
3
|
-
version = "2.0.
|
|
3
|
+
version = "2.0.85"
|
|
4
4
|
description = "Command-line interface for the Mammoth Analytics platform"
|
|
5
5
|
authors = [{name = "Mammoth Analytics", email = "support@mammoth.io"}]
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = "LicenseRef-Proprietary"
|
|
8
8
|
requires-python = ">=3.12,<3.15"
|
|
9
9
|
dependencies = [
|
|
10
|
-
"mammoth-io (>=0.7.
|
|
10
|
+
"mammoth-io (>=0.7.39,<0.8)",
|
|
11
11
|
"typer (>=0.27,<0.28)",
|
|
12
12
|
"rich (>=15,<16)",
|
|
13
13
|
"platformdirs (>=4.10,<5)",
|