tensorfs 0.3.79__tar.gz → 0.3.80__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 (180) hide show
  1. {tensorfs-0.3.79 → tensorfs-0.3.80}/Cargo.lock +2 -2
  2. {tensorfs-0.3.79 → tensorfs-0.3.80}/Cargo.toml +1 -1
  3. {tensorfs-0.3.79 → tensorfs-0.3.80}/PKG-INFO +1 -1
  4. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/pull.rs +3 -1
  5. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/tests.rs +64 -0
  6. {tensorfs-0.3.79 → tensorfs-0.3.80}/pyproject.toml +1 -1
  7. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/Cargo.toml +0 -0
  8. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/build.rs +0 -0
  9. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  10. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  11. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  12. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  13. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/asset_update.rs +0 -0
  14. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/b64.rs +0 -0
  15. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  16. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  17. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
  18. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  19. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  20. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  21. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  22. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  23. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  24. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  25. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  26. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/canon.rs +0 -0
  27. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/capability.rs +0 -0
  28. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  29. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/catalog.rs +0 -0
  30. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/cbor.rs +0 -0
  31. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  32. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  33. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/corpus.rs +0 -0
  34. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  35. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  36. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  37. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  38. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  39. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  40. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  41. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  42. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  43. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  44. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  45. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/derived.rs +0 -0
  46. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/descriptors.rs +0 -0
  47. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/disk.rs +0 -0
  48. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/dtype.rs +0 -0
  49. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/durability.rs +0 -0
  50. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
  51. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
  52. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ensure.rs +0 -0
  53. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/err.rs +0 -0
  54. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/fetch.rs +0 -0
  55. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
  56. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/fill.rs +0 -0
  57. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/fit.rs +0 -0
  58. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/gc.rs +0 -0
  59. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/header.rs +0 -0
  60. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/home.rs +0 -0
  61. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ids.rs +0 -0
  62. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  63. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  64. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  65. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  66. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  67. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  68. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  69. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  70. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  71. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  72. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
  73. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
  74. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  75. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  76. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  77. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  78. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  79. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  80. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/jcs.rs +0 -0
  81. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/lib.rs +0 -0
  82. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/limits.rs +0 -0
  83. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/machine.rs +0 -0
  84. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/manifest.rs +0 -0
  85. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/meta.rs +0 -0
  86. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/project.rs +0 -0
  87. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/providers.rs +0 -0
  88. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/read.rs +0 -0
  89. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/receipt.rs +0 -0
  90. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/reclaim.rs +0 -0
  91. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/registry.rs +0 -0
  92. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/relation.rs +0 -0
  93. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  94. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/repository.rs +0 -0
  95. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/sha256.rs +0 -0
  96. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  97. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/spec.rs +0 -0
  98. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/staging.rs +0 -0
  99. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/stats.rs +0 -0
  100. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/storage.rs +0 -0
  101. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/store.rs +0 -0
  102. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/api.rs +0 -0
  103. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/http.rs +0 -0
  104. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  105. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  106. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  107. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  108. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  109. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/pace.rs +0 -0
  110. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  111. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
  112. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/push.rs +0 -0
  113. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
  114. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/transport/speculate.rs +0 -0
  115. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/unsynced.rs +0 -0
  116. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/src/vectors.rs +0 -0
  117. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  118. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  119. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/as_is.rs +0 -0
  120. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
  121. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  122. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
  123. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  124. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/ensure.rs +0 -0
  125. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  126. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  127. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  128. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fit.rs +0 -0
  129. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  130. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  131. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  132. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  133. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  134. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  135. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  136. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  137. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  138. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  139. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/home.rs +0 -0
  140. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
  141. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  142. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  143. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/liveness.rs +0 -0
  144. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  145. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  146. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  147. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  148. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  149. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  150. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  151. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  152. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  153. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  154. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  155. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/source_download.rs +0 -0
  156. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  157. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  158. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  159. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/staging.rs +0 -0
  160. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  161. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  162. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  163. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  164. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/version.rs +0 -0
  165. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-core/tests/write_through.rs +0 -0
  166. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-py/Cargo.toml +0 -0
  167. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-py/src/docs.rs +0 -0
  168. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-py/src/ensure.rs +0 -0
  169. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-py/src/errors.rs +0 -0
  170. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-py/src/ingest.rs +0 -0
  171. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-py/src/lib.rs +0 -0
  172. {tensorfs-0.3.79 → tensorfs-0.3.80}/crates/tensorfs-py/src/store.rs +0 -0
  173. {tensorfs-0.3.79 → tensorfs-0.3.80}/python/tensorfs/__init__.py +0 -0
  174. {tensorfs-0.3.79 → tensorfs-0.3.80}/python/tensorfs/_derived_channel.py +0 -0
  175. {tensorfs-0.3.79 → tensorfs-0.3.80}/python/tensorfs/_ext.pyi +0 -0
  176. {tensorfs-0.3.79 → tensorfs-0.3.80}/python/tensorfs/_source_channel.py +0 -0
  177. {tensorfs-0.3.79 → tensorfs-0.3.80}/python/tensorfs/_tensors.py +0 -0
  178. {tensorfs-0.3.79 → tensorfs-0.3.80}/python/tensorfs/derived.py +0 -0
  179. {tensorfs-0.3.79 → tensorfs-0.3.80}/python/tensorfs/errors.py +0 -0
  180. {tensorfs-0.3.79 → tensorfs-0.3.80}/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.79"
