tensorfs 0.3.73__tar.gz → 0.3.74__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.
- {tensorfs-0.3.73 → tensorfs-0.3.74}/Cargo.lock +2 -2
- {tensorfs-0.3.73 → tensorfs-0.3.74}/Cargo.toml +1 -1
- {tensorfs-0.3.73 → tensorfs-0.3.74}/PKG-INFO +1 -1
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/fetch.rs +2 -3
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/main.rs +2 -2
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/hub.rs +17 -11
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/tests.rs +51 -1
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/store.rs +3 -3
- {tensorfs-0.3.73 → tensorfs-0.3.74}/pyproject.toml +1 -1
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/Cargo.toml +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/build.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/asset_update.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/b64.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/cache_roots.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/catalog.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/checkpoint.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/progress.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/retention.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/roots.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/descriptors.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/disk.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/durability.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/err.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/fetch.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/fill.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/fit.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/gc.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/source.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/jcs.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/lib.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/machine.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/meta.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/providers.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/read.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/reclaim.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/registry.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/repo_cache/identity.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/repo_cache.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/sha256.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/source_artifact.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/staging.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/stats.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/storage.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/store.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/memory.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/mod.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/pace.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/pull.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/speculate.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/unsynced.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/as_is.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fit.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/home.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/import_tree.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/liveness.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/read_plan.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/repo_store.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_download.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_plan.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/staging.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/trust_index.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/write_through.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/Cargo.toml +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/docs.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/ingest.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/lib.rs +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/__init__.py +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_derived_channel.py +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_ext.pyi +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_source_channel.py +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_tensors.py +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/derived.py +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/errors.py +0 -0
- {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/py.typed +0 -0
|
@@ -439,7 +439,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
439
439
|
|
|
440
440
|
[[package]]
|
|
441
441
|
name = "tensorfs-core"
|
|
442
|
-
version = "0.3.
|
|
442
|
+
version = "0.3.74"
|
|
443
443
|
dependencies = [
|
|
444
444
|
"fs2",
|
|
445
445
|
"libc",
|
|
@@ -454,7 +454,7 @@ dependencies = [
|
|
|
454
454
|
|
|
455
455
|
[[package]]
|
|
456
456
|
name = "tensorfs-py"
|
|
457
|
-
version = "0.3.
|
|
457
|
+
version = "0.3.74"
|
|
458
458
|
dependencies = [
|
|
459
459
|
"pyo3",
|
|
460
460
|
"tensorfs-core",
|
|
@@ -192,9 +192,8 @@ fn deadline_of(flags: &Flags) -> Deadline {
|
|
|
192
192
|
|
|
193
193
|
/// The ONE credential spelling, reaching the child explicitly (tfs-050): `--credential-file
|
|
194
194
|
/// <path>` or the deliberately-set `TFS_CREDENTIAL` — never argv (world-readable in /proc),
|
|
195
|
-
/// never the inherited environment at large. The value is `bearer <token
|
|
196
|
-
/// exactly the named hosts, or empty for anonymous
|
|
197
|
-
/// the hub's closure and presign routes taking no credential at all.
|
|
195
|
+
/// never the inherited environment at large. The value is `bearer <token>` or
|
|
196
|
+
/// `worker <id> <token>`, scoped to exactly the named hosts, or empty for anonymous.
|
|
198
197
|
fn credential_of(
|
|
199
198
|
flags: &Flags,
|
|
200
199
|
hosts: Vec<String>,
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
//! tfs fill <root> <plan> resumable fill: skip only verified objects
|
|
40
40
|
//!
|
|
41
41
|
//! The ONE transport (tfs-048/tfs-049/tfs-050). The credential is `--credential-file` or
|
|
42
|
-
//! TFS_CREDENTIAL (`bearer <token>`, or empty for anonymous), never
|
|
43
|
-
//! URL of `-` arrives on stdin. Flags: --hub <base> --lane --session --streams <n>
|
|
42
|
+
//! TFS_CREDENTIAL (`bearer <token>`, `worker <id> <token>`, or empty for anonymous), never
|
|
43
|
+
//! bare argv; a URL of `-` arrives on stdin. Flags: --hub <base> --lane --session --streams <n>
|
|
44
44
|
//! --streams-start <n> --timeout <s> --allow-hosts a,b,.c --allow-local --max-redirects <n>.
|
|
45
45
|
//! `--streams` is the most objects in flight (default 128, memory-bounded); the walk starts
|
|
46
46
|
//! at `--streams-start` (default 16) and doubles while measured goodput follows.
|
|
@@ -36,9 +36,10 @@
|
|
|
36
36
|
//! **The credential arrives as a provider trait, never a credential type**, so one
|
|
37
37
|
//! implementation serves whatever a caller holds. It is asked per host, so a credential
|
|
38
38
|
//! stays scoped to the hosts its provider names and cannot leak onto a presigned object
|
|
39
|
-
//! host or a redirect target.
|
|
40
|
-
//!
|
|
41
|
-
//!
|
|
39
|
+
//! host or a redirect target. Published checkpoints need none; a machine reads its
|
|
40
|
+
//! owner's unpublished checkpoints by presenting its worker capability
|
|
41
|
+
//! (`worker <id> <token>` → `x-cozy-worker-id` + `x-cozy-worker-token`), which the hub
|
|
42
|
+
//! scopes to the machine owner's account.
|
|
42
43
|
|
|
43
44
|
use crate::canon::{self, as_arr, as_obj, as_str, as_uint, Value};
|
|
44
45
|
use crate::err::{refuse, Code, Refusal, Result};
|
|
@@ -103,9 +104,10 @@ impl CredentialProvider for ScopedHeaders {
|
|
|
103
104
|
/// The ONE credential spelling every surface passes (tfs-050): exactly one scoped value,
|
|
104
105
|
/// handed explicitly — a file, one deliberately-set variable — never inherited.
|
|
105
106
|
///
|
|
106
|
-
/// - `bearer <token>`
|
|
107
|
-
/// -
|
|
108
|
-
/// presign
|
|
107
|
+
/// - `bearer <token>` → `authorization: Bearer <token>`
|
|
108
|
+
/// - `worker <id> <token>` → `x-cozy-worker-id` + `x-cozy-worker-token`: a machine's
|
|
109
|
+
/// worker capability, which the hub's closure and presign read as its owner's grant
|
|
110
|
+
/// - empty → anonymous: published checkpoints only.
|
|
109
111
|
pub fn credential_from_spec(spec: &str, hosts: Vec<String>) -> Result<ScopedHeaders> {
|
|
110
112
|
let spec = spec.trim();
|
|
111
113
|
if spec.is_empty() {
|
|
@@ -114,16 +116,20 @@ pub fn credential_from_spec(spec: &str, hosts: Vec<String>) -> Result<ScopedHead
|
|
|
114
116
|
headers: Vec::new(),
|
|
115
117
|
});
|
|
116
118
|
}
|
|
117
|
-
let
|
|
118
|
-
let headers = match
|
|
119
|
-
|
|
119
|
+
let parts: Vec<&str> = spec.split_whitespace().collect();
|
|
120
|
+
let headers = match parts.as_slice() {
|
|
121
|
+
["bearer", token] => {
|
|
120
122
|
vec![("authorization".to_string(), format!("Bearer {token}"))]
|
|
121
123
|
}
|
|
124
|
+
["worker", id, token] => vec![
|
|
125
|
+
("x-cozy-worker-id".to_string(), id.to_string()),
|
|
126
|
+
("x-cozy-worker-token".to_string(), token.to_string()),
|
|
127
|
+
],
|
|
122
128
|
_ => {
|
|
123
129
|
return refuse(
|
|
124
130
|
Code::CREDENTIAL_REQUIRED,
|
|
125
|
-
"a credential is `bearer <token>` or empty — one
|
|
126
|
-
explicitly",
|
|
131
|
+
"a credential is `bearer <token>`, `worker <id> <token>` or empty — one \
|
|
132
|
+
scoped value, passed explicitly",
|
|
127
133
|
)
|
|
128
134
|
}
|
|
129
135
|
};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//! no hub. The ledger tests run at millisecond resolution: the cadence is configuration,
|
|
4
4
|
//! the RULE under test is production's.
|
|
5
5
|
|
|
6
|
-
use super::hub::{Anonymous, HostToken};
|
|
6
|
+
use super::hub::{credential_from_spec, Anonymous, HostToken};
|
|
7
7
|
use super::ledger::{Deadline, Ledger};
|
|
8
8
|
use super::policy::{self, blocked, SourcePolicy};
|
|
9
9
|
use super::pull::{absolute_location, fetch_url, pull, ObjectSource, PullRequest};
|
|
@@ -2134,6 +2134,56 @@ fn credential_headers_reach_the_hub_and_not_the_object_host() {
|
|
|
2134
2134
|
let _ = std::fs::remove_dir_all(root);
|
|
2135
2135
|
}
|
|
2136
2136
|
|
|
2137
|
+
#[test]
|
|
2138
|
+
fn a_worker_capability_reaches_the_hub_calls_as_its_two_headers() {
|
|
2139
|
+
let root = temporary("worker-cred");
|
|
2140
|
+
let store = Store::init(&root).unwrap();
|
|
2141
|
+
let checkpoint = Arc::new(checkpoint(1, 4 * 1024));
|
|
2142
|
+
let checkpoint_for = Arc::clone(&checkpoint);
|
|
2143
|
+
let base_slot: Arc<Mutex<String>> = Arc::default();
|
|
2144
|
+
let dispatch_base = Arc::clone(&base_slot);
|
|
2145
|
+
let dispatch: Dispatch = Arc::new(move |request: &Request| {
|
|
2146
|
+
let base = dispatch_base.lock().unwrap().clone();
|
|
2147
|
+
let machine = request.header("x-cozy-worker-id") == Some("om-machine")
|
|
2148
|
+
&& request.header("x-cozy-worker-token") == Some("worker-token");
|
|
2149
|
+
match (request.method.as_str(), request.path.as_str()) {
|
|
2150
|
+
("POST", _) if !machine => status(
|
|
2151
|
+
401,
|
|
2152
|
+
br#"{"error":{"code":"worker.unauthorized","message":"m"}}"#,
|
|
2153
|
+
),
|
|
2154
|
+
("POST", "/v1/tensorfs/closure") => ok_json(&closure_value(&checkpoint_for, &base)),
|
|
2155
|
+
("POST", "/v1/tensorfs/presign") => ok_json(&presign_value(&request.body, &base)),
|
|
2156
|
+
("GET", path) => match checkpoint_for.bodies.get(&path["/obj/".len()..]) {
|
|
2157
|
+
Some(body) => status(200, body),
|
|
2158
|
+
None => status(404, b"absent"),
|
|
2159
|
+
},
|
|
2160
|
+
_ => status(404, b"no route"),
|
|
2161
|
+
}
|
|
2162
|
+
});
|
|
2163
|
+
let origin = origin(dispatch);
|
|
2164
|
+
*base_slot.lock().unwrap() = origin.base.clone();
|
|
2165
|
+
let policy = SourcePolicy::default();
|
|
2166
|
+
let credential =
|
|
2167
|
+
credential_from_spec("worker om-machine worker-token", vec!["127.0.0.1".into()]).unwrap();
|
|
2168
|
+
let mut request = PullRequest::new(&store, &origin.base, "acme/model", &credential, &policy);
|
|
2169
|
+
request.sample_seconds = 0.025;
|
|
2170
|
+
pull(&request).unwrap();
|
|
2171
|
+
let anonymous_root = temporary("worker-cred-anon");
|
|
2172
|
+
let anonymous = Store::init(&anonymous_root).unwrap();
|
|
2173
|
+
let mut refused = PullRequest::new(&anonymous, &origin.base, "acme/model", &Anonymous, &policy);
|
|
2174
|
+
refused.sample_seconds = 0.025;
|
|
2175
|
+
assert!(pull(&refused)
|
|
2176
|
+
.unwrap_err()
|
|
2177
|
+
.detail
|
|
2178
|
+
.contains("worker.unauthorized"));
|
|
2179
|
+
for spec in ["worker om-machine", "worker a b c", "machine a b"] {
|
|
2180
|
+
let refusal = credential_from_spec(spec, vec![]).err().unwrap();
|
|
2181
|
+
assert_eq!(refusal.code, Code::CREDENTIAL_REQUIRED, "{spec}");
|
|
2182
|
+
}
|
|
2183
|
+
let _ = std::fs::remove_dir_all(root);
|
|
2184
|
+
let _ = std::fs::remove_dir_all(anonymous_root);
|
|
2185
|
+
}
|
|
2186
|
+
|
|
2137
2187
|
// ---------------------------------------------------------------- the predicate
|
|
2138
2188
|
|
|
2139
2189
|
#[test]
|
|
@@ -3590,9 +3590,9 @@ pub fn transfer_streams(wanted: usize) -> usize {
|
|
|
3590
3590
|
/// plan against the real store, the 16-way walk presigning `wanted` as it reaches it, and
|
|
3591
3591
|
/// the completion proof, all in the compiled core.
|
|
3592
3592
|
///
|
|
3593
|
-
/// `credential` is the one spelling (`bearer <token>`,
|
|
3594
|
-
///
|
|
3595
|
-
/// scoped to the hub's host. `timeout` is the caller's deadline or None for none —
|
|
3593
|
+
/// `credential` is the one spelling (`bearer <token>`, `worker <id> <token>` — a machine's
|
|
3594
|
+
/// worker capability, which reads its owner's unpublished checkpoints — or empty for
|
|
3595
|
+
/// anonymous, published only), scoped to the hub's host. `timeout` is the caller's deadline or None for none —
|
|
3596
3596
|
/// nothing below invents a number of seconds. `sample_seconds` is the liveness ledger's
|
|
3597
3597
|
/// RESOLUTION (configuration, never a verdict); leave it defaulted outside tests.
|
|
3598
3598
|
#[pyfunction]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/optional-cache-backfill.md
RENAMED
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/resident_conversion_profile.rs
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
{tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor
RENAMED
|
File without changes
|
{tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json
RENAMED
|
File without changes
|
{tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json
RENAMED
|
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
|
|
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
|
|
File without changes
|