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