mammoth-cli 2.0.84__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.84 → mammoth_cli-2.0.85}/PKG-INFO +2 -2
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/__init__.py +1 -1
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/app.py +18 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +5 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/job.py +35 -6
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/embed.py +20 -1
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/executor.py +12 -3
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/invocation.py +4 -3
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/session.py +8 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/state.py +1 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/command_contract.py +3 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/mapping.py +88 -2
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/sdk_service.py +5 -2
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/pyproject.toml +2 -2
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/.gitignore +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/LICENSE +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/README.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/__main__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/activity.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/addon.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/agent.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/ai.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/annotation.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/auth.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/automation.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/batch.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/billing.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/browse.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/calc.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/capability.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/client_app.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/completion.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/config.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/connector.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/context.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/dashboard.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/data_app.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/dataset.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/doctor.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/external_key.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/file.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/folder.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/notification.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/parameter.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/project.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/registry.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/report.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/schedule.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/schema.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/skill.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/snippet.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/support.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/template.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/trash.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/upgrade.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/user.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/view.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/view_ops.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/webhook.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/workflow.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/commands/workspace.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/context/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/context/credentials.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/context/endpoint.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/context/profiles.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/context/resolver.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/contracts/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/contracts/auth.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/errors/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/errors/envelope.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/manifest/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/manifest/loader.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/messages/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/output/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/output/envelope.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/output/normalize.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/output/policy.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/output/progress.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/output/render.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/py.typed +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/confirm.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/dataset_health.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/dryrun.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/embedded.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/input_loader.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/new_data.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/options.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/parents.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/runlog.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/strict.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/updates.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/validate.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/runtime/verify.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/argspec.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/coerce.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/conditions.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/dashboard_pages.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/dashboard_review.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/data_quality.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/dispatch.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/factory.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/input_fields.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/openapi_types.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/positionals.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/protocol.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/testing.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/services/type_system.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/skills/__init__.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/skills/installer.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/skills/steering.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/testing.py +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/activity.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/addon.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/agent.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/ai.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/annotation.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/auth.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/automation.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/batch.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/billing.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/browse.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/calc.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/capability.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/client-app.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/completion.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/config.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/connector.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/context.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/dashboard.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/data-app.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/dataset.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/doctor.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/external-key.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/file.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/folder.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/job.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/log.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/notification.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/parameter.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/project.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/report.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/schedule.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/schema.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/skill.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/snippet.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/support.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/template.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/trash.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/upgrade.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/user.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/version.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/view.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/webhook.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/workflow.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/commands/workspace.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/openapi-operations.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/schema-v1.json +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/sdk-catalog.source.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/manifests/sdk-methods.yaml +0 -0
- {mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/spec/openapi/metadata.json +0 -0
- {mammoth_cli-2.0.84 → 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,
|
|
@@ -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.
|
|
@@ -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
|
|
@@ -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)",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mammoth_cli-2.0.84 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|