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