@openclaw/openshell-sandbox 2026.9.3 → 2026.9.5
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/activity.svg +3 -0
- package/assets/icon.png +0 -0
- package/dist/index.js +32 -26
- package/node_modules/@openclaw/fs-safe/CHANGELOG.md +285 -0
- package/node_modules/@openclaw/fs-safe/LICENSE +1 -0
- package/node_modules/@openclaw/fs-safe/README.md +65 -10
- package/node_modules/@openclaw/fs-safe/dist/absolute-path.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/absolute-path.js +33 -11
- package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts +8 -1
- package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/advanced.js +8 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-crc32.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-crc32.js +6 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-deadline.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-deadline.js +3 -4
- package/node_modules/@openclaw/fs-safe/dist/archive-durability.d.ts +24 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-durability.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-durability.js +180 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-entry.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-entry.js +8 -8
- package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.js +33 -8
- package/node_modules/@openclaw/fs-safe/dist/archive-input.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-input.js +14 -8
- package/node_modules/@openclaw/fs-safe/dist/archive-kind.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-kind.js +3 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-merge.d.ts +6 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-merge.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-merge.js +68 -19
- package/node_modules/@openclaw/fs-safe/dist/archive-native.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-native.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-native.js +15 -25
- package/node_modules/@openclaw/fs-safe/dist/archive-options.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-options.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-parser.wasm +0 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-plan.js +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-read.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-read.js +128 -109
- package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts +6 -3
- package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-staging.js +100 -42
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.js +4 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.d.ts +11 -4
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.js +23 -10
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.js +18 -14
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.d.ts +2 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.js +50 -14
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.js +13 -2
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.js +64 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.js +22 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.d.ts +6 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.js +56 -18
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts +2 -3
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.js +4 -35
- package/node_modules/@openclaw/fs-safe/dist/archive.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/archive.js +25 -13
- package/node_modules/@openclaw/fs-safe/dist/bounded-read.d.ts +12 -0
- package/node_modules/@openclaw/fs-safe/dist/bounded-read.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/bounded-read.js +83 -46
- package/node_modules/@openclaw/fs-safe/dist/clone-metadata.d.ts +19 -0
- package/node_modules/@openclaw/fs-safe/dist/clone-metadata.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/clone-metadata.js +32 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-file-input.d.ts +22 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-file-input.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-file-input.js +71 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-policy.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-policy.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-policy.js +8 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-publication.d.ts +15 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-publication.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-publication.js +30 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.js +222 -0
- package/node_modules/@openclaw/fs-safe/dist/copy.d.ts +16 -0
- package/node_modules/@openclaw/fs-safe/dist/copy.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/copy.js +125 -0
- package/node_modules/@openclaw/fs-safe/dist/darwin-acl.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/darwin-acl.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/darwin-acl.js +24 -0
- package/node_modules/@openclaw/fs-safe/dist/deny-mutations.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/deny-mutations.js +8 -2
- package/node_modules/@openclaw/fs-safe/dist/device-path.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/device-path.js +5 -3
- package/node_modules/@openclaw/fs-safe/dist/directory-durability.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-durability.js +68 -23
- package/node_modules/@openclaw/fs-safe/dist/directory-entry-path.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/directory-entry-path.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/directory-entry-path.js +21 -0
- package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts +27 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-guard.js +145 -17
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts +12 -0
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.js +106 -8
- package/node_modules/@openclaw/fs-safe/dist/durability.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/durability.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/durability.js +1 -1
- package/node_modules/@openclaw/fs-safe/dist/effective-uid.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/effective-uid.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/effective-uid.js +25 -0
- package/node_modules/@openclaw/fs-safe/dist/error-detail.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/error-detail.js +4 -1
- package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.d.ts +14 -0
- package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.js +135 -0
- package/node_modules/@openclaw/fs-safe/dist/file-hash.d.ts +9 -2
- package/node_modules/@openclaw/fs-safe/dist/file-hash.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-hash.js +147 -40
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.js +44 -10
- package/node_modules/@openclaw/fs-safe/dist/file-lock.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-lock.js +29 -9
- package/node_modules/@openclaw/fs-safe/dist/file-observation.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-observation.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts +6 -2
- package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.js +22 -65
- package/node_modules/@openclaw/fs-safe/dist/file-store-copy-source.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-copy-source.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-copy-source.js +31 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-path.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-path.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-path.js +30 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-prune.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-prune.js +15 -5
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.d.ts +16 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.js +349 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.js +63 -48
- package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/file-store.js +23 -47
- package/node_modules/@openclaw/fs-safe/dist/filename.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/filename.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/filename.js +89 -36
- package/node_modules/@openclaw/fs-safe/dist/fs.js +3 -3
- package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.d.ts +11 -0
- package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.js +218 -32
- package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.js +9 -5
- package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.js +117 -0
- package/node_modules/@openclaw/fs-safe/dist/guest-native-python.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/guest-native-python.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/guest-native-python.js +135 -0
- package/node_modules/@openclaw/fs-safe/dist/guest.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/guest.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/guest.js +424 -0
- package/node_modules/@openclaw/fs-safe/dist/home-dir.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/home-dir.js +81 -16
- package/node_modules/@openclaw/fs-safe/dist/index.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/index.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/install-path.d.ts +6 -0
- package/node_modules/@openclaw/fs-safe/dist/install-path.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/install-path.js +71 -26
- package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/json-document-store.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.js +3 -3
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts +8 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.js +137 -45
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-paths.d.ts +11 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-paths.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-paths.js +42 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.d.ts +6 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.js +61 -0
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.js +107 -152
- package/node_modules/@openclaw/fs-safe/dist/json-store.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/json-store.js +5 -1
- package/node_modules/@openclaw/fs-safe/dist/json.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/json.js +55 -22
- package/node_modules/@openclaw/fs-safe/dist/local-file-access.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/local-file-access.js +4 -0
- package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.d.ts +17 -0
- package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.js +84 -0
- package/node_modules/@openclaw/fs-safe/dist/local-roots.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/local-roots.js +54 -27
- package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.js +47 -20
- package/node_modules/@openclaw/fs-safe/dist/move-path-stage.d.ts +8 -0
- package/node_modules/@openclaw/fs-safe/dist/move-path-stage.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/move-path-stage.js +56 -0
- package/node_modules/@openclaw/fs-safe/dist/move-path.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/move-path.js +84 -50
- package/node_modules/@openclaw/fs-safe/dist/mutation-authority.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/mutation-authority.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/mutation-authority.js +36 -0
- package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts +53 -1
- package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native-binding.js +8 -1
- package/node_modules/@openclaw/fs-safe/dist/native-directory-observation.d.ts +17 -0
- package/node_modules/@openclaw/fs-safe/dist/native-directory-observation.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/native-directory-observation.js +37 -0
- package/node_modules/@openclaw/fs-safe/dist/native-operations.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native-operations.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native-operations.js +17 -9
- package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.d.ts +32 -0
- package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.js +127 -0
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.d.ts +0 -1
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.js +27 -16
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.js +315 -41
- package/node_modules/@openclaw/fs-safe/dist/native-staged-file.d.ts +5 -5
- package/node_modules/@openclaw/fs-safe/dist/native-staged-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native-staged-file.js +52 -15
- package/node_modules/@openclaw/fs-safe/dist/native.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/native.js +7 -2
- package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.js +3 -2
- package/node_modules/@openclaw/fs-safe/dist/opened-realpath.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/opened-realpath.js +5 -4
- package/node_modules/@openclaw/fs-safe/dist/output.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/output.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/output.js +16 -4
- package/node_modules/@openclaw/fs-safe/dist/overwrite-file-handle.d.ts +8 -0
- package/node_modules/@openclaw/fs-safe/dist/overwrite-file-handle.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/overwrite-file-handle.js +46 -0
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl.js +2 -0
- package/node_modules/@openclaw/fs-safe/dist/path-case.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/path-case.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/path-case.js +136 -0
- package/node_modules/@openclaw/fs-safe/dist/path-policy.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/path-policy.js +7 -2
- package/node_modules/@openclaw/fs-safe/dist/path-prefix.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/path-prefix.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/path-prefix.js +82 -0
- package/node_modules/@openclaw/fs-safe/dist/path-scope-lexical.d.ts +14 -0
- package/node_modules/@openclaw/fs-safe/dist/path-scope-lexical.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/path-scope-lexical.js +37 -0
- package/node_modules/@openclaw/fs-safe/dist/path-segment-route.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/path-segment-route.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/path-segment-route.js +24 -0
- package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.d.ts +10 -0
- package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.js +386 -0
- package/node_modules/@openclaw/fs-safe/dist/path.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/path.js +39 -7
- package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/permissions-windows.js +99 -56
- package/node_modules/@openclaw/fs-safe/dist/permissions.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/permissions.js +39 -10
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.d.ts +25 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.js +425 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.d.ts +34 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.js +142 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.d.ts +24 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.js +70 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts +6 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-open.js +29 -9
- package/node_modules/@openclaw/fs-safe/dist/pinned-operation.js +1 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-types.d.ts +75 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-types.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-types.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/pinned-write.d.ts +7 -29
- package/node_modules/@openclaw/fs-safe/dist/pinned-write.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-write.js +203 -47
- package/node_modules/@openclaw/fs-safe/dist/positional-read.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/positional-read.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/positional-read.js +36 -0
- package/node_modules/@openclaw/fs-safe/dist/private-directory.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/private-directory.js +2 -0
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.d.ts +16 -0
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.js +272 -0
- package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.d.ts +2 -39
- package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.js +183 -69
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.d.ts +13 -0
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.js +47 -0
- package/node_modules/@openclaw/fs-safe/dist/publish-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/publish-file.js +63 -56
- package/node_modules/@openclaw/fs-safe/dist/realpath.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/realpath.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/realpath.js +43 -0
- package/node_modules/@openclaw/fs-safe/dist/recursive-mkdir-path.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/recursive-mkdir-path.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/recursive-mkdir-path.js +8 -0
- package/node_modules/@openclaw/fs-safe/dist/regular-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/regular-file.js +56 -45
- package/node_modules/@openclaw/fs-safe/dist/replace-directory.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-directory.js +14 -6
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.js +52 -47
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.js +17 -17
- package/node_modules/@openclaw/fs-safe/dist/replace-file-mode.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-mode.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-mode.js +10 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.js +18 -3
- package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/replace-file.js +43 -32
- package/node_modules/@openclaw/fs-safe/dist/root-boundary.d.ts +29 -0
- package/node_modules/@openclaw/fs-safe/dist/root-boundary.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-boundary.js +182 -0
- package/node_modules/@openclaw/fs-safe/dist/root-context.d.ts +15 -1
- package/node_modules/@openclaw/fs-safe/dist/root-context.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-context.js +131 -33
- package/node_modules/@openclaw/fs-safe/dist/root-create-input.d.ts +10 -0
- package/node_modules/@openclaw/fs-safe/dist/root-create-input.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-create-input.js +80 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.d.ts +13 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.js +212 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts +38 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.js +368 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory.d.ts +23 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory.js +141 -0
- package/node_modules/@openclaw/fs-safe/dist/root-entries.d.ts +11 -0
- package/node_modules/@openclaw/fs-safe/dist/root-entries.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-entries.js +61 -0
- package/node_modules/@openclaw/fs-safe/dist/root-errors.d.ts +6 -5
- package/node_modules/@openclaw/fs-safe/dist/root-errors.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-errors.js +28 -13
- package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.d.ts +21 -0
- package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.js +83 -0
- package/node_modules/@openclaw/fs-safe/dist/root-file.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/root-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-file.js +111 -24
- package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts +18 -51
- package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-impl.js +639 -510
- package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.d.ts +14 -0
- package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.js +202 -0
- package/node_modules/@openclaw/fs-safe/dist/root-move-preflight.d.ts +8 -0
- package/node_modules/@openclaw/fs-safe/dist/root-move-preflight.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-move-preflight.js +16 -0
- package/node_modules/@openclaw/fs-safe/dist/root-observed-path.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/root-observed-path.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-observed-path.js +95 -0
- package/node_modules/@openclaw/fs-safe/dist/root-options.d.ts +77 -0
- package/node_modules/@openclaw/fs-safe/dist/root-options.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-options.js +18 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-errors.d.ts +12 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-errors.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-errors.js +13 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.js +111 -14
- package/node_modules/@openclaw/fs-safe/dist/root-path-observation.d.ts +63 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-observation.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-observation.js +180 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-stat.d.ts +5 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-stat.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-stat.js +101 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.js +24 -4
- package/node_modules/@openclaw/fs-safe/dist/root-path.d.ts +14 -0
- package/node_modules/@openclaw/fs-safe/dist/root-path.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-path.js +322 -220
- package/node_modules/@openclaw/fs-safe/dist/root-paths-lexical.d.ts +9 -0
- package/node_modules/@openclaw/fs-safe/dist/root-paths-lexical.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-paths-lexical.js +22 -0
- package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts +3 -29
- package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-paths.js +89 -174
- package/node_modules/@openclaw/fs-safe/dist/root-read-admission.d.ts +26 -0
- package/node_modules/@openclaw/fs-safe/dist/root-read-admission.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-read-admission.js +94 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.d.ts +15 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.js +89 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove-receipt.d.ts +17 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove-receipt.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove-receipt.js +37 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove.d.ts +6 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-remove.js +448 -0
- package/node_modules/@openclaw/fs-safe/dist/root-symlink-policy.d.ts +14 -0
- package/node_modules/@openclaw/fs-safe/dist/root-symlink-policy.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-symlink-policy.js +34 -0
- package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts +5 -4
- package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-walk.js +100 -50
- package/node_modules/@openclaw/fs-safe/dist/root-write-admission.d.ts +68 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-admission.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-admission.js +322 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.d.ts +13 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.js +74 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.d.ts +42 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.js +195 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-mode.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-mode.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-mode.js +22 -11
- package/node_modules/@openclaw/fs-safe/dist/root-write-publication.d.ts +24 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-publication.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-publication.js +85 -0
- package/node_modules/@openclaw/fs-safe/dist/root-write-verification.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/root-write-verification.js +18 -7
- package/node_modules/@openclaw/fs-safe/dist/root.d.ts +4 -1
- package/node_modules/@openclaw/fs-safe/dist/root.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.js +3 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-file.js +65 -25
- package/node_modules/@openclaw/fs-safe/dist/secret-read-async.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-read-async.js +22 -16
- package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.js +5 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.d.ts +10 -0
- package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.js +186 -0
- package/node_modules/@openclaw/fs-safe/dist/secure-file.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-file.js +137 -22
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.d.ts +6 -3
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.js +122 -101
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.d.ts +35 -0
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.js +106 -0
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts +4 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.js +210 -45
- package/node_modules/@openclaw/fs-safe/dist/sibling-temp.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/sibling-temp.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sibling-temp.js +43 -17
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.js +64 -21
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.js +22 -3
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.js +16 -4
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.js +4 -2
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.js +4 -4
- package/node_modules/@openclaw/fs-safe/dist/staged-directory.d.ts +14 -5
- package/node_modules/@openclaw/fs-safe/dist/staged-directory.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/staged-directory.js +58 -6
- package/node_modules/@openclaw/fs-safe/dist/standalone-publication-path.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/standalone-publication-path.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/standalone-publication-path.js +6 -0
- package/node_modules/@openclaw/fs-safe/dist/stat-observation.d.ts +11 -0
- package/node_modules/@openclaw/fs-safe/dist/stat-observation.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/stat-observation.js +64 -0
- package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.js +39 -2
- package/node_modules/@openclaw/fs-safe/dist/symlink-parents.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/symlink-parents.js +7 -2
- package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.js +3 -2
- package/node_modules/@openclaw/fs-safe/dist/temp-target.d.ts +16 -12
- package/node_modules/@openclaw/fs-safe/dist/temp-target.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-target.js +154 -14
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.d.ts +22 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.js +374 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.d.ts +13 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.js +95 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.d.ts +48 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.js +363 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-identity.d.ts +15 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-identity.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-identity.js +41 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.d.ts +7 -6
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.js +121 -61
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-permissions.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-permissions.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-permissions.js +32 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-types.d.ts +40 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-types.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/temp-workspace-types.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/temp.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/temp.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/temp.js +1 -1
- package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/text-atomic.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/text-atomic.js +3 -1
- package/node_modules/@openclaw/fs-safe/dist/timing.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/timing.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/timing.js +25 -6
- package/node_modules/@openclaw/fs-safe/dist/trash.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/trash.js +61 -13
- package/node_modules/@openclaw/fs-safe/dist/unicode-path.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/unicode-path.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/unicode-path.js +13 -0
- package/node_modules/@openclaw/fs-safe/dist/walk.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/walk.js +25 -40
- package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts +9 -12
- package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/windows-owner.js +29 -58
- package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.d.ts +39 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.js +153 -0
- package/node_modules/@openclaw/fs-safe/dist/write-file-handle.d.ts +7 -0
- package/node_modules/@openclaw/fs-safe/dist/write-file-handle.d.ts.map +1 -0
- package/node_modules/@openclaw/fs-safe/dist/write-file-handle.js +26 -0
- package/node_modules/@openclaw/fs-safe/dist/write-open-flags.d.ts.map +1 -1
- package/node_modules/@openclaw/fs-safe/dist/write-open-flags.js +1 -2
- package/node_modules/@openclaw/fs-safe/docs/advanced.md +50 -5
- package/node_modules/@openclaw/fs-safe/docs/archive.md +107 -12
- package/node_modules/@openclaw/fs-safe/docs/atomic.md +77 -5
- package/node_modules/@openclaw/fs-safe/docs/config.md +1 -0
- package/node_modules/@openclaw/fs-safe/docs/contributing.md +40 -2
- package/node_modules/@openclaw/fs-safe/docs/copy.md +158 -0
- package/node_modules/@openclaw/fs-safe/docs/directory-identity.md +85 -0
- package/node_modules/@openclaw/fs-safe/docs/durability.md +71 -5
- package/node_modules/@openclaw/fs-safe/docs/entries.md +109 -0
- package/node_modules/@openclaw/fs-safe/docs/errors.md +18 -10
- package/node_modules/@openclaw/fs-safe/docs/file-store.md +93 -6
- package/node_modules/@openclaw/fs-safe/docs/filename.md +21 -7
- package/node_modules/@openclaw/fs-safe/docs/guest.md +146 -0
- package/node_modules/@openclaw/fs-safe/docs/in-place-write.md +81 -0
- package/node_modules/@openclaw/fs-safe/docs/index.md +2 -0
- package/node_modules/@openclaw/fs-safe/docs/install-path.md +61 -15
- package/node_modules/@openclaw/fs-safe/docs/install.md +42 -7
- package/node_modules/@openclaw/fs-safe/docs/json-store.md +15 -1
- package/node_modules/@openclaw/fs-safe/docs/json.md +11 -0
- package/node_modules/@openclaw/fs-safe/docs/local-roots.md +8 -1
- package/node_modules/@openclaw/fs-safe/docs/mutation-policy-proof.md +65 -0
- package/node_modules/@openclaw/fs-safe/docs/native-helper.md +51 -12
- package/node_modules/@openclaw/fs-safe/docs/native.md +63 -10
- package/node_modules/@openclaw/fs-safe/docs/output.md +55 -7
- package/node_modules/@openclaw/fs-safe/docs/path-case.md +64 -0
- package/node_modules/@openclaw/fs-safe/docs/path-prefix.md +64 -0
- package/node_modules/@openclaw/fs-safe/docs/path-scope.md +1 -1
- package/node_modules/@openclaw/fs-safe/docs/path-suffix-aliases.md +159 -0
- package/node_modules/@openclaw/fs-safe/docs/path.md +12 -1
- package/node_modules/@openclaw/fs-safe/docs/permissions.md +55 -11
- package/node_modules/@openclaw/fs-safe/docs/positional-read.md +63 -0
- package/node_modules/@openclaw/fs-safe/docs/private-file-store.md +14 -0
- package/node_modules/@openclaw/fs-safe/docs/public-api.md +45 -2
- package/node_modules/@openclaw/fs-safe/docs/quickstart.md +1 -1
- package/node_modules/@openclaw/fs-safe/docs/reading.md +14 -1
- package/node_modules/@openclaw/fs-safe/docs/root.md +219 -12
- package/node_modules/@openclaw/fs-safe/docs/secret-file.md +9 -0
- package/node_modules/@openclaw/fs-safe/docs/secure-file.md +23 -16
- package/node_modules/@openclaw/fs-safe/docs/security-model.md +90 -9
- package/node_modules/@openclaw/fs-safe/docs/sidecar-lock.md +42 -4
- package/node_modules/@openclaw/fs-safe/docs/store.md +27 -2
- package/node_modules/@openclaw/fs-safe/docs/temp.md +283 -26
- package/node_modules/@openclaw/fs-safe/docs/test-hooks.md +14 -0
- package/node_modules/@openclaw/fs-safe/docs/timing.md +2 -0
- package/node_modules/@openclaw/fs-safe/docs/types.md +19 -12
- package/node_modules/@openclaw/fs-safe/docs/walk.md +54 -5
- package/node_modules/@openclaw/fs-safe/docs/writing.md +211 -11
- package/node_modules/@openclaw/fs-safe/package.json +24 -13
- 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/jszip/.github/FUNDING.yml +1 -0
- package/node_modules/jszip/.github/actions/setup/action.yml +23 -0
- package/node_modules/jszip/.github/workflows/benchmark.yml +38 -0
- package/node_modules/jszip/.github/workflows/main.yml +55 -0
- package/node_modules/jszip/CHANGES.md +6 -0
- package/node_modules/jszip/dist/jszip.js +28 -19
- package/node_modules/jszip/dist/jszip.min.js +2 -2
- package/node_modules/jszip/index.d.ts +14 -0
- package/node_modules/jszip/lib/index.js +1 -1
- package/node_modules/jszip/lib/utils.js +26 -17
- package/node_modules/jszip/package.json +2 -2
- package/node_modules/p-limit/index.d.ts +1 -1
- package/node_modules/p-limit/index.js +6 -1
- package/node_modules/p-limit/package.json +1 -1
- package/node_modules/p-limit/readme.md +8 -0
- package/node_modules/zod/README.md +27 -0
- package/node_modules/zod/compile.cjs +77 -0
- package/node_modules/zod/compile.d.cts +1 -0
- package/node_modules/zod/compile.d.ts +1 -0
- package/node_modules/zod/compile.js +52 -0
- package/node_modules/zod/index.cjs +2 -2
- package/node_modules/zod/index.d.cts +1 -2
- package/node_modules/zod/index.d.ts +1 -2
- package/node_modules/zod/index.js +5 -2
- package/node_modules/zod/package.json +13 -2
- package/node_modules/zod/src/compile.ts +56 -0
- package/node_modules/zod/src/index.ts +5 -2
- package/node_modules/zod/src/v3/ZodError.ts +22 -12
- package/node_modules/zod/src/v3/tests/error.test.ts +35 -0
- package/node_modules/zod/src/v3/tests/intersection.test.ts +18 -0
- package/node_modules/zod/src/v3/tests/language-server.test.ts +1 -2
- package/node_modules/zod/src/v3/tests/object.test.ts +3 -6
- package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -80
- package/node_modules/zod/src/v3/tests/string.test.ts +6 -0
- package/node_modules/zod/src/v3/types.ts +5 -5
- package/node_modules/zod/src/v4/classic/checks.ts +1 -0
- package/node_modules/zod/src/v4/classic/compat.ts +26 -18
- package/node_modules/zod/src/v4/classic/deep-partial.ts +76 -0
- package/node_modules/zod/src/v4/classic/errors.ts +59 -44
- package/node_modules/zod/src/v4/classic/external.ts +12 -9
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +140 -78
- package/node_modules/zod/src/v4/classic/in-out.ts +45 -0
- package/node_modules/zod/src/v4/classic/index.ts +2 -2
- package/node_modules/zod/src/v4/classic/iso.ts +2 -72
- package/node_modules/zod/src/v4/classic/parse.ts +10 -4
- package/node_modules/zod/src/v4/classic/schemas.ts +452 -262
- package/node_modules/zod/src/v4/classic/tests/apply.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +2 -2
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +135 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +30 -1
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +278 -0
- package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +1 -2
- package/node_modules/zod/src/v4/classic/tests/codec.test.ts +2 -1
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +2 -2
- package/node_modules/zod/src/v4/classic/tests/credit-card.test.ts +76 -0
- package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +720 -0
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +30 -0
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +32 -18
- package/node_modules/zod/src/v4/classic/tests/deep-partial.test.ts +380 -0
- package/node_modules/zod/src/v4/classic/tests/default-locale.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +46 -0
- package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +31 -7
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +155 -13
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +11 -0
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +112 -2
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +274 -6
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +425 -10
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +31 -0
- package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +2 -9
- package/node_modules/zod/src/v4/classic/tests/hash.test.ts +1 -2
- package/node_modules/zod/src/v4/classic/tests/in-out.test.ts +159 -0
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +21 -2
- package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +281 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +47 -0
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +136 -0
- package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +183 -0
- package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +3 -10
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +36 -1
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +12 -1
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +12 -0
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +46 -9
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +245 -12
- package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +234 -0
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +49 -16
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +51 -4
- package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +20 -2
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -68
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +186 -18
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +33 -2
- package/node_modules/zod/src/v4/classic/tests/redos.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +60 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +9 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +127 -5
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +18 -0
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +11 -2
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1585 -173
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +45 -30
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +39 -2
- package/node_modules/zod/src/v4/classic/tests/validate.test.ts +76 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
- package/node_modules/zod/src/v4/core/api.ts +48 -12
- package/node_modules/zod/src/v4/core/checks.ts +57 -44
- package/node_modules/zod/src/v4/core/compile.ts +2188 -0
- package/node_modules/zod/src/v4/core/core.ts +98 -19
- package/node_modules/zod/src/v4/core/doc.ts +11 -7
- package/node_modules/zod/src/v4/core/errors.ts +115 -24
- package/node_modules/zod/src/v4/core/index.ts +3 -0
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +6 -1
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +257 -93
- package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
- package/node_modules/zod/src/v4/core/memoizer.ts +284 -0
- package/node_modules/zod/src/v4/core/parse.ts +131 -38
- package/node_modules/zod/src/v4/core/regexes.ts +30 -13
- package/node_modules/zod/src/v4/core/registries.ts +2 -2
- package/node_modules/zod/src/v4/core/schemas.ts +759 -461
- package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +969 -0
- package/node_modules/zod/src/v4/core/tests/compile-global.test.ts +89 -0
- package/node_modules/zod/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
- package/node_modules/zod/src/v4/core/tests/compile-stats.test.ts +34 -0
- package/node_modules/zod/src/v4/core/tests/compile.test.ts +1639 -0
- package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +1 -2
- package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +1 -2
- package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +3 -3
- package/node_modules/zod/src/v4/core/tests/locales/parity.test.ts +42 -0
- package/node_modules/zod/src/v4/core/tests/locales/tk.test.ts +69 -0
- package/node_modules/zod/src/v4/core/tests/treeshake.test.ts +51 -0
- package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +31 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +275 -42
- package/node_modules/zod/src/v4/core/util.ts +268 -42
- package/node_modules/zod/src/v4/core/versions.ts +2 -2
- package/node_modules/zod/src/v4/core/visit.ts +193 -0
- package/node_modules/zod/src/v4/index.ts +3 -3
- package/node_modules/zod/src/v4/locales/ar.ts +3 -0
- package/node_modules/zod/src/v4/locales/az.ts +3 -0
- package/node_modules/zod/src/v4/locales/be.ts +10 -0
- package/node_modules/zod/src/v4/locales/bg.ts +3 -0
- package/node_modules/zod/src/v4/locales/bn.ts +121 -0
- package/node_modules/zod/src/v4/locales/ca.ts +3 -0
- package/node_modules/zod/src/v4/locales/ckb.ts +138 -0
- package/node_modules/zod/src/v4/locales/cs.ts +3 -0
- package/node_modules/zod/src/v4/locales/da.ts +5 -2
- package/node_modules/zod/src/v4/locales/de.ts +3 -0
- package/node_modules/zod/src/v4/locales/el.ts +1 -0
- package/node_modules/zod/src/v4/locales/en.ts +15 -4
- package/node_modules/zod/src/v4/locales/eo.ts +3 -0
- package/node_modules/zod/src/v4/locales/es.ts +2 -0
- package/node_modules/zod/src/v4/locales/fa.ts +3 -0
- package/node_modules/zod/src/v4/locales/fi.ts +3 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +3 -0
- package/node_modules/zod/src/v4/locales/fr.ts +19 -14
- package/node_modules/zod/src/v4/locales/gu.ts +121 -0
- package/node_modules/zod/src/v4/locales/he.ts +6 -1
- package/node_modules/zod/src/v4/locales/hi.ts +124 -0
- package/node_modules/zod/src/v4/locales/hr.ts +2 -0
- package/node_modules/zod/src/v4/locales/hu.ts +3 -0
- package/node_modules/zod/src/v4/locales/hy.ts +9 -0
- package/node_modules/zod/src/v4/locales/id.ts +3 -0
- package/node_modules/zod/src/v4/locales/index.ts +10 -0
- package/node_modules/zod/src/v4/locales/is.ts +3 -0
- package/node_modules/zod/src/v4/locales/it.ts +3 -0
- package/node_modules/zod/src/v4/locales/ja.ts +3 -0
- package/node_modules/zod/src/v4/locales/ka.ts +3 -0
- package/node_modules/zod/src/v4/locales/km.ts +3 -0
- package/node_modules/zod/src/v4/locales/kn.ts +124 -0
- package/node_modules/zod/src/v4/locales/ko.ts +3 -0
- package/node_modules/zod/src/v4/locales/lt.ts +2 -0
- package/node_modules/zod/src/v4/locales/mk.ts +3 -0
- package/node_modules/zod/src/v4/locales/ms.ts +3 -0
- package/node_modules/zod/src/v4/locales/ne.ts +126 -0
- package/node_modules/zod/src/v4/locales/nl.ts +3 -0
- package/node_modules/zod/src/v4/locales/nn.ts +119 -0
- package/node_modules/zod/src/v4/locales/no.ts +5 -2
- package/node_modules/zod/src/v4/locales/ota.ts +3 -0
- package/node_modules/zod/src/v4/locales/pl.ts +3 -0
- package/node_modules/zod/src/v4/locales/ps.ts +3 -0
- package/node_modules/zod/src/v4/locales/pt-BR.ts +159 -0
- package/node_modules/zod/src/v4/locales/pt.ts +99 -58
- package/node_modules/zod/src/v4/locales/ro.ts +1 -0
- package/node_modules/zod/src/v4/locales/ru.ts +10 -0
- package/node_modules/zod/src/v4/locales/sk.ts +121 -0
- package/node_modules/zod/src/v4/locales/sl.ts +3 -0
- package/node_modules/zod/src/v4/locales/sv.ts +5 -2
- package/node_modules/zod/src/v4/locales/ta.ts +3 -0
- package/node_modules/zod/src/v4/locales/th.ts +3 -0
- package/node_modules/zod/src/v4/locales/tk.ts +111 -0
- package/node_modules/zod/src/v4/locales/tr.ts +3 -0
- package/node_modules/zod/src/v4/locales/uk.ts +3 -0
- package/node_modules/zod/src/v4/locales/ur.ts +3 -0
- package/node_modules/zod/src/v4/locales/uz.ts +1 -0
- package/node_modules/zod/src/v4/locales/vi.ts +3 -0
- package/node_modules/zod/src/v4/locales/yo.ts +3 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +3 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +3 -0
- package/node_modules/zod/src/v4/mini/checks.ts +1 -0
- package/node_modules/zod/src/v4/mini/deep-partial.ts +73 -0
- package/node_modules/zod/src/v4/mini/external.ts +10 -1
- package/node_modules/zod/src/v4/mini/in-out.ts +45 -0
- package/node_modules/zod/src/v4/mini/parse.ts +2 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +135 -56
- package/node_modules/zod/src/v4/mini/tests/apply.test.ts +33 -0
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +62 -1
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +14 -0
- package/node_modules/zod/src/v4/mini/tests/codec.test.ts +35 -1
- package/node_modules/zod/src/v4/mini/tests/cyclic-data.test.ts +84 -0
- package/node_modules/zod/src/v4/mini/tests/deep-partial.test.ts +54 -0
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +23 -4
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +9 -0
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +72 -5
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +14 -0
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +65 -0
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +21 -0
- package/node_modules/zod/v3/ZodError.cjs +22 -12
- package/node_modules/zod/v3/ZodError.d.cts +1 -1
- package/node_modules/zod/v3/ZodError.d.ts +1 -1
- package/node_modules/zod/v3/ZodError.js +22 -12
- package/node_modules/zod/v3/types.cjs +7 -5
- package/node_modules/zod/v3/types.js +7 -5
- package/node_modules/zod/v4/classic/checks.cjs +2 -1
- package/node_modules/zod/v4/classic/checks.d.cts +1 -1
- package/node_modules/zod/v4/classic/checks.d.ts +1 -1
- package/node_modules/zod/v4/classic/checks.js +1 -1
- package/node_modules/zod/v4/classic/compat.d.cts +9 -11
- package/node_modules/zod/v4/classic/compat.d.ts +9 -11
- package/node_modules/zod/v4/classic/deep-partial.cjs +39 -0
- package/node_modules/zod/v4/classic/deep-partial.d.cts +14 -0
- package/node_modules/zod/v4/classic/deep-partial.d.ts +14 -0
- package/node_modules/zod/v4/classic/deep-partial.js +13 -0
- package/node_modules/zod/v4/classic/errors.cjs +43 -34
- package/node_modules/zod/v4/classic/errors.d.cts +3 -4
- package/node_modules/zod/v4/classic/errors.d.ts +3 -4
- package/node_modules/zod/v4/classic/errors.js +43 -34
- package/node_modules/zod/v4/classic/external.cjs +30 -27
- package/node_modules/zod/v4/classic/external.d.cts +5 -2
- package/node_modules/zod/v4/classic/external.d.ts +5 -2
- package/node_modules/zod/v4/classic/external.js +5 -8
- package/node_modules/zod/v4/classic/from-json-schema.cjs +136 -75
- package/node_modules/zod/v4/classic/from-json-schema.js +136 -75
- package/node_modules/zod/v4/classic/in-out.cjs +63 -0
- package/node_modules/zod/v4/classic/in-out.d.cts +8 -0
- package/node_modules/zod/v4/classic/in-out.d.ts +8 -0
- package/node_modules/zod/v4/classic/in-out.js +36 -0
- package/node_modules/zod/v4/classic/index.cjs +2 -2
- package/node_modules/zod/v4/classic/index.d.cts +1 -2
- package/node_modules/zod/v4/classic/index.d.ts +1 -2
- package/node_modules/zod/v4/classic/index.js +2 -2
- package/node_modules/zod/v4/classic/iso.cjs +11 -22
- package/node_modules/zod/v4/classic/iso.d.cts +2 -17
- package/node_modules/zod/v4/classic/iso.d.ts +2 -17
- package/node_modules/zod/v4/classic/iso.js +2 -17
- package/node_modules/zod/v4/classic/parse.cjs +4 -1
- package/node_modules/zod/v4/classic/parse.d.cts +17 -4
- package/node_modules/zod/v4/classic/parse.d.ts +17 -4
- package/node_modules/zod/v4/classic/parse.js +1 -0
- package/node_modules/zod/v4/classic/schemas.cjs +498 -398
- package/node_modules/zod/v4/classic/schemas.d.cts +53 -18
- package/node_modules/zod/v4/classic/schemas.d.ts +53 -18
- package/node_modules/zod/v4/classic/schemas.js +492 -396
- package/node_modules/zod/v4/core/api.cjs +23 -4
- package/node_modules/zod/v4/core/api.d.cts +13 -9
- package/node_modules/zod/v4/core/api.d.ts +13 -9
- package/node_modules/zod/v4/core/api.js +21 -4
- package/node_modules/zod/v4/core/checks.cjs +37 -31
- package/node_modules/zod/v4/core/checks.d.cts +13 -13
- package/node_modules/zod/v4/core/checks.d.ts +13 -13
- package/node_modules/zod/v4/core/checks.js +37 -31
- package/node_modules/zod/v4/core/compile.cjs +1813 -0
- package/node_modules/zod/v4/core/compile.d.cts +51 -0
- package/node_modules/zod/v4/core/compile.d.ts +51 -0
- package/node_modules/zod/v4/core/compile.js +1783 -0
- package/node_modules/zod/v4/core/core.cjs +81 -18
- package/node_modules/zod/v4/core/core.d.cts +16 -4
- package/node_modules/zod/v4/core/core.d.ts +16 -4
- package/node_modules/zod/v4/core/core.js +82 -19
- package/node_modules/zod/v4/core/doc.cjs +5 -7
- package/node_modules/zod/v4/core/doc.d.cts +3 -1
- package/node_modules/zod/v4/core/doc.d.ts +3 -1
- package/node_modules/zod/v4/core/doc.js +5 -7
- package/node_modules/zod/v4/core/errors.cjs +110 -25
- package/node_modules/zod/v4/core/errors.d.cts +4 -0
- package/node_modules/zod/v4/core/errors.d.ts +4 -0
- package/node_modules/zod/v4/core/errors.js +110 -25
- package/node_modules/zod/v4/core/index.cjs +5 -1
- package/node_modules/zod/v4/core/index.d.cts +3 -0
- package/node_modules/zod/v4/core/index.d.ts +3 -0
- package/node_modules/zod/v4/core/index.js +3 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +4 -0
- package/node_modules/zod/v4/core/json-schema-generator.d.cts +2 -2
- package/node_modules/zod/v4/core/json-schema-generator.d.ts +2 -2
- package/node_modules/zod/v4/core/json-schema-generator.js +4 -0
- package/node_modules/zod/v4/core/json-schema-processors.cjs +264 -95
- package/node_modules/zod/v4/core/json-schema-processors.js +243 -97
- package/node_modules/zod/v4/core/json-schema.d.cts +2 -1
- package/node_modules/zod/v4/core/json-schema.d.ts +2 -1
- package/node_modules/zod/v4/core/memoizer.cjs +272 -0
- package/node_modules/zod/v4/core/memoizer.d.cts +15 -0
- package/node_modules/zod/v4/core/memoizer.d.ts +15 -0
- package/node_modules/zod/v4/core/memoizer.js +265 -0
- package/node_modules/zod/v4/core/parse.cjs +96 -34
- package/node_modules/zod/v4/core/parse.d.cts +14 -11
- package/node_modules/zod/v4/core/parse.d.ts +14 -11
- package/node_modules/zod/v4/core/parse.js +94 -33
- package/node_modules/zod/v4/core/regexes.cjs +27 -15
- package/node_modules/zod/v4/core/regexes.d.cts +2 -0
- package/node_modules/zod/v4/core/regexes.d.ts +2 -0
- package/node_modules/zod/v4/core/regexes.js +24 -13
- package/node_modules/zod/v4/core/registries.js +2 -2
- package/node_modules/zod/v4/core/schemas.cjs +537 -326
- package/node_modules/zod/v4/core/schemas.d.cts +100 -31
- package/node_modules/zod/v4/core/schemas.d.ts +100 -31
- package/node_modules/zod/v4/core/schemas.js +526 -325
- package/node_modules/zod/v4/core/to-json-schema.cjs +242 -39
- package/node_modules/zod/v4/core/to-json-schema.d.cts +42 -3
- package/node_modules/zod/v4/core/to-json-schema.d.ts +42 -3
- package/node_modules/zod/v4/core/to-json-schema.js +241 -39
- package/node_modules/zod/v4/core/util.cjs +212 -31
- package/node_modules/zod/v4/core/util.d.cts +58 -1
- package/node_modules/zod/v4/core/util.d.ts +58 -1
- package/node_modules/zod/v4/core/util.js +202 -30
- package/node_modules/zod/v4/core/versions.cjs +2 -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 +195 -0
- package/node_modules/zod/v4/core/visit.d.cts +30 -0
- package/node_modules/zod/v4/core/visit.d.ts +30 -0
- package/node_modules/zod/v4/core/visit.js +169 -0
- package/node_modules/zod/v4/index.cjs +15 -5
- package/node_modules/zod/v4/index.d.cts +2 -2
- package/node_modules/zod/v4/index.d.ts +2 -2
- package/node_modules/zod/v4/index.js +3 -2
- package/node_modules/zod/v4/locales/ar.cjs +3 -0
- package/node_modules/zod/v4/locales/ar.js +3 -0
- package/node_modules/zod/v4/locales/az.cjs +3 -0
- package/node_modules/zod/v4/locales/az.js +3 -0
- package/node_modules/zod/v4/locales/be.cjs +10 -0
- package/node_modules/zod/v4/locales/be.js +10 -0
- package/node_modules/zod/v4/locales/bg.cjs +3 -0
- package/node_modules/zod/v4/locales/bg.js +3 -0
- package/node_modules/zod/v4/locales/bn.cjs +138 -0
- package/node_modules/zod/v4/locales/bn.d.cts +5 -0
- package/node_modules/zod/v4/locales/bn.d.ts +4 -0
- package/node_modules/zod/v4/locales/bn.js +111 -0
- package/node_modules/zod/v4/locales/ca.cjs +3 -0
- package/node_modules/zod/v4/locales/ca.js +3 -0
- package/node_modules/zod/v4/locales/ckb.cjs +158 -0
- package/node_modules/zod/v4/locales/ckb.d.cts +5 -0
- package/node_modules/zod/v4/locales/ckb.d.ts +4 -0
- package/node_modules/zod/v4/locales/ckb.js +131 -0
- package/node_modules/zod/v4/locales/cs.cjs +3 -0
- package/node_modules/zod/v4/locales/cs.js +3 -0
- package/node_modules/zod/v4/locales/da.cjs +5 -2
- package/node_modules/zod/v4/locales/da.js +5 -2
- package/node_modules/zod/v4/locales/de.cjs +3 -0
- package/node_modules/zod/v4/locales/de.js +3 -0
- package/node_modules/zod/v4/locales/el.cjs +1 -0
- package/node_modules/zod/v4/locales/el.js +1 -0
- package/node_modules/zod/v4/locales/en.cjs +14 -4
- package/node_modules/zod/v4/locales/en.js +14 -4
- package/node_modules/zod/v4/locales/eo.cjs +3 -0
- package/node_modules/zod/v4/locales/eo.js +3 -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 +3 -0
- package/node_modules/zod/v4/locales/fa.js +3 -0
- package/node_modules/zod/v4/locales/fi.cjs +3 -0
- package/node_modules/zod/v4/locales/fi.js +3 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +3 -0
- package/node_modules/zod/v4/locales/fr-CA.js +3 -0
- package/node_modules/zod/v4/locales/fr.cjs +16 -14
- package/node_modules/zod/v4/locales/fr.js +16 -14
- package/node_modules/zod/v4/locales/gu.cjs +138 -0
- package/node_modules/zod/v4/locales/gu.d.cts +5 -0
- package/node_modules/zod/v4/locales/gu.d.ts +4 -0
- package/node_modules/zod/v4/locales/gu.js +111 -0
- package/node_modules/zod/v4/locales/he.cjs +5 -0
- package/node_modules/zod/v4/locales/he.js +5 -0
- package/node_modules/zod/v4/locales/hi.cjs +136 -0
- package/node_modules/zod/v4/locales/hi.d.cts +5 -0
- package/node_modules/zod/v4/locales/hi.d.ts +4 -0
- package/node_modules/zod/v4/locales/hi.js +109 -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 +3 -0
- package/node_modules/zod/v4/locales/hu.js +3 -0
- package/node_modules/zod/v4/locales/hy.cjs +9 -0
- package/node_modules/zod/v4/locales/hy.js +9 -0
- package/node_modules/zod/v4/locales/id.cjs +3 -0
- package/node_modules/zod/v4/locales/id.js +3 -0
- package/node_modules/zod/v4/locales/index.cjs +22 -2
- package/node_modules/zod/v4/locales/index.d.cts +10 -0
- package/node_modules/zod/v4/locales/index.d.ts +10 -0
- package/node_modules/zod/v4/locales/index.js +10 -0
- package/node_modules/zod/v4/locales/is.cjs +3 -0
- package/node_modules/zod/v4/locales/is.js +3 -0
- package/node_modules/zod/v4/locales/it.cjs +3 -0
- package/node_modules/zod/v4/locales/it.js +3 -0
- package/node_modules/zod/v4/locales/ja.cjs +3 -0
- package/node_modules/zod/v4/locales/ja.js +3 -0
- package/node_modules/zod/v4/locales/ka.cjs +3 -0
- package/node_modules/zod/v4/locales/ka.js +3 -0
- package/node_modules/zod/v4/locales/km.cjs +3 -0
- package/node_modules/zod/v4/locales/km.js +3 -0
- package/node_modules/zod/v4/locales/kn.cjs +141 -0
- package/node_modules/zod/v4/locales/kn.d.cts +5 -0
- package/node_modules/zod/v4/locales/kn.d.ts +4 -0
- package/node_modules/zod/v4/locales/kn.js +114 -0
- package/node_modules/zod/v4/locales/ko.cjs +3 -0
- package/node_modules/zod/v4/locales/ko.js +3 -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 +3 -0
- package/node_modules/zod/v4/locales/mk.js +3 -0
- package/node_modules/zod/v4/locales/ms.cjs +3 -0
- package/node_modules/zod/v4/locales/ms.js +3 -0
- package/node_modules/zod/v4/locales/ne.cjs +136 -0
- package/node_modules/zod/v4/locales/ne.d.cts +5 -0
- package/node_modules/zod/v4/locales/ne.d.ts +4 -0
- package/node_modules/zod/v4/locales/ne.js +109 -0
- package/node_modules/zod/v4/locales/nl.cjs +3 -0
- package/node_modules/zod/v4/locales/nl.js +3 -0
- package/node_modules/zod/v4/locales/nn.cjs +138 -0
- package/node_modules/zod/v4/locales/nn.d.cts +5 -0
- package/node_modules/zod/v4/locales/nn.d.ts +4 -0
- package/node_modules/zod/v4/locales/nn.js +111 -0
- package/node_modules/zod/v4/locales/no.cjs +5 -2
- package/node_modules/zod/v4/locales/no.js +5 -2
- package/node_modules/zod/v4/locales/ota.cjs +3 -0
- package/node_modules/zod/v4/locales/ota.js +3 -0
- package/node_modules/zod/v4/locales/pl.cjs +3 -0
- package/node_modules/zod/v4/locales/pl.js +3 -0
- package/node_modules/zod/v4/locales/ps.cjs +3 -0
- package/node_modules/zod/v4/locales/ps.js +3 -0
- package/node_modules/zod/v4/locales/pt-BR.cjs +168 -0
- package/node_modules/zod/v4/locales/pt-BR.d.cts +5 -0
- package/node_modules/zod/v4/locales/pt-BR.d.ts +4 -0
- package/node_modules/zod/v4/locales/pt-BR.js +141 -0
- package/node_modules/zod/v4/locales/pt.cjs +87 -55
- package/node_modules/zod/v4/locales/pt.js +87 -55
- package/node_modules/zod/v4/locales/ro.cjs +1 -0
- package/node_modules/zod/v4/locales/ro.js +1 -0
- package/node_modules/zod/v4/locales/ru.cjs +10 -0
- package/node_modules/zod/v4/locales/ru.js +10 -0
- package/node_modules/zod/v4/locales/sk.cjs +141 -0
- package/node_modules/zod/v4/locales/sk.d.cts +5 -0
- package/node_modules/zod/v4/locales/sk.d.ts +4 -0
- package/node_modules/zod/v4/locales/sk.js +114 -0
- package/node_modules/zod/v4/locales/sl.cjs +3 -0
- package/node_modules/zod/v4/locales/sl.js +3 -0
- package/node_modules/zod/v4/locales/sv.cjs +5 -2
- package/node_modules/zod/v4/locales/sv.js +5 -2
- package/node_modules/zod/v4/locales/ta.cjs +3 -0
- package/node_modules/zod/v4/locales/ta.js +3 -0
- package/node_modules/zod/v4/locales/th.cjs +3 -0
- package/node_modules/zod/v4/locales/th.js +3 -0
- package/node_modules/zod/v4/locales/tk.cjs +132 -0
- package/node_modules/zod/v4/locales/tk.d.cts +5 -0
- package/node_modules/zod/v4/locales/tk.d.ts +4 -0
- package/node_modules/zod/v4/locales/tk.js +105 -0
- package/node_modules/zod/v4/locales/tr.cjs +3 -0
- package/node_modules/zod/v4/locales/tr.js +3 -0
- package/node_modules/zod/v4/locales/uk.cjs +3 -0
- package/node_modules/zod/v4/locales/uk.js +3 -0
- package/node_modules/zod/v4/locales/ur.cjs +3 -0
- package/node_modules/zod/v4/locales/ur.js +3 -0
- package/node_modules/zod/v4/locales/uz.cjs +1 -0
- package/node_modules/zod/v4/locales/uz.js +1 -0
- package/node_modules/zod/v4/locales/vi.cjs +3 -0
- package/node_modules/zod/v4/locales/vi.js +3 -0
- package/node_modules/zod/v4/locales/yo.cjs +3 -0
- package/node_modules/zod/v4/locales/yo.js +3 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +3 -0
- package/node_modules/zod/v4/locales/zh-CN.js +3 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +3 -0
- package/node_modules/zod/v4/locales/zh-TW.js +3 -0
- package/node_modules/zod/v4/mini/checks.cjs +2 -1
- package/node_modules/zod/v4/mini/checks.d.cts +1 -1
- package/node_modules/zod/v4/mini/checks.d.ts +1 -1
- package/node_modules/zod/v4/mini/checks.js +1 -1
- package/node_modules/zod/v4/mini/deep-partial.cjs +39 -0
- package/node_modules/zod/v4/mini/deep-partial.d.cts +14 -0
- package/node_modules/zod/v4/mini/deep-partial.d.ts +14 -0
- package/node_modules/zod/v4/mini/deep-partial.js +13 -0
- package/node_modules/zod/v4/mini/external.cjs +12 -1
- package/node_modules/zod/v4/mini/external.d.cts +5 -2
- package/node_modules/zod/v4/mini/external.d.ts +5 -2
- package/node_modules/zod/v4/mini/external.js +3 -1
- package/node_modules/zod/v4/mini/in-out.cjs +63 -0
- package/node_modules/zod/v4/mini/in-out.d.cts +8 -0
- package/node_modules/zod/v4/mini/in-out.d.ts +8 -0
- package/node_modules/zod/v4/mini/in-out.js +36 -0
- package/node_modules/zod/v4/mini/parse.cjs +3 -1
- package/node_modules/zod/v4/mini/parse.d.cts +1 -1
- package/node_modules/zod/v4/mini/parse.d.ts +1 -1
- package/node_modules/zod/v4/mini/parse.js +1 -1
- package/node_modules/zod/v4/mini/schemas.cjs +75 -47
- package/node_modules/zod/v4/mini/schemas.d.cts +43 -13
- package/node_modules/zod/v4/mini/schemas.d.ts +43 -13
- package/node_modules/zod/v4/mini/schemas.js +71 -45
- package/openclaw.plugin.json +21 -0
- package/package.json +11 -8
- package/node_modules/jszip/.github/workflows/pr.yaml +0 -58
- package/node_modules/jszip/.jekyll-metadata +0 -0
- package/node_modules/jszip/.travis.yml +0 -17
- package/node_modules/jszip/deps.js +0 -37
- package/node_modules/jszip/graph.svg +0 -601
- package/node_modules/zod/src/v4/core/config.ts +0 -15
|
@@ -1,36 +1,112 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
1
53
|
import { randomUUID } from "node:crypto";
|
|
2
54
|
import fsSync, { constants as fsConstants } from "node:fs";
|
|
3
55
|
import fs from "node:fs/promises";
|
|
4
56
|
import path from "node:path";
|
|
5
57
|
import { normalizeMaxBytes } from "./byte-budget.js";
|
|
6
|
-
import {
|
|
58
|
+
import { assertCopySourceCurrent, resolveFileCopyCloneMode } from "./copy-file-input.js";
|
|
59
|
+
import { assertAsyncDirectoryGuard, assertSyncDirectoryGuard, createAsyncDirectoryGuard, createNearestExistingDirectoryGuard } from "./directory-guard.js";
|
|
7
60
|
import { FsSafeError } from "./errors.js";
|
|
8
61
|
import { syncDirectoryBestEffort } from "./directory-durability.js";
|
|
9
|
-
import { sameFileIdentity, sameFileIdentityForCleanup, } from "./file-identity.js";
|
|
10
|
-
import { mkdirPathComponentsWithGuards } from "./guarded-mkdir.js";
|
|
11
62
|
import { withAsyncDirectoryGuards } from "./guarded-mutation.js";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
63
|
+
import { openLocalFileDescriptor } from "./local-file-descriptor.js";
|
|
64
|
+
import { assertMutationNotDenied, mergeDenyMutationPolicies } from "./deny-mutations.js";
|
|
65
|
+
import { resolveOpenedFileRealPathForFd } from "./opened-realpath.js";
|
|
66
|
+
import { openedPathResolutionError, recordExclusiveCreateFailure, recordOpenedFileFailure } from "./opened-file-failure.js";
|
|
67
|
+
import { runPinnedWriteHelper, runPinnedWriteWithRenamePolicy } from "./pinned-write.js";
|
|
68
|
+
import { preparePinnedWriteMutationAdmission, snapshotPinnedMutationPolicy } from "./pinned-mutation-admission.js";
|
|
16
69
|
import { getNativeBinding } from "./native.js";
|
|
17
70
|
import { validatePinnedOperationPayload } from "./pinned-operation.js";
|
|
18
|
-
import {
|
|
19
|
-
import { assertNoNulPathInput,
|
|
71
|
+
import { PATH_ALIAS_POLICIES } from "./path-policy.js";
|
|
72
|
+
import { assertNoNulPathInput, hasNodeErrorCode, isNotFoundPathError, isSymlinkOpenError, } from "./path.js";
|
|
20
73
|
import { readOpenedFileSafely } from "./read-opened-file.js";
|
|
21
|
-
import {
|
|
74
|
+
import { cleanupPinnedFilePath, removePathIfIdentityUnchanged } from "./replace-file-temp-owner.js";
|
|
75
|
+
import { realpathSync } from "./realpath.js";
|
|
76
|
+
import { mkdirPathFallback, prepareRootWriteTarget, tryMkdirAtExactParent } from "./root-directory-creation.js";
|
|
22
77
|
import { isNonRegularWriteOpenError, resolveNonblockingWriteFlag } from "./write-open-flags.js";
|
|
23
|
-
import { resolveRootPath } from "./root-path.js";
|
|
78
|
+
import { resolveRootPath, resolveRootPathForRemoval } from "./root-path.js";
|
|
79
|
+
import { RemovalPathReceipts } from "./root-remove-receipt.js";
|
|
80
|
+
import { admitPathInsideRoot } from "./root-boundary.js";
|
|
81
|
+
import { listDirectoryPath, openRootDirectoryListing } from "./root-directory-list.js";
|
|
82
|
+
import { statResolvedPathInRoot } from "./root-path-stat.js";
|
|
83
|
+
import { entriesInRoot } from "./root-entries.js";
|
|
84
|
+
import { assertMoveMutationAllowed } from "./root-move-preflight.js";
|
|
24
85
|
import { assertRootIdentityCurrent, assertValidRootDestinationPath, assertValidRootRelativePath, ensureTrailingSep, expandRelativePathWithHome, resolvePathInRoot, resolveRootContext, rootRelativeReadPath, } from "./root-context.js";
|
|
25
|
-
import { fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, normalizePinnedWriteError,
|
|
86
|
+
import { fileNotFoundError, hardlinkedPathNotAllowedError, isAlreadyExistsError, normalizePinnedPathError, normalizePinnedWriteError, outsideWorkspaceError, } from "./root-errors.js";
|
|
26
87
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
27
88
|
import { stringifyJsonDocument } from "./json-stringify.js";
|
|
28
89
|
import { walkRoot } from "./root-walk.js";
|
|
29
90
|
import { registerTempPathForExit } from "./temp-cleanup.js";
|
|
91
|
+
import { removePathInRootFallback, validateRemoveOptions } from "./root-remove.js";
|
|
30
92
|
import { serializePathWrite } from "./write-queue.js";
|
|
31
93
|
import { verifyAtomicWriteResult } from "./root-write-verification.js";
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
94
|
+
import { assertRootWritePathSelectionSync, assertRootWriteSelectionSync, createRootWriteSelectionForFd, prepareGuardedRootWritePathSelection, resolveGuardedWritePathInRoot, resolveGuardedWriteTargetInRoot, resolvePinnedWriteTargetInRoot, refreshRetainedRootWriteAdmission, refreshRootWritePathSelection, retainRootWriteSelection, takeRootWriteSelection, } from "./root-write-admission.js";
|
|
95
|
+
import { prepareSharedRootWriteTarget } from "./root-write-complete-parent.js";
|
|
96
|
+
import { finishRootFallbackWrite } from "./root-write-publication.js";
|
|
97
|
+
import { assertRootFallbackWritePath, withRootFallbackCompatibilityLock } from "./root-write-compatibility.js";
|
|
98
|
+
import { inspectFileIdentity, inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
99
|
+
import { movePathNoReplaceNative } from "./root-move-noreplace.js";
|
|
100
|
+
import { admitRootReadHandle, inspectOpenedPathIdentitySync } from "./root-read-admission.js";
|
|
101
|
+
import { createCopyPublicationObserver, onCopyPublication } from "./copy-publication.js";
|
|
102
|
+
import { writeAllToFile } from "./write-file-handle.js";
|
|
103
|
+
import { createInputOptions, rethrowCreateInputError, rootWriteInput } from "./root-create-input.js";
|
|
104
|
+
import { assertFinalSymlinkRejected, mutationSymlinkResolution, readSymlinkResolution } from "./root-symlink-policy.js";
|
|
105
|
+
import { assertNoWindowsPathAlias, resolvePathPreservingWindowsRoot } from "./windows-path-alias.js";
|
|
106
|
+
import { resolvePinnedObservedPathInRoot } from "./root-observed-path.js";
|
|
107
|
+
import { mergeReadOptions, readDefaults, } from "./root-options.js";
|
|
108
|
+
import { composeMutationAssertions, MutationAuthorityError, rethrowMutationAuthorityError } from "./mutation-authority.js";
|
|
109
|
+
export { DEFAULT_ROOT_MAX_BYTES } from "./root-options.js";
|
|
34
110
|
export { resolveOpenedFileRealPathForHandle } from "./opened-realpath.js";
|
|
35
111
|
function logWarn(message) {
|
|
36
112
|
if (process.env.FS_SAFE_DEBUG_WARNINGS === "1") {
|
|
@@ -38,8 +114,6 @@ function logWarn(message) {
|
|
|
38
114
|
}
|
|
39
115
|
}
|
|
40
116
|
const SUPPORTS_NOFOLLOW = process.platform !== "win32" && "O_NOFOLLOW" in fsConstants;
|
|
41
|
-
const OPEN_READ_FLAGS = resolveReadOpenFlags();
|
|
42
|
-
const OPEN_READ_FOLLOW_FLAGS = resolveReadOpenFlags({ followSymlinks: true });
|
|
43
117
|
const OPEN_WRITE_EXISTING_FLAGS = fsConstants.O_WRONLY | (SUPPORTS_NOFOLLOW ? fsConstants.O_NOFOLLOW : 0) |
|
|
44
118
|
resolveNonblockingWriteFlag();
|
|
45
119
|
const OPEN_WRITE_CREATE_FLAGS = fsConstants.O_WRONLY |
|
|
@@ -53,22 +127,6 @@ const OPEN_APPEND_CREATE_FLAGS = fsConstants.O_RDWR |
|
|
|
53
127
|
fsConstants.O_CREAT |
|
|
54
128
|
fsConstants.O_EXCL |
|
|
55
129
|
(SUPPORTS_NOFOLLOW ? fsConstants.O_NOFOLLOW : 0);
|
|
56
|
-
export const DEFAULT_ROOT_MAX_BYTES = 16 * 1024 * 1024;
|
|
57
|
-
function pathStatFromStats(stat) {
|
|
58
|
-
return {
|
|
59
|
-
dev: Number(stat.dev),
|
|
60
|
-
gid: Number(stat.gid),
|
|
61
|
-
ino: Number(stat.ino),
|
|
62
|
-
isDirectory: stat.isDirectory(),
|
|
63
|
-
isFile: stat.isFile(),
|
|
64
|
-
isSymbolicLink: stat.isSymbolicLink(),
|
|
65
|
-
mode: stat.mode,
|
|
66
|
-
mtimeMs: stat.mtimeMs,
|
|
67
|
-
nlink: stat.nlink,
|
|
68
|
-
size: stat.size,
|
|
69
|
-
uid: stat.uid,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
130
|
function openResult(params) {
|
|
73
131
|
return {
|
|
74
132
|
handle: params.handle,
|
|
@@ -79,69 +137,9 @@ function openResult(params) {
|
|
|
79
137
|
};
|
|
80
138
|
}
|
|
81
139
|
async function openVerifiedLocalFile(filePath, options) {
|
|
82
|
-
assertNoUnsafeDeviceReadPath(filePath);
|
|
83
140
|
const fsSafeTestHooks = getFsSafeTestHooks();
|
|
84
|
-
|
|
85
|
-
let observedBeforeOpen = false;
|
|
86
|
-
// Reject directories before opening so we never surface EISDIR to callers (e.g. tool
|
|
87
|
-
// results that get sent to messaging channels). See openclaw/openclaw#31186.
|
|
88
|
-
try {
|
|
89
|
-
preOpenStat = await inspectFileIdentity(async () => {
|
|
90
|
-
const stat = fsSync.lstatSync(filePath, { bigint: true });
|
|
91
|
-
observedBeforeOpen = true;
|
|
92
|
-
if (stat.isSymbolicLink() && options?.symlinks !== "follow-within-root") {
|
|
93
|
-
throw new FsSafeError("symlink", "symlink not allowed");
|
|
94
|
-
}
|
|
95
|
-
if (!stat.isFile() && !stat.isSymbolicLink()) {
|
|
96
|
-
throw new FsSafeError("not-file", "not a file");
|
|
97
|
-
}
|
|
98
|
-
return stat;
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
if (err instanceof FsSafeError || observedBeforeOpen) {
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
105
|
-
// Only an initial lookup failure falls through; a failed re-inspection aborts.
|
|
106
|
-
}
|
|
107
|
-
if (preOpenStat) {
|
|
108
|
-
await fsSafeTestHooks?.afterPreOpenLstat?.(filePath);
|
|
109
|
-
}
|
|
110
|
-
const openFlags = options?.symlinks === "follow-within-root"
|
|
111
|
-
? OPEN_READ_FOLLOW_FLAGS
|
|
112
|
-
: OPEN_READ_FLAGS;
|
|
113
|
-
await fsSafeTestHooks?.beforeOpen?.(filePath, openFlags);
|
|
114
|
-
let handle;
|
|
141
|
+
const { handle, stat, identity, preOpenStat } = await openLocalFileDescriptor(filePath, options);
|
|
115
142
|
try {
|
|
116
|
-
handle = await fs.open(filePath, openFlags).catch((error) => recordFileOpenFailure(isNotFoundPathError(error) ? fileNotFoundError() : error, filePath));
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
if (isSymlinkOpenError(err)) {
|
|
120
|
-
throw new FsSafeError("symlink", "symlink open blocked", { cause: err });
|
|
121
|
-
}
|
|
122
|
-
// Defensive: if open still throws EISDIR (e.g. race), sanitize so it never leaks.
|
|
123
|
-
if (hasNodeErrorCode(err, "EISDIR")) {
|
|
124
|
-
throw new FsSafeError("not-file", "not a file");
|
|
125
|
-
}
|
|
126
|
-
throw err;
|
|
127
|
-
}
|
|
128
|
-
try {
|
|
129
|
-
await fsSafeTestHooks?.afterOpen?.(filePath, handle);
|
|
130
|
-
const stat = fsSync.fstatSync(handle.fd);
|
|
131
|
-
if (!stat.isFile()) {
|
|
132
|
-
throw new FsSafeError("not-file", "not a file");
|
|
133
|
-
}
|
|
134
|
-
// Keep numeric Stats for the public receipt, never for identity verification.
|
|
135
|
-
let openedIdentity;
|
|
136
|
-
const identity = await inspectFileIdentity(async () => (openedIdentity = fsSync.fstatSync(handle.fd, { bigint: true })), preOpenStat && !preOpenStat.isSymbolicLink() ? preOpenStat : undefined).catch(async (error) => {
|
|
137
|
-
if ([0, 1].includes(stat.nlink)) {
|
|
138
|
-
await recordPreOpenFileChange(error, handle, filePath, preOpenStat, openedIdentity);
|
|
139
|
-
}
|
|
140
|
-
throw error;
|
|
141
|
-
});
|
|
142
|
-
if (options?.hardlinks === "reject" && stat.nlink > 1) {
|
|
143
|
-
throw hardlinkedPathNotAllowedError();
|
|
144
|
-
}
|
|
145
143
|
const inspectPathIdentity = async (inspect) => {
|
|
146
144
|
try {
|
|
147
145
|
return await inspectFileIdentity(inspect, identity);
|
|
@@ -154,15 +152,7 @@ async function openVerifiedLocalFile(filePath, options) {
|
|
|
154
152
|
throw failure;
|
|
155
153
|
}
|
|
156
154
|
};
|
|
157
|
-
await inspectPathIdentity(async () =>
|
|
158
|
-
const pathStat = options?.symlinks === "follow-within-root"
|
|
159
|
-
? fsSync.statSync(filePath, { bigint: true })
|
|
160
|
-
: fsSync.lstatSync(filePath, { bigint: true });
|
|
161
|
-
if (pathStat.isSymbolicLink() && options?.symlinks !== "follow-within-root") {
|
|
162
|
-
throw new FsSafeError("symlink", "symlink not allowed");
|
|
163
|
-
}
|
|
164
|
-
return pathStat;
|
|
165
|
-
});
|
|
155
|
+
await inspectPathIdentity(async () => inspectOpenedPathIdentitySync(filePath, options?.symlinks));
|
|
166
156
|
await fsSafeTestHooks?.afterOpenedPathIdentityCheck?.(filePath, handle);
|
|
167
157
|
const resolved = await resolveOpenedFileRealPathForFd(handle.fd, identity, filePath)
|
|
168
158
|
.catch(async (error) => {
|
|
@@ -172,6 +162,7 @@ async function openVerifiedLocalFile(filePath, options) {
|
|
|
172
162
|
throw error;
|
|
173
163
|
});
|
|
174
164
|
const { realPath } = resolved;
|
|
165
|
+
assertNoWindowsPathAlias(realPath, "filesystem", "resolved file path uses a Windows filesystem namespace alias");
|
|
175
166
|
let resolvedStat = resolved.stat;
|
|
176
167
|
await inspectPathIdentity(async () => {
|
|
177
168
|
// Reuse the post-realpath observation; unknown Windows identities still
|
|
@@ -191,12 +182,14 @@ async function openVerifiedLocalFile(filePath, options) {
|
|
|
191
182
|
}
|
|
192
183
|
}
|
|
193
184
|
export class RootHandle {
|
|
185
|
+
rootGuard;
|
|
194
186
|
rootIdentity;
|
|
195
187
|
rootDir;
|
|
196
188
|
rootReal;
|
|
197
189
|
rootWithSep;
|
|
198
190
|
defaults;
|
|
199
191
|
constructor(context, defaults = {}) {
|
|
192
|
+
this.rootGuard = context.rootGuard;
|
|
200
193
|
this.rootIdentity = context.rootIdentity;
|
|
201
194
|
this.rootDir = context.rootDir;
|
|
202
195
|
this.rootReal = context.rootReal;
|
|
@@ -206,6 +199,7 @@ export class RootHandle {
|
|
|
206
199
|
get context() {
|
|
207
200
|
return {
|
|
208
201
|
rootDir: this.rootDir,
|
|
202
|
+
rootGuard: this.rootGuard,
|
|
209
203
|
rootIdentity: this.rootIdentity,
|
|
210
204
|
rootReal: this.rootReal,
|
|
211
205
|
rootWithSep: this.rootWithSep,
|
|
@@ -214,12 +208,14 @@ export class RootHandle {
|
|
|
214
208
|
mutationOptions(options) {
|
|
215
209
|
return {
|
|
216
210
|
...options,
|
|
211
|
+
assertBeforeMutation: composeMutationAssertions(this.defaults.assertBeforeMutation, options.assertBeforeMutation),
|
|
212
|
+
mutationSymlinks: options.mutationSymlinks ?? this.defaults.mutationSymlinks,
|
|
217
213
|
denyMutations: mergeDenyMutationPolicies(this.defaults.denyMutations, options.denyMutations),
|
|
218
214
|
};
|
|
219
215
|
}
|
|
220
216
|
async resolve(relativePath) {
|
|
221
217
|
assertValidRootDestinationPath(relativePath);
|
|
222
|
-
return (await resolvePathInRoot(this.context, relativePath, { allowFinalSymlink: true })).resolved;
|
|
218
|
+
return (await resolvePathInRoot(this.context, relativePath, { allowFinalSymlink: true, resolveCanonical: true })).resolved;
|
|
223
219
|
}
|
|
224
220
|
async open(relativePath, options = {}) {
|
|
225
221
|
return await openFileInRoot(this.context, {
|
|
@@ -258,14 +254,15 @@ export class RootHandle {
|
|
|
258
254
|
async openWritable(relativePath, options = {}) {
|
|
259
255
|
assertValidRootDestinationPath(relativePath);
|
|
260
256
|
const writeMode = options.writeMode ?? "replace";
|
|
261
|
-
|
|
257
|
+
const target = await openWritableFileInRoot(this.context, {
|
|
262
258
|
relativePath,
|
|
263
259
|
mkdir: this.defaults.mkdir,
|
|
264
260
|
mode: this.defaults.mode,
|
|
265
261
|
...this.mutationOptions(options),
|
|
266
262
|
append: writeMode === "append",
|
|
267
263
|
truncateExisting: writeMode === "replace",
|
|
268
|
-
});
|
|
264
|
+
}).catch(rethrowMutationAuthorityError);
|
|
265
|
+
return target.opened;
|
|
269
266
|
}
|
|
270
267
|
async append(relativePath, data, options = {}) {
|
|
271
268
|
assertValidRootDestinationPath(relativePath);
|
|
@@ -276,28 +273,30 @@ export class RootHandle {
|
|
|
276
273
|
mode: this.defaults.mode,
|
|
277
274
|
...this.mutationOptions(options),
|
|
278
275
|
durable: options.durable ?? this.defaults.durable ?? true,
|
|
279
|
-
});
|
|
276
|
+
}).catch(rethrowMutationAuthorityError);
|
|
280
277
|
}
|
|
281
278
|
async remove(relativePath, options = {}) {
|
|
282
279
|
assertValidRootRelativePath(relativePath);
|
|
280
|
+
validateRemoveOptions(options);
|
|
281
|
+
options.signal?.throwIfAborted();
|
|
283
282
|
await removePathInRoot(this.context, {
|
|
284
283
|
relativePath,
|
|
285
284
|
...this.mutationOptions(options),
|
|
286
|
-
});
|
|
285
|
+
}).catch(rethrowMutationAuthorityError);
|
|
287
286
|
}
|
|
288
287
|
async mkdir(relativePath, options = {}) {
|
|
289
288
|
assertValidRootDestinationPath(relativePath);
|
|
290
289
|
await mkdirPathInRoot(this.context, {
|
|
291
290
|
relativePath,
|
|
292
291
|
...this.mutationOptions(options),
|
|
293
|
-
});
|
|
292
|
+
}).catch(rethrowMutationAuthorityError);
|
|
294
293
|
}
|
|
295
294
|
async ensureRoot(options = {}) {
|
|
296
295
|
await mkdirPathInRoot(this.context, {
|
|
297
296
|
relativePath: "",
|
|
298
297
|
allowRoot: true,
|
|
299
298
|
...this.mutationOptions(options),
|
|
300
|
-
});
|
|
299
|
+
}).catch(rethrowMutationAuthorityError);
|
|
301
300
|
}
|
|
302
301
|
async write(relativePath, data, options = {}) {
|
|
303
302
|
assertValidRootDestinationPath(relativePath);
|
|
@@ -309,7 +308,7 @@ export class RootHandle {
|
|
|
309
308
|
renameIdentity: this.defaults.renameIdentity,
|
|
310
309
|
...this.mutationOptions(options),
|
|
311
310
|
durable: options.durable ?? this.defaults.durable ?? true,
|
|
312
|
-
});
|
|
311
|
+
}).catch(rethrowMutationAuthorityError);
|
|
313
312
|
}
|
|
314
313
|
async create(relativePath, data, options = {}) {
|
|
315
314
|
assertValidRootDestinationPath(relativePath);
|
|
@@ -318,10 +317,10 @@ export class RootHandle {
|
|
|
318
317
|
data,
|
|
319
318
|
mkdir: this.defaults.mkdir,
|
|
320
319
|
mode: this.defaults.mode,
|
|
321
|
-
...this.mutationOptions(options),
|
|
320
|
+
...this.mutationOptions(createInputOptions(data, options, this.defaults.maxBytes)),
|
|
322
321
|
durable: options.durable ?? this.defaults.durable ?? true,
|
|
323
322
|
overwrite: false,
|
|
324
|
-
});
|
|
323
|
+
}).catch(rethrowMutationAuthorityError).catch(rethrowCreateInputError);
|
|
325
324
|
}
|
|
326
325
|
async writeJson(relativePath, data, options = {}) {
|
|
327
326
|
const { replacer, space, trailingNewline = true, ...writeOptions } = options;
|
|
@@ -333,17 +332,20 @@ export class RootHandle {
|
|
|
333
332
|
const json = stringifyJsonDocument(data, replacer, space);
|
|
334
333
|
await this.create(relativePath, trailingNewline ? `${json}\n` : json, writeOptions);
|
|
335
334
|
}
|
|
336
|
-
async copyIn(relativePath,
|
|
335
|
+
async copyIn(relativePath, source, options = {}) {
|
|
336
|
+
options.signal?.throwIfAborted();
|
|
337
337
|
assertValidRootDestinationPath(relativePath);
|
|
338
338
|
const { maxBytes, ...copyOptions } = this.mutationOptions(options);
|
|
339
339
|
await copyFileInRoot(this.context, {
|
|
340
|
-
|
|
340
|
+
source: typeof source === "string" ? source : { root: source.root, relativePath: source.relativePath },
|
|
341
341
|
relativePath,
|
|
342
342
|
maxBytes: normalizeMaxBytes(maxBytes, { defaultValue: this.defaults.maxBytes }),
|
|
343
343
|
mkdir: this.defaults.mkdir,
|
|
344
|
-
mode: this.defaults.mode,
|
|
345
344
|
...copyOptions,
|
|
346
|
-
|
|
345
|
+
mode: options.mode ?? this.defaults.mode,
|
|
346
|
+
durable: options.durable ?? this.defaults.durable ?? true,
|
|
347
|
+
verifyPublished: options[onCopyPublication],
|
|
348
|
+
}).catch(rethrowMutationAuthorityError);
|
|
347
349
|
}
|
|
348
350
|
async exists(relativePath) {
|
|
349
351
|
try {
|
|
@@ -371,7 +373,8 @@ export class RootHandle {
|
|
|
371
373
|
assertValidRootRelativePath(fromRelative);
|
|
372
374
|
assertValidRootDestinationPath(toRelative);
|
|
373
375
|
validatePinnedOperationPayload({ from: fromRelative, to: toRelative });
|
|
374
|
-
const { denyMutations } = this.mutationOptions(options);
|
|
376
|
+
const { denyMutations, assertBeforeMutation, mutationSymlinks } = this.mutationOptions(options);
|
|
377
|
+
const overwrite = options.overwrite ?? false;
|
|
375
378
|
await assertMoveMutationAllowed(this.context, {
|
|
376
379
|
fromRelative,
|
|
377
380
|
toRelative,
|
|
@@ -380,53 +383,71 @@ export class RootHandle {
|
|
|
380
383
|
await movePathFallback(this.context, {
|
|
381
384
|
fromRelative,
|
|
382
385
|
denyMutations,
|
|
383
|
-
|
|
386
|
+
assertBeforeMutation,
|
|
387
|
+
mutationSymlinks,
|
|
388
|
+
overwrite,
|
|
384
389
|
toRelative,
|
|
390
|
+
}).catch(rethrowMutationAuthorityError);
|
|
391
|
+
}
|
|
392
|
+
entries(relativePath, options = {}) {
|
|
393
|
+
assertValidRootRelativePath(relativePath);
|
|
394
|
+
return entriesInRoot(this.context, relativePath, {
|
|
395
|
+
...options,
|
|
396
|
+
symlinks: options.symlinks ?? this.defaults.symlinks,
|
|
385
397
|
});
|
|
386
398
|
}
|
|
387
399
|
walk(relativePath, options) {
|
|
388
400
|
assertValidRootRelativePath(relativePath);
|
|
389
|
-
return walkRoot(
|
|
401
|
+
return walkRoot({
|
|
402
|
+
rootReal: this.rootReal,
|
|
403
|
+
stat: relative => this.stat(relative),
|
|
404
|
+
list: async (relative, listingOptions) => {
|
|
405
|
+
validatePinnedOperationPayload({ relativePath: relative });
|
|
406
|
+
const resolved = await resolvePinnedPathInRoot(this.context, { relativePath: relative, allowRoot: true });
|
|
407
|
+
return await openRootDirectoryListing(this.context, resolved.resolved, listingOptions);
|
|
408
|
+
},
|
|
409
|
+
}, relativePath, options);
|
|
390
410
|
}
|
|
391
411
|
}
|
|
392
|
-
function readDefaults(defaults) {
|
|
393
|
-
return {
|
|
394
|
-
hardlinks: defaults.hardlinks,
|
|
395
|
-
maxBytes: normalizeMaxBytes(defaults.maxBytes, { defaultValue: DEFAULT_ROOT_MAX_BYTES }),
|
|
396
|
-
symlinks: defaults.symlinks,
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
function mergeReadOptions(defaults, options) {
|
|
400
|
-
const merged = readDefaults(defaults);
|
|
401
|
-
if (options.hardlinks !== undefined)
|
|
402
|
-
merged.hardlinks = options.hardlinks;
|
|
403
|
-
merged.maxBytes = normalizeMaxBytes(options.maxBytes, { defaultValue: merged.maxBytes });
|
|
404
|
-
if (options.symlinks !== undefined)
|
|
405
|
-
merged.symlinks = options.symlinks;
|
|
406
|
-
return merged;
|
|
407
|
-
}
|
|
408
412
|
export async function root(rootDir, defaults = {}) {
|
|
409
413
|
normalizeMaxBytes(defaults.maxBytes);
|
|
410
414
|
return new RootHandle(await resolveRootContext(rootDir), defaults);
|
|
411
415
|
}
|
|
416
|
+
// Internal callers that already hold an exact admitted directory capability must
|
|
417
|
+
// not recapture a different filesystem object while constructing the Root.
|
|
418
|
+
export function rootFromDirectoryGuard(guard, defaults = {}) {
|
|
419
|
+
normalizeMaxBytes(defaults.maxBytes);
|
|
420
|
+
return new RootHandle({
|
|
421
|
+
rootDir: resolvePathPreservingWindowsRoot(guard.dir),
|
|
422
|
+
rootGuard: { dir: guard.realPath, realPath: guard.realPath, stat: guard.stat },
|
|
423
|
+
rootIdentity: { dev: guard.stat.dev, ino: guard.stat.ino },
|
|
424
|
+
rootReal: guard.realPath,
|
|
425
|
+
rootWithSep: ensureTrailingSep(guard.realPath),
|
|
426
|
+
}, defaults);
|
|
427
|
+
}
|
|
412
428
|
async function openFileInRoot(root, params) {
|
|
413
|
-
const {
|
|
429
|
+
const { resolved } = await resolvePathInRoot(root, params.relativePath, {
|
|
414
430
|
allowFinalSymlink: true,
|
|
415
431
|
rejectUnsafeDeviceReads: true,
|
|
416
|
-
|
|
432
|
+
...readSymlinkResolution(params.symlinks),
|
|
433
|
+
resolveCanonical: true,
|
|
417
434
|
});
|
|
418
|
-
const
|
|
435
|
+
const fsSafeTestHooks = getFsSafeTestHooks();
|
|
436
|
+
if (fsSafeTestHooks?.afterRootReadPathResolution) {
|
|
437
|
+
await fsSafeTestHooks.afterRootReadPathResolution(resolved);
|
|
438
|
+
}
|
|
439
|
+
const { handle, stat, identity } = await openLocalFileDescriptor(resolved, {
|
|
419
440
|
symlinks: params.symlinks,
|
|
420
441
|
});
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
}
|
|
429
|
-
return
|
|
442
|
+
// The admission helper owns the descriptor until the complete root/file/root
|
|
443
|
+
// fence succeeds, then transfers that still-open handle to the caller.
|
|
444
|
+
const admitted = await admitRootReadHandle({
|
|
445
|
+
root, filePath: resolved, opened: { handle, stat }, identity,
|
|
446
|
+
hardlinks: params.hardlinks, symlinks: params.symlinks,
|
|
447
|
+
beforeFinalFence: fsSafeTestHooks?.beforeRootReadFinalFence,
|
|
448
|
+
afterPathIdentityCheck: fsSafeTestHooks?.afterRootReadFinalPathIdentityCheck,
|
|
449
|
+
});
|
|
450
|
+
return openResult(admitted);
|
|
430
451
|
}
|
|
431
452
|
async function readFileInRoot(root, params) {
|
|
432
453
|
const opened = await openFileInRoot(root, params);
|
|
@@ -457,8 +478,10 @@ export async function readLocalFileSafely(params) {
|
|
|
457
478
|
}
|
|
458
479
|
}
|
|
459
480
|
export async function openLocalFileSafely(params) {
|
|
460
|
-
|
|
461
|
-
|
|
481
|
+
const filePath = params.filePath;
|
|
482
|
+
assertNoNulPathInput(filePath, "file path contains a NUL byte");
|
|
483
|
+
assertNoWindowsPathAlias(filePath, "filesystem", "file path uses a Windows filesystem namespace alias");
|
|
484
|
+
return (await openVerifiedLocalFile(filePath)).opened;
|
|
462
485
|
}
|
|
463
486
|
function emitWriteBoundaryWarning(reason) {
|
|
464
487
|
logWarn(`security: fs-safe write boundary warning (${reason})`);
|
|
@@ -469,70 +492,38 @@ function buildAtomicWriteTempPath(targetPath) {
|
|
|
469
492
|
function rootWriteQueueKey(root, relativePath) {
|
|
470
493
|
return `${root.rootReal}\0${relativePath}`;
|
|
471
494
|
}
|
|
472
|
-
async function prepareRootWriteTarget(rootReal, targetPath) {
|
|
473
|
-
const parentPath = await mkdirPathComponentsWithGuards({
|
|
474
|
-
rootReal,
|
|
475
|
-
targetPath: path.dirname(targetPath),
|
|
476
|
-
});
|
|
477
|
-
// Continue through the guarded walk's real parent instead of re-entering
|
|
478
|
-
// the original path through a symlinked component.
|
|
479
|
-
return path.join(parentPath, path.basename(targetPath));
|
|
480
|
-
}
|
|
481
|
-
async function writeTempFileForAtomicReplace(params) {
|
|
482
|
-
const tempHandle = await fs.open(params.tempPath, OPEN_WRITE_CREATE_FLAGS, params.mode);
|
|
483
|
-
try {
|
|
484
|
-
if (typeof params.data === "string") {
|
|
485
|
-
await tempHandle.writeFile(params.data, params.encoding ?? "utf8");
|
|
486
|
-
}
|
|
487
|
-
else {
|
|
488
|
-
await tempHandle.writeFile(params.data);
|
|
489
|
-
}
|
|
490
|
-
return {
|
|
491
|
-
handle: tempHandle,
|
|
492
|
-
identity: fsSync.fstatSync(tempHandle.fd, { bigint: true }),
|
|
493
|
-
};
|
|
494
|
-
}
|
|
495
|
-
catch (error) {
|
|
496
|
-
await tempHandle.close().catch(() => { });
|
|
497
|
-
throw error;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
async function resolveGuardedWritePathInRoot(root, params) {
|
|
501
|
-
const resolvedPath = await resolvePathInRoot(root, params.relativePath, {
|
|
502
|
-
aliasErrorCode: "path-alias",
|
|
503
|
-
allowFinalSymlink: params.allowFinalSymlink,
|
|
504
|
-
});
|
|
505
|
-
await assertMutationNotDenied(resolvedPath.resolved, params.denyMutations, params.protectDeniedAncestors ? { protectAncestors: true } : undefined);
|
|
506
|
-
if (await (params.shouldAssertNoPathAlias?.(resolvedPath) ?? true)) {
|
|
507
|
-
try {
|
|
508
|
-
await assertNoPathAliasEscape({
|
|
509
|
-
absolutePath: resolvedPath.resolved,
|
|
510
|
-
rootPath: resolvedPath.rootReal,
|
|
511
|
-
boundaryLabel: "root",
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
catch (error) {
|
|
515
|
-
throw new FsSafeError("path-alias", "path alias escape blocked", {
|
|
516
|
-
cause: error instanceof Error ? error : undefined,
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
return resolvedPath;
|
|
521
|
-
}
|
|
522
495
|
async function openWritableFileInRoot(root, params) {
|
|
523
|
-
const
|
|
496
|
+
const guardedTarget = params.denyMutations === undefined && params.mutationSymlinks === undefined
|
|
497
|
+
? undefined
|
|
498
|
+
: await resolveGuardedWriteTargetInRoot(root, {
|
|
499
|
+
relativePath: params.relativePath,
|
|
500
|
+
denyMutations: params.denyMutations,
|
|
501
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
502
|
+
});
|
|
503
|
+
const { resolved } = guardedTarget?.resolvedPath ?? await resolveGuardedWritePathInRoot(root, {
|
|
524
504
|
relativePath: params.relativePath,
|
|
525
|
-
denyMutations: params.denyMutations,
|
|
526
505
|
});
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
:
|
|
506
|
+
const prepared = guardedTarget ? await prepareSharedRootWriteTarget(root, {
|
|
507
|
+
relativePath: params.relativePath, guardedTarget, mkdir: params.mkdir,
|
|
508
|
+
assertBeforeMutation: params.assertBeforeMutation,
|
|
509
|
+
}) : undefined;
|
|
510
|
+
const mutationAdmission = prepared?.mutationAdmission;
|
|
511
|
+
const preparedParent = prepared?.preparedParent;
|
|
512
|
+
let ioPath = prepared?.targetPath ?? (params.mkdir === false ? resolved :
|
|
513
|
+
await prepareRootWriteTarget(root, resolved, params.assertBeforeMutation));
|
|
514
|
+
const operationTargetPath = ioPath;
|
|
530
515
|
try {
|
|
531
|
-
|
|
532
|
-
|
|
516
|
+
assertFinalSymlinkRejected(ioPath, params.mutationSymlinks !== undefined);
|
|
517
|
+
const resolvedRealPath = params.mutationSymlinks === undefined ? realpathSync.native(ioPath) : ioPath;
|
|
518
|
+
const admittedRealPath = admitPathInsideRoot({
|
|
519
|
+
rootPath: root.rootReal,
|
|
520
|
+
candidatePath: resolvedRealPath,
|
|
521
|
+
rootIdentity: root.rootIdentity,
|
|
522
|
+
});
|
|
523
|
+
if (!admittedRealPath) {
|
|
533
524
|
throw outsideWorkspaceError();
|
|
534
525
|
}
|
|
535
|
-
ioPath =
|
|
526
|
+
ioPath = admittedRealPath.path;
|
|
536
527
|
}
|
|
537
528
|
catch (err) {
|
|
538
529
|
if (err instanceof FsSafeError) {
|
|
@@ -542,13 +533,20 @@ async function openWritableFileInRoot(root, params) {
|
|
|
542
533
|
throw err;
|
|
543
534
|
}
|
|
544
535
|
}
|
|
536
|
+
assertRootFallbackWritePath(params.expectedWritePath, ioPath);
|
|
545
537
|
const mode = params.mode ?? 0o600;
|
|
546
538
|
let handle;
|
|
547
539
|
let createdForWrite = false;
|
|
540
|
+
let writePathSelection = undefined;
|
|
548
541
|
const existingFlags = params.append ? OPEN_APPEND_EXISTING_FLAGS : OPEN_WRITE_EXISTING_FLAGS;
|
|
549
542
|
const createFlags = params.append ? OPEN_APPEND_CREATE_FLAGS : OPEN_WRITE_CREATE_FLAGS;
|
|
550
543
|
try {
|
|
544
|
+
writePathSelection = guardedTarget
|
|
545
|
+
? await prepareGuardedRootWritePathSelection(guardedTarget, ioPath, operationTargetPath, preparedParent)
|
|
546
|
+
: undefined;
|
|
551
547
|
try {
|
|
548
|
+
if (writePathSelection)
|
|
549
|
+
assertRootWritePathSelectionSync(root, writePathSelection);
|
|
552
550
|
handle = await fs.open(ioPath, existingFlags, mode);
|
|
553
551
|
}
|
|
554
552
|
catch (err) {
|
|
@@ -558,6 +556,11 @@ async function openWritableFileInRoot(root, params) {
|
|
|
558
556
|
if (!isNotFoundPathError(err)) {
|
|
559
557
|
throw err;
|
|
560
558
|
}
|
|
559
|
+
if (writePathSelection)
|
|
560
|
+
await refreshRootWritePathSelection(writePathSelection);
|
|
561
|
+
params.assertBeforeMutation?.();
|
|
562
|
+
if (writePathSelection)
|
|
563
|
+
assertRootWritePathSelectionSync(root, writePathSelection);
|
|
561
564
|
handle = await fs.open(ioPath, createFlags, mode);
|
|
562
565
|
createdForWrite = true;
|
|
563
566
|
}
|
|
@@ -578,47 +581,91 @@ async function openWritableFileInRoot(root, params) {
|
|
|
578
581
|
let createdIdentity = null;
|
|
579
582
|
try {
|
|
580
583
|
const stat = fsSync.fstatSync(handle.fd);
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
throw new FsSafeError("not-file", "path is not a regular file under root");
|
|
586
|
-
}
|
|
587
|
-
if (stat.nlink > 1) {
|
|
588
|
-
throw hardlinkedPathNotAllowedError();
|
|
589
|
-
}
|
|
590
|
-
try {
|
|
591
|
-
const lstat = fsSync.lstatSync(ioPath);
|
|
592
|
-
if (lstat.isSymbolicLink() || !lstat.isFile()) {
|
|
593
|
-
throw new FsSafeError(lstat.isSymbolicLink() ? "symlink" : "not-file", "path is not a regular file under root");
|
|
594
|
-
}
|
|
595
|
-
if (!sameFileIdentity(stat, lstat)) {
|
|
596
|
-
throw new FsSafeError("path-mismatch", "path changed during write");
|
|
584
|
+
const identity = inspectFileIdentitySync(() => {
|
|
585
|
+
const observed = fsSync.fstatSync(handle.fd, { bigint: true });
|
|
586
|
+
if (!observed.isFile()) {
|
|
587
|
+
throw new FsSafeError("not-file", "path is not a regular file under root");
|
|
597
588
|
}
|
|
589
|
+
if (observed.nlink > 1n)
|
|
590
|
+
throw hardlinkedPathNotAllowedError();
|
|
591
|
+
return observed;
|
|
592
|
+
});
|
|
593
|
+
if (createdForWrite)
|
|
594
|
+
createdIdentity = identity;
|
|
595
|
+
let observedIoPath = false;
|
|
596
|
+
try {
|
|
597
|
+
inspectFileIdentitySync(() => {
|
|
598
|
+
const lstat = fsSync.lstatSync(ioPath, { bigint: true });
|
|
599
|
+
observedIoPath = true;
|
|
600
|
+
if (lstat.isSymbolicLink() || !lstat.isFile()) {
|
|
601
|
+
throw new FsSafeError(lstat.isSymbolicLink() ? "symlink" : "not-file", "path is not a regular file under root");
|
|
602
|
+
}
|
|
603
|
+
if (lstat.nlink > 1n)
|
|
604
|
+
throw hardlinkedPathNotAllowedError();
|
|
605
|
+
return lstat;
|
|
606
|
+
}, identity);
|
|
598
607
|
}
|
|
599
608
|
catch (err) {
|
|
600
|
-
if (
|
|
609
|
+
if (isNotFoundPathError(err) && !observedIoPath) {
|
|
610
|
+
// The opened file may have been renamed before its first pathname
|
|
611
|
+
// observation. The descriptor-bound resolver below must still find it.
|
|
612
|
+
}
|
|
613
|
+
else if (err instanceof FsSafeError && err.code === "path-mismatch") {
|
|
614
|
+
throw new FsSafeError("path-mismatch", "path changed during write", { cause: err });
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
601
617
|
throw err;
|
|
602
618
|
}
|
|
603
619
|
}
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
620
|
+
let realPath = (await resolveOpenedFileRealPathForFd(handle.fd, identity, ioPath)).realPath;
|
|
621
|
+
assertNoWindowsPathAlias(realPath, "filesystem", "resolved file path uses a Windows filesystem namespace alias");
|
|
622
|
+
try {
|
|
623
|
+
inspectFileIdentitySync(() => {
|
|
624
|
+
const realStat = fsSync.statSync(realPath, { bigint: true });
|
|
625
|
+
if (!realStat.isFile()) {
|
|
626
|
+
throw new FsSafeError("not-file", "path is not a regular file under root");
|
|
627
|
+
}
|
|
628
|
+
if (realStat.nlink > 1n)
|
|
629
|
+
throw hardlinkedPathNotAllowedError();
|
|
630
|
+
return realStat;
|
|
631
|
+
}, identity);
|
|
609
632
|
}
|
|
610
|
-
|
|
611
|
-
|
|
633
|
+
catch (err) {
|
|
634
|
+
if (err instanceof FsSafeError && err.code === "path-mismatch") {
|
|
635
|
+
throw new FsSafeError("path-mismatch", "path mismatch", { cause: err });
|
|
636
|
+
}
|
|
637
|
+
throw err;
|
|
612
638
|
}
|
|
613
|
-
|
|
639
|
+
const admittedRealPath = admitPathInsideRoot({
|
|
640
|
+
rootPath: root.rootReal,
|
|
641
|
+
candidatePath: realPath,
|
|
642
|
+
rootIdentity: root.rootIdentity,
|
|
643
|
+
});
|
|
644
|
+
if (!admittedRealPath) {
|
|
614
645
|
throw outsideWorkspaceError();
|
|
615
646
|
}
|
|
647
|
+
realPath = admittedRealPath.path;
|
|
648
|
+
realPathForCleanup = realPath;
|
|
649
|
+
assertRootFallbackWritePath(params.expectedWritePath, realPath);
|
|
650
|
+
const writeSelection = writePathSelection
|
|
651
|
+
? createRootWriteSelectionForFd(writePathSelection, handle.fd)
|
|
652
|
+
: undefined;
|
|
616
653
|
// Truncate only after boundary and identity checks complete. This avoids
|
|
617
654
|
// irreversible side effects if a symlink target changes before validation.
|
|
618
655
|
if (params.append !== true && params.truncateExisting !== false && !createdForWrite) {
|
|
656
|
+
if (writeSelection)
|
|
657
|
+
await refreshRetainedRootWriteAdmission(root, writeSelection, true, handle.fd);
|
|
658
|
+
assertFinalSymlinkRejected(ioPath, params.mutationSymlinks !== undefined);
|
|
659
|
+
params.assertBeforeMutation?.();
|
|
660
|
+
if (writeSelection)
|
|
661
|
+
assertRootWriteSelectionSync(root, writeSelection, true, handle.fd);
|
|
619
662
|
await handle.truncate(0);
|
|
620
663
|
}
|
|
621
|
-
|
|
664
|
+
if (writeSelection) {
|
|
665
|
+
await refreshRetainedRootWriteAdmission(root, writeSelection, true, handle.fd);
|
|
666
|
+
assertRootWriteSelectionSync(root, writeSelection, true, handle.fd);
|
|
667
|
+
}
|
|
668
|
+
const result = {
|
|
622
669
|
handle,
|
|
623
670
|
containment: "best-effort",
|
|
624
671
|
createdForWrite,
|
|
@@ -626,6 +673,9 @@ async function openWritableFileInRoot(root, params) {
|
|
|
626
673
|
stat,
|
|
627
674
|
[Symbol.asyncDispose]: () => handle.close().catch(() => undefined),
|
|
628
675
|
};
|
|
676
|
+
if (writeSelection)
|
|
677
|
+
retainRootWriteSelection(result, writeSelection);
|
|
678
|
+
return { opened: result, identity };
|
|
629
679
|
}
|
|
630
680
|
catch (err) {
|
|
631
681
|
const cleanupCreatedPath = createdForWrite && err instanceof FsSafeError;
|
|
@@ -638,82 +688,150 @@ async function openWritableFileInRoot(root, params) {
|
|
|
638
688
|
}
|
|
639
689
|
}
|
|
640
690
|
async function appendFileInRoot(root, params) {
|
|
641
|
-
const
|
|
642
|
-
relativePath: params.relativePath,
|
|
643
|
-
mkdir: params.mkdir,
|
|
644
|
-
mode: params.mode,
|
|
645
|
-
denyMutations: params.denyMutations,
|
|
646
|
-
truncateExisting: false,
|
|
647
|
-
append: true,
|
|
648
|
-
});
|
|
691
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
649
692
|
try {
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
693
|
+
const { opened: target, identity } = await openWritableFileInRoot(root, {
|
|
694
|
+
relativePath: params.relativePath,
|
|
695
|
+
mkdir: params.mkdir,
|
|
696
|
+
mode: params.mode,
|
|
697
|
+
denyMutations: params.denyMutations,
|
|
698
|
+
assertBeforeMutation: params.assertBeforeMutation,
|
|
699
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
700
|
+
truncateExisting: false,
|
|
701
|
+
append: true,
|
|
702
|
+
});
|
|
703
|
+
let dispatched = false;
|
|
704
|
+
// Reverse disposal order closes the handle before path cleanup and retains both failures.
|
|
705
|
+
const cleanup = __addDisposableResource(env_1, {
|
|
706
|
+
async [Symbol.asyncDispose]() {
|
|
707
|
+
if (!dispatched && target.createdForWrite) {
|
|
708
|
+
await removePathIfIdentityUnchanged(target.realPath, identity);
|
|
709
|
+
}
|
|
710
|
+
},
|
|
711
|
+
}, true);
|
|
712
|
+
const handle = __addDisposableResource(env_1, target.handle, true);
|
|
713
|
+
try {
|
|
714
|
+
let prefix = "";
|
|
715
|
+
if (params.prependNewlineIfNeeded === true &&
|
|
716
|
+
!target.createdForWrite &&
|
|
717
|
+
target.stat.size > 0 &&
|
|
718
|
+
((typeof params.data === "string" && !params.data.startsWith("\n")) ||
|
|
719
|
+
(Buffer.isBuffer(params.data) && params.data.length > 0 && params.data[0] !== 0x0a))) {
|
|
720
|
+
const newline = Buffer.from("\n", typeof params.data === "string" ? params.encoding : "utf8");
|
|
721
|
+
const tail = Buffer.alloc(newline.length);
|
|
722
|
+
const { bytesRead } = await target.handle.read(tail, 0, tail.length, Math.max(0, target.stat.size - tail.length));
|
|
723
|
+
if (bytesRead > 0 && (bytesRead !== newline.length || !tail.equals(newline))) {
|
|
724
|
+
prefix = "\n";
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
const payload = typeof params.data === "string" ? `${prefix}${params.data}`
|
|
728
|
+
: prefix.length > 0 ? Buffer.concat([Buffer.from(prefix, "utf8"), params.data]) : params.data;
|
|
729
|
+
await writeAllToFile(target.handle, payload, {
|
|
730
|
+
encoding: params.encoding,
|
|
731
|
+
assertBeforeMutation: () => {
|
|
732
|
+
assertFinalSymlinkRejected(target.realPath, params.mutationSymlinks !== undefined);
|
|
733
|
+
params.assertBeforeMutation?.();
|
|
734
|
+
dispatched = true;
|
|
735
|
+
},
|
|
736
|
+
});
|
|
737
|
+
// A successful empty append still creates the file, as Node's appendFile does.
|
|
738
|
+
dispatched = true;
|
|
739
|
+
if (params.durable !== false)
|
|
740
|
+
await target.handle.sync();
|
|
741
|
+
if (params.durable !== false && target.createdForWrite) {
|
|
742
|
+
await syncDirectoryBestEffort(path.dirname(target.realPath));
|
|
660
743
|
}
|
|
661
744
|
}
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
}
|
|
665
|
-
else {
|
|
666
|
-
const payload = prefix.length > 0 ? Buffer.concat([Buffer.from(prefix, "utf8"), params.data]) : params.data;
|
|
667
|
-
await target.handle.appendFile(payload);
|
|
668
|
-
}
|
|
669
|
-
if (params.durable !== false)
|
|
670
|
-
await target.handle.sync();
|
|
671
|
-
if (params.durable !== false && target.createdForWrite) {
|
|
672
|
-
await syncDirectoryBestEffort(path.dirname(target.realPath));
|
|
745
|
+
catch (error) {
|
|
746
|
+
rethrowMutationAuthorityError(error);
|
|
673
747
|
}
|
|
674
748
|
}
|
|
749
|
+
catch (e_1) {
|
|
750
|
+
env_1.error = e_1;
|
|
751
|
+
env_1.hasError = true;
|
|
752
|
+
}
|
|
675
753
|
finally {
|
|
676
|
-
|
|
754
|
+
const result_1 = __disposeResources(env_1);
|
|
755
|
+
if (result_1)
|
|
756
|
+
await result_1;
|
|
677
757
|
}
|
|
678
758
|
}
|
|
679
759
|
async function removePathInRoot(root, params) {
|
|
680
760
|
validatePinnedOperationPayload({ relativePath: params.relativePath });
|
|
761
|
+
const removalReceipts = params.recursive ? undefined : new RemovalPathReceipts();
|
|
681
762
|
const resolved = await resolvePinnedPathInRoot(root, {
|
|
682
763
|
relativePath: params.relativePath,
|
|
683
764
|
denyMutations: params.denyMutations,
|
|
765
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
684
766
|
remove: true,
|
|
767
|
+
removalReceipts,
|
|
685
768
|
});
|
|
686
769
|
try {
|
|
687
|
-
await
|
|
770
|
+
await removePathInRootFallback(root, resolved.resolved, params, removalReceipts);
|
|
688
771
|
}
|
|
689
772
|
catch (error) {
|
|
773
|
+
if (params.recursive)
|
|
774
|
+
throw error;
|
|
690
775
|
throw normalizePinnedPathError(error);
|
|
691
776
|
}
|
|
692
777
|
}
|
|
693
778
|
async function mkdirPathInRoot(root, params) {
|
|
694
779
|
validatePinnedOperationPayload({ relativePath: params.relativePath });
|
|
695
|
-
const
|
|
780
|
+
const policy = params.denyMutations === undefined && params.mutationSymlinks === undefined
|
|
781
|
+
? undefined
|
|
782
|
+
: snapshotPinnedMutationPolicy(params.denyMutations, params.mutationSymlinks);
|
|
783
|
+
const resolveCurrent = policy
|
|
784
|
+
? async () => await resolvePinnedPathInRoot(root, {
|
|
785
|
+
...params,
|
|
786
|
+
denyMutations: policy.denyMutations,
|
|
787
|
+
mutationSymlinks: policy.mutationSymlinks,
|
|
788
|
+
})
|
|
789
|
+
: undefined;
|
|
790
|
+
const resolved = resolveCurrent
|
|
791
|
+
? await resolveCurrent()
|
|
792
|
+
: await resolvePinnedPathInRoot(root, params);
|
|
793
|
+
const prepared = policy && resolved.relativePosix !== ""
|
|
794
|
+
? await preparePinnedWriteMutationAdmission({
|
|
795
|
+
rootReal: resolved.rootReal,
|
|
796
|
+
rootWithSep: ensureTrailingSep(resolved.rootReal),
|
|
797
|
+
rootIdentity: root.rootIdentity,
|
|
798
|
+
resolvedTargetPath: resolved.resolved,
|
|
799
|
+
originalPath: params.relativePath,
|
|
800
|
+
defaultRelativeParentPath: path.posix.dirname(resolved.relativePosix) === "."
|
|
801
|
+
? ""
|
|
802
|
+
: path.posix.dirname(resolved.relativePosix),
|
|
803
|
+
policy,
|
|
804
|
+
resolveCurrent: resolveCurrent,
|
|
805
|
+
})
|
|
806
|
+
: undefined;
|
|
807
|
+
if (prepared?.mutationAdmission) {
|
|
808
|
+
await getFsSafeTestHooks()?.beforePinnedWriteParentAdmission?.(resolved.resolved);
|
|
809
|
+
}
|
|
696
810
|
try {
|
|
697
|
-
|
|
811
|
+
if (prepared?.mutationAdmission && params.assertBeforeMutation === undefined &&
|
|
812
|
+
await tryMkdirAtExactParent(root, resolved.resolved, prepared.mutationAdmission))
|
|
813
|
+
return;
|
|
814
|
+
await mkdirPathFallback(root, resolved, params.assertBeforeMutation, policy?.mutationSymlinks !== undefined, prepared?.mutationAdmission);
|
|
698
815
|
}
|
|
699
816
|
catch (error) {
|
|
700
817
|
throw normalizePinnedPathError(error);
|
|
701
818
|
}
|
|
702
819
|
}
|
|
703
820
|
async function writeFileInRoot(root, params) {
|
|
821
|
+
const input = rootWriteInput(params);
|
|
704
822
|
await serializePathWrite(rootWriteQueueKey(root, params.relativePath), async () => {
|
|
705
|
-
if (process.platform === "win32" &&
|
|
823
|
+
if (input.kind === "buffer" && process.platform === "win32" &&
|
|
706
824
|
(params.renameIdentity === "verify-content-with-lock" || !getNativeBinding())) {
|
|
707
|
-
await writeFileFallback(root, params);
|
|
825
|
+
await writeFileFallback(root, { ...params, data: input.data });
|
|
708
826
|
return;
|
|
709
827
|
}
|
|
710
|
-
const pinned = await resolvePinnedWriteTargetInRoot(root, params.relativePath, params.mode, params.denyMutations, params.overwrite);
|
|
828
|
+
const pinned = await resolvePinnedWriteTargetInRoot(root, params.relativePath, params.mode, params.denyMutations, params.overwrite, params.mutationSymlinks);
|
|
711
829
|
await serializePathWrite(pinned.targetPath, async () => {
|
|
712
|
-
await commitPinnedWriteInRoot(root, pinned, params);
|
|
830
|
+
await commitPinnedWriteInRoot(root, pinned, params, input);
|
|
713
831
|
});
|
|
714
832
|
});
|
|
715
833
|
}
|
|
716
|
-
async function commitPinnedWriteInRoot(root, pinned, params) {
|
|
834
|
+
async function commitPinnedWriteInRoot(root, pinned, params, input) {
|
|
717
835
|
let verifyingPublication = false;
|
|
718
836
|
try {
|
|
719
837
|
await runPinnedWriteWithRenamePolicy({
|
|
@@ -726,8 +844,12 @@ async function commitPinnedWriteInRoot(root, pinned, params) {
|
|
|
726
844
|
mode: params.mode ?? pinned.mode,
|
|
727
845
|
sync: params.durable !== false,
|
|
728
846
|
overwrite: params.overwrite,
|
|
729
|
-
|
|
847
|
+
rejectFinalSymlink: params.mutationSymlinks !== undefined,
|
|
848
|
+
input,
|
|
849
|
+
maxBytes: params.maxBytes,
|
|
730
850
|
rootIdentity: root.rootIdentity,
|
|
851
|
+
mutationAdmission: pinned.mutationAdmission,
|
|
852
|
+
assertBeforeMutation: params.assertBeforeMutation,
|
|
731
853
|
verifyPublished: async (fd, expectedIdentity, parentGuard) => {
|
|
732
854
|
verifyingPublication = true;
|
|
733
855
|
try {
|
|
@@ -762,44 +884,77 @@ async function commitPinnedWriteInRoot(root, pinned, params) {
|
|
|
762
884
|
}
|
|
763
885
|
}
|
|
764
886
|
async function copyFileInRoot(root, params) {
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
887
|
+
params.signal?.throwIfAborted();
|
|
888
|
+
const clone = resolveFileCopyCloneMode(params.clone);
|
|
889
|
+
let source;
|
|
890
|
+
let sourceIdentity;
|
|
891
|
+
if (typeof params.source === "string") {
|
|
892
|
+
assertNoNulPathInput(params.source, "source path contains a NUL byte");
|
|
893
|
+
assertNoWindowsPathAlias(params.source, "filesystem", "source path uses a Windows filesystem namespace alias");
|
|
894
|
+
({ opened: source, identity: sourceIdentity } = await openVerifiedLocalFile(params.source, {
|
|
895
|
+
hardlinks: params.sourceHardlinks,
|
|
896
|
+
}));
|
|
897
|
+
}
|
|
898
|
+
else {
|
|
899
|
+
source = await params.source.root.open(params.source.relativePath, params.sourceHardlinks === undefined ? undefined : { hardlinks: params.sourceHardlinks });
|
|
900
|
+
try {
|
|
901
|
+
sourceIdentity = await inspectFileIdentity(() => fsSync.fstatSync(source.handle.fd, { bigint: true }));
|
|
902
|
+
}
|
|
903
|
+
catch (error) {
|
|
904
|
+
await source.handle.close().catch(() => undefined);
|
|
905
|
+
throw error;
|
|
906
|
+
}
|
|
907
|
+
}
|
|
770
908
|
if (params.maxBytes !== undefined && source.stat.size > params.maxBytes) {
|
|
771
909
|
await source.handle.close().catch(() => { });
|
|
772
910
|
throw new FsSafeError("too-large", `file exceeds limit of ${params.maxBytes} bytes (got ${source.stat.size})`);
|
|
773
911
|
}
|
|
774
912
|
try {
|
|
775
913
|
await serializePathWrite(rootWriteQueueKey(root, params.relativePath), async () => {
|
|
776
|
-
const pinned = await resolvePinnedWriteTargetInRoot(root, params.relativePath, params.mode, params.denyMutations);
|
|
914
|
+
const pinned = await resolvePinnedWriteTargetInRoot(root, params.relativePath, params.mode ?? (params.preserveSourceMode ? Number(sourceIdentity.mode & 4095n) : undefined), params.denyMutations, params.overwrite !== false, params.mutationSymlinks);
|
|
777
915
|
await serializePathWrite(pinned.targetPath, async () => {
|
|
778
916
|
await assertCopySourceCurrent(source, sourceIdentity);
|
|
779
|
-
|
|
917
|
+
const verifySource = async () => {
|
|
918
|
+
params.signal?.throwIfAborted();
|
|
919
|
+
if (typeof params.source !== "string") {
|
|
920
|
+
await params.source.root.stat(".");
|
|
921
|
+
}
|
|
922
|
+
await assertCopySourceCurrent(source, sourceIdentity);
|
|
923
|
+
};
|
|
924
|
+
const observer = createCopyPublicationObserver(pinned.targetPath, params.onDestinationPublished);
|
|
780
925
|
try {
|
|
781
|
-
|
|
926
|
+
await runPinnedWriteHelper({
|
|
782
927
|
rootPath: pinned.rootReal,
|
|
783
928
|
relativeParentPath: pinned.relativeParentPath,
|
|
784
929
|
basename: pinned.basename,
|
|
785
930
|
mkdir: params.mkdir !== false,
|
|
786
931
|
mode: pinned.mode,
|
|
787
|
-
overwrite:
|
|
932
|
+
overwrite: params.overwrite !== false,
|
|
933
|
+
rejectFinalSymlink: params.mutationSymlinks !== undefined,
|
|
788
934
|
maxBytes: params.maxBytes,
|
|
789
|
-
|
|
935
|
+
sync: params.durable !== false,
|
|
936
|
+
assertBeforeMutation: () => {
|
|
937
|
+
if (params.signal?.aborted)
|
|
938
|
+
throw new MutationAuthorityError(params.signal.reason);
|
|
939
|
+
params.assertBeforeMutation?.();
|
|
940
|
+
},
|
|
941
|
+
verifyPublished: params.verifyPublished,
|
|
942
|
+
onPublished: observer.onPublished,
|
|
943
|
+
input: { kind: "file", handle: source.handle, size: source.stat.size, clone, signal: params.signal, verifySource },
|
|
790
944
|
rootIdentity: root.rootIdentity,
|
|
945
|
+
mutationAdmission: pinned.mutationAdmission,
|
|
791
946
|
});
|
|
792
947
|
}
|
|
793
948
|
catch (error) {
|
|
949
|
+
observer.rethrowObserverFailure(error);
|
|
950
|
+
if (params.signal?.aborted && error === params.signal.reason)
|
|
951
|
+
throw error;
|
|
952
|
+
if (isAlreadyExistsError(error)) {
|
|
953
|
+
throw new FsSafeError("already-exists", "copy destination already exists", { cause: error });
|
|
954
|
+
}
|
|
794
955
|
throw normalizePinnedWriteError(error);
|
|
795
956
|
}
|
|
796
|
-
|
|
797
|
-
await assertCopySourcePathCurrent(source, sourceIdentity);
|
|
798
|
-
}
|
|
799
|
-
catch (error) {
|
|
800
|
-
await removePathIfIdentityUnchanged(pinned.targetPath, identity).catch(() => undefined);
|
|
801
|
-
throw error;
|
|
802
|
-
}
|
|
957
|
+
await verifySource();
|
|
803
958
|
});
|
|
804
959
|
});
|
|
805
960
|
}
|
|
@@ -807,87 +962,23 @@ async function copyFileInRoot(root, params) {
|
|
|
807
962
|
await source.handle.close().catch(() => { });
|
|
808
963
|
}
|
|
809
964
|
}
|
|
810
|
-
async function assertCopySourceCurrent(source, identity) {
|
|
811
|
-
await inspectFileIdentity(() => fsSync.fstatSync(source.handle.fd, { bigint: true }), identity);
|
|
812
|
-
await assertCopySourcePathCurrent(source, identity);
|
|
813
|
-
}
|
|
814
|
-
async function assertCopySourcePathCurrent(source, identity) {
|
|
815
|
-
await inspectFileIdentity(async () => {
|
|
816
|
-
const current = fsSync.lstatSync(source.realPath, { bigint: true });
|
|
817
|
-
if (current.isSymbolicLink() || !current.isFile()) {
|
|
818
|
-
throw new FsSafeError("path-mismatch", "copy source path changed");
|
|
819
|
-
}
|
|
820
|
-
return current;
|
|
821
|
-
}, identity);
|
|
822
|
-
}
|
|
823
|
-
async function removePathIfIdentityUnchanged(targetPath, identity) {
|
|
824
|
-
const parentGuard = await createAsyncDirectoryGuard(path.dirname(targetPath));
|
|
825
|
-
const current = fsSync.lstatSync(targetPath);
|
|
826
|
-
if (current.isSymbolicLink() || !sameFileIdentityForCleanup(current, identity)) {
|
|
827
|
-
return;
|
|
828
|
-
}
|
|
829
|
-
await withAsyncDirectoryGuards([parentGuard], async () => {
|
|
830
|
-
await fs.rm(targetPath);
|
|
831
|
-
});
|
|
832
|
-
}
|
|
833
|
-
async function resolvePinnedWriteTargetInRoot(root, relativePath, requestedMode, denyMutations, overwrite = true) {
|
|
834
|
-
const { rootReal, rootWithSep, resolved } = await resolveGuardedWritePathInRoot(root, {
|
|
835
|
-
relativePath,
|
|
836
|
-
denyMutations,
|
|
837
|
-
});
|
|
838
|
-
// resolvePathInRoot already enforces isPathInside, so any actual escape
|
|
839
|
-
// is rejected upstream.
|
|
840
|
-
const relativeResolved = path.relative(rootReal, resolved);
|
|
841
|
-
if (path.isAbsolute(relativeResolved)) {
|
|
842
|
-
throw outsideWorkspaceError();
|
|
843
|
-
}
|
|
844
|
-
const relativePosix = relativeResolved
|
|
845
|
-
? relativeResolved.split(path.sep).join(path.posix.sep)
|
|
846
|
-
: "";
|
|
847
|
-
const basename = path.posix.basename(relativePosix);
|
|
848
|
-
if (!basename || basename === "." || basename === "/") {
|
|
849
|
-
throw new FsSafeError("invalid-path", "invalid target path");
|
|
850
|
-
}
|
|
851
|
-
// Exclusive publication cannot inherit an existing file's mode. Keep type
|
|
852
|
-
// and alias checks, but never open a competing owner's record just to reject it.
|
|
853
|
-
if (!overwrite) {
|
|
854
|
-
try {
|
|
855
|
-
const existing = fsSync.statSync(resolved);
|
|
856
|
-
if (!existing.isFile())
|
|
857
|
-
throw new FsSafeError("not-file", "not a file");
|
|
858
|
-
if (existing.nlink > 1)
|
|
859
|
-
throw hardlinkedPathNotAllowedError();
|
|
860
|
-
throw new FsSafeError("already-exists", "file already exists");
|
|
861
|
-
}
|
|
862
|
-
catch (error) {
|
|
863
|
-
if (!isNotFoundPathError(error))
|
|
864
|
-
throw error;
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
const mode = overwrite
|
|
868
|
-
? await inheritWriteTargetMode({ targetPath: resolved, rootWithSep, requestedMode })
|
|
869
|
-
: requestedMode ?? 0o600;
|
|
870
|
-
return {
|
|
871
|
-
rootReal,
|
|
872
|
-
targetPath: resolved,
|
|
873
|
-
relativeParentPath: path.posix.dirname(relativePosix) === "." ? "" : path.posix.dirname(relativePosix),
|
|
874
|
-
basename,
|
|
875
|
-
mode,
|
|
876
|
-
};
|
|
877
|
-
}
|
|
878
965
|
async function resolvePinnedPathInRoot(root, params) {
|
|
879
966
|
return await resolvePinnedOperationPathInRoot(root, {
|
|
880
967
|
allowRoot: params.allowRoot,
|
|
881
968
|
denyMutations: params.denyMutations,
|
|
969
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
882
970
|
protectDenyMutationAncestors: params.remove === true,
|
|
883
971
|
relativePath: params.relativePath,
|
|
884
972
|
policy: params.remove ? PATH_ALIAS_POLICIES.unlinkTarget : PATH_ALIAS_POLICIES.strict,
|
|
973
|
+
removalReceipts: params.removalReceipts,
|
|
885
974
|
});
|
|
886
975
|
}
|
|
887
976
|
async function resolvePinnedOperationPathInRoot(root, params) {
|
|
888
977
|
const resolved = await resolvePinnedRootPathInRoot(root, {
|
|
889
978
|
relativePath: params.relativePath,
|
|
890
979
|
policy: params.policy,
|
|
980
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
981
|
+
removalReceipts: params.removalReceipts,
|
|
891
982
|
});
|
|
892
983
|
const relativeResolved = path.relative(resolved.rootReal, resolved.canonicalPath);
|
|
893
984
|
if ((relativeResolved === "" || relativeResolved === ".") && params.allowRoot === true) {
|
|
@@ -902,31 +993,42 @@ async function resolvePinnedOperationPathInRoot(root, params) {
|
|
|
902
993
|
throw outsideWorkspaceError();
|
|
903
994
|
}
|
|
904
995
|
const relativePosix = relativeResolved.split(path.sep).join(path.posix.sep);
|
|
905
|
-
|
|
996
|
+
const admittedCanonicalPath = admitPathInsideRoot({
|
|
997
|
+
rootPath: resolved.rootReal,
|
|
998
|
+
candidatePath: resolved.canonicalPath,
|
|
999
|
+
rootIdentity: root.rootIdentity,
|
|
1000
|
+
});
|
|
1001
|
+
if (!admittedCanonicalPath) {
|
|
906
1002
|
throw outsideWorkspaceError();
|
|
907
1003
|
}
|
|
1004
|
+
resolved.canonicalPath = admittedCanonicalPath.path;
|
|
908
1005
|
await assertMutationNotDenied(resolved.canonicalPath, params.denyMutations, {
|
|
909
1006
|
protectAncestors: params.protectDenyMutationAncestors,
|
|
910
1007
|
});
|
|
911
1008
|
return { rootReal: resolved.rootReal, resolved: resolved.canonicalPath, relativePosix };
|
|
912
1009
|
}
|
|
913
1010
|
async function resolvePinnedRootPathInRoot(root, params) {
|
|
914
|
-
await assertRootIdentityCurrent(root);
|
|
1011
|
+
await assertRootIdentityCurrent(root, params.removalReceipts?.observeRoot);
|
|
915
1012
|
const rootReal = root.rootReal;
|
|
916
1013
|
let resolved;
|
|
917
1014
|
try {
|
|
918
1015
|
const expandedPath = await expandRelativePathWithHome(params.relativePath);
|
|
919
|
-
|
|
1016
|
+
const resolution = {
|
|
920
1017
|
absolutePath: path.isAbsolute(expandedPath)
|
|
921
1018
|
? expandedPath
|
|
922
1019
|
: `${ensureTrailingSep(rootReal)}${expandedPath}`,
|
|
923
1020
|
rootPath: rootReal,
|
|
924
1021
|
rootCanonicalPath: rootReal,
|
|
1022
|
+
rootIdentity: root.rootIdentity,
|
|
925
1023
|
boundaryLabel: "root",
|
|
926
1024
|
policy: params.policy,
|
|
927
|
-
|
|
1025
|
+
...mutationSymlinkResolution(params.mutationSymlinks),
|
|
1026
|
+
};
|
|
1027
|
+
resolved = await (params.removalReceipts ? resolveRootPathForRemoval(resolution, params.removalReceipts) : resolveRootPath(resolution));
|
|
928
1028
|
}
|
|
929
1029
|
catch (err) {
|
|
1030
|
+
if (err instanceof FsSafeError && err.code === "symlink")
|
|
1031
|
+
throw err;
|
|
930
1032
|
throw new FsSafeError("path-alias", "path alias escape blocked", { cause: err });
|
|
931
1033
|
}
|
|
932
1034
|
const rootWithSep = ensureTrailingSep(resolved.rootCanonicalPath);
|
|
@@ -936,109 +1038,47 @@ async function resolvePinnedRootPathInRoot(root, params) {
|
|
|
936
1038
|
canonicalPath: resolved.canonicalPath,
|
|
937
1039
|
};
|
|
938
1040
|
}
|
|
939
|
-
async function prepareRemoveGuard(targetPath) {
|
|
940
|
-
try {
|
|
941
|
-
const guard = await createAsyncDirectoryGuard(path.dirname(targetPath));
|
|
942
|
-
await getFsSafeTestHooks()?.beforeRootFallbackMutation?.("remove", targetPath);
|
|
943
|
-
await assertAsyncDirectoryGuard(guard);
|
|
944
|
-
return guard;
|
|
945
|
-
}
|
|
946
|
-
catch (error) {
|
|
947
|
-
throw normalizeRemoveGuardError(error);
|
|
948
|
-
}
|
|
949
|
-
}
|
|
950
|
-
async function removePathFallback(resolved) {
|
|
951
|
-
const guard = await prepareRemoveGuard(resolved.resolved);
|
|
952
|
-
try {
|
|
953
|
-
await (fsSync.lstatSync(resolved.resolved).isDirectory() ? fs.rmdir(resolved.resolved) : fs.rm(resolved.resolved));
|
|
954
|
-
}
|
|
955
|
-
catch (error) {
|
|
956
|
-
throw normalizeRemovePathError(error);
|
|
957
|
-
}
|
|
958
|
-
await assertAsyncDirectoryGuard(guard).catch(() => undefined);
|
|
959
|
-
}
|
|
960
|
-
async function mkdirPathFallback(resolved) {
|
|
961
|
-
await mkdirPathComponentsWithGuards({
|
|
962
|
-
rootReal: resolved.rootReal, targetPath: resolved.resolved,
|
|
963
|
-
beforeComponent: async (componentPath) => await getFsSafeTestHooks()?.beforeRootFallbackMutation?.("mkdir", componentPath),
|
|
964
|
-
});
|
|
965
|
-
}
|
|
966
1041
|
async function statPathFallback(root, relativePath) {
|
|
967
|
-
const
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
await
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
if (isNotFoundPathError(error)) {
|
|
975
|
-
throw fileNotFoundError(error instanceof Error ? error : undefined);
|
|
976
|
-
}
|
|
977
|
-
throw error;
|
|
978
|
-
}
|
|
1042
|
+
const initialObservationHook = getFsSafeTestHooks()?.beforeRootStatInitialObservation;
|
|
1043
|
+
const observed = initialObservationHook
|
|
1044
|
+
? undefined
|
|
1045
|
+
: await resolvePinnedObservedPathInRoot(root, relativePath, "stat");
|
|
1046
|
+
const resolved = observed ??
|
|
1047
|
+
await resolvePinnedPathInRoot(root, { relativePath, allowRoot: true });
|
|
1048
|
+
return await statResolvedPathInRoot(root, resolved.resolved, resolved.receipt);
|
|
979
1049
|
}
|
|
980
1050
|
async function listPathFallback(root, relativePath, withFileTypes) {
|
|
981
|
-
const
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
if (!withFileTypes) {
|
|
986
|
-
await assertRootIdentityCurrent(root);
|
|
987
|
-
return sortedNames;
|
|
988
|
-
}
|
|
989
|
-
const entries = [];
|
|
990
|
-
for (const name of sortedNames) {
|
|
991
|
-
entries.push({
|
|
992
|
-
name,
|
|
993
|
-
...pathStatFromStats(fsSync.lstatSync(path.join(resolved.resolved, name))),
|
|
994
|
-
});
|
|
995
|
-
}
|
|
996
|
-
await assertRootIdentityCurrent(root);
|
|
997
|
-
return entries;
|
|
998
|
-
}
|
|
999
|
-
catch (error) {
|
|
1000
|
-
if (isNotFoundPathError(error)) {
|
|
1001
|
-
throw new FsSafeError("not-found", "directory not found", {
|
|
1002
|
-
cause: error instanceof Error ? error : undefined,
|
|
1003
|
-
});
|
|
1004
|
-
}
|
|
1005
|
-
throw error;
|
|
1006
|
-
}
|
|
1007
|
-
}
|
|
1008
|
-
async function assertMoveMutationAllowed(root, params) {
|
|
1009
|
-
// Keep this preflight separate from the pinned resolutions in movePathFallback:
|
|
1010
|
-
// mutation denials must take precedence over source alias or identity failures.
|
|
1011
|
-
const source = await resolvePathInRoot(root, params.fromRelative, {
|
|
1012
|
-
aliasErrorCode: "path-alias",
|
|
1013
|
-
allowFinalSymlink: true,
|
|
1014
|
-
});
|
|
1015
|
-
await assertMutationNotDenied(source.resolved, params.denyMutations, { protectAncestors: true });
|
|
1016
|
-
const target = await resolvePathInRoot(root, params.toRelative, {
|
|
1017
|
-
aliasErrorCode: "path-alias",
|
|
1018
|
-
allowFinalSymlink: true,
|
|
1019
|
-
});
|
|
1020
|
-
await assertMutationNotDenied(target.resolved, params.denyMutations, { protectAncestors: true });
|
|
1051
|
+
const observed = await resolvePinnedObservedPathInRoot(root, relativePath, "directory");
|
|
1052
|
+
const resolved = observed ??
|
|
1053
|
+
await resolvePinnedPathInRoot(root, { relativePath, allowRoot: true });
|
|
1054
|
+
return await listDirectoryPath(root, resolved.resolved, withFileTypes, resolved.receipt);
|
|
1021
1055
|
}
|
|
1022
1056
|
async function movePathFallback(root, params) {
|
|
1023
1057
|
const source = await resolvePathInRoot(root, params.fromRelative, {
|
|
1024
1058
|
aliasErrorCode: "path-alias",
|
|
1025
1059
|
allowFinalSymlink: true,
|
|
1060
|
+
...mutationSymlinkResolution(params.mutationSymlinks),
|
|
1026
1061
|
});
|
|
1027
1062
|
await assertMutationNotDenied(source.resolved, params.denyMutations, { protectAncestors: true });
|
|
1028
|
-
await resolvePinnedRootPathInRoot(root, {
|
|
1063
|
+
const pinnedSource = await resolvePinnedRootPathInRoot(root, {
|
|
1029
1064
|
relativePath: params.fromRelative,
|
|
1030
1065
|
policy: PATH_ALIAS_POLICIES.strict,
|
|
1066
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
1031
1067
|
});
|
|
1068
|
+
let pinnedTarget;
|
|
1032
1069
|
const target = await resolveGuardedWritePathInRoot(root, {
|
|
1033
1070
|
relativePath: params.toRelative,
|
|
1034
1071
|
denyMutations: params.denyMutations,
|
|
1072
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
1035
1073
|
allowFinalSymlink: true,
|
|
1036
1074
|
protectDeniedAncestors: true,
|
|
1037
1075
|
shouldAssertNoPathAlias: async (resolvedTarget) => {
|
|
1038
|
-
await resolvePinnedRootPathInRoot(root, {
|
|
1076
|
+
pinnedTarget = await resolvePinnedRootPathInRoot(root, {
|
|
1039
1077
|
relativePath: params.toRelative,
|
|
1040
1078
|
policy: PATH_ALIAS_POLICIES.unlinkTarget,
|
|
1041
1079
|
});
|
|
1080
|
+
if (!params.overwrite)
|
|
1081
|
+
return true;
|
|
1042
1082
|
let targetStat;
|
|
1043
1083
|
try {
|
|
1044
1084
|
targetStat = fsSync.lstatSync(resolvedTarget.resolved);
|
|
@@ -1069,18 +1109,16 @@ async function movePathFallback(root, params) {
|
|
|
1069
1109
|
throw new FsSafeError("invalid-path", "directory moves require overwrite: true");
|
|
1070
1110
|
}
|
|
1071
1111
|
if (!params.overwrite) {
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
throw new FsSafeError("already-exists", "destination exists");
|
|
1075
|
-
}
|
|
1076
|
-
catch (error) {
|
|
1077
|
-
if (error instanceof FsSafeError) {
|
|
1078
|
-
throw error;
|
|
1079
|
-
}
|
|
1080
|
-
if (!isNotFoundPathError(error)) {
|
|
1081
|
-
throw error;
|
|
1082
|
-
}
|
|
1112
|
+
if (!pinnedTarget) {
|
|
1113
|
+
throw new FsSafeError("path-mismatch", "destination admission was not completed");
|
|
1083
1114
|
}
|
|
1115
|
+
await movePathNoReplaceNative(root, params, {
|
|
1116
|
+
sourcePath: source.resolved,
|
|
1117
|
+
sourceParentPath: path.dirname(pinnedSource.canonicalPath),
|
|
1118
|
+
targetPath: target.resolved,
|
|
1119
|
+
targetParentPath: path.dirname(pinnedTarget.canonicalPath),
|
|
1120
|
+
});
|
|
1121
|
+
return;
|
|
1084
1122
|
}
|
|
1085
1123
|
const sourceParentGuard = await createAsyncDirectoryGuard(path.dirname(source.resolved));
|
|
1086
1124
|
const targetParentGuard = await createNearestExistingDirectoryGuard(target.rootReal, path.dirname(target.resolved));
|
|
@@ -1088,6 +1126,9 @@ async function movePathFallback(root, params) {
|
|
|
1088
1126
|
await assertAsyncDirectoryGuard(sourceParentGuard);
|
|
1089
1127
|
await assertAsyncDirectoryGuard(targetParentGuard);
|
|
1090
1128
|
try {
|
|
1129
|
+
assertFinalSymlinkRejected(source.resolved, params.mutationSymlinks !== undefined);
|
|
1130
|
+
assertFinalSymlinkRejected(target.resolved, params.mutationSymlinks !== undefined);
|
|
1131
|
+
params.assertBeforeMutation?.();
|
|
1091
1132
|
await fs.rename(source.resolved, target.resolved);
|
|
1092
1133
|
}
|
|
1093
1134
|
catch (error) {
|
|
@@ -1101,103 +1142,187 @@ async function movePathFallback(root, params) {
|
|
|
1101
1142
|
}
|
|
1102
1143
|
throw error;
|
|
1103
1144
|
}
|
|
1104
|
-
|
|
1145
|
+
try {
|
|
1146
|
+
await assertAsyncDirectoryGuard(sourceParentGuard);
|
|
1147
|
+
await assertAsyncDirectoryGuard(targetParentGuard);
|
|
1148
|
+
}
|
|
1149
|
+
catch (error) {
|
|
1150
|
+
throw normalizePinnedPathError(error);
|
|
1151
|
+
}
|
|
1105
1152
|
}
|
|
1106
1153
|
async function writeFileFallback(root, params) {
|
|
1154
|
+
if (params.renameIdentity !== "verify-content-with-lock")
|
|
1155
|
+
return await writeFileFallbackUnlocked(root, params);
|
|
1156
|
+
const policy = snapshotPinnedMutationPolicy(params.denyMutations, params.mutationSymlinks);
|
|
1157
|
+
if (policy)
|
|
1158
|
+
params = { ...params, ...policy };
|
|
1159
|
+
const { rootReal, resolved } = await resolveGuardedWritePathInRoot(root, params);
|
|
1160
|
+
await withRootFallbackCompatibilityLock({
|
|
1161
|
+
rootPath: rootReal, rootIdentity: root.rootIdentity, targetPath: resolved, assertBeforeMutation: params.assertBeforeMutation,
|
|
1162
|
+
}, async ({ targetPath, ...binding }) => await writeFileFallbackUnlocked(root, { ...params, ...binding }, targetPath));
|
|
1163
|
+
}
|
|
1164
|
+
async function writeFileFallbackUnlocked(root, params, expectedWritePath) {
|
|
1107
1165
|
if (params.overwrite === false) {
|
|
1108
|
-
await writeMissingFileFallback(root, params);
|
|
1166
|
+
await writeMissingFileFallback(root, params, expectedWritePath);
|
|
1109
1167
|
return;
|
|
1110
1168
|
}
|
|
1111
|
-
const target = await openWritableFileInRoot(root, {
|
|
1169
|
+
const { opened: target, identity: targetIdentity } = await openWritableFileInRoot(root, {
|
|
1112
1170
|
relativePath: params.relativePath,
|
|
1113
1171
|
mkdir: params.mkdir,
|
|
1114
|
-
|
|
1172
|
+
// Private, writable placeholder: Windows cannot rename over a read-only file.
|
|
1173
|
+
mode: 0o600,
|
|
1115
1174
|
denyMutations: params.denyMutations,
|
|
1175
|
+
assertBeforeMutation: params.assertBeforeMutation,
|
|
1176
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
1116
1177
|
truncateExisting: false,
|
|
1178
|
+
expectedWritePath,
|
|
1117
1179
|
});
|
|
1118
|
-
const
|
|
1180
|
+
const policyEnabled = params.denyMutations !== undefined || params.mutationSymlinks !== undefined;
|
|
1181
|
+
const retainedSelection = policyEnabled ? takeRootWriteSelection(target) : undefined;
|
|
1182
|
+
const destinationPath = retainedSelection?.selectedPath ?? target.realPath;
|
|
1119
1183
|
const mode = params.mode ?? (target.stat.mode & 0o777);
|
|
1120
|
-
|
|
1121
|
-
|
|
1184
|
+
if (policyEnabled && !retainedSelection) {
|
|
1185
|
+
await target.handle.close().catch(() => undefined);
|
|
1186
|
+
throw new FsSafeError("path-mismatch", "write admission state was not retained");
|
|
1187
|
+
}
|
|
1188
|
+
const destinationGuard = retainedSelection?.parentGuard ??
|
|
1189
|
+
await createAsyncDirectoryGuard(path.dirname(destinationPath), { bigint: true }).catch(async (error) => {
|
|
1190
|
+
await target.handle.close().catch(() => undefined);
|
|
1191
|
+
throw error;
|
|
1192
|
+
});
|
|
1122
1193
|
let tempPath = null;
|
|
1123
1194
|
let unregisterTempPath = null;
|
|
1124
1195
|
let writtenHandle;
|
|
1196
|
+
let writtenIdentity;
|
|
1197
|
+
let placeholderIdentity;
|
|
1198
|
+
let published = false;
|
|
1125
1199
|
try {
|
|
1200
|
+
if (target.createdForWrite)
|
|
1201
|
+
placeholderIdentity = targetIdentity;
|
|
1126
1202
|
tempPath = buildAtomicWriteTempPath(destinationPath);
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1203
|
+
if (retainedSelection) {
|
|
1204
|
+
await refreshRetainedRootWriteAdmission(root, retainedSelection, true, target.handle.fd);
|
|
1205
|
+
}
|
|
1206
|
+
params.assertBeforeMutation?.();
|
|
1207
|
+
if (retainedSelection) {
|
|
1208
|
+
assertRootWriteSelectionSync(root, retainedSelection, true, target.handle.fd);
|
|
1209
|
+
}
|
|
1210
|
+
writtenHandle = await fs.open(tempPath, OPEN_WRITE_CREATE_FLAGS, 0o600);
|
|
1211
|
+
writtenIdentity = fsSync.fstatSync(writtenHandle.fd, { bigint: true });
|
|
1212
|
+
unregisterTempPath = registerTempPathForExit(tempPath, { identity: writtenIdentity, singleLinkFile: true });
|
|
1213
|
+
await writeAllToFile(writtenHandle, params.data, {
|
|
1214
|
+
encoding: params.encoding, assertBeforeMutation: params.assertBeforeMutation,
|
|
1133
1215
|
});
|
|
1134
|
-
|
|
1135
|
-
|
|
1216
|
+
if (params.durable !== false)
|
|
1217
|
+
await writtenHandle.sync();
|
|
1136
1218
|
const commitTempPath = tempPath;
|
|
1219
|
+
const commitHandle = writtenHandle;
|
|
1220
|
+
const commitIdentity = writtenIdentity;
|
|
1137
1221
|
await withAsyncDirectoryGuards([destinationGuard], async () => {
|
|
1222
|
+
await verifyAtomicWriteResult({
|
|
1223
|
+
root, targetPath: commitTempPath, fd: commitHandle.fd,
|
|
1224
|
+
expectedIdentity: commitIdentity, parentGuard: destinationGuard,
|
|
1225
|
+
});
|
|
1226
|
+
if (target.createdForWrite) {
|
|
1227
|
+
await cleanupPinnedFilePath({
|
|
1228
|
+
pathname: destinationPath, handle: target.handle, identity: placeholderIdentity, parentGuard: destinationGuard,
|
|
1229
|
+
});
|
|
1230
|
+
}
|
|
1231
|
+
// Windows cannot replace a destination while its old handle remains open.
|
|
1232
|
+
await target.handle.close();
|
|
1233
|
+
if (retainedSelection) {
|
|
1234
|
+
await refreshRetainedRootWriteAdmission(root, retainedSelection, !target.createdForWrite);
|
|
1235
|
+
}
|
|
1236
|
+
assertFinalSymlinkRejected(destinationPath, params.mutationSymlinks !== undefined);
|
|
1237
|
+
params.assertBeforeMutation?.();
|
|
1238
|
+
if (retainedSelection) {
|
|
1239
|
+
assertRootWriteSelectionSync(root, retainedSelection, !target.createdForWrite);
|
|
1240
|
+
}
|
|
1138
1241
|
await fs.rename(commitTempPath, destinationPath);
|
|
1139
1242
|
tempPath = null;
|
|
1243
|
+
published = true;
|
|
1140
1244
|
});
|
|
1141
1245
|
unregisterTempPath();
|
|
1142
1246
|
unregisterTempPath = null;
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1247
|
+
await finishRootFallbackWrite({
|
|
1248
|
+
root, targetPath: destinationPath, handle: writtenHandle, identity: writtenIdentity,
|
|
1249
|
+
parentGuard: destinationGuard, mode, options: params,
|
|
1250
|
+
// Read/write access is needed to sync the accepted destination on Windows.
|
|
1251
|
+
openForCompatibility: () => openVerifiedLocalFile(destinationPath, { hardlinks: "reject", readWrite: true }),
|
|
1252
|
+
onVerificationFailure: err => emitWriteBoundaryWarning(`post-write verification failed: ${String(err)}`),
|
|
1253
|
+
});
|
|
1254
|
+
}
|
|
1255
|
+
finally {
|
|
1256
|
+
if (!published && target.createdForWrite) {
|
|
1257
|
+
await cleanupPinnedFilePath({
|
|
1258
|
+
pathname: destinationPath, handle: target.handle, identity: placeholderIdentity, parentGuard: destinationGuard,
|
|
1150
1259
|
});
|
|
1151
1260
|
}
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1261
|
+
await target.handle.close().catch(() => undefined);
|
|
1262
|
+
if (tempPath && writtenHandle) {
|
|
1263
|
+
await cleanupPinnedFilePath({
|
|
1264
|
+
pathname: tempPath, handle: writtenHandle, identity: writtenIdentity, parentGuard: destinationGuard,
|
|
1265
|
+
});
|
|
1155
1266
|
}
|
|
1156
|
-
}
|
|
1157
|
-
finally {
|
|
1158
1267
|
await writtenHandle?.close().catch(() => undefined);
|
|
1159
|
-
if (tempPath) {
|
|
1160
|
-
await fs.rm(tempPath, { force: true }).catch(() => { });
|
|
1161
|
-
}
|
|
1162
1268
|
unregisterTempPath?.();
|
|
1163
1269
|
}
|
|
1164
1270
|
}
|
|
1165
|
-
async function writeMissingFileFallback(root, params) {
|
|
1166
|
-
const
|
|
1271
|
+
async function writeMissingFileFallback(root, params, expectedWritePath) {
|
|
1272
|
+
const guardedTarget = params.denyMutations === undefined && params.mutationSymlinks === undefined
|
|
1273
|
+
? undefined
|
|
1274
|
+
: await resolveGuardedWriteTargetInRoot(root, {
|
|
1275
|
+
relativePath: params.relativePath,
|
|
1276
|
+
denyMutations: params.denyMutations,
|
|
1277
|
+
mutationSymlinks: params.mutationSymlinks,
|
|
1278
|
+
});
|
|
1279
|
+
const { resolved } = guardedTarget?.resolvedPath ?? await resolveGuardedWritePathInRoot(root, {
|
|
1167
1280
|
relativePath: params.relativePath,
|
|
1168
|
-
denyMutations: params.denyMutations,
|
|
1169
1281
|
});
|
|
1170
|
-
const
|
|
1171
|
-
|
|
1172
|
-
:
|
|
1173
|
-
|
|
1282
|
+
const prepared = guardedTarget ? await prepareSharedRootWriteTarget(root, {
|
|
1283
|
+
relativePath: params.relativePath, guardedTarget, mkdir: params.mkdir,
|
|
1284
|
+
assertBeforeMutation: params.assertBeforeMutation,
|
|
1285
|
+
}) : undefined;
|
|
1286
|
+
const mutationAdmission = prepared?.mutationAdmission;
|
|
1287
|
+
const preparedParent = prepared?.preparedParent;
|
|
1288
|
+
const targetPath = prepared?.targetPath ?? (params.mkdir === false ? resolved :
|
|
1289
|
+
await prepareRootWriteTarget(root, resolved, params.assertBeforeMutation));
|
|
1290
|
+
assertRootFallbackWritePath(expectedWritePath, targetPath);
|
|
1291
|
+
const pathSelection = guardedTarget
|
|
1292
|
+
? await prepareGuardedRootWritePathSelection(guardedTarget, targetPath, targetPath, preparedParent)
|
|
1293
|
+
: undefined;
|
|
1294
|
+
const parentGuard = pathSelection?.parentGuard ??
|
|
1295
|
+
await createAsyncDirectoryGuard(path.dirname(targetPath), { bigint: true });
|
|
1174
1296
|
let created = false;
|
|
1175
1297
|
let createdIdentity;
|
|
1176
1298
|
let writtenHandle;
|
|
1177
1299
|
let verifyingPublication = false;
|
|
1178
1300
|
try {
|
|
1179
1301
|
const { handle, writtenStat } = await withAsyncDirectoryGuards([parentGuard], async () => {
|
|
1302
|
+
assertFinalSymlinkRejected(targetPath, params.mutationSymlinks !== undefined);
|
|
1303
|
+
params.assertBeforeMutation?.();
|
|
1304
|
+
if (mutationAdmission)
|
|
1305
|
+
assertSyncDirectoryGuard(parentGuard);
|
|
1180
1306
|
const handle = await fs.open(targetPath, OPEN_WRITE_CREATE_FLAGS, params.mode ?? 0o600).catch((error) => recordExclusiveCreateFailure(error, targetPath));
|
|
1307
|
+
writtenHandle = handle;
|
|
1181
1308
|
created = true;
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
}
|
|
1193
|
-
|
|
1194
|
-
await handle.
|
|
1195
|
-
|
|
1196
|
-
}
|
|
1309
|
+
const writtenStat = fsSync.fstatSync(handle.fd, { bigint: true });
|
|
1310
|
+
createdIdentity = writtenStat;
|
|
1311
|
+
await writeAllToFile(handle, params.data, {
|
|
1312
|
+
encoding: params.encoding,
|
|
1313
|
+
assertBeforeMutation: () => {
|
|
1314
|
+
assertFinalSymlinkRejected(targetPath, params.mutationSymlinks !== undefined);
|
|
1315
|
+
params.assertBeforeMutation?.();
|
|
1316
|
+
if (mutationAdmission)
|
|
1317
|
+
assertSyncDirectoryGuard(parentGuard);
|
|
1318
|
+
},
|
|
1319
|
+
});
|
|
1320
|
+
if (params.durable !== false)
|
|
1321
|
+
await handle.sync();
|
|
1322
|
+
return { handle, writtenStat };
|
|
1197
1323
|
}, {
|
|
1198
|
-
onPostGuardFailure:
|
|
1324
|
+
onPostGuardFailure: () => {
|
|
1199
1325
|
created = false; // Parent is untrusted now; skip outer path cleanup by name.
|
|
1200
|
-
await handle.close().catch(() => undefined);
|
|
1201
1326
|
},
|
|
1202
1327
|
});
|
|
1203
1328
|
writtenHandle = handle;
|
|
@@ -1210,6 +1335,8 @@ async function writeMissingFileFallback(root, params) {
|
|
|
1210
1335
|
fd: handle.fd,
|
|
1211
1336
|
parentGuard,
|
|
1212
1337
|
});
|
|
1338
|
+
if (params.durable !== false)
|
|
1339
|
+
await syncDirectoryBestEffort(path.dirname(targetPath));
|
|
1213
1340
|
}
|
|
1214
1341
|
catch (err) {
|
|
1215
1342
|
if (verifyingPublication)
|
|
@@ -1222,9 +1349,11 @@ async function writeMissingFileFallback(root, params) {
|
|
|
1222
1349
|
throw err;
|
|
1223
1350
|
}
|
|
1224
1351
|
finally {
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1352
|
+
if (created && writtenHandle) {
|
|
1353
|
+
await cleanupPinnedFilePath({
|
|
1354
|
+
pathname: targetPath, handle: writtenHandle, identity: createdIdentity, parentGuard,
|
|
1355
|
+
});
|
|
1228
1356
|
}
|
|
1357
|
+
await writtenHandle?.close().catch(() => undefined);
|
|
1229
1358
|
}
|
|
1230
1359
|
}
|