@openclaw/signal 2026.11.3 → 2026.11.5-beta.2
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/dist/.setup/{accounts-B0Pba1-q.mjs → accounts-enJKL3ci.mjs} +4 -8
- package/dist/.setup/api-CrasQEKI.mjs +14 -0
- package/dist/.setup/{api-CbN3mye4.mjs → api-DljZsfUn.mjs} +9 -11
- package/dist/.setup/{approval-auth-DhUKkSkA.mjs → approval-auth-B_5Ytx8K.mjs} +7 -11
- package/dist/.setup/{approval-handler.runtime-CsEcBZoc.mjs → approval-handler.runtime-0RbVmTxx.mjs} +7 -8
- package/dist/.setup/{approval-reactions-JsqCEOHK.mjs → approval-reactions-CvqVSSx8.mjs} +16 -24
- package/dist/.setup/{channel-CM-rLLPN.mjs → channel-ByJj8fSh.mjs} +417 -372
- package/dist/.setup/{client-Duwqbgqi.mjs → client-CesmEjRc.mjs} +170 -186
- package/dist/.setup/{config-schema-DvxZ18SD.mjs → config-schema-BCmW0BLB.mjs} +2 -5
- package/dist/.setup/{doctor-contract-api-BIdVW0PF.mjs → doctor-contract-api-CcLwIhsD.mjs} +88 -95
- package/dist/.setup/{identity-B3JyPqGO.mjs → identity-vKtR3DrM.mjs} +39 -2
- package/dist/.setup/{install-signal-cli-hYVLYGXe.mjs → install-signal-cli-DvLDZfpP.mjs} +95 -109
- package/dist/.setup/{transport-url-CAC0JcuI.mjs → legacy-transport-D_cZC3bS.mjs} +18 -1
- package/dist/.setup/{monitor-C6u1JV2C.mjs → monitor-Cf5sihwl.mjs} +166 -239
- package/dist/.setup/{probe-D_93QCe0.mjs → probe-Caq5Y4kA.mjs} +3 -3
- package/dist/.setup/{send-CM7-016e.mjs → send-BJuOWLky.mjs} +34 -66
- package/dist/.setup/{setup-surface-DvKLwYrl.mjs → setup-surface-DQ1yFZmY.mjs} +3 -3
- package/dist/.setup/{transport-detection-CmlgOybe.mjs → transport-detection-DvR6X_UQ.mjs} +3 -3
- package/dist/.setup/{transport-policy-B6C_LogW.mjs → transport-policy-zIR3lRUj.mjs} +1 -1
- package/dist/.setup/transport-probes.runtime-CoH6UFtc.mjs +1 -0
- package/dist/.source-module-urls/b02c526df8b90083105b63e5b51d5c8bbfe02676df72f6be8dd8f825817b32b9.json +1 -0
- package/dist/api.js +9 -11
- package/dist/channel-config-api.js +1 -2
- package/dist/channel-plugin-api.js +1 -2
- package/dist/contract-api.js +3 -4
- package/dist/doctor-contract-api.js +1 -2
- package/dist/runtime-api.js +1 -2
- package/dist/setup-entry.js +1 -1
- package/node_modules/@openclaw/fs-safe/CHANGELOG.md +94 -0
- package/node_modules/@openclaw/fs-safe/dist/archive-parser.wasm +0 -0
- package/node_modules/@openclaw/fs-safe/dist/copy-file-input.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-file-input.js +3 -1
- package/node_modules/@openclaw/fs-safe/dist/copy-path-admission.js +2 -2
- package/node_modules/@openclaw/fs-safe/dist/copy-root-file-sync.js +8 -1
- package/node_modules/@openclaw/fs-safe/dist/file-open-error.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/file-open-error.js +14 -0
- package/node_modules/@openclaw/fs-safe/dist/file-sync.d.ts +2 -1
- package/node_modules/@openclaw/fs-safe/dist/file-sync.js +6 -1
- package/node_modules/@openclaw/fs-safe/dist/guest-native-python.js +3 -0
- package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/native-config.js +14 -3
- package/node_modules/@openclaw/fs-safe/dist/native-operations.js +2 -0
- package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.js +9 -2
- package/node_modules/@openclaw/fs-safe/dist/native-staged-file.js +40 -32
- package/node_modules/@openclaw/fs-safe/dist/output.js +6 -0
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/owner-dacl.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/path.js +5 -1
- package/node_modules/@openclaw/fs-safe/dist/pinned-write-staged.js +25 -2
- package/node_modules/@openclaw/fs-safe/dist/publication-handle.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/publication-handle.js +32 -0
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.d.ts +2 -1
- package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.js +19 -9
- package/node_modules/@openclaw/fs-safe/dist/publish-file.js +23 -24
- package/node_modules/@openclaw/fs-safe/dist/publish-rename-fallback.d.ts +21 -0
- package/node_modules/@openclaw/fs-safe/dist/publish-rename-fallback.js +102 -0
- package/node_modules/@openclaw/fs-safe/dist/root-create-native.js +2 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.d.ts +3 -1
- package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.js +8 -5
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list-types.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts +2 -1
- package/node_modules/@openclaw/fs-safe/dist/root-directory-list.js +19 -9
- package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.js +3 -3
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts +2 -2
- package/node_modules/@openclaw/fs-safe/dist/root-path-existing.js +27 -13
- package/node_modules/@openclaw/fs-safe/dist/root-path.js +2 -2
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts +3 -0
- package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.js +18 -3
- package/node_modules/@openclaw/fs-safe/dist/watch-hints.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/watch-hints.js +68 -21
- package/node_modules/@openclaw/fs-safe/dist/watch-io-error.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-io-error.js +27 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-io-worker.d.ts +1 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-io-worker.js +93 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-io.d.ts +47 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-io.js +236 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-native.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/watch-native.js +3 -3
- package/node_modules/@openclaw/fs-safe/dist/watch-probe.d.ts +16 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-probe.js +135 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-rescan.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/watch-rescan.js +86 -24
- package/node_modules/@openclaw/fs-safe/dist/watch-scan.d.ts +4 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-scan.js +78 -16
- package/node_modules/@openclaw/fs-safe/dist/watch-stream.d.ts +2 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-stream.js +23 -0
- package/node_modules/@openclaw/fs-safe/dist/watch-types.d.ts +3 -1
- package/node_modules/@openclaw/fs-safe/dist/watch.js +60 -13
- package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.d.ts +1 -1
- package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.js +1 -0
- package/node_modules/@openclaw/fs-safe/dist/windows-security-helper.exe +0 -0
- package/node_modules/@openclaw/fs-safe/docs/advanced.md +5 -2
- package/node_modules/@openclaw/fs-safe/docs/compiler-qualification.md +392 -0
- package/node_modules/@openclaw/fs-safe/docs/config.md +7 -1
- package/node_modules/@openclaw/fs-safe/docs/contributing.md +25 -5
- package/node_modules/@openclaw/fs-safe/docs/copy.md +10 -0
- package/node_modules/@openclaw/fs-safe/docs/durability.md +9 -3
- package/node_modules/@openclaw/fs-safe/docs/errors.md +13 -0
- package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.5.md +6 -4
- package/node_modules/@openclaw/fs-safe/docs/native-helper.md +6 -4
- package/node_modules/@openclaw/fs-safe/docs/output.md +4 -2
- package/node_modules/@openclaw/fs-safe/docs/path.md +5 -2
- package/node_modules/@openclaw/fs-safe/docs/permissions.md +15 -0
- package/node_modules/@openclaw/fs-safe/docs/security-model.md +9 -0
- package/node_modules/@openclaw/fs-safe/docs/staged-file.md +2 -0
- package/node_modules/@openclaw/fs-safe/docs/testing.md +1 -1
- package/node_modules/@openclaw/fs-safe/docs/watch.md +62 -5
- package/node_modules/@openclaw/fs-safe/docs/writing.md +6 -1
- package/node_modules/@openclaw/fs-safe/package.json +18 -16
- 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-freebsd-arm64/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-freebsd-arm64/package.json +1 -1
- package/node_modules/@openclaw/fs-safe-freebsd-x64/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-freebsd-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-arm64-msvc/fs-safe-native.node +0 -0
- package/node_modules/@openclaw/fs-safe-win32-arm64-msvc/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/zod/package.json +1 -1
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
- package/node_modules/zod/src/v4/core/compile.ts +9 -0
- package/node_modules/zod/src/v4/core/schemas.ts +35 -1
- package/node_modules/zod/src/v4/core/util.ts +13 -0
- package/node_modules/zod/src/v4/core/versions.ts +1 -1
- package/node_modules/zod/v4/core/compile.cjs +8 -0
- package/node_modules/zod/v4/core/compile.js +8 -0
- package/node_modules/zod/v4/core/schemas.cjs +30 -0
- package/node_modules/zod/v4/core/schemas.d.cts +3 -1
- package/node_modules/zod/v4/core/schemas.d.ts +3 -1
- package/node_modules/zod/v4/core/schemas.js +30 -0
- package/node_modules/zod/v4/core/util.cjs +15 -0
- package/node_modules/zod/v4/core/util.d.cts +2 -0
- package/node_modules/zod/v4/core/util.d.ts +2 -0
- package/node_modules/zod/v4/core/util.js +14 -0
- package/node_modules/zod/v4/core/versions.cjs +1 -1
- package/node_modules/zod/v4/core/versions.js +1 -1
- package/openclaw.plugin.json +0 -30
- package/package.json +6 -8
- package/dist/.setup/api-CJBtD3lT.mjs +0 -16
- package/dist/.setup/client-adapter-Chnbch_z.mjs +0 -30
- package/dist/.setup/legacy-transport-QIpaMNST.mjs +0 -18
- package/dist/.setup/normalize-D7kSomXt.mjs +0 -39
- package/dist/.setup/reaction-runtime-api-mdO4k0yv.mjs +0 -65
- package/dist/.setup/reaction-targets-BgPLDHBf.mjs +0 -72
- package/dist/.setup/rpc-context-BAXcX7dI.mjs +0 -13
- package/dist/.setup/transport-probes.runtime-D-xIMRcn.mjs +0 -2
- package/dist/reaction-runtime-api.js +0 -2
- package/node_modules/ws/LICENSE +0 -20
- package/node_modules/ws/README.md +0 -548
- package/node_modules/ws/browser.js +0 -8
- package/node_modules/ws/index.js +0 -22
- package/node_modules/ws/lib/buffer-util.js +0 -131
- package/node_modules/ws/lib/constants.js +0 -19
- package/node_modules/ws/lib/event-target.js +0 -292
- package/node_modules/ws/lib/extension.js +0 -203
- package/node_modules/ws/lib/limiter.js +0 -55
- package/node_modules/ws/lib/permessage-deflate.js +0 -530
- package/node_modules/ws/lib/receiver.js +0 -743
- package/node_modules/ws/lib/sender.js +0 -607
- package/node_modules/ws/lib/stream.js +0 -161
- package/node_modules/ws/lib/subprotocol.js +0 -62
- package/node_modules/ws/lib/validation.js +0 -152
- package/node_modules/ws/lib/websocket-server.js +0 -562
- package/node_modules/ws/lib/websocket.js +0 -1421
- package/node_modules/ws/package.json +0 -74
- package/node_modules/ws/wrapper.mjs +0 -21
|
@@ -55,6 +55,8 @@ function getFsSafeNativeConfig(): FsSafeNativeConfig;
|
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
Return the effective configuration: programmatic overrides win, then env vars, then the package default (`auto`).
|
|
58
|
+
If only a removed Python-mode variable is configured, configuration reads and
|
|
59
|
+
native operations throw an actionable migration error instead of using the default.
|
|
58
60
|
|
|
59
61
|
## `getFsSafeNativeStatus(options?)`
|
|
60
62
|
|
|
@@ -185,7 +187,11 @@ FS_SAFE_NATIVE_MODE=auto # auto | off | require | true | false | on | 1 | 0
|
|
|
185
187
|
### Removed Python-helper configuration
|
|
186
188
|
|
|
187
189
|
The deprecated Python configuration bridge and its environment variables have
|
|
188
|
-
been removed.
|
|
190
|
+
been removed. Replace `FS_SAFE_PYTHON_MODE` with `FS_SAFE_NATIVE_MODE` and
|
|
191
|
+
`OPENCLAW_FS_SAFE_PYTHON_MODE` with `OPENCLAW_FS_SAFE_NATIVE_MODE`, preserving the
|
|
192
|
+
value. Without a valid native override, either legacy mode variable raises a
|
|
193
|
+
migration error. Explicit native settings still win over leftover legacy settings.
|
|
194
|
+
Use `configureFsSafeNative()` for a programmatic override. See the
|
|
189
195
|
[0.5 migration checklist](migrating-to-0.5.md#2-replace-python-helper-configuration)
|
|
190
196
|
for the migration path.
|
|
191
197
|
|
|
@@ -135,6 +135,18 @@ Vitest. Tests live in `test/` and follow `*.test.ts`. Run a single file with:
|
|
|
135
135
|
pnpm test test/archive.test.ts
|
|
136
136
|
```
|
|
137
137
|
|
|
138
|
+
`pnpm pack:check` also checks every literal relative runtime import, re-export,
|
|
139
|
+
module-relative worker URL, and `import.meta.url` asset reference in the packed JavaScript
|
|
140
|
+
against the tarball contents. Release package collection repeats this check;
|
|
141
|
+
files present only in the build directory do not satisfy it.
|
|
142
|
+
Relative URL-constructor paths are checked with or without a `./` prefix.
|
|
143
|
+
Directory URL assets must identify directories present in the archive; ESM
|
|
144
|
+
imports still require files.
|
|
145
|
+
URL references use decoded filenames without queries or fragments; `require()`
|
|
146
|
+
paths retain their literal characters and use Node's file-extension, package
|
|
147
|
+
`main`, and directory-index fallbacks. String arguments to `new Worker()` are
|
|
148
|
+
relative to the consumer's working directory and are outside this package-relative check.
|
|
149
|
+
|
|
138
150
|
Guest filesystem tests and package smoke also need `python3` on Linux and
|
|
139
151
|
macOS. They execute the exported source on synthetic files; Windows checks
|
|
140
152
|
the import surface and leaves POSIX execution to the Linux/macOS lanes.
|
|
@@ -318,13 +330,13 @@ Bun 1.4.2 (as do macOS and Windows).
|
|
|
318
330
|
| Lane | Runner | Architecture / libc | Runtime |
|
|
319
331
|
| --- | --- | --- | --- |
|
|
320
332
|
| JavaScript check | `ubuntu-latest` | x64 / glibc | Node 22, 24, 26 |
|
|
321
|
-
| JavaScript check | `
|
|
333
|
+
| JavaScript check | `xcode-27` | arm64 | Node 22, 24, 26 |
|
|
322
334
|
| JavaScript check | `fs-safe-windows-16core` (`windows-latest`) | x64 | Node 22, 24, 26 |
|
|
323
335
|
| Native check | `ubuntu-latest` | x64 / glibc | Node 24, Bun 1.4.2 |
|
|
324
336
|
| Native check (forced no-openat2) | `ubuntu-latest` | x64 / glibc | Node 24 |
|
|
325
337
|
| Native check | `ubuntu-24.04-arm` | arm64 / glibc | Node 24, Bun 1.4.2 |
|
|
326
|
-
| Native check | `
|
|
327
|
-
| Native check | `
|
|
338
|
+
| Native check | `xcode-27` | arm64 | Node 24, Bun 1.4.2 |
|
|
339
|
+
| Native check | `xcode-27` under Rosetta (`x64`) | x64 | Node 24, Bun 1.4.2 |
|
|
328
340
|
| Native check | `fs-safe-windows-16core` (`windows-latest`) | x64 | Node 24, Bun 1.4.2 |
|
|
329
341
|
| Native check | `windows-2022` (standard hosted) | x64 | Node 24, Bun 1.4.2 |
|
|
330
342
|
| Windows ARM64 host | `windows-11-arm` | arm64 native and x64 emulated | Node 24 |
|
|
@@ -332,8 +344,16 @@ Bun 1.4.2 (as do macOS and Windows).
|
|
|
332
344
|
| Native check (Alpine 3.24) | `ubuntu-24.04-arm` | arm64 / musl | Node 24 |
|
|
333
345
|
| GNU glibc 2.28 build + Rocky Linux 8 load | `ubuntu-latest` | x64 / glibc | Node 24 |
|
|
334
346
|
| GNU glibc 2.28 build + Rocky Linux 8 load | `ubuntu-24.04-arm` | arm64 / glibc | Node 24 |
|
|
335
|
-
| Bundled package smoke | `ubuntu-latest`, `
|
|
336
|
-
| Coverage | `ubuntu-latest`, `
|
|
347
|
+
| Bundled package smoke | `ubuntu-latest`, `xcode-27`, `fs-safe-windows-16core` | host | Node 22, 24 |
|
|
348
|
+
| Coverage | `ubuntu-latest`, `xcode-27`, `fs-safe-windows-16core` | host | Node 22 |
|
|
349
|
+
|
|
350
|
+
All macOS jobs use the arm64 `xcode-27` image. Required status-check names
|
|
351
|
+
retain their historical `macos-15` identifiers to preserve branch protection;
|
|
352
|
+
those names do not select the runner. The x64 native and watch lanes
|
|
353
|
+
assert Rosetta availability and run their shells, Node, and Bun under Rosetta;
|
|
354
|
+
they do not require Intel hardware. Native builds preserve the published macOS
|
|
355
|
+
minimums: 11.0 for arm64 and 10.12 for x64. Native CI and release prebuilds
|
|
356
|
+
verify the Mach-O deployment command and load each binding with matching Node.
|
|
337
357
|
|
|
338
358
|
Both musl lanes also run root-only package smoke with the real host binding.
|
|
339
359
|
The eight-target source build matrix still runs on release tags. The smoke writes manager versions,
|
|
@@ -271,6 +271,16 @@ creates the guarded destination name from the admitted source descriptor. Linux
|
|
|
271
271
|
uses FICLONE and copy_file_range. Windows and native-disabled operation copy
|
|
272
272
|
bytes; they cannot satisfy `"always"`.
|
|
273
273
|
|
|
274
|
+
On Btrfs, explicit `"auto"` and `"always"` file copies match the source's NOCOW
|
|
275
|
+
flag on the newly created empty destination before cloning. This can override
|
|
276
|
+
NOCOW inherited from the destination directory, in either direction. Other
|
|
277
|
+
destination flags, including compression policy, are preserved; incompatible
|
|
278
|
+
policy can still prevent cloning. A successful NOCOW clone has no data checksums
|
|
279
|
+
or compression, and shared extents use copy-on-write until they become unshared.
|
|
280
|
+
The source and destination remain independent files. If `"auto"` falls back,
|
|
281
|
+
the clone target is removed and a fresh copy inherits the destination directory's
|
|
282
|
+
ordinary policy. The default `"never"` mode does not change NOCOW flags.
|
|
283
|
+
|
|
274
284
|
The source descriptor remains open through before/after source identity checks.
|
|
275
285
|
Symlink components are rejected; source hardlinks are rejected unless
|
|
276
286
|
`sourceHardlinks: "allow"` is selected. The byte limit is an EOF bound, not a
|
|
@@ -217,16 +217,22 @@ try {
|
|
|
217
217
|
|
|
218
218
|
`rename-noreplace` normally uses atomic native rename. On Linux in native `auto`
|
|
219
219
|
mode, a definitively unsupported `RENAME_NOREPLACE` result (`EINVAL`, `ENOSYS`,
|
|
220
|
-
or unsupported-operation errno) permits the
|
|
220
|
+
or unsupported-operation errno) permits the descriptor-relative file-publication fallback.
|
|
221
221
|
It requires a regular source with one link, retains both parents, creates the
|
|
222
222
|
target with `linkat` without following symlinks, verifies both names against the
|
|
223
|
-
staged identity with exactly two links,
|
|
224
|
-
|
|
223
|
+
staged identity with exactly two links, pins the destination, and closes the
|
|
224
|
+
source descriptor before identity-bound unlink. It then verifies the target has
|
|
225
|
+
one link. Fallback collisions report `already-exists` without clobbering;
|
|
225
226
|
the atomic rename path retains its existing `EEXIST` error.
|
|
226
227
|
Success still returns `method: "rename-noreplace"`, with the additive
|
|
227
228
|
`fallback: "link-unlink"` field identifying this weaker mechanism. Atomic rename
|
|
228
229
|
and the other strategies omit `fallback`.
|
|
229
230
|
|
|
231
|
+
The handoff precedes unlink so NFS need not create or finish deleting a hidden
|
|
232
|
+
name for an open source. Success still requires the exact destination identity,
|
|
233
|
+
one remaining link, and source absence. Missing native link or identity-bound
|
|
234
|
+
unlink support fails closed. Unverified or substituted destinations are preserved.
|
|
235
|
+
|
|
230
236
|
**Link/unlink is not crash-atomic.** A crash between those syscalls can leave both
|
|
231
237
|
names on the same complete inode. Callers must recognize that interrupted pair
|
|
232
238
|
as incomplete evidence or recover it under their own identity/ownership rules
|
|
@@ -244,6 +244,19 @@ inspection has its own failure surface. Older fs-safe versions could report
|
|
|
244
244
|
`EACCES` for the same root/open condition, so consumers spanning versions
|
|
245
245
|
should accept both codes.
|
|
246
246
|
|
|
247
|
+
Read-only filesystem failures retain `EROFS` on native I/O errors. Native
|
|
248
|
+
`openBeneath` and `openCreateBeneath` failures include `path` (relative to the
|
|
249
|
+
supplied directory descriptor), `operation`, and the caller's numeric `flags`.
|
|
250
|
+
Their messages escape control characters in the relative path. These fields
|
|
251
|
+
describe the attempted open; they do not identify the absolute parent or claim
|
|
252
|
+
which syscall the selected backend used. JavaScript owners of native file
|
|
253
|
+
creation attach their known absolute `path` and `syscall: "open"`, including
|
|
254
|
+
sidecar locks, writable opens, staged writes, and synchronous/asynchronous copies.
|
|
255
|
+
Existing Root write wrappers still use
|
|
256
|
+
`invalid-path`, and native copy wrappers still use `helper-failed`; both retain
|
|
257
|
+
these diagnostics in `cause`.
|
|
258
|
+
No read-only failure selects a less restrictive fallback or authorizes a retry.
|
|
259
|
+
|
|
247
260
|
## Specialty errors
|
|
248
261
|
|
|
249
262
|
A handful of helpers throw their own typed errors instead of `FsSafeError`:
|
|
@@ -43,10 +43,12 @@ Replace `FS_SAFE_PYTHON_MODE` with `FS_SAFE_NATIVE_MODE`, or
|
|
|
43
43
|
`OPENCLAW_FS_SAFE_PYTHON_MODE` with `OPENCLAW_FS_SAFE_NATIVE_MODE`. Remove
|
|
44
44
|
`pythonPath`, `FS_SAFE_PYTHON`, `OPENCLAW_FS_SAFE_PYTHON`,
|
|
45
45
|
`OPENCLAW_PINNED_PYTHON`, and `OPENCLAW_PINNED_WRITE_PYTHON`; prebuilt native
|
|
46
|
-
binaries need no interpreter.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
binaries need no interpreter. Preserve the mode value: `require` stays `require`,
|
|
47
|
+
`off` stays `off`, and `auto` stays `auto`. Since 0.23.0 the bridge is removed;
|
|
48
|
+
current builds reject leftover Python-mode variables with a migration error
|
|
49
|
+
unless a valid native policy explicitly overrides them. Versions 0.23.0–0.26.6
|
|
50
|
+
silently ignored them, so migrate before upgrading to those versions too.
|
|
51
|
+
Programmatic native configuration wins, followed by
|
|
50
52
|
`FS_SAFE_NATIVE_MODE`, `OPENCLAW_FS_SAFE_NATIVE_MODE`, and the default `auto`.
|
|
51
53
|
|
|
52
54
|
Choose the production mode deliberately:
|
|
@@ -180,10 +180,12 @@ is authoritative for operation and platform guarantees.
|
|
|
180
180
|
|
|
181
181
|
## Migration from the Python helper
|
|
182
182
|
|
|
183
|
-
The Python configuration bridge
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
183
|
+
The Python configuration bridge was intentionally removed in 0.23.0. A remaining
|
|
184
|
+
`FS_SAFE_PYTHON_MODE` or `OPENCLAW_FS_SAFE_PYTHON_MODE` now raises a migration
|
|
185
|
+
error when no explicit native policy is selected; it never silently selects `auto`.
|
|
186
|
+
Replace either variable with its corresponding `NATIVE_MODE` name and preserve
|
|
187
|
+
the value (`require` → `require`, `off` → `off`, `auto` → `auto`), or call
|
|
188
|
+
`configureFsSafeNative()` explicitly before using fs-safe. Follow the
|
|
187
189
|
[0.5 migration checklist](migrating-to-0.5.md#2-replace-python-helper-configuration)
|
|
188
190
|
for the removed settings and current precedence.
|
|
189
191
|
|
|
@@ -99,8 +99,10 @@ boundary and same-filesystem atomic replacement is required. After the callback
|
|
|
99
99
|
returns, fs-safe pins and validates the staged regular file, rejects hardlinks
|
|
100
100
|
and size-limit violations, applies `mode`, fsyncs it, and atomically renames it
|
|
101
101
|
over the target. Existing files and symlink entries are replaced without
|
|
102
|
-
following their contents or referents. The
|
|
103
|
-
|
|
102
|
+
following their contents or referents. The canonical root identity and the
|
|
103
|
+
parent's containment are checked before invoking the producer and throughout
|
|
104
|
+
publication, including redirects before the parent guard is captured. The
|
|
105
|
+
parent identity is guarded across the operation and the parent directory is synchronized best-effort after
|
|
104
106
|
rename. If an error leaves the sibling temp in place and immediate cleanup
|
|
105
107
|
fails, its verified identity remains registered for a best-effort process-exit
|
|
106
108
|
cleanup retry.
|
|
@@ -86,8 +86,11 @@ if (real === null) return notFound();
|
|
|
86
86
|
```
|
|
87
87
|
|
|
88
88
|
All `realpath` failures collapse to `null` — there is no distinction between `ENOENT`, `EACCES`, and other I/O errors. Use `fs.realpathSync` directly if you need to branch on the error code.
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
It keeps Node's ordinary `realpath` handling of dot segments and symlinks. On
|
|
90
|
+
POSIX it then returns the on-disk spelling, so a path typed with different
|
|
91
|
+
letter case on a case-insensitive volume resolves to the same string that root
|
|
92
|
+
admission uses. This convenience wrapper is not a caller-path admission boundary
|
|
93
|
+
on its own.
|
|
91
94
|
|
|
92
95
|
### `safeStatSync(targetPath)`
|
|
93
96
|
|
|
@@ -220,6 +220,21 @@ retains the raw byte and decoded
|
|
|
220
220
|
lowercase Windows SID notation. `daclPresent: false` represents a null DACL,
|
|
221
221
|
which grants unrestricted access; it must not be mistaken for an empty DACL.
|
|
222
222
|
|
|
223
|
+
The optional `isVolumeRoot` fact is true only when Windows resolves the inspected
|
|
224
|
+
handle to an exact normalized local volume GUID root and a second no-follow
|
|
225
|
+
handle proves the named directory is the same object without a reparse point.
|
|
226
|
+
This distinguishes the volume-root object from a replaceable mounted-folder or
|
|
227
|
+
junction entry pointing at it. Those reparse entries remain false; inspect a
|
|
228
|
+
canonical non-reparse volume-root path to obtain a positive result. The entry
|
|
229
|
+
lookup normalizes trailing separators and current-directory components separately
|
|
230
|
+
from ACL inspection; parent traversal cannot assert a volume root. Ordinary
|
|
231
|
+
directories, drive aliases pointing at a subdirectory, failed identity or
|
|
232
|
+
normalization queries, and remote/UNC paths are also false. Older native helpers
|
|
233
|
+
omit the fact, so consumers must require `isVolumeRoot === true` before using it.
|
|
234
|
+
This metadata does not relax reparse-point or ACL admission policy: consumers
|
|
235
|
+
still decide which rights are acceptable, and all ACE masks are returned
|
|
236
|
+
unchanged.
|
|
237
|
+
|
|
223
238
|
Object-specific and other ACE layouts are not guessed: they are omitted,
|
|
224
239
|
`complete` becomes false, and their numeric types appear in
|
|
225
240
|
`unsupportedAceTypes`, allowing a security-sensitive caller to fail closed.
|
|
@@ -17,6 +17,15 @@ path components.
|
|
|
17
17
|
case since `5ddca80`. Exposure is limited to consumers that call
|
|
18
18
|
`resolveRootPath()` or `resolveRootPathSync()` directly.
|
|
19
19
|
|
|
20
|
+
Releases through 0.26.5 also mishandle symlink targets containing another
|
|
21
|
+
symlink followed by `..`. Synchronous resolvers can admit an existing outside
|
|
22
|
+
target as an unrelated in-root path; both synchronous and asynchronous resolvers
|
|
23
|
+
can misresolve a missing target. The pending fix uses kernel canonicalization
|
|
24
|
+
for symlink hops and existing ancestors before interpreting a missing suffix.
|
|
25
|
+
Parent steps after unresolved components fail closed.
|
|
26
|
+
Acyclic chains of dangling symlinks still resolve to a missing-path result.
|
|
27
|
+
`resolveLocalPathFromRootsSync()` shares the synchronous fix.
|
|
28
|
+
|
|
20
29
|
## Threat model
|
|
21
30
|
|
|
22
31
|
You hand a `root()` boundary to a piece of code that takes caller-controlled relative paths. The library defends against a caller that:
|
|
@@ -77,6 +77,8 @@ Modes retaining owner read/write skip the extra mode-only file sync, so a crash
|
|
|
77
77
|
may leave the tighter staged `0600` instead of the wider requested mode. Modes
|
|
78
78
|
removing owner read or write, and corrections of an observed wider staged mode,
|
|
79
79
|
retain the post-chmod file sync. No parent is created or chmodded.
|
|
80
|
+
File and directory synchronization runs asynchronously on the retained descriptors;
|
|
81
|
+
cleanup waits for any pending publication synchronization before closing them.
|
|
80
82
|
Creation uses an exclusive, no-follow, close-on-exec open of a generated direct
|
|
81
83
|
child name. Writes use that descriptor. Inspection uses non-following metadata
|
|
82
84
|
operations, never a potentially blocking reopen of the leaf.
|
|
@@ -106,7 +106,7 @@ must retain that limitation rather than call it proved kernel overflow.
|
|
|
106
106
|
### Nightly workload
|
|
107
107
|
|
|
108
108
|
The nightly workflow runs on `ubuntu-latest` (x64), `ubuntu-24.04-arm`,
|
|
109
|
-
`
|
|
109
|
+
`xcode-27` (arm64), `xcode-27` under Rosetta (`x64`), and the Windows latest 16-core runner,
|
|
110
110
|
using Node 24 and freshly built native bindings. Each job has a 25-minute
|
|
111
111
|
budget, uploads one JSON result per scenario (including failures), and fails
|
|
112
112
|
if any scenario fails. Remaining scenarios still run after a failure. Only
|
|
@@ -108,12 +108,24 @@ Linux discards queued events for watches retired by fs-safe, including their
|
|
|
108
108
|
`IN_IGNORED` echoes, without invalidating unrelated subscriptions. A genuinely
|
|
109
109
|
unknown descriptor or kernel queue overflow still invalidates every subscription.
|
|
110
110
|
|
|
111
|
+
Windows may briefly report `EPERM` from `realpath` while an unrelated directory
|
|
112
|
+
is being deleted. Hint admission retries that observation at most twice before
|
|
113
|
+
reporting uncertainty; it never ignores persistent failures or relaxes the
|
|
114
|
+
identity checks on selected paths.
|
|
115
|
+
|
|
111
116
|
`mode` is required. `poll` never starts or loads the watch hub; guarded scans
|
|
112
117
|
may still use the existing addon. Existing `FS_SAFE_NATIVE_MODE=off` and
|
|
113
118
|
`require` policies apply: `require` plus an unavailable event backend rejects
|
|
114
119
|
`auto` too. Health reports the selected `events` or `poll` mode and failures
|
|
115
120
|
from selection have `operation: "watch"`.
|
|
116
121
|
|
|
122
|
+
If macOS cannot create or start an FSEvents stream during initial admission,
|
|
123
|
+
`auto` falls back to guarded polling. This includes the system-wide stream
|
|
124
|
+
ceiling: FSEvents does not expose a distinct capacity error. Explicit `events`
|
|
125
|
+
and native `require` mode reject with `helper-unavailable` instead. Exclusion
|
|
126
|
+
configuration failures remain fatal, and a stream failure after readiness
|
|
127
|
+
does not silently change the subscription's mode.
|
|
128
|
+
|
|
117
129
|
Linux installs each watch **before** enumerating children. It opens directories
|
|
118
130
|
beneath the Root using the shared guarded native open (openat2, or its checked
|
|
119
131
|
openat fallback), checks exact identities, verifies the procfs namespace, and
|
|
@@ -190,13 +202,50 @@ handles and delivery queues, and closing one does not retire another's observati
|
|
|
190
202
|
| `persistent` | `true`; `false` lets Node exit with the subscription still open |
|
|
191
203
|
| `intervalMs` | 30000 with events; 1000 with poll; minimum 20 ms |
|
|
192
204
|
| `pollIntervalMs` | Optional polling override; minimum 20 ms, maximum 2147483647 ms (same as `intervalMs`) |
|
|
205
|
+
| `fullReconcileIntervalMs` | 300000 ms (5 minutes); minimum 20 ms, maximum 2147483647 ms |
|
|
193
206
|
| `maxDirectories` | 4096 observed directories, including scope ancestors |
|
|
194
207
|
| `maxEntries` | 100000 examined entries per pass, including excluded entries |
|
|
195
208
|
| `maxPendingPaths` | 256; maximum 4096 |
|
|
196
209
|
| Reconciliation | One active pass and one coalesced pending pass; no convergence/pass budget |
|
|
197
210
|
|
|
198
|
-
|
|
199
|
-
|
|
211
|
+
On Node, bulk watcher filesystem observations run in a shared `worker_thread`,
|
|
212
|
+
including exact metadata probes, path resolution, synchronous directory reads and
|
|
213
|
+
all pre/post observation guards. The worker retains open listing handles until
|
|
214
|
+
joined disposal. Policy callbacks and native event delivery remain with the
|
|
215
|
+
subscription, and host snapshot bookkeeping yields every 32 entries. The worker
|
|
216
|
+
is shared across subscriptions with the same native policy and stops when its
|
|
217
|
+
last subscription closes; `persistent: false` still permits process exit.
|
|
218
|
+
Ordinary single Root operations retain their synchronous observation fences.
|
|
219
|
+
Source-loader, test-hook, Bun and Deno execution uses the same guarded helpers
|
|
220
|
+
with explicit event-loop yields between entries, probes and directory checks.
|
|
221
|
+
A slow filesystem call or user callback cannot be preempted in that fallback;
|
|
222
|
+
callbacks must remain cheap. Worker startup/observation failures fail closed.
|
|
223
|
+
|
|
224
|
+
Periodic metadata checks run without needing an event. Each check compares exact
|
|
225
|
+
bigint identities, mode, link count, size, mtime and ctime with the last guarded
|
|
226
|
+
observations. Observations less than one second old are re-listed until the
|
|
227
|
+
clock update window passes, because timestamp storage precision alone does not
|
|
228
|
+
prove update frequency. A later guarded listing must confirm each such directory
|
|
229
|
+
before its cached names become reusable, even if the next tick arrives after
|
|
230
|
+
that window. Entirely unchanged ticks retain their previous snapshot after the
|
|
231
|
+
final identity fence. Each probe also verifies the Root's canonical path, so
|
|
232
|
+
moving an ancestor above the Root cannot preserve admission using only an
|
|
233
|
+
unchanged inode. Unchanged directories reuse their guarded listings; changed
|
|
234
|
+
directories and newly discovered children are listed and verified through the
|
|
235
|
+
ordinary Root guards. File metadata is checked separately because in-place writes
|
|
236
|
+
need not change the parent directory's timestamps. Probe metadata never admits a
|
|
237
|
+
new name or authorizes a read. Reused directory identities and observations are
|
|
238
|
+
checked again after the pass to detect ancestor swaps during file probes.
|
|
239
|
+
|
|
240
|
+
Full guarded reconciliation still runs every five minutes by default, controlled
|
|
241
|
+
by `fullReconcileIntervalMs`. It also runs on a probe error, identity mismatch,
|
|
242
|
+
timestamp regression, or devices whose guarded timestamps show only coarse
|
|
243
|
+
(millisecond or worse) resolution. A single aligned timestamp on an otherwise
|
|
244
|
+
precise device does not disable incremental checks. This safety net catches missed events and provides conservative
|
|
245
|
+
behavior on filesystems that cannot support incremental checks. Listing work
|
|
246
|
+
scales with changed directories; stat-only probes still scale with watched
|
|
247
|
+
entries. `exclude` callbacks must remain cheap; they are evaluated on cached
|
|
248
|
+
entries during incremental checks so changing an exclusion still takes effect.
|
|
200
249
|
Hint validation, scope relevance, and spelling-alias admission share the internal
|
|
201
250
|
hint module. Bounded change merging preserves structural precedence and insertion
|
|
202
251
|
order; nameless children require remaining tree depth, while folded subtrees also
|
|
@@ -209,8 +258,12 @@ hints, vanished or hard-linked leaves, changed topology, uncertain identities,
|
|
|
209
258
|
backend loss, and batches without filenames still receive a full guarded pass.
|
|
210
259
|
`reconcile()`, initial admission, and scope replacement always reconcile every scope.
|
|
211
260
|
The periodic timer is independent of event traffic, so frequent hints cannot defer
|
|
212
|
-
the full
|
|
213
|
-
|
|
261
|
+
the full safety-net check. Repeated passes reuse bounded pathname strings and
|
|
262
|
+
unchanged guarded observations; neither raw hints nor probes grant filesystem authority.
|
|
263
|
+
On Windows with the native helper, each listing fence obtains exact directory
|
|
264
|
+
identity and physical path from one short-lived handle. Native-off and POSIX
|
|
265
|
+
scans retain the JavaScript checks. Both paths recheck the Root and reject
|
|
266
|
+
substituted directories or redirected ancestors at the same fences.
|
|
214
267
|
When polling is selected, the interval is `pollIntervalMs`, then `intervalMs`,
|
|
215
268
|
then 1000 ms, in that order. This applies to explicit `mode: "poll"`, `auto`
|
|
216
269
|
selecting polling, and `auto` falling back after an unsupported event backend.
|
|
@@ -242,7 +295,9 @@ observe a selected sentinel edit and drain its trailing events.
|
|
|
242
295
|
Each later pass compares with the previous snapshot, publishes bounded differences,
|
|
243
296
|
and adopts its result as the next snapshot. Vanishing entries, kind changes, and
|
|
244
297
|
transient descendant scan errors produce structural invalidations, preserving the
|
|
245
|
-
Root identity checks.
|
|
298
|
+
Root identity checks. A hinted child absent from both scans invalidates its
|
|
299
|
+
admitted parent, since a consumer may have observed that child between scans.
|
|
300
|
+
The unobserved child spelling is not published. Events during a pass coalesce into one pending pass and
|
|
246
301
|
retain bounded detail regardless of how long the scan takes. The 25 ms hint
|
|
247
302
|
coalescing window does not impose a scan deadline. A full native callback queue
|
|
248
303
|
retains its bounded pending batch for retry. Pending native and JavaScript hint queues degrade to coarse subtree hints when
|
|
@@ -268,6 +323,8 @@ await `close()` or `[Symbol.asyncDispose]()` to join owned work.
|
|
|
268
323
|
`health()` returns `starting`, `ready`, `reconciling`, `unavailable`, or `closed`,
|
|
269
324
|
the actual mode, observed `directories`, and optional `{ operation, code, error }`
|
|
270
325
|
failure. A running reconciliation reports `reconciling`, then returns to `ready`.
|
|
326
|
+
A Root that disappears during identity revalidation reports `path-mismatch`; its underlying filesystem error remains available as the cause.
|
|
327
|
+
|
|
271
328
|
Observation becomes `unavailable` on loss of Root authority (removed, replaced,
|
|
272
329
|
or inaccessible), fatal native backend/registration failures such as `watch-limit`,
|
|
273
330
|
deterministic size limits (`too-large`, operation `scan`), or callback contract
|
|
@@ -225,7 +225,12 @@ await fs.create("config/flushed.json", initial, { atomic: true, durable: "file"
|
|
|
225
225
|
|
|
226
226
|
`atomic: true` finishes all bytes in a sibling stage before publication.
|
|
227
227
|
The native backend uses its no-replace rename; the JavaScript fallback hardlinks
|
|
228
|
-
the completed stage and
|
|
228
|
+
the completed stage and removes its verified temporary name. On POSIX it pins
|
|
229
|
+
the destination before closing the stage descriptor, preventing NFS deferred
|
|
230
|
+
unlink from retaining an extra link. Identity and link counts are rechecked
|
|
231
|
+
after this handoff.
|
|
232
|
+
Unreadable final modes retain the original descriptor on platforms without a
|
|
233
|
+
read-free file open; strict post-publication checks still apply there.
|
|
229
234
|
When the OS refuses hardlinks, it uses the [placeholder-rename fallback](#publication-without-hardlinks).
|
|
230
235
|
Other processes can briefly observe both linked names, or an empty placeholder
|
|
231
236
|
before the atomic replacement. Entries present at the exclusive claim are preserved, including dangling symlinks;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/fs-safe",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.13",
|
|
4
4
|
"description": "Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"filesystem",
|
|
@@ -157,7 +157,8 @@
|
|
|
157
157
|
"test:coverage:collect": "pnpm build && pnpm archive:wasm:allocator-tests && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0",
|
|
158
158
|
"test:coverage:merge": "node scripts/merge-coverage.mjs",
|
|
159
159
|
"test:security": "vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts",
|
|
160
|
-
"check": "pnpm lint:file-size && pnpm lint:fs-boundary && pnpm
|
|
160
|
+
"check": "pnpm lint:file-size && pnpm lint:fs-boundary && pnpm check:runtime",
|
|
161
|
+
"check:runtime": "pnpm build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs",
|
|
161
162
|
"docs:check": "node scripts/check-doc-examples.mjs",
|
|
162
163
|
"docs:site": "node scripts/build-docs-site.mjs",
|
|
163
164
|
"native:build": "pnpm --filter @openclaw/fs-safe-native-build build",
|
|
@@ -179,23 +180,24 @@
|
|
|
179
180
|
"archive:producer-smoke": "node scripts/archive-producer-smoke.mjs"
|
|
180
181
|
},
|
|
181
182
|
"optionalDependencies": {
|
|
182
|
-
"@openclaw/fs-safe-darwin-arm64": "0.26.
|
|
183
|
-
"@openclaw/fs-safe-darwin-x64": "0.26.
|
|
184
|
-
"@openclaw/fs-safe-freebsd-arm64": "0.26.
|
|
185
|
-
"@openclaw/fs-safe-freebsd-x64": "0.26.
|
|
186
|
-
"@openclaw/fs-safe-linux-arm64-gnu": "0.26.
|
|
187
|
-
"@openclaw/fs-safe-linux-arm64-musl": "0.26.
|
|
188
|
-
"@openclaw/fs-safe-linux-x64-gnu": "0.26.
|
|
189
|
-
"@openclaw/fs-safe-linux-x64-musl": "0.26.
|
|
190
|
-
"@openclaw/fs-safe-win32-arm64-msvc": "0.26.
|
|
191
|
-
"@openclaw/fs-safe-win32-x64-msvc": "0.26.
|
|
183
|
+
"@openclaw/fs-safe-darwin-arm64": "0.26.13",
|
|
184
|
+
"@openclaw/fs-safe-darwin-x64": "0.26.13",
|
|
185
|
+
"@openclaw/fs-safe-freebsd-arm64": "0.26.13",
|
|
186
|
+
"@openclaw/fs-safe-freebsd-x64": "0.26.13",
|
|
187
|
+
"@openclaw/fs-safe-linux-arm64-gnu": "0.26.13",
|
|
188
|
+
"@openclaw/fs-safe-linux-arm64-musl": "0.26.13",
|
|
189
|
+
"@openclaw/fs-safe-linux-x64-gnu": "0.26.13",
|
|
190
|
+
"@openclaw/fs-safe-linux-x64-musl": "0.26.13",
|
|
191
|
+
"@openclaw/fs-safe-win32-arm64-msvc": "0.26.13",
|
|
192
|
+
"@openclaw/fs-safe-win32-x64-msvc": "0.26.13",
|
|
192
193
|
"jszip": "^3.10.2"
|
|
193
194
|
},
|
|
194
195
|
"devDependencies": {
|
|
195
|
-
"@emnapi/runtime": "2.0.0-
|
|
196
|
-
"@napi-rs/cli": "3.10.
|
|
196
|
+
"@emnapi/runtime": "2.0.0-beta.2",
|
|
197
|
+
"@napi-rs/cli": "3.10.9",
|
|
197
198
|
"@types/node": "^26.6.5",
|
|
198
|
-
"@vitest/coverage-v8": "5.0.
|
|
199
|
+
"@vitest/coverage-v8": "5.0.5",
|
|
200
|
+
"acorn": "8.19.0",
|
|
199
201
|
"fast-check": "^4.10.2",
|
|
200
202
|
"istanbul-lib-coverage": "3.2.2",
|
|
201
203
|
"istanbul-lib-report": "3.0.1",
|
|
@@ -203,7 +205,7 @@
|
|
|
203
205
|
"sigstore": "5.0.0",
|
|
204
206
|
"tar": "7.5.22",
|
|
205
207
|
"typescript": "^7.0.2",
|
|
206
|
-
"vite": "8.3.
|
|
208
|
+
"vite": "8.3.5",
|
|
207
209
|
"vitest": "^5.0.3"
|
|
208
210
|
},
|
|
209
211
|
"engines": {
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|