roar-cli 0.4.2__tar.gz → 0.4.4__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 (464) hide show
  1. {roar_cli-0.4.2 → roar_cli-0.4.4}/PKG-INFO +2 -2
  2. {roar_cli-0.4.2 → roar_cli-0.4.4}/pyproject.toml +3 -3
  3. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/collection.py +28 -0
  4. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/lineage_composites.py +2 -0
  5. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/put_composites.py +11 -1
  6. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/put_execution.py +161 -54
  7. roar_cli-0.4.4/roar/application/publish/put_preparation.py +434 -0
  8. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/register_execution.py +162 -41
  9. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/register_preparation.py +6 -0
  10. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/registration.py +19 -2
  11. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/remote_job_uids.py +21 -0
  12. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/requests.py +3 -1
  13. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/service.py +29 -5
  14. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/session.py +96 -7
  15. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproduce/requests.py +5 -0
  16. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproduce/service.py +29 -1
  17. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproducibility/report.py +5 -2
  18. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/execution.py +4 -0
  19. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/requests.py +1 -0
  20. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/service.py +4 -0
  21. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/tags.py +12 -4
  22. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/attach.py +1 -1
  23. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/fragment_reconstituter.py +3 -3
  24. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/submit.py +1 -0
  25. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/collector.py +21 -7
  26. roar_cli-0.4.4/roar/backends/ray/constants.py +33 -0
  27. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/fragment.py +4 -0
  28. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/fragment_reconstituter.py +75 -9
  29. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/roar_worker.py +110 -0
  30. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/submit.py +3 -0
  31. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/init.py +61 -0
  32. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/register.py +15 -13
  33. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/reproduce.py +24 -0
  34. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/run.py +16 -0
  35. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/publish_intent.py +13 -0
  36. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/registration.py +3 -0
  37. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/provenance.py +3 -0
  38. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/run.py +4 -0
  39. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/schema.py +54 -1
  40. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/services/job_recording.py +7 -3
  41. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/fragments/reconstitution.py +23 -1
  42. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/framework/contract.py +2 -1
  43. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/framework/planning.py +2 -0
  44. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/assembler.py +1 -0
  45. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/data_loader.py +3 -0
  46. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/service.py +24 -0
  47. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/recording/job_recording.py +3 -0
  48. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/reproduction/environment_setup.py +79 -15
  49. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/reproduction/installers.py +38 -1
  50. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/reproduction/pipeline_executor.py +41 -8
  51. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/reproduction/pipeline_metadata.py +11 -0
  52. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/coordinator.py +25 -1
  53. roar_cli-0.4.4/roar/execution/runtime/inject/sitecustomize.py +298 -0
  54. roar_cli-0.4.4/roar/execution/runtime/inject/tracker.py +507 -0
  55. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/lazy_install.py +3 -3
  56. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/tracer.py +11 -2
  57. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/filters/omit.py +23 -2
  58. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/config/access.py +2 -0
  59. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/config/raw.py +2 -0
  60. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/config/schema.py +4 -0
  61. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/client.py +59 -3
  62. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/registration/artifact.py +2 -20
  63. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/registration/coordinator.py +8 -1
  64. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/registration/job.py +15 -2
  65. roar_cli-0.4.4/roar/integrations/wandb_trackio.py +259 -0
  66. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/publish_auth.py +62 -9
  67. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/daemon.rs +45 -20
  68. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/ipc.rs +50 -3
  69. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/main.rs +1 -0
  70. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/src/main.rs +52 -13
  71. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ptrace/src/main.rs +30 -4
  72. roar_cli-0.4.2/roar/application/publish/put_preparation.py +0 -125
  73. roar_cli-0.4.2/roar/backends/ray/constants.py +0 -17
  74. roar_cli-0.4.2/roar/execution/runtime/inject/sitecustomize.py +0 -134
  75. roar_cli-0.4.2/roar/execution/runtime/inject/tracker.py +0 -227
  76. {roar_cli-0.4.2 → roar_cli-0.4.4}/LICENSE +0 -0
  77. {roar_cli-0.4.2 → roar_cli-0.4.4}/README.md +0 -0
  78. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/__init__.py +0 -0
  79. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/__main__.py +0 -0
  80. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/analyzers/__init__.py +0 -0
  81. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/analyzers/base.py +0 -0
  82. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/analyzers/experiment_trackers.py +0 -0
  83. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/__init__.py +0 -0
  84. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/composite/__init__.py +0 -0
  85. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/composite/canonical.py +0 -0
  86. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/composite/detect.py +0 -0
  87. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/composite/qualifying.py +0 -0
  88. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/get/__init__.py +0 -0
  89. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/get/requests.py +0 -0
  90. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/get/results.py +0 -0
  91. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/get/service.py +0 -0
  92. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/get/transfer.py +0 -0
  93. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/git.py +0 -0
  94. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/label_rendering.py +0 -0
  95. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/labels.py +0 -0
  96. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/lookup/__init__.py +0 -0
  97. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/lookup/models.py +0 -0
  98. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/lookup/policy.py +0 -0
  99. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/lookup/refs.py +0 -0
  100. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/lookup/remote_artifacts.py +0 -0
  101. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/lookup/runner.py +0 -0
  102. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/__init__.py +0 -0
  103. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/anchor_attribution.py +0 -0
  104. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/blake3_upgrade.py +0 -0
  105. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/composite_builder.py +0 -0
  106. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/composites.py +0 -0
  107. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/datasets.py +0 -0
  108. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/form_composites.py +0 -0
  109. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/git_remote.py +0 -0
  110. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/job_links.py +0 -0
  111. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/job_preparation.py +0 -0
  112. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/lineage.py +0 -0
  113. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/lineage_composite_formation.py +0 -0
  114. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/metadata.py +0 -0
  115. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/register_preview_jobs.py +0 -0
  116. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/register_tag_push.py +0 -0
  117. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/registration_package.py +0 -0
  118. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/remote_registry.py +0 -0
  119. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/results.py +0 -0
  120. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/runtime.py +0 -0
  121. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/secrets.py +0 -0
  122. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/source_resolution.py +0 -0
  123. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/targets.py +0 -0
  124. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/publish/view_edges.py +0 -0
  125. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/__init__.py +0 -0
  126. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/dag.py +0 -0
  127. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/db_status.py +0 -0
  128. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/diff.py +0 -0
  129. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/diff_engine.py +0 -0
  130. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/diff_graph.py +0 -0
  131. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/diff_refs.py +0 -0
  132. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/git_readiness.py +0 -0
  133. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/inputs.py +0 -0
  134. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/label.py +0 -0
  135. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/lineage.py +0 -0
  136. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/log.py +0 -0
  137. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/requests.py +0 -0
  138. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/results.py +0 -0
  139. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/show.py +0 -0
  140. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/status.py +0 -0
  141. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/query/tag.py +0 -0
  142. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproduce/__init__.py +0 -0
  143. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproduce/environment.py +0 -0
  144. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproduce/lookup.py +0 -0
  145. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproduce/results.py +0 -0
  146. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/reproducibility/__init__.py +0 -0
  147. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/__init__.py +0 -0
  148. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/dag_references.py +0 -0
  149. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/dirty_tree_classify.py +0 -0
  150. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/dirty_tree_error.py +0 -0
  151. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/gitignore_suggest.py +0 -0
  152. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/output_followup.py +0 -0
  153. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/run/verbosity.py +0 -0
  154. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/system_labels.py +0 -0
  155. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/workflow/__init__.py +0 -0
  156. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/workflow/requests.py +0 -0
  157. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/workflow/results.py +0 -0
  158. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/application/workflow/service.py +0 -0
  159. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/auth_store.py +0 -0
  160. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/__init__.py +0 -0
  161. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/__init__.py +0 -0
  162. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/bundles.py +0 -0
  163. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/config.py +0 -0
  164. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/host_execution.py +0 -0
  165. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/lineage.py +0 -0
  166. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/manifest.py +0 -0
  167. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/mount_map.py +0 -0
  168. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/object_io.py +0 -0
  169. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/plugin.py +0 -0
  170. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/pod_entry.py +0 -0
  171. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/rayjob.py +0 -0
  172. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/secret_cleanup.py +0 -0
  173. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/webhook.py +0 -0
  174. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/k8s/workload_wait.py +0 -0
  175. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/local/__init__.py +0 -0
  176. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/local/plugin.py +0 -0
  177. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/__init__.py +0 -0
  178. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/config.py +0 -0
  179. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/export.py +0 -0
  180. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/host_execution.py +0 -0
  181. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/lineage.py +0 -0
  182. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/plugin.py +0 -0
  183. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/runtime_bundle.py +0 -0
  184. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/submit.py +0 -0
  185. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/osmo/workflow.py +0 -0
  186. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/__init__.py +0 -0
  187. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/_agent_names.py +0 -0
  188. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/config.py +0 -0
  189. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/env_contract.py +0 -0
  190. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/node_agent.py +0 -0
  191. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/plugin.py +0 -0
  192. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/proxy_fragments.py +0 -0
  193. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/runtime_hooks.py +0 -0
  194. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/s3_key_paths.py +0 -0
  195. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/backends/ray/submit_context.py +0 -0
  196. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/__init__.py +0 -0
  197. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/_format.py +0 -0
  198. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/_tag_kinds.py +0 -0
  199. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/command_registry.py +0 -0
  200. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/__init__.py +0 -0
  201. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/auth.py +0 -0
  202. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/build.py +0 -0
  203. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/config.py +0 -0
  204. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/dag.py +0 -0
  205. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/db.py +0 -0
  206. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/diff.py +0 -0
  207. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/env.py +0 -0
  208. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/export_registration_package.py +0 -0
  209. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/filter.py +0 -0
  210. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/get.py +0 -0
  211. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/init_agents.py +0 -0
  212. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/inputs.py +0 -0
  213. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/k8s.py +0 -0
  214. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/label.py +0 -0
  215. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/lineage.py +0 -0
  216. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/log.py +0 -0
  217. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/login.py +0 -0
  218. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/logout.py +0 -0
  219. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/osmo.py +0 -0
  220. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/pop.py +0 -0
  221. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/projects.py +0 -0
  222. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/proxy.py +0 -0
  223. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/put.py +0 -0
  224. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/reset.py +0 -0
  225. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/scope.py +0 -0
  226. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/session.py +0 -0
  227. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/show.py +0 -0
  228. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/status.py +0 -0
  229. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/tag.py +0 -0
  230. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/telemetry.py +0 -0
  231. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/tracer.py +0 -0
  232. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/tui.py +0 -0
  233. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/whoami.py +0 -0
  234. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/commands/workflow.py +0 -0
  235. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/context.py +0 -0
  236. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/decorators.py +0 -0
  237. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
  238. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
  239. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/__init__.py +0 -0
  240. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/bootstrap.py +0 -0
  241. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/canonical_session.py +0 -0
  242. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/digests.py +0 -0
  243. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/dto/__init__.py +0 -0
  244. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/dto/registration.py +0 -0
  245. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/exceptions.py +0 -0
  246. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/__init__.py +0 -0
  247. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/config.py +0 -0
  248. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/lineage.py +0 -0
  249. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/logger.py +0 -0
  250. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/presenter.py +0 -0
  251. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/provenance.py +0 -0
  252. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/repositories.py +0 -0
  253. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/reproduction.py +0 -0
  254. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/run.py +0 -0
  255. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/services.py +0 -0
  256. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/telemetry.py +0 -0
  257. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/interfaces/vcs.py +0 -0
  258. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/label_constants.py +0 -0
  259. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/label_origins.py +0 -0
  260. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/logging.py +0 -0
  261. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/__init__.py +0 -0
  262. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/artifact.py +0 -0
  263. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/base.py +0 -0
  264. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/dag.py +0 -0
  265. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/dataset_identifier.py +0 -0
  266. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/glaas.py +0 -0
  267. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/job.py +0 -0
  268. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/lineage.py +0 -0
  269. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/session.py +0 -0
  270. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/telemetry.py +0 -0
  271. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/models/vcs.py +0 -0
  272. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/operation_metadata.py +0 -0
  273. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/session_hash.py +0 -0
  274. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/step_name.py +0 -0
  275. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/tracer_modes.py +0 -0
  276. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/core/validation.py +0 -0
  277. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/__init__.py +0 -0
  278. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/context.py +0 -0
  279. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/engine.py +0 -0
  280. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/hashing/__init__.py +0 -0
  281. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/hashing/backend.py +0 -0
  282. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/hashing/blake3.py +0 -0
  283. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/models.py +0 -0
  284. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/query_context.py +0 -0
  285. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/__init__.py +0 -0
  286. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/artifact.py +0 -0
  287. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/collection.py +0 -0
  288. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/composite.py +0 -0
  289. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/hash_cache.py +0 -0
  290. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/job.py +0 -0
  291. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/label.py +0 -0
  292. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/repositories/session.py +0 -0
  293. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/services/__init__.py +0 -0
  294. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/services/hashing.py +0 -0
  295. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/services/lineage.py +0 -0
  296. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/services/session.py +0 -0
  297. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/db/step_priority.py +0 -0
  298. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/__init__.py +0 -0
  299. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/cluster/__init__.py +0 -0
  300. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/cluster/bridge.py +0 -0
  301. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/cluster/proxy.py +0 -0
  302. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/cluster/proxy_config.py +0 -0
  303. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/fragments/__init__.py +0 -0
  304. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/fragments/export.py +0 -0
  305. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/fragments/lineage.py +0 -0
  306. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/fragments/models.py +0 -0
  307. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/fragments/sessions.py +0 -0
  308. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/fragments/transport.py +0 -0
  309. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/framework/__init__.py +0 -0
  310. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/framework/registry.py +0 -0
  311. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/framework/runtime_imports.py +0 -0
  312. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/__init__.py +0 -0
  313. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/build_pip_collector.py +0 -0
  314. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/build_tool_collector.py +0 -0
  315. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/file_filter.py +0 -0
  316. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/package_collector.py +0 -0
  317. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/process_summarizer.py +0 -0
  318. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/provenance/runtime_collector.py +0 -0
  319. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/recording/__init__.py +0 -0
  320. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/recording/dataset_identifier.py +0 -0
  321. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/recording/dataset_metadata.py +0 -0
  322. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/recording/dataset_profile.py +0 -0
  323. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/reproduction/__init__.py +0 -0
  324. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/__init__.py +0 -0
  325. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/abi_probe.py +0 -0
  326. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/active_runs.py +0 -0
  327. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/backup.py +0 -0
  328. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/driver_entrypoint.py +0 -0
  329. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/errors.py +0 -0
  330. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/host_execution.py +0 -0
  331. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/inject/__init__.py +0 -0
  332. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/inject/support.py +0 -0
  333. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/proxy_resource.py +0 -0
  334. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/resources.py +0 -0
  335. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/signal_handler.py +0 -0
  336. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/tracer_backends.py +0 -0
  337. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/tracer_banner.py +0 -0
  338. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/execution/runtime/worker_bootstrap.py +0 -0
  339. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/filters/__init__.py +0 -0
  340. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/filters/files.py +0 -0
  341. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/glaas_auth.py +0 -0
  342. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/glaas_client.py +0 -0
  343. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/__init__.py +0 -0
  344. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/bootstrap.py +0 -0
  345. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/config/__init__.py +0 -0
  346. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/config/loader.py +0 -0
  347. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/discovery.py +0 -0
  348. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/__init__.py +0 -0
  349. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/base.py +0 -0
  350. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/gcs.py +0 -0
  351. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/get.py +0 -0
  352. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/hf.py +0 -0
  353. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/http.py +0 -0
  354. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/noop.py +0 -0
  355. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/download/s3.py +0 -0
  356. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/git/__init__.py +0 -0
  357. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/git/base.py +0 -0
  358. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/git/context.py +0 -0
  359. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/git/provider.py +0 -0
  360. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/__init__.py +0 -0
  361. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/auth.py +0 -0
  362. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/fragment_streamer.py +0 -0
  363. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/registration/__init__.py +0 -0
  364. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
  365. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/registration/session.py +0 -0
  366. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/glaas/transport.py +0 -0
  367. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/registry.py +0 -0
  368. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/resolution.py +0 -0
  369. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/__init__.py +0 -0
  370. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/base.py +0 -0
  371. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/gcs.py +0 -0
  372. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/hf.py +0 -0
  373. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/memory.py +0 -0
  374. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/noop.py +0 -0
  375. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/publish.py +0 -0
  376. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/storage/s3.py +0 -0
  377. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/telemetry/__init__.py +0 -0
  378. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/telemetry/base.py +0 -0
  379. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/integrations/telemetry/wandb.py +0 -0
  380. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/__init__.py +0 -0
  381. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/console.py +0 -0
  382. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/dag_data_builder.py +0 -0
  383. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/dag_renderer.py +0 -0
  384. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/diff_renderer.py +0 -0
  385. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/formatting.py +0 -0
  386. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/null.py +0 -0
  387. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/run_report.py +0 -0
  388. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/show_renderer.py +0 -0
  389. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/spinner.py +0 -0
  390. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/presenters/terminal.py +0 -0
  391. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/require.py +0 -0
  392. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/scope_config.py +0 -0
  393. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/__init__.py +0 -0
  394. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/_io.py +0 -0
  395. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/capabilities.py +0 -0
  396. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/config.py +0 -0
  397. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/hooks.py +0 -0
  398. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/install.py +0 -0
  399. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/paths.py +0 -0
  400. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/payload.py +0 -0
  401. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/queue.py +0 -0
  402. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/stats.py +0 -0
  403. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/telemetry/uploader.py +0 -0
  404. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/__init__.py +0 -0
  405. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/app.py +0 -0
  406. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/data.py +0 -0
  407. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/__init__.py +0 -0
  408. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/config_editor.py +0 -0
  409. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/label_editor.py +0 -0
  410. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/launcher.py +0 -0
  411. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/log.py +0 -0
  412. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/main.py +0 -0
  413. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/search.py +0 -0
  414. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/screens/session_picker.py +0 -0
  415. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/tmux.py +0 -0
  416. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/widgets/__init__.py +0 -0
  417. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/tui/widgets/detail.py +0 -0
  418. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/utils/__init__.py +0 -0
  419. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/utils/cloud.py +0 -0
  420. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/utils/git_url.py +0 -0
  421. {roar_cli-0.4.2 → roar_cli-0.4.4}/roar/version_check.py +0 -0
  422. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/Cargo.lock +0 -0
  423. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/Cargo.toml +0 -0
  424. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
  425. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
  426. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/artifact-hash-py/Cargo.toml +0 -0
  427. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/artifact-hash-py/src/lib.rs +0 -0
  428. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/tracer-fd/Cargo.toml +0 -0
  429. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/tracer-fd/src/lib.rs +0 -0
  430. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/tracer-runtime/Cargo.toml +0 -0
  431. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/tracer-runtime/src/lib.rs +0 -0
  432. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/tracer-schema/Cargo.toml +0 -0
  433. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/crates/tracer-schema/src/lib.rs +0 -0
  434. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/services/proxy/Cargo.lock +0 -0
  435. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/services/proxy/Cargo.toml +0 -0
  436. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/services/proxy/src/forward.rs +0 -0
  437. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/services/proxy/src/main.rs +0 -0
  438. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/services/proxy/src/s3.rs +0 -0
  439. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/common/Cargo.toml +0 -0
  440. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/common/src/lib.rs +0 -0
  441. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
  442. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
  443. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/probe/src/main.rs +0 -0
  444. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
  445. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/build.rs +0 -0
  446. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/attach.rs +0 -0
  447. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
  448. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
  449. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/events.rs +0 -0
  450. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
  451. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ebpf/userspace/src/state.rs +0 -0
  452. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/Cargo.toml +0 -0
  453. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/build.rs +0 -0
  454. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
  455. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/src/interpose.c +0 -0
  456. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/src/ipc.rs +0 -0
  457. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/src/lib.rs +0 -0
  458. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/tests/comprehensive.rs +0 -0
  459. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/preload/tests/standalone.rs +0 -0
  460. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ptrace/Cargo.toml +0 -0
  461. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ptrace/rustfmt.toml +0 -0
  462. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ptrace/src/arch.rs +0 -0
  463. {roar_cli-0.4.2 → roar_cli-0.4.4}/rust/tracers/ptrace/src/seccomp.rs +0 -0
  464. {roar_cli-0.4.2 → roar_cli-0.4.4}/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.4
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -25,6 +25,7 @@ Requires-Dist: pydantic>=2.0.0
25
25
  Requires-Dist: pydantic-settings>=2.0.0