442
+ version = "0.3.80"
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.79"
457
+ version = "0.3.80"
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.79"
6
+ version = "0.3.80"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.79
3
+ Version: 0.3.80
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -1396,7 +1396,9 @@ pub fn pull(request: &PullRequest<'_>) -> Result<PullReport> {
1396
1396
  .or_else(|| pinned_local_closure(request))
1397
1397
  {
1398
1398
  if let Ok((plan, report)) = plan_against_store(request, &closure) {
1399
- if plan.wanted.is_empty() {
1399
+ // A canceled pull can land every object before recording its source.
1400
+ // Supplied closures still need that custody committed below.
1401
+ if plan.wanted.is_empty() && records_checkpoint(request.store, &closure) {
1400
1402
  if let Some(observer) = request.on_plan {
1401
1403
  observer(&plan);
1402
1404
  }
@@ -1290,6 +1290,70 @@ fn pull_records_the_release_it_resolved() {
1290
1290
  let _ = std::fs::remove_dir_all(root);
1291
1291
  }
1292
1292
 
1293
+ #[test]
1294
+ fn ensure_records_source_after_cancellation_lands_the_last_object() {
1295
+ let root = temporary("ensure-canceled-custody");
1296
+ let store = Store::init(&root).unwrap();
1297
+ let checkpoint = Arc::new(checkpoint(3, 8 * 1024));
1298
+ let origin = hub_origin(Arc::clone(&checkpoint), |_, _| None);
1299
+ let policy = SourcePolicy::default();
1300
+ let token = super::PullCancellation::default();
1301
+ let landed = AtomicUsize::new(0);
1302
+ let on_object = |_: &ObjectRef, _: u64, _: ObjectSource| {
1303
+ if landed.fetch_add(1, Ordering::Relaxed) + 1 == checkpoint.bodies.len() {
1304
+ // Every immutable object is admitted, but pull has not recorded the source.
1305
+ token.cancel();
1306
+ }
1307
+ };
1308
+ let mut canceled = request_for(&store, &origin.base, &policy);
1309
+ canceled.cancellation = Some(token.clone());
1310
+ canceled.on_object = Some(&on_object);
1311
+ assert_eq!(pull(&canceled).unwrap_err().code, Code::TRANSFER_FAILED);
1312
+ assert_eq!(landed.load(Ordering::Relaxed), checkpoint.bodies.len());
1313
+ assert_eq!(
1314
+ crate::checkpoint_root::check_source(&store, "acme/model", &checkpoint.manifest)
1315
+ .unwrap_err()
1316
+ .code,
1317
+ Code::REPOSITORY_ABSENT
1318
+ );
1319
+ let (held, _) = FetchPlan::of(
1320
+ &store,
1321
+ "after-cancel",
1322
+ &checkpoint.manifest,
1323
+ &checkpoint.objects,
1324
+ )
1325
+ .unwrap();
1326
+ assert!(held.wanted.is_empty(), "cancellation must retain all bytes");
1327
+
1328
+ // ensure supplies its resolved closure to pull. An empty wanted set must still
1329
+ // complete the source record that the canceled flight never committed.
1330
+ let refspec = format!("acme/model@r1@{}", checkpoint.manifest.id());
1331
+ let mut resumed =
1332
+ crate::ensure::Request::new(&store, &origin.base, &refspec, &Anonymous, &policy);
1333
+ resumed.lane = "public";
1334
+ resumed.cancellation = Some(super::PullCancellation::default());
1335
+ let calls = origin.total_hits();
1336
+ let presigns = origin.hits("/v1/tensorfs/presign");
1337
+ let result = crate::ensure::ensure(&resumed).unwrap();
1338
+ assert_eq!(result.bytes_held, held.declared_bytes());
1339
+ assert_eq!(result.bytes_fetched, 0);
1340
+ assert_eq!(origin.total_hits() - calls, 1, "only resolve the closure");
1341
+ assert_eq!(origin.hits("/v1/tensorfs/presign"), presigns);
1342
+ crate::checkpoint_root::check_source(&store, "acme/model", &checkpoint.manifest).unwrap();
1343
+ let census = crate::storage::Census::open(&root).unwrap();
1344
+ assert!(census.gc_plan(&[]).unwrap().is_empty());
1345
+
1346
+ // Once source custody exists, the pinned warm path stays entirely local.
1347
+ let opened = crate::catalog::connections_opened(&root);
1348
+ let calls = origin.total_hits();
1349
+ let warm = crate::ensure::ensure(&resumed).unwrap();
1350
+ assert_eq!(warm.bytes_fetched, 0);
1351
+ assert_eq!(warm.bytes_held, result.bytes_total);
1352
+ assert_eq!(origin.total_hits(), calls);
1353
+ assert_eq!(crate::catalog::connections_opened(&root), opened);
1354
+ let _ = std::fs::remove_dir_all(root);
1355
+ }
1356
+
1293
1357
  #[test]
1294
1358
  fn corrupt_object_heals_into_wanted_and_refetches() {
1295
1359
  let root = temporary("heal");
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "tensorfs"
7
- version = "0.3.79"
7
+ version = "0.3.80"
8
8
  description = "TensorFS — canonical tensor artifact substrate"
9
9
  requires-python = ">=3.12"
10
10
  classifiers = [