Repository navigation
fs-safe 0.25.0
Highlights
- Faster synchronous plugin captures: 16% faster than pre-change main on a measured 6,000-file tree; the new
createRootFileCopyBatchSyncAPI onadvancedalso reuses directory admissions across copies. (#878, #849) - Guest workspace publication: works on gVisor and other Linux filesystems that reject
RENAME_NOREPLACE. (#876) - Root-backed sidecar locks: native asynchronous release and exit cleanup no longer strand locks after their Root moves. (#879)
- Guest cross-device moves: preserve the admitted file permissions. (#869)
Features
- Guarded copy batches:
createRootFileCopyBatchSynconadvancedreuses directory admissions across synchronous copies on canonical POSIX paths while rechecking ancestor and file identities for every copy; single-file copies also reuse admission within the operation. (#849)
Fixes
- Root-backed file locks: native asynchronous release and exit cleanup follow the created lock's retained identity after its Root moves, preserving replacement files and reporting ownership mismatches. (#879) Thanks @axiom-ncis.
- Temp directory diagnostics: name rejected roots and ancestors, explain ownership, mode, or symlink failures, and provide safe recovery guidance, including for root-run appliances. Thanks @joequant. (#877)
- Guest directory publication: publish staged workspaces when Linux filesystems reject
RENAME_NOREPLACE, with checked file link/unlink fallback and directory rename that can only replace a concurrently created empty directory. (#876) Thanks @valkyriweb. - Guest cross-device moves: preserve the admitted source file's permissions instead of leaving the destination with a broader default mode. (#869)
- Move receipts: publication receipts capture the source identity after synchronous authorization callbacks return, so a source replaced during authorization is reported accurately. (#868)
- Atomic copy fallback: report a failed restoration as a failure even when the underlying error carries a restored receipt. (#851)
- Archive read limits: keep the validated entry-read byte limit fixed when callers mutate the options during a read. (#852)
- Watch on macOS: reconcile notifications for changes to the watched Root itself immediately instead of waiting for the periodic scan. (#858)
pathScopetilde names: keep literal~directory names inside scoped file and existing-path lookups instead of expanding them. (#856)
Performance
- Guarded file copies: reuse checked canonical POSIX roots during initial path admission, reducing repeated path-resolution work in synchronous plugin source captures without changing per-file identity or race checks.
- Root walks: reuse normalized directory prefixes, cutting a 50k-file walk by 5.6% and its sampled allocation by about 9% while keeping every filesystem and identity check. (#870)
- Atomic writes: non-durable async POSIX writes skip a redundant mode change when the staged file already has the requested permissions. (#871)
- Guarded mutations: fewer promise allocations around synchronous guard checks, with directory identity checks unchanged. (#857)
- Archive publication: fewer promise allocations in archive guard checks, without removing identity or containment checks. (#864)
- Watch: Linux and Windows watch passes skip macOS stream-path preparation. (#860)
- Permission diagnostics: bound escaping work for large error messages without changing the displayed excerpts. (#859)
Published packages
| Package | Registry tarball | Verified integrity | Provenance |
|---|---|---|---|
| @openclaw/fs-safe-linux-x64-gnu@0.25.0 | tgz | sha512-/OMLec2NpYuBRnDeexaKwJEkgIBrUO78AxSEBqoJpAzbZ9foLvtwxyEyOZfqnTrtrHwkY1PC+ebNMQbZDj6Z7g== |
verified attestation |
| @openclaw/fs-safe-linux-x64-musl@0.25.0 | tgz | sha512-WQXl6zfqS4nbWwDsMx7cAH0jI8sD8DRLrgLv2pygM7lPgbX5zVC7mz8reI632qyYJBHYbg0l+FymNUk0YxocFg== |
verified attestation |
| @openclaw/fs-safe-linux-arm64-gnu@0.25.0 | tgz | sha512-7Cpa7T7s53TpPMH3Uc5iB3SqzHmta/jsU+2xrdBxTk/Ztc2bKy21hPlaoEI/ITMdXL1L0bYxaRvlIzoJH+6XKw== |
verified attestation |
| @openclaw/fs-safe-linux-arm64-musl@0.25.0 | tgz | sha512-9ZeTBNh1OKCSCZzc1Ne4SN96IlFA1qrHs1yclP8vxCXFXGgkTFyX2xwZ8qLuONodPDezifqVxzP66tGvyBQadw== |
verified attestation |
| @openclaw/fs-safe-darwin-x64@0.25.0 | tgz | sha512-HFAAytEr0MN4zZwoLiv3oLmDOJFchanUHl5gi5YQyPTqf7/C0AEuPcR1+gP0dWpuccCEmuxivKE30yriw+WUUw== |
verified attestation |
| @openclaw/fs-safe-darwin-arm64@0.25.0 | tgz | sha512-ftwB6/cM4bdWXn2pBwUSEL4A5ZnX5jh6aEPBhS5Q3Yd/bQgJyWIFTNv4+kC+4QrufuX20/VF/kIjPyu17RcDMg== |
verified attestation |
| @openclaw/fs-safe-win32-x64-msvc@0.25.0 | tgz | sha512-O4cDKqwownShG/LvhxrrQl5sa9D8WSCTT51vzmugi8dAdXGLwaEa+qtpSWJEfA2BY9rQW3ohipHEO92uO52Gbw== |
verified attestation |
| @openclaw/fs-safe@0.25.0 | tgz | sha512-/8XzfW0zulV1BPzjnkD7vRG12u0u517w00rIuAGmW4GU07fxatYSkLHc1GaFCSX/WuLwGPzoxjPSKuRloBprIQ== |
verified attestation |
Release proof: GitHub Actions run.