26
26
  Requires-Dist: textual>=0.80
27
27
  Requires-Dist: tomli>=2.0.0 ; python_full_version < '3.11'
28
+ Requires-Dist: huggingface-hub>=0.20.0
28
29
  Requires-Dist: pytest>=7.0.0 ; extra == 'dev'
29
30
  Requires-Dist: pytest-timeout>=2.0.0 ; extra == 'dev'
30
31
  Requires-Dist: pytest-mock>=3.10.0 ; extra == 'dev'
@@ -34,7 +35,6 @@ Requires-Dist: ruff>=0.8.0 ; extra == 'dev'
34
35
  Requires-Dist: mypy>=1.13.0 ; extra == 'dev'
35
36
  Requires-Dist: boto3>=1.28.0 ; extra == 'dev'
36
37
  Requires-Dist: google-cloud-storage>=2.10.0 ; extra == 'dev'
37
- Requires-Dist: huggingface-hub>=0.20.0 ; extra == 'dev'
38
38
  Provides-Extra: dev
39
39
  License-File: LICENSE
40
40
  Summary: Reproducibility and provenance tracker for ML training pipelines
@@ -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.4"
9
9
  description = "Reproducibility and provenance tracker for ML training pipelines"
10
10
  authors = [
11
11
  { name="TReqs Team", email="info@treqs.ai" }
@@ -49,6 +49,7 @@ dependencies = [
49
49
  "pydantic-settings>=2.0.0",
50
50
  "textual>=0.80",
51
51
  "tomli>=2.0.0; python_version < '3.11'",
52
+ "huggingface_hub>=0.20.0", # `roar put hf://` is a shipped path, not dev-only (P0-19)
52
53
  ]
53
54
 
54
55
  [project.urls]
@@ -68,7 +69,6 @@ dev = [
68
69
  "mypy>=1.13.0",
69
70
  "boto3>=1.28.0",
70
71
  "google-cloud-storage>=2.10.0",
71
- "huggingface_hub>=0.20.0",
72
72
  ]
73
73
 
74
74
  [project.scripts]
@@ -129,7 +129,7 @@ markers = [
129
129
  "ray_contract: User-facing Ray contract tests using `roar run ray job submit ...`",
130
130
  "ray_diagnostic: Diagnostic Ray tests that intentionally inspect internal runtime details",
131
131
  ]
132
- addopts = "-v --strict-markers -n auto --dist loadfile --ignore=tests/ebpf --ignore=tests/live_glaas --ignore=tests/benchmarks --ignore=tests/e2e --ignore=tests/integration/test_cli_startup.py --ignore=tests/execution/runtime/test_sitecustomize_perf.py --ignore-glob=tests/backends/*/e2e --ignore-glob=tests/backends/*/live"
132
+ addopts = "-v --strict-markers -n auto --dist loadfile --ignore=tests/ebpf --ignore=tests/live_glaas --ignore=tests/benchmarks --ignore=tests/e2e --ignore=tests/backends/osmo --ignore=tests/integration/test_cli_startup.py --ignore=tests/execution/runtime/test_sitecustomize_perf.py --ignore-glob=tests/backends/*/e2e --ignore-glob=tests/backends/*/live"
133
133
  timeout = 60
134
134
  filterwarnings = [
135
135
  "ignore::DeprecationWarning",
@@ -44,6 +44,11 @@ def collect_register_lineage(
44
44
  dry_run: bool = False,
45
45
  ) -> tuple[CollectedRegisterLineage | None, str | None]:
46
46
  """Collect local lineage for a resolved register target."""
47
+ if target.kind == "active_session":
48
+ return _collect_active_session_lineage(
49
+ roar_dir=roar_dir,
50
+ lineage_collector=lineage_collector,
51
+ )
47
52
  if target.kind == "step_reference":
48
53
  return _collect_step_lineage(
49
54
  step_reference=target.value,
@@ -81,6 +86,29 @@ def collect_register_lineage(
81
86
  return None, f"Unsupported register target type: {target.kind}"
82
87
 
83
88
 
89
+ def _collect_active_session_lineage(
90
+ *,
91
+ roar_dir: Path,
92
+ lineage_collector: LineageCollector,
93
+ ) -> tuple[CollectedRegisterLineage | None, str | None]:
94
+ with create_database_context(roar_dir) as db_ctx:
95
+ session = db_ctx.sessions.get_active()
96
+ if not session:
97
+ return None, "No active session. Run 'roar run' to create a session first."
98
+ session_id = int(session["id"])
99
+ lineage = lineage_collector.collect_session(session_id, roar_dir)
100
+
101
+ return (
102
+ CollectedRegisterLineage(
103
+ lineage=lineage,
104
+ session_id=session_id,
105
+ artifact_hash="",
106
+ session_hash_override=None,
107
+ ),
108
+ None,
109
+ )
110
+
111
+
84
112
  def _collect_step_lineage(
85
113
  *,
86
114
  step_reference: str,
@@ -54,6 +54,7 @@ def preregister_lineage_composites_with_glaas(
54
54
  registration_errors: list[str],
55
55
  composite_builder: Any,
56
56
  logger: ILogger,
57
+ registration_session_id: str | None = None,
57
58
  ) -> list[dict[str, Any]]:
58
59
  """Prepare and preregister lineage composites before batch link resolution."""
59
60
  payloads = build_lineage_composite_payloads(
@@ -68,6 +69,7 @@ def preregister_lineage_composites_with_glaas(
68
69
  payloads=payloads,
69
70
  registration_errors=registration_errors,
70
71
  logger=logger,
72
+ registration_session_id=registration_session_id,
71
73
  )
72
74
 
73
75
 
@@ -39,6 +39,7 @@ def preregister_put_lineage_composites_with_glaas(
39
39
  dataset_identifiers: list[dict[str, Any]] | None,
40
40
  composite_builder: Any,
41
41
  logger: ILogger,
42
+ registration_session_id: str | None = None,
42
43
  ) -> list[dict[str, Any]]:
43
44
  """Prepare and preregister lineage composites for the put workflow."""
44
45
  payloads = build_put_lineage_composite_payloads(
@@ -55,6 +56,7 @@ def preregister_put_lineage_composites_with_glaas(
55
56
  payloads=payloads,
56
57
  registration_errors=registration_errors,
57
58
  logger=logger,
59
+ registration_session_id=registration_session_id,
58
60
  )
59
61
 
60
62
 
@@ -164,6 +166,7 @@ def register_put_composites_with_glaas(
164
166
  registration_errors: list[str],
165
167
  dataset_identifiers: list[dict[str, Any]] | None,
166
168
  logger: ILogger,
169
+ registration_session_id: str | None = None,
167
170
  ) -> list[dict[str, Any]]:
168
171
  """Register generated composite artifacts with GLaaS and persist local state."""
169
172
  composite_registrations: list[dict[str, Any]] = []
@@ -186,7 +189,14 @@ def register_put_composites_with_glaas(
186
189
  if metadata_json is not None:
187
190
  payload["metadata"] = metadata_json
188
191
 
189
- response = resolved_remote_registry.register_composite_artifact(payload)
192
+ response = (
193
+ resolved_remote_registry.client.register_composite_artifact_under_registration_session(
194
+ registration_session_id,
195
+ payload,
196
+ )
197
+ if registration_session_id
198
+ else resolved_remote_registry.register_composite_artifact(payload)
199
+ )
190
200
  result, error = parse_composite_registration_response(response)
191
201
 
192
202
  composite_registration: dict[str, Any] = {
@@ -19,7 +19,7 @@ from ...application.publish.composite_builder import CompositeArtifactBuilder
19
19
  from ...application.publish.composites import build_publish_composite_results
20
20
  from ...application.publish.lineage import LineageCollector
21
21
  from ...application.publish.metadata import build_put_operation_metadata_json
22
- from ...application.publish.put_preparation import PreparedPutExecution
22
+ from ...application.publish.put_preparation import DelegatedPutOperation, PreparedPutExecution
23
23
  from ...application.publish.registration import (
24
24
  normalize_registration_hashes,
25
25
  normalize_registration_source_type,
@@ -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
@@ -219,6 +220,7 @@ class PutService:
219
220
  session_hash = prepared.session_hash
220
221
  registration_session_id = prepared.registration_session_id
221
222
  registration_session_mode = prepared.registration_session_mode
223
+ registration_session_status = prepared.registration_session_status
222
224
  git_context = prepared.git_context
223
225
  resolved = prepared.resolved_sources
224
226
  destination_type = prepared.destination_type
@@ -245,12 +247,31 @@ class PutService:
245
247
  would_upload=[PutDryRunItem(path=str(r.path), exists=r.exists) for r in resolved],
246
248
  )
247
249
 
250
+ # Delegated broker sessions use a deterministic client-session id. If a
251
+ # previous attempt reached finalize but the caller lost the response,
252
+ # create/resume returns the closed session and its authoritative receipt.
253
+ # Treat that as a completed retry before hashing or uploading anything;
254
+ # closed registration-session capabilities cannot accept more staging and
255
+ # re-uploading large artifacts would be both wasteful and misleading.
256
+ if registration_session_id and registration_session_status == "closed":
257
+ self._logger.debug(
258
+ "Put publication already finalized for registration session %s",
259
+ registration_session_id,
260
+ )
261
+ return PutResult(
262
+ success=True,
263
+ session_hash=session_hash,
264
+ session_url=prepared.session_url,
265
+ )
266
+
248
267
  # Process each file: hash, create artifact, upload
249
268
  uploads: list[_UploadedArtifact] = []
250
269
  composite_registrations: list[dict[str, Any]] = []
251
270
  lineage_composite_registrations: list[dict[str, Any]] = []
252
- with Spinner(f"Hashing {len(resolved)} file(s)..."):
253
- hashes_by_path = self._hash_files_batch([source.path for source in resolved])
271
+ hashes_by_path = prepared.source_hashes
272
+ if not hashes_by_path:
273
+ with Spinner(f"Hashing {len(resolved)} file(s)..."):
274
+ hashes_by_path = self._hash_files_batch([source.path for source in resolved])
254
275
 
255
276
  # Uploads are the long pole of a put (multi-GB artifacts to S3/GCS); show a
256
277
  # live N/M + cumulative-bytes counter rather than a dead terminal.
@@ -309,6 +330,13 @@ class PutService:
309
330
  artifact_hashes = [u.hash for u in uploads]
310
331
  artifacts_info = [(u.artifact_id, u.local_path) for u in uploads]
311
332
 
333
+ # Record each uploaded artifact's distribution URL as a reserved system
334
+ # label, scoped to this publication, so GLaaS can surface it as the
335
+ # AI-BOM downloadLocation (see _set_publish_distribution_labels).
336
+ self._set_publish_distribution_labels(
337
+ uploads, normalize_registration_source_type(destination_type)
338
+ )
339
+
312
340
  self._logger.debug(
313
341
  "Upload complete: %d file(s), collecting lineage for hashes: %s",
314
342
  len(uploaded_files),
@@ -316,8 +344,11 @@ class PutService:
316
344
  )
317
345
 
318
346
  # Collect lineage for all uploaded artifacts (merged)
319
- collector = self._lineage_collector or LineageCollector()
320
- lineage = collector.collect(artifact_hashes, self._roar_dir)
347
+ if prepared.lineage is not None:
348
+ lineage = prepared.lineage
349
+ else:
350
+ collector = self._lineage_collector or LineageCollector()
351
+ lineage = collector.collect(artifact_hashes, self._roar_dir)
321
352
  self._logger.debug(
322
353
  "Lineage collected: %d job(s), %d artifact(s)",
323
354
  len(lineage.jobs),
@@ -332,6 +363,7 @@ class PutService:
332
363
  coordinator=coordinator,
333
364
  registration_session_id=registration_session_id,
334
365
  registration_session_mode=registration_session_mode,
366
+ delegated_put_operation=prepared.delegated_put_operation,
335
367
  session_id=session_id,
336
368
  fallback_session_hash=session_hash or "",
337
369
  git_context=git_context,
@@ -538,6 +570,7 @@ class PutService:
538
570
  job_uid=job_uid,
539
571
  remote_job_uid=job_uid,
540
572
  registration_errors=registration_result.errors,
573
+ uploads=uploads,
541
574
  )
542
575
 
543
576
  registration_error = (
@@ -591,6 +624,7 @@ class PutService:
591
624
  coordinator: RegistrationCoordinator,
592
625
  registration_session_id: str,
593
626
  registration_session_mode: str | None,
627
+ delegated_put_operation: DelegatedPutOperation | None,
594
628
  session_id: int,
595
629
  fallback_session_hash: str,
596
630
  git_context: GitContext,
@@ -634,18 +668,30 @@ class PutService:
634
668
  timestamp=time.time(),
635
669
  )
636
670
 
637
- step_number = self._db.sessions.get_next_step_number(session_id)
638
- job_id, job_uid = self._db.jobs.create(
639
- command=command,
640
- timestamp=time.time(),
641
- session_id=session_id,
642
- step_number=step_number,
643
- metadata=provisional_metadata_json,
644
- execution_backend="local",
645
- execution_role="host",
646
- job_type="put",
647
- exit_code=0,
671
+ stable_put_job_uid = (
672
+ delegated_put_operation.put_job_uid if delegated_put_operation is not None else None
648
673
  )
674
+ existing_put_job = (
675
+ self._db.jobs.get_by_uid(stable_put_job_uid) if stable_put_job_uid else None
676
+ )
677
+ if existing_put_job is not None:
678
+ job_id = int(existing_put_job["id"])
679
+ job_uid = str(existing_put_job["job_uid"])
680
+ step_number = int(existing_put_job.get("step_number") or 0)
681
+ else:
682
+ step_number = self._db.sessions.get_next_step_number(session_id)
683
+ job_id, job_uid = self._db.jobs.create(
684
+ command=command,
685
+ timestamp=time.time(),
686
+ job_uid=stable_put_job_uid,
687
+ session_id=session_id,
688
+ step_number=step_number,
689
+ metadata=provisional_metadata_json,
690
+ execution_backend="local",
691
+ execution_role="host",
692
+ job_type="put",
693
+ exit_code=0,
694
+ )
649
695
  self._logger.debug(
650
696
  "Put job created before registration-session finalize: id=%s, uid=%s, step=%d",
651
697
  job_id,
@@ -666,19 +712,56 @@ class PutService:
666
712
  composite_builder=self._composite_builder,
667
713
  declared=declared,
668
714
  )
715
+ uploaded_artifacts = self._build_uploaded_artifacts_for_registration(
716
+ uploads,
717
+ source_type,
718
+ )
719
+ staged_artifacts = prepare_batch_registration_artifacts(
720
+ uploaded_artifacts + lineage.artifacts,
721
+ registration_session_id,
722
+ fallback_to_hash=True,
723
+ prefer_blake3_first=True,
724
+ )
669
725
 
670
726
  put_job_registered = False
671
727
  put_job_links_succeeded = False
672
728
  with Spinner("Publishing lineage to GLaaS...") as spin:
729
+ spin.update("Staging lineage composites...")
730
+ lineage_composite_registrations = preregister_put_lineage_composites_with_glaas(
731
+ db_ctx=self._db,
732
+ glaas_client=client,
733
+ lineage_artifacts=lineage.artifacts,
734
+ session_hash=fallback_session_hash,
735
+ registration_errors=registration_errors,
736
+ dataset_identifiers=dataset_identifiers,
737
+ composite_builder=self._composite_builder,
738
+ logger=self._logger,
739
+ registration_session_id=registration_session_id,
740
+ )
741
+ spin.update("Staging output composites...")
742
+ composite_registrations = register_put_composites_with_glaas(
743
+ db_ctx=self._db,
744
+ glaas_client=client,
745
+ composite_results=composite_results_for_linking,
746
+ registration_errors=registration_errors,
747
+ dataset_identifiers=dataset_identifiers,
748
+ logger=self._logger,
749
+ registration_session_id=registration_session_id,
750
+ )
673
751
  spin.update("Staging lineage jobs and artifacts...")
674
752
  registration_result = coordinator.register_lineage_under_registration_session(
675
753
  registration_session_id=registration_session_id,
676
754
  git_context=git_context,
677
755
  jobs=remote_lineage_jobs,
756
+ artifacts=staged_artifacts,
678
757
  )
679
758
  registration_errors.extend(registration_result.errors)
680
759
 
681
- if registration_result.jobs_failed == 0 and registration_result.links_failed == 0:
760
+ if (
761
+ registration_result.jobs_failed == 0
762
+ and registration_result.links_failed == 0
763
+ and not registration_errors
764
+ ):
682
765
  spin.update("Staging put job...")
683
766
  put_job_result = coordinator.job_service.create_job_under_registration_session(
684
767
  command=command,
@@ -748,39 +831,6 @@ class PutService:
748
831
  session_hash = finalize_result.session_hash
749
832
  session_url = finalize_result.session_url
750
833
 
751
- spin.update("Registering lineage composites...")
752
- lineage_composite_registrations = (
753
- preregister_put_lineage_composites_with_glaas(
754
- db_ctx=self._db,
755
- glaas_client=client,
756
- lineage_artifacts=lineage.artifacts,
757
- session_hash=session_hash,
758
- registration_errors=registration_errors,
759
- dataset_identifiers=dataset_identifiers,
760
- composite_builder=self._composite_builder,
761
- logger=self._logger,
762
- )
763
- )
764
-
765
- composite_results = build_publish_composite_results(
766
- resolved_sources=resolved,
767
- hashes_by_path=hashes_by_path,
768
- session_hash=session_hash,
769
- source_type=composite_source_type,
770
- additional_composite_roots=additional_composite_roots,
771
- composite_builder=self._composite_builder,
772
- declared=declared,
773
- )
774
- spin.update("Registering output composites...")
775
- composite_registrations = register_put_composites_with_glaas(
776
- db_ctx=self._db,
777
- glaas_client=client,
778
- composite_results=composite_results,
779
- registration_errors=registration_errors,
780
- dataset_identifiers=dataset_identifiers,
781
- logger=self._logger,
782
- )
783
-
784
834
  metadata_json = build_put_operation_metadata_json(
785
835
  message=message,
786
836
  destination=self._destination,
@@ -810,6 +860,8 @@ class PutService:
810
860
  job_uid=job_uid,
811
861
  remote_job_uid=remote_put_job_uid,
812
862
  registration_errors=registration_errors,
863
+ uploads=uploads,
864
+ registration_session_id=registration_session_id,
813
865
  )
814
866
 
815
867
  composite_result_items = [
@@ -958,8 +1010,12 @@ class PutService:
958
1010
  "size": size,
959
1011
  "source_type": source_type,
960
1012
  }
961
- if uploaded.remote_url:
962
- entry["source_url"] = uploaded.remote_url
1013
+ # Deliberately do NOT record the upload destination as the artifact's
1014
+ # global ``source_url`` here. That row is content-addressed and shared
1015
+ # across orgs, so a per-publication URL would leak between tenants.
1016
+ # The download location is published instead as a session-scoped
1017
+ # ``roar.distribution.url`` label (see _set_publish_distribution_labels),
1018
+ # which both the registration-session and this legacy inline path emit.
963
1019
 
964
1020
  payloads.append(entry)
965
1021
 
@@ -1040,6 +1096,48 @@ class PutService:
1040
1096
  return False
1041
1097
  return True
1042
1098
 
1099
+ def _set_publish_distribution_labels(
1100
+ self,
1101
+ uploads: list[_UploadedArtifact],
1102
+ source_type: str | None,
1103
+ ) -> None:
1104
+ """Record each uploaded artifact's distribution URL as a reserved system
1105
+ label (``roar.distribution.url``), scoped to this publication.
1106
+
1107
+ GLaaS reads this as the artifact's AI-BOM ``downloadLocation``. Because
1108
+ the label lives on the ``(artifact, session)`` scope rather than the
1109
+ global content-addressed artifact row, two orgs publishing identical
1110
+ bytes each carry their own download location — no cross-tenant bleed.
1111
+ Gated on a recognized remote ``source_type`` so we never assert a
1112
+ distribution URL for a non-remote destination (e.g. ``memory://``).
1113
+ """
1114
+ if not source_type:
1115
+ return
1116
+ labels_repo = getattr(self._db, "labels", None)
1117
+ if labels_repo is None:
1118
+ return
1119
+ for uploaded in uploads:
1120
+ if not uploaded.remote_url or not uploaded.artifact_id:
1121
+ continue
1122
+ current = labels_repo.get_current("artifact", artifact_id=uploaded.artifact_id)
1123
+ metadata = current.get("metadata") if isinstance(current, dict) else None
1124
+ metadata = dict(metadata) if isinstance(metadata, dict) else {}
1125
+ roar_ns = metadata.get("roar")
1126
+ roar_ns = dict(roar_ns) if isinstance(roar_ns, dict) else {}
1127
+ distribution = roar_ns.get("distribution")
1128
+ distribution = dict(distribution) if isinstance(distribution, dict) else {}
1129
+ if distribution.get("url") == uploaded.remote_url:
1130
+ continue # already recorded — avoid a redundant label version
1131
+ distribution["url"] = uploaded.remote_url
1132
+ roar_ns["distribution"] = distribution
1133
+ metadata["roar"] = roar_ns
1134
+ labels_repo.create_version(
1135
+ "artifact",
1136
+ metadata,
1137
+ artifact_id=uploaded.artifact_id,
1138
+ write_origin=LABEL_ORIGIN_SYSTEM,
1139
+ )
1140
+
1043
1141
  def _sync_put_job_labels_with_glaas(
1044
1142
  self,
1045
1143
  *,
@@ -1049,16 +1147,25 @@ class PutService:
1049
1147
  job_uid: str,
1050
1148
  remote_job_uid: str,
1051
1149
  registration_errors: list[str],
1150
+ uploads: list[_UploadedArtifact] | None = None,
1151
+ registration_session_id: str | None = None,
1052
1152
  ) -> None:
1053
- """Sync the local current label document for the publish-time put job."""
1153
+ """Sync the local current label document for the publish-time put job
1154
+ and its published artifacts (carrying ``roar.distribution.url``)."""
1155
+ artifacts = (
1156
+ [{"id": u.artifact_id, "hash": u.hash} for u in uploads if u.artifact_id and u.hash]
1157
+ if uploads
1158
+ else []
1159
+ )
1054
1160
  sync_publish_labels(
1055
1161
  glaas_client=glaas_client,
1056
1162
  db_ctx=self._db,
1057
1163
  session_id=None,
1058
1164
  session_hash=session_hash,
1059
1165
  jobs=[{"id": job_id, "job_uid": job_uid, "remote_job_uid": remote_job_uid}],
1060
- artifacts=[],
1166
+ artifacts=artifacts,
1061
1167
  errors=registration_errors,
1168
+ registration_session_id=registration_session_id,
1062
1169
  )
1063
1170
 
1064
1171
  def _link_put_job_artifacts_with_glaas(