{"_id":"@adhd/sox-blob-store","_rev":"15-0e5a21266b91c26520b499decc34e8b3","name":"@adhd/sox-blob-store","dist-tags":{"latest":"0.2.15"},"versions":{"0.1.0":{"name":"@adhd/sox-blob-store","version":"0.1.0","license":"MIT","_id":"@adhd/sox-blob-store@0.1.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"bcc8b916fb079e9f86e907342f3ac65ec0217746","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.1.0.tgz","fileCount":26,"integrity":"sha512-+3HkAirUKdVZWtrLHpLsBHGp3m874ky2xkReL3q58i3OSA0soY3QR5Ps72q2m4o9Y1hflL2ddF7MItyVhEtHhw==","signatures":[{"sig":"MEQCIH//fztzYKkxVSl8P5NvZItVUJ7eJNWzi3woc8M+8w08AiBxt98Z/L81gJQggDh1o6sH7KlzthVb1woUtGyZ+eyAfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95478},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/50f25ba2a558d6464809f5560af0baa1/adhd-sox-blob-store-0.1.0.tgz","_integrity":"sha512-+3HkAirUKdVZWtrLHpLsBHGp3m874ky2xkReL3q58i3OSA0soY3QR5Ps72q2m4o9Y1hflL2ddF7MItyVhEtHhw==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"better-sqlite3":"^12.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.1.0_1784239337643_0.8494018142974189","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@adhd/sox-blob-store","version":"0.2.0","license":"MIT","_id":"@adhd/sox-blob-store@0.2.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"f169d314484982ccfd204f207472e9621ad46b80","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.0.tgz","fileCount":26,"integrity":"sha512-wsAOPcm0WlWFqGK7EmjuccdvbuIF4gZRokxENhL3EM5a0uwDT8YSmwSQY4pYGyXeQ2Ax1v2RuyuPXs/xyvq/tA==","signatures":[{"sig":"MEYCIQCwyYls3Y7rjiQDgK69163wDUQmO9+yGin22p5CvO4nLQIhAKB1AvG3eqAhuvgFBzWbolBCb2rsVYoyPnYvu13NBVcJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95891},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/48ee71ae37553a03350d0abb569a85a1/adhd-sox-blob-store-0.2.0.tgz","_integrity":"sha512-wsAOPcm0WlWFqGK7EmjuccdvbuIF4gZRokxENhL3EM5a0uwDT8YSmwSQY4pYGyXeQ2Ax1v2RuyuPXs/xyvq/tA==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.0_1785132656766_0.5562823754300812","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@adhd/sox-blob-store","version":"0.2.1","license":"MIT","_id":"@adhd/sox-blob-store@0.2.1","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"4a91bba917bee1b77f44e89284a7ceac9a67ad93","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.1.tgz","fileCount":26,"integrity":"sha512-nX31dBNSMU/BUTxsh630N6infi8d3nxFfnikZSLXNbrKCY9OXrrSw9d9i9U//fUZhOGrU3TsaVZ3R0gF1duqKg==","signatures":[{"sig":"MEYCIQCmTKlFSkxSLGBqK8T59jI4H4cER86NhPUeHkAy+AcegQIhAJvLTZ0/he+C+primLJ+jWTBuYcYiG+wFhr4eyx+g8V0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95891},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/Users/nix/.adhd/sox-ecosystem/publish-verify-201412/adhd-sox-blob-store-0.2.1.tgz","_integrity":"sha512-nX31dBNSMU/BUTxsh630N6infi8d3nxFfnikZSLXNbrKCY9OXrrSw9d9i9U//fUZhOGrU3TsaVZ3R0gF1duqKg==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.1_1785892770794_0.2468440301674273","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@adhd/sox-blob-store","version":"0.2.2","license":"MIT","_id":"@adhd/sox-blob-store@0.2.2","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"2c49ccf3d935ff2720713ba95ccf2685672699a7","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.2.tgz","fileCount":26,"integrity":"sha512-vvY0Ftd1u8RNZD6nNJFVTTPKE9fW0kT67tBun9zqP15UI15Wxw7meJYqSNT2dZtZv6eozWcQTvdqu47KoxsG/Q==","signatures":[{"sig":"MEQCIFL6nPxt8Q1PkwyshmV2zSHWazmNqnyzo3Dcjn7yOD1FAiBNJubgCWTBOf0ClIasdmu/1tP8qGx7zcV9j+V/7LFZFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95891},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/Users/nix/.adhd/sox-ecosystem/publish-verify2-203027/adhd-sox-blob-store-0.2.2.tgz","_integrity":"sha512-vvY0Ftd1u8RNZD6nNJFVTTPKE9fW0kT67tBun9zqP15UI15Wxw7meJYqSNT2dZtZv6eozWcQTvdqu47KoxsG/Q==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.2_1785893494603_0.3815750170109402","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@adhd/sox-blob-store","version":"0.2.3","license":"MIT","_id":"@adhd/sox-blob-store@0.2.3","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"717c5d5424edfa5e6a3204785964fbcc4021f6fd","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.3.tgz","fileCount":26,"integrity":"sha512-zy24uGptu8CjzWUisCnwsHkULAp9W8cciZkVgxhbB2tXo/nLoMvuJ7NvNmInZzso8u2WDlIKwoiAc5GuCaRagw==","signatures":[{"sig":"MEYCIQCUwvvsY3D7pmvMhHlRTZdZjRhnA5eSgLBLyuyFwmjAhAIhAKQWbKg8PN4v0IWyoDMhxMkpvNYxu/p1HooLzYOqoHLy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95891},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/Users/nix/.adhd/sox-ecosystem/pubv3-142121/adhd-sox-blob-store-0.2.3.tgz","_integrity":"sha512-zy24uGptu8CjzWUisCnwsHkULAp9W8cciZkVgxhbB2tXo/nLoMvuJ7NvNmInZzso8u2WDlIKwoiAc5GuCaRagw==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.3_1785957742463_0.505529650709065","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@adhd/sox-blob-store","version":"0.2.4","license":"MIT","_id":"@adhd/sox-blob-store@0.2.4","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"c11adcfb5e032f1705079b61fc14460ee396c179","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.4.tgz","fileCount":26,"integrity":"sha512-WD5gWkgiAo61cR0hf/6ImGIw1OY+D4RuE9/xGn3W+yx5CeN9ralmytT15n4QsPVcULid1CJT3g9onzkJbm4Oqg==","signatures":[{"sig":"MEYCIQC2CYLWL3JAjzvOIM6spPMxVSWJzVyPxFDxI2s2tXZRZwIhAKaf/UZ4Gj4/VGO1P/KARDyUhu4f1dFprmUYjwtYfkDg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95891},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.4.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/e31e4f0d78a4a514a4a024edf447d945/adhd-sox-blob-store-0.2.4.tgz","_integrity":"sha512-WD5gWkgiAo61cR0hf/6ImGIw1OY+D4RuE9/xGn3W+yx5CeN9ralmytT15n4QsPVcULid1CJT3g9onzkJbm4Oqg==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.4_1786144734403_0.6793833747546638","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@adhd/sox-blob-store","version":"0.2.6","license":"MIT","_id":"@adhd/sox-blob-store@0.2.6","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"e276609f61f1b5ddfd6f9b8257f9e6035e27a2ff","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.6.tgz","fileCount":26,"integrity":"sha512-/DGvb80UxRr+KdPsLb+LJVyKtmEsFC143mGFVC5Gmw2y5f54fL/osmJVhMySeDC+3fw9xcNr5vdj3OWpmRLu8w==","signatures":[{"sig":"MEQCIFesCpToPQko1VnA+yqYVlX2ZIFjTen+BdEBVlbPrElcAiBl5bqRnweCiR9GIZqA+Z/svClDE/7/VQHemVvghHzBQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95891},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.6.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/144b629d630668f3f22cf7318c770c6c/adhd-sox-blob-store-0.2.6.tgz","_integrity":"sha512-/DGvb80UxRr+KdPsLb+LJVyKtmEsFC143mGFVC5Gmw2y5f54fL/osmJVhMySeDC+3fw9xcNr5vdj3OWpmRLu8w==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"0.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.6_1786494959695_0.9846133615781263","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@adhd/sox-blob-store","version":"0.2.7","license":"MIT","_id":"@adhd/sox-blob-store@0.2.7","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"0d058efeea5d63ece312956972c6c8b1991636a2","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.7.tgz","fileCount":26,"integrity":"sha512-mRzC40atNVV4RHE4Inx2jeugS3H4w0gbaQzvIt5lF4mIIqWROdbYCxtW13wsoC1/xJ8ZuK93XxUEpqgbkq2bPg==","signatures":[{"sig":"MEQCIHSFI2IWBARU6E6fT75+3igF28qwHBdnO2f3JJz3Qfo/AiAWn9GRET/kj9EBcxgAPJLttMqdJvH17DRbBmT/js2nDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95891},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.7.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/6d76c7095f25560bd7713cfce3b0f57d/adhd-sox-blob-store-0.2.7.tgz","_integrity":"sha512-mRzC40atNVV4RHE4Inx2jeugS3H4w0gbaQzvIt5lF4mIIqWROdbYCxtW13wsoC1/xJ8ZuK93XxUEpqgbkq2bPg==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"0.5.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.7_1786506948883_0.01032951012369665","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"@adhd/sox-blob-store","version":"0.2.9","license":"MIT","_id":"@adhd/sox-blob-store@0.2.9","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"b54c4745efc6e97ceab240519f1a935daa658d1d","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.9.tgz","fileCount":26,"integrity":"sha512-+DL+EVe3y5+6u1cBuuUuB0DW9+hjB41lO7ahMESdZ1xN0euFwZYxUj8gjIrCIs0SiU16SKvbQIg/7Nt5IA4efg==","signatures":[{"sig":"MEUCIA/sUGsorEwu5Mc+r2EnYtusq0vwYTR3WHzAwDJ7J13XAiEA3cL47uHnifvQTO8IXgT7gJAEbRnbQMqNZAZuGebFCjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108703},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.9.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/7e7721a57a61fe11cda88c33f8d745f0/adhd-sox-blob-store-0.2.9.tgz","_integrity":"sha512-+DL+EVe3y5+6u1cBuuUuB0DW9+hjB41lO7ahMESdZ1xN0euFwZYxUj8gjIrCIs0SiU16SKvbQIg/7Nt5IA4efg==","_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"^0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.9_1787113043967_0.4428287444395955","host":"s3://npm-registry-packages-npm-production"}},"0.2.10":{"name":"@adhd/sox-blob-store","version":"0.2.10","keywords":["blob","storage","content-addressable","sqlite","typescript"],"license":"MIT","_id":"@adhd/sox-blob-store@0.2.10","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"712d73b9b4c4184258cd9ac6b04eb6619b1c5064","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.10.tgz","fileCount":27,"integrity":"sha512-IxxXvNznnfa+Dj7MWLrfWgHF6ItJTudpJvnrzOK03Pu54/gRq88i3+81zKi6fEwzPioy4aC8b2D2F3CfQtD6KA==","signatures":[{"sig":"MEQCIHnvQ5PKTfnmHBJFEJAbwU+irsgdZiDEQCa7VN4bignmAiA2QLVVUrsIpwdJALhklZFhkR9+TxZnGMZNzMmcG6/nsg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110024},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.10.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/c7b2c3e9b43a5e9fb130065aaae7e70a/adhd-sox-blob-store-0.2.10.tgz","_integrity":"sha512-IxxXvNznnfa+Dj7MWLrfWgHF6ItJTudpJvnrzOK03Pu54/gRq88i3+81zKi6fEwzPioy4aC8b2D2F3CfQtD6KA==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"^0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.10_1787933934807_0.8913726324669591","host":"s3://npm-registry-packages-npm-production"}},"0.2.11":{"name":"@adhd/sox-blob-store","version":"0.2.11","keywords":["blob","storage","content-addressable","sqlite","typescript"],"license":"MIT","_id":"@adhd/sox-blob-store@0.2.11","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"52e004836a1a10ed502ead646e5a9d15b6d6f855","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.11.tgz","fileCount":28,"integrity":"sha512-HTrfELyDylofrX3O+XI+gWKcBYQ9mKsw/OQavn1xbmXj9JhCq4rsq+1NAvTFftEt7iRpbWEBS8vKUtiWI0dTSw==","signatures":[{"sig":"MEUCIQCYrAtJqroT17wL5ZY1cdGdc5ubduQ5Awv8uU9BMtnZYQIgZBVYUMbbPJAjCrGYyDFP41FULz+4Q0zkhW5AZvgcu1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122441},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.11.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/d71ce3703f01f319da52ce125f648fa2/adhd-sox-blob-store-0.2.11.tgz","_integrity":"sha512-HTrfELyDylofrX3O+XI+gWKcBYQ9mKsw/OQavn1xbmXj9JhCq4rsq+1NAvTFftEt7iRpbWEBS8vKUtiWI0dTSw==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.11_1788566482487_0.6040337677706551","host":"s3://npm-registry-packages-npm-production"}},"0.2.12":{"name":"@adhd/sox-blob-store","version":"0.2.12","keywords":["blob","storage","content-addressable","sqlite","typescript"],"license":"MIT","_id":"@adhd/sox-blob-store@0.2.12","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"e9fe023856c8981bdf20e8eeabbfe63ae65babba","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.12.tgz","fileCount":28,"integrity":"sha512-o7rbXXDPrk2bDYXYag52ntttHQbySvC2+ENHXSd27kGc/wL/ILsyAoo2+DfwBLXXuJk9CJKgy8zvRZaYLV37Vw==","signatures":[{"sig":"MEYCIQCpOYqnjpLlF4RlAN9qTFFzLiLAu2fXlV2sm3hwioWgwgIhANlAF1J0xIjXyLAuW16wRc5buy0UEVvhSdpqOWL3qLsN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIA2sPgy4mWJue3iH6CWhhhIJFmJ/QNCM5Qyf1mmMh1DcAiEA4T2Ttd7+aSc4AMoNxlW6LiYktrSLXktEEWOhXlnz5lk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122442},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.12.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/41621ea446909b83a2c282da29961986/adhd-sox-blob-store-0.2.12.tgz","_integrity":"sha512-o7rbXXDPrk2bDYXYag52ntttHQbySvC2+ENHXSd27kGc/wL/ILsyAoo2+DfwBLXXuJk9CJKgy8zvRZaYLV37Vw==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"^0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.12_1790391142535_0.8932273372496002","host":"s3://npm-registry-packages-npm-production"}},"0.2.13":{"name":"@adhd/sox-blob-store","version":"0.2.13","keywords":["blob","storage","content-addressable","sqlite","typescript"],"license":"MIT","_id":"@adhd/sox-blob-store@0.2.13","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"9fa0af4bfa319733aba7006f14a638897d91efe8","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.13.tgz","fileCount":3,"integrity":"sha512-FmCV7b1m8qqaraUIsFhNNKI/wRF4ct+ImG6Uh9YkQa9ym9sO3ZsbQliM4lKLSvps/7G5mGCss5KSRtFbJRYDiw==","signatures":[{"sig":"MEYCIQDoBTF48SRkse5fTyNRyzGrpdScbFMYB8UagpWR+3hn9AIhAOsW80fqTK1or8ojrh1VdEK1V6hXIu+kT0jxFvHbWrP8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDsnnI4h7fE5XjC9uKQh8b1SqRgR6IcisGqNmAhyC8IjAIgKIw1ry6IGyBKYpUf3Gb623GPIVis7Ri3GY0lSKWWgv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15170},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.13.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/a917dd8769a836b5eb0a326ca3974584/adhd-sox-blob-store-0.2.13.tgz","_integrity":"sha512-FmCV7b1m8qqaraUIsFhNNKI/wRF4ct+ImG6Uh9YkQa9ym9sO3ZsbQliM4lKLSvps/7G5mGCss5KSRtFbJRYDiw==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"^0.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.13_1790650237813_0.5593014545905712","host":"s3://npm-registry-packages-npm-production"}},"0.2.14":{"name":"@adhd/sox-blob-store","version":"0.2.14","keywords":["blob","storage","content-addressable","sqlite","typescript"],"license":"MIT","_id":"@adhd/sox-blob-store@0.2.14","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"homepage":"https://github.com/PseudoSky/adhd","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"dist":{"shasum":"187b23afbd3356dfaf94dde8c52655d5b97b7b4e","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.14.tgz","fileCount":28,"integrity":"sha512-nV8jykvdf8wZoIuxyHYM3IJ4DIw8ovRj6I8aFHGiAG/WUhosu9NmIgErI2PHebGMqjoRTyOmZ8Eb+IbyFecwyw==","signatures":[{"sig":"MEUCIQDjrsyvkbrlbcOh1TXEHeIQe/idqWGZ0LXJ8Fofp/Xt0AIgb3q3L4uLNXG57faa7uvSD4FN4LqCukxPJaEc8ROyqA0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDMizvZe4qVrp4T+nnm0gYe7wlDG7riCm3O6b/IiD+O6gIgSu52JhD5RMFYeWNFLw46PUxSxMrEMqsukgfsSwYRyvA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122442},"main":"./dist/index.js","type":"module","_from":"file:adhd-sox-blob-store-0.2.14.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"private":false,"_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/b5c1a34b984ac7975a3948a32376d7ef/adhd-sox-blob-store-0.2.14.tgz","_integrity":"sha512-nV8jykvdf8wZoIuxyHYM3IJ4DIw8ovRj6I8aFHGiAG/WUhosu9NmIgErI2PHebGMqjoRTyOmZ8Eb+IbyFecwyw==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sox-blob-store_0.2.14_1790658709048_0.039009029981984966","host":"s3://npm-registry-packages-npm-production"}},"0.2.15":{"_id":"@adhd/sox-blob-store@0.2.15","sox":{"area":"data","group":"store","concerns":["content-addressable blob storage (SHA-256 CAS)","two-phase write (temp → atomic rename)","SQLite reference tracking (refs, blob_meta, gc_runs)","mark-and-sweep GC with configurable grace period","stream-based API (putStream / getStream)","in-process FD guard (prevents GC of open blobs)","cross-process GC lock (flock)","integrity verification on read (default) and write (optional)"],"invariants":["put() is always idempotent — content-hash dedup is universal","rename() is atomic when tempDir and basePath are on the same filesystem","GC never deletes a blob that has an open FD in the in-process guard","get() returns null for not-found; throws IntegrityMismatch for corruption","orphan temp files are cleaned up on next open() (crash recovery)"],"entrypoints":["dist/index.js"]},"bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"dist":{"shasum":"37bce2d91162221a15de0aaa51af761d8cf348a6","tarball":"https://registry.npmjs.org/@adhd/sox-blob-store/-/sox-blob-store-0.2.15.tgz","fileCount":28,"integrity":"sha512-7LS73TIEeoU1d96AL1QtK2MpsxRG9lpK2Jab6ROIJGMblxoh5r/Ql1oMrNy39edUlFY1GOYDveHsH3mCQRjWfg==","signatures":[{"sig":"MEYCIQDP3Fd9gLmYqWTo+luKNIqw8LQihLiw0n9BJJNl1xeY9gIhALe7jU/5NMN1iR323EMwhUJblJPPkBdDz2FGA9irrgQf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDuAdNb32OA8mYag5z9asXezspfv2aOetSTs4PJkh5sZQIgYuvYXnEeSC0J1tJgWcMJfxAHgVLVjErJ52K0yXkX9pI="}],"unpackedSize":122442},"main":"./dist/index.js","name":"@adhd/sox-blob-store","type":"module","_from":"file:adhd-sox-blob-store-0.2.15.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"license":"MIT","private":false,"version":"0.2.15","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"homepage":"https://github.com/PseudoSky/adhd","keywords":["blob","storage","content-addressable","sqlite","typescript"],"_resolved":"/private/var/folders/yg/cfczgtx54bzfh74lx2_mv0z80000gp/T/5d1e4b0cbd1841c6452ae9d606955b20/adhd-sox-blob-store-0.2.15.tgz","_integrity":"sha512-7LS73TIEeoU1d96AL1QtK2MpsxRG9lpK2Jab6ROIJGMblxoh5r/Ql1oMrNy39edUlFY1GOYDveHsH3mCQRjWfg==","repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"_npmVersion":"11.6.2","description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","directories":{},"maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"_nodeVersion":"24.11.1","dependencies":{"@adhd/sox-store-adapter":"^0.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sox-blob-store_0.2.15_1790727228506_0.15460827823313483"}}},"time":{"created":"2026-07-16T22:02:17.474Z","modified":"2026-09-30T00:13:49.195Z","0.1.0":"2026-07-16T22:02:17.803Z","0.2.0":"2026-07-27T06:10:56.932Z","0.2.1":"2026-08-05T01:19:30.951Z","0.2.2":"2026-08-05T01:31:34.797Z","0.2.3":"2026-08-05T19:22:22.649Z","0.2.4":"2026-08-07T23:18:54.567Z","0.2.6":"2026-08-12T00:35:59.842Z","0.2.7":"2026-08-12T03:55:49.029Z","0.2.9":"2026-08-19T04:17:24.123Z","0.2.10":"2026-08-28T16:18:54.961Z","0.2.11":"2026-09-05T00:01:22.627Z","0.2.12":"2026-09-26T02:52:22.630Z","0.2.13":"2026-09-29T02:50:37.905Z","0.2.14":"2026-09-29T05:11:49.138Z","0.2.15":"2026-09-30T00:13:48.605Z"},"bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"license":"MIT","homepage":"https://github.com/PseudoSky/adhd","keywords":["blob","storage","content-addressable","sqlite","typescript"],"repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git"},"description":"Content-addressable blob storage: SHA-256 CAS write, SQLite reference tracking, stream-based API, mark-and-sweep GC with grace periods, FD guard, integrity verification.","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"readme":"# @adhd/sox-blob-store\n\nContent-addressable blob storage for Node: `put()` raw bytes, get back a SHA-256 hash; `get(hash)`\ngives you the bytes back. Identical content is written once (idempotent dedup), writes are crash-safe\n(temp file → atomic rename, DB record before file), and unreferenced blobs are reclaimed by a\nmark-and-sweep garbage collector with a grace period, an in-process FD guard that never deletes a\nblob someone is actively reading, and a cross-process lock so two processes running GC against the\nsame store directory never sweep at the same time. It keeps large content (documents, attachments,\nmedia) out of your primary rows; you store the hash, blob-store owns the bytes.\n\nReference tracking (which hash is used by which caller) is a small table set — `refs`, `blob_meta`,\n`gc_runs` — persisted through [`@adhd/sox-store-adapter`](https://www.npmjs.com/package/@adhd/sox-store-adapter).\nBy default that table set lives in an embedded SQLite file next to your blobs (single-writer, zero\nsetup). Hand `createBlobStore` a Turso-backed adapter instead (`adapter: await createTursoAdapter(...)`)\nand reference tracking inherits store-adapter's `multiprocess-wal` mode — concurrent writers across\nmultiple OS processes, serialized through its `-tshm` coordinator — so many workers can `put()`/`addRef()`/`gc()`\nagainst the same store file at once. The blob files themselves are already safe under concurrent\nprocesses independent of the adapter: `put()` hashes content client-side and writes to a unique temp\npath before an atomic `rename()`, so two processes racing to store the same bytes just redundantly\nwrite the same immutable destination path.\n\n```bash\npnpm add @adhd/sox-blob-store\n```\n\n## Quick start\n\n```typescript\nimport { createBlobStore } from '@adhd/sox-blob-store';\n\nconst store = createBlobStore({ basePath: './data/blobs' });\nawait store.open();\n\nconst hash = await store.put(new TextEncoder().encode('hello world'));\nconsole.log(hash); // 64-char SHA-256 hex digest\n\nconst bytes = await store.get(hash);\nconsole.log(new TextDecoder().decode(bytes!)); // \"hello world\"\n\n// Track which record refers to this blob — required before it survives GC.\nawait store.addRef(hash, 'post:42', { role: 'attachment' });\n\nawait store.close();\n```\n\n## API reference\n\n### `createBlobStore(config)`\n\n```typescript\ninterface StoreConfig {\n  basePath: string;             // directory where blob files + refs.db live\n  tempDir?: string;              // default: `${basePath}/.tmp`\n  refDbPath?: string;            // default: `${basePath}/refs.db`\n  maxBlobSize?: number;          // enforced by putStream(); default: 1 GiB\n  adapter?: StoreAdapter;        // supply your own (e.g. a Turso adapter) instead of the SQLite default\n  gc?: {\n    gracePeriodMs?: number;      // how long an unreferenced blob survives before GC deletes it\n    maxDeletePerCycle?: number;  // cap deletions per gc() call\n    autoGcIntervalMs?: number;   // if set, gc() runs automatically on this interval\n  };\n  verifyOnRead?: boolean;         // re-hash on every get()/getStream(); default: true\n  verifyOnWrite?: boolean;        // re-hash immediately after write, before committing; default: false\n}\n\nfunction createBlobStore(config: StoreConfig): BlobStore;\n```\n\n### `BlobStore`\n\n```typescript\nclass BlobStore {\n  readonly fdGuard: FdGuard;\n  readonly isOpen: boolean;\n\n  open(): Promise<void>;\n  close(): Promise<void>;\n\n  // Core CAS operations\n  put(data: Uint8Array): Promise<string>;                              // returns the SHA-256 hash\n  putStream(stream: ReadableStream<Uint8Array>): Promise<string>;\n  get(hash: string): Promise<Uint8Array | null>;\n  getStream(hash: string): Promise<ReadableStream<Uint8Array> | null>;\n  has(hash: string): Promise<boolean>;\n  exists(hash: string): Promise<boolean>;                               // alias of has()\n  delete(hash: string): Promise<boolean>;\n\n  // Size / listing\n  count(): Promise<number>;\n  totalSize(): Promise<number>;\n  sizeOf(hash: string): Promise<number>;\n  listBlobs(opts?: { prefix?: string; limit?: number; offset?: number }): AsyncIterable<string>;\n\n  // Reference tracking\n  addRef(blobHash: string, referrer: string, context?: Record<string, unknown>): Promise<void>;\n  addRefs(blobHashes: string[], referrer: string, context?: Record<string, unknown>): Promise<void>;\n  removeRef(blobHash: string, referrer: string): Promise<void>;\n  removeAllRefs(referrer: string): Promise<void>;\n  getRefsForReferrer(referrer: string): Promise<string[]>;\n  getReferrersForBlob(blobHash: string): Promise<string[]>;\n  refCount(blobHash: string): Promise<number>;\n\n  // Garbage collection\n  getOrphans(opts?: { t_before?: string; limit?: number }): Promise<Array<{ hash: string; size: number; lastRefRemoved: string | null }>>;\n  gc(opts?: GCOpts): Promise<GcResult>;\n  gcProgress(): AsyncIterable<{ phase: 'mark' | 'sweep'; processed: number; total: number; bytesScanned: number }>;\n  getGcHistory(opts?: { limit?: number; offset?: number }): Promise<GcResult[]>;\n  cancelGc(): Promise<boolean>;\n  pin(hash: string): Promise<void>;\n  unpin(hash: string): Promise<void>;\n  isPinned(hash: string): Promise<boolean>;\n\n  // Integrity\n  verify(hash: string): Promise<VerificationResult>;\n  verifyAll(opts?: { concurrency?: number; onCorrupt?: 'warn' | 'delete' | 'fail' }): AsyncIterable<VerificationResult>;\n  checkConsistency(): Promise<ConsistencyReport>;\n  repairDangling(): Promise<RepairResult>;\n\n  // Bulk transfer + observability\n  export(target: BlobStore, opts?: { filter?: (hash: string) => boolean }): Promise<ExportStats>;\n  metrics(): Promise<BlobStoreMetrics>;\n}\n\nfunction sha256Hex(data: Uint8Array): string;   // hash content without a store instance\nfunction isNotFound(err: unknown): boolean;     // portable check for \"not found\" errors\n```\n\nAlso exported for advanced use: `applySchema(adapter)` / `SCHEMA_SQL` (the raw `refs`/`blob_meta`/`gc_runs`\nDDL — `open()` already applies it for you, this is for migration tooling that needs it standalone),\n`InProcessFdGuard` / the `FdGuard` interface (the default in-process read-guard `BlobStore` uses\ninternally, exposed for a custom implementation), and `GCOpts` / `GcBlobInfo` (the `gc()` option and\nresult-item shapes).\n\n### Errors\n\nAll thrown errors extend `BlobStoreError`:\n\n```typescript\nclass BlobStoreError extends Error {}\nclass BlobNotFound extends BlobStoreError {\n  readonly hash: string;\n}\nclass IntegrityMismatch extends BlobStoreError {\n  readonly hash: string;\n  readonly expectedHash: string;\n  readonly computedHash: string;\n  readonly size: number;\n}\nclass GCInProgress extends BlobStoreError {\n  readonly startedAt: string;\n}\nclass BlobStoreSystemError extends BlobStoreError {\n  readonly cause?: Error;\n}\nclass BlobStoreNotOpenError extends BlobStoreError {}\n```\n\n## Streaming large blobs\n\n`put`/`get` take `Uint8Array` in memory; `putStream`/`getStream` avoid buffering the whole blob:\n\n```typescript\nimport { createReadStream } from 'node:fs';\nimport { Readable } from 'node:stream';\n\nconst webStream = Readable.toWeb(createReadStream('./video.mp4')) as ReadableStream<Uint8Array>;\nconst hash = await store.putStream(webStream);\n\nconst readBack = await store.getStream(hash);\nconst reader = readBack!.getReader();\n// pump reader.read() until { done: true }\n```\n\n`putStream` enforces `maxBlobSize` (default 1 GiB) while streaming and aborts before the temp file\nis ever renamed into place if the cap is exceeded.\n\n## Reference-counted garbage collection\n\nA blob is eligible for GC once its ref count reaches zero — `gc()` is mark-and-sweep with a grace\nperiod so a blob that just lost its last ref isn't deleted out from under a concurrent write:\n\n```typescript\nconst store = createBlobStore({\n  basePath: './data/blobs',\n  gc: { gracePeriodMs: 60_000, maxDeletePerCycle: 500 },\n});\nawait store.open();\n\n// Dry run first — see what WOULD be deleted without deleting anything.\nconst preview = await store.gc({ dryRun: true });\nconsole.log(`${preview.orphans.length} orphaned blobs, ${preview.totalOrphanBytes} bytes`);\n\n// Real run.\nconst result = await store.gc();\nconsole.log(`freed ${result.bytesFreed} bytes across ${result.deleted} blobs`);\n```\n\nGC takes an exclusive cross-process file lock (`.lock.acquire` in `basePath`, `flock`-style\ncreate-exclusive + poll) before it runs, so only one process sweeps at a time regardless of how\nmany processes have the store open. Pin a blob to exempt it from GC entirely:\n\n```typescript\nawait store.pin(hash);        // survives GC even with zero refs\nawait store.unpin(hash);\n```\n\nSubscribe to progress on a long GC run:\n\n```typescript\nfor await (const progress of store.gcProgress()) {\n  console.log(`${progress.phase}: ${progress.processed}/${progress.total}`);\n}\n```\n\n## Integrity verification\n\n```typescript\n// Re-hash a single blob against its content-address.\nconst result = await store.verify(hash);\nif (!result.match) {\n  console.error(`corruption: expected ${result.hash}, got ${result.computedHash}`);\n}\n\n// Re-hash every blob in the store.\nfor await (const r of store.verifyAll({ onCorrupt: 'warn' })) {\n  if (!r.match) console.warn(`corrupt blob: ${r.hash}`);\n}\n```\n\n`verifyOnRead` defaults to `true`: every `get()`/`getStream()` re-hashes the bytes against the\nrequested hash before returning them, throwing `IntegrityMismatch` on a mismatch instead of handing\nback corrupt data. Set it to `false` to skip that check on the read path when you've already verified\nelsewhere and want to avoid the extra hashing cost. `verifyOnWrite` (default `false`) re-hashes\nimmediately after every `put()`, before the write is committed.\n\n### Consistency checking and crash recovery\n\nEvery mutation is ordered so a crash mid-write leaves only the safe residue — a DB record with no\nfile yet (`put`) never happens before the file exists at its final path in the recoverable direction;\n`delete`/GC remove the DB record before the file, so a crash there leaves an orphan file rather than\na dangling reference that reads would fail against. `checkConsistency()` finds both kinds of residue;\n`repairDangling()` safely reclaims dangling records that have zero live refs (crash residue) while\nleaving alone any dangling record that still has a ref — that shape means real data loss, and is\nreported for you to investigate rather than silently deleted:\n\n```typescript\nconst report = await store.checkConsistency();\nconsole.log(`${report.orphanCount} orphan files, ${report.danglingCount} dangling records`);\n\nconst repair = await store.repairDangling();\nconsole.log(`reclaimed ${repair.reclaimed} dangling records`);\nif (repair.unreclaimed.length > 0) {\n  console.error('records with live refs but no file — real data loss:', repair.unreclaimed);\n}\n```\n\nOrphaned temp files (an interrupted write) are cleaned up automatically the next time `open()` runs.\n\n## Exporting between stores\n\n```typescript\nconst source = createBlobStore({ basePath: './data/blobs-old' });\nconst target = createBlobStore({ basePath: './data/blobs-new' });\nawait source.open();\nawait target.open();\n\nconst stats = await source.export(target, { filter: (hash) => hash.startsWith('a') });\nconsole.log(`copied ${stats.blobsCopied} blobs, ${stats.bytesCopied} bytes, skipped ${stats.blobsSkipped}`);\n```\n\n## Invariants\n\n- `put()`/`putStream()` are always idempotent — content-hash dedup is universal; storing the same\n  bytes twice returns the same hash and does not write twice.\n- `rename()` is atomic only when `tempDir` and `basePath` are on the same filesystem — keep the\n  default (`tempDir` inside `basePath`) unless you know your deployment target crosses a mount boundary.\n- GC never deletes a blob that has an open read/write handle in the in-process `FdGuard`, and never\n  runs two sweeps concurrently across processes — the cross-process lock serializes them.\n- `get()`/`getStream()` return `null` for a hash that was never written or has been GC'd; corruption\n  on a hash that IS present throws `IntegrityMismatch`, never a silent `null`.\n- `addRef()` requires the blob to already exist (`has(hash) === true`) — you cannot reference a hash\n  that hasn't been `put()` yet.\n","readmeFilename":"README.md"}