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.
Files changed (169) hide show
  1. {tensorfs-0.3.73 → tensorfs-0.3.74}/Cargo.lock +2 -2
  2. {tensorfs-0.3.73 → tensorfs-0.3.74}/Cargo.toml +1 -1
  3. {tensorfs-0.3.73 → tensorfs-0.3.74}/PKG-INFO +1 -1
  4. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/fetch.rs +2 -3
  5. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/main.rs +2 -2
  6. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/hub.rs +17 -11
  7. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/tests.rs +51 -1
  8. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/store.rs +3 -3
  9. {tensorfs-0.3.73 → tensorfs-0.3.74}/pyproject.toml +1 -1
  10. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/Cargo.toml +0 -0
  11. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/build.rs +0 -0
  12. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  13. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  14. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  15. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  16. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/asset_update.rs +0 -0
  17. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/b64.rs +0 -0
  18. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  19. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  20. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  21. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  22. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  23. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  24. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  25. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  26. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/canon.rs +0 -0
  27. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/capability.rs +0 -0
  28. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  29. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/catalog.rs +0 -0
  30. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/cbor.rs +0 -0
  31. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  32. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  33. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/corpus.rs +0 -0
  34. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  35. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  36. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  37. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  38. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  39. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  40. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  41. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  42. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  43. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  44. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  45. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/derived.rs +0 -0
  46. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/descriptors.rs +0 -0
  47. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/disk.rs +0 -0
  48. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/dtype.rs +0 -0
  49. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/durability.rs +0 -0
  50. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/err.rs +0 -0
  51. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/fetch.rs +0 -0
  52. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/fill.rs +0 -0
  53. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/fit.rs +0 -0
  54. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/gc.rs +0 -0
  55. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/header.rs +0 -0
  56. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/home.rs +0 -0
  57. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ids.rs +0 -0
  58. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  59. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  60. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  61. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  62. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  63. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  64. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  65. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  66. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  67. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  68. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  69. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  70. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  71. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  72. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  73. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  74. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/jcs.rs +0 -0
  75. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/lib.rs +0 -0
  76. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/limits.rs +0 -0
  77. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/machine.rs +0 -0
  78. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/manifest.rs +0 -0
  79. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/meta.rs +0 -0
  80. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/project.rs +0 -0
  81. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/providers.rs +0 -0
  82. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/read.rs +0 -0
  83. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/receipt.rs +0 -0
  84. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/reclaim.rs +0 -0
  85. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/registry.rs +0 -0
  86. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/relation.rs +0 -0
  87. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/repo_cache/identity.rs +0 -0
  88. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  89. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/repository.rs +0 -0
  90. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/sha256.rs +0 -0
  91. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  92. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/spec.rs +0 -0
  93. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/staging.rs +0 -0
  94. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/stats.rs +0 -0
  95. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/storage.rs +0 -0
  96. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/store.rs +0 -0
  97. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/api.rs +0 -0
  98. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/http.rs +0 -0
  99. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  100. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  101. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  102. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  103. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/pace.rs +0 -0
  104. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  105. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
  106. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  107. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/push.rs +0 -0
  108. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
  109. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/transport/speculate.rs +0 -0
  110. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/unsynced.rs +0 -0
  111. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/src/vectors.rs +0 -0
  112. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  113. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  114. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/as_is.rs +0 -0
  115. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  116. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  117. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  118. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  119. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  120. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fit.rs +0 -0
  121. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  122. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  123. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  124. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  125. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  126. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  127. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  128. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  129. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  130. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  131. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/home.rs +0 -0
  132. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  133. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  134. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/liveness.rs +0 -0
  135. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  136. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  137. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  138. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  139. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  140. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  141. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  142. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  143. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  144. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  145. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  146. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_download.rs +0 -0
  147. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  148. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  149. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  150. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/staging.rs +0 -0
  151. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  152. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  153. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  154. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  155. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/version.rs +0 -0
  156. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-core/tests/write_through.rs +0 -0
  157. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/Cargo.toml +0 -0
  158. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/docs.rs +0 -0
  159. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/errors.rs +0 -0
  160. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/ingest.rs +0 -0
  161. {tensorfs-0.3.73 → tensorfs-0.3.74}/crates/tensorfs-py/src/lib.rs +0 -0
  162. {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/__init__.py +0 -0
  163. {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_derived_channel.py +0 -0
  164. {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_ext.pyi +0 -0
  165. {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_source_channel.py +0 -0
  166. {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/_tensors.py +0 -0
  167. {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/derived.py +0 -0
  168. {tensorfs-0.3.73 → tensorfs-0.3.74}/python/tensorfs/errors.py +0 -0
  169. {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.73"
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.73"
457
+ version = "0.3.74"
458
458
  dependencies = [
459
459
  "pyo3",
460
460
  "tensorfs-core",
@@ -3,5 +3,5 @@ resolver = "2"
3
3
  members = ["crates/tensorfs-core", "crates/tensorfs-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.3.73"
6
+ version = "0.3.74"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.73
3
+ Version: 0.3.74
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -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>`, scoped to
196
- /// exactly the named hosts, or empty for anonymous — which is what a rented pod passes,
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 bare argv; a
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. A rented pod holds nothing at all: the hub's closure and
40
- //! presign routes are PUBLIC (tensorhub owner ruling 2026-09-03, which deleted the signed
41
- //! DownloadDelegation these calls used to present), so the pod fetches as `Anonymous`.
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>` → `authorization: Bearer <token>`
107
- /// - empty → anonymous, which is what a rented pod uses: the hub's closure and
108
- /// presign routes take no credential.
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 mut parts = spec.split_whitespace();
118
- let headers = match (parts.next(), parts.next()) {
119
- (Some("bearer"), Some(token)) if parts.next().is_none() => {
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 scoped value, passed \
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>`, or empty for anonymous — which is
3594
- /// what a rented pod uses, the hub's closure and presign routes taking no credential),
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]
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "tensorfs"
7
- version = "0.3.73"
7
+ version = "0.3.74"
8
8
  description = "TensorFS — canonical tensor artifact substrate"
9
9
  requires-python = ">=3.12"
10
10
  classifiers = [