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.
Files changed (236) hide show
  1. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/PKG-INFO +2 -2
  2. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/__init__.py +1 -1
  3. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/app.py +18 -0
  4. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities-misc.md +0 -2
  5. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/capabilities.md +2 -2
  6. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/command-index.md +2 -2
  7. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/billing.md +1 -11
  8. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/connector.md +6 -4
  9. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/jobs-drafts.md +5 -0
  10. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/billing.py +2 -13
  11. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/job.py +35 -6
  12. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/registry.py +0 -1
  13. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/embed.py +20 -1
  14. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/executor.py +12 -3
  15. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/invocation.py +4 -3
  16. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/session.py +8 -0
  17. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/state.py +1 -0
  18. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/command_contract.py +3 -0
  19. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/mapping.py +88 -2
  20. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/sdk_service.py +5 -2
  21. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/pyproject.toml +2 -2
  22. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/billing.yaml +1 -42
  23. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/openapi-operations.yaml +10 -10
  24. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/sdk-catalog.source.yaml +0 -7
  25. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/sdk-methods.yaml +3 -15
  26. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/.gitignore +0 -0
  27. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/LICENSE +0 -0
  28. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/README.md +0 -0
  29. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/__main__.py +0 -0
  30. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/SKILL.md +0 -0
  31. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/about-mammoth.md +0 -0
  32. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/auth.md +0 -0
  33. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/activity.md +0 -0
  34. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/addon.md +0 -0
  35. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/agent.md +0 -0
  36. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/ai.md +0 -0
  37. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/annotation.md +0 -0
  38. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/auth.md +0 -0
  39. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/automation.md +0 -0
  40. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/batch.md +0 -0
  41. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/browse.md +0 -0
  42. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/calc.md +0 -0
  43. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/capability.md +0 -0
  44. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/client-app.md +0 -0
  45. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/completion.md +0 -0
  46. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/config.md +0 -0
  47. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/context.md +0 -0
  48. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard-qa.md +0 -0
  49. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dashboard.md +0 -0
  50. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/data-app.md +0 -0
  51. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/dataset.md +0 -0
  52. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/doctor.md +0 -0
  53. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/external-key.md +0 -0
  54. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/file.md +0 -0
  55. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/folder.md +0 -0
  56. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/job.md +0 -0
  57. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/log.md +0 -0
  58. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/notification.md +0 -0
  59. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/parameter.md +0 -0
  60. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/project.md +0 -0
  61. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/report.md +0 -0
  62. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schedule.md +0 -0
  63. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/schema.md +0 -0
  64. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/skill.md +0 -0
  65. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/snippet.md +0 -0
  66. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/support.md +0 -0
  67. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/template.md +0 -0
  68. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/trash.md +0 -0
  69. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/upgrade.md +0 -0
  70. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/user.md +0 -0
  71. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/version.md +0 -0
  72. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view-transform.md +0 -0
  73. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/view.md +0 -0
  74. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/webhook.md +0 -0
  75. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workflow.md +0 -0
  76. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/commands/workspace.md +0 -0
  77. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/handoff.md +0 -0
  78. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/input.md +0 -0
  79. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/machine-output.md +0 -0
  80. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/operations.md +0 -0
  81. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/auth-scope.md +0 -0
  82. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/cleanup.md +0 -0
  83. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/dashboards.md +0 -0
  84. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/end-to-end.md +0 -0
  85. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/exports.md +0 -0
  86. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/index.md +0 -0
  87. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/need-action.md +0 -0
  88. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/resources.md +0 -0
  89. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/scheduling.md +0 -0
  90. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/transforms.md +0 -0
  91. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recipes/typed-etl-discovery.md +0 -0
  92. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/recovery.md +0 -0
  93. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/report-checklist.md +0 -0
  94. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/retention.md +0 -0
  95. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/safety.md +0 -0
  96. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/bundled_skill/mammoth-cli/references/task-start.md +0 -0
  97. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/__init__.py +0 -0
  98. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/activity.py +0 -0
  99. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/addon.py +0 -0
  100. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/agent.py +0 -0
  101. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/ai.py +0 -0
  102. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/annotation.py +0 -0
  103. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/auth.py +0 -0
  104. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/automation.py +0 -0
  105. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/batch.py +0 -0
  106. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/browse.py +0 -0
  107. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/calc.py +0 -0
  108. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/capability.py +0 -0
  109. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/client_app.py +0 -0
  110. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/completion.py +0 -0
  111. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/config.py +0 -0
  112. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/connector.py +0 -0
  113. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/context.py +0 -0
  114. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/dashboard.py +0 -0
  115. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/data_app.py +0 -0
  116. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/dataset.py +0 -0
  117. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/doctor.py +0 -0
  118. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/external_key.py +0 -0
  119. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/file.py +0 -0
  120. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/folder.py +0 -0
  121. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/notification.py +0 -0
  122. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/parameter.py +0 -0
  123. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/project.py +0 -0
  124. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/report.py +0 -0
  125. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/schedule.py +0 -0
  126. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/schema.py +0 -0
  127. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/skill.py +0 -0
  128. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/snippet.py +0 -0
  129. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/support.py +0 -0
  130. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/template.py +0 -0
  131. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/trash.py +0 -0
  132. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/upgrade.py +0 -0
  133. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/user.py +0 -0
  134. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/view.py +0 -0
  135. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/view_ops.py +0 -0
  136. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/webhook.py +0 -0
  137. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/workflow.py +0 -0
  138. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/commands/workspace.py +0 -0
  139. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/__init__.py +0 -0
  140. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/credentials.py +0 -0
  141. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/endpoint.py +0 -0
  142. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/profiles.py +0 -0
  143. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/context/resolver.py +0 -0
  144. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/contracts/__init__.py +0 -0
  145. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/contracts/auth.py +0 -0
  146. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/errors/__init__.py +0 -0
  147. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/errors/envelope.py +0 -0
  148. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/manifest/__init__.py +0 -0
  149. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/manifest/loader.py +0 -0
  150. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/messages/__init__.py +0 -0
  151. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/__init__.py +0 -0
  152. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/envelope.py +0 -0
  153. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/normalize.py +0 -0
  154. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/policy.py +0 -0
  155. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/progress.py +0 -0
  156. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/output/render.py +0 -0
  157. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/py.typed +0 -0
  158. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/__init__.py +0 -0
  159. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/confirm.py +0 -0
  160. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/dataset_health.py +0 -0
  161. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/dryrun.py +0 -0
  162. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/embedded.py +0 -0
  163. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/input_loader.py +0 -0
  164. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/new_data.py +0 -0
  165. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/options.py +0 -0
  166. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/parents.py +0 -0
  167. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/runlog.py +0 -0
  168. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/strict.py +0 -0
  169. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/updates.py +0 -0
  170. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/validate.py +0 -0
  171. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/runtime/verify.py +0 -0
  172. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/__init__.py +0 -0
  173. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/argspec.py +0 -0
  174. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/coerce.py +0 -0
  175. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/conditions.py +0 -0
  176. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/dashboard_pages.py +0 -0
  177. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/dashboard_review.py +0 -0
  178. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/data_quality.py +0 -0
  179. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/dispatch.py +0 -0
  180. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/factory.py +0 -0
  181. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/input_fields.py +0 -0
  182. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/openapi_types.py +0 -0
  183. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/positionals.py +0 -0
  184. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/protocol.py +0 -0
  185. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/testing.py +0 -0
  186. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/services/type_system.py +0 -0
  187. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/skills/__init__.py +0 -0
  188. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/skills/installer.py +0 -0
  189. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/skills/steering.py +0 -0
  190. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/mammoth_cli/testing.py +0 -0
  191. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/activity.yaml +0 -0
  192. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/addon.yaml +0 -0
  193. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/agent.yaml +0 -0
  194. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/ai.yaml +0 -0
  195. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/annotation.yaml +0 -0
  196. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/auth.yaml +0 -0
  197. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/automation.yaml +0 -0
  198. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/batch.yaml +0 -0
  199. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/browse.yaml +0 -0
  200. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/calc.yaml +0 -0
  201. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/capability.yaml +0 -0
  202. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/client-app.yaml +0 -0
  203. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/completion.yaml +0 -0
  204. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/config.yaml +0 -0
  205. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/connector.yaml +0 -0
  206. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/context.yaml +0 -0
  207. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/dashboard.yaml +0 -0
  208. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/data-app.yaml +0 -0
  209. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/dataset.yaml +0 -0
  210. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/doctor.yaml +0 -0
  211. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/external-key.yaml +0 -0
  212. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/file.yaml +0 -0
  213. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/folder.yaml +0 -0
  214. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/job.yaml +0 -0
  215. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/log.yaml +0 -0
  216. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/notification.yaml +0 -0
  217. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/parameter.yaml +0 -0
  218. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/project.yaml +0 -0
  219. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/report.yaml +0 -0
  220. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/schedule.yaml +0 -0
  221. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/schema.yaml +0 -0
  222. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/skill.yaml +0 -0
  223. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/snippet.yaml +0 -0
  224. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/support.yaml +0 -0
  225. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/template.yaml +0 -0
  226. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/trash.yaml +0 -0
  227. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/upgrade.yaml +0 -0
  228. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/user.yaml +0 -0
  229. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/version.yaml +0 -0
  230. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/view.yaml +0 -0
  231. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/webhook.yaml +0 -0
  232. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/workflow.yaml +0 -0
  233. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/commands/workspace.yaml +0 -0
  234. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/manifests/schema-v1.json +0 -0
  235. {mammoth_cli-2.0.83 → mammoth_cli-2.0.85}/spec/openapi/metadata.json +0 -0
  236. {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.83
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.37
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
@@ -6,7 +6,7 @@ not implement a second HTTP client and does not call private SDK members.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "2.0.83"
9
+ __version__ = "2.0.85"
10
10
 
11
11
  # The versioned machine output envelope contract.
12
12
  SCHEMA_VERSION = 1
@@ -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 567 commands. 455 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.
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 574; 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.
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) — 23 published commands
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: 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. Re-check before relying on it.
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 '{"config": {"sample_key": "Status"}}'`. Illustrative only: append `--yes` after observing an owned target.
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 '{"credentials": {"sample_key": "Status"}}'`. Illustrative only: append `--yes` after observing an owned target.
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), **kwargs)
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 job_wait(invocation: Invocation) -> HandlerResult:
131
- """Block until one job completes, or raise on failure/timeout.
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
- The job id is a positional argument; optional ``timeout`` and
134
- ``poll_interval`` fields are forwarded from the ``--input`` document when
135
- present.
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(_symbol(invocation), **kwargs)
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(args, project_id=project_id, timeout=timeout, pipeline_timeout=pipeline_timeout)
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
- fail(error)
197
- raise typer.Exit(error.exit_status) from None
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 (TypeError, ValueError):
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 (TypeError, ValueError):
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 (TypeError, ValueError):
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=_job_recovery(job_id, profile=profile) if job_id is not None else [],
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
- raise map_sdk_exception(exc) from exc
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.83"
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.37,<0.8)",
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)",