roar-cli 0.3.3__tar.gz → 0.3.5__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 (436) hide show
  1. {roar_cli-0.3.3 → roar_cli-0.3.5}/PKG-INFO +43 -77
  2. {roar_cli-0.3.3 → roar_cli-0.3.5}/README.md +42 -76
  3. {roar_cli-0.3.3 → roar_cli-0.3.5}/pyproject.toml +2 -1
  4. roar_cli-0.3.5/roar/application/composite/__init__.py +37 -0
  5. roar_cli-0.3.5/roar/application/composite/canonical.py +71 -0
  6. roar_cli-0.3.5/roar/application/composite/detect.py +120 -0
  7. roar_cli-0.3.5/roar/application/composite/qualifying.py +128 -0
  8. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/requests.py +2 -0
  9. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/results.py +4 -0
  10. roar_cli-0.3.5/roar/application/get/service.py +472 -0
  11. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/transfer.py +67 -8
  12. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/git.py +8 -2
  13. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/labels.py +60 -0
  14. roar_cli-0.3.5/roar/application/publish/anchor_attribution.py +100 -0
  15. roar_cli-0.3.5/roar/application/publish/composite_builder.py +592 -0
  16. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/composites.py +14 -8
  17. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/datasets.py +17 -38
  18. roar_cli-0.3.5/roar/application/publish/form_composites.py +133 -0
  19. roar_cli-0.3.5/roar/application/publish/git_remote.py +362 -0
  20. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/job_preparation.py +1 -1
  21. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/lineage.py +2 -0
  22. roar_cli-0.3.5/roar/application/publish/lineage_composite_formation.py +129 -0
  23. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/lineage_composites.py +44 -3
  24. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/put_composites.py +20 -4
  25. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/put_execution.py +62 -33
  26. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/put_preparation.py +3 -1
  27. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_execution.py +64 -3
  28. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_preparation.py +5 -1
  29. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_tag_push.py +13 -1
  30. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/registration.py +48 -13
  31. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/registration_package.py +5 -1
  32. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/requests.py +1 -0
  33. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/results.py +12 -0
  34. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/service.py +202 -1
  35. roar_cli-0.3.5/roar/application/publish/view_edges.py +204 -0
  36. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/dag.py +17 -1
  37. roar_cli-0.3.5/roar/application/query/db_status.py +292 -0
  38. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/git_readiness.py +2 -2
  39. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/requests.py +5 -0
  40. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/show.py +8 -2
  41. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/execution.py +29 -13
  42. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/system_labels.py +4 -0
  43. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/collector.py +8 -0
  44. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/fragment_reconstituter.py +0 -302
  45. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/command_registry.py +7 -0
  46. roar_cli-0.3.5/roar/cli/commands/auth.py +329 -0
  47. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/dag.py +14 -0
  48. roar_cli-0.3.5/roar/cli/commands/db.py +34 -0
  49. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/get.py +45 -9
  50. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/init.py +17 -10
  51. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/login.py +14 -2
  52. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/put.py +18 -5
  53. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/register.py +87 -2
  54. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/run.py +8 -5
  55. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/show.py +20 -1
  56. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/__init__.py +2 -0
  57. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/digests.py +11 -1
  58. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/exceptions.py +18 -0
  59. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/registration.py +11 -0
  60. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/artifact.py +1 -1
  61. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/glaas.py +1 -1
  62. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/provenance.py +4 -0
  63. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/validation.py +14 -21
  64. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/artifact.py +11 -1
  65. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/composite.py +20 -0
  66. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/job.py +9 -1
  67. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/label.py +9 -1
  68. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/session.py +10 -0
  69. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/lineage.py +4 -0
  70. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/registry.py +23 -2
  71. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/runtime_imports.py +10 -0
  72. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/file_filter.py +74 -1
  73. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/runtime_collector.py +21 -2
  74. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/__init__.py +0 -4
  75. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/job_recording.py +6 -432
  76. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/coordinator.py +11 -1
  77. roar_cli-0.3.5/roar/execution/runtime/inject/sitecustomize.py +134 -0
  78. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/inject/support.py +39 -0
  79. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/inject/tracker.py +9 -1
  80. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/lazy_install.py +99 -2
  81. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/tracer.py +26 -13
  82. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/tracer_backends.py +11 -0
  83. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/glaas_auth.py +36 -0
  84. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/glaas_client.py +26 -3
  85. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/__init__.py +0 -2
  86. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/access.py +11 -27
  87. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/loader.py +0 -3
  88. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/raw.py +35 -3
  89. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/schema.py +1 -16
  90. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/base.py +31 -2
  91. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/get.py +5 -0
  92. roar_cli-0.3.5/roar/integrations/download/hf.py +234 -0
  93. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/context.py +15 -4
  94. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/provider.py +56 -14
  95. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/client.py +69 -6
  96. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/artifact.py +127 -0
  97. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/coordinator.py +92 -7
  98. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/job.py +18 -6
  99. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/transport.py +20 -0
  100. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/dag_data_builder.py +44 -10
  101. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/run_report.py +95 -20
  102. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/show_renderer.py +26 -0
  103. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/publish_auth.py +42 -6
  104. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/capabilities.py +0 -2
  105. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/config.py +12 -2
  106. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/uploader.py +8 -0
  107. roar_cli-0.3.5/roar/version_check.py +105 -0
  108. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/Cargo.lock +12 -14
  109. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-py/Cargo.toml +1 -1
  110. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-py/src/lib.rs +3 -3
  111. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/common/src/lib.rs +2 -0
  112. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/probe/src/main.rs +58 -0
  113. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/attach.rs +12 -3
  114. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/daemon.rs +2 -10
  115. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/events.rs +38 -1
  116. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/state.rs +2 -1
  117. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/src/arch.rs +4 -0
  118. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/src/main.rs +66 -37
  119. roar_cli-0.3.3/roar/application/get/service.py +0 -234
  120. roar_cli-0.3.3/roar/application/publish/composite_builder.py +0 -339
  121. roar_cli-0.3.3/roar/application/publish/git_remote.py +0 -125
  122. roar_cli-0.3.3/roar/cli/commands/auth.py +0 -253
  123. roar_cli-0.3.3/roar/execution/runtime/inject/sitecustomize.py +0 -80
  124. {roar_cli-0.3.3 → roar_cli-0.3.5}/LICENSE +0 -0
  125. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/__init__.py +0 -0
  126. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/__main__.py +0 -0
  127. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/analyzers/__init__.py +0 -0
  128. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/analyzers/base.py +0 -0
  129. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/analyzers/experiment_trackers.py +0 -0
  130. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/__init__.py +0 -0
  131. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/__init__.py +0 -0
  132. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/label_rendering.py +0 -0
  133. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/__init__.py +0 -0
  134. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/models.py +0 -0
  135. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/policy.py +0 -0
  136. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/refs.py +0 -0
  137. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/remote_artifacts.py +0 -0
  138. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/runner.py +0 -0
  139. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/__init__.py +0 -0
  140. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/blake3_upgrade.py +0 -0
  141. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/collection.py +0 -0
  142. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/job_links.py +0 -0
  143. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/metadata.py +0 -0
  144. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_preview_jobs.py +0 -0
  145. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/remote_job_uids.py +0 -0
  146. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/remote_registry.py +0 -0
  147. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/runtime.py +0 -0
  148. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/secrets.py +0 -0
  149. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/session.py +0 -0
  150. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/source_resolution.py +0 -0
  151. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/targets.py +0 -0
  152. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/__init__.py +0 -0
  153. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff.py +0 -0
  154. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff_engine.py +0 -0
  155. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff_graph.py +0 -0
  156. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff_refs.py +0 -0
  157. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/inputs.py +0 -0
  158. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/label.py +0 -0
  159. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/lineage.py +0 -0
  160. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/log.py +0 -0
  161. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/results.py +0 -0
  162. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/status.py +0 -0
  163. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/__init__.py +0 -0
  164. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/environment.py +0 -0
  165. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/lookup.py +0 -0
  166. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/requests.py +0 -0
  167. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/results.py +0 -0
  168. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/service.py +0 -0
  169. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/__init__.py +0 -0
  170. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/dag_references.py +0 -0
  171. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/dirty_tree_classify.py +0 -0
  172. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/dirty_tree_error.py +0 -0
  173. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/gitignore_suggest.py +0 -0
  174. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/output_followup.py +0 -0
  175. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/requests.py +0 -0
  176. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/service.py +0 -0
  177. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/verbosity.py +0 -0
  178. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/__init__.py +0 -0
  179. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/requests.py +0 -0
  180. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/results.py +0 -0
  181. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/service.py +0 -0
  182. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/auth_store.py +0 -0
  183. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/__init__.py +0 -0
  184. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/local/__init__.py +0 -0
  185. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/local/plugin.py +0 -0
  186. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/__init__.py +0 -0
  187. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/config.py +0 -0
  188. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/export.py +0 -0
  189. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/host_execution.py +0 -0
  190. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/lineage.py +0 -0
  191. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/plugin.py +0 -0
  192. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/runtime_bundle.py +0 -0
  193. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/submit.py +0 -0
  194. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/workflow.py +0 -0
  195. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/__init__.py +0 -0
  196. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/_agent_names.py +0 -0
  197. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/config.py +0 -0
  198. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/constants.py +0 -0
  199. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/env_contract.py +0 -0
  200. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/fragment.py +0 -0
  201. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/node_agent.py +0 -0
  202. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/plugin.py +0 -0
  203. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/proxy_fragments.py +0 -0
  204. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/roar_worker.py +0 -0
  205. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/runtime_hooks.py +0 -0
  206. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/s3_key_paths.py +0 -0
  207. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/submit.py +0 -0
  208. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/submit_context.py +0 -0
  209. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/__init__.py +0 -0
  210. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/_format.py +0 -0
  211. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/__init__.py +0 -0
  212. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/build.py +0 -0
  213. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/config.py +0 -0
  214. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/diff.py +0 -0
  215. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/env.py +0 -0
  216. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/export_registration_package.py +0 -0
  217. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/filter.py +0 -0
  218. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/init_agents.py +0 -0
  219. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/inputs.py +0 -0
  220. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/label.py +0 -0
  221. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/lineage.py +0 -0
  222. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/log.py +0 -0
  223. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/logout.py +0 -0
  224. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/osmo.py +0 -0
  225. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/pop.py +0 -0
  226. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/projects.py +0 -0
  227. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/proxy.py +0 -0
  228. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/reproduce.py +0 -0
  229. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/reset.py +0 -0
  230. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/scope.py +0 -0
  231. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/status.py +0 -0
  232. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/telemetry.py +0 -0
  233. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/tracer.py +0 -0
  234. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/tui.py +0 -0
  235. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/whoami.py +0 -0
  236. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/workflow.py +0 -0
  237. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/context.py +0 -0
  238. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/decorators.py +0 -0
  239. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/publish_intent.py +0 -0
  240. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
  241. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
  242. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/bootstrap.py +0 -0
  243. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/canonical_session.py +0 -0
  244. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/dto/__init__.py +0 -0
  245. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/dto/registration.py +0 -0
  246. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/__init__.py +0 -0
  247. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/config.py +0 -0
  248. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/lineage.py +0 -0
  249. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/logger.py +0 -0
  250. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/presenter.py +0 -0
  251. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/provenance.py +0 -0
  252. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/repositories.py +0 -0
  253. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/reproduction.py +0 -0
  254. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/run.py +0 -0
  255. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/services.py +0 -0
  256. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/telemetry.py +0 -0
  257. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/vcs.py +0 -0
  258. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/label_constants.py +0 -0
  259. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/label_origins.py +0 -0
  260. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/logging.py +0 -0
  261. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/__init__.py +0 -0
  262. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/base.py +0 -0
  263. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/dag.py +0 -0
  264. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/dataset_identifier.py +0 -0
  265. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/job.py +0 -0
  266. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/lineage.py +0 -0
  267. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/run.py +0 -0
  268. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/session.py +0 -0
  269. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/telemetry.py +0 -0
  270. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/vcs.py +0 -0
  271. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/operation_metadata.py +0 -0
  272. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/session_hash.py +0 -0
  273. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/step_name.py +0 -0
  274. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/tracer_modes.py +0 -0
  275. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/__init__.py +0 -0
  276. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/context.py +0 -0
  277. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/engine.py +0 -0
  278. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/hashing/__init__.py +0 -0
  279. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/hashing/backend.py +0 -0
  280. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/hashing/blake3.py +0 -0
  281. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/models.py +0 -0
  282. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/query_context.py +0 -0
  283. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/__init__.py +0 -0
  284. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/collection.py +0 -0
  285. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/hash_cache.py +0 -0
  286. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/schema.py +0 -0
  287. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/__init__.py +0 -0
  288. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/hashing.py +0 -0
  289. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/job_recording.py +0 -0
  290. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/session.py +0 -0
  291. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/step_priority.py +0 -0
  292. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/__init__.py +0 -0
  293. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/__init__.py +0 -0
  294. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/bridge.py +0 -0
  295. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/proxy.py +0 -0
  296. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/proxy_config.py +0 -0
  297. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/__init__.py +0 -0
  298. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/lineage.py +0 -0
  299. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/models.py +0 -0
  300. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/reconstitution.py +0 -0
  301. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/sessions.py +0 -0
  302. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/transport.py +0 -0
  303. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/__init__.py +0 -0
  304. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/contract.py +0 -0
  305. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/planning.py +0 -0
  306. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/__init__.py +0 -0
  307. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/assembler.py +0 -0
  308. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/build_pip_collector.py +0 -0
  309. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/build_tool_collector.py +0 -0
  310. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/data_loader.py +0 -0
  311. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/package_collector.py +0 -0
  312. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/process_summarizer.py +0 -0
  313. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/service.py +0 -0
  314. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/dataset_identifier.py +0 -0
  315. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/dataset_metadata.py +0 -0
  316. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/dataset_profile.py +0 -0
  317. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/__init__.py +0 -0
  318. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/environment_setup.py +0 -0
  319. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/installers.py +0 -0
  320. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/pipeline_executor.py +0 -0
  321. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/pipeline_metadata.py +0 -0
  322. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/__init__.py +0 -0
  323. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/abi_probe.py +0 -0
  324. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/backup.py +0 -0
  325. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/driver_entrypoint.py +0 -0
  326. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/errors.py +0 -0
  327. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/host_execution.py +0 -0
  328. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/inject/__init__.py +0 -0
  329. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/proxy_resource.py +0 -0
  330. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/resources.py +0 -0
  331. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/signal_handler.py +0 -0
  332. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/tracer_banner.py +0 -0
  333. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/worker_bootstrap.py +0 -0
  334. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/filters/__init__.py +0 -0
  335. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/filters/files.py +0 -0
  336. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/filters/omit.py +0 -0
  337. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/__init__.py +0 -0
  338. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/bootstrap.py +0 -0
  339. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/discovery.py +0 -0
  340. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/__init__.py +0 -0
  341. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/gcs.py +0 -0
  342. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/http.py +0 -0
  343. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/noop.py +0 -0
  344. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/s3.py +0 -0
  345. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/__init__.py +0 -0
  346. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/base.py +0 -0
  347. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/__init__.py +0 -0
  348. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/auth.py +0 -0
  349. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/fragment_streamer.py +0 -0
  350. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/__init__.py +0 -0
  351. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
  352. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/session.py +0 -0
  353. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/registry.py +0 -0
  354. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/resolution.py +0 -0
  355. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/__init__.py +0 -0
  356. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/base.py +0 -0
  357. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/gcs.py +0 -0
  358. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/memory.py +0 -0
  359. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/noop.py +0 -0
  360. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/publish.py +0 -0
  361. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/s3.py +0 -0
  362. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/telemetry/__init__.py +0 -0
  363. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/telemetry/base.py +0 -0
  364. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/telemetry/wandb.py +0 -0
  365. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/__init__.py +0 -0
  366. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/console.py +0 -0
  367. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/dag_renderer.py +0 -0
  368. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/diff_renderer.py +0 -0
  369. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/formatting.py +0 -0
  370. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/null.py +0 -0
  371. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/spinner.py +0 -0
  372. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/terminal.py +0 -0
  373. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/require.py +0 -0
  374. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/scope_config.py +0 -0
  375. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/__init__.py +0 -0
  376. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/_io.py +0 -0
  377. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/hooks.py +0 -0
  378. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/install.py +0 -0
  379. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/paths.py +0 -0
  380. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/payload.py +0 -0
  381. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/queue.py +0 -0
  382. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/stats.py +0 -0
  383. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/__init__.py +0 -0
  384. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/app.py +0 -0
  385. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/data.py +0 -0
  386. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/__init__.py +0 -0
  387. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/config_editor.py +0 -0
  388. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/label_editor.py +0 -0
  389. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/launcher.py +0 -0
  390. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/log.py +0 -0
  391. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/main.py +0 -0
  392. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/search.py +0 -0
  393. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/session_picker.py +0 -0
  394. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/tmux.py +0 -0
  395. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/widgets/__init__.py +0 -0
  396. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/widgets/detail.py +0 -0
  397. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/utils/__init__.py +0 -0
  398. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/utils/cloud.py +0 -0
  399. {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/utils/git_url.py +0 -0
  400. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/Cargo.toml +0 -0
  401. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
  402. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
  403. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-fd/Cargo.toml +0 -0
  404. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-fd/src/lib.rs +0 -0
  405. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-runtime/Cargo.toml +0 -0
  406. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-runtime/src/lib.rs +0 -0
  407. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-schema/Cargo.toml +0 -0
  408. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-schema/src/lib.rs +0 -0
  409. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/Cargo.lock +0 -0
  410. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/Cargo.toml +0 -0
  411. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/src/forward.rs +0 -0
  412. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/src/main.rs +0 -0
  413. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/src/s3.rs +0 -0
  414. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/common/Cargo.toml +0 -0
  415. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
  416. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
  417. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
  418. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/build.rs +0 -0
  419. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
  420. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
  421. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
  422. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
  423. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
  424. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/Cargo.toml +0 -0
  425. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/build.rs +0 -0
  426. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
  427. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/interpose.c +0 -0
  428. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/ipc.rs +0 -0
  429. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/lib.rs +0 -0
  430. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/main.rs +0 -0
  431. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/tests/comprehensive.rs +0 -0
  432. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/tests/standalone.rs +0 -0
  433. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/Cargo.toml +0 -0
  434. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/rustfmt.toml +0 -0
  435. {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/src/seccomp.rs +0 -0
  436. {roar_cli-0.3.3 → roar_cli-0.3.5}/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.3.3
3
+ Version: 0.3.5
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -51,6 +51,14 @@ Project-URL: Repository, https://github.com/treqs/roar
51
51
 
52
52
  **Run Observation & Artifact Registration**
53
53
 
54
+ ## Quickstart
55
+
56
+ ```bash
57
+ uv tool install roar-cli # installs the `roar` command (Python 3.10+)
58
+ roar init # set up roar in your project
59
+ roar run <command> # track a run — then `roar dag` to see it
60
+ ```
61
+
54
62
  `roar` tracks data artifacts and execution steps in ML pipelines, enabling reproducibility and lineage queries. `roar` tracking happens automagically by observing your commands as they run, capturing essential context without requiring you to define a pipeline explicitly.
55
63
 
56
64
  By identifying files based on their actual content rather than their names, it ensures you can always trace a result back to the exact inputs and code that produced it. This gives you reliable reproducibility and a clear history of your artifacts, all derived naturally from your workflow.
@@ -60,12 +68,16 @@ While `roar` captures your work locally, connecting it to a GLaaS (Global Lineag
60
68
  ## Installation
61
69
 
62
70
  ```bash
63
- pip install roar-cli
64
- # or with uv
71
+ # Recommended: install the `roar` command in an isolated tool environment
72
+ uv tool install roar-cli
73
+ # or: pipx install roar-cli
74
+
75
+ # Into an existing environment (e.g. to use roar alongside Ray in the same venv)
65
76
  uv pip install roar-cli
77
+ # or: pip install roar-cli
66
78
  ```
67
79
 
68
- Requires Python 3.10+.
80
+ Requires Python 3.10+. (A single stable-ABI wheel covers every Python 3.10+.)
69
81
 
70
82
  > For the full prereqs, platform support matrix, tracer-backend setup,
71
83
  > macOS SIP notes, and sdist build steps, see the canonical
@@ -83,44 +95,17 @@ Requires Python 3.10+.
83
95
 
84
96
  PyPI wheels are published for Linux (`x86_64`, `aarch64`) and macOS (`x86_64`, `arm64`).
85
97
 
86
- If a matching wheel isn't available, `pip install` falls through to the
87
- source distribution. The sdist ships the Rust tracer source but no
88
- pre-built binaries, so it requires a C toolchain (`gcc` / `clang`), Rust
89
- (`rustup`), and a few minutes to compile the tracers on first install.
98
+ On platforms without a published wheel (e.g. musl/Alpine, Windows, or glibc
99
+ older than the manylinux baseline), `pip install` falls through to the
100
+ source distribution, which ships the Rust tracer source but no pre-built
101
+ binaries so it needs a C toolchain (`gcc` / `clang`), Rust (`rustup`),
102
+ and a few minutes to compile the tracers on first install.
90
103
 
91
104
  ### Development Installation
92
105
 
93
- ```bash
94
- # Clone the repository
95
- git clone https://github.com/treqs/roar.git
96
- cd roar
97
-
98
- # One-shot dev install: Python package + Rust tracer binaries
99
- bash scripts/install-dev.sh
100
- ```
101
-
102
- `scripts/install-dev.sh` runs `pip install -e ".[dev]"` (preferring `uv`
103
- when available) and then builds the Rust tracer binaries
104
- (`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
105
- `roar-proxy`) and stages them into `roar/bin/`. A bare
106
- `pip install -e .` does _not_ build the tracer binaries because they
107
- live in separate cargo crates outside the maturin manifest, so
108
- `roar run` would fail with "No tracer binary found" until the script
109
- runs. See [Building from source](#building-from-source) below for
110
- details and the manual flow.
111
-
112
- ## Quick Start
113
-
114
- ```bash
115
- # Initialize roar in your project
116
- cd my-ml-project
117
- roar init
118
-
119
- # Run commands with provenance tracking
120
- roar run python preprocess.py --input data.csv --output features.parquet
121
- roar run python train.py --data features.parquet --output model.pt
122
- roar run python evaluate.py --model model.pt --output metrics.json
123
- ```
106
+ Installing from source (editable Python package + Rust tracer binaries) is
107
+ covered under [Development → Building from source](#building-from-source).
108
+ The fast path is `bash scripts/install-dev.sh`.
124
109
 
125
110
  ## Product Telemetry
126
111
 
@@ -162,8 +147,8 @@ roar config set telemetry.enabled false
162
147
  Environment opt-outs always win over saved config:
163
148
 
164
149
  ```bash
165
- DO_NOT_TRACK=1 roar run python train.py
166
- ROAR_NO_TELEMETRY=1 roar run python train.py
150
+ DO_NOT_TRACK=1 roar run python3 train.py
151
+ ROAR_NO_TELEMETRY=1 roar run python3 train.py
167
152
  ```
168
153
 
169
154
  Telemetry is also suppressed automatically in CI, pytest, and Roar-managed
@@ -258,7 +243,7 @@ Run a command with provenance tracking. Roar captures:
258
243
  - Command arguments
259
244
 
260
245
  ```bash
261
- roar run python train.py --epochs 10 --lr 0.001
246
+ roar run python3 train.py --epochs 10 --lr 0.001
262
247
  roar run ./scripts/preprocess.sh
263
248
  roar run torchrun --nproc_per_node=4 train.py
264
249
 
@@ -611,9 +596,9 @@ Named groups of artifacts, used for downloaded datasets or upload bundles.
611
596
 
612
597
  ```bash
613
598
  # Record your pipeline
614
- roar run python preprocess.py
615
- roar run python train.py --epochs 10
616
- roar run python evaluate.py
599
+ roar run python3 preprocess.py
600
+ roar run python3 train.py --epochs 10
601
+ roar run python3 evaluate.py
617
602
 
618
603
  # Later, reproduce an artifact
619
604
  roar reproduce <model-hash> --run
@@ -639,40 +624,21 @@ Add `.roar/` to your `.gitignore` (roar offers to do this during `roar init`).
639
624
 
640
625
  ## GLaaS Server
641
626
 
642
- Roar can register sessions, jobs, steps, and artifacts with a GLaaS (Global Lineage-as-a-Service) server using the `roar register` command.
643
-
644
- ### Server Setup
645
-
646
- ```bash
647
- # Install with server dependencies
648
- uv pip install -e ".[server]"
649
- # or without uv
650
- pip install -e ".[server]"
651
-
652
- # Run the server
653
- glaas-server
654
-
655
- # Or with custom host/port
656
- GLAAS_HOST=0.0.0.0 GLAAS_PORT=8080 glaas-server
657
- ```
658
-
659
- The server provides:
660
-
661
- - REST API for artifact and job registration
662
- - Web UI at `/` with artifact and job browsers
663
- - Search and filtering by command, GPU, file type, etc.
664
-
665
- ### Client Configuration
627
+ GLaaS (Global Lineage-as-a-Service) is the shared registry roar publishes to
628
+ with `roar register` and `roar put`. It's hosted at
629
+ [glaas.ai](https://glaas.ai) (default API endpoint `https://api.glaas.ai`),
630
+ so there's nothing to run yourself — sign in and publish.
666
631
 
667
632
  ```bash
668
- # Set the GLaaS server URL
669
- roar config set glaas.url http://localhost:8000
633
+ # Sign in (browser/device flow) for attributed, private, or project publishing
634
+ roar login
670
635
 
671
- # Show your SSH key (copy to GLaaS web UI)
672
- roar auth register
636
+ # Or register an SSH key for programmatic auth
637
+ roar auth register # show your public key to paste at glaas.ai
638
+ roar auth test # verify the connection
673
639
 
674
- # Test authentication
675
- roar auth test
640
+ # Point roar at a different GLaaS deployment if needed
641
+ roar config set glaas.url https://api.glaas.ai
676
642
  ```
677
643
 
678
644
  > [!TIP]
@@ -751,13 +717,13 @@ Verify the install with `roar tracer`; every backend listed should be
751
717
  ruff check .
752
718
 
753
719
  # Format check
754
- ruff format --check
720
+ ruff format --check .
755
721
 
756
722
  # Type checking
757
723
  mypy roar
758
724
 
759
725
  # Run all checks at once
760
- ruff check . && ruff format --check && mypy roar
726
+ ruff check . && ruff format --check . && mypy roar
761
727
  ```
762
728
 
763
729
  ### Running Tests
@@ -2,6 +2,14 @@
2
2
 
3
3
  **Run Observation & Artifact Registration**
4
4
 
5
+ ## Quickstart
6
+
7
+ ```bash
8
+ uv tool install roar-cli # installs the `roar` command (Python 3.10+)
9
+ roar init # set up roar in your project
10
+ roar run <command> # track a run — then `roar dag` to see it
11
+ ```
12
+
5
13
  `roar` tracks data artifacts and execution steps in ML pipelines, enabling reproducibility and lineage queries. `roar` tracking happens automagically by observing your commands as they run, capturing essential context without requiring you to define a pipeline explicitly.
6
14
 
7
15
  By identifying files based on their actual content rather than their names, it ensures you can always trace a result back to the exact inputs and code that produced it. This gives you reliable reproducibility and a clear history of your artifacts, all derived naturally from your workflow.
@@ -11,12 +19,16 @@ While `roar` captures your work locally, connecting it to a GLaaS (Global Lineag
11
19
  ## Installation
12
20
 
13
21
  ```bash
14
- pip install roar-cli
15
- # or with uv
22
+ # Recommended: install the `roar` command in an isolated tool environment
23
+ uv tool install roar-cli
24
+ # or: pipx install roar-cli
25
+
26
+ # Into an existing environment (e.g. to use roar alongside Ray in the same venv)
16
27
  uv pip install roar-cli
28
+ # or: pip install roar-cli
17
29
  ```
18
30
 
19
- Requires Python 3.10+.
31
+ Requires Python 3.10+. (A single stable-ABI wheel covers every Python 3.10+.)
20
32
 
21
33
  > For the full prereqs, platform support matrix, tracer-backend setup,
22
34
  > macOS SIP notes, and sdist build steps, see the canonical
@@ -34,44 +46,17 @@ Requires Python 3.10+.
34
46
 
35
47
  PyPI wheels are published for Linux (`x86_64`, `aarch64`) and macOS (`x86_64`, `arm64`).
36
48
 
37
- If a matching wheel isn't available, `pip install` falls through to the
38
- source distribution. The sdist ships the Rust tracer source but no
39
- pre-built binaries, so it requires a C toolchain (`gcc` / `clang`), Rust
40
- (`rustup`), and a few minutes to compile the tracers on first install.
49
+ On platforms without a published wheel (e.g. musl/Alpine, Windows, or glibc
50
+ older than the manylinux baseline), `pip install` falls through to the
51
+ source distribution, which ships the Rust tracer source but no pre-built
52
+ binaries so it needs a C toolchain (`gcc` / `clang`), Rust (`rustup`),
53
+ and a few minutes to compile the tracers on first install.
41
54
 
42
55
  ### Development Installation
43
56
 
44
- ```bash
45
- # Clone the repository
46
- git clone https://github.com/treqs/roar.git
47
- cd roar
48
-
49
- # One-shot dev install: Python package + Rust tracer binaries
50
- bash scripts/install-dev.sh
51
- ```
52
-
53
- `scripts/install-dev.sh` runs `pip install -e ".[dev]"` (preferring `uv`
54
- when available) and then builds the Rust tracer binaries
55
- (`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
56
- `roar-proxy`) and stages them into `roar/bin/`. A bare
57
- `pip install -e .` does _not_ build the tracer binaries because they
58
- live in separate cargo crates outside the maturin manifest, so
59
- `roar run` would fail with "No tracer binary found" until the script
60
- runs. See [Building from source](#building-from-source) below for
61
- details and the manual flow.
62
-
63
- ## Quick Start
64
-
65
- ```bash
66
- # Initialize roar in your project
67
- cd my-ml-project
68
- roar init
69
-
70
- # Run commands with provenance tracking
71
- roar run python preprocess.py --input data.csv --output features.parquet
72
- roar run python train.py --data features.parquet --output model.pt
73
- roar run python evaluate.py --model model.pt --output metrics.json
74
- ```
57
+ Installing from source (editable Python package + Rust tracer binaries) is
58
+ covered under [Development → Building from source](#building-from-source).
59
+ The fast path is `bash scripts/install-dev.sh`.
75
60
 
76
61
  ## Product Telemetry
77
62
 
@@ -113,8 +98,8 @@ roar config set telemetry.enabled false
113
98
  Environment opt-outs always win over saved config:
114
99
 
115
100
  ```bash
116
- DO_NOT_TRACK=1 roar run python train.py
117
- ROAR_NO_TELEMETRY=1 roar run python train.py
101
+ DO_NOT_TRACK=1 roar run python3 train.py
102
+ ROAR_NO_TELEMETRY=1 roar run python3 train.py
118
103
  ```
119
104
 
120
105
  Telemetry is also suppressed automatically in CI, pytest, and Roar-managed
@@ -209,7 +194,7 @@ Run a command with provenance tracking. Roar captures:
209
194
  - Command arguments
210
195
 
211
196
  ```bash
212
- roar run python train.py --epochs 10 --lr 0.001
197
+ roar run python3 train.py --epochs 10 --lr 0.001
213
198
  roar run ./scripts/preprocess.sh
214
199
  roar run torchrun --nproc_per_node=4 train.py
215
200
 
@@ -562,9 +547,9 @@ Named groups of artifacts, used for downloaded datasets or upload bundles.
562
547
 
563
548
  ```bash
564
549
  # Record your pipeline
565
- roar run python preprocess.py
566
- roar run python train.py --epochs 10
567
- roar run python evaluate.py
550
+ roar run python3 preprocess.py
551
+ roar run python3 train.py --epochs 10
552
+ roar run python3 evaluate.py
568
553
 
569
554
  # Later, reproduce an artifact
570
555
  roar reproduce <model-hash> --run
@@ -590,40 +575,21 @@ Add `.roar/` to your `.gitignore` (roar offers to do this during `roar init`).
590
575
 
591
576
  ## GLaaS Server
592
577
 
593
- Roar can register sessions, jobs, steps, and artifacts with a GLaaS (Global Lineage-as-a-Service) server using the `roar register` command.
594
-
595
- ### Server Setup
596
-
597
- ```bash
598
- # Install with server dependencies
599
- uv pip install -e ".[server]"
600
- # or without uv
601
- pip install -e ".[server]"
602
-
603
- # Run the server
604
- glaas-server
605
-
606
- # Or with custom host/port
607
- GLAAS_HOST=0.0.0.0 GLAAS_PORT=8080 glaas-server
608
- ```
609
-
610
- The server provides:
611
-
612
- - REST API for artifact and job registration
613
- - Web UI at `/` with artifact and job browsers
614
- - Search and filtering by command, GPU, file type, etc.
615
-
616
- ### Client Configuration
578
+ GLaaS (Global Lineage-as-a-Service) is the shared registry roar publishes to
579
+ with `roar register` and `roar put`. It's hosted at
580
+ [glaas.ai](https://glaas.ai) (default API endpoint `https://api.glaas.ai`),
581
+ so there's nothing to run yourself — sign in and publish.
617
582
 
618
583
  ```bash
619
- # Set the GLaaS server URL
620
- roar config set glaas.url http://localhost:8000
584
+ # Sign in (browser/device flow) for attributed, private, or project publishing
585
+ roar login
621
586
 
622
- # Show your SSH key (copy to GLaaS web UI)
623
- roar auth register
587
+ # Or register an SSH key for programmatic auth
588
+ roar auth register # show your public key to paste at glaas.ai
589
+ roar auth test # verify the connection
624
590
 
625
- # Test authentication
626
- roar auth test
591
+ # Point roar at a different GLaaS deployment if needed
592
+ roar config set glaas.url https://api.glaas.ai
627
593
  ```
628
594
 
629
595
  > [!TIP]
@@ -702,13 +668,13 @@ Verify the install with `roar tracer`; every backend listed should be
702
668
  ruff check .
703
669
 
704
670
  # Format check
705
- ruff format --check
671
+ ruff format --check .
706
672
 
707
673
  # Type checking
708
674
  mypy roar
709
675
 
710
676
  # Run all checks at once
711
- ruff check . && ruff format --check && mypy roar
677
+ ruff check . && ruff format --check . && mypy roar
712
678
  ```
713
679
 
714
680
  ### Running Tests
@@ -1,10 +1,11 @@
1
+
1
2
  [build-system]
2
3
  requires = ["maturin>=1.11.5,<2.0"]
3
4
  build-backend = "maturin"
4
5
 
5
6
  [project]
6
7
  name = "roar-cli"
7
- version = "0.3.3"
8
+ version = "0.3.5"
8
9
  description = "Reproducibility and provenance tracker for ML training pipelines"
9
10
  authors = [
10
11
  { name="TReqs Team", email="info@treqs.ai" }
@@ -0,0 +1,37 @@
1
+ """Composite artifacts v2 — qualifying hash + structural detection.
2
+
3
+ The host-agnostic ``sha256-tree`` qualifying hash (the dataset GLaaS key) and the
4
+ declared/structural detectors that decide what a composite is and which files carry
5
+ its identity. Composites form at the boundaries (``get``/``put``/``register``), not
6
+ inside ``roar run``.
7
+
8
+ This package is additive; it does not yet replace the legacy heuristic composite
9
+ path in ``roar.application.publish``.
10
+ """
11
+
12
+ from .canonical import normalize_relpath, preimage
13
+ from .detect import Detection, detect, detect_nested
14
+ from .qualifying import (
15
+ Composite,
16
+ Leaf,
17
+ blake3_tree,
18
+ build,
19
+ build_nested,
20
+ sha256_tree,
21
+ tree,
22
+ )
23
+
24
+ __all__ = [
25
+ "Composite",
26
+ "Detection",
27
+ "Leaf",
28
+ "blake3_tree",
29
+ "build",
30
+ "build_nested",
31
+ "detect",
32
+ "detect_nested",
33
+ "normalize_relpath",
34
+ "preimage",
35
+ "sha256_tree",
36
+ "tree",
37
+ ]
@@ -0,0 +1,71 @@
1
+ """Canonical preimage for the qualifying composite hash (``sha256-tree``).
2
+
3
+ The qualifying hash is roar's host-agnostic, content-addressable dataset key: a
4
+ ``sha256`` over a canonical, injective serialization of a composite's leaves. It is
5
+ path-sensitive (moving a file changes the key), content-only (no host metadata
6
+ enters), and locally computable, so the key registered by ``roar put`` equals the
7
+ key produced by ``roar get`` for the same bytes and layout.
8
+
9
+ This is distinct from roar's internal ``blake3`` file hashing: blake3 stays the
10
+ fast hash for primitive file lineage; ``sha256-tree`` is the *dataset* key.
11
+
12
+ Frozen decisions (any change is a version bump of the domain tag):
13
+ - leaf = (normalized_posix_relpath, "<component-algo>:<hexdigest>")
14
+ - component-algo is always ``sha256`` for a qualifying leaf; nested composites
15
+ use ``sha256-tree``
16
+ - leaves are sorted by the UTF-8 bytes of their normalized relpath
17
+ - size and mode do not enter the preimage
18
+ - NUL separates path from digest; newline terminates each leaf line
19
+ - a domain-separation prefix prevents cross-protocol collisions
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ DOMAIN_V1 = b"roar:sha256-tree:v1\n"
25
+ QUALIFYING_ALGO = "sha256"
26
+ NESTED_ALGO = "sha256-tree"
27
+
28
+
29
+ def normalize_relpath(path: str) -> str:
30
+ """Normalize a relative path to canonical POSIX form.
31
+
32
+ Backslashes become forward slashes, a leading ``./`` and leading slashes are
33
+ stripped. ``..`` components are rejected (a leaf must stay within its composite
34
+ root) and an empty result is an error.
35
+ """
36
+ p = path.replace("\\", "/")
37
+ while p.startswith("./"):
38
+ p = p[2:]
39
+ p = p.lstrip("/")
40
+ if not p:
41
+ raise ValueError("empty relative path is not a valid leaf key")
42
+ if any(segment == ".." for segment in p.split("/")):
43
+ raise ValueError(f"path escapes composite root: {path!r}")
44
+ return p
45
+
46
+
47
+ def leaf_line(relpath: str, algo: str, hexdigest: str) -> bytes:
48
+ """Serialize one leaf to its canonical line (relpath already normalized)."""
49
+ if not hexdigest:
50
+ raise ValueError(f"leaf {relpath!r} has empty digest")
51
+ return relpath.encode("utf-8") + b"\x00" + f"{algo}:{hexdigest.lower()}".encode() + b"\n"
52
+
53
+
54
+ def preimage(leaves: list[tuple[str, str, str]], *, domain: bytes = DOMAIN_V1) -> bytes:
55
+ """Build the canonical preimage from ``(relpath, algo, hexdigest)`` triples.
56
+
57
+ Relpaths are normalized and the set is sorted by normalized relpath bytes.
58
+ Duplicate normalized relpaths are rejected.
59
+ """
60
+ normalized: dict[str, tuple[str, str]] = {}
61
+ for relpath, algo, hexdigest in leaves:
62
+ key = normalize_relpath(relpath)
63
+ if key in normalized:
64
+ raise ValueError(f"duplicate leaf path in composite: {key!r}")
65
+ normalized[key] = (algo, hexdigest)
66
+
67
+ out = bytearray(domain)
68
+ for key in sorted(normalized, key=lambda k: k.encode("utf-8")):
69
+ algo, hexdigest = normalized[key]
70
+ out += leaf_line(key, algo, hexdigest)
71
+ return bytes(out)
@@ -0,0 +1,120 @@
1
+ """Structural dataset detection — declared/structural, never scored.
2
+
3
+ Each detector is a pure function of a file listing (relpaths) and returns a
4
+ :class:`Detection` naming the structural ``kind``, which files are identity-bearing
5
+ (``data``/``meta``) versus excluded ``boilerplate``, and any nested sub-datasets.
6
+
7
+ This replaces the role of the confidence scorer: a format's on-disk structure
8
+ either declares it or it does not. There are no thresholds or weights. When nothing
9
+ matches, ``kind`` is ``"unstructured"`` and the caller decides (an explicit
10
+ ``roar put --dataset`` may still declare it; an unstructured pile falls to the
11
+ download size-gate when imported from a host).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import posixpath
17
+ from dataclasses import dataclass
18
+
19
+ # Repo/git boilerplate present everywhere — never data, never identity-bearing.
20
+ #
21
+ # IDENTITY CONTRACT: this set is excluded from every composite digest (both the get
22
+ # sha256-tree and the put/register blake3-tree paths derive their exclusions from
23
+ # `detect().boilerplate`). It is therefore part of the `roar:{combiner}-tree:v1` digest
24
+ # domain: changing a member silently re-digests existing datasets and breaks the
25
+ # put-export <-> get-import identity guarantee. Any edit here MUST bump the tree domain
26
+ # version (v1 -> v2) in `canonical.py` and `composite_builder.py`.
27
+ BOILERPLATE = frozenset({".gitattributes", ".gitignore", "README.md", "LICENSE", ".DS_Store"})
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class Detection:
32
+ kind: str
33
+ data: list[str] # identity-bearing data files
34
+ meta: list[str] # identity-bearing, format-declared metadata
35
+ boilerplate: list[str] # excluded
36
+ nested: list[str] # subdir prefixes that are themselves structural datasets
37
+
38
+
39
+ def _split_boilerplate(paths: list[str]) -> tuple[list[str], list[str]]:
40
+ boiler = [p for p in paths if posixpath.basename(p) in BOILERPLATE]
41
+ rest = [p for p in paths if posixpath.basename(p) not in BOILERPLATE]
42
+ return rest, boiler
43
+
44
+
45
+ def _has(paths: set[str], name: str) -> bool:
46
+ return any(p == name or p.endswith("/" + name) for p in paths)
47
+
48
+
49
+ def detect(paths: list[str]) -> Detection:
50
+ """Detect the structural kind of a flat list of relpaths (one composite root)."""
51
+ rest, boiler = _split_boilerplate(paths)
52
+ pset = set(rest)
53
+
54
+ # --- LeRobot v2.x/v3.x: meta/info.json + data/chunk-*/*.parquet ---
55
+ if _has(pset, "meta/info.json") and any(p.startswith("data/chunk-") for p in rest):
56
+ meta = sorted(p for p in rest if p.startswith("meta/"))
57
+ data = sorted(p for p in rest if p.startswith("data/") or p.startswith("videos/"))
58
+ other = sorted(set(rest) - set(meta) - set(data))
59
+ return Detection("lerobot", data, meta, boiler + other, [])
60
+
61
+ # --- Zarr store: v2 (.zarray/.zgroup) or v3 (zarr.json) ---
62
+ if any(posixpath.basename(p) in (".zarray", ".zgroup", "zarr.json") for p in rest):
63
+ return Detection("zarr", sorted(rest), [], boiler, [])
64
+
65
+ # --- Lance dataset: <name>.lance/ with _versions/ + data/ ---
66
+ if any(p.endswith(".lance") or ".lance/" in ("/" + p) for p in rest) or _has(pset, "_versions"):
67
+ return Detection("lance", sorted(rest), [], boiler, [])
68
+
69
+ # --- TFDS / RLDS: dataset_info.json + features.json (+ *.tfrecord-*) ---
70
+ if _has(pset, "dataset_info.json") and _has(pset, "features.json"):
71
+ meta = sorted(
72
+ p for p in rest if posixpath.basename(p) in ("dataset_info.json", "features.json")
73
+ )
74
+ data = sorted(set(rest) - set(meta))
75
+ return Detection("rlds", data, meta, boiler, [])
76
+
77
+ # --- WebDataset: a set of .tar shards ---
78
+ tars = [p for p in rest if p.endswith(".tar")]
79
+ if len(tars) >= 2 and len(tars) == len(rest):
80
+ return Detection("webdataset", sorted(tars), [], boiler, [])
81
+
82
+ # --- Flat parquet shards (climbmix / esm2 style) ---
83
+ parquets = [p for p in rest if p.endswith(".parquet")]
84
+ if len(parquets) >= 2:
85
+ excluded = boiler + sorted(set(rest) - set(parquets))
86
+ return Detection("parquet-shards", sorted(parquets), [], excluded, [])
87
+
88
+ return Detection("unstructured", sorted(rest), [], boiler, [])
89
+
90
+
91
+ # Formats that declare themselves with a manifest/layout file are nestable as
92
+ # sub-datasets. Loose-shard formats (parquet-shards, webdataset) are deliberately
93
+ # excluded: a directory of partition dirs full of parquet shards (Hive-style
94
+ # ``date=.../part-*.parquet``) is ONE partitioned dataset, not nested sub-datasets,
95
+ # and is indistinguishable from a true container without a per-child manifest.
96
+ _NESTABLE_KINDS = frozenset({"lerobot", "zarr", "lance", "rlds"})
97
+
98
+
99
+ def detect_nested(paths: list[str]) -> Detection:
100
+ """Detect a *container* of sub-datasets (the nesting case).
101
+
102
+ Groups paths by top-level directory; if at least two top dirs each independently
103
+ detect as a *manifest-bearing* structural dataset, returns kind ``"nested"`` with
104
+ those dirs as nested composites. Otherwise falls back to flat :func:`detect` —
105
+ so partitioned single datasets and loose-shard splits stay one flat composite.
106
+ """
107
+ rest, boiler = _split_boilerplate(paths)
108
+ by_top: dict[str, list[str]] = {}
109
+ for p in rest:
110
+ if "/" in p:
111
+ top, sub = p.split("/", 1)
112
+ by_top.setdefault(top, []).append(sub)
113
+
114
+ structural_children = [
115
+ top for top, subs in by_top.items() if detect(subs).kind in _NESTABLE_KINDS
116
+ ]
117
+
118
+ if len(structural_children) >= 2:
119
+ return Detection("nested", [], [], boiler, sorted(structural_children))
120
+ return detect(paths)