roar-cli 0.3.2__tar.gz → 0.3.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.
- {roar_cli-0.3.2 → roar_cli-0.3.4}/PKG-INFO +49 -16
- {roar_cli-0.3.2 → roar_cli-0.3.4}/README.md +48 -15
- {roar_cli-0.3.2 → roar_cli-0.3.4}/pyproject.toml +2 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/analyzers/experiment_trackers.py +47 -15
- roar_cli-0.3.4/roar/application/composite/__init__.py +37 -0
- roar_cli-0.3.4/roar/application/composite/canonical.py +71 -0
- roar_cli-0.3.4/roar/application/composite/detect.py +120 -0
- roar_cli-0.3.4/roar/application/composite/qualifying.py +128 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/get/requests.py +3 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/get/results.py +4 -0
- roar_cli-0.3.4/roar/application/get/service.py +472 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/get/transfer.py +38 -8
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/git.py +8 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/labels.py +60 -0
- roar_cli-0.3.4/roar/application/publish/anchor_attribution.py +100 -0
- roar_cli-0.3.4/roar/application/publish/composite_builder.py +592 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/composites.py +14 -8
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/datasets.py +17 -38
- roar_cli-0.3.4/roar/application/publish/form_composites.py +133 -0
- roar_cli-0.3.4/roar/application/publish/git_remote.py +362 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/job_preparation.py +1 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/lineage.py +2 -0
- roar_cli-0.3.4/roar/application/publish/lineage_composite_formation.py +129 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/lineage_composites.py +44 -3
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/put_composites.py +20 -4
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/put_execution.py +62 -33
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/put_preparation.py +3 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/register_execution.py +64 -3
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/register_preparation.py +5 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/register_tag_push.py +13 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/registration.py +48 -13
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/registration_package.py +5 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/requests.py +2 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/results.py +12 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/service.py +208 -1
- roar_cli-0.3.4/roar/application/publish/view_edges.py +204 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/dag.py +1 -1
- roar_cli-0.3.4/roar/application/query/db_status.py +292 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/git_readiness.py +2 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/requests.py +5 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/show.py +8 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/execution.py +23 -13
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/system_labels.py +4 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/collector.py +8 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/fragment_reconstituter.py +0 -302
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/command_registry.py +14 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/auth.py +29 -11
- roar_cli-0.3.4/roar/cli/commands/db.py +34 -0
- roar_cli-0.3.4/roar/cli/commands/filter.py +135 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/get.py +54 -9
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/init.py +17 -10
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/login.py +14 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/put.py +21 -5
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/register.py +87 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/run.py +8 -5
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/show.py +20 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/digests.py +11 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/registration.py +11 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/artifact.py +1 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/glaas.py +1 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/provenance.py +6 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/validation.py +14 -21
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/artifact.py +11 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/composite.py +20 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/job.py +9 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/label.py +9 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/session.py +10 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/schema.py +16 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/services/lineage.py +4 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/framework/registry.py +23 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/framework/runtime_imports.py +10 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/file_filter.py +109 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/recording/__init__.py +0 -4
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/recording/job_recording.py +104 -438
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/coordinator.py +29 -81
- roar_cli-0.3.4/roar/execution/runtime/inject/sitecustomize.py +134 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/inject/support.py +39 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/lazy_install.py +99 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/tracer.py +13 -12
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/glaas_auth.py +36 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/glaas_client.py +26 -3
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/config/__init__.py +0 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/config/access.py +11 -27
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/config/loader.py +50 -6
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/config/raw.py +35 -3
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/config/schema.py +2 -16
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/download/base.py +31 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/download/get.py +5 -0
- roar_cli-0.3.4/roar/integrations/download/hf.py +234 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/git/context.py +15 -4
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/git/provider.py +56 -14
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/client.py +69 -6
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/registration/artifact.py +127 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/registration/coordinator.py +92 -7
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/registration/job.py +18 -6
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/transport.py +20 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/dag_data_builder.py +44 -10
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/run_report.py +76 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/show_renderer.py +65 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/publish_auth.py +42 -6
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/capabilities.py +0 -2
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/uploader.py +8 -0
- roar_cli-0.3.4/roar/version_check.py +105 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/services/proxy/src/main.rs +5 -3
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/common/src/lib.rs +2 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/probe/src/main.rs +58 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/attach.rs +12 -3
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/daemon.rs +2 -10
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/events.rs +38 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/state.rs +2 -1
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ptrace/src/arch.rs +4 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ptrace/src/main.rs +66 -37
- roar_cli-0.3.2/roar/application/get/service.py +0 -169
- roar_cli-0.3.2/roar/application/publish/composite_builder.py +0 -339
- roar_cli-0.3.2/roar/application/publish/git_remote.py +0 -125
- roar_cli-0.3.2/roar/execution/runtime/inject/sitecustomize.py +0 -80
- {roar_cli-0.3.2 → roar_cli-0.3.4}/LICENSE +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/__main__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/analyzers/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/analyzers/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/get/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/label_rendering.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/lookup/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/lookup/models.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/lookup/policy.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/lookup/refs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/lookup/remote_artifacts.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/lookup/runner.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/blake3_upgrade.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/collection.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/job_links.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/register_preview_jobs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/remote_job_uids.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/remote_registry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/runtime.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/secrets.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/source_resolution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/publish/targets.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/diff.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/diff_engine.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/diff_graph.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/diff_refs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/inputs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/label.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/log.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/query/status.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/reproduce/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/reproduce/environment.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/reproduce/lookup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/reproduce/requests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/reproduce/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/reproduce/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/dag_references.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/dirty_tree_classify.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/dirty_tree_error.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/gitignore_suggest.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/output_followup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/requests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/run/verbosity.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/workflow/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/workflow/requests.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/workflow/results.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/application/workflow/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/auth_store.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/local/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/local/plugin.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/export.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/host_execution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/plugin.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/runtime_bundle.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/submit.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/osmo/workflow.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/_agent_names.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/constants.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/env_contract.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/fragment.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/node_agent.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/plugin.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/proxy_fragments.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/roar_worker.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/runtime_hooks.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/s3_key_paths.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/submit.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/backends/ray/submit_context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/_format.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/build.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/dag.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/diff.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/env.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/export_registration_package.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/init_agents.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/inputs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/label.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/log.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/logout.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/osmo.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/pop.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/projects.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/proxy.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/reproduce.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/reset.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/scope.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/status.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/telemetry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/tracer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/tui.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/whoami.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/commands/workflow.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/decorators.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/publish_intent.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/bootstrap.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/canonical_session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/dto/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/dto/registration.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/exceptions.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/logger.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/presenter.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/provenance.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/repositories.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/reproduction.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/run.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/services.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/telemetry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/interfaces/vcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/label_constants.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/label_origins.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/logging.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/dag.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/dataset_identifier.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/job.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/run.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/telemetry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/models/vcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/operation_metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/session_hash.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/step_name.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/core/tracer_modes.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/engine.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/hashing/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/hashing/backend.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/hashing/blake3.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/models.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/query_context.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/collection.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/repositories/hash_cache.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/services/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/services/hashing.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/services/job_recording.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/services/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/db/step_priority.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/cluster/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/cluster/bridge.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/cluster/proxy.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/cluster/proxy_config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/fragments/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/fragments/lineage.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/fragments/models.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/fragments/reconstitution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/fragments/sessions.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/fragments/transport.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/framework/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/framework/contract.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/framework/planning.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/assembler.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/build_pip_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/build_tool_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/data_loader.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/package_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/process_summarizer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/runtime_collector.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/provenance/service.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/recording/dataset_identifier.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/recording/dataset_metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/recording/dataset_profile.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/reproduction/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/reproduction/environment_setup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/reproduction/installers.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/reproduction/pipeline_executor.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/reproduction/pipeline_metadata.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/abi_probe.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/backup.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/driver_entrypoint.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/errors.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/host_execution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/inject/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/inject/tracker.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/proxy_resource.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/resources.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/signal_handler.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/tracer_backends.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/tracer_banner.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/execution/runtime/worker_bootstrap.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/filters/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/filters/files.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/filters/omit.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/bootstrap.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/discovery.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/download/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/download/gcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/download/http.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/download/noop.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/download/s3.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/git/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/git/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/auth.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/fragment_streamer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/registration/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/glaas/registration/session.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/registry.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/resolution.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/storage/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/storage/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/storage/gcs.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/storage/memory.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/storage/noop.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/storage/publish.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/storage/s3.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/telemetry/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/telemetry/base.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/integrations/telemetry/wandb.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/console.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/dag_renderer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/diff_renderer.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/formatting.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/null.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/spinner.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/presenters/terminal.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/require.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/scope_config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/_io.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/config.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/hooks.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/install.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/paths.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/payload.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/queue.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/telemetry/stats.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/app.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/data.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/config_editor.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/label_editor.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/launcher.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/log.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/main.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/search.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/screens/session_picker.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/tmux.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/widgets/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/tui/widgets/detail.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/utils/__init__.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/utils/cloud.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/roar/utils/git_url.py +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/Cargo.lock +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/artifact-hash-py/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/artifact-hash-py/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/tracer-fd/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/tracer-fd/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/tracer-runtime/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/tracer-runtime/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/tracer-schema/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/crates/tracer-schema/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/services/proxy/Cargo.lock +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/services/proxy/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/services/proxy/src/forward.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/services/proxy/src/s3.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/common/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/build.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/build.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/src/interpose.c +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/src/ipc.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/src/lib.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/src/main.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/tests/comprehensive.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/preload/tests/standalone.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ptrace/Cargo.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ptrace/rustfmt.toml +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.4}/rust/tracers/ptrace/src/seccomp.rs +0 -0
- {roar_cli-0.3.2 → roar_cli-0.3.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.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -103,7 +103,7 @@ bash scripts/install-dev.sh
|
|
|
103
103
|
when available) and then builds the Rust tracer binaries
|
|
104
104
|
(`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
|
|
105
105
|
`roar-proxy`) and stages them into `roar/bin/`. A bare
|
|
106
|
-
`pip install -e .` does
|
|
106
|
+
`pip install -e .` does _not_ build the tracer binaries because they
|
|
107
107
|
live in separate cargo crates outside the maturin manifest, so
|
|
108
108
|
`roar run` would fail with "No tracer binary found" until the script
|
|
109
109
|
runs. See [Building from source](#building-from-source) below for
|
|
@@ -325,6 +325,16 @@ To register SSH auth with GLaaS:
|
|
|
325
325
|
2. Sign up at <https://glaas.ai> where you can paste your public key
|
|
326
326
|
3. Run `roar auth test` to verify
|
|
327
327
|
|
|
328
|
+
### `roar login`
|
|
329
|
+
|
|
330
|
+
Authenticate with GLaaS and store your global login state for attributed publishing and project access. By default, `roar login` starts a browser/device login flow and can then unlock private or project-scoped publication in repositories that use `roar scope`.
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
roar login
|
|
334
|
+
roar login --force
|
|
335
|
+
roar login --token-file ~/.config/roar/auth.json
|
|
336
|
+
```
|
|
337
|
+
|
|
328
338
|
### `roar config`
|
|
329
339
|
|
|
330
340
|
View or set configuration options.
|
|
@@ -337,20 +347,20 @@ roar config set <key> <value>
|
|
|
337
347
|
|
|
338
348
|
Run `roar config list` to see all available options with descriptions. Common options:
|
|
339
349
|
|
|
340
|
-
| Key
|
|
341
|
-
|
|
|
342
|
-
| `output.track_repo_files`
|
|
343
|
-
| `output.quiet`
|
|
344
|
-
| `filters.ignore_system_reads`
|
|
345
|
-
| `filters.ignore_package_reads`
|
|
346
|
-
| `filters.ignore_torch_cache`
|
|
347
|
-
| `filters.ignore_tmp_files`
|
|
348
|
-
| `glaas.url`
|
|
349
|
-
| `glaas.web_url`
|
|
350
|
-
| `registration.public_by_default` | false
|
|
351
|
-
| `registration.omit.enabled`
|
|
352
|
-
| `hash.primary`
|
|
353
|
-
| `logging.level`
|
|
350
|
+
| Key | Default | Description |
|
|
351
|
+
| -------------------------------- | ---------------------- | --------------------------------------- |
|
|
352
|
+
| `output.track_repo_files` | false | Include repo files in provenance |
|
|
353
|
+
| `output.quiet` | false | Suppress written files report |
|
|
354
|
+
| `filters.ignore_system_reads` | true | Ignore /sys, /etc, /sbin reads |
|
|
355
|
+
| `filters.ignore_package_reads` | true | Ignore installed package reads |
|
|
356
|
+
| `filters.ignore_torch_cache` | true | Ignore torch/triton cache |
|
|
357
|
+
| `filters.ignore_tmp_files` | true | Ignore /tmp files |
|
|
358
|
+
| `glaas.url` | <https://api.glaas.ai> | GLaaS server URL |
|
|
359
|
+
| `glaas.web_url` | <https://glaas.ai> | GLaaS web UI URL |
|
|
360
|
+
| `registration.public_by_default` | false | Default `register`/`put` visibility |
|
|
361
|
+
| `registration.omit.enabled` | true | Enable secret filtering |
|
|
362
|
+
| `hash.primary` | blake3 | Primary hash algorithm |
|
|
363
|
+
| `logging.level` | warning | Log level (debug, info, warning, error) |
|
|
354
364
|
|
|
355
365
|
### `roar dag`
|
|
356
366
|
|
|
@@ -382,6 +392,18 @@ Display recent job execution history.
|
|
|
382
392
|
roar log # Show recent job history
|
|
383
393
|
```
|
|
384
394
|
|
|
395
|
+
### `roar scope`
|
|
396
|
+
|
|
397
|
+
Show or change the default publication scope for the current repo. Scopes connect lineage from this repo to your personal space or to a specific org/project so later `roar register` and `roar put` commands publish in the right place.
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
roar scope status
|
|
401
|
+
roar scope list
|
|
402
|
+
roar scope use private
|
|
403
|
+
roar scope use acme/foundation-models
|
|
404
|
+
roar scope clear
|
|
405
|
+
```
|
|
406
|
+
|
|
385
407
|
### `roar label`
|
|
386
408
|
|
|
387
409
|
Manage local labels for DAGs (sessions), jobs, and artifacts.
|
|
@@ -413,6 +435,17 @@ roar label sync job @2
|
|
|
413
435
|
roar label sync artifact ./outputs/model.pt --dry-run
|
|
414
436
|
```
|
|
415
437
|
|
|
438
|
+
### `roar diff <ref-a> <ref-b>`
|
|
439
|
+
|
|
440
|
+
Compare the lineage of two artifacts, jobs, steps, or sessions to see what changed in their inputs, parameters, code, environment, or pipeline structure. Use it to identify the likely root cause when two outputs differ.
|
|
441
|
+
|
|
442
|
+
```bash
|
|
443
|
+
roar diff ./model.pkl ./model-v2.pkl
|
|
444
|
+
roar diff @5 @7 --format dag
|
|
445
|
+
roar diff session:current session:<hash>
|
|
446
|
+
roar diff @5 @7 --json
|
|
447
|
+
```
|
|
448
|
+
|
|
416
449
|
**Entity targets:**
|
|
417
450
|
|
|
418
451
|
- `dag`: `current` or a session hash prefix
|
|
@@ -54,7 +54,7 @@ bash scripts/install-dev.sh
|
|
|
54
54
|
when available) and then builds the Rust tracer binaries
|
|
55
55
|
(`roar-tracer`, `roar-tracer-preload`, `roar-tracer-ebpf`, `roard`,
|
|
56
56
|
`roar-proxy`) and stages them into `roar/bin/`. A bare
|
|
57
|
-
`pip install -e .` does
|
|
57
|
+
`pip install -e .` does _not_ build the tracer binaries because they
|
|
58
58
|
live in separate cargo crates outside the maturin manifest, so
|
|
59
59
|
`roar run` would fail with "No tracer binary found" until the script
|
|
60
60
|
runs. See [Building from source](#building-from-source) below for
|
|
@@ -276,6 +276,16 @@ To register SSH auth with GLaaS:
|
|
|
276
276
|
2. Sign up at <https://glaas.ai> where you can paste your public key
|
|
277
277
|
3. Run `roar auth test` to verify
|
|
278
278
|
|
|
279
|
+
### `roar login`
|
|
280
|
+
|
|
281
|
+
Authenticate with GLaaS and store your global login state for attributed publishing and project access. By default, `roar login` starts a browser/device login flow and can then unlock private or project-scoped publication in repositories that use `roar scope`.
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
roar login
|
|
285
|
+
roar login --force
|
|
286
|
+
roar login --token-file ~/.config/roar/auth.json
|
|
287
|
+
```
|
|
288
|
+
|
|
279
289
|
### `roar config`
|
|
280
290
|
|
|
281
291
|
View or set configuration options.
|
|
@@ -288,20 +298,20 @@ roar config set <key> <value>
|
|
|
288
298
|
|
|
289
299
|
Run `roar config list` to see all available options with descriptions. Common options:
|
|
290
300
|
|
|
291
|
-
| Key
|
|
292
|
-
|
|
|
293
|
-
| `output.track_repo_files`
|
|
294
|
-
| `output.quiet`
|
|
295
|
-
| `filters.ignore_system_reads`
|
|
296
|
-
| `filters.ignore_package_reads`
|
|
297
|
-
| `filters.ignore_torch_cache`
|
|
298
|
-
| `filters.ignore_tmp_files`
|
|
299
|
-
| `glaas.url`
|
|
300
|
-
| `glaas.web_url`
|
|
301
|
-
| `registration.public_by_default` | false
|
|
302
|
-
| `registration.omit.enabled`
|
|
303
|
-
| `hash.primary`
|
|
304
|
-
| `logging.level`
|
|
301
|
+
| Key | Default | Description |
|
|
302
|
+
| -------------------------------- | ---------------------- | --------------------------------------- |
|
|
303
|
+
| `output.track_repo_files` | false | Include repo files in provenance |
|
|
304
|
+
| `output.quiet` | false | Suppress written files report |
|
|
305
|
+
| `filters.ignore_system_reads` | true | Ignore /sys, /etc, /sbin reads |
|
|
306
|
+
| `filters.ignore_package_reads` | true | Ignore installed package reads |
|
|
307
|
+
| `filters.ignore_torch_cache` | true | Ignore torch/triton cache |
|
|
308
|
+
| `filters.ignore_tmp_files` | true | Ignore /tmp files |
|
|
309
|
+
| `glaas.url` | <https://api.glaas.ai> | GLaaS server URL |
|
|
310
|
+
| `glaas.web_url` | <https://glaas.ai> | GLaaS web UI URL |
|
|
311
|
+
| `registration.public_by_default` | false | Default `register`/`put` visibility |
|
|
312
|
+
| `registration.omit.enabled` | true | Enable secret filtering |
|
|
313
|
+
| `hash.primary` | blake3 | Primary hash algorithm |
|
|
314
|
+
| `logging.level` | warning | Log level (debug, info, warning, error) |
|
|
305
315
|
|
|
306
316
|
### `roar dag`
|
|
307
317
|
|
|
@@ -333,6 +343,18 @@ Display recent job execution history.
|
|
|
333
343
|
roar log # Show recent job history
|
|
334
344
|
```
|
|
335
345
|
|
|
346
|
+
### `roar scope`
|
|
347
|
+
|
|
348
|
+
Show or change the default publication scope for the current repo. Scopes connect lineage from this repo to your personal space or to a specific org/project so later `roar register` and `roar put` commands publish in the right place.
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
roar scope status
|
|
352
|
+
roar scope list
|
|
353
|
+
roar scope use private
|
|
354
|
+
roar scope use acme/foundation-models
|
|
355
|
+
roar scope clear
|
|
356
|
+
```
|
|
357
|
+
|
|
336
358
|
### `roar label`
|
|
337
359
|
|
|
338
360
|
Manage local labels for DAGs (sessions), jobs, and artifacts.
|
|
@@ -364,6 +386,17 @@ roar label sync job @2
|
|
|
364
386
|
roar label sync artifact ./outputs/model.pt --dry-run
|
|
365
387
|
```
|
|
366
388
|
|
|
389
|
+
### `roar diff <ref-a> <ref-b>`
|
|
390
|
+
|
|
391
|
+
Compare the lineage of two artifacts, jobs, steps, or sessions to see what changed in their inputs, parameters, code, environment, or pipeline structure. Use it to identify the likely root cause when two outputs differ.
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
roar diff ./model.pkl ./model-v2.pkl
|
|
395
|
+
roar diff @5 @7 --format dag
|
|
396
|
+
roar diff session:current session:<hash>
|
|
397
|
+
roar diff @5 @7 --json
|
|
398
|
+
```
|
|
399
|
+
|
|
367
400
|
**Entity targets:**
|
|
368
401
|
|
|
369
402
|
- `dag`: `current` or a session hash prefix
|
|
@@ -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.
|
|
8
|
+
version = "0.3.4"
|
|
8
9
|
description = "Reproducibility and provenance tracker for ML training pipelines"
|
|
9
10
|
authors = [
|
|
10
11
|
{ name="TReqs Team", email="info@treqs.ai" }
|
|
@@ -30,9 +30,19 @@ class ExperimentTrackerAnalyzer(Analyzer):
|
|
|
30
30
|
".neptune/*",
|
|
31
31
|
]
|
|
32
32
|
|
|
33
|
+
@staticmethod
|
|
34
|
+
def _all_written_files(context: dict) -> list:
|
|
35
|
+
"""Return unfiltered written files so tracker detection works even
|
|
36
|
+
when tracker directories are in ignore_paths."""
|
|
37
|
+
tracer_data = context.get("tracer_data", {})
|
|
38
|
+
unfiltered = tracer_data.get("written_files", [])
|
|
39
|
+
if unfiltered:
|
|
40
|
+
return unfiltered
|
|
41
|
+
return context.get("written_files", [])
|
|
42
|
+
|
|
33
43
|
def relevant(self, context: dict) -> bool:
|
|
34
44
|
"""Check if any tracker directories were written to."""
|
|
35
|
-
written =
|
|
45
|
+
written = self._all_written_files(context)
|
|
36
46
|
for path in written:
|
|
37
47
|
for _tracker, patterns in self.TRACKER_PATTERNS.items():
|
|
38
48
|
if any(p in path for p in patterns):
|
|
@@ -40,7 +50,7 @@ class ExperimentTrackerAnalyzer(Analyzer):
|
|
|
40
50
|
return False
|
|
41
51
|
|
|
42
52
|
def analyze(self, context: dict) -> dict | None:
|
|
43
|
-
written =
|
|
53
|
+
written = self._all_written_files(context)
|
|
44
54
|
env = context.get("env", {})
|
|
45
55
|
|
|
46
56
|
results: dict[str, Any] = {
|
|
@@ -126,7 +136,12 @@ class ExperimentTrackerAnalyzer(Analyzer):
|
|
|
126
136
|
run_dir = None
|
|
127
137
|
|
|
128
138
|
if run_dir and run_dir.exists():
|
|
129
|
-
#
|
|
139
|
+
# Extract run_id from directory name: run-YYYYMMDD_HHMMSS-<run_id>
|
|
140
|
+
dir_match = re.match(r"run-\d{8}_\d{6}-(.+)$", run_dir.name)
|
|
141
|
+
if dir_match:
|
|
142
|
+
info["run_id"] = dir_match.group(1)
|
|
143
|
+
|
|
144
|
+
# Try to read run metadata for additional fields
|
|
130
145
|
run_metadata = run_dir / "files" / "wandb-metadata.json"
|
|
131
146
|
if run_metadata.exists():
|
|
132
147
|
try:
|
|
@@ -135,34 +150,51 @@ class ExperimentTrackerAnalyzer(Analyzer):
|
|
|
135
150
|
info["run_id"] = metadata.get("run_id")
|
|
136
151
|
info["project"] = metadata.get("project")
|
|
137
152
|
info["entity"] = metadata.get("entity")
|
|
138
|
-
if
|
|
153
|
+
if info.get("entity") and info.get("project") and info.get("run_id"):
|
|
139
154
|
info["url"] = (
|
|
140
155
|
f"https://wandb.ai/{info['entity']}/{info['project']}/runs/{info['run_id']}"
|
|
141
156
|
)
|
|
142
157
|
except (OSError, json.JSONDecodeError):
|
|
143
158
|
pass
|
|
144
159
|
|
|
145
|
-
#
|
|
160
|
+
# Parse entity/project/run_id from debug.log.
|
|
161
|
+
# wandb writes "finishing run <entity>/<project>/<run_id>"
|
|
162
|
+
# to this file on every online run.
|
|
163
|
+
debug_log = run_dir / "logs" / "debug.log"
|
|
164
|
+
if debug_log.exists():
|
|
165
|
+
try:
|
|
166
|
+
text = debug_log.read_text(errors="replace")
|
|
167
|
+
finish_match = re.search(r"finishing run (\S+)/(\S+)/(\S+)", text)
|
|
168
|
+
if finish_match:
|
|
169
|
+
info["entity"] = finish_match.group(1)
|
|
170
|
+
info["project"] = finish_match.group(2)
|
|
171
|
+
info["run_id"] = finish_match.group(3)
|
|
172
|
+
except OSError:
|
|
173
|
+
pass
|
|
174
|
+
|
|
175
|
+
# Check wandb-summary.json for runtime
|
|
146
176
|
summary_file = run_dir / "files" / "wandb-summary.json"
|
|
147
|
-
if summary_file.exists()
|
|
177
|
+
if summary_file.exists():
|
|
148
178
|
try:
|
|
149
179
|
with open(summary_file) as f:
|
|
150
180
|
summary = json.load(f)
|
|
151
|
-
# Summary might have _wandb key with run info
|
|
152
181
|
wandb_info = summary.get("_wandb", {})
|
|
153
182
|
if "runtime" in wandb_info:
|
|
154
183
|
info["runtime_seconds"] = wandb_info["runtime"]
|
|
155
184
|
except (OSError, json.JSONDecodeError):
|
|
156
185
|
pass
|
|
157
186
|
|
|
158
|
-
# Fall back to env vars
|
|
159
|
-
if
|
|
160
|
-
entity = env.get("WANDB_ENTITY", "")
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
187
|
+
# Fall back to env vars if entity/project still missing
|
|
188
|
+
if not info.get("entity"):
|
|
189
|
+
info["entity"] = env.get("WANDB_ENTITY", "")
|
|
190
|
+
if not info.get("project"):
|
|
191
|
+
info["project"] = env.get("WANDB_PROJECT", "")
|
|
192
|
+
|
|
193
|
+
# Build URL if we have all three components
|
|
194
|
+
if info.get("entity") and info.get("project") and info.get("run_id"):
|
|
195
|
+
info["url"] = (
|
|
196
|
+
f"https://wandb.ai/{info['entity']}/{info['project']}/runs/{info['run_id']}"
|
|
197
|
+
)
|
|
166
198
|
|
|
167
199
|
return info if len(info) > 1 else None
|
|
168
200
|
|
|
@@ -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)
|