@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.
Files changed (179) hide show
  1. package/dist/.setup/{accounts-B0Pba1-q.mjs → accounts-enJKL3ci.mjs} +4 -8
  2. package/dist/.setup/api-CrasQEKI.mjs +14 -0
  3. package/dist/.setup/{api-CbN3mye4.mjs → api-DljZsfUn.mjs} +9 -11
  4. package/dist/.setup/{approval-auth-DhUKkSkA.mjs → approval-auth-B_5Ytx8K.mjs} +7 -11
  5. package/dist/.setup/{approval-handler.runtime-CsEcBZoc.mjs → approval-handler.runtime-0RbVmTxx.mjs} +7 -8
  6. package/dist/.setup/{approval-reactions-JsqCEOHK.mjs → approval-reactions-CvqVSSx8.mjs} +16 -24
  7. package/dist/.setup/{channel-CM-rLLPN.mjs → channel-ByJj8fSh.mjs} +417 -372
  8. package/dist/.setup/{client-Duwqbgqi.mjs → client-CesmEjRc.mjs} +170 -186
  9. package/dist/.setup/{config-schema-DvxZ18SD.mjs → config-schema-BCmW0BLB.mjs} +2 -5
  10. package/dist/.setup/{doctor-contract-api-BIdVW0PF.mjs → doctor-contract-api-CcLwIhsD.mjs} +88 -95
  11. package/dist/.setup/{identity-B3JyPqGO.mjs → identity-vKtR3DrM.mjs} +39 -2
  12. package/dist/.setup/{install-signal-cli-hYVLYGXe.mjs → install-signal-cli-DvLDZfpP.mjs} +95 -109
  13. package/dist/.setup/{transport-url-CAC0JcuI.mjs → legacy-transport-D_cZC3bS.mjs} +18 -1
  14. package/dist/.setup/{monitor-C6u1JV2C.mjs → monitor-Cf5sihwl.mjs} +166 -239
  15. package/dist/.setup/{probe-D_93QCe0.mjs → probe-Caq5Y4kA.mjs} +3 -3
  16. package/dist/.setup/{send-CM7-016e.mjs → send-BJuOWLky.mjs} +34 -66
  17. package/dist/.setup/{setup-surface-DvKLwYrl.mjs → setup-surface-DQ1yFZmY.mjs} +3 -3
  18. package/dist/.setup/{transport-detection-CmlgOybe.mjs → transport-detection-DvR6X_UQ.mjs} +3 -3
  19. package/dist/.setup/{transport-policy-B6C_LogW.mjs → transport-policy-zIR3lRUj.mjs} +1 -1
  20. package/dist/.setup/transport-probes.runtime-CoH6UFtc.mjs +1 -0
  21. package/dist/.source-module-urls/b02c526df8b90083105b63e5b51d5c8bbfe02676df72f6be8dd8f825817b32b9.json +1 -0
  22. package/dist/api.js +9 -11
  23. package/dist/channel-config-api.js +1 -2
  24. package/dist/channel-plugin-api.js +1 -2
  25. package/dist/contract-api.js +3 -4
  26. package/dist/doctor-contract-api.js +1 -2
  27. package/dist/runtime-api.js +1 -2
  28. package/dist/setup-entry.js +1 -1
  29. package/node_modules/@openclaw/fs-safe/CHANGELOG.md +94 -0
  30. package/node_modules/@openclaw/fs-safe/dist/archive-parser.wasm +0 -0
  31. package/node_modules/@openclaw/fs-safe/dist/copy-file-input.d.ts +1 -1
  32. package/node_modules/@openclaw/fs-safe/dist/copy-file-input.js +3 -1
  33. package/node_modules/@openclaw/fs-safe/dist/copy-path-admission.js +2 -2
  34. package/node_modules/@openclaw/fs-safe/dist/copy-root-file-sync.js +8 -1
  35. package/node_modules/@openclaw/fs-safe/dist/file-open-error.d.ts +2 -0
  36. package/node_modules/@openclaw/fs-safe/dist/file-open-error.js +14 -0
  37. package/node_modules/@openclaw/fs-safe/dist/file-sync.d.ts +2 -1
  38. package/node_modules/@openclaw/fs-safe/dist/file-sync.js +6 -1
  39. package/node_modules/@openclaw/fs-safe/dist/guest-native-python.js +3 -0
  40. package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts +1 -0
  41. package/node_modules/@openclaw/fs-safe/dist/native-config.js +14 -3
  42. package/node_modules/@openclaw/fs-safe/dist/native-operations.js +2 -0
  43. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.js +9 -2
  44. package/node_modules/@openclaw/fs-safe/dist/native-staged-file.js +40 -32
  45. package/node_modules/@openclaw/fs-safe/dist/output.js +6 -0
  46. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts +2 -0
  47. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.js +1 -0
  48. package/node_modules/@openclaw/fs-safe/dist/path.js +5 -1
  49. package/node_modules/@openclaw/fs-safe/dist/pinned-write-staged.js +25 -2
  50. package/node_modules/@openclaw/fs-safe/dist/publication-handle.d.ts +4 -0
  51. package/node_modules/@openclaw/fs-safe/dist/publication-handle.js +32 -0
  52. package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.d.ts +2 -1
  53. package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.js +19 -9
  54. package/node_modules/@openclaw/fs-safe/dist/publish-file.js +23 -24
  55. package/node_modules/@openclaw/fs-safe/dist/publish-rename-fallback.d.ts +21 -0
  56. package/node_modules/@openclaw/fs-safe/dist/publish-rename-fallback.js +102 -0
  57. package/node_modules/@openclaw/fs-safe/dist/root-create-native.js +2 -0
  58. package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.d.ts +3 -1
  59. package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.js +8 -5
  60. package/node_modules/@openclaw/fs-safe/dist/root-directory-list-types.d.ts +3 -0
  61. package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts +2 -1
  62. package/node_modules/@openclaw/fs-safe/dist/root-directory-list.js +19 -9
  63. package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.js +3 -3
  64. package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts +2 -2
  65. package/node_modules/@openclaw/fs-safe/dist/root-path-existing.js +27 -13
  66. package/node_modules/@openclaw/fs-safe/dist/root-path.js +2 -2
  67. package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts +3 -0
  68. package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.js +18 -3
  69. package/node_modules/@openclaw/fs-safe/dist/watch-hints.d.ts +1 -1
  70. package/node_modules/@openclaw/fs-safe/dist/watch-hints.js +68 -21
  71. package/node_modules/@openclaw/fs-safe/dist/watch-io-error.d.ts +2 -0
  72. package/node_modules/@openclaw/fs-safe/dist/watch-io-error.js +27 -0
  73. package/node_modules/@openclaw/fs-safe/dist/watch-io-worker.d.ts +1 -0
  74. package/node_modules/@openclaw/fs-safe/dist/watch-io-worker.js +93 -0
  75. package/node_modules/@openclaw/fs-safe/dist/watch-io.d.ts +47 -0
  76. package/node_modules/@openclaw/fs-safe/dist/watch-io.js +236 -0
  77. package/node_modules/@openclaw/fs-safe/dist/watch-native.d.ts +1 -1
  78. package/node_modules/@openclaw/fs-safe/dist/watch-native.js +3 -3
  79. package/node_modules/@openclaw/fs-safe/dist/watch-probe.d.ts +16 -0
  80. package/node_modules/@openclaw/fs-safe/dist/watch-probe.js +135 -0
  81. package/node_modules/@openclaw/fs-safe/dist/watch-rescan.d.ts +1 -1
  82. package/node_modules/@openclaw/fs-safe/dist/watch-rescan.js +86 -24
  83. package/node_modules/@openclaw/fs-safe/dist/watch-scan.d.ts +4 -0
  84. package/node_modules/@openclaw/fs-safe/dist/watch-scan.js +78 -16
  85. package/node_modules/@openclaw/fs-safe/dist/watch-stream.d.ts +2 -0
  86. package/node_modules/@openclaw/fs-safe/dist/watch-stream.js +23 -0
  87. package/node_modules/@openclaw/fs-safe/dist/watch-types.d.ts +3 -1
  88. package/node_modules/@openclaw/fs-safe/dist/watch.js +60 -13
  89. package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.d.ts +1 -1
  90. package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.js +1 -0
  91. package/node_modules/@openclaw/fs-safe/dist/windows-security-helper.exe +0 -0
  92. package/node_modules/@openclaw/fs-safe/docs/advanced.md +5 -2
  93. package/node_modules/@openclaw/fs-safe/docs/compiler-qualification.md +392 -0
  94. package/node_modules/@openclaw/fs-safe/docs/config.md +7 -1
  95. package/node_modules/@openclaw/fs-safe/docs/contributing.md +25 -5
  96. package/node_modules/@openclaw/fs-safe/docs/copy.md +10 -0
  97. package/node_modules/@openclaw/fs-safe/docs/durability.md +9 -3
  98. package/node_modules/@openclaw/fs-safe/docs/errors.md +13 -0
  99. package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.5.md +6 -4
  100. package/node_modules/@openclaw/fs-safe/docs/native-helper.md +6 -4
  101. package/node_modules/@openclaw/fs-safe/docs/output.md +4 -2
  102. package/node_modules/@openclaw/fs-safe/docs/path.md +5 -2
  103. package/node_modules/@openclaw/fs-safe/docs/permissions.md +15 -0
  104. package/node_modules/@openclaw/fs-safe/docs/security-model.md +9 -0
  105. package/node_modules/@openclaw/fs-safe/docs/staged-file.md +2 -0
  106. package/node_modules/@openclaw/fs-safe/docs/testing.md +1 -1
  107. package/node_modules/@openclaw/fs-safe/docs/watch.md +62 -5
  108. package/node_modules/@openclaw/fs-safe/docs/writing.md +6 -1
  109. package/node_modules/@openclaw/fs-safe/package.json +18 -16
  110. package/node_modules/@openclaw/fs-safe-darwin-arm64/fs-safe-native.node +0 -0
  111. package/node_modules/@openclaw/fs-safe-darwin-arm64/package.json +1 -1
  112. package/node_modules/@openclaw/fs-safe-darwin-x64/fs-safe-native.node +0 -0
  113. package/node_modules/@openclaw/fs-safe-darwin-x64/package.json +1 -1
  114. package/node_modules/@openclaw/fs-safe-freebsd-arm64/fs-safe-native.node +0 -0
  115. package/node_modules/@openclaw/fs-safe-freebsd-arm64/package.json +1 -1
  116. package/node_modules/@openclaw/fs-safe-freebsd-x64/fs-safe-native.node +0 -0
  117. package/node_modules/@openclaw/fs-safe-freebsd-x64/package.json +1 -1
  118. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/fs-safe-native.node +0 -0
  119. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/package.json +1 -1
  120. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/fs-safe-native.node +0 -0
  121. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/package.json +1 -1
  122. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/fs-safe-native.node +0 -0
  123. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/package.json +1 -1
  124. package/node_modules/@openclaw/fs-safe-linux-x64-musl/fs-safe-native.node +0 -0
  125. package/node_modules/@openclaw/fs-safe-linux-x64-musl/package.json +1 -1
  126. package/node_modules/@openclaw/fs-safe-win32-arm64-msvc/fs-safe-native.node +0 -0
  127. package/node_modules/@openclaw/fs-safe-win32-arm64-msvc/package.json +1 -1
  128. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/fs-safe-native.node +0 -0
  129. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/package.json +1 -1
  130. package/node_modules/zod/package.json +1 -1
  131. package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
  132. package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
  133. package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
  134. package/node_modules/zod/src/v4/core/compile.ts +9 -0
  135. package/node_modules/zod/src/v4/core/schemas.ts +35 -1
  136. package/node_modules/zod/src/v4/core/util.ts +13 -0
  137. package/node_modules/zod/src/v4/core/versions.ts +1 -1
  138. package/node_modules/zod/v4/core/compile.cjs +8 -0
  139. package/node_modules/zod/v4/core/compile.js +8 -0
  140. package/node_modules/zod/v4/core/schemas.cjs +30 -0
  141. package/node_modules/zod/v4/core/schemas.d.cts +3 -1
  142. package/node_modules/zod/v4/core/schemas.d.ts +3 -1
  143. package/node_modules/zod/v4/core/schemas.js +30 -0
  144. package/node_modules/zod/v4/core/util.cjs +15 -0
  145. package/node_modules/zod/v4/core/util.d.cts +2 -0
  146. package/node_modules/zod/v4/core/util.d.ts +2 -0
  147. package/node_modules/zod/v4/core/util.js +14 -0
  148. package/node_modules/zod/v4/core/versions.cjs +1 -1
  149. package/node_modules/zod/v4/core/versions.js +1 -1
  150. package/openclaw.plugin.json +0 -30
  151. package/package.json +6 -8
  152. package/dist/.setup/api-CJBtD3lT.mjs +0 -16
  153. package/dist/.setup/client-adapter-Chnbch_z.mjs +0 -30
  154. package/dist/.setup/legacy-transport-QIpaMNST.mjs +0 -18
  155. package/dist/.setup/normalize-D7kSomXt.mjs +0 -39
  156. package/dist/.setup/reaction-runtime-api-mdO4k0yv.mjs +0 -65
  157. package/dist/.setup/reaction-targets-BgPLDHBf.mjs +0 -72
  158. package/dist/.setup/rpc-context-BAXcX7dI.mjs +0 -13
  159. package/dist/.setup/transport-probes.runtime-D-xIMRcn.mjs +0 -2
  160. package/dist/reaction-runtime-api.js +0 -2
  161. package/node_modules/ws/LICENSE +0 -20
  162. package/node_modules/ws/README.md +0 -548
  163. package/node_modules/ws/browser.js +0 -8
  164. package/node_modules/ws/index.js +0 -22
  165. package/node_modules/ws/lib/buffer-util.js +0 -131
  166. package/node_modules/ws/lib/constants.js +0 -19
  167. package/node_modules/ws/lib/event-target.js +0 -292
  168. package/node_modules/ws/lib/extension.js +0 -203
  169. package/node_modules/ws/lib/limiter.js +0 -55
  170. package/node_modules/ws/lib/permessage-deflate.js +0 -530
  171. package/node_modules/ws/lib/receiver.js +0 -743
  172. package/node_modules/ws/lib/sender.js +0 -607
  173. package/node_modules/ws/lib/stream.js +0 -161
  174. package/node_modules/ws/lib/subprotocol.js +0 -62
  175. package/node_modules/ws/lib/validation.js +0 -152
  176. package/node_modules/ws/lib/websocket-server.js +0 -562
  177. package/node_modules/ws/lib/websocket.js +0 -1421
  178. package/node_modules/ws/package.json +0 -74
  179. 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. Use `configureFsSafeNative()` or `FS_SAFE_NATIVE_MODE`. See the
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 | `macos-15` | arm64 | Node 22, 24, 26 |
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 | `macos-15` | arm64 | Node 24, Bun 1.4.2 |
327
- | Native check | `macos-15-intel` | x64 | Node 24, Bun 1.4.2 |
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`, `macos-15`, `fs-safe-windows-16core` | host | Node 22, 24 |
336
- | Coverage | `ubuntu-latest`, `macos-15`, `fs-safe-windows-16core` | host | Node 22 |
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 existing native file-move fallback.
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, then unlinks the source and verifies the
224
- target has one link. Fallback collisions report `already-exists` without clobbering;
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. Python environment settings are now ignored
47
- silently: a deployment that set `FS_SAFE_PYTHON_MODE=require` or `off` runs in
48
- `auto` after upgrading unless it sets `FS_SAFE_NATIVE_MODE` (or calls
49
- `configureFsSafeNative`) first. Programmatic native configuration wins, followed by
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 has been removed. Old Python environment
184
- settings are ignored without a warning, so an old `require` or `off` setting
185
- does not select the corresponding native policy. Configure
186
- `FS_SAFE_NATIVE_MODE` or `configureFsSafeNative()` explicitly. Follow the
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 parent identity is guarded across
103
- the operation and the parent directory is synchronized best-effort after
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
- This convenience wrapper preserves ordinary Node `realpath` semantics; it is
90
- not a caller-path admission boundary on its own.
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
- `macos-15` (arm64), `macos-15-intel`, and the Windows latest 16-core runner,
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
- Periodic guarded reconciliation runs without needing an event. It catches
199
- missed events and works on filesystems where native hints are incomplete.
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 missed-event check. Repeated passes reuse bounded pathname strings, never
213
- cached metadata or filesystem authority.
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. Events during a pass coalesce into one pending pass and
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 unlinks its temporary name in the same JavaScript turn.
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.5",
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 build && pnpm archive:wasm:allocator-tests && pnpm docs:check && pnpm test && node scripts/check-pack.mjs",
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.5",
183
- "@openclaw/fs-safe-darwin-x64": "0.26.5",
184
- "@openclaw/fs-safe-freebsd-arm64": "0.26.5",
185
- "@openclaw/fs-safe-freebsd-x64": "0.26.5",
186
- "@openclaw/fs-safe-linux-arm64-gnu": "0.26.5",
187
- "@openclaw/fs-safe-linux-arm64-musl": "0.26.5",
188
- "@openclaw/fs-safe-linux-x64-gnu": "0.26.5",
189
- "@openclaw/fs-safe-linux-x64-musl": "0.26.5",
190
- "@openclaw/fs-safe-win32-arm64-msvc": "0.26.5",
191
- "@openclaw/fs-safe-win32-x64-msvc": "0.26.5",
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-alpha.6",
196
- "@napi-rs/cli": "3.10.8",
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.3",
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.4",
208
+ "vite": "8.3.5",
207
209
  "vitest": "^5.0.3"
208
210
  },
209
211
  "engines": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-darwin-arm64",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "macOS arm64 native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-darwin-x64",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "macOS x64 native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-freebsd-arm64",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "FreeBSD 14.4+ arm64 native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-freebsd-x64",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "FreeBSD 14.4+ x64 native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-linux-arm64-gnu",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "Linux arm64 glibc native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-linux-arm64-musl",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "Linux arm64 musl native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-linux-x64-gnu",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "Linux x64 glibc native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-linux-x64-musl",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "Linux x64 musl native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-win32-arm64-msvc",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "Windows ARM64 MSVC native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fs-safe-win32-x64-msvc",
3
- "version": "0.26.5",
3
+ "version": "0.26.13",
4
4
  "description": "Windows x64 MSVC native binding for @openclaw/fs-safe.",
5
5
  "license": "MIT",
6
6
  "author": "OpenClaw Team <dev@openclaw.ai>",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zod",
3
- "version": "4.6.5",
3
+ "version": "4.6.7",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Colin McDonnell <zod@colinhacks.com>",