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.
- {roar_cli-0.3.3 → roar_cli-0.3.5}/PKG-INFO +43 -77
- {roar_cli-0.3.3 → roar_cli-0.3.5}/README.md +42 -76
- {roar_cli-0.3.3 → roar_cli-0.3.5}/pyproject.toml +2 -1
- roar_cli-0.3.5/roar/application/composite/__init__.py +37 -0
- roar_cli-0.3.5/roar/application/composite/canonical.py +71 -0
- roar_cli-0.3.5/roar/application/composite/detect.py +120 -0
- roar_cli-0.3.5/roar/application/composite/qualifying.py +128 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/requests.py +2 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/results.py +4 -0
- roar_cli-0.3.5/roar/application/get/service.py +472 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/transfer.py +67 -8
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/git.py +8 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/labels.py +60 -0
- roar_cli-0.3.5/roar/application/publish/anchor_attribution.py +100 -0
- roar_cli-0.3.5/roar/application/publish/composite_builder.py +592 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/composites.py +14 -8
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/datasets.py +17 -38
- roar_cli-0.3.5/roar/application/publish/form_composites.py +133 -0
- roar_cli-0.3.5/roar/application/publish/git_remote.py +362 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/job_preparation.py +1 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/lineage.py +2 -0
- roar_cli-0.3.5/roar/application/publish/lineage_composite_formation.py +129 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/lineage_composites.py +44 -3
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/put_composites.py +20 -4
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/put_execution.py +62 -33
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/put_preparation.py +3 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_execution.py +64 -3
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_preparation.py +5 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_tag_push.py +13 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/registration.py +48 -13
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/registration_package.py +5 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/requests.py +1 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/results.py +12 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/service.py +202 -1
- roar_cli-0.3.5/roar/application/publish/view_edges.py +204 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/dag.py +17 -1
- roar_cli-0.3.5/roar/application/query/db_status.py +292 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/git_readiness.py +2 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/requests.py +5 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/show.py +8 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/execution.py +29 -13
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/system_labels.py +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/collector.py +8 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/fragment_reconstituter.py +0 -302
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/command_registry.py +7 -0
- roar_cli-0.3.5/roar/cli/commands/auth.py +329 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/dag.py +14 -0
- roar_cli-0.3.5/roar/cli/commands/db.py +34 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/get.py +45 -9
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/init.py +17 -10
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/login.py +14 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/put.py +18 -5
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/register.py +87 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/run.py +8 -5
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/show.py +20 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/__init__.py +2 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/digests.py +11 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/exceptions.py +18 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/registration.py +11 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/artifact.py +1 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/glaas.py +1 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/provenance.py +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/validation.py +14 -21
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/artifact.py +11 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/composite.py +20 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/job.py +9 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/label.py +9 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/session.py +10 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/lineage.py +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/registry.py +23 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/runtime_imports.py +10 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/file_filter.py +74 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/runtime_collector.py +21 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/__init__.py +0 -4
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/job_recording.py +6 -432
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/coordinator.py +11 -1
- roar_cli-0.3.5/roar/execution/runtime/inject/sitecustomize.py +134 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/inject/support.py +39 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/inject/tracker.py +9 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/lazy_install.py +99 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/tracer.py +26 -13
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/tracer_backends.py +11 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/glaas_auth.py +36 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/glaas_client.py +26 -3
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/__init__.py +0 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/access.py +11 -27
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/loader.py +0 -3
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/raw.py +35 -3
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/config/schema.py +1 -16
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/base.py +31 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/get.py +5 -0
- roar_cli-0.3.5/roar/integrations/download/hf.py +234 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/context.py +15 -4
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/provider.py +56 -14
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/client.py +69 -6
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/artifact.py +127 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/coordinator.py +92 -7
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/job.py +18 -6
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/transport.py +20 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/dag_data_builder.py +44 -10
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/run_report.py +95 -20
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/show_renderer.py +26 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/publish_auth.py +42 -6
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/capabilities.py +0 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/config.py +12 -2
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/uploader.py +8 -0
- roar_cli-0.3.5/roar/version_check.py +105 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/Cargo.lock +12 -14
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-py/Cargo.toml +1 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-py/src/lib.rs +3 -3
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/common/src/lib.rs +2 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/probe/src/main.rs +58 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/attach.rs +12 -3
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/daemon.rs +2 -10
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/events.rs +38 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/state.rs +2 -1
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/src/arch.rs +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/src/main.rs +66 -37
- roar_cli-0.3.3/roar/application/get/service.py +0 -234
- roar_cli-0.3.3/roar/application/publish/composite_builder.py +0 -339
- roar_cli-0.3.3/roar/application/publish/git_remote.py +0 -125
- roar_cli-0.3.3/roar/cli/commands/auth.py +0 -253
- roar_cli-0.3.3/roar/execution/runtime/inject/sitecustomize.py +0 -80
- {roar_cli-0.3.3 → roar_cli-0.3.5}/LICENSE +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/__main__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/analyzers/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/analyzers/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/analyzers/experiment_trackers.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/get/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/label_rendering.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/models.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/policy.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/refs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/remote_artifacts.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/lookup/runner.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/blake3_upgrade.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/collection.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/job_links.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/register_preview_jobs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/remote_job_uids.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/remote_registry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/runtime.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/secrets.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/source_resolution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/publish/targets.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff_engine.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff_graph.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/diff_refs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/inputs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/label.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/log.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/results.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/query/status.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/environment.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/lookup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/requests.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/results.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/reproduce/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/dag_references.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/dirty_tree_classify.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/dirty_tree_error.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/gitignore_suggest.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/output_followup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/requests.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/run/verbosity.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/requests.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/results.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/application/workflow/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/auth_store.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/local/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/local/plugin.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/export.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/host_execution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/plugin.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/runtime_bundle.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/submit.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/osmo/workflow.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/_agent_names.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/constants.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/env_contract.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/fragment.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/node_agent.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/plugin.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/proxy_fragments.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/roar_worker.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/runtime_hooks.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/s3_key_paths.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/submit.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/backends/ray/submit_context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/_format.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/build.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/diff.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/env.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/export_registration_package.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/filter.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/init_agents.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/inputs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/label.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/log.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/logout.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/osmo.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/pop.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/projects.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/proxy.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/reproduce.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/reset.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/scope.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/status.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/telemetry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/tracer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/tui.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/whoami.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/commands/workflow.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/decorators.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/publish_intent.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/bootstrap.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/canonical_session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/dto/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/dto/registration.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/logger.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/presenter.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/provenance.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/repositories.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/reproduction.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/run.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/services.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/telemetry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/interfaces/vcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/label_constants.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/label_origins.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/logging.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/dag.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/dataset_identifier.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/job.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/run.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/telemetry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/models/vcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/operation_metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/session_hash.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/step_name.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/core/tracer_modes.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/engine.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/hashing/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/hashing/backend.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/hashing/blake3.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/models.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/query_context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/collection.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/repositories/hash_cache.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/schema.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/hashing.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/job_recording.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/services/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/db/step_priority.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/bridge.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/proxy.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/cluster/proxy_config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/models.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/reconstitution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/sessions.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/fragments/transport.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/contract.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/framework/planning.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/assembler.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/build_pip_collector.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/build_tool_collector.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/data_loader.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/package_collector.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/process_summarizer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/provenance/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/dataset_identifier.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/dataset_metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/recording/dataset_profile.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/environment_setup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/installers.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/pipeline_executor.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/reproduction/pipeline_metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/abi_probe.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/backup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/driver_entrypoint.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/errors.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/host_execution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/inject/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/proxy_resource.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/resources.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/signal_handler.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/tracer_banner.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/execution/runtime/worker_bootstrap.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/filters/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/filters/files.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/filters/omit.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/bootstrap.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/discovery.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/gcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/http.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/noop.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/download/s3.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/git/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/auth.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/fragment_streamer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/glaas/registration/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/registry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/resolution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/gcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/memory.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/noop.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/publish.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/storage/s3.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/telemetry/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/telemetry/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/integrations/telemetry/wandb.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/console.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/dag_renderer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/diff_renderer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/formatting.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/null.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/spinner.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/presenters/terminal.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/require.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/scope_config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/_io.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/hooks.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/install.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/paths.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/payload.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/queue.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/telemetry/stats.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/app.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/data.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/config_editor.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/label_editor.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/launcher.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/log.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/main.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/search.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/screens/session_picker.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/tmux.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/widgets/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/tui/widgets/detail.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/utils/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/utils/cloud.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/roar/utils/git_url.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-fd/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-fd/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-runtime/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-runtime/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-schema/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/crates/tracer-schema/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/Cargo.lock +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/src/forward.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/src/main.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/services/proxy/src/s3.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/common/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/build.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/build.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/interpose.c +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/ipc.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/src/main.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/tests/comprehensive.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/preload/tests/standalone.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/rustfmt.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.5}/rust/tracers/ptrace/src/seccomp.rs +0 -0
- {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
|
+
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
|
166
|
-
ROAR_NO_TELEMETRY=1 roar run
|
|
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
|
|
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
|
|
615
|
-
roar run
|
|
616
|
-
roar run
|
|
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
|
-
|
|
643
|
-
|
|
644
|
-
|
|
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
|
-
#
|
|
669
|
-
roar
|
|
633
|
+
# Sign in (browser/device flow) for attributed, private, or project publishing
|
|
634
|
+
roar login
|
|
670
635
|
|
|
671
|
-
#
|
|
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
|
-
#
|
|
675
|
-
roar
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
117
|
-
ROAR_NO_TELEMETRY=1 roar run
|
|
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
|
|
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
|
|
566
|
-
roar run
|
|
567
|
-
roar run
|
|
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
|
-
|
|
594
|
-
|
|
595
|
-
|
|
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
|
-
#
|
|
620
|
-
roar
|
|
584
|
+
# Sign in (browser/device flow) for attributed, private, or project publishing
|
|
585
|
+
roar login
|
|
621
586
|
|
|
622
|
-
#
|
|
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
|
-
#
|
|
626
|
-
roar
|
|
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.
|
|
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)
|