roar-cli 0.4.2__tar.gz → 0.4.3__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.3}/PKG-INFO +1 -1
- {roar_cli-0.4.2 → roar_cli-0.4.3}/pyproject.toml +1 -1
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/put_execution.py +67 -4
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/execution.py +2 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/requests.py +1 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/service.py +3 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/tags.py +12 -4
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/run.py +16 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/run.py +3 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/job_recording.py +7 -3
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/job_recording.py +1 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/coordinator.py +4 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/sitecustomize.py +11 -0
- roar_cli-0.4.3/roar/integrations/wandb_trackio.py +233 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/publish_auth.py +14 -1
- {roar_cli-0.4.2 → roar_cli-0.4.3}/LICENSE +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/README.md +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/__main__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/analyzers/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/analyzers/base.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/analyzers/experiment_trackers.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/canonical.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/detect.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/composite/qualifying.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/requests.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/results.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/service.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/get/transfer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/git.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/label_rendering.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/labels.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/models.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/policy.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/refs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/remote_artifacts.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/lookup/runner.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/anchor_attribution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/blake3_upgrade.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/collection.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/composite_builder.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/composites.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/datasets.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/form_composites.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/git_remote.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/job_links.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/job_preparation.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/lineage_composite_formation.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/lineage_composites.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/metadata.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/put_composites.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/put_preparation.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_execution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_preparation.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_preview_jobs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/register_tag_push.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/registration.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/registration_package.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/remote_job_uids.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/remote_registry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/requests.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/results.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/runtime.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/secrets.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/service.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/session.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/source_resolution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/targets.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/publish/view_edges.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/dag.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/db_status.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff_engine.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff_graph.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/diff_refs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/git_readiness.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/inputs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/label.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/log.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/requests.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/results.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/show.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/status.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/query/tag.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/environment.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/lookup.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/requests.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/results.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproduce/service.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproducibility/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/reproducibility/report.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/dag_references.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/dirty_tree_classify.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/dirty_tree_error.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/gitignore_suggest.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/output_followup.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/run/verbosity.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/system_labels.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/requests.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/results.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/application/workflow/service.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/auth_store.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/attach.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/bundles.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/fragment_reconstituter.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/host_execution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/manifest.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/mount_map.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/object_io.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/plugin.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/pod_entry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/rayjob.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/secret_cleanup.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/submit.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/webhook.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/k8s/workload_wait.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/local/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/local/plugin.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/export.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/host_execution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/plugin.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/runtime_bundle.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/submit.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/osmo/workflow.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/_agent_names.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/collector.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/constants.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/env_contract.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/fragment.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/fragment_reconstituter.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/node_agent.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/plugin.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/proxy_fragments.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/roar_worker.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/runtime_hooks.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/s3_key_paths.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/submit.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/backends/ray/submit_context.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/_format.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/_tag_kinds.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/command_registry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/auth.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/build.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/dag.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/db.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/diff.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/env.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/export_registration_package.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/filter.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/get.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/init.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/init_agents.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/inputs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/k8s.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/label.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/log.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/login.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/logout.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/osmo.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/pop.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/projects.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/proxy.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/put.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/register.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/reproduce.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/reset.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/scope.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/session.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/show.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/status.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/tag.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/telemetry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/tracer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/tui.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/whoami.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/commands/workflow.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/context.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/decorators.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/publish_intent.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/templates/agents/SKILL.md.tmpl +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/cli/templates/agents/agents_section.md.tmpl +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/bootstrap.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/canonical_session.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/digests.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/dto/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/dto/registration.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/exceptions.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/logger.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/presenter.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/provenance.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/registration.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/repositories.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/reproduction.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/run.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/services.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/telemetry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/interfaces/vcs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/label_constants.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/label_origins.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/logging.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/artifact.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/base.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/dag.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/dataset_identifier.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/glaas.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/job.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/provenance.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/session.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/telemetry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/models/vcs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/operation_metadata.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/session_hash.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/step_name.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/tracer_modes.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/core/validation.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/context.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/engine.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/hashing/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/hashing/backend.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/hashing/blake3.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/models.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/query_context.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/artifact.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/collection.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/composite.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/hash_cache.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/job.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/label.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/repositories/session.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/schema.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/hashing.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/services/session.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/db/step_priority.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/bridge.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/proxy.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/cluster/proxy_config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/export.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/lineage.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/models.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/reconstitution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/sessions.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/fragments/transport.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/contract.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/planning.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/registry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/framework/runtime_imports.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/assembler.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/build_pip_collector.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/build_tool_collector.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/data_loader.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/file_filter.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/package_collector.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/process_summarizer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/runtime_collector.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/provenance/service.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/dataset_identifier.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/dataset_metadata.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/recording/dataset_profile.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/environment_setup.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/installers.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/pipeline_executor.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/reproduction/pipeline_metadata.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/abi_probe.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/active_runs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/backup.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/driver_entrypoint.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/errors.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/host_execution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/support.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/inject/tracker.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/lazy_install.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/proxy_resource.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/resources.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/signal_handler.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/tracer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/tracer_backends.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/tracer_banner.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/execution/runtime/worker_bootstrap.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/filters/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/filters/files.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/filters/omit.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/glaas_auth.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/glaas_client.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/bootstrap.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/access.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/loader.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/raw.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/config/schema.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/discovery.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/base.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/gcs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/get.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/hf.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/http.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/noop.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/download/s3.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/base.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/context.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/git/provider.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/auth.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/client.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/fragment_streamer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/_artifact_ref.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/artifact.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/coordinator.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/job.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/registration/session.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/glaas/transport.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/registry.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/resolution.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/base.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/gcs.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/hf.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/memory.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/noop.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/publish.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/storage/s3.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/telemetry/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/telemetry/base.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/integrations/telemetry/wandb.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/console.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/dag_data_builder.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/dag_renderer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/diff_renderer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/formatting.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/null.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/run_report.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/show_renderer.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/spinner.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/presenters/terminal.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/require.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/scope_config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/_io.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/capabilities.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/config.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/hooks.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/install.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/paths.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/payload.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/queue.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/stats.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/telemetry/uploader.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/app.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/data.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/config_editor.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/label_editor.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/launcher.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/log.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/main.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/search.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/screens/session_picker.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/tmux.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/widgets/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/tui/widgets/detail.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/utils/__init__.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/utils/cloud.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/utils/git_url.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/roar/version_check.py +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/Cargo.lock +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-core/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-core/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-py/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/artifact-hash-py/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-fd/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-fd/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-runtime/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-runtime/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-schema/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/crates/tracer-schema/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/Cargo.lock +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/src/forward.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/src/main.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/services/proxy/src/s3.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/common/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/common/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/probe/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/probe/rust-toolchain.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/probe/src/main.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/build.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/attach.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/bin/roard.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/client.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/daemon.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/events.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/ipc.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/main.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ebpf/userspace/src/state.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/build.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/bin/io_fixture.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/interpose.c +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/ipc.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/lib.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/src/main.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/tests/comprehensive.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/preload/tests/standalone.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/Cargo.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/rustfmt.toml +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/src/arch.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/src/main.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/rust/tracers/ptrace/src/seccomp.rs +0 -0
- {roar_cli-0.4.2 → roar_cli-0.4.3}/scripts/sync_packaged_rust_artifacts.py +0 -0
|
@@ -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
|
|
@@ -309,6 +310,13 @@ class PutService:
|
|
|
309
310
|
artifact_hashes = [u.hash for u in uploads]
|
|
310
311
|
artifacts_info = [(u.artifact_id, u.local_path) for u in uploads]
|
|
311
312
|
|
|
313
|
+
# Record each uploaded artifact's distribution URL as a reserved system
|
|
314
|
+
# label, scoped to this publication, so GLaaS can surface it as the
|
|
315
|
+
# AI-BOM downloadLocation (see _set_publish_distribution_labels).
|
|
316
|
+
self._set_publish_distribution_labels(
|
|
317
|
+
uploads, normalize_registration_source_type(destination_type)
|
|
318
|
+
)
|
|
319
|
+
|
|
312
320
|
self._logger.debug(
|
|
313
321
|
"Upload complete: %d file(s), collecting lineage for hashes: %s",
|
|
314
322
|
len(uploaded_files),
|
|
@@ -538,6 +546,7 @@ class PutService:
|
|
|
538
546
|
job_uid=job_uid,
|
|
539
547
|
remote_job_uid=job_uid,
|
|
540
548
|
registration_errors=registration_result.errors,
|
|
549
|
+
uploads=uploads,
|
|
541
550
|
)
|
|
542
551
|
|
|
543
552
|
registration_error = (
|
|
@@ -810,6 +819,7 @@ class PutService:
|
|
|
810
819
|
job_uid=job_uid,
|
|
811
820
|
remote_job_uid=remote_put_job_uid,
|
|
812
821
|
registration_errors=registration_errors,
|
|
822
|
+
uploads=uploads,
|
|
813
823
|
)
|
|
814
824
|
|
|
815
825
|
composite_result_items = [
|
|
@@ -958,8 +968,12 @@ class PutService:
|
|
|
958
968
|
"size": size,
|
|
959
969
|
"source_type": source_type,
|
|
960
970
|
}
|
|
961
|
-
|
|
962
|
-
|
|
971
|
+
# Deliberately do NOT record the upload destination as the artifact's
|
|
972
|
+
# global ``source_url`` here. That row is content-addressed and shared
|
|
973
|
+
# across orgs, so a per-publication URL would leak between tenants.
|
|
974
|
+
# The download location is published instead as a session-scoped
|
|
975
|
+
# ``roar.distribution.url`` label (see _set_publish_distribution_labels),
|
|
976
|
+
# which both the registration-session and this legacy inline path emit.
|
|
963
977
|
|
|
964
978
|
payloads.append(entry)
|
|
965
979
|
|
|
@@ -1040,6 +1054,48 @@ class PutService:
|
|
|
1040
1054
|
return False
|
|
1041
1055
|
return True
|
|
1042
1056
|
|
|
1057
|
+
def _set_publish_distribution_labels(
|
|
1058
|
+
self,
|
|
1059
|
+
uploads: list[_UploadedArtifact],
|
|
1060
|
+
source_type: str | None,
|
|
1061
|
+
) -> None:
|
|
1062
|
+
"""Record each uploaded artifact's distribution URL as a reserved system
|
|
1063
|
+
label (``roar.distribution.url``), scoped to this publication.
|
|
1064
|
+
|
|
1065
|
+
GLaaS reads this as the artifact's AI-BOM ``downloadLocation``. Because
|
|
1066
|
+
the label lives on the ``(artifact, session)`` scope rather than the
|
|
1067
|
+
global content-addressed artifact row, two orgs publishing identical
|
|
1068
|
+
bytes each carry their own download location — no cross-tenant bleed.
|
|
1069
|
+
Gated on a recognized remote ``source_type`` so we never assert a
|
|
1070
|
+
distribution URL for a non-remote destination (e.g. ``memory://``).
|
|
1071
|
+
"""
|
|
1072
|
+
if not source_type:
|
|
1073
|
+
return
|
|
1074
|
+
labels_repo = getattr(self._db, "labels", None)
|
|
1075
|
+
if labels_repo is None:
|
|
1076
|
+
return
|
|
1077
|
+
for uploaded in uploads:
|
|
1078
|
+
if not uploaded.remote_url or not uploaded.artifact_id:
|
|
1079
|
+
continue
|
|
1080
|
+
current = labels_repo.get_current("artifact", artifact_id=uploaded.artifact_id)
|
|
1081
|
+
metadata = current.get("metadata") if isinstance(current, dict) else None
|
|
1082
|
+
metadata = dict(metadata) if isinstance(metadata, dict) else {}
|
|
1083
|
+
roar_ns = metadata.get("roar")
|
|
1084
|
+
roar_ns = dict(roar_ns) if isinstance(roar_ns, dict) else {}
|
|
1085
|
+
distribution = roar_ns.get("distribution")
|
|
1086
|
+
distribution = dict(distribution) if isinstance(distribution, dict) else {}
|
|
1087
|
+
if distribution.get("url") == uploaded.remote_url:
|
|
1088
|
+
continue # already recorded — avoid a redundant label version
|
|
1089
|
+
distribution["url"] = uploaded.remote_url
|
|
1090
|
+
roar_ns["distribution"] = distribution
|
|
1091
|
+
metadata["roar"] = roar_ns
|
|
1092
|
+
labels_repo.create_version(
|
|
1093
|
+
"artifact",
|
|
1094
|
+
metadata,
|
|
1095
|
+
artifact_id=uploaded.artifact_id,
|
|
1096
|
+
write_origin=LABEL_ORIGIN_SYSTEM,
|
|
1097
|
+
)
|
|
1098
|
+
|
|
1043
1099
|
def _sync_put_job_labels_with_glaas(
|
|
1044
1100
|
self,
|
|
1045
1101
|
*,
|
|
@@ -1049,15 +1105,22 @@ class PutService:
|
|
|
1049
1105
|
job_uid: str,
|
|
1050
1106
|
remote_job_uid: str,
|
|
1051
1107
|
registration_errors: list[str],
|
|
1108
|
+
uploads: list[_UploadedArtifact] | None = None,
|
|
1052
1109
|
) -> None:
|
|
1053
|
-
"""Sync the local current label document for the publish-time put job
|
|
1110
|
+
"""Sync the local current label document for the publish-time put job
|
|
1111
|
+
and its published artifacts (carrying ``roar.distribution.url``)."""
|
|
1112
|
+
artifacts = (
|
|
1113
|
+
[{"id": u.artifact_id, "hash": u.hash} for u in uploads if u.artifact_id and u.hash]
|
|
1114
|
+
if uploads
|
|
1115
|
+
else []
|
|
1116
|
+
)
|
|
1054
1117
|
sync_publish_labels(
|
|
1055
1118
|
glaas_client=glaas_client,
|
|
1056
1119
|
db_ctx=self._db,
|
|
1057
1120
|
session_id=None,
|
|
1058
1121
|
session_hash=session_hash,
|
|
1059
1122
|
jobs=[{"id": job_id, "job_uid": job_uid, "remote_job_uid": remote_job_uid}],
|
|
1060
|
-
artifacts=
|
|
1123
|
+
artifacts=artifacts,
|
|
1061
1124
|
errors=registration_errors,
|
|
1062
1125
|
)
|
|
1063
1126
|
|
|
@@ -218,6 +218,7 @@ def execute_and_report(
|
|
|
218
218
|
tracer_fallback: bool | None = None,
|
|
219
219
|
block_tags: list[str] | None = None,
|
|
220
220
|
add_tags: list[str] | None = None,
|
|
221
|
+
wandb_to_trackio: bool = False,
|
|
221
222
|
) -> ExecutionReport:
|
|
222
223
|
"""Execute command via selected backend and show the run report."""
|
|
223
224
|
hash_algos = cast(list[Literal["blake3", "sha256", "sha512", "md5"]], hash_algorithms)
|
|
@@ -240,6 +241,7 @@ def execute_and_report(
|
|
|
240
241
|
tracer_fallback=tracer_fallback,
|
|
241
242
|
block_tags=block_tags or [],
|
|
242
243
|
add_tags=add_tags or [],
|
|
244
|
+
wandb_to_trackio=wandb_to_trackio,
|
|
243
245
|
)
|
|
244
246
|
|
|
245
247
|
backend = get_execution_backend(backend_name)
|
|
@@ -19,6 +19,7 @@ class RunRequest:
|
|
|
19
19
|
hash_algorithms: tuple[str, ...] = field(default_factory=tuple)
|
|
20
20
|
block_tags: tuple[str, ...] = field(default_factory=tuple)
|
|
21
21
|
add_tags: tuple[str, ...] = field(default_factory=tuple)
|
|
22
|
+
wandb_to_trackio: bool = False
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
@dataclass(frozen=True)
|
|
@@ -64,6 +64,7 @@ def run_command(request: RunRequest) -> int:
|
|
|
64
64
|
tracer_fallback=request.tracer_fallback,
|
|
65
65
|
block_tags=list(request.block_tags),
|
|
66
66
|
add_tags=list(request.add_tags),
|
|
67
|
+
wandb_to_trackio=request.wandb_to_trackio,
|
|
67
68
|
)
|
|
68
69
|
|
|
69
70
|
|
|
@@ -112,6 +113,7 @@ def _execute_tracked_command(
|
|
|
112
113
|
tracer_fallback: bool | None,
|
|
113
114
|
block_tags: list[str] | None = None,
|
|
114
115
|
add_tags: list[str] | None = None,
|
|
116
|
+
wandb_to_trackio: bool = False,
|
|
115
117
|
) -> int:
|
|
116
118
|
resolved_config_start_dir = config_start_dir or _config_start_dir(roar_dir)
|
|
117
119
|
try:
|
|
@@ -139,6 +141,7 @@ def _execute_tracked_command(
|
|
|
139
141
|
tracer_fallback=tracer_fallback,
|
|
140
142
|
block_tags=block_tags,
|
|
141
143
|
add_tags=add_tags,
|
|
144
|
+
wandb_to_trackio=wandb_to_trackio,
|
|
142
145
|
)
|
|
143
146
|
)
|
|
144
147
|
except Exception:
|
|
@@ -570,20 +570,26 @@ def parse_add_tags(pairs: Iterable[str]) -> dict[str, list[str]]:
|
|
|
570
570
|
|
|
571
571
|
|
|
572
572
|
def build_run_modifiers(
|
|
573
|
-
block_tags: Iterable[str],
|
|
574
|
-
|
|
573
|
+
block_tags: Iterable[str],
|
|
574
|
+
add_tags: Iterable[str],
|
|
575
|
+
wandb_to_trackio: bool = False,
|
|
576
|
+
) -> dict[str, Any] | None:
|
|
575
577
|
"""Build the ``run_modifiers`` metadata block, or None if there's nothing to record.
|
|
576
578
|
|
|
577
579
|
Stores the raw flag strings verbatim (e.g. ``"license=GPL-3.0"``) so reproduce
|
|
578
|
-
replays exactly what was passed.
|
|
580
|
+
replays exactly what was passed. ``wandb_to_trackio`` records that the run used
|
|
581
|
+
``roar run --wandb-to-trackio`` so reproduce re-emits the flag (and the
|
|
582
|
+
reproduction's ``import wandb`` resolves the same way the original run's did).
|
|
579
583
|
"""
|
|
580
584
|
blocks = [b.strip() for b in block_tags if b.strip()]
|
|
581
585
|
adds = [a.strip() for a in add_tags if a.strip()]
|
|
582
|
-
modifiers: dict[str,
|
|
586
|
+
modifiers: dict[str, Any] = {}
|
|
583
587
|
if blocks:
|
|
584
588
|
modifiers["block_tags"] = blocks
|
|
585
589
|
if adds:
|
|
586
590
|
modifiers["add_tags"] = adds
|
|
591
|
+
if wandb_to_trackio:
|
|
592
|
+
modifiers["wandb_to_trackio"] = True
|
|
587
593
|
return modifiers or None
|
|
588
594
|
|
|
589
595
|
|
|
@@ -602,6 +608,8 @@ def run_modifier_flags(run_modifiers: Any) -> str:
|
|
|
602
608
|
parts.append(f"--block-tag {shlex.quote(str(item))}")
|
|
603
609
|
for item in run_modifiers.get("add_tags") or []:
|
|
604
610
|
parts.append(f"--add-tag {shlex.quote(str(item))}")
|
|
611
|
+
if run_modifiers.get("wandb_to_trackio"):
|
|
612
|
+
parts.append("--wandb-to-trackio")
|
|
605
613
|
return " ".join(parts)
|
|
606
614
|
|
|
607
615
|
|
|
@@ -84,6 +84,18 @@ def _validate_add_tags(
|
|
|
84
84
|
callback=_validate_add_tags,
|
|
85
85
|
help="Stamp KIND=VALUE onto this run's output artifacts (repeatable).",
|
|
86
86
|
)
|
|
87
|
+
@click.option(
|
|
88
|
+
"--wandb-to-trackio",
|
|
89
|
+
"wandb_to_trackio",
|
|
90
|
+
is_flag=True,
|
|
91
|
+
default=False,
|
|
92
|
+
help=(
|
|
93
|
+
"Route an unmodified wandb-instrumented workload through trackio. Mirrors "
|
|
94
|
+
"to TRACKIO_SPACE_ID (with HF_TOKEN) when set, else runs wandb as a silent "
|
|
95
|
+
"no-op. Recorded so `roar reproduce` re-emits it — a reproducer needs no "
|
|
96
|
+
"wandb account or extra flags."
|
|
97
|
+
),
|
|
98
|
+
)
|
|
87
99
|
@click.pass_obj
|
|
88
100
|
@require_init
|
|
89
101
|
def run(
|
|
@@ -97,6 +109,7 @@ def run(
|
|
|
97
109
|
hash_algorithms: tuple[str, ...],
|
|
98
110
|
block_tags: tuple[str, ...],
|
|
99
111
|
add_tags: tuple[str, ...],
|
|
112
|
+
wandb_to_trackio: bool,
|
|
100
113
|
) -> None:
|
|
101
114
|
"""Run a command with provenance tracking.
|
|
102
115
|
|
|
@@ -138,6 +151,7 @@ def run(
|
|
|
138
151
|
hash_algorithms=tuple(hash_algorithms),
|
|
139
152
|
block_tags=tuple(block_tags),
|
|
140
153
|
add_tags=tuple(add_tags),
|
|
154
|
+
wandb_to_trackio=wandb_to_trackio,
|
|
141
155
|
)
|
|
142
156
|
)
|
|
143
157
|
except ValueError as exc:
|
|
@@ -178,6 +192,8 @@ Options:
|
|
|
178
192
|
-n, --name <name> Set the name label for this step
|
|
179
193
|
--block-tag <kind[=value]> Stop a tag kind (or one value) from being inherited (repeatable)
|
|
180
194
|
--add-tag <kind=value> Stamp a tag onto this run's outputs (repeatable)
|
|
195
|
+
--wandb-to-trackio Route unmodified wandb logging through trackio (mirrors to
|
|
196
|
+
TRACKIO_SPACE_ID when set, else a silent no-op); re-emitted by reproduce
|
|
181
197
|
|
|
182
198
|
Hash algorithms: blake3 (default), sha256, sha512, md5
|
|
183
199
|
|
|
@@ -96,6 +96,9 @@ class RunContext(RoarBaseModel):
|
|
|
96
96
|
git_repo: str | None = None
|
|
97
97
|
block_tags: list[str] = Field(default_factory=list)
|
|
98
98
|
add_tags: list[str] = Field(default_factory=list)
|
|
99
|
+
# `roar run --wandb-to-trackio`: activate the bundled wandb->trackio alias in
|
|
100
|
+
# the traced child (via ROAR_WANDB_TO_TRACKIO). Recorded so reproduce re-emits it.
|
|
101
|
+
wandb_to_trackio: bool = False
|
|
99
102
|
|
|
100
103
|
@field_validator("roar_dir", mode="before")
|
|
101
104
|
@classmethod
|
|
@@ -106,6 +106,7 @@ class JobRecordingService:
|
|
|
106
106
|
hash_algorithms: list[str] | None = None,
|
|
107
107
|
block_tags: tuple[str, ...] = (),
|
|
108
108
|
add_tags: tuple[str, ...] = (),
|
|
109
|
+
wandb_to_trackio: bool = False,
|
|
109
110
|
) -> tuple[int, str]:
|
|
110
111
|
"""
|
|
111
112
|
Record a job with its inputs and outputs.
|
|
@@ -173,7 +174,7 @@ class JobRecordingService:
|
|
|
173
174
|
# Persist the roar-side run modifiers (--block-tag / --add-tag) on the job
|
|
174
175
|
# metadata so `roar reproduce` can replay them; a bare re-run would
|
|
175
176
|
# otherwise re-inherit blocked tags and drop stamped ones.
|
|
176
|
-
metadata = self._with_run_modifiers(metadata, block_tags, add_tags)
|
|
177
|
+
metadata = self._with_run_modifiers(metadata, block_tags, add_tags, wandb_to_trackio)
|
|
177
178
|
|
|
178
179
|
# Create the job record
|
|
179
180
|
job_id, job_uid = self._job_repo.create(
|
|
@@ -252,10 +253,13 @@ class JobRecordingService:
|
|
|
252
253
|
|
|
253
254
|
@staticmethod
|
|
254
255
|
def _with_run_modifiers(
|
|
255
|
-
metadata: str | None,
|
|
256
|
+
metadata: str | None,
|
|
257
|
+
block_tags: tuple[str, ...],
|
|
258
|
+
add_tags: tuple[str, ...],
|
|
259
|
+
wandb_to_trackio: bool = False,
|
|
256
260
|
) -> str | None:
|
|
257
261
|
"""Add a ``run_modifiers`` block to the job metadata JSON when flags were used."""
|
|
258
|
-
modifiers = build_run_modifiers(block_tags, add_tags)
|
|
262
|
+
modifiers = build_run_modifiers(block_tags, add_tags, wandb_to_trackio)
|
|
259
263
|
if modifiers is None:
|
|
260
264
|
return metadata
|
|
261
265
|
data: dict[str, Any] = {}
|
|
@@ -342,6 +342,7 @@ class ExecutionJobRecorder:
|
|
|
342
342
|
hash_algorithms=list(ctx.hash_algorithms),
|
|
343
343
|
block_tags=tuple(ctx.block_tags),
|
|
344
344
|
add_tags=tuple(ctx.add_tags),
|
|
345
|
+
wandb_to_trackio=ctx.wandb_to_trackio,
|
|
345
346
|
)
|
|
346
347
|
|
|
347
348
|
# Register proxy artifacts first so downstream output/input queries include them.
|
|
@@ -137,6 +137,10 @@ class RunCoordinator:
|
|
|
137
137
|
extra_env: dict[str, str] = {
|
|
138
138
|
ROAR_EXECUTION_BACKEND_ENV: str(ctx.execution_backend),
|
|
139
139
|
}
|
|
140
|
+
if ctx.wandb_to_trackio:
|
|
141
|
+
# Consumed by the injected child sitecustomize, which activates the
|
|
142
|
+
# bundled wandb->trackio alias before the workload imports wandb.
|
|
143
|
+
extra_env["ROAR_WANDB_TO_TRACKIO"] = "1"
|
|
140
144
|
runtime_observations = RuntimeObservationBundle()
|
|
141
145
|
resource_env = self._runtime_resources.start_all(ctx, os.environ)
|
|
142
146
|
extra_env.update(resource_env)
|
|
@@ -131,4 +131,15 @@ if os.environ.get("ROAR_WRAP") == "1":
|
|
|
131
131
|
)
|
|
132
132
|
|
|
133
133
|
|
|
134
|
+
if os.environ.get("ROAR_WANDB_TO_TRACKIO"):
|
|
135
|
+
# `roar run --wandb-to-trackio`: alias wandb -> trackio (or a silent no-op)
|
|
136
|
+
# before the workload imports wandb. Best-effort — never break the workload.
|
|
137
|
+
try:
|
|
138
|
+
with SuppressTracking():
|
|
139
|
+
from roar.integrations import wandb_trackio
|
|
140
|
+
|
|
141
|
+
wandb_trackio.install()
|
|
142
|
+
except Exception:
|
|
143
|
+
pass
|
|
144
|
+
|
|
134
145
|
atexit.register(_runtime_tracker.write_log)
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"""Optional ``wandb`` -> ``trackio`` integration for ``roar run --wandb-to-trackio``.
|
|
2
|
+
|
|
3
|
+
Opt-in and workload-agnostic. It ships *inside* roar, so anyone who reproduces a
|
|
4
|
+
run gets it from ``pip install roar-cli`` — no separate package, nothing baked into
|
|
5
|
+
a machine image, and it never appears as an un-installable dependency in a captured
|
|
6
|
+
lineage.
|
|
7
|
+
|
|
8
|
+
Activated only when the env var ``ROAR_WANDB_TO_TRACKIO`` is set. The
|
|
9
|
+
``roar run --wandb-to-trackio`` flag sets it to ``"1"``, and roar re-emits that flag
|
|
10
|
+
on ``roar reproduce`` (executor + ``--script``), so the toggle travels with the
|
|
11
|
+
recorded command. Set the env var to ``"off"`` to force the no-op even when a Space
|
|
12
|
+
is configured. roar's injected child ``sitecustomize`` calls :func:`install` before
|
|
13
|
+
the workload imports ``wandb``.
|
|
14
|
+
|
|
15
|
+
Two modes, chosen at run time from the environment — **no extra parameters**:
|
|
16
|
+
|
|
17
|
+
* **sync** — ``ROAR_WANDB_TO_TRACKIO != "off"`` and ``TRACKIO_SPACE_ID`` is set:
|
|
18
|
+
alias ``wandb`` to trackio and mirror the run to the hosted Space (needs
|
|
19
|
+
``HF_TOKEN``). Project / run name / config come from the workload's own
|
|
20
|
+
``wandb.init(...)`` call — nothing is passed through roar.
|
|
21
|
+
* **no-op** — ``ROAR_WANDB_TO_TRACKIO == "off"``, or no ``TRACKIO_SPACE_ID``, or
|
|
22
|
+
trackio isn't importable: alias ``wandb`` to a silent stub so an *unmodified*
|
|
23
|
+
wandb-instrumented repo imports and runs to completion with **no external
|
|
24
|
+
tracking and no credentials**. This is what a third-party reproducer gets by
|
|
25
|
+
default.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import sys
|
|
31
|
+
|
|
32
|
+
# wandb.init kwargs that trackio.init does not accept (dropped in sync mode).
|
|
33
|
+
_WANDB_ONLY_INIT = (
|
|
34
|
+
"entity",
|
|
35
|
+
"tags",
|
|
36
|
+
"reinit",
|
|
37
|
+
"group",
|
|
38
|
+
"job_type",
|
|
39
|
+
"notes",
|
|
40
|
+
"dir",
|
|
41
|
+
"mode",
|
|
42
|
+
"anonymous",
|
|
43
|
+
"magic",
|
|
44
|
+
"save_code",
|
|
45
|
+
"sync_tensorboard",
|
|
46
|
+
"monitor_gym",
|
|
47
|
+
"settings",
|
|
48
|
+
"id",
|
|
49
|
+
"allow_val_change",
|
|
50
|
+
"force",
|
|
51
|
+
"tensorboard",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# wandb surface trackio lacks; replaced with warn-once no-ops so the run completes.
|
|
55
|
+
_WANDB_NOOP_NAMES = (
|
|
56
|
+
"watch",
|
|
57
|
+
"unwatch",
|
|
58
|
+
"define_metric",
|
|
59
|
+
"save",
|
|
60
|
+
"restore",
|
|
61
|
+
"sweep",
|
|
62
|
+
"agent",
|
|
63
|
+
"log_artifact",
|
|
64
|
+
"use_artifact",
|
|
65
|
+
"log_model",
|
|
66
|
+
"use_model",
|
|
67
|
+
"mark_preempting",
|
|
68
|
+
"alert",
|
|
69
|
+
"login",
|
|
70
|
+
)
|
|
71
|
+
# wandb data-type constructors that show up inside log() calls.
|
|
72
|
+
_WANDB_TYPE_NAMES = (
|
|
73
|
+
"Image",
|
|
74
|
+
"Table",
|
|
75
|
+
"Artifact",
|
|
76
|
+
"Video",
|
|
77
|
+
"Histogram",
|
|
78
|
+
"Audio",
|
|
79
|
+
"Html",
|
|
80
|
+
"Object3D",
|
|
81
|
+
"Molecule",
|
|
82
|
+
"plot",
|
|
83
|
+
"Settings",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _to_jsonable(v):
|
|
88
|
+
"""Mirror wandb's silent coercion of tensors/numpy to JSON — trackio raises.
|
|
89
|
+
|
|
90
|
+
Reduces ``torch.Tensor`` / numpy scalars to Python scalars (and n-d arrays to
|
|
91
|
+
nested lists) by duck-typing ``.item()`` / ``.tolist()`` — no torch/numpy import.
|
|
92
|
+
"""
|
|
93
|
+
if v is None or isinstance(v, (str, bytes, bool, int, float)):
|
|
94
|
+
return v
|
|
95
|
+
if isinstance(v, dict):
|
|
96
|
+
return {k: _to_jsonable(x) for k, x in v.items()}
|
|
97
|
+
if isinstance(v, (list, tuple)):
|
|
98
|
+
return [_to_jsonable(x) for x in v]
|
|
99
|
+
item = getattr(v, "item", None)
|
|
100
|
+
if callable(item):
|
|
101
|
+
try:
|
|
102
|
+
return v.item()
|
|
103
|
+
except Exception:
|
|
104
|
+
pass
|
|
105
|
+
tolist = getattr(v, "tolist", None)
|
|
106
|
+
if callable(tolist):
|
|
107
|
+
try:
|
|
108
|
+
return v.tolist()
|
|
109
|
+
except Exception:
|
|
110
|
+
pass
|
|
111
|
+
return v
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _install_trackio_alias(space_id: str) -> bool:
|
|
115
|
+
"""Alias ``wandb`` -> trackio, mirroring to ``space_id``. False if unavailable."""
|
|
116
|
+
try:
|
|
117
|
+
import trackio
|
|
118
|
+
except Exception:
|
|
119
|
+
sys.stderr.write("[wandb->trackio] trackio not importable; using no-op\n")
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
_orig_init = trackio.init
|
|
123
|
+
|
|
124
|
+
def init(*args, **kwargs):
|
|
125
|
+
for k in _WANDB_ONLY_INIT:
|
|
126
|
+
kwargs.pop(k, None)
|
|
127
|
+
kwargs.setdefault("space_id", space_id)
|
|
128
|
+
run = _orig_init(*args, **kwargs)
|
|
129
|
+
try:
|
|
130
|
+
if not hasattr(run, "summary"):
|
|
131
|
+
run.summary = {}
|
|
132
|
+
except Exception:
|
|
133
|
+
pass
|
|
134
|
+
trackio.run = run
|
|
135
|
+
return run
|
|
136
|
+
|
|
137
|
+
trackio.init = init
|
|
138
|
+
|
|
139
|
+
_orig_log = trackio.log
|
|
140
|
+
|
|
141
|
+
def log(*args, **kwargs):
|
|
142
|
+
kwargs.pop("commit", None)
|
|
143
|
+
if args and isinstance(args[0], dict):
|
|
144
|
+
args = (_to_jsonable(args[0]), *args[1:])
|
|
145
|
+
try:
|
|
146
|
+
return _orig_log(*args, **kwargs)
|
|
147
|
+
except TypeError:
|
|
148
|
+
kwargs.pop("step", None)
|
|
149
|
+
return _orig_log(*args, **kwargs)
|
|
150
|
+
|
|
151
|
+
trackio.log = log
|
|
152
|
+
|
|
153
|
+
_warned: set[str] = set()
|
|
154
|
+
|
|
155
|
+
def _stub(name):
|
|
156
|
+
def _f(*a, **k):
|
|
157
|
+
if name not in _warned:
|
|
158
|
+
_warned.add(name)
|
|
159
|
+
sys.stderr.write(f"[wandb->trackio] wandb.{name}(...) is a no-op under trackio\n")
|
|
160
|
+
return None
|
|
161
|
+
|
|
162
|
+
return _f
|
|
163
|
+
|
|
164
|
+
for _name in (*_WANDB_NOOP_NAMES, *_WANDB_TYPE_NAMES):
|
|
165
|
+
if not hasattr(trackio, _name):
|
|
166
|
+
setattr(trackio, _name, _stub(_name))
|
|
167
|
+
if not hasattr(trackio, "run"):
|
|
168
|
+
trackio.run = None
|
|
169
|
+
|
|
170
|
+
sys.modules["wandb"] = trackio
|
|
171
|
+
sys.stderr.write(f"[wandb->trackio] active (wandb -> trackio, space={space_id})\n")
|
|
172
|
+
return True
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def _install_noop_wandb() -> None:
|
|
176
|
+
"""Alias ``wandb`` to a silent no-op module so an unmodified repo runs untracked."""
|
|
177
|
+
import types
|
|
178
|
+
|
|
179
|
+
mod = types.ModuleType("wandb")
|
|
180
|
+
|
|
181
|
+
def _noop(*a, **k):
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
class _Run:
|
|
185
|
+
def __init__(self) -> None:
|
|
186
|
+
self.summary: dict = {}
|
|
187
|
+
self.config: dict = {}
|
|
188
|
+
self.id = None
|
|
189
|
+
self.name = None
|
|
190
|
+
|
|
191
|
+
log = _noop
|
|
192
|
+
finish = _noop
|
|
193
|
+
watch = _noop
|
|
194
|
+
log_code = _noop
|
|
195
|
+
|
|
196
|
+
_run = _Run()
|
|
197
|
+
|
|
198
|
+
def init(*a, **k):
|
|
199
|
+
mod.run = _run # type: ignore[attr-defined]
|
|
200
|
+
return _run
|
|
201
|
+
|
|
202
|
+
mod.init = init # type: ignore[attr-defined]
|
|
203
|
+
mod.log = _noop # type: ignore[attr-defined]
|
|
204
|
+
mod.finish = _noop # type: ignore[attr-defined]
|
|
205
|
+
mod.config = {} # type: ignore[attr-defined]
|
|
206
|
+
mod.run = None # type: ignore[attr-defined]
|
|
207
|
+
for _name in (*_WANDB_NOOP_NAMES, *_WANDB_TYPE_NAMES):
|
|
208
|
+
setattr(mod, _name, _noop)
|
|
209
|
+
sys.modules["wandb"] = mod
|
|
210
|
+
sys.stderr.write("[wandb->trackio] wandb no-op (tracking disabled)\n")
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def install(environ=None) -> None:
|
|
214
|
+
"""Alias ``wandb`` per ``ROAR_WANDB_TO_TRACKIO`` — a no-op if the flag is unset.
|
|
215
|
+
|
|
216
|
+
Idempotent and safe: never raises into the workload. Skips if ``wandb`` is
|
|
217
|
+
already in ``sys.modules`` (real wandb or a prior alias) so it never clobbers.
|
|
218
|
+
"""
|
|
219
|
+
import os
|
|
220
|
+
|
|
221
|
+
env = os.environ if environ is None else environ
|
|
222
|
+
flag = (env.get("ROAR_WANDB_TO_TRACKIO") or "").strip().lower()
|
|
223
|
+
if not flag:
|
|
224
|
+
return
|
|
225
|
+
if "wandb" in sys.modules:
|
|
226
|
+
return
|
|
227
|
+
space_id = env.get("TRACKIO_SPACE_ID") or None
|
|
228
|
+
try:
|
|
229
|
+
if flag != "off" and space_id and _install_trackio_alias(space_id):
|
|
230
|
+
return
|
|
231
|
+
_install_noop_wandb()
|
|
232
|
+
except Exception as exc: # never let tracking setup break the workload
|
|
233
|
+
sys.stderr.write(f"[wandb->trackio] disabled (setup error: {exc})\n")
|
|
@@ -158,7 +158,20 @@ def load_publish_auth_context(
|
|
|
158
158
|
else:
|
|
159
159
|
raise PublishAuthError(str(exc)) from exc
|
|
160
160
|
binding = None if allow_public_without_binding else _load_repo_binding(start_dir)
|
|
161
|
-
repo_scope =
|
|
161
|
+
repo_scope = load_repo_scope(start_dir)
|
|
162
|
+
# `allow_public_without_binding` permits a *scopeless* public publish, but it
|
|
163
|
+
# must not discard a **public project scope** — that binding carries the org
|
|
164
|
+
# attribution (supplier/author) the AI-BOM needs, and a public project's
|
|
165
|
+
# whole point is public + attributed. Regression fix: eef6fca (0.4.1) made a
|
|
166
|
+
# public project scope resolve to public=True, which the CLI feeds into
|
|
167
|
+
# `allow_public_without_binding=request.public`; dropping repo_scope here then
|
|
168
|
+
# published those DAGs anonymous. A *non-public* project scope with an
|
|
169
|
+
# explicit `--public` still drops (the user is overriding to public), as do
|
|
170
|
+
# public/anonymous/unset scopes.
|
|
171
|
+
if allow_public_without_binding and not (
|
|
172
|
+
repo_scope and repo_scope.mode == "project" and repo_scope.visibility == "public"
|
|
173
|
+
):
|
|
174
|
+
repo_scope = None
|
|
162
175
|
if binding and not access_token and not ssh_auth_available:
|
|
163
176
|
raise PublishAuthError(
|
|
164
177
|
"Repo is linked to GLaaS but no global auth state is available. Run `roar login`."
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|