@openclaw/openshell-sandbox 2026.9.5 → 2026.9.7
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.
- package/assets/icon.png +0 -0
- package/dist/index.js +85 -271
- package/node_modules/@openclaw/fs-safe/CHANGELOG.md +304 -0
- package/node_modules/@openclaw/fs-safe/README.md +68 -15
- package/node_modules/@openclaw/fs-safe/dist/absolute-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/absolute-path.js +2 -8
- package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts +12 -4
- package/node_modules/@openclaw/fs-safe/dist/advanced.js +7 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-crc32.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-deadline.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-deadline.js +22 -23
- package/node_modules/@openclaw/fs-safe/dist/archive-durability.d.ts +1 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-durability.js +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-entry.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-errors.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-input.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-kind.d.ts +0 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-kind.js +5 -17
- package/node_modules/@openclaw/fs-safe/dist/archive-limits.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-merge.d.ts +3 -4
- package/node_modules/@openclaw/fs-safe/dist/archive-merge.js +130 -54
- package/node_modules/@openclaw/fs-safe/dist/archive-parser-errors.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-parser.wasm +0 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-plan.d.ts +67 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-plan.js +86 -22
- package/node_modules/@openclaw/fs-safe/dist/archive-read.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-read.js +16 -26
- package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts +1 -3
- package/node_modules/@openclaw/fs-safe/dist/archive-staging.js +3 -3
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.d.ts +3 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.js +56 -37
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.d.ts +17 -6
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.js +134 -34
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.js +21 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.d.ts +5 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.js +29 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.d.ts +13 -10
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.js +9 -26
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.d.ts +2 -3
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.js +2 -13
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.d.ts +7 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.js +119 -33
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.js +3 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.js +13 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts +2 -4
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.js +16 -8
- package/node_modules/@openclaw/fs-safe/dist/archive.d.ts +14 -9
- package/node_modules/@openclaw/fs-safe/dist/archive.js +223 -178
- package/node_modules/@openclaw/fs-safe/dist/async-lock.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/atomic.d.ts +3 -2
- package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.d.ts +0 -2
- package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.js +0 -6
- package/node_modules/@openclaw/fs-safe/dist/bounded-read.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/byte-budget.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/byte-view.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/byte-view.js +13 -0
- package/node_modules/@openclaw/fs-safe/dist/clone-metadata.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/clone-metadata.js +6 -2
- package/node_modules/@openclaw/fs-safe/dist/config.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/containment.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-file-input.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-policy.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-publication.d.ts +8 -5
- package/node_modules/@openclaw/fs-safe/dist/copy-publication.js +5 -6
- package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.js +51 -28
- package/node_modules/@openclaw/fs-safe/dist/copy.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy.js +34 -16
- package/node_modules/@openclaw/fs-safe/dist/create-owned-file.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/create-owned-file.js +16 -0
- package/node_modules/@openclaw/fs-safe/dist/create.d.ts +17 -0
- package/node_modules/@openclaw/fs-safe/dist/create.js +388 -0
- package/node_modules/@openclaw/fs-safe/dist/creation-boundary.d.ts +60 -0
- package/node_modules/@openclaw/fs-safe/dist/creation-boundary.js +371 -0
- package/node_modules/@openclaw/fs-safe/dist/deny-mutation-match.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/deny-mutation-match.js +71 -0
- package/node_modules/@openclaw/fs-safe/dist/deny-mutations.d.ts +2 -3
- package/node_modules/@openclaw/fs-safe/dist/deny-mutations.js +56 -35
- package/node_modules/@openclaw/fs-safe/dist/device-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-durability.d.ts +7 -8
- package/node_modules/@openclaw/fs-safe/dist/directory-durability.js +22 -80
- package/node_modules/@openclaw/fs-safe/dist/directory-entry-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts +5 -8
- package/node_modules/@openclaw/fs-safe/dist/directory-guard.js +23 -57
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts +22 -3
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.js +97 -3
- package/node_modules/@openclaw/fs-safe/dist/directory-receipt.d.ts +23 -0
- package/node_modules/@openclaw/fs-safe/dist/directory-receipt.js +121 -0
- package/node_modules/@openclaw/fs-safe/dist/durability.d.ts +2 -2
- package/node_modules/@openclaw/fs-safe/dist/effective-uid.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/effective-uid.js +1 -4
- package/node_modules/@openclaw/fs-safe/dist/error-detail.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/errors.d.ts +3 -2
- package/node_modules/@openclaw/fs-safe/dist/errors.js +3 -2
- package/node_modules/@openclaw/fs-safe/dist/file-cleanup.d.ts +19 -0
- package/node_modules/@openclaw/fs-safe/dist/file-cleanup.js +81 -0
- package/node_modules/@openclaw/fs-safe/dist/file-contents.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/file-contents.js +40 -0
- package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.d.ts +2 -1
- package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.js +57 -2
- package/node_modules/@openclaw/fs-safe/dist/file-hash.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-hash.js +186 -70
- package/node_modules/@openclaw/fs-safe/dist/file-identity.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-identity.js +26 -4
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-acquisition.d.ts +22 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-acquisition.js +98 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-admission.d.ts +17 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-admission.js +58 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-acquire.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-acquire.js +303 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-arbitration.d.ts +17 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-arbitration.js +66 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-held.d.ts +25 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-held.js +392 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-io.d.ts +40 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-io.js +209 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-mutation.d.ts +16 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-mutation.js +275 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-options.d.ts +11 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-options.js +58 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-registration.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-registration.js +90 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root.d.ts +34 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root.js +288 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-stale-admission.d.ts +19 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-stale-admission.js +199 -0
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.d.ts +4 -22
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.js +207 -249
- package/node_modules/@openclaw/fs-safe/dist/file-lock.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-observation.d.ts +1 -2
- package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts +11 -14
- package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.js +73 -45
- package/node_modules/@openclaw/fs-safe/dist/file-store-prune.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-prune.js +11 -6
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.js +197 -227
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.js +22 -36
- package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts +4 -8
- package/node_modules/@openclaw/fs-safe/dist/file-store.js +72 -45
- package/node_modules/@openclaw/fs-safe/dist/file-sync.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/filename.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/filename.js +1 -7
- package/node_modules/@openclaw/fs-safe/dist/fs.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.d.ts +2 -2
- package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.js +27 -19
- package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.d.ts +0 -7
- package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.js +6 -11
- package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.js +41 -90
- package/node_modules/@openclaw/fs-safe/dist/guest-native-python.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guest-native-python.js +23 -31
- package/node_modules/@openclaw/fs-safe/dist/guest.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guest.js +21 -12
- package/node_modules/@openclaw/fs-safe/dist/home-dir.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/index.d.ts +9 -7
- package/node_modules/@openclaw/fs-safe/dist/install-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/install-path.js +2 -5
- package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts +4 -10
- package/node_modules/@openclaw/fs-safe/dist/json-document-store.js +22 -15
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.d.ts +13 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.js +134 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts +1 -7
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.js +43 -72
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.js +13 -9
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts +0 -2
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.js +20 -148
- package/node_modules/@openclaw/fs-safe/dist/json-store.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-store.js +1 -2
- package/node_modules/@openclaw/fs-safe/dist/json-stringify.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json.js +39 -92
- package/node_modules/@openclaw/fs-safe/dist/local-file-access.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/local-file-access.js +5 -15
- package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.d.ts +2 -6
- package/node_modules/@openclaw/fs-safe/dist/local-roots.d.ts +2 -8
- package/node_modules/@openclaw/fs-safe/dist/local-roots.js +19 -21
- package/node_modules/@openclaw/fs-safe/dist/lock-config.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.d.ts +5 -20
- package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.js +60 -24
- package/node_modules/@openclaw/fs-safe/dist/move-path-stage.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path.js +64 -42
- package/node_modules/@openclaw/fs-safe/dist/mutation-authority.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/mutation-authority.js +5 -0
- package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts +69 -15
- package/node_modules/@openclaw/fs-safe/dist/native-config.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-directory-observation.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-fallback-warning.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/native-fallback-warning.js +11 -0
- package/node_modules/@openclaw/fs-safe/dist/native-operations.d.ts +1 -7
- package/node_modules/@openclaw/fs-safe/dist/native-operations.js +2 -31
- package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.d.ts +5 -3
- package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.js +27 -7
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.d.ts +2 -3
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.js +174 -29
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.d.ts +1 -2
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.js +230 -187
- package/node_modules/@openclaw/fs-safe/dist/native-policy-directory-observation.d.ts +11 -0
- package/node_modules/@openclaw/fs-safe/dist/native-policy-directory-observation.js +61 -0
- package/node_modules/@openclaw/fs-safe/dist/native-policy-parent-windows.d.ts +13 -0
- package/node_modules/@openclaw/fs-safe/dist/native-policy-parent-windows.js +209 -0
- package/node_modules/@openclaw/fs-safe/dist/native-rename-outcome.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/native-rename-outcome.js +8 -0
- package/node_modules/@openclaw/fs-safe/dist/native-staged-file.d.ts +20 -6
- package/node_modules/@openclaw/fs-safe/dist/native-staged-file.js +149 -106
- package/node_modules/@openclaw/fs-safe/dist/native-staged-symlink.d.ts +13 -0
- package/node_modules/@openclaw/fs-safe/dist/native-staged-symlink.js +303 -0
- package/node_modules/@openclaw/fs-safe/dist/native.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native.js +2 -2
- package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/opened-realpath.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/opened-realpath.js +11 -2
- package/node_modules/@openclaw/fs-safe/dist/output.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/output.js +12 -8
- package/node_modules/@openclaw/fs-safe/dist/overwrite-file-handle.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl-batch-worker.js +54 -0
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl-batch.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl-batch.js +64 -0
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts +2 -1
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl.js +13 -4
- package/node_modules/@openclaw/fs-safe/dist/path-case.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-policy.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-prefix.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-prefix.js +30 -8
- package/node_modules/@openclaw/fs-safe/dist/path-scope-lexical.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-segment-route.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.d.ts +2 -1
- package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.js +25 -17
- package/node_modules/@openclaw/fs-safe/dist/path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path.js +19 -2
- package/node_modules/@openclaw/fs-safe/dist/permission-exec.d.ts +8 -1
- package/node_modules/@openclaw/fs-safe/dist/permission-exec.js +141 -21
- package/node_modules/@openclaw/fs-safe/dist/permissions-public.d.ts +3 -2
- package/node_modules/@openclaw/fs-safe/dist/permissions-public.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts +5 -16
- package/node_modules/@openclaw/fs-safe/dist/permissions-windows.js +11 -31
- package/node_modules/@openclaw/fs-safe/dist/permissions.d.ts +3 -11
- package/node_modules/@openclaw/fs-safe/dist/permissions.js +11 -34
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.d.ts +1 -3
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.js +27 -31
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.d.ts +7 -3
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.js +81 -18
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.d.ts +3 -9
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.js +1 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts +2 -2
- package/node_modules/@openclaw/fs-safe/dist/pinned-open.js +9 -5
- package/node_modules/@openclaw/fs-safe/dist/pinned-operation.d.ts +1 -2
- package/node_modules/@openclaw/fs-safe/dist/pinned-operation.js +3 -16
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-input.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-input.js +35 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-mode.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-mode.js +31 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-staged.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-staged.js +185 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-types.d.ts +14 -21
- package/node_modules/@openclaw/fs-safe/dist/pinned-write.d.ts +0 -2
- package/node_modules/@openclaw/fs-safe/dist/pinned-write.js +43 -151
- package/node_modules/@openclaw/fs-safe/dist/positional-read.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/private-directory.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/private-directory.js +18 -4
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff-sync.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff-sync.js +72 -0
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.d.ts +42 -5
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.js +166 -80
- package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.js +56 -128
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.d.ts +3 -3
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.js +20 -7
- package/node_modules/@openclaw/fs-safe/dist/publish-file-failure.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/publish-file.d.ts +2 -4
- package/node_modules/@openclaw/fs-safe/dist/publish-file.js +59 -100
- package/node_modules/@openclaw/fs-safe/dist/read-open-flags.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/read-opened-file.d.ts +2 -6
- package/node_modules/@openclaw/fs-safe/dist/realpath.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/recursive-mkdir-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/regular-file.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/regular-file.js +111 -196
- package/node_modules/@openclaw/fs-safe/dist/replace-directory.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-directory.js +245 -20
- package/node_modules/@openclaw/fs-safe/dist/replace-file-buffer.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-buffer.js +36 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.d.ts +4 -11
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.js +150 -117
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.js +27 -33
- package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.d.ts +7 -12
- package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.js +25 -18
- package/node_modules/@openclaw/fs-safe/dist/replace-file-destination.d.ts +21 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-destination.js +123 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-mode.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-mutation.d.ts +26 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-mutation.js +47 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-rename-policy.d.ts +1 -3
- package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts +19 -24
- package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.js +126 -149
- package/node_modules/@openclaw/fs-safe/dist/replace-file-types.d.ts +55 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-types.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts +3 -56
- package/node_modules/@openclaw/fs-safe/dist/replace-file.js +47 -31
- package/node_modules/@openclaw/fs-safe/dist/retained-directory-replacement.d.ts +26 -0
- package/node_modules/@openclaw/fs-safe/dist/retained-directory-replacement.js +193 -0
- package/node_modules/@openclaw/fs-safe/dist/retained-file-types.d.ts +50 -0
- package/node_modules/@openclaw/fs-safe/dist/retained-file-types.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/retained-file.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/retained-file.js +121 -0
- package/node_modules/@openclaw/fs-safe/dist/root-boundary.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-boundary.js +4 -0
- package/node_modules/@openclaw/fs-safe/dist/root-context.d.ts +0 -9
- package/node_modules/@openclaw/fs-safe/dist/root-context.js +6 -12
- package/node_modules/@openclaw/fs-safe/dist/root-create-input.d.ts +9 -3
- package/node_modules/@openclaw/fs-safe/dist/root-create-input.js +17 -4
- package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.d.ts +4 -5
- package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.js +20 -7
- package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.js +28 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts +10 -2
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.js +105 -40
- package/node_modules/@openclaw/fs-safe/dist/root-directory.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-entries.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-entries.js +2 -2
- package/node_modules/@openclaw/fs-safe/dist/root-errors.d.ts +4 -1
- package/node_modules/@openclaw/fs-safe/dist/root-errors.js +5 -3
- package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.d.ts +2 -3
- package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.js +6 -8
- package/node_modules/@openclaw/fs-safe/dist/root-file.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-file.js +5 -7
- package/node_modules/@openclaw/fs-safe/dist/root-handle-context.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/root-handle-context.js +12 -0
- package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts +5 -18
- package/node_modules/@openclaw/fs-safe/dist/root-impl.js +239 -152
- package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.d.ts +4 -8
- package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.js +31 -28
- package/node_modules/@openclaw/fs-safe/dist/root-move-preflight.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-observed-path.d.ts +0 -2
- package/node_modules/@openclaw/fs-safe/dist/root-observed-path.js +2 -7
- package/node_modules/@openclaw/fs-safe/dist/root-options.d.ts +13 -6
- package/node_modules/@openclaw/fs-safe/dist/root-path-errors.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-errors.js +11 -2
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts +3 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.js +45 -50
- package/node_modules/@openclaw/fs-safe/dist/root-path-observation.d.ts +4 -12
- package/node_modules/@openclaw/fs-safe/dist/root-path-stat.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-stat.js +61 -11
- package/node_modules/@openclaw/fs-safe/dist/root-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path.js +64 -207
- package/node_modules/@openclaw/fs-safe/dist/root-paths-lexical.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts +2 -7
- package/node_modules/@openclaw/fs-safe/dist/root-public-types.d.ts +11 -0
- package/node_modules/@openclaw/fs-safe/dist/root-public-types.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-read-admission.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-read-admission.js +31 -39
- package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.d.ts +1 -4
- package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.js +2 -4
- package/node_modules/@openclaw/fs-safe/dist/root-remove-receipt.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-remove.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-remove.js +21 -5
- package/node_modules/@openclaw/fs-safe/dist/root-symlink-policy.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts +19 -13
- package/node_modules/@openclaw/fs-safe/dist/root-walk.js +67 -16
- package/node_modules/@openclaw/fs-safe/dist/root-write-admission.d.ts +1 -4
- package/node_modules/@openclaw/fs-safe/dist/root-write-admission.js +4 -27
- package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.d.ts +1 -3
- package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.js +17 -68
- package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.d.ts +2 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.js +13 -28
- package/node_modules/@openclaw/fs-safe/dist/root-write-lock-binding.d.ts +14 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-lock-binding.js +162 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-mode.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-publication.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-publication.js +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-verification.d.ts +1 -2
- package/node_modules/@openclaw/fs-safe/dist/root-write-verification.js +29 -42
- package/node_modules/@openclaw/fs-safe/dist/root.d.ts +2 -7
- package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.d.ts +2 -2
- package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.js +9 -6
- package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts +6 -3
- package/node_modules/@openclaw/fs-safe/dist/secret-file.js +22 -58
- package/node_modules/@openclaw/fs-safe/dist/secret-read-async.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-read-async.js +6 -27
- package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.d.ts +6 -3
- package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.js +27 -3
- package/node_modules/@openclaw/fs-safe/dist/secret.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.d.ts +3 -3
- package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.js +42 -149
- package/node_modules/@openclaw/fs-safe/dist/secure-file.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-file.js +14 -13
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.js +2 -7
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.js +5 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.js +32 -39
- package/node_modules/@openclaw/fs-safe/dist/sibling-temp.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-temp.js +23 -12
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.d.ts +2 -29
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.js +283 -220
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-context.d.ts +18 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-context.js +60 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-parser.d.ts +41 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-parser.js +113 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission.d.ts +31 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.d.ts +5 -9
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.js +6 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts +6 -8
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.js +23 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.d.ts +12 -8
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.js +101 -44
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-registration.d.ts +13 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-registration.js +47 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.js +2 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-stale-admission.d.ts +34 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-stale-admission.js +228 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-target.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-target.js +55 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-types.d.ts +22 -17
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.js +52 -35
- package/node_modules/@openclaw/fs-safe/dist/staged-directory.d.ts +7 -5
- package/node_modules/@openclaw/fs-safe/dist/staged-directory.js +43 -7
- package/node_modules/@openclaw/fs-safe/dist/staged-file-settlement.d.ts +16 -0
- package/node_modules/@openclaw/fs-safe/dist/staged-file-settlement.js +57 -0
- package/node_modules/@openclaw/fs-safe/dist/staged-file-types.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/staged-symlink-types.d.ts +39 -0
- package/node_modules/@openclaw/fs-safe/dist/staged-symlink-types.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/stat-observation.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/stat-observation.js +3 -10
- package/node_modules/@openclaw/fs-safe/dist/store.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.d.ts +3 -2
- package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.js +14 -14
- package/node_modules/@openclaw/fs-safe/dist/string-coerce.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/suppressed-error.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/symlink-parents.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/symlink-parents.js +58 -32
- package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-target.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-target.js +14 -55
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.d.ts +0 -8
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.js +50 -37
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.d.ts +16 -6
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.js +70 -15
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.d.ts +1 -7
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.js +11 -33
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.js +53 -35
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-ownership.d.ts +8 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-ownership.js +52 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-types.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts +5 -2
- package/node_modules/@openclaw/fs-safe/dist/text-atomic.d.ts +2 -2
- package/node_modules/@openclaw/fs-safe/dist/text-atomic.js +3 -1
- package/node_modules/@openclaw/fs-safe/dist/timing.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/trash.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/trash.js +27 -1
- package/node_modules/@openclaw/fs-safe/dist/types.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/unicode-path.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/unicode-path.js +3 -0
- package/node_modules/@openclaw/fs-safe/dist/walk.d.ts +7 -7
- package/node_modules/@openclaw/fs-safe/dist/walk.js +23 -8
- package/node_modules/@openclaw/fs-safe/dist/watch-alias.d.ts +6 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-alias.js +88 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-hints.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-hints.js +93 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-native.d.ts +36 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-native.js +73 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-scan.d.ts +28 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-scan.js +300 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-stream.d.ts +8 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-stream.js +32 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-types.d.ts +60 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-types.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/watch.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/watch.js +530 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-command.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts +3 -8
- package/node_modules/@openclaw/fs-safe/dist/windows-owner.js +8 -5
- package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.js +12 -43
- package/node_modules/@openclaw/fs-safe/dist/windows-path-syntax.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-path-syntax.js +21 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-security-bridge.cs +336 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-security-bridge.ps1 +90 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-security-command.d.ts +33 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-security-command.js +414 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.js +112 -0
- package/node_modules/@openclaw/fs-safe/dist/write-file-handle.d.ts +7 -1
- package/node_modules/@openclaw/fs-safe/dist/write-file-handle.js +23 -0
- package/node_modules/@openclaw/fs-safe/dist/write-open-flags.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/write-open-flags.js +1 -8
- package/node_modules/@openclaw/fs-safe/dist/write-queue.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/write-queue.js +1 -4
- package/node_modules/@openclaw/fs-safe/docs/advanced.md +79 -6
- package/node_modules/@openclaw/fs-safe/docs/archive.md +154 -48
- package/node_modules/@openclaw/fs-safe/docs/atomic.md +218 -13
- package/node_modules/@openclaw/fs-safe/docs/config.md +6 -2
- package/node_modules/@openclaw/fs-safe/docs/contributing.md +150 -8
- package/node_modules/@openclaw/fs-safe/docs/copy.md +41 -0
- package/node_modules/@openclaw/fs-safe/docs/creation.md +132 -0
- package/node_modules/@openclaw/fs-safe/docs/durability.md +66 -0
- package/node_modules/@openclaw/fs-safe/docs/file-contents.md +68 -0
- package/node_modules/@openclaw/fs-safe/docs/file-store.md +24 -0
- package/node_modules/@openclaw/fs-safe/docs/guest.md +8 -2
- package/node_modules/@openclaw/fs-safe/docs/index.md +1 -0
- package/node_modules/@openclaw/fs-safe/docs/install.md +61 -7
- package/node_modules/@openclaw/fs-safe/docs/json-store.md +5 -0
- package/node_modules/@openclaw/fs-safe/docs/json.md +5 -4
- package/node_modules/@openclaw/fs-safe/docs/local-roots.md +2 -0
- package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.5.md +15 -6
- package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.6.md +9 -4
- package/node_modules/@openclaw/fs-safe/docs/mutation-policy-proof.md +11 -7
- package/node_modules/@openclaw/fs-safe/docs/native-helper.md +51 -15
- package/node_modules/@openclaw/fs-safe/docs/native.md +117 -15
- package/node_modules/@openclaw/fs-safe/docs/output.md +6 -0
- package/node_modules/@openclaw/fs-safe/docs/path-prefix.md +10 -0
- package/node_modules/@openclaw/fs-safe/docs/path-suffix-aliases.md +51 -6
- package/node_modules/@openclaw/fs-safe/docs/path.md +4 -4
- package/node_modules/@openclaw/fs-safe/docs/permissions.md +122 -14
- package/node_modules/@openclaw/fs-safe/docs/public-api.md +38 -5
- package/node_modules/@openclaw/fs-safe/docs/quickstart.md +1 -1
- package/node_modules/@openclaw/fs-safe/docs/reading.md +2 -2
- package/node_modules/@openclaw/fs-safe/docs/regular-file.md +3 -0
- package/node_modules/@openclaw/fs-safe/docs/retained-file.md +115 -0
- package/node_modules/@openclaw/fs-safe/docs/root.md +110 -12
- package/node_modules/@openclaw/fs-safe/docs/secret-file.md +38 -2
- package/node_modules/@openclaw/fs-safe/docs/secure-file.md +9 -4
- package/node_modules/@openclaw/fs-safe/docs/security-model.md +4 -1
- package/node_modules/@openclaw/fs-safe/docs/sidecar-lock.md +131 -9
- package/node_modules/@openclaw/fs-safe/docs/staged-file.md +16 -6
- package/node_modules/@openclaw/fs-safe/docs/staged-symlink.md +124 -0
- package/node_modules/@openclaw/fs-safe/docs/store.md +12 -2
- package/node_modules/@openclaw/fs-safe/docs/temp.md +56 -9
- package/node_modules/@openclaw/fs-safe/docs/testing.md +210 -0
- package/node_modules/@openclaw/fs-safe/docs/types.md +24 -2
- package/node_modules/@openclaw/fs-safe/docs/walk.md +108 -2
- package/node_modules/@openclaw/fs-safe/docs/watch.md +251 -0
- package/node_modules/@openclaw/fs-safe/docs/writing.md +126 -11
- package/node_modules/@openclaw/fs-safe/package.json +23 -17
- package/node_modules/@openclaw/fs-safe-darwin-arm64/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-darwin-arm64/package.json +1 -1
- package/node_modules/@openclaw/fs-safe-darwin-x64/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-darwin-x64/package.json +1 -1
- package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/package.json +1 -1
- package/node_modules/@openclaw/fs-safe-linux-arm64-musl/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-linux-arm64-musl/package.json +1 -1
- package/node_modules/@openclaw/fs-safe-linux-x64-gnu/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-linux-x64-gnu/package.json +1 -1
- package/node_modules/@openclaw/fs-safe-linux-x64-musl/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-linux-x64-musl/package.json +1 -1
- package/node_modules/@openclaw/fs-safe-win32-x64-msvc/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-win32-x64-msvc/package.json +1 -1
- package/node_modules/p-limit/index.d.ts +2 -0
- package/node_modules/p-limit/index.js +17 -1
- package/node_modules/p-limit/package.json +1 -1
- package/node_modules/p-limit/readme.md +2 -0
- package/node_modules/zod/README.md +2 -2
- package/node_modules/zod/compile.cjs +19 -0
- package/node_modules/zod/index.cjs +19 -0
- package/node_modules/zod/locales/index.cjs +19 -0
- package/node_modules/zod/mini/index.cjs +19 -0
- package/node_modules/zod/package.json +8 -7
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
- package/node_modules/zod/src/v4/classic/external.ts +2 -0
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +248 -25
- package/node_modules/zod/src/v4/classic/schemas.ts +243 -168
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +60 -9
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +6 -0
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +2 -2
- package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +265 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +112 -6
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +9 -0
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +130 -1
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +157 -0
- package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +40 -2
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +27 -7
- package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +88 -56
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +39 -0
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +56 -0
- package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +3 -2
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
- package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +46 -1
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +95 -1
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +33 -1
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +234 -38
- package/node_modules/zod/src/v4/classic/tests/validate.test.ts +569 -0
- package/node_modules/zod/src/v4/core/api.ts +44 -28
- package/node_modules/zod/src/v4/core/checks.ts +62 -102
- package/node_modules/zod/src/v4/core/compile.ts +218 -93
- package/node_modules/zod/src/v4/core/core.ts +1 -3
- package/node_modules/zod/src/v4/core/doc.ts +6 -2
- package/node_modules/zod/src/v4/core/errors.ts +3 -6
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +2 -2
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +185 -81
- package/node_modules/zod/src/v4/core/memoizer.ts +75 -28
- package/node_modules/zod/src/v4/core/parse.ts +37 -16
- package/node_modules/zod/src/v4/core/regexes.ts +14 -4
- package/node_modules/zod/src/v4/core/schemas.ts +296 -132
- package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
- package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +35 -0
- package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
- package/node_modules/zod/src/v4/core/tests/compile.test.ts +399 -2
- package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
- package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
- package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +118 -16
- package/node_modules/zod/src/v4/core/to-json-schema.ts +9 -7
- package/node_modules/zod/src/v4/core/util.ts +218 -147
- package/node_modules/zod/src/v4/core/versions.ts +2 -2
- package/node_modules/zod/src/v4/locales/ar.ts +2 -0
- package/node_modules/zod/src/v4/locales/az.ts +2 -0
- package/node_modules/zod/src/v4/locales/be.ts +2 -0
- package/node_modules/zod/src/v4/locales/bg.ts +2 -0
- package/node_modules/zod/src/v4/locales/bn.ts +2 -0
- package/node_modules/zod/src/v4/locales/ca.ts +2 -0
- package/node_modules/zod/src/v4/locales/ckb.ts +2 -0
- package/node_modules/zod/src/v4/locales/cs.ts +2 -0
- package/node_modules/zod/src/v4/locales/da.ts +2 -0
- package/node_modules/zod/src/v4/locales/de.ts +2 -0
- package/node_modules/zod/src/v4/locales/el.ts +2 -0
- package/node_modules/zod/src/v4/locales/en.ts +2 -0
- package/node_modules/zod/src/v4/locales/eo.ts +2 -0
- package/node_modules/zod/src/v4/locales/es.ts +2 -0
- package/node_modules/zod/src/v4/locales/fa.ts +2 -0
- package/node_modules/zod/src/v4/locales/fi.ts +2 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +2 -0
- package/node_modules/zod/src/v4/locales/fr.ts +2 -0
- package/node_modules/zod/src/v4/locales/gu.ts +2 -0
- package/node_modules/zod/src/v4/locales/he.ts +2 -0
- package/node_modules/zod/src/v4/locales/hi.ts +2 -0
- package/node_modules/zod/src/v4/locales/hr.ts +2 -0
- package/node_modules/zod/src/v4/locales/hu.ts +2 -0
- package/node_modules/zod/src/v4/locales/hy.ts +2 -0
- package/node_modules/zod/src/v4/locales/id.ts +2 -0
- package/node_modules/zod/src/v4/locales/index.ts +1 -0
- package/node_modules/zod/src/v4/locales/is.ts +2 -0
- package/node_modules/zod/src/v4/locales/it.ts +2 -0
- package/node_modules/zod/src/v4/locales/ja.ts +2 -0
- package/node_modules/zod/src/v4/locales/ka.ts +2 -0
- package/node_modules/zod/src/v4/locales/km.ts +2 -0
- package/node_modules/zod/src/v4/locales/kn.ts +2 -0
- package/node_modules/zod/src/v4/locales/ko.ts +2 -0
- package/node_modules/zod/src/v4/locales/lt.ts +2 -0
- package/node_modules/zod/src/v4/locales/mk.ts +2 -0
- package/node_modules/zod/src/v4/locales/ms.ts +2 -0
- package/node_modules/zod/src/v4/locales/ne.ts +2 -0
- package/node_modules/zod/src/v4/locales/nl.ts +2 -0
- package/node_modules/zod/src/v4/locales/nn.ts +2 -0
- package/node_modules/zod/src/v4/locales/no.ts +2 -0
- package/node_modules/zod/src/v4/locales/ota.ts +2 -0
- package/node_modules/zod/src/v4/locales/pl.ts +2 -0
- package/node_modules/zod/src/v4/locales/ps.ts +2 -0
- package/node_modules/zod/src/v4/locales/pt-BR.ts +2 -0
- package/node_modules/zod/src/v4/locales/pt.ts +2 -0
- package/node_modules/zod/src/v4/locales/ro.ts +2 -0
- package/node_modules/zod/src/v4/locales/ru.ts +2 -0
- package/node_modules/zod/src/v4/locales/sk.ts +2 -0
- package/node_modules/zod/src/v4/locales/sl.ts +2 -0
- package/node_modules/zod/src/v4/locales/sv.ts +2 -0
- package/node_modules/zod/src/v4/locales/ta.ts +2 -0
- package/node_modules/zod/src/v4/locales/tg.ts +135 -0
- package/node_modules/zod/src/v4/locales/th.ts +2 -0
- package/node_modules/zod/src/v4/locales/tk.ts +2 -0
- package/node_modules/zod/src/v4/locales/tr.ts +2 -0
- package/node_modules/zod/src/v4/locales/uk.ts +2 -0
- package/node_modules/zod/src/v4/locales/ur.ts +2 -0
- package/node_modules/zod/src/v4/locales/uz.ts +2 -0
- package/node_modules/zod/src/v4/locales/vi.ts +2 -0
- package/node_modules/zod/src/v4/locales/yo.ts +2 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +2 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +2 -0
- package/node_modules/zod/src/v4/mini/external.ts +2 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +32 -7
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +1 -1
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +86 -0
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +16 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +23 -0
- package/node_modules/zod/v3/ZodError.cjs +19 -0
- package/node_modules/zod/v3/errors.cjs +19 -0
- package/node_modules/zod/v3/external.cjs +19 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
- package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
- package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
- package/node_modules/zod/v3/helpers/util.cjs +19 -0
- package/node_modules/zod/v3/index.cjs +19 -0
- package/node_modules/zod/v3/standard-schema.cjs +19 -0
- package/node_modules/zod/v3/types.cjs +19 -0
- package/node_modules/zod/v4/classic/checks.cjs +19 -0
- package/node_modules/zod/v4/classic/coerce.cjs +19 -0
- package/node_modules/zod/v4/classic/compat.cjs +19 -0
- package/node_modules/zod/v4/classic/deep-partial.cjs +19 -0
- package/node_modules/zod/v4/classic/errors.cjs +19 -0
- package/node_modules/zod/v4/classic/external.cjs +22 -1
- package/node_modules/zod/v4/classic/external.d.cts +1 -1
- package/node_modules/zod/v4/classic/external.d.ts +1 -1
- package/node_modules/zod/v4/classic/external.js +1 -1
- package/node_modules/zod/v4/classic/from-json-schema.cjs +264 -24
- package/node_modules/zod/v4/classic/from-json-schema.js +245 -24
- package/node_modules/zod/v4/classic/in-out.cjs +19 -0
- package/node_modules/zod/v4/classic/index.cjs +19 -0
- package/node_modules/zod/v4/classic/iso.cjs +19 -0
- package/node_modules/zod/v4/classic/parse.cjs +19 -0
- package/node_modules/zod/v4/classic/schemas.cjs +100 -35
- package/node_modules/zod/v4/classic/schemas.d.cts +15 -1
- package/node_modules/zod/v4/classic/schemas.d.ts +15 -1
- package/node_modules/zod/v4/classic/schemas.js +77 -33
- package/node_modules/zod/v4/core/api.cjs +45 -22
- package/node_modules/zod/v4/core/api.d.cts +12 -6
- package/node_modules/zod/v4/core/api.d.ts +12 -6
- package/node_modules/zod/v4/core/api.js +25 -22
- package/node_modules/zod/v4/core/checks.cjs +51 -97
- package/node_modules/zod/v4/core/checks.d.cts +17 -1
- package/node_modules/zod/v4/core/checks.d.ts +17 -1
- package/node_modules/zod/v4/core/checks.js +31 -96
- package/node_modules/zod/v4/core/compile.cjs +173 -78
- package/node_modules/zod/v4/core/compile.d.cts +18 -4
- package/node_modules/zod/v4/core/compile.d.ts +18 -4
- package/node_modules/zod/v4/core/compile.js +154 -79
- package/node_modules/zod/v4/core/core.cjs +20 -1
- package/node_modules/zod/v4/core/core.js +1 -1
- package/node_modules/zod/v4/core/doc.cjs +26 -2
- package/node_modules/zod/v4/core/doc.js +7 -2
- package/node_modules/zod/v4/core/errors.cjs +21 -5
- package/node_modules/zod/v4/core/errors.js +2 -5
- package/node_modules/zod/v4/core/index.cjs +19 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +20 -1
- package/node_modules/zod/v4/core/json-schema-generator.js +2 -2
- package/node_modules/zod/v4/core/json-schema-processors.cjs +188 -72
- package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.js +170 -74
- package/node_modules/zod/v4/core/json-schema.cjs +19 -0
- package/node_modules/zod/v4/core/memoizer.cjs +111 -23
- package/node_modules/zod/v4/core/memoizer.js +69 -23
- package/node_modules/zod/v4/core/parse.cjs +56 -16
- package/node_modules/zod/v4/core/parse.js +37 -16
- package/node_modules/zod/v4/core/regexes.cjs +31 -6
- package/node_modules/zod/v4/core/regexes.d.cts +3 -0
- package/node_modules/zod/v4/core/regexes.d.ts +3 -0
- package/node_modules/zod/v4/core/regexes.js +10 -4
- package/node_modules/zod/v4/core/registries.cjs +19 -0
- package/node_modules/zod/v4/core/schemas.cjs +302 -114
- package/node_modules/zod/v4/core/schemas.d.cts +28 -8
- package/node_modules/zod/v4/core/schemas.d.ts +28 -8
- package/node_modules/zod/v4/core/schemas.js +279 -113
- package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +28 -7
- package/node_modules/zod/v4/core/to-json-schema.d.cts +4 -3
- package/node_modules/zod/v4/core/to-json-schema.d.ts +4 -3
- package/node_modules/zod/v4/core/to-json-schema.js +7 -6
- package/node_modules/zod/v4/core/util.cjs +177 -143
- package/node_modules/zod/v4/core/util.d.cts +25 -4
- package/node_modules/zod/v4/core/util.d.ts +25 -4
- package/node_modules/zod/v4/core/util.js +156 -143
- package/node_modules/zod/v4/core/versions.cjs +21 -2
- package/node_modules/zod/v4/core/versions.d.cts +1 -1
- package/node_modules/zod/v4/core/versions.d.ts +1 -1
- package/node_modules/zod/v4/core/versions.js +2 -2
- package/node_modules/zod/v4/core/visit.cjs +19 -0
- package/node_modules/zod/v4/index.cjs +19 -0
- package/node_modules/zod/v4/locales/ar.cjs +2 -0
- package/node_modules/zod/v4/locales/ar.js +2 -0
- package/node_modules/zod/v4/locales/az.cjs +2 -0
- package/node_modules/zod/v4/locales/az.js +2 -0
- package/node_modules/zod/v4/locales/be.cjs +2 -0
- package/node_modules/zod/v4/locales/be.js +2 -0
- package/node_modules/zod/v4/locales/bg.cjs +2 -0
- package/node_modules/zod/v4/locales/bg.js +2 -0
- package/node_modules/zod/v4/locales/bn.cjs +2 -0
- package/node_modules/zod/v4/locales/bn.js +2 -0
- package/node_modules/zod/v4/locales/ca.cjs +2 -0
- package/node_modules/zod/v4/locales/ca.js +2 -0
- package/node_modules/zod/v4/locales/ckb.cjs +2 -0
- package/node_modules/zod/v4/locales/ckb.js +2 -0
- package/node_modules/zod/v4/locales/cs.cjs +2 -0
- package/node_modules/zod/v4/locales/cs.js +2 -0
- package/node_modules/zod/v4/locales/da.cjs +2 -0
- package/node_modules/zod/v4/locales/da.js +2 -0
- package/node_modules/zod/v4/locales/de.cjs +2 -0
- package/node_modules/zod/v4/locales/de.js +2 -0
- package/node_modules/zod/v4/locales/el.cjs +2 -0
- package/node_modules/zod/v4/locales/el.js +2 -0
- package/node_modules/zod/v4/locales/en.cjs +2 -0
- package/node_modules/zod/v4/locales/en.js +2 -0
- package/node_modules/zod/v4/locales/eo.cjs +2 -0
- package/node_modules/zod/v4/locales/eo.js +2 -0
- package/node_modules/zod/v4/locales/es.cjs +2 -0
- package/node_modules/zod/v4/locales/es.js +2 -0
- package/node_modules/zod/v4/locales/fa.cjs +2 -0
- package/node_modules/zod/v4/locales/fa.js +2 -0
- package/node_modules/zod/v4/locales/fi.cjs +2 -0
- package/node_modules/zod/v4/locales/fi.js +2 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +2 -0
- package/node_modules/zod/v4/locales/fr-CA.js +2 -0
- package/node_modules/zod/v4/locales/fr.cjs +2 -0
- package/node_modules/zod/v4/locales/fr.js +2 -0
- package/node_modules/zod/v4/locales/gu.cjs +2 -0
- package/node_modules/zod/v4/locales/gu.js +2 -0
- package/node_modules/zod/v4/locales/he.cjs +2 -0
- package/node_modules/zod/v4/locales/he.js +2 -0
- package/node_modules/zod/v4/locales/hi.cjs +2 -0
- package/node_modules/zod/v4/locales/hi.js +2 -0
- package/node_modules/zod/v4/locales/hr.cjs +2 -0
- package/node_modules/zod/v4/locales/hr.js +2 -0
- package/node_modules/zod/v4/locales/hu.cjs +2 -0
- package/node_modules/zod/v4/locales/hu.js +2 -0
- package/node_modules/zod/v4/locales/hy.cjs +2 -0
- package/node_modules/zod/v4/locales/hy.js +2 -0
- package/node_modules/zod/v4/locales/id.cjs +2 -0
- package/node_modules/zod/v4/locales/id.js +2 -0
- package/node_modules/zod/v4/locales/index.cjs +22 -1
- package/node_modules/zod/v4/locales/index.d.cts +1 -0
- package/node_modules/zod/v4/locales/index.d.ts +1 -0
- package/node_modules/zod/v4/locales/index.js +1 -0
- package/node_modules/zod/v4/locales/is.cjs +2 -0
- package/node_modules/zod/v4/locales/is.js +2 -0
- package/node_modules/zod/v4/locales/it.cjs +2 -0
- package/node_modules/zod/v4/locales/it.js +2 -0
- package/node_modules/zod/v4/locales/ja.cjs +2 -0
- package/node_modules/zod/v4/locales/ja.js +2 -0
- package/node_modules/zod/v4/locales/ka.cjs +2 -0
- package/node_modules/zod/v4/locales/ka.js +2 -0
- package/node_modules/zod/v4/locales/km.cjs +2 -0
- package/node_modules/zod/v4/locales/km.js +2 -0
- package/node_modules/zod/v4/locales/kn.cjs +2 -0
- package/node_modules/zod/v4/locales/kn.js +2 -0
- package/node_modules/zod/v4/locales/ko.cjs +2 -0
- package/node_modules/zod/v4/locales/ko.js +2 -0
- package/node_modules/zod/v4/locales/lt.cjs +2 -0
- package/node_modules/zod/v4/locales/lt.js +2 -0
- package/node_modules/zod/v4/locales/mk.cjs +2 -0
- package/node_modules/zod/v4/locales/mk.js +2 -0
- package/node_modules/zod/v4/locales/ms.cjs +2 -0
- package/node_modules/zod/v4/locales/ms.js +2 -0
- package/node_modules/zod/v4/locales/ne.cjs +2 -0
- package/node_modules/zod/v4/locales/ne.js +2 -0
- package/node_modules/zod/v4/locales/nl.cjs +2 -0
- package/node_modules/zod/v4/locales/nl.js +2 -0
- package/node_modules/zod/v4/locales/nn.cjs +2 -0
- package/node_modules/zod/v4/locales/nn.js +2 -0
- package/node_modules/zod/v4/locales/no.cjs +2 -0
- package/node_modules/zod/v4/locales/no.js +2 -0
- package/node_modules/zod/v4/locales/ota.cjs +2 -0
- package/node_modules/zod/v4/locales/ota.js +2 -0
- package/node_modules/zod/v4/locales/pl.cjs +2 -0
- package/node_modules/zod/v4/locales/pl.js +2 -0
- package/node_modules/zod/v4/locales/ps.cjs +2 -0
- package/node_modules/zod/v4/locales/ps.js +2 -0
- package/node_modules/zod/v4/locales/pt-BR.cjs +2 -0
- package/node_modules/zod/v4/locales/pt-BR.js +2 -0
- package/node_modules/zod/v4/locales/pt.cjs +2 -0
- package/node_modules/zod/v4/locales/pt.js +2 -0
- package/node_modules/zod/v4/locales/ro.cjs +2 -0
- package/node_modules/zod/v4/locales/ro.js +2 -0
- package/node_modules/zod/v4/locales/ru.cjs +2 -0
- package/node_modules/zod/v4/locales/ru.js +2 -0
- package/node_modules/zod/v4/locales/sk.cjs +2 -0
- package/node_modules/zod/v4/locales/sk.js +2 -0
- package/node_modules/zod/v4/locales/sl.cjs +2 -0
- package/node_modules/zod/v4/locales/sl.js +2 -0
- package/node_modules/zod/v4/locales/sv.cjs +2 -0
- package/node_modules/zod/v4/locales/sv.js +2 -0
- package/node_modules/zod/v4/locales/ta.cjs +2 -0
- package/node_modules/zod/v4/locales/ta.js +2 -0
- package/node_modules/zod/v4/locales/tg.cjs +144 -0
- package/node_modules/zod/v4/locales/tg.d.cts +5 -0
- package/node_modules/zod/v4/locales/tg.d.ts +4 -0
- package/node_modules/zod/v4/locales/tg.js +117 -0
- package/node_modules/zod/v4/locales/th.cjs +2 -0
- package/node_modules/zod/v4/locales/th.js +2 -0
- package/node_modules/zod/v4/locales/tk.cjs +2 -0
- package/node_modules/zod/v4/locales/tk.js +2 -0
- package/node_modules/zod/v4/locales/tr.cjs +2 -0
- package/node_modules/zod/v4/locales/tr.js +2 -0
- package/node_modules/zod/v4/locales/uk.cjs +2 -0
- package/node_modules/zod/v4/locales/uk.js +2 -0
- package/node_modules/zod/v4/locales/ur.cjs +2 -0
- package/node_modules/zod/v4/locales/ur.js +2 -0
- package/node_modules/zod/v4/locales/uz.cjs +2 -0
- package/node_modules/zod/v4/locales/uz.js +2 -0
- package/node_modules/zod/v4/locales/vi.cjs +2 -0
- package/node_modules/zod/v4/locales/vi.js +2 -0
- package/node_modules/zod/v4/locales/yo.cjs +2 -0
- package/node_modules/zod/v4/locales/yo.js +2 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +2 -0
- package/node_modules/zod/v4/locales/zh-CN.js +2 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +2 -0
- package/node_modules/zod/v4/locales/zh-TW.js +2 -0
- package/node_modules/zod/v4/mini/checks.cjs +19 -0
- package/node_modules/zod/v4/mini/coerce.cjs +19 -0
- package/node_modules/zod/v4/mini/deep-partial.cjs +19 -0
- package/node_modules/zod/v4/mini/external.cjs +22 -1
- package/node_modules/zod/v4/mini/external.d.cts +1 -1
- package/node_modules/zod/v4/mini/external.d.ts +1 -1
- package/node_modules/zod/v4/mini/external.js +1 -1
- package/node_modules/zod/v4/mini/in-out.cjs +19 -0
- package/node_modules/zod/v4/mini/index.cjs +19 -0
- package/node_modules/zod/v4/mini/iso.cjs +19 -0
- package/node_modules/zod/v4/mini/parse.cjs +19 -0
- package/node_modules/zod/v4/mini/schemas.cjs +44 -8
- package/node_modules/zod/v4/mini/schemas.d.cts +6 -1
- package/node_modules/zod/v4/mini/schemas.d.ts +6 -1
- package/node_modules/zod/v4/mini/schemas.js +21 -6
- package/node_modules/zod/v4-mini/index.cjs +19 -0
- package/package.json +7 -7
- package/node_modules/@openclaw/fs-safe/dist/absolute-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-crc32.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-deadline.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-durability.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-entry.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-errors.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-input.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-kind.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-limits.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-merge.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-native.d.ts +0 -21
- package/node_modules/@openclaw/fs-safe/dist/archive-native.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-native.js +0 -97
- package/node_modules/@openclaw/fs-safe/dist/archive-options.d.ts +0 -23
- package/node_modules/@openclaw/fs-safe/dist/archive-options.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-parser-errors.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-plan.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-policy.d.ts +0 -22
- package/node_modules/@openclaw/fs-safe/dist/archive-policy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-policy.js +0 -38
- package/node_modules/@openclaw/fs-safe/dist/archive-read.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.d.ts +0 -7
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.js +0 -62
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar.d.ts +0 -19
- package/node_modules/@openclaw/fs-safe/dist/archive-tar.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar.js +0 -21
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/archive.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/async-lock.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/atomic.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/bounded-read.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/byte-budget.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/clone-metadata.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/config.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/containment.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-file-input.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-policy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-publication.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/copy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/darwin-acl.d.ts +0 -4
- package/node_modules/@openclaw/fs-safe/dist/darwin-acl.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/darwin-acl.js +0 -24
- package/node_modules/@openclaw/fs-safe/dist/deny-mutations.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/device-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-durability.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-entry-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.d.ts +0 -21
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.js +0 -78
- package/node_modules/@openclaw/fs-safe/dist/durability.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/effective-uid.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/error-detail.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/errors.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-hash.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-identity.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-lock.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-observation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-copy-source.d.ts +0 -5
- package/node_modules/@openclaw/fs-safe/dist/file-store-copy-source.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-copy-source.js +0 -31
- package/node_modules/@openclaw/fs-safe/dist/file-store-limit.d.ts +0 -2
- package/node_modules/@openclaw/fs-safe/dist/file-store-limit.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-limit.js +0 -8
- package/node_modules/@openclaw/fs-safe/dist/file-store-path.d.ts +0 -3
- package/node_modules/@openclaw/fs-safe/dist/file-store-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-path.js +0 -30
- package/node_modules/@openclaw/fs-safe/dist/file-store-prune.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/file-sync.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/filename.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/fs.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guest-native-python.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/guest.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/home-dir.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/index.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/install-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-paths.d.ts +0 -11
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-paths.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-paths.js +0 -42
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-store.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json-stringify.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/json.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/local-file-access.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/local-roots.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/lock-config.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path-stage.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/mutation-authority.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-config.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-directory-observation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-operations.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-staged-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/opened-realpath.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/output.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/overwrite-file-handle.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-case.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-policy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-prefix.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-scope-lexical.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-segment-route.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/permission-exec.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/permissions-public.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/permissions.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-operation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-types.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-write.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/positional-read.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/private-directory.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/publish-file-failure.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/publish-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/read-open-flags.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/read-opened-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/realpath.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/recursive-mkdir-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/regular-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-directory.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-mode.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-rename-policy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-boundary.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-context.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-create-input.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-directory.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-entries.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-errors.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-move-preflight.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-observed-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-options.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-errors.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-observation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-stat.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.d.ts +0 -7
- package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.js +0 -55
- package/node_modules/@openclaw/fs-safe/dist/root-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-paths-lexical.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-read-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-remove-receipt.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-remove.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-symlink-policy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-mode.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-publication.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-verification.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/root.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-read-async.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secret.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-temp.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-types.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/staged-directory.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/staged-file-types.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/standalone-publication-path.d.ts +0 -2
- package/node_modules/@openclaw/fs-safe/dist/standalone-publication-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/standalone-publication-path.js +0 -6
- package/node_modules/@openclaw/fs-safe/dist/stat-observation.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/store.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/string-coerce.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/suppressed-error.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/symlink-parents.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-target.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-identity.d.ts +0 -15
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-identity.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-identity.js +0 -41
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-permissions.d.ts +0 -4
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-permissions.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-permissions.js +0 -32
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-types.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/temp.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/text-atomic.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/timing.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/trash.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/types.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/unicode-path.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/walk.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/windows-command.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/write-file-handle.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/write-open-flags.d.ts.map +0 -1
- package/node_modules/@openclaw/fs-safe/dist/write-queue.d.ts.map +0 -1
- /package/node_modules/@openclaw/fs-safe/dist/{archive-options.js → owner-dacl-batch-worker.d.ts} +0 -0
|
@@ -47,6 +47,10 @@ type WalkDirectoryFailure = {
|
|
|
47
47
|
|
|
48
48
|
`depth` starts at `1` for direct children of `rootDir`. `relativePath` is always relative to the supplied root. `scannedEntryCount` counts directory entries examined, including entries filtered out by `include`.
|
|
49
49
|
|
|
50
|
+
Each entry's `path` is absolute and retains the normalized spelling of the
|
|
51
|
+
supplied root, including followed directory aliases. Paths do not switch to
|
|
52
|
+
the canonical symlink target during descent.
|
|
53
|
+
|
|
50
54
|
`walkDirectory()` and `walkDirectorySync()` always return `failedDirs`; the property remains optional on the exported `WalkDirectoryResult` type so existing callers that manually construct the legacy result shape remain source-compatible. It lists every directory whose `realpath`/`readdir` threw, so its contents are absent from `entries`. `error` is the thrown value (a `NodeJS.ErrnoException` at runtime), so callers can distinguish a benign missing-directory race (`ENOENT`) from a real read failure (`EACCES`, `EIO`, `ESTALE`, …). The walk-root failure has an empty `relativePath` and `depth: 0`. Failures resolving a symlink's target kind are not reported here.
|
|
51
55
|
|
|
52
56
|
## Options
|
|
@@ -59,12 +63,43 @@ type WalkDirectoryOptions = {
|
|
|
59
63
|
include?: (entry: WalkDirectoryEntry) => boolean;
|
|
60
64
|
descend?: (entry: WalkDirectoryEntry) => boolean;
|
|
61
65
|
};
|
|
66
|
+
|
|
67
|
+
type AsyncWalkDirectoryOptions = Omit<WalkDirectoryOptions, "include" | "descend"> & {
|
|
68
|
+
include?: (entry: WalkDirectoryEntry) => boolean | Promise<boolean>;
|
|
69
|
+
descend?: (entry: WalkDirectoryEntry) => boolean | Promise<boolean>;
|
|
70
|
+
};
|
|
62
71
|
```
|
|
63
72
|
|
|
64
73
|
`symlinks` defaults to `"skip"`. `"include"` returns symlink entries without following them. `"follow"` resolves symlinks with `stat()` and may descend into linked directories, so use it only when that is intentional. Already-visited real directories are skipped so symlink cycles do not recurse forever.
|
|
65
74
|
|
|
75
|
+
Before descending into a child directory, `skip` and `include` recheck whether
|
|
76
|
+
that entry has become a symlink, including changes made while a filter waits.
|
|
77
|
+
The explicitly supplied walk root may still be a symlink. This best-effort
|
|
78
|
+
child check does not turn the standalone walker into a confinement boundary;
|
|
79
|
+
use `Root.walk()` when root confinement is required.
|
|
80
|
+
|
|
66
81
|
`include` controls which entries are returned. `descend` controls which directory entries are traversed. A skipped directory can still be returned if `include` accepts it.
|
|
67
82
|
|
|
83
|
+
The asynchronous `walkDirectory()` accepts `AsyncWalkDirectoryOptions`. It resolves each `include` decision before calling `descend`, and resolves descent before reading the directory's children. Decisions run serially in the existing filesystem-order depth-first traversal. Both callbacks retain the supplied options object as their `this` receiver.
|
|
84
|
+
|
|
85
|
+
Absent callbacks and primitive results keep the synchronous selection path. Object and function results are awaited directly, including promises and thenables. For JavaScript callers, nullish results retain the default `true`; other resolved values use their existing truthiness. Return booleans or promises of booleans for the typed API.
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import fs from "node:fs/promises";
|
|
89
|
+
import path from "node:path";
|
|
90
|
+
|
|
91
|
+
const scan = await walkDirectory("/safe/workspace", {
|
|
92
|
+
include: (entry) => entry.kind === "file",
|
|
93
|
+
descend: async (entry) => {
|
|
94
|
+
const marked = await fs.access(path.join(entry.path, "SKILL.md"))
|
|
95
|
+
.then(() => true, () => false);
|
|
96
|
+
return !marked;
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
This prunes a directory after finding its marker without listing that directory's children. Callback throws and promise rejections reject the walk; they are not directory failures in `failedDirs`. Filtering still consumes the examined-entry budget. `WalkDirectoryOptions` and `walkDirectorySync()` remain synchronous; the async options do not add confinement or cancellation to the standalone walker.
|
|
102
|
+
|
|
68
103
|
Unreadable directories are skipped rather than throwing, but every skipped directory is recorded in `failedDirs`. This keeps the helper suitable for best-effort inventories while letting pruning jobs tell an incomplete scan from an empty one: a destructive reconcile that deletes state for paths missing from `entries` must first confirm `failedDirs` holds no real read failures, or a transient `EIO`/`EACCES` blip would be mistaken for mass deletion. Use a stricter root-bounded operation when every entry must be accounted for.
|
|
69
104
|
|
|
70
105
|
## Root-bounded async iteration
|
|
@@ -72,11 +107,44 @@ Unreadable directories are skipped rather than throwing, but every skipped direc
|
|
|
72
107
|
`Root.walk(rel, options)` is the root-bounded counterpart to these standalone
|
|
73
108
|
inventory helpers. It yields `{ relativePath, kind, size }` incrementally and
|
|
74
109
|
accepts `maxDepth`, `maxEntries`, `symlinkPolicy: "skip" |
|
|
75
|
-
"follow-within-root"`, `order: "sorted" | "filesystem"`, and an `AbortSignal`. The default budget behavior yields
|
|
110
|
+
"follow-within-root" | "include"`, `order: "sorted" | "filesystem"`, and an `AbortSignal`. The default budget behavior yields
|
|
76
111
|
one `kind: "truncated"` marker and ends; pass `limitBehavior: "throw"` for a
|
|
77
112
|
typed `FsSafeError("too-large")` instead.
|
|
78
113
|
|
|
79
114
|
For followed symlinks, both `kind` and `size` describe the resolved target.
|
|
115
|
+
With `symlinkPolicy: "include"`, links retain `kind: "symlink"` and their own
|
|
116
|
+
size. Targets are neither resolved nor visited; dangling and outside-root links
|
|
117
|
+
are included. Filters receive these entries, and links consume the same entry
|
|
118
|
+
budget as other names. A directory replaced by a symlink after observation
|
|
119
|
+
fails with `path-mismatch` before descent, or produces a `directory-error`
|
|
120
|
+
entry when `onDirectoryError` is `"skip-and-report"`.
|
|
121
|
+
The starting directory retains existing Root path resolution; include mode
|
|
122
|
+
controls the entries beneath that directory.
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
for await (const entry of capability.walk("", { symlinkPolicy: "include" })) {
|
|
126
|
+
if (entry.kind === "symlink") reportLink(entry.relativePath);
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Existing skip/follow calls keep their result types without a symlink variant.
|
|
131
|
+
For explicitly annotated include-mode values, use `RootWalkOptions<"include">`
|
|
132
|
+
and `RootWalkEntry<"include">`. `RootWalkSymlinkPolicy` describes all
|
|
133
|
+
three policies when the policy is selected dynamically; the unparameterized
|
|
134
|
+
entry and options types retain their previous shapes. Use
|
|
135
|
+
`RootWalkOptions<RootWalkSymlinkPolicy>` for a dynamically selected policy.
|
|
136
|
+
|
|
137
|
+
The caller's starting path retains Root home shorthand: `~` and `~/dir` expand
|
|
138
|
+
the home directory when iteration starts and must resolve inside the Root.
|
|
139
|
+
Home-started walks report actual Root-relative paths, such as `home/dir/file`,
|
|
140
|
+
rather than `~/dir/file`. Use `./~/dir` to start at a literal `~` directory.
|
|
141
|
+
An alias within a home-started path is reported under its admitted canonical
|
|
142
|
+
target; ordinary non-home starting aliases retain their caller-supplied spelling.
|
|
143
|
+
|
|
144
|
+
Entry names remain literal filesystem data, including a directory named `~`
|
|
145
|
+
and its descendants. To reuse an entry path in another Root method without
|
|
146
|
+
home-directory expansion, prefix it with `./`, as in
|
|
147
|
+
`capability.open("./" + entry.relativePath)`.
|
|
80
148
|
|
|
81
149
|
The default `order: "sorted"` visits each directory's names in lexicographic
|
|
82
150
|
order before descending depth first. It reads and sorts all names in each
|
|
@@ -123,7 +191,9 @@ If a thrown walk failure and directory close both fail, disposal throws a
|
|
|
123
191
|
`SuppressedError` with the close failure in `error` and the original failure in
|
|
124
192
|
`suppressed`, preserving both causes.
|
|
125
193
|
|
|
126
|
-
`entryFilter` is evaluated for each resolved file, directory, or other entry
|
|
194
|
+
`entryFilter` is evaluated for each resolved file, directory, or other entry.
|
|
195
|
+
The `RootWalkEntryFilter` callback returns a `RootWalkEntryFilterResult`
|
|
196
|
+
or a `Promise<RootWalkEntryFilterResult>`:
|
|
127
197
|
|
|
128
198
|
```ts
|
|
129
199
|
for await (const entry of capability.walk("", {
|
|
@@ -147,10 +217,43 @@ The result values are `"include"`, `"skip"`, and `"skip-subtree"`. Plain
|
|
|
147
217
|
`"skip-subtree"` omits that directory and prunes its descendants. Returning
|
|
148
218
|
`"skip-subtree"` for a non-directory is equivalent to `"skip"`.
|
|
149
219
|
|
|
220
|
+
An asynchronous filter can inspect a marker before deciding whether to prune:
|
|
221
|
+
|
|
222
|
+
```ts
|
|
223
|
+
for await (const entry of capability.walk("", {
|
|
224
|
+
symlinkPolicy: "skip",
|
|
225
|
+
entryFilter: async (entry) => {
|
|
226
|
+
if (
|
|
227
|
+
entry.kind === "directory" &&
|
|
228
|
+
await capability.exists(`${entry.relativePath}/SKILL.md`)
|
|
229
|
+
) {
|
|
230
|
+
return "skip-subtree";
|
|
231
|
+
}
|
|
232
|
+
return "include";
|
|
233
|
+
},
|
|
234
|
+
})) {
|
|
235
|
+
consume(entry);
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Filters run serially outside metadata batches and retain the supplied options
|
|
240
|
+
object as their `this` receiver. When an awaited filter resolves, the walk
|
|
241
|
+
checks cancellation and revalidates the current listing directory and Root
|
|
242
|
+
identities before using the decision. These checks do not refresh the entry's
|
|
243
|
+
captured metadata or pin a later operation.
|
|
244
|
+
|
|
245
|
+
Cancellation and iterator disposal wait for a pending filter to settle. The
|
|
246
|
+
walk does not race the callback against the abort signal or close its directory
|
|
247
|
+
while the callback is running; callbacks must settle their own work for
|
|
248
|
+
cancellation to finish. Callback throws and promise rejections reject the walk
|
|
249
|
+
through its normal cleanup path, even with `onDirectoryError: "skip-and-report"`.
|
|
250
|
+
|
|
150
251
|
`onDirectoryError` defaults to `"throw"`, preserving the original fail-fast
|
|
151
252
|
contract. `"skip-and-report"` yields a discriminated
|
|
152
253
|
`{ kind: "directory-error", relativePath, size: 0, error }` marker for a
|
|
153
254
|
directory that cannot be resolved or listed, then continues with its siblings.
|
|
255
|
+
This policy also applies when the directory or Root identity recheck after an
|
|
256
|
+
awaited filter fails; callback failures themselves are not directory errors.
|
|
154
257
|
Every examined directory entry consumes `maxEntries` before filtering, so
|
|
155
258
|
`"skip"` cannot turn the iterator into an unbounded traversal. Reporting and
|
|
156
259
|
`"truncated"` markers describe already-reached state and do not authorize
|
|
@@ -161,6 +264,9 @@ its exact identity, and rechecks it and the Root identity around each metadata
|
|
|
161
264
|
batch or individual filesystem-order observation. Sorted batches contain no
|
|
162
265
|
await or caller code between their before/after checks. It tracks canonical
|
|
163
266
|
directories to stop symlink cycles.
|
|
267
|
+
Directory rechecks retain exact identities while using ordinary numeric metadata
|
|
268
|
+
when it represents those identities without rounding. Large identities and
|
|
269
|
+
Windows unknown-identity retries keep the bigint inspection path.
|
|
164
270
|
Neither mode holds a descriptor for every path component, so it is not a process sandbox against a hostile peer that
|
|
165
271
|
can continuously swap and restore directories. Each individual lookup retains
|
|
166
272
|
the documented Node `Root` boundary checks.
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Guarded filesystem observation
|
|
2
|
+
|
|
3
|
+
`@openclaw/fs-safe/watch` observes literal paths under an admitted `Root`.
|
|
4
|
+
Notifications are advisory invalidations, not a transaction log, stable content,
|
|
5
|
+
or authority to read a reported pathname. Guarded metadata scans through the
|
|
6
|
+
original Root determine what may be published. Use the Root again to read data.
|
|
7
|
+
|
|
8
|
+
```ts
|
|
9
|
+
import { root } from "@openclaw/fs-safe/root";
|
|
10
|
+
import { watch } from "@openclaw/fs-safe/watch";
|
|
11
|
+
|
|
12
|
+
const workspace = await root("/trusted/workspace");
|
|
13
|
+
const subscription = watch(workspace, {
|
|
14
|
+
mode: "auto",
|
|
15
|
+
scopes: [
|
|
16
|
+
{ path: "config.json", kind: "entry" },
|
|
17
|
+
{ path: "skills", kind: "tree", depth: 8 },
|
|
18
|
+
],
|
|
19
|
+
exclude: entry => entry.kind === "directory" && entry.path.endsWith("node_modules"),
|
|
20
|
+
onInvalidate(invalidation) {
|
|
21
|
+
// Schedule application-owned settling/reload work; this callback is synchronous.
|
|
22
|
+
console.log(invalidation.reason, invalidation.changes);
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
await subscription.ready;
|
|
26
|
+
await subscription.setScopes([{ path: "skills", kind: "tree" }]);
|
|
27
|
+
await subscription.reconcile();
|
|
28
|
+
await subscription.close();
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Contract
|
|
32
|
+
|
|
33
|
+
The subpath exports `watch` and the types `WatchScope`, `WatchEntry`,
|
|
34
|
+
`WatchChange`, `WatchInvalidation`, `WatchFailure`, `WatchHealth`, `WatchOptions`,
|
|
35
|
+
and `WatchSubscription`.
|
|
36
|
+
|
|
37
|
+
An `entry` scope observes only that entry, including its identity and metadata.
|
|
38
|
+
A `tree` also observes descendants to its depth (default 32, maximum 128).
|
|
39
|
+
Depth zero observes only the entry. The empty string and `.` select the Root;
|
|
40
|
+
trailing separators are accepted and normalized after validation. Scopes are
|
|
41
|
+
literal names, never globs or home expansion. Absolute paths, traversal, NULs,
|
|
42
|
+
and platform namespace aliases reject. Windows scopes also reject reserved
|
|
43
|
+
device components and trailing dots/spaces that Win32 would silently alias. Filesystem identity determines ordinary
|
|
44
|
+
case/Unicode aliases; names are not compared by lowercasing.
|
|
45
|
+
|
|
46
|
+
Symlinks are observed as entries and never followed. A symbolic parent fails
|
|
47
|
+
admission: separately admit a caller-trusted link target if needed. Missing
|
|
48
|
+
entries and ordinary blocking files can become directories in later scans.
|
|
49
|
+
Replacing, renaming, or losing the admitted Root fails observation; it never
|
|
50
|
+
silently adopts a new Root. Directory entry scopes ignore child-only mtime/size
|
|
51
|
+
changes, but include permission-mode changes to the directory itself.
|
|
52
|
+
|
|
53
|
+
Each invalidation has `reason: "event" | "reconcile" | "overflow"` and optional
|
|
54
|
+
bounded `changes: { path, type: "content" | "structural" }[]`. Missing detail
|
|
55
|
+
means invalidate **every configured scope**. Initial admission and every
|
|
56
|
+
successful `setScopes` publish one undetailed `reconcile` invalidation. A rename
|
|
57
|
+
or identity replacement is structural; metadata changes to the same ordinary
|
|
58
|
+
file may be content changes. Neither means the file is settled or readable.
|
|
59
|
+
An admitted native hint can invalidate an entry even when its before/after scan
|
|
60
|
+
metadata is identical: the path may have changed and been restored between scans
|
|
61
|
+
(ABA), or content may have changed without a distinguishable metadata change.
|
|
62
|
+
Structural hints remain conservative in that case.
|
|
63
|
+
This does not promise delivery for a differently spelled alias that appears and
|
|
64
|
+
disappears entirely between scans: without an observed identity, it cannot be
|
|
65
|
+
admitted as the selected path. Observation is not a complete transient history.
|
|
66
|
+
Raw event names remain private: detail comes from guarded scans, prior guarded
|
|
67
|
+
snapshots, or explicitly configured targets. Unclassifiable hints inside selected,
|
|
68
|
+
non-excluded territory lose detail. Hints for excluded or unselected paths are
|
|
69
|
+
ignored. Exclusion callbacks are synchronous; excluded directories are recorded
|
|
70
|
+
without descent. Bounded exclusion records recognize late deletion hints.
|
|
71
|
+
Genuine backend event loss and detail-budget exhaustion still invalidate every
|
|
72
|
+
scope, including when an excluded subtree caused the underlying event pressure.
|
|
73
|
+
|
|
74
|
+
## Transport and mode
|
|
75
|
+
|
|
76
|
+
| Platform/runtime | `auto` | Event transport / limitation |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| Node.js on Linux with addon | `events` | One shared Rust thread and inotify instance; a nonrecursive watch per distinct directory inode. |
|
|
79
|
+
| Node.js on macOS with addon | `events` | One FSEvents stream per subscription on a shared serial dispatch queue. Pathname activity after a swap remains advisory. |
|
|
80
|
+
| Node.js on Windows with addon | `events` | One recursive ReadDirectoryChangesW Root handle per subscription on the shared IOCP hub; the open handle prevents ordinary renames of the Root's ancestors. |
|
|
81
|
+
| Bun / other unsupported runtimes | `poll` | TSFN lifetime and shutdown have not been qualified; `events` rejects. |
|
|
82
|
+
| Missing/disabled addon | `poll` | `events` rejects with `FsSafeError("helper-unavailable")`. |
|
|
83
|
+
|
|
84
|
+
The shared hub sleeps until a filesystem event, command, or callback acknowledgement:
|
|
85
|
+
Linux blocks on inotify plus eventfd, Windows on IOCP, and macOS on its command
|
|
86
|
+
channel (FSEvents wakes it from the serial dispatch queue). There is no native
|
|
87
|
+
polling timer; the independent JS reconciliation interval remains authoritative.
|
|
88
|
+
|
|
89
|
+
`mode` is required. `poll` never starts or loads the watch hub; guarded scans
|
|
90
|
+
may still use the existing addon. Existing `FS_SAFE_NATIVE_MODE=off` and
|
|
91
|
+
`require` policies apply: `require` plus an unavailable event backend rejects
|
|
92
|
+
`auto` too. Health reports the selected `events` or `poll` mode and failures
|
|
93
|
+
from selection have `operation: "watch"`.
|
|
94
|
+
|
|
95
|
+
Linux installs each watch **before** enumerating children. It opens directories
|
|
96
|
+
beneath the Root using the shared guarded native open (openat2, or its checked
|
|
97
|
+
openat fallback), checks exact identities, verifies the procfs namespace, and
|
|
98
|
+
registers through `/proc/self/fd/N/.`. The final `/.` makes `IN_DONT_FOLLOW` apply
|
|
99
|
+
to the directory instead of rejecting the procfs magic symlink. The descriptor
|
|
100
|
+
closes immediately: inotify retains the inode reference. Reconciliation replaces
|
|
101
|
+
registrations when the directory inventory changes. Queue overflow invalidates
|
|
102
|
+
all owners; exhausted watch capacity reports `failure.code: "watch-limit"`.
|
|
103
|
+
Nonblocking TSFN batches cannot block the hub on JavaScript, and per-owner
|
|
104
|
+
pending detail and queued batches are bounded. The last removal stops and joins
|
|
105
|
+
the native thread. No Worker threads, eval programs, or JS `fs.watch` are used.
|
|
106
|
+
|
|
107
|
+
macOS uses FileEvents, NoDefer and WatchRoot with a 30 ms FSEvents latency.
|
|
108
|
+
After guarded admission, streams use selected tree anchors and entry parents,
|
|
109
|
+
falling back to the nearest admitted ancestor for missing paths. Nested anchors
|
|
110
|
+
are deduplicated, with at most 128 paths. The eight shallowest non-overlapping
|
|
111
|
+
excluded directories are also passed to `FSEventStreamSetExclusionPaths`.
|
|
112
|
+
When the stream paths change, the old stream is stopped, invalidated and released
|
|
113
|
+
on its dispatch queue, then its replacement starts before another guarded pass
|
|
114
|
+
covers the handover. Native exclusions reduce traffic but cannot eliminate real
|
|
115
|
+
FSEvents drops, including during recursive deletion.
|
|
116
|
+
Absolute hints are reduced lexically against the admitted canonical Root;
|
|
117
|
+
outside paths never become detail. Dropped/wrapped streams, RootChanged and
|
|
118
|
+
Unmount trigger guarded reconciliation. Pathname hints can reflect activity
|
|
119
|
+
after a swap, but the Root is never replaced and names require guarded admission.
|
|
120
|
+
Removal synchronously stops, invalidates and releases the stream on its queue.
|
|
121
|
+
|
|
122
|
+
Windows opens one identity-checked Root handle per subscription with
|
|
123
|
+
READ/WRITE/DELETE sharing, backup semantics and overlapped I/O. Each handle
|
|
124
|
+
observes the entire subtree; guarded scans filter hints to configured scopes.
|
|
125
|
+
No descendant watch handles are retained, so directories inside the Root can be
|
|
126
|
+
renamed while watching, including directories containing selected scopes.
|
|
127
|
+
Completed buffers are copied and the
|
|
128
|
+
read re-armed before names are examined. Zero-byte / enumeration-loss completions
|
|
129
|
+
invalidate every scope. Buffers are 1 MiB on confirmed local volumes, and 64 KiB
|
|
130
|
+
on network/UNC or unclassified volumes. Cancellation waits for IOCP completion before closing
|
|
131
|
+
the handle or freeing its buffer; there are no detached retirement waits.
|
|
132
|
+
|
|
133
|
+
On Windows, an open file handle—including fs-safe's pinned reads, editors, and
|
|
134
|
+
antivirus—blocks renaming that file's ancestor directories, even with delete
|
|
135
|
+
sharing. The watch backend retains only the Root's `ReadDirectoryChangesW` handle,
|
|
136
|
+
which permits renames beneath the Root. Callers renaming directories concurrently
|
|
137
|
+
with reads should use bounded retries, as Windows tools do.
|
|
138
|
+
|
|
139
|
+
Windows prevents ordinary renames of the Root's own ancestors while its directory
|
|
140
|
+
handle is open, even with DELETE sharing. Use `mode: "poll"` when callers must not
|
|
141
|
+
retain that handle. Renaming or replacing the Root still fails guarded observation;
|
|
142
|
+
the subscription never adopts another location. Subscriptions have independent
|
|
143
|
+
handles and delivery queues, and closing one does not retire another's observation.
|
|
144
|
+
|
|
145
|
+
## Budgets and lifecycle
|
|
146
|
+
|
|
147
|
+
| Option | Default / bound |
|
|
148
|
+
| --- | --- |
|
|
149
|
+
| `scopes` | At most 128 literal scopes |
|
|
150
|
+
| `persistent` | `true`; `false` lets Node exit with the subscription still open |
|
|
151
|
+
| `intervalMs` | 30000 with events; 1000 with poll; minimum 20 ms |
|
|
152
|
+
| `pollIntervalMs` | Optional polling override; minimum 20 ms, maximum 2147483647 ms (same as `intervalMs`) |
|
|
153
|
+
| `maxDirectories` | 4096 observed directories, including scope ancestors |
|
|
154
|
+
| `maxEntries` | 100000 examined entries per pass, including excluded entries |
|
|
155
|
+
| `maxPendingPaths` | 256; maximum 4096 |
|
|
156
|
+
| Reconciliation | One active pass and one coalesced pending pass; no convergence/pass budget |
|
|
157
|
+
|
|
158
|
+
Periodic guarded reconciliation runs without needing an event. It catches
|
|
159
|
+
missed events and works on filesystems where native hints are incomplete.
|
|
160
|
+
When polling is selected, the interval is `pollIntervalMs`, then `intervalMs`,
|
|
161
|
+
then 1000 ms, in that order. This applies to explicit `mode: "poll"`, `auto`
|
|
162
|
+
selecting polling, and `auto` falling back after an unsupported event backend.
|
|
163
|
+
`pollIntervalMs` does not change the events reconciliation interval, which
|
|
164
|
+
remains `intervalMs` or 30000 ms. For example, `mode: "auto", pollIntervalMs: 25`
|
|
165
|
+
uses 25 ms polling when needed and retains the 30-second events reconciliation.
|
|
166
|
+
Scans are metadata comparisons: content changes preserving all compared
|
|
167
|
+
metadata may be missed in polling mode. No mode promises transactional
|
|
168
|
+
snapshots, complete history, or hard real-time delivery.
|
|
169
|
+
|
|
170
|
+
`ready` resolves after the first complete guarded scan establishes the baseline,
|
|
171
|
+
even while writes continue. Events mode installs each directory registration
|
|
172
|
+
before listing it (FSEvents and recursive RDCW anchors cover the crawl). A changed
|
|
173
|
+
registration/listing identity is retried up to three times per directory; further
|
|
174
|
+
churn invalidates that subtree. Poll mode starts with its first scan and detects
|
|
175
|
+
changes during the crawl on the next comparison. Neither mode waits for two
|
|
176
|
+
agreeing scans.
|
|
177
|
+
`ready` and `reconcile()` do not drain the operating system's event queue.
|
|
178
|
+
For example, FSEvents can deliver coalesced setup creation activity after `ready`,
|
|
179
|
+
even with its stream starting at the current event ID. Consumers must tolerate
|
|
180
|
+
these advisory invalidations; tests measuring a quiet interval should first
|
|
181
|
+
observe a selected sentinel edit and drain its trailing events.
|
|
182
|
+
|
|
183
|
+
Each later pass compares with the previous snapshot, publishes bounded differences,
|
|
184
|
+
and adopts its result as the next snapshot. Vanishing entries, kind changes, and
|
|
185
|
+
transient descendant scan errors produce structural invalidations, preserving the
|
|
186
|
+
Root identity checks. Events during a pass coalesce into one pending pass and
|
|
187
|
+
retain bounded detail regardless of how long the scan takes. The 25 ms hint
|
|
188
|
+
coalescing window does not impose a scan deadline. A full native callback queue
|
|
189
|
+
retains its bounded pending batch for retry. Genuine backend loss, exhausted
|
|
190
|
+
detail capacity, or an unclassifiable selected hint emits `overflow` without
|
|
191
|
+
detail. Sustained writes cannot exhaust a pass budget or disable observation.
|
|
192
|
+
|
|
193
|
+
`reconcile()` resolves after a complete pass that **started after the call**. Calls
|
|
194
|
+
waiting for the same future pass coalesce; an earlier in-flight pass cannot satisfy
|
|
195
|
+
a new call. It rejects only when observation becomes unavailable or is closed.
|
|
196
|
+
`setScopes` fences the old generation immediately and resolves after the new
|
|
197
|
+
baseline scan; superseded scope calls reject `AbortError`.
|
|
198
|
+
By default, an open subscription keeps the Node event loop alive, matching
|
|
199
|
+
`fs.watch`. Set `persistent: false` for caches used by one-shot commands:
|
|
200
|
+
the subscription's timers and native delivery handle do not keep Node alive,
|
|
201
|
+
including during startup or reconciliation. Invalidations still arrive while
|
|
202
|
+
other work keeps the process alive. Persistent and non-persistent subscriptions
|
|
203
|
+
have independent lifetimes; closing the last persistent one lets Node exit.
|
|
204
|
+
Native environment cleanup retires any remaining event registrations and joins
|
|
205
|
+
the hub at exit. `signal` triggers close;
|
|
206
|
+
await `close()` or `[Symbol.asyncDispose]()` to join owned work.
|
|
207
|
+
|
|
208
|
+
`health()` returns `starting`, `ready`, `reconciling`, `unavailable`, or `closed`,
|
|
209
|
+
the actual mode, observed `directories`, and optional `{ operation, code, error }`
|
|
210
|
+
failure. A running reconciliation reports `reconciling`, then returns to `ready`.
|
|
211
|
+
Observation becomes `unavailable` on loss of Root authority (removed, replaced,
|
|
212
|
+
or inaccessible), fatal native backend/registration failures such as `watch-limit`,
|
|
213
|
+
deterministic size limits (`too-large`, operation `scan`), or callback contract
|
|
214
|
+
violations. Invalid scope admission, including symbolic parents, still rejects;
|
|
215
|
+
it never grants authority through a link. Transient descendant churn does not
|
|
216
|
+
make an admitted subscription unavailable. Callbacks may synchronously retire
|
|
217
|
+
the owner. Returning a thenable or a synchronous or asynchronous generator object
|
|
218
|
+
from `onInvalidate`, `onHealth`, or `exclude` rejects observation without advancing
|
|
219
|
+
generators. Application async
|
|
220
|
+
work remains application-owned and is not joined by the subscription.
|
|
221
|
+
|
|
222
|
+
`close()` is terminal, idempotent, and joined. Observation failures remain in
|
|
223
|
+
health but do not make successful retirement reject. Retirement failures do
|
|
224
|
+
reject, with a `SuppressedError` retaining an earlier observation failure when
|
|
225
|
+
both exist. No new generation or callback can be admitted after close.
|
|
226
|
+
|
|
227
|
+
The stress harness also provides `node scripts/watch-stress.mjs --scenario soak-short`,
|
|
228
|
+
a two-minute lifecycle and collected-memory smoke. It is separate from the
|
|
229
|
+
full one-hour `soak` scenario and its stronger memory-growth qualification.
|
|
230
|
+
|
|
231
|
+
## Seeded consumer-cache stress test
|
|
232
|
+
|
|
233
|
+
After building the package and host binding, run the model against real temporary
|
|
234
|
+
Roots in both modes:
|
|
235
|
+
|
|
236
|
+
```sh
|
|
237
|
+
node scripts/watch-stress/model-runner.mjs --seeds 2000 --mode both --output watch-model-results.json
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Each seed generates file and directory edits, renames, replacements, deep trees,
|
|
241
|
+
symlink retargets, bursts, scope changes, and subscription retirement. A consumer
|
|
242
|
+
queues refreshes only from `onInvalidate`; checkpoints drain those requests after
|
|
243
|
+
quiescence and `reconcile()`, then compare its cache with a guarded Root walk and
|
|
244
|
+
an independent mutation model. Native hints never authorize consumer reads.
|
|
245
|
+
|
|
246
|
+
`--seed`, `--steps`, `--settle` (milliseconds), and `--concurrency` control a run.
|
|
247
|
+
Failures are shrunk by fast-check and saved beside the report as `.<mode>-<seed>.failure.json`;
|
|
248
|
+
replay one with `--replay <failure.json>`. Event mode requires a working native
|
|
249
|
+
binding and never silently falls back to polling. The small
|
|
250
|
+
`test/watch-model.test.ts` corpus runs in ordinary CI; native-event cases also run
|
|
251
|
+
when `FS_SAFE_TEST_WATCH_EVENTS=1`. Keep fixtures on normal `os.tmpdir()` storage.
|
|
@@ -6,11 +6,11 @@ half-written replacement appears at the destination. Create-only writes
|
|
|
6
6
|
(`create`, `createJson`, and `write` with `overwrite: false`) use sibling-temp
|
|
7
7
|
staging with an atomic no-replace rename only on backends that provide one —
|
|
8
8
|
the native binding, which `require` mode guarantees and `auto` mode uses when
|
|
9
|
-
the binding loads.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
the binding loads. Ordinary buffered creation in the pure-JavaScript fallback
|
|
10
|
+
claims the final name exclusively with `O_EXCL` and writes content in place, so
|
|
11
|
+
a concurrent observer can see the new file before its content is complete.
|
|
12
|
+
Buffered `create` and `createJson` accept `atomic: true` to stage complete content
|
|
13
|
+
on this fallback too. Streamed creation already stages before publication.
|
|
14
14
|
`append` and `openWritable` intentionally modify an opened file in place;
|
|
15
15
|
`move`, `remove`, and `mkdir` mutate directory entries rather than file bytes.
|
|
16
16
|
Each verb applies the boundary checks appropriate to its operation.
|
|
@@ -45,8 +45,14 @@ wrong file. Resolve an intended alias explicitly with `Root.resolve()` before
|
|
|
45
45
|
passing its canonical path to a mutation.
|
|
46
46
|
|
|
47
47
|
A failure before the final rename leaves the destination at its previous
|
|
48
|
-
contents. A successful rename publishes the complete replacement.
|
|
49
|
-
|
|
48
|
+
contents. A successful rename publishes the complete replacement. Buffered
|
|
49
|
+
Windows replacement writes also keep a missing destination absent while staging;
|
|
50
|
+
they do not reserve an empty file at the final name. An ordinary writable file created
|
|
51
|
+
concurrently may be replaced under `overwrite: true`. Immediately before rename,
|
|
52
|
+
the writer rechecks the selected destination's type and link count, admits a raced
|
|
53
|
+
file's access, and verifies retained file/parent identities and mutation policy.
|
|
54
|
+
|
|
55
|
+
The old-or-new guarantee does not apply to `append()` or `openWritable()`, which
|
|
50
56
|
write in place, or to lower-level atomic helpers when their explicitly
|
|
51
57
|
non-atomic permission-error copy fallback is enabled.
|
|
52
58
|
|
|
@@ -113,6 +119,14 @@ Native and pure-JavaScript Windows writers honor the option. Replacement writes
|
|
|
113
119
|
sync staged content before rename and the final mode through the retained file
|
|
114
120
|
handle. Directory sync remains best-effort.
|
|
115
121
|
|
|
122
|
+
For `create` and `createJson`, `durable: "file"` requires each file sync to succeed,
|
|
123
|
+
including on `EPERM`; it overrides a disabled Root durability default. Parent
|
|
124
|
+
directory synchronization retains the existing best-effort policy. This also
|
|
125
|
+
applies to streamed creation and is independent of publication strategy. Boolean
|
|
126
|
+
durability options keep their existing behavior, including compatibility paths
|
|
127
|
+
that tolerate `EPERM`. A failed file sync before staged publication prevents
|
|
128
|
+
publication; a failure after publication can leave the complete file present.
|
|
129
|
+
|
|
116
130
|
POSIX modes without read permission, including `0o000` and `0o200`, succeed:
|
|
117
131
|
final verification uses a descriptor retained by the writer rather than reopening
|
|
118
132
|
the published file. The requested mode is not relaxed for verification.
|
|
@@ -146,19 +160,71 @@ claimed exclusively first and content is written afterward, so observers can
|
|
|
146
160
|
briefly see an empty file; failure cleanup removes a claimed file only when its
|
|
147
161
|
identity is unchanged.
|
|
148
162
|
|
|
163
|
+
After a successful create-only write, failure to close its owned file handle
|
|
164
|
+
rejects the operation and leaves the complete file present. Ordinary buffered
|
|
165
|
+
creation in the JavaScript fallback preserves an earlier write or verification
|
|
166
|
+
failure if close also fails. Native, atomic, and streamed creation retain their
|
|
167
|
+
existing publication and cleanup diagnostics.
|
|
168
|
+
|
|
149
169
|
```ts
|
|
150
170
|
try {
|
|
151
171
|
await fs.create("config/seed.json", initial);
|
|
152
172
|
} catch (err) {
|
|
153
|
-
if (err instanceof FsSafeError
|
|
173
|
+
if (!(err instanceof FsSafeError) || err.code !== "already-exists") throw err;
|
|
154
174
|
}
|
|
155
175
|
```
|
|
156
176
|
|
|
177
|
+
### Atomic buffered creation
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
await fs.create("config/seed.json", initial, { atomic: true });
|
|
181
|
+
await fs.createJson("config/settings.json", { enabled: true }, { atomic: true });
|
|
182
|
+
await fs.create("config/flushed.json", initial, { atomic: true, durable: "file" });
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
`atomic: true` keeps the destination absent until all bytes have been written.
|
|
186
|
+
The native backend uses its no-replace rename; the JavaScript fallback hardlinks
|
|
187
|
+
the completed stage and unlinks its temporary name in the same JavaScript turn.
|
|
188
|
+
The fallback requires hardlink support and fails without publishing partial bytes
|
|
189
|
+
when that mechanism is unavailable. Other processes can briefly observe both
|
|
190
|
+
names. Existing and raced entries are preserved, including dangling symlinks;
|
|
191
|
+
ordinary confinement, type, hardlink, and symlink-policy rejections still apply.
|
|
192
|
+
`assertBeforeMutation` retains its live checks through content writes and publication.
|
|
193
|
+
|
|
194
|
+
Omitted or `false` preserves the existing buffered behavior. The option belongs
|
|
195
|
+
to buffered `create` and `createJson`, not replacement writes or Root defaults.
|
|
196
|
+
Streamed creation has no atomic opt-out. `atomic` changes visibility, not the
|
|
197
|
+
existing `durable` file/directory synchronization policy; it does not turn
|
|
198
|
+
best-effort synchronization into a strict crash-durability guarantee or strengthen
|
|
199
|
+
JavaScript pathname containment.
|
|
200
|
+
|
|
201
|
+
Wider option objects do not enable create-only `atomic` or `private` behavior on
|
|
202
|
+
`write` or `writeJson`. Buffered Root writes and creates also ignore an extra
|
|
203
|
+
`maxBytes` property; that byte limit belongs to streamed creation and `copyIn`.
|
|
204
|
+
File synchronization follows each method's documented `durable` option.
|
|
205
|
+
|
|
206
|
+
Atomic and streamed creates settle owned cleanup and close operations before
|
|
207
|
+
returning. Failed or unverifiable cleanup is reported rather than silently
|
|
208
|
+
discarded. Errors after publication and incomplete-settlement errors carry the
|
|
209
|
+
existing `StagedFileFailureDetails` publication/cleanup receipts where the writer
|
|
210
|
+
can establish them; native disposal can retain them inside a `SuppressedError`
|
|
211
|
+
cause. Preserve those details when handling errors: a rejection can follow
|
|
212
|
+
complete publication, and an indeterminate link or native rename must preserve names for
|
|
213
|
+
recovery. A cleanup or close failure also retains the original operation failure.
|
|
214
|
+
The JavaScript fallback checks the destination again immediately before attempting
|
|
215
|
+
publication. A collision observed there leaves publication unattempted and cleans
|
|
216
|
+
the owned stage. A later collision or other error from the link call remains
|
|
217
|
+
indeterminate, including `EEXIST`; the error code alone does not prove that the
|
|
218
|
+
filesystem left both names unchanged.
|
|
219
|
+
No later verification, mode, or synchronization failure authorizes deleting an
|
|
220
|
+
already published complete destination. See [receipt meanings](staged-file.md).
|
|
221
|
+
|
|
157
222
|
### Streamed creation
|
|
158
223
|
|
|
159
224
|
Pass an `AsyncIterable<Uint8Array>` to `create()` when bytes come from a database,
|
|
160
225
|
network response, or another incremental producer. Buffers are accepted chunks.
|
|
161
|
-
The writer
|
|
226
|
+
The writer borrows `Uint8Array` slices without copying their payloads and counts
|
|
227
|
+
their actual byte bounds. It consumes each chunk completely before requesting the next one; it
|
|
162
228
|
does not collect the full input in memory or expose a writable descriptor.
|
|
163
229
|
|
|
164
230
|
```ts
|
|
@@ -202,6 +268,12 @@ forcibly interrupted, so cancellation waits for its pending work and cleanup to
|
|
|
202
268
|
settle. Do not mutate a yielded chunk until the next pull. Producer errors retain
|
|
203
269
|
their original value when cleanup succeeds.
|
|
204
270
|
|
|
271
|
+
Streamed creation retains the `signal` and `assertBeforeMutation` callback
|
|
272
|
+
selected when the call starts. Replacing or deleting those options during a
|
|
273
|
+
producer wait does not change the in-flight operation. Abort the original signal
|
|
274
|
+
or update the live authority state checked by the original callback to revoke
|
|
275
|
+
it; the callback continues to receive the original options object as `this`.
|
|
276
|
+
|
|
205
277
|
An aborted or failed operation can leave created parent directories. If a
|
|
206
278
|
stage's identity or parent cannot be verified during cleanup, the existing
|
|
207
279
|
guarded cleanup preserves it. After publication, later verification or cleanup
|
|
@@ -234,6 +306,12 @@ type RootWriteJsonOptions = RootWriteOptions & {
|
|
|
234
306
|
|
|
235
307
|
Open in append mode, write, sync the file handle, and close. Honors `mkdir` for the parent directory and syncs the parent directory when the append creates the file. `durable: false` skips both syncs. Pass `prependNewlineIfNeeded: true` to insert a `\n` if the file does not already end in one.
|
|
236
308
|
|
|
309
|
+
`mode` selects the creation mode, defaulting to `0o600` when neither the call nor
|
|
310
|
+
the Root supplies it. On POSIX, the process umask can further restrict that mode;
|
|
311
|
+
for example, `mode: 0o640` with umask `0o077` creates a `0o600` file. Existing
|
|
312
|
+
files are not chmodded, even when an explicit `mode` is supplied. Empty appends
|
|
313
|
+
use the same creation rules.
|
|
314
|
+
|
|
237
315
|
```ts
|
|
238
316
|
await fs.append("logs/today.log", `[${ts}] ${line}\n`);
|
|
239
317
|
await fs.append("notes/scratch.md", "* new bullet", { prependNewlineIfNeeded: true });
|
|
@@ -268,6 +346,10 @@ await fs.move("incoming/foo.txt", "archive/foo.txt", { overwrite: true });
|
|
|
268
346
|
|
|
269
347
|
Both `from` and `to` are bounded; `..` in either is rejected.
|
|
270
348
|
|
|
349
|
+
Mutation policy is captured at call start; changes to caller-owned denial arrays
|
|
350
|
+
apply to later moves. For live cancellation or revocation, throw from
|
|
351
|
+
`assertBeforeMutation` immediately before dispatch.
|
|
352
|
+
|
|
271
353
|
The default no-clobber mode requires the native helper. It admits both parent
|
|
272
354
|
directory descriptors and performs a descriptor-relative no-replace rename, so
|
|
273
355
|
a competitor that creates the target first is preserved and the source remains
|
|
@@ -277,6 +359,11 @@ replacing rename. After dispatch it rechecks both parent identities, so a
|
|
|
277
359
|
post-operation rejection can mean the no-replace rename completed. Directory
|
|
278
360
|
moves continue to require `overwrite: true`.
|
|
279
361
|
|
|
362
|
+
Linux without `openat2` uses the [guarded native parent walk](native.md#linux-without-openat2).
|
|
363
|
+
The move still uses `renameat2(RENAME_NOREPLACE)` and preserves collisions;
|
|
364
|
+
parent resolution reports the documented `best-effort` containment class.
|
|
365
|
+
Disabling the addon still makes no-clobber moves unavailable.
|
|
366
|
+
|
|
280
367
|
Both selected canonical endpoints are admitted inside the retained Root after
|
|
281
368
|
native parent admission. With `mutationSymlinks: "reject"`, both full operation
|
|
282
369
|
paths are rechecked after the live mutation-authority callback and before
|
|
@@ -407,6 +494,19 @@ an atomic check-and-delete syscall. Use OS isolation for that threat model.
|
|
|
407
494
|
await fs.mkdir("snapshots/2026/05");
|
|
408
495
|
```
|
|
409
496
|
|
|
497
|
+
Pass `{ private: true }` to create missing components with private permissions.
|
|
498
|
+
An existing requested directory must already satisfy that policy; fs-safe does
|
|
499
|
+
not repair it or change existing ancestor permissions. Concurrent creators may
|
|
500
|
+
reuse the winner only after it passes the same checks.
|
|
501
|
+
|
|
502
|
+
Buffered, streamed, and JSON `create` calls also accept `private: true`.
|
|
503
|
+
New POSIX directories default to `0700` and files to `0600`; conflicting
|
|
504
|
+
group/world or privilege bits are rejected before creation. Restrictive
|
|
505
|
+
owner-only file modes remain available through `mode`. On Windows, creation
|
|
506
|
+
uses protected ACLs rather than interpreting POSIX mode bits as access rules.
|
|
507
|
+
This does not change `create`'s no-overwrite behavior or select its durability
|
|
508
|
+
policy. See [creation](creation.md) for supported backends and owned descriptors.
|
|
509
|
+
|
|
410
510
|
### `fs.ensureRoot()`
|
|
411
511
|
|
|
412
512
|
Treats `""` / `"."` as the root itself. Useful when a generic helper computes a relative directory and might end up at the root.
|
|
@@ -438,6 +538,11 @@ destination — there is no atomic-rename step. For exclusive publication of a
|
|
|
438
538
|
complete stream, use [`create()`](#streamed-creation). For streamed replacement,
|
|
439
539
|
the [`atomic`](atomic.md) helpers provide a staged writer.
|
|
440
540
|
|
|
541
|
+
For all three write modes, `mode` only selects new-file creation permissions,
|
|
542
|
+
defaulting to `0o600` when neither the call nor the Root supplies it. POSIX
|
|
543
|
+
permissions remain subject to the process umask; existing files are not chmodded.
|
|
544
|
+
The returned numeric `stat` records the admitted descriptor before caller writes.
|
|
545
|
+
|
|
441
546
|
On POSIX, existing-target opens use `O_NONBLOCK` as an admission safeguard so
|
|
442
547
|
a no-reader FIFO cannot stall regular-file validation. This does not change
|
|
443
548
|
ordinary regular-file write semantics. `replace` and `update` remain write-only
|
|
@@ -501,7 +606,11 @@ for (const file of files) await fs.write(`${stagingDir}/${file.name}`, file.body
|
|
|
501
606
|
await fs.move(stagingDir, "snapshots/2026-05-05", { overwrite: true });
|
|
502
607
|
```
|
|
503
608
|
|
|
504
|
-
For
|
|
609
|
+
For guarded whole-directory publication, use
|
|
610
|
+
[`replaceDirectoryAtomic`](atomic.md#replacedirectoryatomic). Replacing an
|
|
611
|
+
existing target is a two-rename protocol with a temporary target-absence
|
|
612
|
+
interval and conditional no-replace rollback, not a transactional
|
|
613
|
+
commit-or-rollback.
|
|
505
614
|
|
|
506
615
|
### Rotate logs
|
|
507
616
|
|
|
@@ -533,10 +642,16 @@ await fs.write("state.json", body); // succeeds on rclone FUSE
|
|
|
533
642
|
|
|
534
643
|
**Security note.** `verify-content-with-lock` proves that the bytes observed after rename match the requested write and prevents *cooperating* writers from interleaving. It does **not** prove that the destination still names the temp-file object, retain fd-relative parent pinning, or stop a same-UID process that ignores the advisory lock. Do not use this option on directories writable by untrusted same-UID processes. Strict identity verification remains the default.
|
|
535
644
|
|
|
536
|
-
Windows `Root.write()` and `Root.writeJson()` honor this policy both as a Root default and as a per-call option. The Windows buffered writer acquires the same Root compatibility lock before creating parents
|
|
645
|
+
Windows `Root.write()` and `Root.writeJson()` honor this policy both as a Root default and as a per-call option. The Windows buffered writer acquires the same Root compatibility lock before creating parents or staging content. It keeps staging writable until publication, then applies the final mode through the retained destination descriptor. When content verification accepts a changed rename identity, that destination remains pinned through file sync, parent sync, and final strict identity checks.
|
|
537
646
|
|
|
538
647
|
The Windows buffered compatibility path resolves permitted in-root aliases before choosing its lock and binds publication to that effective destination. With the existing lock protocol, effective path components beneath the Root must contain only lower-case ASCII letters, digits, `.`, `_`, or `-`, with no trailing `.`. Unsupported spellings, including missing upper-case or non-ASCII names, fail with `path-alias` before mutation; no filesystem case-sensitivity or Unicode-folding behavior is guessed. This restriction does not apply to strict writes. Opaque Windows pathname identities still use strict verification against the retained original descriptor: they never, by themselves, authorize content-based acceptance of a replacement.
|
|
539
648
|
|
|
649
|
+
The library's own lock-destination check permits the writer to reuse parent
|
|
650
|
+
admission within that operation. The lock key and destination checks remain
|
|
651
|
+
unchanged, and evidence is revoked when the locked operation finishes. Supplying
|
|
652
|
+
an `assertBeforeMutation` callback retains full parent admission because caller
|
|
653
|
+
code can change the filesystem before dispatch.
|
|
654
|
+
|
|
540
655
|
Lock recovery is fail-closed. If a process crashes and leaves the root-level `.fs-safe-write-<sha256>.lock`, a later write reports the stale lock instead of deleting it based on a host-local PID. Recover only under external authority that excludes every competing writer; see [File lock](sidecar-lock.md#stale-recovery-guarded-remove-if-unchanged).
|
|
541
656
|
|
|
542
657
|
## See also
|