roar-cli 0.4.2__tar.gz → 0.4.3__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 (460) hide show
  1. {roar_cli-0.4.2 → roar_cli-0.4.3}/PKG-INFO +1 -1
  2. {roar_cli-0.4.2 → roar_cli-0.4.3}/pyproject.toml +1 -1
  3. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/put_execution.py +67 -4
  4. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/execution.py +2 -0
  5. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/requests.py +1 -0
  6. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/service.py +3 -0
  7. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/tags.py +12 -4
  8. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/run.py +16 -0
  9. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/run.py +3 -0
  10. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/job_recording.py +7 -3
  11. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/job_recording.py +1 -0
  12. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/coordinator.py +4 -0
  13. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/sitecustomize.py +11 -0
  14. roar_cli-0.4.3/roar/integrations/wandb_trackio.py +233 -0
  15. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/publish_auth.py +14 -1
  16. {roar_cli-0.4.2 → roar_cli-0.4.3}/LICENSE +0 -0
  17. {roar_cli-0.4.2 → roar_cli-0.4.3}/README.md +0 -0
  18. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/__init__.py +0 -0
  19. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/__main__.py +0 -0
  20. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/analyzers/__init__.py +0 -0
  21. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/analyzers/base.py +0 -0
  22. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/analyzers/experiment_trackers.py +0 -0
  23. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/__init__.py +0 -0
  24. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/__init__.py +0 -0
  25. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/canonical.py +0 -0
  26. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/detect.py +0 -0
  27. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/qualifying.py +0 -0
  28. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/__init__.py +0 -0
  29. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/requests.py +0 -0
  30. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/results.py +0 -0
  31. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/service.py +0 -0
  32. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/transfer.py +0 -0
  33. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/git.py +0 -0
  34. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/label_rendering.py +0 -0
  35. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/labels.py +0 -0
  36. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/__init__.py +0 -0
  37. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/models.py +0 -0
  38. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/policy.py +0 -0
  39. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/refs.py +0 -0
  40. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/remote_artifacts.py +0 -0
  41. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/runner.py +0 -0
  42. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/__init__.py +0 -0
  43. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/anchor_attribution.py +0 -0
  44. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/blake3_upgrade.py +0 -0
  45. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/collection.py +0 -0
  46. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/composite_builder.py +0 -0
  47. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/composites.py +0 -0
  48. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/datasets.py +0 -0
  49. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/form_composites.py +0 -0
  50. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/git_remote.py +0 -0
  51. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/job_links.py +0 -0
  52. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/job_preparation.py +0 -0
  53. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/lineage.py +0 -0
  54. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/lineage_composite_formation.py +0 -0
  55. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/lineage_composites.py +0 -0
  56. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/metadata.py +0 -0
  57. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/put_composites.py +0 -0
  58. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/put_preparation.py +0 -0
  59. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_execution.py +0 -0
  60. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_preparation.py +0 -0
  61. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_preview_jobs.py +0 -0
  62. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_tag_push.py +0 -0
  63. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/registration.py +0 -0
  64. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/registration_package.py +0 -0
  65. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/remote_job_uids.py +0 -0
  66. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/remote_registry.py +0 -0
  67. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/requests.py +0 -0
  68. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/results.py +0 -0
  69. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/runtime.py +0 -0
  70. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/secrets.py +0 -0
  71. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/service.py +0 -0
  72. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/session.py +0 -0
  73. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/source_resolution.py +0 -0
  74. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/targets.py +0 -0
  75. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/view_edges.py +0 -0
  76. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/__init__.py +0 -0
  77. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/dag.py +0 -0
  78. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/db_status.py +0 -0
  79. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff.py +0 -0
  80. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff_engine.py +0 -0
  81. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff_graph.py +0 -0
  82. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff_refs.py +0 -0
  83. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/git_readiness.py +0 -0
  84. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/inputs.py +0 -0
  85. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/label.py +0 -0
  86. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/lineage.py +0 -0
  87. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/log.py +0 -0
  88. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/requests.py +0 -0
  89. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/results.py +0 -0
  90. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/show.py +0 -0
  91. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/status.py +0 -0
  92. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/tag.py +0 -0
  93. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/__init__.py +0 -0
  94. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/environment.py +0 -0
  95. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/lookup.py +0 -0
  96. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/requests.py +0 -0
  97. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/results.py +0 -0
  98. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/service.py +0 -0
  99. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproducibility/__init__.py +0 -0
  100. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproducibility/report.py +0 -0
  101. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/__init__.py +0 -0
  102. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/dag_references.py +0 -0
  103. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/dirty_tree_classify.py +0 -0
  104. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/dirty_tree_error.py +0 -0
  105. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/gitignore_suggest.py +0 -0
  106. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/output_followup.py +0 -0
  107. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/verbosity.py +0 -0
  108. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/system_labels.py +0 -0
  109. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/__init__.py +0 -0
  110. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/requests.py +0 -0
  111. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/results.py +0 -0
  112. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/service.py +0 -0
  113. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/auth_store.py +0 -0
  114. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/__init__.py +0 -0
  115. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/__init__.py +0 -0
  116. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/attach.py +0 -0
  117. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/bundles.py +0 -0
  118. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/config.py +0 -0
  119. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/fragment_reconstituter.py +0 -0
  120. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/host_execution.py +0 -0
  121. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/lineage.py +0 -0
  122. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/manifest.py +0 -0
  123. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/mount_map.py +0 -0
  124. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/object_io.py +0 -0
  125. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/plugin.py +0 -0
  126. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/pod_entry.py +0 -0
  127. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/rayjob.py +0 -0
  128. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/secret_cleanup.py +0 -0
  129. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/submit.py +0 -0
  130. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/webhook.py +0 -0
  131. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/workload_wait.py +0 -0
  132. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/local/__init__.py +0 -0
  133. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/local/plugin.py +0 -0
  134. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/__init__.py +0 -0
  135. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/config.py +0 -0
  136. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/export.py +0 -0
  137. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/host_execution.py +0 -0
  138. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/lineage.py +0 -0
  139. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/plugin.py +0 -0
  140. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/runtime_bundle.py +0 -0
  141. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/submit.py +0 -0
  142. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/workflow.py +0 -0
  143. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/__init__.py +0 -0
  144. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/_agent_names.py +0 -0
  145. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/collector.py +0 -0
  146. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/config.py +0 -0
  147. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/constants.py +0 -0
  148. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/env_contract.py +0 -0
  149. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/fragment.py +0 -0
  150. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/fragment_reconstituter.py +0 -0
  151. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/node_agent.py +0 -0
  152. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/plugin.py +0 -0
  153. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/proxy_fragments.py +0 -0
  154. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/roar_worker.py +0 -0
  155. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/runtime_hooks.py +0 -0
  156. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/s3_key_paths.py +0 -0
  157. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/submit.py +0 -0
  158. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/submit_context.py +0 -0
  159. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/__init__.py +0 -0
  160. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/_format.py +0 -0
  161. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/_tag_kinds.py +0 -0
  162. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/command_registry.py +0 -0
  163. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/__init__.py +0 -0
  164. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/auth.py +0 -0
  165. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/build.py +0 -0
  166. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/config.py +0 -0
  167. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/dag.py +0 -0
  168. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/db.py +0 -0
  169. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/diff.py +0 -0
  170. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/env.py +0 -0
  171. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/export_registration_package.py +0 -0
  172. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/filter.py +0 -0
  173. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/get.py +0 -0
  174. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/init.py +0 -0
  175. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/init_agents.py +0 -0
  176. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/inputs.py +0 -0
  177. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/k8s.py +0 -0
  178. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/label.py +0 -0
  179. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/lineage.py +0 -0
  180. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/log.py +0 -0
  181. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/login.py +0 -0
  182. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/logout.py +0 -0
  183. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/osmo.py +0 -0
  184. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/pop.py +0 -0
  185. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/projects.py +0 -0
  186. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/proxy.py +0 -0
  187. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/put.py +0 -0
  188. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/register.py +0 -0
  189. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/reproduce.py +0 -0
  190. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/reset.py +0 -0
  191. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/scope.py +0 -0
  192. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/session.py +0 -0
  193. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/show.py +0 -0
  194. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/status.py +0 -0
  195. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/tag.py +0 -0
  196. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/telemetry.py +0 -0
  197. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/tracer.py +0 -0
  198. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/tui.py +0 -0
  199. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/whoami.py +0 -0
  200. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/workflow.py +0 -0
  201. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/context.py +0 -0
  202. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/decorators.py +0 -0
  203. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/publish_intent.py +0 -0
  204. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
  205. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
  206. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/__init__.py +0 -0
  207. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/bootstrap.py +0 -0
  208. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/canonical_session.py +0 -0
  209. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/digests.py +0 -0
  210. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/dto/__init__.py +0 -0
  211. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/dto/registration.py +0 -0
  212. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/exceptions.py +0 -0
  213. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/__init__.py +0 -0
  214. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/config.py +0 -0
  215. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/lineage.py +0 -0
  216. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/logger.py +0 -0
  217. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/presenter.py +0 -0
  218. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/provenance.py +0 -0
  219. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/registration.py +0 -0
  220. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/repositories.py +0 -0
  221. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/reproduction.py +0 -0
  222. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/run.py +0 -0
  223. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/services.py +0 -0
  224. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/telemetry.py +0 -0
  225. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/vcs.py +0 -0
  226. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/label_constants.py +0 -0
  227. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/label_origins.py +0 -0
  228. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/logging.py +0 -0
  229. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/__init__.py +0 -0
  230. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/artifact.py +0 -0
  231. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/base.py +0 -0
  232. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/dag.py +0 -0
  233. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/dataset_identifier.py +0 -0
  234. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/glaas.py +0 -0
  235. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/job.py +0 -0
  236. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/lineage.py +0 -0
  237. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/provenance.py +0 -0
  238. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/session.py +0 -0
  239. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/telemetry.py +0 -0
  240. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/vcs.py +0 -0
  241. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/operation_metadata.py +0 -0
  242. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/session_hash.py +0 -0
  243. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/step_name.py +0 -0
  244. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/tracer_modes.py +0 -0
  245. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/validation.py +0 -0
  246. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/__init__.py +0 -0
  247. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/context.py +0 -0
  248. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/engine.py +0 -0
  249. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/hashing/__init__.py +0 -0
  250. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/hashing/backend.py +0 -0
  251. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/hashing/blake3.py +0 -0
  252. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/models.py +0 -0
  253. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/query_context.py +0 -0
  254. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/__init__.py +0 -0
  255. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/artifact.py +0 -0
  256. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/collection.py +0 -0
  257. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/composite.py +0 -0
  258. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/hash_cache.py +0 -0
  259. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/job.py +0 -0
  260. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/label.py +0 -0
  261. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/session.py +0 -0
  262. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/schema.py +0 -0
  263. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/__init__.py +0 -0
  264. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/hashing.py +0 -0
  265. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/lineage.py +0 -0
  266. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/session.py +0 -0
  267. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/step_priority.py +0 -0
  268. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/__init__.py +0 -0
  269. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/__init__.py +0 -0
  270. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/bridge.py +0 -0
  271. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/proxy.py +0 -0
  272. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/proxy_config.py +0 -0
  273. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/__init__.py +0 -0
  274. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/export.py +0 -0
  275. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/lineage.py +0 -0
  276. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/models.py +0 -0
  277. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/reconstitution.py +0 -0
  278. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/sessions.py +0 -0
  279. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/transport.py +0 -0
  280. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/__init__.py +0 -0
  281. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/contract.py +0 -0
  282. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/planning.py +0 -0
  283. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/registry.py +0 -0
  284. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/runtime_imports.py +0 -0
  285. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/__init__.py +0 -0
  286. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/assembler.py +0 -0
  287. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/build_pip_collector.py +0 -0
  288. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/build_tool_collector.py +0 -0
  289. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/data_loader.py +0 -0
  290. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/file_filter.py +0 -0
  291. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/package_collector.py +0 -0
  292. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/process_summarizer.py +0 -0
  293. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/runtime_collector.py +0 -0
  294. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/service.py +0 -0
  295. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/__init__.py +0 -0
  296. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/dataset_identifier.py +0 -0
  297. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/dataset_metadata.py +0 -0
  298. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/dataset_profile.py +0 -0
  299. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/__init__.py +0 -0
  300. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/environment_setup.py +0 -0
  301. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/installers.py +0 -0
  302. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/pipeline_executor.py +0 -0
  303. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/pipeline_metadata.py +0 -0
  304. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/__init__.py +0 -0
  305. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/abi_probe.py +0 -0
  306. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/active_runs.py +0 -0
  307. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/backup.py +0 -0
  308. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/driver_entrypoint.py +0 -0
  309. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/errors.py +0 -0
  310. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/host_execution.py +0 -0
  311. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/__init__.py +0 -0
  312. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/support.py +0 -0
  313. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/tracker.py +0 -0
  314. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/lazy_install.py +0 -0
  315. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/proxy_resource.py +0 -0
  316. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/resources.py +0 -0
  317. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/signal_handler.py +0 -0
  318. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/tracer.py +0 -0
  319. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/tracer_backends.py +0 -0
  320. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/tracer_banner.py +0 -0
  321. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/worker_bootstrap.py +0 -0
  322. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/filters/__init__.py +0 -0
  323. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/filters/files.py +0 -0
  324. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/filters/omit.py +0 -0
  325. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/glaas_auth.py +0 -0
  326. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/glaas_client.py +0 -0
  327. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/__init__.py +0 -0
  328. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/bootstrap.py +0 -0
  329. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/__init__.py +0 -0
  330. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/access.py +0 -0
  331. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/loader.py +0 -0
  332. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/raw.py +0 -0
  333. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/schema.py +0 -0
  334. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/discovery.py +0 -0
  335. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/__init__.py +0 -0
  336. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/base.py +0 -0
  337. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/gcs.py +0 -0
  338. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/get.py +0 -0
  339. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/hf.py +0 -0
  340. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/http.py +0 -0
  341. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/noop.py +0 -0
  342. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/s3.py +0 -0
  343. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/__init__.py +0 -0
  344. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/base.py +0 -0
  345. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/context.py +0 -0
  346. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/provider.py +0 -0
  347. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/__init__.py +0 -0
  348. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/auth.py +0 -0
  349. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/client.py +0 -0
  350. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/fragment_streamer.py +0 -0
  351. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/__init__.py +0 -0
  352. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
  353. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/artifact.py +0 -0
  354. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/coordinator.py +0 -0
  355. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/job.py +0 -0
  356. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/session.py +0 -0
  357. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/transport.py +0 -0
  358. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/registry.py +0 -0
  359. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/resolution.py +0 -0
  360. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/__init__.py +0 -0
  361. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/base.py +0 -0
  362. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/gcs.py +0 -0
  363. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/hf.py +0 -0
  364. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/memory.py +0 -0
  365. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/noop.py +0 -0
  366. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/publish.py +0 -0
  367. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/s3.py +0 -0
  368. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/telemetry/__init__.py +0 -0
  369. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/telemetry/base.py +0 -0
  370. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/telemetry/wandb.py +0 -0
  371. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/__init__.py +0 -0
  372. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/console.py +0 -0
  373. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/dag_data_builder.py +0 -0
  374. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/dag_renderer.py +0 -0
  375. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/diff_renderer.py +0 -0
  376. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/formatting.py +0 -0
  377. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/null.py +0 -0
  378. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/run_report.py +0 -0
  379. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/show_renderer.py +0 -0
  380. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/spinner.py +0 -0
  381. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/terminal.py +0 -0
  382. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/require.py +0 -0
  383. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/scope_config.py +0 -0
  384. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/__init__.py +0 -0
  385. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/_io.py +0 -0
  386. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/capabilities.py +0 -0
  387. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/config.py +0 -0
  388. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/hooks.py +0 -0
  389. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/install.py +0 -0
  390. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/paths.py +0 -0
  391. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/payload.py +0 -0
  392. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/queue.py +0 -0
  393. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/stats.py +0 -0
  394. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/uploader.py +0 -0
  395. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/__init__.py +0 -0
  396. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/app.py +0 -0
  397. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/data.py +0 -0
  398. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/__init__.py +0 -0
  399. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/config_editor.py +0 -0
  400. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/label_editor.py +0 -0
  401. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/launcher.py +0 -0
  402. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/log.py +0 -0
  403. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/main.py +0 -0
  404. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/search.py +0 -0
  405. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/session_picker.py +0 -0
  406. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/tmux.py +0 -0
  407. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/widgets/__init__.py +0 -0
  408. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/widgets/detail.py +0 -0
  409. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/utils/__init__.py +0 -0
  410. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/utils/cloud.py +0 -0
  411. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/utils/git_url.py +0 -0
  412. {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/version_check.py +0 -0
  413. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/Cargo.lock +0 -0
  414. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/Cargo.toml +0 -0
  415. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
  416. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
  417. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-py/Cargo.toml +0 -0
  418. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-py/src/lib.rs +0 -0
  419. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-fd/Cargo.toml +0 -0
  420. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-fd/src/lib.rs +0 -0
  421. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-runtime/Cargo.toml +0 -0
  422. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-runtime/src/lib.rs +0 -0
  423. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-schema/Cargo.toml +0 -0
  424. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-schema/src/lib.rs +0 -0
  425. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/Cargo.lock +0 -0
  426. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/Cargo.toml +0 -0
  427. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/src/forward.rs +0 -0
  428. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/src/main.rs +0 -0
  429. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/src/s3.rs +0 -0
  430. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/common/Cargo.toml +0 -0
  431. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/common/src/lib.rs +0 -0
  432. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
  433. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
  434. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/probe/src/main.rs +0 -0
  435. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
  436. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/build.rs +0 -0
  437. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/attach.rs +0 -0
  438. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
  439. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
  440. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/daemon.rs +0 -0
  441. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/events.rs +0 -0
  442. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
  443. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
  444. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
  445. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/state.rs +0 -0
  446. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/Cargo.toml +0 -0
  447. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/build.rs +0 -0
  448. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
  449. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/interpose.c +0 -0
  450. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/ipc.rs +0 -0
  451. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/lib.rs +0 -0
  452. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/main.rs +0 -0
  453. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/tests/comprehensive.rs +0 -0
  454. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/tests/standalone.rs +0 -0
  455. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/Cargo.toml +0 -0
  456. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/rustfmt.toml +0 -0
  457. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/src/arch.rs +0 -0
  458. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/src/main.rs +0 -0
  459. {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/src/seccomp.rs +0 -0
  460. {roar_cli-0.4.2 → roar_cli-0.4.3}/scripts/sync_packaged_rust_artifacts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roar-cli
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -5,7 +5,7 @@ build-backend = "maturin"
5
5
 
6
6
  [project]
7
7
  name = "roar-cli"
8
- version = "0.4.2"
8
+ version = "0.4.3"
9
9
  description = "Reproducibility and provenance tracker for ML training pipelines"
10
10
  authors = [
11
11
  { name="TReqs Team", email="info@treqs.ai" }
@@ -34,6 +34,7 @@ from ...application.publish.remote_job_uids import (
34
34
  from ...application.publish.session import build_staged_lineage_counts
35
35
  from ...application.system_labels import refresh_job_system_labels
36
36
  from ...core.interfaces.registration import GitContext
37
+ from ...core.label_origins import LABEL_ORIGIN_SYSTEM
37
38
  from ...core.logging import get_logger
38
39
  from ...db.context import DatabaseContext
39
40
  from ...db.hashing import hash_files_blake3
@@ -309,6 +310,13 @@ class PutService:
309
310
  artifact_hashes = [u.hash for u in uploads]
310
311
  artifacts_info = [(u.artifact_id, u.local_path) for u in uploads]
311
312
 
313
+ # Record each uploaded artifact's distribution URL as a reserved system
314
+ # label, scoped to this publication, so GLaaS can surface it as the
315
+ # AI-BOM downloadLocation (see _set_publish_distribution_labels).
316
+ self._set_publish_distribution_labels(
317
+ uploads, normalize_registration_source_type(destination_type)
318
+ )
319
+
312
320
  self._logger.debug(
313
321
  "Upload complete: %d file(s), collecting lineage for hashes: %s",
314
322
  len(uploaded_files),
@@ -538,6 +546,7 @@ class PutService:
538
546
  job_uid=job_uid,
539
547
  remote_job_uid=job_uid,
540
548
  registration_errors=registration_result.errors,
549
+ uploads=uploads,
541
550
  )
542
551
 
543
552
  registration_error = (
@@ -810,6 +819,7 @@ class PutService:
810
819
  job_uid=job_uid,
811
820
  remote_job_uid=remote_put_job_uid,
812
821
  registration_errors=registration_errors,
822
+ uploads=uploads,
813
823
  )
814
824
 
815
825
  composite_result_items = [
@@ -958,8 +968,12 @@ class PutService:
958
968
  "size": size,
959
969
  "source_type": source_type,
960
970
  }
961
- if uploaded.remote_url:
962
- entry["source_url"] = uploaded.remote_url
971
+ # Deliberately do NOT record the upload destination as the artifact's
972
+ # global ``source_url`` here. That row is content-addressed and shared
973
+ # across orgs, so a per-publication URL would leak between tenants.
974
+ # The download location is published instead as a session-scoped
975
+ # ``roar.distribution.url`` label (see _set_publish_distribution_labels),
976
+ # which both the registration-session and this legacy inline path emit.
963
977
 
964
978
  payloads.append(entry)
965
979
 
@@ -1040,6 +1054,48 @@ class PutService:
1040
1054
  return False
1041
1055
  return True
1042
1056
 
1057
+ def _set_publish_distribution_labels(
1058
+ self,
1059
+ uploads: list[_UploadedArtifact],
1060
+ source_type: str | None,
1061
+ ) -> None:
1062
+ """Record each uploaded artifact's distribution URL as a reserved system
1063
+ label (``roar.distribution.url``), scoped to this publication.
1064
+
1065
+ GLaaS reads this as the artifact's AI-BOM ``downloadLocation``. Because
1066
+ the label lives on the ``(artifact, session)`` scope rather than the
1067
+ global content-addressed artifact row, two orgs publishing identical
1068
+ bytes each carry their own download location — no cross-tenant bleed.
1069
+ Gated on a recognized remote ``source_type`` so we never assert a
1070
+ distribution URL for a non-remote destination (e.g. ``memory://``).
1071
+ """
1072
+ if not source_type:
1073
+ return
1074
+ labels_repo = getattr(self._db, "labels", None)
1075
+ if labels_repo is None:
1076
+ return
1077
+ for uploaded in uploads:
1078
+ if not uploaded.remote_url or not uploaded.artifact_id:
1079
+ continue
1080
+ current = labels_repo.get_current("artifact", artifact_id=uploaded.artifact_id)
1081
+ metadata = current.get("metadata") if isinstance(current, dict) else None
1082
+ metadata = dict(metadata) if isinstance(metadata, dict) else {}
1083
+ roar_ns = metadata.get("roar")
1084
+ roar_ns = dict(roar_ns) if isinstance(roar_ns, dict) else {}
1085
+ distribution = roar_ns.get("distribution")
1086
+ distribution = dict(distribution) if isinstance(distribution, dict) else {}
1087
+ if distribution.get("url") == uploaded.remote_url:
1088
+ continue # already recorded — avoid a redundant label version
1089
+ distribution["url"] = uploaded.remote_url
1090
+ roar_ns["distribution"] = distribution
1091
+ metadata["roar"] = roar_ns
1092
+ labels_repo.create_version(
1093
+ "artifact",
1094
+ metadata,
1095
+ artifact_id=uploaded.artifact_id,
1096
+ write_origin=LABEL_ORIGIN_SYSTEM,
1097
+ )
1098
+
1043
1099
  def _sync_put_job_labels_with_glaas(
1044
1100
  self,
1045
1101
  *,
@@ -1049,15 +1105,22 @@ class PutService:
1049
1105
  job_uid: str,
1050
1106
  remote_job_uid: str,
1051
1107
  registration_errors: list[str],
1108
+ uploads: list[_UploadedArtifact] | None = None,
1052
1109
  ) -> None:
1053
- """Sync the local current label document for the publish-time put job."""
1110
+ """Sync the local current label document for the publish-time put job
1111
+ and its published artifacts (carrying ``roar.distribution.url``)."""
1112
+ artifacts = (
1113
+ [{"id": u.artifact_id, "hash": u.hash} for u in uploads if u.artifact_id and u.hash]
1114
+ if uploads
1115
+ else []
1116
+ )
1054
1117
  sync_publish_labels(
1055
1118
  glaas_client=glaas_client,
1056
1119
  db_ctx=self._db,
1057
1120
  session_id=None,
1058
1121
  session_hash=session_hash,
1059
1122
  jobs=[{"id": job_id, "job_uid": job_uid, "remote_job_uid": remote_job_uid}],
1060
- artifacts=[],
1123
+ artifacts=artifacts,
1061
1124
  errors=registration_errors,
1062
1125
  )
1063
1126
 
@@ -218,6 +218,7 @@ def execute_and_report(
218
218
  tracer_fallback: bool | None = None,
219
219
  block_tags: list[str] | None = None,
220
220
  add_tags: list[str] | None = None,
221
+ wandb_to_trackio: bool = False,
221
222
  ) -> ExecutionReport:
222
223
  """Execute command via selected backend and show the run report."""
223
224
  hash_algos = cast(list[Literal["blake3", "sha256", "sha512", "md5"]], hash_algorithms)
@@ -240,6 +241,7 @@ def execute_and_report(
240
241
  tracer_fallback=tracer_fallback,
241
242
  block_tags=block_tags or [],
242
243
  add_tags=add_tags or [],
244
+ wandb_to_trackio=wandb_to_trackio,
243
245
  )
244
246
 
245
247
  backend = get_execution_backend(backend_name)
@@ -19,6 +19,7 @@ class RunRequest:
19
19
  hash_algorithms: tuple[str, ...] = field(default_factory=tuple)
20
20
  block_tags: tuple[str, ...] = field(default_factory=tuple)
21
21
  add_tags: tuple[str, ...] = field(default_factory=tuple)
22
+ wandb_to_trackio: bool = False
22
23
 
23
24
 
24
25
  @dataclass(frozen=True)
@@ -64,6 +64,7 @@ def run_command(request: RunRequest) -> int:
64
64
  tracer_fallback=request.tracer_fallback,
65
65
  block_tags=list(request.block_tags),
66
66
  add_tags=list(request.add_tags),
67
+ wandb_to_trackio=request.wandb_to_trackio,
67
68
  )
68
69
 
69
70
 
@@ -112,6 +113,7 @@ def _execute_tracked_command(
112
113
  tracer_fallback: bool | None,
113
114
  block_tags: list[str] | None = None,
114
115
  add_tags: list[str] | None = None,
116
+ wandb_to_trackio: bool = False,
115
117
  ) -> int:
116
118
  resolved_config_start_dir = config_start_dir or _config_start_dir(roar_dir)
117
119
  try:
@@ -139,6 +141,7 @@ def _execute_tracked_command(
139
141
  tracer_fallback=tracer_fallback,
140
142
  block_tags=block_tags,
141
143
  add_tags=add_tags,
144
+ wandb_to_trackio=wandb_to_trackio,
142
145
  )
143
146
  )
144
147
  except Exception:
@@ -570,20 +570,26 @@ def parse_add_tags(pairs: Iterable[str]) -> dict[str, list[str]]:
570
570
 
571
571
 
572
572
  def build_run_modifiers(
573
- block_tags: Iterable[str], add_tags: Iterable[str]
574
- ) -> dict[str, list[str]] | None:
573
+ block_tags: Iterable[str],
574
+ add_tags: Iterable[str],
575
+ wandb_to_trackio: bool = False,
576
+ ) -> dict[str, Any] | None:
575
577
  """Build the ``run_modifiers`` metadata block, or None if there's nothing to record.
576
578
 
577
579
  Stores the raw flag strings verbatim (e.g. ``"license=GPL-3.0"``) so reproduce
578
- replays exactly what was passed.
580
+ replays exactly what was passed. ``wandb_to_trackio`` records that the run used
581
+ ``roar run --wandb-to-trackio`` so reproduce re-emits the flag (and the
582
+ reproduction's ``import wandb`` resolves the same way the original run's did).
579
583
  """
580
584
  blocks = [b.strip() for b in block_tags if b.strip()]
581
585
  adds = [a.strip() for a in add_tags if a.strip()]
582
- modifiers: dict[str, list[str]] = {}
586
+ modifiers: dict[str, Any] = {}
583
587
  if blocks:
584
588
  modifiers["block_tags"] = blocks
585
589
  if adds:
586
590
  modifiers["add_tags"] = adds
591
+ if wandb_to_trackio:
592
+ modifiers["wandb_to_trackio"] = True
587
593
  return modifiers or None
588
594
 
589
595
 
@@ -602,6 +608,8 @@ def run_modifier_flags(run_modifiers: Any) -> str:
602
608
  parts.append(f"--block-tag {shlex.quote(str(item))}")
603
609
  for item in run_modifiers.get("add_tags") or []:
604
610
  parts.append(f"--add-tag {shlex.quote(str(item))}")
611
+ if run_modifiers.get("wandb_to_trackio"):
612
+ parts.append("--wandb-to-trackio")
605
613
  return " ".join(parts)
606
614
 
607
615
 
@@ -84,6 +84,18 @@ def _validate_add_tags(
84
84
  callback=_validate_add_tags,
85
85
  help="Stamp KIND=VALUE onto this run's output artifacts (repeatable).",
86
86
  )
87
+ @click.option(
88
+ "--wandb-to-trackio",
89
+ "wandb_to_trackio",
90
+ is_flag=True,
91
+ default=False,
92
+ help=(
93
+ "Route an unmodified wandb-instrumented workload through trackio. Mirrors "
94
+ "to TRACKIO_SPACE_ID (with HF_TOKEN) when set, else runs wandb as a silent "
95
+ "no-op. Recorded so `roar reproduce` re-emits it — a reproducer needs no "
96
+ "wandb account or extra flags."
97
+ ),
98
+ )
87
99
  @click.pass_obj
88
100
  @require_init
89
101
  def run(
@@ -97,6 +109,7 @@ def run(
97
109
  hash_algorithms: tuple[str, ...],
98
110
  block_tags: tuple[str, ...],
99
111
  add_tags: tuple[str, ...],
112
+ wandb_to_trackio: bool,
100
113
  ) -> None:
101
114
  """Run a command with provenance tracking.
102
115
 
@@ -138,6 +151,7 @@ def run(
138
151
  hash_algorithms=tuple(hash_algorithms),
139
152
  block_tags=tuple(block_tags),
140
153
  add_tags=tuple(add_tags),
154
+ wandb_to_trackio=wandb_to_trackio,
141
155
  )
142
156
  )
143
157
  except ValueError as exc:
@@ -178,6 +192,8 @@ Options:
178
192
  -n, --name <name> Set the name label for this step
179
193
  --block-tag <kind[=value]> Stop a tag kind (or one value) from being inherited (repeatable)
180
194
  --add-tag <kind=value> Stamp a tag onto this run's outputs (repeatable)
195
+ --wandb-to-trackio Route unmodified wandb logging through trackio (mirrors to
196
+ TRACKIO_SPACE_ID when set, else a silent no-op); re-emitted by reproduce
181
197
 
182
198
  Hash algorithms: blake3 (default), sha256, sha512, md5
183
199
 
@@ -96,6 +96,9 @@ class RunContext(RoarBaseModel):
96
96
  git_repo: str | None = None
97
97
  block_tags: list[str] = Field(default_factory=list)
98
98
  add_tags: list[str] = Field(default_factory=list)
99
+ # `roar run --wandb-to-trackio`: activate the bundled wandb->trackio alias in
100
+ # the traced child (via ROAR_WANDB_TO_TRACKIO). Recorded so reproduce re-emits it.
101
+ wandb_to_trackio: bool = False
99
102
 
100
103
  @field_validator("roar_dir", mode="before")
101
104
  @classmethod
@@ -106,6 +106,7 @@ class JobRecordingService:
106
106
  hash_algorithms: list[str] | None = None,
107
107
  block_tags: tuple[str, ...] = (),
108
108
  add_tags: tuple[str, ...] = (),
109
+ wandb_to_trackio: bool = False,
109
110
  ) -> tuple[int, str]:
110
111
  """
111
112
  Record a job with its inputs and outputs.
@@ -173,7 +174,7 @@ class JobRecordingService:
173
174
  # Persist the roar-side run modifiers (--block-tag / --add-tag) on the job
174
175
  # metadata so `roar reproduce` can replay them; a bare re-run would
175
176
  # otherwise re-inherit blocked tags and drop stamped ones.
176
- metadata = self._with_run_modifiers(metadata, block_tags, add_tags)
177
+ metadata = self._with_run_modifiers(metadata, block_tags, add_tags, wandb_to_trackio)
177
178
 
178
179
  # Create the job record
179
180
  job_id, job_uid = self._job_repo.create(
@@ -252,10 +253,13 @@ class JobRecordingService:
252
253
 
253
254
  @staticmethod
254
255
  def _with_run_modifiers(
255
- metadata: str | None, block_tags: tuple[str, ...], add_tags: tuple[str, ...]
256
+ metadata: str | None,
257
+ block_tags: tuple[str, ...],
258
+ add_tags: tuple[str, ...],
259
+ wandb_to_trackio: bool = False,
256
260
  ) -> str | None:
257
261
  """Add a ``run_modifiers`` block to the job metadata JSON when flags were used."""
258
- modifiers = build_run_modifiers(block_tags, add_tags)
262
+ modifiers = build_run_modifiers(block_tags, add_tags, wandb_to_trackio)
259
263
  if modifiers is None:
260
264
  return metadata
261
265
  data: dict[str, Any] = {}
@@ -342,6 +342,7 @@ class ExecutionJobRecorder:
342
342
  hash_algorithms=list(ctx.hash_algorithms),
343
343
  block_tags=tuple(ctx.block_tags),
344
344
  add_tags=tuple(ctx.add_tags),
345
+ wandb_to_trackio=ctx.wandb_to_trackio,
345
346
  )
346
347
 
347
348
  # Register proxy artifacts first so downstream output/input queries include them.
@@ -137,6 +137,10 @@ class RunCoordinator:
137
137
  extra_env: dict[str, str] = {
138
138
  ROAR_EXECUTION_BACKEND_ENV: str(ctx.execution_backend),
139
139
  }
140
+ if ctx.wandb_to_trackio:
141
+ # Consumed by the injected child sitecustomize, which activates the
142
+ # bundled wandb->trackio alias before the workload imports wandb.
143
+ extra_env["ROAR_WANDB_TO_TRACKIO"] = "1"
140
144
  runtime_observations = RuntimeObservationBundle()
141
145
  resource_env = self._runtime_resources.start_all(ctx, os.environ)
142
146
  extra_env.update(resource_env)
@@ -131,4 +131,15 @@ if os.environ.get("ROAR_WRAP") == "1":
131
131
  )
132
132
 
133
133
 
134
+ if os.environ.get("ROAR_WANDB_TO_TRACKIO"):
135
+ # `roar run --wandb-to-trackio`: alias wandb -> trackio (or a silent no-op)
136
+ # before the workload imports wandb. Best-effort — never break the workload.
137
+ try:
138
+ with SuppressTracking():
139
+ from roar.integrations import wandb_trackio
140
+
141
+ wandb_trackio.install()
142
+ except Exception:
143
+ pass
144
+
134
145
  atexit.register(_runtime_tracker.write_log)
@@ -0,0 +1,233 @@
1
+ """Optional ``wandb`` -> ``trackio`` integration for ``roar run --wandb-to-trackio``.
2
+
3
+ Opt-in and workload-agnostic. It ships *inside* roar, so anyone who reproduces a
4
+ run gets it from ``pip install roar-cli`` — no separate package, nothing baked into
5
+ a machine image, and it never appears as an un-installable dependency in a captured
6
+ lineage.
7
+
8
+ Activated only when the env var ``ROAR_WANDB_TO_TRACKIO`` is set. The
9
+ ``roar run --wandb-to-trackio`` flag sets it to ``"1"``, and roar re-emits that flag
10
+ on ``roar reproduce`` (executor + ``--script``), so the toggle travels with the
11
+ recorded command. Set the env var to ``"off"`` to force the no-op even when a Space
12
+ is configured. roar's injected child ``sitecustomize`` calls :func:`install` before
13
+ the workload imports ``wandb``.
14
+
15
+ Two modes, chosen at run time from the environment — **no extra parameters**:
16
+
17
+ * **sync** — ``ROAR_WANDB_TO_TRACKIO != "off"`` and ``TRACKIO_SPACE_ID`` is set:
18
+ alias ``wandb`` to trackio and mirror the run to the hosted Space (needs
19
+ ``HF_TOKEN``). Project / run name / config come from the workload's own
20
+ ``wandb.init(...)`` call — nothing is passed through roar.
21
+ * **no-op** — ``ROAR_WANDB_TO_TRACKIO == "off"``, or no ``TRACKIO_SPACE_ID``, or
22
+ trackio isn't importable: alias ``wandb`` to a silent stub so an *unmodified*
23
+ wandb-instrumented repo imports and runs to completion with **no external
24
+ tracking and no credentials**. This is what a third-party reproducer gets by
25
+ default.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import sys
31
+
32
+ # wandb.init kwargs that trackio.init does not accept (dropped in sync mode).
33
+ _WANDB_ONLY_INIT = (
34
+ "entity",
35
+ "tags",
36
+ "reinit",
37
+ "group",
38
+ "job_type",
39
+ "notes",
40
+ "dir",
41
+ "mode",
42
+ "anonymous",
43
+ "magic",
44
+ "save_code",
45
+ "sync_tensorboard",
46
+ "monitor_gym",
47
+ "settings",
48
+ "id",
49
+ "allow_val_change",
50
+ "force",
51
+ "tensorboard",
52
+ )
53
+
54
+ # wandb surface trackio lacks; replaced with warn-once no-ops so the run completes.
55
+ _WANDB_NOOP_NAMES = (
56
+ "watch",
57
+ "unwatch",
58
+ "define_metric",
59
+ "save",
60
+ "restore",
61
+ "sweep",
62
+ "agent",
63
+ "log_artifact",
64
+ "use_artifact",
65
+ "log_model",
66
+ "use_model",
67
+ "mark_preempting",
68
+ "alert",
69
+ "login",
70
+ )
71
+ # wandb data-type constructors that show up inside log() calls.
72
+ _WANDB_TYPE_NAMES = (
73
+ "Image",
74
+ "Table",
75
+ "Artifact",
76
+ "Video",
77
+ "Histogram",
78
+ "Audio",
79
+ "Html",
80
+ "Object3D",
81
+ "Molecule",
82
+ "plot",
83
+ "Settings",
84
+ )
85
+
86
+
87
+ def _to_jsonable(v):
88
+ """Mirror wandb's silent coercion of tensors/numpy to JSON — trackio raises.
89
+
90
+ Reduces ``torch.Tensor`` / numpy scalars to Python scalars (and n-d arrays to
91
+ nested lists) by duck-typing ``.item()`` / ``.tolist()`` — no torch/numpy import.
92
+ """
93
+ if v is None or isinstance(v, (str, bytes, bool, int, float)):
94
+ return v
95
+ if isinstance(v, dict):
96
+ return {k: _to_jsonable(x) for k, x in v.items()}
97
+ if isinstance(v, (list, tuple)):
98
+ return [_to_jsonable(x) for x in v]
99
+ item = getattr(v, "item", None)
100
+ if callable(item):
101
+ try:
102
+ return v.item()
103
+ except Exception:
104
+ pass
105
+ tolist = getattr(v, "tolist", None)
106
+ if callable(tolist):
107
+ try:
108
+ return v.tolist()
109
+ except Exception:
110
+ pass
111
+ return v
112
+
113
+
114
+ def _install_trackio_alias(space_id: str) -> bool:
115
+ """Alias ``wandb`` -> trackio, mirroring to ``space_id``. False if unavailable."""
116
+ try:
117
+ import trackio
118
+ except Exception:
119
+ sys.stderr.write("[wandb->trackio] trackio not importable; using no-op\n")
120
+ return False
121
+
122
+ _orig_init = trackio.init
123
+
124
+ def init(*args, **kwargs):
125
+ for k in _WANDB_ONLY_INIT:
126
+ kwargs.pop(k, None)
127
+ kwargs.setdefault("space_id", space_id)
128
+ run = _orig_init(*args, **kwargs)
129
+ try:
130
+ if not hasattr(run, "summary"):
131
+ run.summary = {}
132
+ except Exception:
133
+ pass
134
+ trackio.run = run
135
+ return run
136
+
137
+ trackio.init = init
138
+
139
+ _orig_log = trackio.log
140
+
141
+ def log(*args, **kwargs):
142
+ kwargs.pop("commit", None)
143
+ if args and isinstance(args[0], dict):
144
+ args = (_to_jsonable(args[0]), *args[1:])
145
+ try:
146
+ return _orig_log(*args, **kwargs)
147
+ except TypeError:
148
+ kwargs.pop("step", None)
149
+ return _orig_log(*args, **kwargs)
150
+
151
+ trackio.log = log
152
+
153
+ _warned: set[str] = set()
154
+
155
+ def _stub(name):
156
+ def _f(*a, **k):
157
+ if name not in _warned:
158
+ _warned.add(name)
159
+ sys.stderr.write(f"[wandb->trackio] wandb.{name}(...) is a no-op under trackio\n")
160
+ return None
161
+
162
+ return _f
163
+
164
+ for _name in (*_WANDB_NOOP_NAMES, *_WANDB_TYPE_NAMES):
165
+ if not hasattr(trackio, _name):
166
+ setattr(trackio, _name, _stub(_name))
167
+ if not hasattr(trackio, "run"):
168
+ trackio.run = None
169
+
170
+ sys.modules["wandb"] = trackio
171
+ sys.stderr.write(f"[wandb->trackio] active (wandb -> trackio, space={space_id})\n")
172
+ return True
173
+
174
+
175
+ def _install_noop_wandb() -> None:
176
+ """Alias ``wandb`` to a silent no-op module so an unmodified repo runs untracked."""
177
+ import types
178
+
179
+ mod = types.ModuleType("wandb")
180
+
181
+ def _noop(*a, **k):
182
+ return None
183
+
184
+ class _Run:
185
+ def __init__(self) -> None:
186
+ self.summary: dict = {}
187
+ self.config: dict = {}
188
+ self.id = None
189
+ self.name = None
190
+
191
+ log = _noop
192
+ finish = _noop
193
+ watch = _noop
194
+ log_code = _noop
195
+
196
+ _run = _Run()
197
+
198
+ def init(*a, **k):
199
+ mod.run = _run # type: ignore[attr-defined]
200
+ return _run
201
+
202
+ mod.init = init # type: ignore[attr-defined]
203
+ mod.log = _noop # type: ignore[attr-defined]
204
+ mod.finish = _noop # type: ignore[attr-defined]
205
+ mod.config = {} # type: ignore[attr-defined]
206
+ mod.run = None # type: ignore[attr-defined]
207
+ for _name in (*_WANDB_NOOP_NAMES, *_WANDB_TYPE_NAMES):
208
+ setattr(mod, _name, _noop)
209
+ sys.modules["wandb"] = mod
210
+ sys.stderr.write("[wandb->trackio] wandb no-op (tracking disabled)\n")
211
+
212
+
213
+ def install(environ=None) -> None:
214
+ """Alias ``wandb`` per ``ROAR_WANDB_TO_TRACKIO`` — a no-op if the flag is unset.
215
+
216
+ Idempotent and safe: never raises into the workload. Skips if ``wandb`` is
217
+ already in ``sys.modules`` (real wandb or a prior alias) so it never clobbers.
218
+ """
219
+ import os
220
+
221
+ env = os.environ if environ is None else environ
222
+ flag = (env.get("ROAR_WANDB_TO_TRACKIO") or "").strip().lower()
223
+ if not flag:
224
+ return
225
+ if "wandb" in sys.modules:
226
+ return
227
+ space_id = env.get("TRACKIO_SPACE_ID") or None
228
+ try:
229
+ if flag != "off" and space_id and _install_trackio_alias(space_id):
230
+ return
231
+ _install_noop_wandb()
232
+ except Exception as exc: # never let tracking setup break the workload
233
+ sys.stderr.write(f"[wandb->trackio] disabled (setup error: {exc})\n")
@@ -158,7 +158,20 @@ def load_publish_auth_context(
158
158
  else:
159
159
  raise PublishAuthError(str(exc)) from exc
160
160
  binding = None if allow_public_without_binding else _load_repo_binding(start_dir)
161
- repo_scope = None if allow_public_without_binding else load_repo_scope(start_dir)
161
+ repo_scope = load_repo_scope(start_dir)
162
+ # `allow_public_without_binding` permits a *scopeless* public publish, but it
163
+ # must not discard a **public project scope** — that binding carries the org
164
+ # attribution (supplier/author) the AI-BOM needs, and a public project's
165
+ # whole point is public + attributed. Regression fix: eef6fca (0.4.1) made a
166
+ # public project scope resolve to public=True, which the CLI feeds into
167
+ # `allow_public_without_binding=request.public`; dropping repo_scope here then
168
+ # published those DAGs anonymous. A *non-public* project scope with an
169
+ # explicit `--public` still drops (the user is overriding to public), as do
170
+ # public/anonymous/unset scopes.
171
+ if allow_public_without_binding and not (
172
+ repo_scope and repo_scope.mode == "project" and repo_scope.visibility == "public"
173
+ ):
174
+ repo_scope = None
162
175
  if binding and not access_token and not ssh_auth_available:
163
176
  raise PublishAuthError(
164
177
  "Repo is linked to GLaaS but no global auth state is available. Run `roar login`."
File without changes
File without changes
File without changes
File without changes