roar-cli 0.3.3__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.3 → roar_cli-0.3.4}/PKG-INFO +1 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/pyproject.toml +2 -1
- 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.3 → roar_cli-0.3.4}/roar/application/get/requests.py +2 -0
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/roar/application/get/transfer.py +38 -8
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/git.py +8 -2
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/roar/application/publish/composites.py +14 -8
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/roar/application/publish/job_preparation.py +1 -1
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/roar/application/publish/lineage_composites.py +44 -3
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/put_composites.py +20 -4
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/put_execution.py +62 -33
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/put_preparation.py +3 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/register_execution.py +64 -3
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/register_preparation.py +5 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/register_tag_push.py +13 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/registration.py +48 -13
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/registration_package.py +5 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/requests.py +1 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/results.py +12 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/service.py +202 -1
- roar_cli-0.3.4/roar/application/publish/view_edges.py +204 -0
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/roar/application/query/git_readiness.py +2 -2
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/requests.py +5 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/show.py +8 -2
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/execution.py +23 -13
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/system_labels.py +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/collector.py +8 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/fragment_reconstituter.py +0 -302
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/command_registry.py +7 -0
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/roar/cli/commands/get.py +45 -9
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/init.py +17 -10
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/login.py +14 -2
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/put.py +18 -5
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/register.py +87 -2
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/run.py +8 -5
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/show.py +20 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/digests.py +11 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/registration.py +11 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/artifact.py +1 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/glaas.py +1 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/provenance.py +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/validation.py +14 -21
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/artifact.py +11 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/composite.py +20 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/job.py +9 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/label.py +9 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/session.py +10 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/services/lineage.py +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/framework/registry.py +23 -2
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/framework/runtime_imports.py +10 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/file_filter.py +74 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/recording/__init__.py +0 -4
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/recording/job_recording.py +6 -432
- roar_cli-0.3.4/roar/execution/runtime/inject/sitecustomize.py +134 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/inject/support.py +39 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/lazy_install.py +99 -2
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/tracer.py +13 -12
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/glaas_auth.py +36 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/glaas_client.py +26 -3
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/config/__init__.py +0 -2
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/config/access.py +11 -27
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/config/loader.py +0 -3
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/config/raw.py +35 -3
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/config/schema.py +1 -16
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/download/base.py +31 -2
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/roar/integrations/git/context.py +15 -4
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/git/provider.py +56 -14
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/client.py +69 -6
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/registration/artifact.py +127 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/registration/coordinator.py +92 -7
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/registration/job.py +18 -6
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/transport.py +20 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/dag_data_builder.py +44 -10
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/run_report.py +76 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/show_renderer.py +26 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/publish_auth.py +42 -6
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/capabilities.py +0 -2
- {roar_cli-0.3.3 → 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.3 → roar_cli-0.3.4}/rust/tracers/ebpf/common/src/lib.rs +2 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/probe/src/main.rs +58 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/attach.rs +12 -3
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/daemon.rs +2 -10
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/events.rs +38 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/state.rs +2 -1
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ptrace/src/arch.rs +4 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/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/execution/runtime/inject/sitecustomize.py +0 -80
- {roar_cli-0.3.3 → roar_cli-0.3.4}/LICENSE +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/README.md +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/__main__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/analyzers/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/analyzers/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/analyzers/experiment_trackers.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/get/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/label_rendering.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/lookup/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/lookup/models.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/lookup/policy.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/lookup/refs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/lookup/remote_artifacts.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/lookup/runner.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/blake3_upgrade.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/collection.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/job_links.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/register_preview_jobs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/remote_job_uids.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/remote_registry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/runtime.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/secrets.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/source_resolution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/publish/targets.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/diff.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/diff_engine.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/diff_graph.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/diff_refs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/inputs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/label.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/log.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/results.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/query/status.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/reproduce/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/reproduce/environment.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/reproduce/lookup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/reproduce/requests.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/reproduce/results.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/reproduce/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/dag_references.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/dirty_tree_classify.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/dirty_tree_error.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/gitignore_suggest.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/output_followup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/requests.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/run/verbosity.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/workflow/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/workflow/requests.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/workflow/results.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/application/workflow/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/auth_store.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/local/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/local/plugin.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/export.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/host_execution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/plugin.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/runtime_bundle.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/submit.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/osmo/workflow.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/_agent_names.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/constants.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/env_contract.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/fragment.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/node_agent.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/plugin.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/proxy_fragments.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/roar_worker.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/runtime_hooks.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/s3_key_paths.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/submit.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/backends/ray/submit_context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/_format.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/build.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/dag.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/diff.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/env.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/export_registration_package.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/filter.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/init_agents.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/inputs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/label.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/log.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/logout.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/osmo.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/pop.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/projects.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/proxy.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/reproduce.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/reset.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/scope.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/status.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/telemetry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/tracer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/tui.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/whoami.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/commands/workflow.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/decorators.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/publish_intent.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/bootstrap.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/canonical_session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/dto/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/dto/registration.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/exceptions.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/logger.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/presenter.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/provenance.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/repositories.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/reproduction.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/run.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/services.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/telemetry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/interfaces/vcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/label_constants.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/label_origins.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/logging.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/dag.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/dataset_identifier.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/job.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/run.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/telemetry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/models/vcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/operation_metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/session_hash.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/step_name.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/core/tracer_modes.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/engine.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/hashing/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/hashing/backend.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/hashing/blake3.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/models.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/query_context.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/collection.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/repositories/hash_cache.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/schema.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/services/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/services/hashing.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/services/job_recording.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/services/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/db/step_priority.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/cluster/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/cluster/bridge.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/cluster/proxy.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/cluster/proxy_config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/fragments/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/fragments/lineage.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/fragments/models.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/fragments/reconstitution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/fragments/sessions.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/fragments/transport.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/framework/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/framework/contract.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/framework/planning.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/assembler.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/build_pip_collector.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/build_tool_collector.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/data_loader.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/package_collector.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/process_summarizer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/runtime_collector.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/provenance/service.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/recording/dataset_identifier.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/recording/dataset_metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/recording/dataset_profile.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/reproduction/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/reproduction/environment_setup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/reproduction/installers.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/reproduction/pipeline_executor.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/reproduction/pipeline_metadata.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/abi_probe.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/backup.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/coordinator.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/driver_entrypoint.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/errors.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/host_execution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/inject/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/inject/tracker.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/proxy_resource.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/resources.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/signal_handler.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/tracer_backends.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/tracer_banner.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/execution/runtime/worker_bootstrap.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/filters/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/filters/files.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/filters/omit.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/bootstrap.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/discovery.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/download/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/download/gcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/download/http.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/download/noop.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/download/s3.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/git/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/git/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/auth.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/fragment_streamer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/registration/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/glaas/registration/session.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/registry.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/resolution.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/storage/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/storage/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/storage/gcs.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/storage/memory.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/storage/noop.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/storage/publish.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/storage/s3.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/telemetry/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/telemetry/base.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/integrations/telemetry/wandb.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/console.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/dag_renderer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/diff_renderer.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/formatting.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/null.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/spinner.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/presenters/terminal.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/require.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/scope_config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/_io.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/config.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/hooks.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/install.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/paths.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/payload.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/queue.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/telemetry/stats.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/app.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/data.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/config_editor.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/label_editor.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/launcher.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/log.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/main.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/search.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/screens/session_picker.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/tmux.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/widgets/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/tui/widgets/detail.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/utils/__init__.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/utils/cloud.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/roar/utils/git_url.py +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/Cargo.lock +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/artifact-hash-py/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/artifact-hash-py/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/tracer-fd/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/tracer-fd/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/tracer-runtime/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/tracer-runtime/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/tracer-schema/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/crates/tracer-schema/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/services/proxy/Cargo.lock +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/services/proxy/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/services/proxy/src/forward.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/services/proxy/src/main.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/services/proxy/src/s3.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/common/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/build.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/build.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/src/interpose.c +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/src/ipc.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/src/lib.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/src/main.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/tests/comprehensive.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/preload/tests/standalone.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ptrace/Cargo.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ptrace/rustfmt.toml +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/rust/tracers/ptrace/src/seccomp.rs +0 -0
- {roar_cli-0.3.3 → roar_cli-0.3.4}/scripts/sync_packaged_rust_artifacts.py +0 -0
|
@@ -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" }
|
|
@@ -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)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""The qualifying composite hash: ``<algo>-tree``.
|
|
2
|
+
|
|
3
|
+
The composite key follows the *source's natural content hash*, not a forced single
|
|
4
|
+
algorithm: a dataset built locally is keyed ``blake3-tree`` (roar already hashed it
|
|
5
|
+
with blake3 during the run — no re-hashing), while a dataset fetched from HF is
|
|
6
|
+
keyed ``sha256-tree`` (HF publishes sha256 LFS oids for free). The component
|
|
7
|
+
digests and the membership bloom use the same algorithm, so identity is internally
|
|
8
|
+
consistent. The ``-tree`` *construction* is one standard, path-sensitive canonical
|
|
9
|
+
form; only the content hash flowing through it varies by provenance.
|
|
10
|
+
|
|
11
|
+
A :class:`Leaf` is one file's content identity. ``kind`` records dataset ``data``,
|
|
12
|
+
format-declared ``meta`` (e.g. LeRobot ``meta/``), or excluded ``boilerplate``;
|
|
13
|
+
only ``data`` and ``meta`` leaves enter identity. ``verified`` distinguishes
|
|
14
|
+
*asserted* identity (a digest taken from a host's published metadata — trusts the
|
|
15
|
+
host) from *verified* identity (a digest roar computed from the bytes). Verification
|
|
16
|
+
never changes the digest; it only annotates trust.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import hashlib
|
|
22
|
+
from dataclasses import dataclass, field
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
from .canonical import preimage
|
|
26
|
+
|
|
27
|
+
_IDENTITY_KINDS = ("data", "meta")
|
|
28
|
+
DEFAULT_ALGO = "sha256"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _hasher(algo: str) -> Any:
|
|
32
|
+
"""Return a fresh hasher for the content algorithm (blake3 or a hashlib name)."""
|
|
33
|
+
if algo == "blake3":
|
|
34
|
+
import blake3
|
|
35
|
+
|
|
36
|
+
return blake3.blake3()
|
|
37
|
+
return hashlib.new(algo)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _domain(algo: str) -> bytes:
|
|
41
|
+
"""Per-algorithm domain-separation prefix (``roar:<algo>-tree:v1``)."""
|
|
42
|
+
return f"roar:{algo}-tree:v1\n".encode()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True)
|
|
46
|
+
class Leaf:
|
|
47
|
+
relpath: str
|
|
48
|
+
digest: str
|
|
49
|
+
kind: str = "data" # data | meta | boilerplate
|
|
50
|
+
size: int | None = None
|
|
51
|
+
verified: bool = False # False => asserted (from host metadata)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass(frozen=True)
|
|
55
|
+
class Composite:
|
|
56
|
+
digest: str # the <algo>-tree hex
|
|
57
|
+
algo: str # e.g. "sha256-tree" | "blake3-tree"
|
|
58
|
+
leaves: tuple[Leaf, ...]
|
|
59
|
+
nested: tuple[Composite, ...] = field(default_factory=tuple)
|
|
60
|
+
kind: str | None = None # structural format name; a LABEL, not part of the key
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def verified(self) -> bool:
|
|
64
|
+
"""True iff every identity-bearing leaf was content-verified."""
|
|
65
|
+
return all(leaf.verified for leaf in self.leaves if leaf.kind in _IDENTITY_KINDS)
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def identity_leaves(self) -> tuple[Leaf, ...]:
|
|
69
|
+
return tuple(leaf for leaf in self.leaves if leaf.kind in _IDENTITY_KINDS)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def tree(leaves: list[Leaf], *, algo: str = DEFAULT_ALGO) -> str:
|
|
73
|
+
"""Qualifying composite hash over identity-bearing leaves, in ``<algo>-tree``.
|
|
74
|
+
|
|
75
|
+
``algo`` is the per-file content algorithm (``sha256`` for HF/asserted,
|
|
76
|
+
``blake3`` for local) and is used both for the leaf digest label and the outer
|
|
77
|
+
combiner, so the key, components, and bloom all agree.
|
|
78
|
+
"""
|
|
79
|
+
triples = [(leaf.relpath, algo, leaf.digest) for leaf in leaves if leaf.kind in _IDENTITY_KINDS]
|
|
80
|
+
hasher = _hasher(algo)
|
|
81
|
+
hasher.update(preimage(triples, domain=_domain(algo)))
|
|
82
|
+
return hasher.hexdigest()
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def sha256_tree(leaves: list[Leaf]) -> str:
|
|
86
|
+
"""``tree`` specialized to sha256 (HF / asserted identity)."""
|
|
87
|
+
return tree(leaves, algo="sha256")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def blake3_tree(leaves: list[Leaf]) -> str:
|
|
91
|
+
"""``tree`` specialized to blake3 (locally-produced identity)."""
|
|
92
|
+
return tree(leaves, algo="blake3")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def build(leaves: list[Leaf], *, algo: str = DEFAULT_ALGO, kind: str | None = None) -> Composite:
|
|
96
|
+
"""Build a flat composite from leaves keyed by the source's content algorithm."""
|
|
97
|
+
return Composite(
|
|
98
|
+
digest=tree(leaves, algo=algo),
|
|
99
|
+
algo=f"{algo}-tree",
|
|
100
|
+
leaves=tuple(leaves),
|
|
101
|
+
kind=kind,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def build_nested(
|
|
106
|
+
children: list[tuple[str, Composite]],
|
|
107
|
+
*,
|
|
108
|
+
algo: str = DEFAULT_ALGO,
|
|
109
|
+
kind: str | None = None,
|
|
110
|
+
) -> Composite:
|
|
111
|
+
"""Composite-of-composites: a parent whose leaves are child composite hashes.
|
|
112
|
+
|
|
113
|
+
Used when a declared dataset contains independently-structured sub-datasets
|
|
114
|
+
(e.g. a directory of ``.zarr`` stores). The parent's identity is over
|
|
115
|
+
``(child_relpath, child.digest)`` tagged ``<algo>-tree``, so nesting is preserved
|
|
116
|
+
and the result is still purely content-derived.
|
|
117
|
+
"""
|
|
118
|
+
nested_label = f"{algo}-tree"
|
|
119
|
+
triples = [(relpath, nested_label, child.digest) for relpath, child in children]
|
|
120
|
+
hasher = _hasher(algo)
|
|
121
|
+
hasher.update(preimage(triples, domain=_domain(algo)))
|
|
122
|
+
return Composite(
|
|
123
|
+
digest=hasher.hexdigest(),
|
|
124
|
+
algo=nested_label,
|
|
125
|
+
leaves=(),
|
|
126
|
+
nested=tuple(child for _relpath, child in children),
|
|
127
|
+
kind=kind,
|
|
128
|
+
)
|
|
@@ -11,6 +11,7 @@ class GetDownloadedFile:
|
|
|
11
11
|
local_path: str
|
|
12
12
|
hash: str | None = None
|
|
13
13
|
size: int | None = None
|
|
14
|
+
remote_key: str | None = None # full manifest path (joins to the LFS sha256 oid)
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
@dataclass(frozen=True)
|
|
@@ -33,3 +34,6 @@ class GetResponse:
|
|
|
33
34
|
git_tag: str | None = None
|
|
34
35
|
warnings: list[str] = field(default_factory=list)
|
|
35
36
|
error: str | None = None
|
|
37
|
+
# MB of non-LFS identity files excluded from the anchor (over budget, no
|
|
38
|
+
# --full-anchor); None when the anchor is complete. Drives the CLI warning + hint.
|
|
39
|
+
anchor_lfs_only_mb: float | None = None
|