@openclaw/openshell-sandbox 2026.9.3 → 2026.9.5

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