@openclaw/openshell-sandbox 2026.9.2 → 2026.9.3

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 (710) hide show
  1. package/dist/index.js +87 -47
  2. package/node_modules/@openclaw/fs-safe/CHANGELOG.md +700 -0
  3. package/node_modules/@openclaw/fs-safe/LICENSE +21 -0
  4. package/node_modules/@openclaw/fs-safe/README.md +564 -0
  5. package/node_modules/@openclaw/fs-safe/SECURITY.md +45 -0
  6. package/node_modules/@openclaw/fs-safe/dist/absolute-path.d.ts +33 -0
  7. package/node_modules/@openclaw/fs-safe/dist/absolute-path.d.ts.map +1 -0
  8. package/node_modules/@openclaw/fs-safe/dist/absolute-path.js +307 -0
  9. package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts +26 -0
  10. package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts.map +1 -0
  11. package/node_modules/@openclaw/fs-safe/dist/advanced.js +28 -0
  12. package/node_modules/@openclaw/fs-safe/dist/archive-crc32.d.ts +2 -0
  13. package/node_modules/@openclaw/fs-safe/dist/archive-crc32.d.ts.map +1 -0
  14. package/node_modules/@openclaw/fs-safe/dist/archive-crc32.js +14 -0
  15. package/node_modules/@openclaw/fs-safe/dist/archive-deadline.d.ts +12 -0
  16. package/node_modules/@openclaw/fs-safe/dist/archive-deadline.d.ts.map +1 -0
  17. package/node_modules/@openclaw/fs-safe/dist/archive-deadline.js +103 -0
  18. package/node_modules/@openclaw/fs-safe/dist/archive-entry.d.ts +14 -0
  19. package/node_modules/@openclaw/fs-safe/dist/archive-entry.d.ts.map +1 -0
  20. package/node_modules/@openclaw/fs-safe/dist/archive-entry.js +85 -0
  21. package/node_modules/@openclaw/fs-safe/dist/archive-errors.d.ts +13 -0
  22. package/node_modules/@openclaw/fs-safe/dist/archive-errors.d.ts.map +1 -0
  23. package/node_modules/@openclaw/fs-safe/dist/archive-errors.js +23 -0
  24. package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.d.ts +18 -0
  25. package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.d.ts.map +1 -0
  26. package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.js +74 -0
  27. package/node_modules/@openclaw/fs-safe/dist/archive-input.d.ts +19 -0
  28. package/node_modules/@openclaw/fs-safe/dist/archive-input.d.ts.map +1 -0
  29. package/node_modules/@openclaw/fs-safe/dist/archive-input.js +92 -0
  30. package/node_modules/@openclaw/fs-safe/dist/archive-kind.d.ts +9 -0
  31. package/node_modules/@openclaw/fs-safe/dist/archive-kind.d.ts.map +1 -0
  32. package/node_modules/@openclaw/fs-safe/dist/archive-kind.js +82 -0
  33. package/node_modules/@openclaw/fs-safe/dist/archive-limits.d.ts +57 -0
  34. package/node_modules/@openclaw/fs-safe/dist/archive-limits.d.ts.map +1 -0
  35. package/node_modules/@openclaw/fs-safe/dist/archive-limits.js +131 -0
  36. package/node_modules/@openclaw/fs-safe/dist/archive-merge.d.ts +18 -0
  37. package/node_modules/@openclaw/fs-safe/dist/archive-merge.d.ts.map +1 -0
  38. package/node_modules/@openclaw/fs-safe/dist/archive-merge.js +157 -0
  39. package/node_modules/@openclaw/fs-safe/dist/archive-native.d.ts +20 -0
  40. package/node_modules/@openclaw/fs-safe/dist/archive-native.d.ts.map +1 -0
  41. package/node_modules/@openclaw/fs-safe/dist/archive-native.js +107 -0
  42. package/node_modules/@openclaw/fs-safe/dist/archive-options.d.ts +21 -0
  43. package/node_modules/@openclaw/fs-safe/dist/archive-options.d.ts.map +1 -0
  44. package/node_modules/@openclaw/fs-safe/dist/archive-options.js +1 -0
  45. package/node_modules/@openclaw/fs-safe/dist/archive-parser-errors.d.ts +2 -0
  46. package/node_modules/@openclaw/fs-safe/dist/archive-parser-errors.d.ts.map +1 -0
  47. package/node_modules/@openclaw/fs-safe/dist/archive-parser-errors.js +12 -0
  48. package/node_modules/@openclaw/fs-safe/dist/archive-parser.wasm +0 -0
  49. package/node_modules/@openclaw/fs-safe/dist/archive-plan.d.ts +20 -0
  50. package/node_modules/@openclaw/fs-safe/dist/archive-plan.d.ts.map +1 -0
  51. package/node_modules/@openclaw/fs-safe/dist/archive-plan.js +55 -0
  52. package/node_modules/@openclaw/fs-safe/dist/archive-policy.d.ts +22 -0
  53. package/node_modules/@openclaw/fs-safe/dist/archive-policy.d.ts.map +1 -0
  54. package/node_modules/@openclaw/fs-safe/dist/archive-policy.js +38 -0
  55. package/node_modules/@openclaw/fs-safe/dist/archive-read.d.ts +6 -0
  56. package/node_modules/@openclaw/fs-safe/dist/archive-read.d.ts.map +1 -0
  57. package/node_modules/@openclaw/fs-safe/dist/archive-read.js +225 -0
  58. package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts +31 -0
  59. package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts.map +1 -0
  60. package/node_modules/@openclaw/fs-safe/dist/archive-staging.js +250 -0
  61. package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.d.ts +7 -0
  62. package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.d.ts.map +1 -0
  63. package/node_modules/@openclaw/fs-safe/dist/archive-tar-inspect.js +59 -0
  64. package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.d.ts +18 -0
  65. package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.d.ts.map +1 -0
  66. package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.js +95 -0
  67. package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.d.ts +18 -0
  68. package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.d.ts.map +1 -0
  69. package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.js +99 -0
  70. package/node_modules/@openclaw/fs-safe/dist/archive-tar.d.ts +19 -0
  71. package/node_modules/@openclaw/fs-safe/dist/archive-tar.d.ts.map +1 -0
  72. package/node_modules/@openclaw/fs-safe/dist/archive-tar.js +21 -0
  73. package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.d.ts +8 -0
  74. package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.d.ts.map +1 -0
  75. package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.js +60 -0
  76. package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.d.ts +2 -0
  77. package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.d.ts.map +1 -0
  78. package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.js +140 -0
  79. package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.d.ts +15 -0
  80. package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.d.ts.map +1 -0
  81. package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.js +228 -0
  82. package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.d.ts +21 -0
  83. package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.d.ts.map +1 -0
  84. package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.js +27 -0
  85. package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.d.ts +5 -0
  86. package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.d.ts.map +1 -0
  87. package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.js +41 -0
  88. package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.d.ts +12 -0
  89. package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.d.ts.map +1 -0
  90. package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.js +100 -0
  91. package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts +7 -0
  92. package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts.map +1 -0
  93. package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.js +44 -0
  94. package/node_modules/@openclaw/fs-safe/dist/archive.d.ts +15 -0
  95. package/node_modules/@openclaw/fs-safe/dist/archive.d.ts.map +1 -0
  96. package/node_modules/@openclaw/fs-safe/dist/archive.js +275 -0
  97. package/node_modules/@openclaw/fs-safe/dist/async-lock.d.ts +2 -0
  98. package/node_modules/@openclaw/fs-safe/dist/async-lock.d.ts.map +1 -0
  99. package/node_modules/@openclaw/fs-safe/dist/async-lock.js +17 -0
  100. package/node_modules/@openclaw/fs-safe/dist/atomic.d.ts +5 -0
  101. package/node_modules/@openclaw/fs-safe/dist/atomic.d.ts.map +1 -0
  102. package/node_modules/@openclaw/fs-safe/dist/atomic.js +4 -0
  103. package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.d.ts +4 -0
  104. package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.d.ts.map +1 -0
  105. package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.js +21 -0
  106. package/node_modules/@openclaw/fs-safe/dist/bounded-read.d.ts +14 -0
  107. package/node_modules/@openclaw/fs-safe/dist/bounded-read.d.ts.map +1 -0
  108. package/node_modules/@openclaw/fs-safe/dist/bounded-read.js +106 -0
  109. package/node_modules/@openclaw/fs-safe/dist/byte-budget.d.ts +4 -0
  110. package/node_modules/@openclaw/fs-safe/dist/byte-budget.d.ts.map +1 -0
  111. package/node_modules/@openclaw/fs-safe/dist/byte-budget.js +9 -0
  112. package/node_modules/@openclaw/fs-safe/dist/config.d.ts +3 -0
  113. package/node_modules/@openclaw/fs-safe/dist/config.d.ts.map +1 -0
  114. package/node_modules/@openclaw/fs-safe/dist/config.js +2 -0
  115. package/node_modules/@openclaw/fs-safe/dist/containment.d.ts +2 -0
  116. package/node_modules/@openclaw/fs-safe/dist/containment.d.ts.map +1 -0
  117. package/node_modules/@openclaw/fs-safe/dist/containment.js +1 -0
  118. package/node_modules/@openclaw/fs-safe/dist/deny-mutations.d.ts +12 -0
  119. package/node_modules/@openclaw/fs-safe/dist/deny-mutations.d.ts.map +1 -0
  120. package/node_modules/@openclaw/fs-safe/dist/deny-mutations.js +69 -0
  121. package/node_modules/@openclaw/fs-safe/dist/device-path.d.ts +15 -0
  122. package/node_modules/@openclaw/fs-safe/dist/device-path.d.ts.map +1 -0
  123. package/node_modules/@openclaw/fs-safe/dist/device-path.js +137 -0
  124. package/node_modules/@openclaw/fs-safe/dist/directory-durability.d.ts +44 -0
  125. package/node_modules/@openclaw/fs-safe/dist/directory-durability.d.ts.map +1 -0
  126. package/node_modules/@openclaw/fs-safe/dist/directory-durability.js +299 -0
  127. package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts +31 -0
  128. package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts.map +1 -0
  129. package/node_modules/@openclaw/fs-safe/dist/directory-guard.js +82 -0
  130. package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts +8 -0
  131. package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts.map +1 -0
  132. package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.js +93 -0
  133. package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.d.ts +21 -0
  134. package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.d.ts.map +1 -0
  135. package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.js +78 -0
  136. package/node_modules/@openclaw/fs-safe/dist/durability.d.ts +4 -0
  137. package/node_modules/@openclaw/fs-safe/dist/durability.d.ts.map +1 -0
  138. package/node_modules/@openclaw/fs-safe/dist/durability.js +3 -0
  139. package/node_modules/@openclaw/fs-safe/dist/error-detail.d.ts +3 -0
  140. package/node_modules/@openclaw/fs-safe/dist/error-detail.d.ts.map +1 -0
  141. package/node_modules/@openclaw/fs-safe/dist/error-detail.js +10 -0
  142. package/node_modules/@openclaw/fs-safe/dist/errors.d.ts +14 -0
  143. package/node_modules/@openclaw/fs-safe/dist/errors.d.ts.map +1 -0
  144. package/node_modules/@openclaw/fs-safe/dist/errors.js +26 -0
  145. package/node_modules/@openclaw/fs-safe/dist/file-hash.d.ts +10 -0
  146. package/node_modules/@openclaw/fs-safe/dist/file-hash.d.ts.map +1 -0
  147. package/node_modules/@openclaw/fs-safe/dist/file-hash.js +73 -0
  148. package/node_modules/@openclaw/fs-safe/dist/file-identity.d.ts +8 -0
  149. package/node_modules/@openclaw/fs-safe/dist/file-identity.d.ts.map +1 -0
  150. package/node_modules/@openclaw/fs-safe/dist/file-identity.js +34 -0
  151. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.d.ts +35 -0
  152. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.d.ts.map +1 -0
  153. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.js +349 -0
  154. package/node_modules/@openclaw/fs-safe/dist/file-lock.d.ts +24 -0
  155. package/node_modules/@openclaw/fs-safe/dist/file-lock.d.ts.map +1 -0
  156. package/node_modules/@openclaw/fs-safe/dist/file-lock.js +46 -0
  157. package/node_modules/@openclaw/fs-safe/dist/file-observation.d.ts +9 -0
  158. package/node_modules/@openclaw/fs-safe/dist/file-observation.d.ts.map +1 -0
  159. package/node_modules/@openclaw/fs-safe/dist/file-observation.js +22 -0
  160. package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts +33 -0
  161. package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts.map +1 -0
  162. package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.js +189 -0
  163. package/node_modules/@openclaw/fs-safe/dist/file-store-limit.d.ts +2 -0
  164. package/node_modules/@openclaw/fs-safe/dist/file-store-limit.d.ts.map +1 -0
  165. package/node_modules/@openclaw/fs-safe/dist/file-store-limit.js +8 -0
  166. package/node_modules/@openclaw/fs-safe/dist/file-store-prune.d.ts +12 -0
  167. package/node_modules/@openclaw/fs-safe/dist/file-store-prune.d.ts.map +1 -0
  168. package/node_modules/@openclaw/fs-safe/dist/file-store-prune.js +95 -0
  169. package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.d.ts +9 -0
  170. package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.d.ts.map +1 -0
  171. package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.js +127 -0
  172. package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts +62 -0
  173. package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts.map +1 -0
  174. package/node_modules/@openclaw/fs-safe/dist/file-store.js +357 -0
  175. package/node_modules/@openclaw/fs-safe/dist/file-sync.d.ts +5 -0
  176. package/node_modules/@openclaw/fs-safe/dist/file-sync.d.ts.map +1 -0
  177. package/node_modules/@openclaw/fs-safe/dist/file-sync.js +19 -0
  178. package/node_modules/@openclaw/fs-safe/dist/filename.d.ts +8 -0
  179. package/node_modules/@openclaw/fs-safe/dist/filename.d.ts.map +1 -0
  180. package/node_modules/@openclaw/fs-safe/dist/filename.js +91 -0
  181. package/node_modules/@openclaw/fs-safe/dist/fs.d.ts +13 -0
  182. package/node_modules/@openclaw/fs-safe/dist/fs.d.ts.map +1 -0
  183. package/node_modules/@openclaw/fs-safe/dist/fs.js +30 -0
  184. package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.d.ts +14 -0
  185. package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.d.ts.map +1 -0
  186. package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.js +87 -0
  187. package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.d.ts +37 -0
  188. package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.d.ts.map +1 -0
  189. package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.js +82 -0
  190. package/node_modules/@openclaw/fs-safe/dist/home-dir.d.ts +12 -0
  191. package/node_modules/@openclaw/fs-safe/dist/home-dir.d.ts.map +1 -0
  192. package/node_modules/@openclaw/fs-safe/dist/home-dir.js +84 -0
  193. package/node_modules/@openclaw/fs-safe/dist/index.d.ts +7 -0
  194. package/node_modules/@openclaw/fs-safe/dist/index.d.ts.map +1 -0
  195. package/node_modules/@openclaw/fs-safe/dist/index.js +5 -0
  196. package/node_modules/@openclaw/fs-safe/dist/install-path.d.ts +20 -0
  197. package/node_modules/@openclaw/fs-safe/dist/install-path.d.ts.map +1 -0
  198. package/node_modules/@openclaw/fs-safe/dist/install-path.js +94 -0
  199. package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts +35 -0
  200. package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts.map +1 -0
  201. package/node_modules/@openclaw/fs-safe/dist/json-document-store.js +97 -0
  202. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.d.ts +2 -0
  203. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.d.ts.map +1 -0
  204. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.js +20 -0
  205. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts +17 -0
  206. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts.map +1 -0
  207. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.js +292 -0
  208. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts +46 -0
  209. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts.map +1 -0
  210. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.js +383 -0
  211. package/node_modules/@openclaw/fs-safe/dist/json-store.d.ts +9 -0
  212. package/node_modules/@openclaw/fs-safe/dist/json-store.d.ts.map +1 -0
  213. package/node_modules/@openclaw/fs-safe/dist/json-store.js +12 -0
  214. package/node_modules/@openclaw/fs-safe/dist/json-stringify.d.ts +2 -0
  215. package/node_modules/@openclaw/fs-safe/dist/json-stringify.d.ts.map +1 -0
  216. package/node_modules/@openclaw/fs-safe/dist/json-stringify.js +7 -0
  217. package/node_modules/@openclaw/fs-safe/dist/json.d.ts +50 -0
  218. package/node_modules/@openclaw/fs-safe/dist/json.d.ts.map +1 -0
  219. package/node_modules/@openclaw/fs-safe/dist/json.js +343 -0
  220. package/node_modules/@openclaw/fs-safe/dist/local-file-access.d.ts +9 -0
  221. package/node_modules/@openclaw/fs-safe/dist/local-file-access.d.ts.map +1 -0
  222. package/node_modules/@openclaw/fs-safe/dist/local-file-access.js +87 -0
  223. package/node_modules/@openclaw/fs-safe/dist/local-roots.d.ts +26 -0
  224. package/node_modules/@openclaw/fs-safe/dist/local-roots.d.ts.map +1 -0
  225. package/node_modules/@openclaw/fs-safe/dist/local-roots.js +135 -0
  226. package/node_modules/@openclaw/fs-safe/dist/lock-config.d.ts +10 -0
  227. package/node_modules/@openclaw/fs-safe/dist/lock-config.d.ts.map +1 -0
  228. package/node_modules/@openclaw/fs-safe/dist/lock-config.js +12 -0
  229. package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.d.ts +43 -0
  230. package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.d.ts.map +1 -0
  231. package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.js +161 -0
  232. package/node_modules/@openclaw/fs-safe/dist/move-path.d.ts +21 -0
  233. package/node_modules/@openclaw/fs-safe/dist/move-path.d.ts.map +1 -0
  234. package/node_modules/@openclaw/fs-safe/dist/move-path.js +334 -0
  235. package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts +93 -0
  236. package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts.map +1 -0
  237. package/node_modules/@openclaw/fs-safe/dist/native-binding.js +1 -0
  238. package/node_modules/@openclaw/fs-safe/dist/native-config.d.ts +17 -0
  239. package/node_modules/@openclaw/fs-safe/dist/native-config.d.ts.map +1 -0
  240. package/node_modules/@openclaw/fs-safe/dist/native-config.js +71 -0
  241. package/node_modules/@openclaw/fs-safe/dist/native-operations.d.ts +21 -0
  242. package/node_modules/@openclaw/fs-safe/dist/native-operations.d.ts.map +1 -0
  243. package/node_modules/@openclaw/fs-safe/dist/native-operations.js +132 -0
  244. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.d.ts +8 -0
  245. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.d.ts.map +1 -0
  246. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.js +96 -0
  247. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.d.ts +5 -0
  248. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.d.ts.map +1 -0
  249. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.js +161 -0
  250. package/node_modules/@openclaw/fs-safe/dist/native-staged-file.d.ts +31 -0
  251. package/node_modules/@openclaw/fs-safe/dist/native-staged-file.d.ts.map +1 -0
  252. package/node_modules/@openclaw/fs-safe/dist/native-staged-file.js +362 -0
  253. package/node_modules/@openclaw/fs-safe/dist/native.d.ts +14 -0
  254. package/node_modules/@openclaw/fs-safe/dist/native.d.ts.map +1 -0
  255. package/node_modules/@openclaw/fs-safe/dist/native.js +204 -0
  256. package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.d.ts +8 -0
  257. package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.d.ts.map +1 -0
  258. package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.js +45 -0
  259. package/node_modules/@openclaw/fs-safe/dist/opened-realpath.d.ts +16 -0
  260. package/node_modules/@openclaw/fs-safe/dist/opened-realpath.d.ts.map +1 -0
  261. package/node_modules/@openclaw/fs-safe/dist/opened-realpath.js +92 -0
  262. package/node_modules/@openclaw/fs-safe/dist/output.d.ts +15 -0
  263. package/node_modules/@openclaw/fs-safe/dist/output.d.ts.map +1 -0
  264. package/node_modules/@openclaw/fs-safe/dist/output.js +123 -0
  265. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts +31 -0
  266. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts.map +1 -0
  267. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.js +28 -0
  268. package/node_modules/@openclaw/fs-safe/dist/path-policy.d.ts +25 -0
  269. package/node_modules/@openclaw/fs-safe/dist/path-policy.d.ts.map +1 -0
  270. package/node_modules/@openclaw/fs-safe/dist/path-policy.js +44 -0
  271. package/node_modules/@openclaw/fs-safe/dist/path.d.ts +21 -0
  272. package/node_modules/@openclaw/fs-safe/dist/path.d.ts.map +1 -0
  273. package/node_modules/@openclaw/fs-safe/dist/path.js +136 -0
  274. package/node_modules/@openclaw/fs-safe/dist/permission-exec.d.ts +25 -0
  275. package/node_modules/@openclaw/fs-safe/dist/permission-exec.d.ts.map +1 -0
  276. package/node_modules/@openclaw/fs-safe/dist/permission-exec.js +74 -0
  277. package/node_modules/@openclaw/fs-safe/dist/permissions-public.d.ts +4 -0
  278. package/node_modules/@openclaw/fs-safe/dist/permissions-public.d.ts.map +1 -0
  279. package/node_modules/@openclaw/fs-safe/dist/permissions-public.js +3 -0
  280. package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts +59 -0
  281. package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts.map +1 -0
  282. package/node_modules/@openclaw/fs-safe/dist/permissions-windows.js +296 -0
  283. package/node_modules/@openclaw/fs-safe/dist/permissions.d.ts +60 -0
  284. package/node_modules/@openclaw/fs-safe/dist/permissions.d.ts.map +1 -0
  285. package/node_modules/@openclaw/fs-safe/dist/permissions.js +125 -0
  286. package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts +24 -0
  287. package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts.map +1 -0
  288. package/node_modules/@openclaw/fs-safe/dist/pinned-open.js +74 -0
  289. package/node_modules/@openclaw/fs-safe/dist/pinned-operation.d.ts +2 -0
  290. package/node_modules/@openclaw/fs-safe/dist/pinned-operation.d.ts.map +1 -0
  291. package/node_modules/@openclaw/fs-safe/dist/pinned-operation.js +35 -0
  292. package/node_modules/@openclaw/fs-safe/dist/pinned-write.d.ts +36 -0
  293. package/node_modules/@openclaw/fs-safe/dist/pinned-write.d.ts.map +1 -0
  294. package/node_modules/@openclaw/fs-safe/dist/pinned-write.js +252 -0
  295. package/node_modules/@openclaw/fs-safe/dist/private-directory.d.ts +5 -0
  296. package/node_modules/@openclaw/fs-safe/dist/private-directory.d.ts.map +1 -0
  297. package/node_modules/@openclaw/fs-safe/dist/private-directory.js +14 -0
  298. package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.d.ts +45 -0
  299. package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.d.ts.map +1 -0
  300. package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.js +299 -0
  301. package/node_modules/@openclaw/fs-safe/dist/publish-file-failure.d.ts +28 -0
  302. package/node_modules/@openclaw/fs-safe/dist/publish-file-failure.d.ts.map +1 -0
  303. package/node_modules/@openclaw/fs-safe/dist/publish-file-failure.js +22 -0
  304. package/node_modules/@openclaw/fs-safe/dist/publish-file.d.ts +21 -0
  305. package/node_modules/@openclaw/fs-safe/dist/publish-file.d.ts.map +1 -0
  306. package/node_modules/@openclaw/fs-safe/dist/publish-file.js +366 -0
  307. package/node_modules/@openclaw/fs-safe/dist/read-open-flags.d.ts +8 -0
  308. package/node_modules/@openclaw/fs-safe/dist/read-open-flags.d.ts.map +1 -0
  309. package/node_modules/@openclaw/fs-safe/dist/read-open-flags.js +13 -0
  310. package/node_modules/@openclaw/fs-safe/dist/read-opened-file.d.ts +21 -0
  311. package/node_modules/@openclaw/fs-safe/dist/read-opened-file.d.ts.map +1 -0
  312. package/node_modules/@openclaw/fs-safe/dist/read-opened-file.js +18 -0
  313. package/node_modules/@openclaw/fs-safe/dist/regular-file.d.ts +38 -0
  314. package/node_modules/@openclaw/fs-safe/dist/regular-file.d.ts.map +1 -0
  315. package/node_modules/@openclaw/fs-safe/dist/regular-file.js +391 -0
  316. package/node_modules/@openclaw/fs-safe/dist/replace-directory.d.ts +7 -0
  317. package/node_modules/@openclaw/fs-safe/dist/replace-directory.d.ts.map +1 -0
  318. package/node_modules/@openclaw/fs-safe/dist/replace-directory.js +42 -0
  319. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.d.ts +39 -0
  320. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.d.ts.map +1 -0
  321. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.js +331 -0
  322. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.d.ts +21 -0
  323. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.d.ts.map +1 -0
  324. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.js +107 -0
  325. package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.d.ts +51 -0
  326. package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.d.ts.map +1 -0
  327. package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.js +161 -0
  328. package/node_modules/@openclaw/fs-safe/dist/replace-file-rename-policy.d.ts +7 -0
  329. package/node_modules/@openclaw/fs-safe/dist/replace-file-rename-policy.d.ts.map +1 -0
  330. package/node_modules/@openclaw/fs-safe/dist/replace-file-rename-policy.js +30 -0
  331. package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts +53 -0
  332. package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts.map +1 -0
  333. package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.js +376 -0
  334. package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts +58 -0
  335. package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts.map +1 -0
  336. package/node_modules/@openclaw/fs-safe/dist/replace-file.js +329 -0
  337. package/node_modules/@openclaw/fs-safe/dist/root-context.d.ts +38 -0
  338. package/node_modules/@openclaw/fs-safe/dist/root-context.d.ts.map +1 -0
  339. package/node_modules/@openclaw/fs-safe/dist/root-context.js +141 -0
  340. package/node_modules/@openclaw/fs-safe/dist/root-errors.d.ts +12 -0
  341. package/node_modules/@openclaw/fs-safe/dist/root-errors.d.ts.map +1 -0
  342. package/node_modules/@openclaw/fs-safe/dist/root-errors.js +75 -0
  343. package/node_modules/@openclaw/fs-safe/dist/root-file.d.ts +45 -0
  344. package/node_modules/@openclaw/fs-safe/dist/root-file.d.ts.map +1 -0
  345. package/node_modules/@openclaw/fs-safe/dist/root-file.js +120 -0
  346. package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts +163 -0
  347. package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts.map +1 -0
  348. package/node_modules/@openclaw/fs-safe/dist/root-impl.js +1230 -0
  349. package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts +3 -0
  350. package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts.map +1 -0
  351. package/node_modules/@openclaw/fs-safe/dist/root-path-existing.js +68 -0
  352. package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.d.ts +7 -0
  353. package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.d.ts.map +1 -0
  354. package/node_modules/@openclaw/fs-safe/dist/root-path-symlink.js +35 -0
  355. package/node_modules/@openclaw/fs-safe/dist/root-path.d.ts +40 -0
  356. package/node_modules/@openclaw/fs-safe/dist/root-path.d.ts.map +1 -0
  357. package/node_modules/@openclaw/fs-safe/dist/root-path.js +481 -0
  358. package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts +89 -0
  359. package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts.map +1 -0
  360. package/node_modules/@openclaw/fs-safe/dist/root-paths.js +381 -0
  361. package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts +41 -0
  362. package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts.map +1 -0
  363. package/node_modules/@openclaw/fs-safe/dist/root-walk.js +133 -0
  364. package/node_modules/@openclaw/fs-safe/dist/root-write-mode.d.ts +6 -0
  365. package/node_modules/@openclaw/fs-safe/dist/root-write-mode.d.ts.map +1 -0
  366. package/node_modules/@openclaw/fs-safe/dist/root-write-mode.js +61 -0
  367. package/node_modules/@openclaw/fs-safe/dist/root-write-verification.d.ts +12 -0
  368. package/node_modules/@openclaw/fs-safe/dist/root-write-verification.d.ts.map +1 -0
  369. package/node_modules/@openclaw/fs-safe/dist/root-write-verification.js +97 -0
  370. package/node_modules/@openclaw/fs-safe/dist/root.d.ts +4 -0
  371. package/node_modules/@openclaw/fs-safe/dist/root.d.ts.map +1 -0
  372. package/node_modules/@openclaw/fs-safe/dist/root.js +1 -0
  373. package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.d.ts +12 -0
  374. package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.d.ts.map +1 -0
  375. package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.js +75 -0
  376. package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts +25 -0
  377. package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts.map +1 -0
  378. package/node_modules/@openclaw/fs-safe/dist/secret-file.js +329 -0
  379. package/node_modules/@openclaw/fs-safe/dist/secret-read-async.d.ts +4 -0
  380. package/node_modules/@openclaw/fs-safe/dist/secret-read-async.d.ts.map +1 -0
  381. package/node_modules/@openclaw/fs-safe/dist/secret-read-async.js +73 -0
  382. package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.d.ts +17 -0
  383. package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.d.ts.map +1 -0
  384. package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.js +40 -0
  385. package/node_modules/@openclaw/fs-safe/dist/secret.d.ts +4 -0
  386. package/node_modules/@openclaw/fs-safe/dist/secret.d.ts.map +1 -0
  387. package/node_modules/@openclaw/fs-safe/dist/secret.js +3 -0
  388. package/node_modules/@openclaw/fs-safe/dist/secure-file.d.ts +32 -0
  389. package/node_modules/@openclaw/fs-safe/dist/secure-file.d.ts.map +1 -0
  390. package/node_modules/@openclaw/fs-safe/dist/secure-file.js +182 -0
  391. package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.d.ts +27 -0
  392. package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.d.ts.map +1 -0
  393. package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.js +160 -0
  394. package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts +15 -0
  395. package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts.map +1 -0
  396. package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.js +143 -0
  397. package/node_modules/@openclaw/fs-safe/dist/sibling-temp.d.ts +27 -0
  398. package/node_modules/@openclaw/fs-safe/dist/sibling-temp.d.ts.map +1 -0
  399. package/node_modules/@openclaw/fs-safe/dist/sibling-temp.js +95 -0
  400. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.d.ts +31 -0
  401. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.d.ts.map +1 -0
  402. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.js +336 -0
  403. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.d.ts +24 -0
  404. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.d.ts.map +1 -0
  405. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.js +42 -0
  406. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts +14 -0
  407. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts.map +1 -0
  408. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.js +71 -0
  409. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.d.ts +63 -0
  410. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.d.ts.map +1 -0
  411. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.js +305 -0
  412. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.d.ts +3 -0
  413. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.d.ts.map +1 -0
  414. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.js +76 -0
  415. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-types.d.ts +63 -0
  416. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-types.d.ts.map +1 -0
  417. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-types.js +1 -0
  418. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.d.ts +14 -0
  419. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.d.ts.map +1 -0
  420. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.js +265 -0
  421. package/node_modules/@openclaw/fs-safe/dist/staged-directory.d.ts +16 -0
  422. package/node_modules/@openclaw/fs-safe/dist/staged-directory.d.ts.map +1 -0
  423. package/node_modules/@openclaw/fs-safe/dist/staged-directory.js +60 -0
  424. package/node_modules/@openclaw/fs-safe/dist/staged-file-types.d.ts +56 -0
  425. package/node_modules/@openclaw/fs-safe/dist/staged-file-types.d.ts.map +1 -0
  426. package/node_modules/@openclaw/fs-safe/dist/staged-file-types.js +1 -0
  427. package/node_modules/@openclaw/fs-safe/dist/store.d.ts +4 -0
  428. package/node_modules/@openclaw/fs-safe/dist/store.d.ts.map +1 -0
  429. package/node_modules/@openclaw/fs-safe/dist/store.js +3 -0
  430. package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.d.ts +6 -0
  431. package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.d.ts.map +1 -0
  432. package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.js +51 -0
  433. package/node_modules/@openclaw/fs-safe/dist/string-coerce.d.ts +5 -0
  434. package/node_modules/@openclaw/fs-safe/dist/string-coerce.d.ts.map +1 -0
  435. package/node_modules/@openclaw/fs-safe/dist/string-coerce.js +16 -0
  436. package/node_modules/@openclaw/fs-safe/dist/suppressed-error.d.ts +6 -0
  437. package/node_modules/@openclaw/fs-safe/dist/suppressed-error.d.ts.map +1 -0
  438. package/node_modules/@openclaw/fs-safe/dist/suppressed-error.js +15 -0
  439. package/node_modules/@openclaw/fs-safe/dist/symlink-parents.d.ts +12 -0
  440. package/node_modules/@openclaw/fs-safe/dist/symlink-parents.d.ts.map +1 -0
  441. package/node_modules/@openclaw/fs-safe/dist/symlink-parents.js +78 -0
  442. package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.d.ts +14 -0
  443. package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.d.ts.map +1 -0
  444. package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.js +87 -0
  445. package/node_modules/@openclaw/fs-safe/dist/temp-target.d.ts +28 -0
  446. package/node_modules/@openclaw/fs-safe/dist/temp-target.d.ts.map +1 -0
  447. package/node_modules/@openclaw/fs-safe/dist/temp-target.js +137 -0
  448. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.d.ts +23 -0
  449. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.d.ts.map +1 -0
  450. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.js +320 -0
  451. package/node_modules/@openclaw/fs-safe/dist/temp.d.ts +4 -0
  452. package/node_modules/@openclaw/fs-safe/dist/temp.d.ts.map +1 -0
  453. package/node_modules/@openclaw/fs-safe/dist/temp.js +2 -0
  454. package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts +25 -0
  455. package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts.map +1 -0
  456. package/node_modules/@openclaw/fs-safe/dist/test-hooks.js +13 -0
  457. package/node_modules/@openclaw/fs-safe/dist/text-atomic.d.ts +14 -0
  458. package/node_modules/@openclaw/fs-safe/dist/text-atomic.d.ts.map +1 -0
  459. package/node_modules/@openclaw/fs-safe/dist/text-atomic.js +14 -0
  460. package/node_modules/@openclaw/fs-safe/dist/timing.d.ts +8 -0
  461. package/node_modules/@openclaw/fs-safe/dist/timing.d.ts.map +1 -0
  462. package/node_modules/@openclaw/fs-safe/dist/timing.js +40 -0
  463. package/node_modules/@openclaw/fs-safe/dist/trash.d.ts +5 -0
  464. package/node_modules/@openclaw/fs-safe/dist/trash.d.ts.map +1 -0
  465. package/node_modules/@openclaw/fs-safe/dist/trash.js +171 -0
  466. package/node_modules/@openclaw/fs-safe/dist/types.d.ts +23 -0
  467. package/node_modules/@openclaw/fs-safe/dist/types.d.ts.map +1 -0
  468. package/node_modules/@openclaw/fs-safe/dist/types.js +1 -0
  469. package/node_modules/@openclaw/fs-safe/dist/walk.d.ts +37 -0
  470. package/node_modules/@openclaw/fs-safe/dist/walk.d.ts.map +1 -0
  471. package/node_modules/@openclaw/fs-safe/dist/walk.js +207 -0
  472. package/node_modules/@openclaw/fs-safe/dist/windows-command.d.ts +2 -0
  473. package/node_modules/@openclaw/fs-safe/dist/windows-command.d.ts.map +1 -0
  474. package/node_modules/@openclaw/fs-safe/dist/windows-command.js +34 -0
  475. package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts +32 -0
  476. package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts.map +1 -0
  477. package/node_modules/@openclaw/fs-safe/dist/windows-owner.js +126 -0
  478. package/node_modules/@openclaw/fs-safe/dist/write-open-flags.d.ts +5 -0
  479. package/node_modules/@openclaw/fs-safe/dist/write-open-flags.d.ts.map +1 -0
  480. package/node_modules/@openclaw/fs-safe/dist/write-open-flags.js +35 -0
  481. package/node_modules/@openclaw/fs-safe/dist/write-queue.d.ts +2 -0
  482. package/node_modules/@openclaw/fs-safe/dist/write-queue.d.ts.map +1 -0
  483. package/node_modules/@openclaw/fs-safe/dist/write-queue.js +18 -0
  484. package/node_modules/@openclaw/fs-safe/docs/advanced.md +153 -0
  485. package/node_modules/@openclaw/fs-safe/docs/archive.md +658 -0
  486. package/node_modules/@openclaw/fs-safe/docs/assets/readme-banner.jpg +0 -0
  487. package/node_modules/@openclaw/fs-safe/docs/atomic.md +334 -0
  488. package/node_modules/@openclaw/fs-safe/docs/config.md +131 -0
  489. package/node_modules/@openclaw/fs-safe/docs/contributing.md +180 -0
  490. package/node_modules/@openclaw/fs-safe/docs/durability.md +313 -0
  491. package/node_modules/@openclaw/fs-safe/docs/errors.md +232 -0
  492. package/node_modules/@openclaw/fs-safe/docs/file-store.md +258 -0
  493. package/node_modules/@openclaw/fs-safe/docs/filename.md +96 -0
  494. package/node_modules/@openclaw/fs-safe/docs/index.md +84 -0
  495. package/node_modules/@openclaw/fs-safe/docs/install-path.md +170 -0
  496. package/node_modules/@openclaw/fs-safe/docs/install.md +163 -0
  497. package/node_modules/@openclaw/fs-safe/docs/json-store.md +221 -0
  498. package/node_modules/@openclaw/fs-safe/docs/json.md +213 -0
  499. package/node_modules/@openclaw/fs-safe/docs/local-roots.md +141 -0
  500. package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.5.md +196 -0
  501. package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.6.md +43 -0
  502. package/node_modules/@openclaw/fs-safe/docs/native-helper.md +118 -0
  503. package/node_modules/@openclaw/fs-safe/docs/native.md +196 -0
  504. package/node_modules/@openclaw/fs-safe/docs/output.md +139 -0
  505. package/node_modules/@openclaw/fs-safe/docs/path-scope.md +159 -0
  506. package/node_modules/@openclaw/fs-safe/docs/path.md +208 -0
  507. package/node_modules/@openclaw/fs-safe/docs/permissions.md +200 -0
  508. package/node_modules/@openclaw/fs-safe/docs/private-file-store.md +54 -0
  509. package/node_modules/@openclaw/fs-safe/docs/public-api.md +112 -0
  510. package/node_modules/@openclaw/fs-safe/docs/quickstart.md +154 -0
  511. package/node_modules/@openclaw/fs-safe/docs/reading.md +183 -0
  512. package/node_modules/@openclaw/fs-safe/docs/regular-file.md +190 -0
  513. package/node_modules/@openclaw/fs-safe/docs/root.md +266 -0
  514. package/node_modules/@openclaw/fs-safe/docs/secret-file.md +273 -0
  515. package/node_modules/@openclaw/fs-safe/docs/secure-file.md +100 -0
  516. package/node_modules/@openclaw/fs-safe/docs/security-model.md +188 -0
  517. package/node_modules/@openclaw/fs-safe/docs/sidecar-lock.md +439 -0
  518. package/node_modules/@openclaw/fs-safe/docs/staged-file.md +182 -0
  519. package/node_modules/@openclaw/fs-safe/docs/store.md +94 -0
  520. package/node_modules/@openclaw/fs-safe/docs/temp.md +476 -0
  521. package/node_modules/@openclaw/fs-safe/docs/test-hooks.md +96 -0
  522. package/node_modules/@openclaw/fs-safe/docs/testing.md +189 -0
  523. package/node_modules/@openclaw/fs-safe/docs/timing.md +121 -0
  524. package/node_modules/@openclaw/fs-safe/docs/types.md +188 -0
  525. package/node_modules/@openclaw/fs-safe/docs/walk.md +128 -0
  526. package/node_modules/@openclaw/fs-safe/docs/writing.md +347 -0
  527. package/node_modules/@openclaw/fs-safe/package.json +187 -0
  528. package/node_modules/@openclaw/fs-safe-darwin-arm64/fs-safe-native.node +0 -0
  529. package/node_modules/@openclaw/fs-safe-darwin-arm64/package.json +29 -0
  530. package/node_modules/@openclaw/fs-safe-darwin-x64/fs-safe-native.node +0 -0
  531. package/node_modules/@openclaw/fs-safe-darwin-x64/package.json +29 -0
  532. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/fs-safe-native.node +0 -0
  533. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/package.json +32 -0
  534. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/fs-safe-native.node +0 -0
  535. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/package.json +32 -0
  536. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/fs-safe-native.node +0 -0
  537. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/package.json +32 -0
  538. package/node_modules/@openclaw/fs-safe-linux-x64-musl/fs-safe-native.node +0 -0
  539. package/node_modules/@openclaw/fs-safe-linux-x64-musl/package.json +32 -0
  540. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/fs-safe-native.node +0 -0
  541. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/package.json +29 -0
  542. package/node_modules/core-util-is/LICENSE +19 -0
  543. package/node_modules/core-util-is/README.md +3 -0
  544. package/node_modules/core-util-is/lib/util.js +107 -0
  545. package/node_modules/core-util-is/package.json +38 -0
  546. package/node_modules/immediate/LICENSE.txt +20 -0
  547. package/node_modules/immediate/README.md +93 -0
  548. package/node_modules/immediate/dist/immediate.js +75 -0
  549. package/node_modules/immediate/dist/immediate.min.js +1 -0
  550. package/node_modules/immediate/lib/browser.js +69 -0
  551. package/node_modules/immediate/lib/index.js +73 -0
  552. package/node_modules/immediate/package.json +42 -0
  553. package/node_modules/inherits/LICENSE +16 -0
  554. package/node_modules/inherits/README.md +42 -0
  555. package/node_modules/inherits/inherits.js +9 -0
  556. package/node_modules/inherits/inherits_browser.js +27 -0
  557. package/node_modules/inherits/package.json +29 -0
  558. package/node_modules/isarray/.npmignore +1 -0
  559. package/node_modules/isarray/.travis.yml +4 -0
  560. package/node_modules/isarray/Makefile +6 -0
  561. package/node_modules/isarray/README.md +60 -0
  562. package/node_modules/isarray/component.json +19 -0
  563. package/node_modules/isarray/index.js +5 -0
  564. package/node_modules/isarray/package.json +45 -0
  565. package/node_modules/isarray/test.js +20 -0
  566. package/node_modules/jszip/.codeclimate.yml +16 -0
  567. package/node_modules/jszip/.editorconfig +8 -0
  568. package/node_modules/jszip/.eslintrc.js +43 -0
  569. package/node_modules/jszip/.github/workflows/pr.yaml +58 -0
  570. package/node_modules/jszip/.jekyll-metadata +0 -0
  571. package/node_modules/jszip/.travis.yml +17 -0
  572. package/node_modules/jszip/CHANGES.md +204 -0
  573. package/node_modules/jszip/LICENSE.markdown +651 -0
  574. package/node_modules/jszip/README.markdown +33 -0
  575. package/node_modules/jszip/deps.js +37 -0
  576. package/node_modules/jszip/dist/jszip.js +11577 -0
  577. package/node_modules/jszip/dist/jszip.min.js +13 -0
  578. package/node_modules/jszip/graph.svg +601 -0
  579. package/node_modules/jszip/index.d.ts +330 -0
  580. package/node_modules/jszip/lib/base64.js +106 -0
  581. package/node_modules/jszip/lib/compressedObject.js +74 -0
  582. package/node_modules/jszip/lib/compressions.js +14 -0
  583. package/node_modules/jszip/lib/crc32.js +77 -0
  584. package/node_modules/jszip/lib/defaults.js +11 -0
  585. package/node_modules/jszip/lib/external.js +18 -0
  586. package/node_modules/jszip/lib/flate.js +85 -0
  587. package/node_modules/jszip/lib/generate/ZipFileWorker.js +539 -0
  588. package/node_modules/jszip/lib/generate/index.js +57 -0
  589. package/node_modules/jszip/lib/index.js +55 -0
  590. package/node_modules/jszip/lib/license_header.js +11 -0
  591. package/node_modules/jszip/lib/load.js +88 -0
  592. package/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +74 -0
  593. package/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +42 -0
  594. package/node_modules/jszip/lib/nodejsUtils.js +57 -0
  595. package/node_modules/jszip/lib/object.js +384 -0
  596. package/node_modules/jszip/lib/readable-stream-browser.js +10 -0
  597. package/node_modules/jszip/lib/reader/ArrayReader.js +57 -0
  598. package/node_modules/jszip/lib/reader/DataReader.js +116 -0
  599. package/node_modules/jszip/lib/reader/NodeBufferReader.js +19 -0
  600. package/node_modules/jszip/lib/reader/StringReader.js +38 -0
  601. package/node_modules/jszip/lib/reader/Uint8ArrayReader.js +22 -0
  602. package/node_modules/jszip/lib/reader/readerFor.js +28 -0
  603. package/node_modules/jszip/lib/signature.js +7 -0
  604. package/node_modules/jszip/lib/stream/ConvertWorker.js +26 -0
  605. package/node_modules/jszip/lib/stream/Crc32Probe.js +24 -0
  606. package/node_modules/jszip/lib/stream/DataLengthProbe.js +29 -0
  607. package/node_modules/jszip/lib/stream/DataWorker.js +116 -0
  608. package/node_modules/jszip/lib/stream/GenericWorker.js +263 -0
  609. package/node_modules/jszip/lib/stream/StreamHelper.js +214 -0
  610. package/node_modules/jszip/lib/support.js +38 -0
  611. package/node_modules/jszip/lib/utf8.js +275 -0
  612. package/node_modules/jszip/lib/utils.js +501 -0
  613. package/node_modules/jszip/lib/zipEntries.js +261 -0
  614. package/node_modules/jszip/lib/zipEntry.js +293 -0
  615. package/node_modules/jszip/lib/zipObject.js +133 -0
  616. package/node_modules/jszip/package.json +67 -0
  617. package/node_modules/jszip/sponsors.md +21 -0
  618. package/node_modules/jszip/tsconfig.json +101 -0
  619. package/node_modules/jszip/vendor/FileSaver.js +247 -0
  620. package/node_modules/lie/README.md +62 -0
  621. package/node_modules/lie/dist/lie.js +350 -0
  622. package/node_modules/lie/dist/lie.min.js +1 -0
  623. package/node_modules/lie/dist/lie.polyfill.js +358 -0
  624. package/node_modules/lie/dist/lie.polyfill.min.js +1 -0
  625. package/node_modules/lie/lib/browser.js +273 -0
  626. package/node_modules/lie/lib/index.js +298 -0
  627. package/node_modules/lie/license.md +7 -0
  628. package/node_modules/lie/lie.d.ts +244 -0
  629. package/node_modules/lie/package.json +69 -0
  630. package/node_modules/lie/polyfill.js +4 -0
  631. package/node_modules/pako/CHANGELOG.md +164 -0
  632. package/node_modules/pako/LICENSE +21 -0
  633. package/node_modules/pako/README.md +191 -0
  634. package/node_modules/pako/dist/pako.js +6818 -0
  635. package/node_modules/pako/dist/pako.min.js +1 -0
  636. package/node_modules/pako/dist/pako_deflate.js +3997 -0
  637. package/node_modules/pako/dist/pako_deflate.min.js +1 -0
  638. package/node_modules/pako/dist/pako_inflate.js +3300 -0
  639. package/node_modules/pako/dist/pako_inflate.min.js +1 -0
  640. package/node_modules/pako/index.js +14 -0
  641. package/node_modules/pako/lib/deflate.js +400 -0
  642. package/node_modules/pako/lib/inflate.js +423 -0
  643. package/node_modules/pako/lib/utils/common.js +105 -0
  644. package/node_modules/pako/lib/utils/strings.js +187 -0
  645. package/node_modules/pako/lib/zlib/README +59 -0
  646. package/node_modules/pako/lib/zlib/adler32.js +51 -0
  647. package/node_modules/pako/lib/zlib/constants.js +68 -0
  648. package/node_modules/pako/lib/zlib/crc32.js +59 -0
  649. package/node_modules/pako/lib/zlib/deflate.js +1874 -0
  650. package/node_modules/pako/lib/zlib/gzheader.js +58 -0
  651. package/node_modules/pako/lib/zlib/inffast.js +345 -0
  652. package/node_modules/pako/lib/zlib/inflate.js +1556 -0
  653. package/node_modules/pako/lib/zlib/inftrees.js +343 -0
  654. package/node_modules/pako/lib/zlib/messages.js +32 -0
  655. package/node_modules/pako/lib/zlib/trees.js +1222 -0
  656. package/node_modules/pako/lib/zlib/zstream.js +47 -0
  657. package/node_modules/pako/package.json +44 -0
  658. package/node_modules/process-nextick-args/index.js +45 -0
  659. package/node_modules/process-nextick-args/license.md +19 -0
  660. package/node_modules/process-nextick-args/package.json +25 -0
  661. package/node_modules/process-nextick-args/readme.md +18 -0
  662. package/node_modules/readable-stream/.travis.yml +34 -0
  663. package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  664. package/node_modules/readable-stream/GOVERNANCE.md +136 -0
  665. package/node_modules/readable-stream/LICENSE +47 -0
  666. package/node_modules/readable-stream/README.md +58 -0
  667. package/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  668. package/node_modules/readable-stream/duplex-browser.js +1 -0
  669. package/node_modules/readable-stream/duplex.js +1 -0
  670. package/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  671. package/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  672. package/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  673. package/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  674. package/node_modules/readable-stream/lib/_stream_writable.js +685 -0
  675. package/node_modules/readable-stream/lib/internal/streams/BufferList.js +78 -0
  676. package/node_modules/readable-stream/lib/internal/streams/destroy.js +84 -0
  677. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  678. package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  679. package/node_modules/readable-stream/package.json +52 -0
  680. package/node_modules/readable-stream/passthrough.js +1 -0
  681. package/node_modules/readable-stream/readable-browser.js +7 -0
  682. package/node_modules/readable-stream/readable.js +19 -0
  683. package/node_modules/readable-stream/transform.js +1 -0
  684. package/node_modules/readable-stream/writable-browser.js +1 -0
  685. package/node_modules/readable-stream/writable.js +8 -0
  686. package/node_modules/safe-buffer/LICENSE +21 -0
  687. package/node_modules/safe-buffer/README.md +584 -0
  688. package/node_modules/safe-buffer/index.d.ts +187 -0
  689. package/node_modules/safe-buffer/index.js +62 -0
  690. package/node_modules/safe-buffer/package.json +37 -0
  691. package/node_modules/setimmediate/LICENSE.txt +20 -0
  692. package/node_modules/setimmediate/package.json +30 -0
  693. package/node_modules/setimmediate/setImmediate.js +186 -0
  694. package/node_modules/string_decoder/.travis.yml +50 -0
  695. package/node_modules/string_decoder/LICENSE +48 -0
  696. package/node_modules/string_decoder/README.md +47 -0
  697. package/node_modules/string_decoder/lib/string_decoder.js +296 -0
  698. package/node_modules/string_decoder/package.json +31 -0
  699. package/node_modules/util-deprecate/History.md +16 -0
  700. package/node_modules/util-deprecate/LICENSE +24 -0
  701. package/node_modules/util-deprecate/README.md +53 -0
  702. package/node_modules/util-deprecate/browser.js +67 -0
  703. package/node_modules/util-deprecate/node.js +6 -0
  704. package/node_modules/util-deprecate/package.json +27 -0
  705. package/package.json +6 -4
  706. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/index.d.ts +0 -0
  707. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/index.js +0 -0
  708. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/license +0 -0
  709. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/package.json +0 -0
  710. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/readme.md +0 -0
@@ -0,0 +1,700 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.8.5 - 2026-09-07
6
+
7
+ ### Highlights
8
+
9
+ - **Strict moves stay strict:** a move started with hardlink rejection keeps that policy throughout asynchronous preparation and copying, even when the caller reuses or changes its options object.
10
+
11
+ ### Safe moves
12
+
13
+ - Preserve the admitted `sourceHardlinks` policy through staged-copy fallback. A late hardlink is still rejected before destination publication, with the source and its alias preserved, instead of being accepted after an in-flight options change.
14
+ - Document when move policy is captured and how it relates to the existing per-mutation authority checks and destination-publication receipts.
15
+
16
+ ## 0.8.4 - 2026-09-07
17
+
18
+ ### Highlights
19
+
20
+ - **Faster reads and writes:** metadata checks avoid unnecessary event-loop round-trips while data I/O stays asynchronous; reconstructible data can explicitly opt out of fsync with `durable: false`.
21
+ - **Inspect TARs without extracting:** the new bounded archive inspection API uses the same native/WASM admission and canonical planner as extraction.
22
+
23
+ ### Filesystem performance and durability
24
+
25
+ - Run metadata checks inside async operations synchronously (microseconds each), cutting event-loop round-trips per read/write while data I/O remains asynchronous and native canonical path spelling is preserved, including Windows short paths.
26
+ - Add `durable` to Root write/create/writeJson/createJson/append options and Root defaults; `durable: false` skips file and parent fsync for reconstructible data (default unchanged: durable).
27
+
28
+ ### Archive inspection and compatibility
29
+
30
+ - Add bounded `inspectTarArchive` with complete native/WASM admission and the same canonical extraction planner, preserving effective member identities without materializing an output tree.
31
+ - Preserve inherited and getter-backed extraction options on the WASM TAR path, matching native and ZIP handling for destinations, filters, stripping, and modes.
32
+
33
+ ### Validation
34
+
35
+ - Apply the existing filesystem-test worker cap locally as well as in CI, and drain archive publication fixtures before resetting hooks or cleaning restricted directories after timeouts.
36
+
37
+ ## 0.8.3 - 2026-09-06
38
+
39
+ ### Highlights
40
+
41
+ - **Safer cancellable moves:** callers can guard every source removal and retain an exact destination-publication receipt for recovery after later failures, including Windows and cross-device fallbacks.
42
+ - **Less filesystem overhead:** reads and writes make fewer calls while preserving their existing boundary and identity checks.
43
+
44
+ ### Move authority and recovery
45
+
46
+ - Add optional synchronous move authority checks before renames and each copied-source removal, plus an exact bigint destination-publication receipt for caller-owned recovery after later failure; retain cross-device and Windows `EPERM` copy fallbacks and the existing `Promise<void>` contract.
47
+
48
+ ### Filesystem performance and durability
49
+
50
+ - Reduce filesystem calls per read and write while retaining boundary, hardlink, hook, retry, and post-mutation identity checks.
51
+ - Skip native publication's extra mode-only file fsync for modes that retain owner read/write when staging permissions have not widened; after a crash, a file may retain staged `0o600` instead of the wider requested mode, while restrictive modes retain the extra fsync.
52
+
53
+ ### Tooling and maintenance
54
+
55
+ - Add 1 MiB read/write and existing-mode inheritance benchmarks, with native-mode metadata and per-case iteration counts.
56
+ - Simplify internals without changing public behavior: remove unused string/home helpers, `resolveUserPath`, `createBoundedReadStream`, `sidecarLockPayloadIsStale`, and `tarManifestEntryCost`; share filesystem utilities and merge private modules.
57
+
58
+ ## 0.8.2 - 2026-09-05
59
+
60
+ **Highlights:** TAR/gzip extraction now shares one parser across native and fallback modes, improving compatibility with system-tar output while keeping admission and publication guarded.
61
+
62
+ - Reject reserved archive device names and ignored-space aliases on Windows while preserving ordinary POSIX members, and guard secret reads with the documented `device-path` rejection. Thanks @SebTardif.
63
+ - Unify native and guarded JavaScript TAR admission on one Rust core, bundle its WASM build, and accept strict UTF-8/newline PAX paths without a runtime `tar` dependency; retain bounded framing, raw-field validation, and guarded publication.
64
+ - Accept bounded all-zero gzip container padding from system-tar stdout after validated member trailers, and reject nonzero data hidden after padding on both native and guarded JavaScript TAR routes.
65
+ - Fix `replaceFileAtomic({ dirMode })` rejecting a raw `fs.stat` mode: directory modes are masked to permission bits (`0o7777`) before application and verification, matching chmod semantics; 0.8.0 regressed this input tolerance with `directory final mode could not be verified`.
66
+ - Standardize malformed TAR mode fields on the native zero fallback while preserving ordinary octal, absent, zero, and safe GNU binary modes.
67
+ - Refresh the native binding build tool to `@napi-rs/cli` 3.9.0 and the test/coverage toolchain to Vitest 5.0.0. Thanks @dependabot.
68
+
69
+ ## 0.8.1 - 2026-09-04
70
+
71
+ - Add `retainOnExit` to sidecar lock acquisition so deliberately retained ownership records (for example fail-closed build locks) survive natural process exit; default process-exit release behavior is unchanged.
72
+
73
+ ## 0.8.0 - 2026-09-04
74
+
75
+ ### Compatibility and upgrade notes
76
+
77
+ - **Existing secret directories must already have the requested mode.** Wrong permissions now fail the write with `insecure-permissions` instead of being chmod-repaired; audit and fix existing directories before upgrading.
78
+ - **FileStore keys are enforced portably.** Parent-segment and backslash aliases are rejected with `invalid-path` across async reads, `exists`, and `remove`, matching the sync and write paths.
79
+ - **Lock and queue failures now surface.** Durable queue enqueue, migration, and acknowledgement sync failures propagate instead of returning empty or partial success; sidecar payloads above 1 MiB are rejected with `too-large`; async lock retry counts apply even with infinite deadlines. Handle these rejections explicitly.
80
+ - **Create-only visibility is backend-scoped.** The sibling-temp no-visibility guarantee for `create`, `createJson`, and `write({ overwrite: false })` holds with the native binding (`require` mode, or `auto` when the binding loads); the JavaScript fallback claims the final name before content is written.
81
+
82
+ ### Highlights
83
+
84
+ - **Stricter secret storage:** existing secret directories are never chmod-repaired — wrong permissions fail the write — and directory identity is tracked exactly through private locks and native writes, closing replacement races.
85
+ - **Exact file modes everywhere:** explicit modes, including set-ID bits, are applied after content writes and verified in full at publication, and synchronous appends no longer drop bytes when the kernel writes short.
86
+ - **Restrictive secret modes work:** write-only and no-access files such as `0o200` and `0o000` publish successfully through the writer's retained descriptor, without a readonly reopen or widened permissions.
87
+ - **Resilient locks and queues:** Windows sidecar creation retries genuine denials within the existing budgets, Root-backed locks release on natural process exit, and queue enqueue/migration/ack sync failures propagate instead of returning false success.
88
+ - **Honest backend guarantees:** the no-visibility guarantee for create-only Root writes is scoped to backends with atomic no-replace publication (`require`, or `auto` with a loaded binding); the JavaScript fallback's behavior is documented and regression-pinned.
89
+
90
+ ### Secret files and permissions
91
+
92
+ - Preserve existing secret-directory permissions instead of repairing them; retain lossless directory identities through private locks and native writes, initialize new directories through guarded descriptor authority, honor full directory mode bits, and fail closed for unpinnable parents, including non-root macOS directories created under `umask(0o777)`.
93
+ - Finalize explicit file modes after content writes across pinned writers, verify all `0o7777` POSIX bits for secret publication, and use exact identities before native Windows mode changes and failed-write cleanup; JavaScript fallback cleanup preserves unverified replacements.
94
+ - Complete short synchronous regular-file appends and preserve explicitly requested special mode bits in both append helpers, retaining permission tightening before any data is written.
95
+ - Verify atomic secret writes through the writer's retained descriptor so restrictive POSIX modes such as `0o000` and `0o200` succeed without a readonly reopen or widened permissions.
96
+ - Retry and fully revalidate raced secret-parent creation so concurrent writes to distinct leaves succeed without leaking `EEXIST` or reporting a false `secret-exists` collision.
97
+ - Scope the sibling-temp no-visibility guarantee for create-only Root writes (`create`, `createJson`, `write({ overwrite: false })`) to backends with atomic no-replace publication: the native binding stages privately and renames without clobbering, while the pure-JavaScript fallback claims the final name exclusively before content is written. Regression tests now pin both behaviors.
98
+ - Normalize every exclusive-copy target to mode `0o600` through its owned descriptor, including under restrictive umasks and native macOS clone staging.
99
+
100
+ ### Locks and durable queues
101
+
102
+ - Retry Windows Root-backed sidecar exclusive-create denials within the existing eight-retry and caller budgets, using per-call provenance while preserving callback errors and rejecting replayed failure evidence.
103
+ - Release asynchronously acquired Root-backed sidecar locks on natural event-loop shutdown through their retained ownership receipts, preserving changed sidecars and avoiding cleanup retry loops.
104
+ - Keep async Root-backed lock normalization read-only, rejecting deleted or replaced admitted parents without recreating them while preserving explicit in-root sidecars for external target keys.
105
+ - Reject serialized sidecar lock payloads above 1 MiB of UTF-8 bytes, including ownership overhead, with `too-large` before async or sync acquisition so admitted locks remain verifiable and releasable.
106
+ - Honor explicit async file-lock retry counts independently of infinite deadlines, matching sync locks while preserving unlimited retries when the count is omitted.
107
+ - Propagate durable queue enqueue parent-sync failures and keep published-file identity checks after synchronization, sharing the guarded writer with migrations while retaining retry state.
108
+ - Propagate durable queue batch claim and migration failures instead of returning empty or partial success, and strictly sync migration publication in both loaders while preserving retry state.
109
+ - Resync durable queue acknowledgement retries after final marker unlink before reporting completion or a newer-generation mismatch.
110
+
111
+ ### Paths, stores, and moves
112
+
113
+ - Enforce portable FileStore keys consistently across methods: async reads, `exists`, and `remove` now reject parent-segment and backslash aliases with `invalid-path` for existing roots, matching sync and write methods while preserving missing-root error precedence and Root's confined existing-object compatibility.
114
+ - Prevent no-reader FIFOs from stalling POSIX `Root.openWritable()` and async/sync regular-file append admission, preserving regular-file write semantics and existing-target cleanup fencing.
115
+ - Accept canonical in-root absolute paths in `Root.readAbsolute()` and `Root.reader()` when the Root was configured through a directory symlink or Windows junction.
116
+ - Reject dangling symlink leaves and ancestors under strict absolute-write and missing local-root resolution instead of treating unresolved aliases as safe missing paths.
117
+ - Move dangling symlink sources through staged and cross-device fallback without dereferencing their absent referents, while retaining same-entry, descendant, and source-substitution guards.
118
+ - Retire every copied source name after cross-device moves with allowed in-tree hardlink aliases, while preserving `ESTALE` fences for unverified external mutations.
119
+ - End `Root.walk()` immediately after its single truncation marker, including when a nested depth or entry budget is reached.
120
+ - Bound callback staging components to 255 NFC/NFD bytes so filesystem-valid long destination names work without changing final names or short callback paths.
121
+
122
+ ### Archives
123
+
124
+ - Separate archive staging permissions from final publication modes so zero/write-only files and restrictive directories extract correctly; finalize explicit and implicit directory modes through retained, verified authority and reject unsafe mode application instead of silently skipping it.
125
+ - Preserve pre-existing and substituted destination files when an archive merge fails, leaving guarded copy cleanup to the operation that owns publication.
126
+ - Decode absent TAR modes and supported signed GNU binary permission bits in native manifests, matching JavaScript defaults without changing the native ABI.
127
+ - Close a selected archive input if private staging allocation fails, preventing `readArchiveEntry()` setup errors from retaining file descriptors until garbage collection.
128
+ - Avoid opening the TAR metadata stream until preflight setup succeeds, and always destroy it after pipeline completion, preventing descriptor leaks on setup failures. Thanks @SebTardif.
129
+
130
+ ### Docs, packaging, and validation
131
+
132
+ - Add the narrow `@openclaw/fs-safe/secure-temp-root` package subpath so consumers can import `resolveSecureTempRoot()` and its options type without loading the temp workspace implementation.
133
+ - Exercise secret-directory admission from isolated npm/pnpm consumer installs, retain real-identity and native-load proof, and honor explicit package-proof output paths.
134
+ - Correct lower-level archive helper signatures in the reference docs and guard them against drifting from the public declarations.
135
+ - Keep slow physical-package fixture setup outside the process-exit test deadline, drain fixture work before teardown, and give each adversarial corpus payload its own test lifetime while retaining Windows boundary assertions.
136
+ - Bound workflow-dispatch test subprocesses and terminate their process groups before fixture cleanup, so stuck shell descendants fail validation instead of hanging the suite.
137
+ - Assign cross-platform sidecar contention proof liveness to its whole-worker watchdog instead of false-failing healthy unfair acquisition; production lock timeout behavior is unchanged.
138
+ - Refresh the Node type definitions, align development and CI on pnpm 11.25.0, and update the pinned Pages deployment action to v5.0.1 for polling backoff and jitter. Thanks @dependabot.
139
+
140
+ ## 0.7.2 - 2026-09-01
141
+
142
+ - Add `movePathWithCopyFallback({ assertBeforeRename })` to synchronously recheck caller-owned authorization immediately before direct or staged rename, preserving refusal errors and rejecting asynchronous callbacks without publishing the move.
143
+
144
+ ## 0.7.1 - 2026-09-01
145
+
146
+ ### Highlights
147
+
148
+ - **Make lock handoffs reliable:** recover from disappearing ownership records within retry budgets, preserve callback errors, and safely retry failed synchronous release cleanup.
149
+ - **Reject corrupt native ZIP reads:** verify decoded entry length against the declared size before returning bytes, while retaining byte caps and CRC checks.
150
+ - **Preserve long destination filenames:** use independent private staging names for Root writes and copies, ZIP extraction, and synchronous JSON writes instead of lengthening the destination basename.
151
+
152
+ ### File locks
153
+
154
+ - Recover Root-backed asynchronous handoffs from unlinked opened records with exact descriptor identity and unlink evidence, including Windows resolver `EPERM`/`EBADF` failures. Recheck canonical ancestors and charge discarded observations to retry/deadline budgets without granting release or reclaim authority. ([#189](https://github.com/openclaw/fs-safe/pull/189))
155
+ - Retry Root lock contention when a holder changes between pre-open inspection and opening the file. Discard only the verified stale observation, recheck canonical ancestors, and require fresh exclusive creation; generic reads, creator admission, and release/reclaim authority remain unchanged.
156
+ - Verify reopened Root-created sidecars against the creator's exact serialized bytes and ownership token before admission. Reject replacements and unlinked descriptors, and retain the original creator receipt for failed-acquisition cleanup. ([#189](https://github.com/openclaw/fs-safe/pull/189))
157
+ - Align Windows synchronous lock-parent canonicalization with Root, including short-name expansion, and bound lock-file create/open denials and missing or changed snapshot retries. Preserve the original `EPERM` when a retry budget is exhausted. ([#189](https://github.com/openclaw/fs-safe/pull/189))
158
+ - Determine synchronous lock staleness from the captured payload timestamp or snapshot mtime, avoiding false stale decisions after unlink or replacement. ([#189](https://github.com/openclaw/fs-safe/pull/189))
159
+ - Retain failed synchronous release cleanup for safe retries without double-decrementing references, re-closing a consumed or reused descriptor, or deleting a replacement sidecar. ([#189](https://github.com/openclaw/fs-safe/pull/189))
160
+ - Propagate payload, JSON serialization, and parsing failures unchanged without retrying the failing callback. Scope Root failure evidence to each observation so historical errors cannot trigger retries in later, nested, or concurrent acquisitions. ([#190](https://github.com/openclaw/fs-safe/pull/190))
161
+
162
+ ### File writes and archives
163
+
164
+ - Keep private staging names independent of destination basenames across guarded Root writes and copies, native Windows writes, ZIP extraction, and `writeJsonSync()`. Preserve public producer filenames, custom `tempPrefix`, and literal JSON parent-path and drive-relative semantics. ([#191](https://github.com/openclaw/fs-safe/pull/191))
165
+ - Avoid opening an existing target merely to inherit its mode during create-only Root writes, while preserving boundary, alias, hardlink, and type checks. ([#189](https://github.com/openclaw/fs-safe/pull/189))
166
+ - Reject native `readArchiveEntry()` ZIP payloads whose decoded length differs from the declared uncompressed size with `ArchiveFormatError("archive-header-invalid")`, matching JavaScript behavior while preserving `maxBytes` and CRC checks. ([#189](https://github.com/openclaw/fs-safe/pull/189))
167
+
168
+ ### Docs and validation
169
+
170
+ - Clarify that invalid UTF-8 or nonzero bytes after NUL terminators in fixed TAR name, linkname, and USTAR prefix fields reject with `ArchiveSecurityError("entry-path")`; this documents existing behavior. ([#189](https://github.com/openclaw/fs-safe/pull/189))
171
+ - Add cross-process contention and release-retry proofs, plus focused lock-admission and ZIP-integrity coverage in JavaScript-fallback and required-native CI paths. Refresh the release checklist for eight-package trusted publishing.
172
+
173
+ ## 0.7.0 - 2026-08-31
174
+
175
+ ### Highlights
176
+
177
+ - **Safer reads and writes:** extend exact identity checks and retained-descriptor publication to reject substituted inputs and detect publication mismatches, including rounded-equal Windows file IDs.
178
+ - **Opt into bounded temp cleanup:** `cleanupSafety: "require-bounded"` prevents recursive traversal of substituted workspace trees, while the compatible default remains available without native support. See the [cleanup guarantees and POSIX limits](https://fs-safe.io/temp.html#private-temp-workspaces).
179
+ - **Harden untrusted archive handling:** reject hidden path aliases, ambiguous TAR metadata, corrupt gzip streams, and excessive decoded data before publication; align filtering and entry reads across JavaScript and native backends.
180
+ - **Preserve queued work and durability:** generation-bound claims protect newer same-ID entries from acknowledgement or quarantine, and queue transitions and synchronous store writes sync their filesystem changes.
181
+ - **Make lock handoffs and timeouts reliable:** recover from ownership records unlinked during contention, surface release failures, and finish in-flight archive publication or rollback before returning a timeout.
182
+
183
+ ### Compatibility and upgrade notes
184
+
185
+ - **Claim queued entries before processing.** Call `loadJsonDurableQueueEntry()` or the batch loader before acknowledgement, rather than pairing a direct read with `ackJsonDurableQueueEntry()`. A pending entry without a processing claim now rejects; missing entries remain idempotent no-ops. Queue and failed directories must share a filesystem with hardlink support for quarantine. See the [queue recovery contract](https://fs-safe.io/store.html).
186
+ - **Handle the new cleanup result.** `TempWorkspaceCleanupResult` adds `"indeterminate"` for cleanup whose safe completion cannot be established. Exhaustive result handlers must accept it; do not treat it as successful removal or blindly delete retained artifacts.
187
+ - **Archive filters receive canonical pre-strip paths.** `entryFilter` now sees normalized separators, dot components, and effective metadata names rather than alternate spellings of the same entry. Update filters that match raw aliases; invalid `onFiltered` values reject before extraction rather than enabling skipping.
188
+ - **Validate limits and handle surfaced errors.** Root, FileStore, secure/secret/regular reads, durable queues, and external output require `maxBytes` to be a non-negative safe integer or positive `Infinity`; zero is enforced and `undefined` retains configured defaults. Lock retry/deadline numbers are validated. Handle propagated release, failed-acquire cleanup, and durability failures; exhaustive archive-limit handlers must accept `archive-decoded-size-exceeds-limit`.
189
+
190
+ ### File safety and temp cleanup
191
+
192
+ - Verify regular-file reads, root-file adapters, archive staging, `Root.copyIn()` sources, and durable JSON queue reads with lossless bigint identities. Reject replacements whose IDs round to the same JavaScript number and unresolved Windows identities before reading bytes; public numeric `Stats` receipts remain unchanged.
193
+ - Verify async and sync regular-file append targets against exact pre-open, descriptor, and current-path identities, rejecting rounded-equal replacements and persistent unknown Windows identities before chmod or append.
194
+ - Retain async and sync atomic replacement descriptors across `beforeRename`, retries, copy fallback, and publication. Reject substituted, non-regular, or hardlinked stages and preserve unowned cleanup paths. `replaceFileAtomic()` and its sync variant add `renameIdentity: "verify-content-with-lock"` for rename-unstable FUSE mounts: an explicit weaker identity contract for cooperating writers, not protection against same-authority actors ignoring the lock.
195
+ - Pin callback-produced sibling temps through mode application, optional fsync, rename, and publication checks. Preserve unverified paths and producer modes, retain disabled sync defaults and best-effort file/directory chmod, and admit read-only descriptors unless `writeSiblingTempFile` requests file sync.
196
+ - Apply `writeJsonSync()` best-effort file-mode tightening only through a reopened, single-link regular descriptor matching the staged bigint identity, so a swap cannot chmod an unrelated file.
197
+ - Add native handle-relative temp workspace removal with collision-safe quarantine, enumerated-child identity checks, mount-crossing rejection, and symlink/reparse leaf removal without target traversal. Windows deletes exact opened handles; POSIX retains a documented final name-based race bounded to one substituted leaf or empty directory entry, never recursive traversal of a substituted nonempty tree.
198
+ - Require usable Linux `openat2` with `RESOLVE_NO_XDEV` at runtime for bounded cleanup. Compatible mode falls back when unavailable; `cleanupSafety: "require-bounded"` rejects before creating a child.
199
+ - Open attacker-raceable secure, secret, archive, queue, publication, fallback, and lock-file read paths nonblocking on POSIX, so a FIFO substitution cannot stall admission, deadlines, or cleanup verification.
200
+
201
+ ### Archive extraction and reads
202
+
203
+ - Prevent archive path aliases from bypassing excluded subtrees: pass canonical pre-strip paths to `entryFilter` across JavaScript/native ZIP, TAR, gzip, zstd, and bzip2, while retaining raw-path validation, stripping, collision checks, and filter rejection policy.
204
+ - Reject ambiguous TAR EOF framing, unsafe numeric sizes, and bodies on raw directory/link entries before parsing. Enforce an absolute decoded-byte ceiling through physical EOF, including metadata and zero padding, before extraction publication or entry-read success; report `archive-decoded-size-exceeds-limit` on overflow.
205
+ - Bound retained TAR manifests with a shared budget capped at 64 MiB, independent of compressed input size. Validate checksums, strict fixed-field UTF-8, NFC/NFD component lengths, GNU effective trailing separators, and linkname/type consistency before metadata processing or caller policy.
206
+ - Validate GNU long-name/link bodies on both backends before parsing: reject malformed UTF-8/NUL structure, repeated or dangling metadata, mixed PAX/GNU chains, and unsafe effective names, while preserving original bytes and valid L+K pairs.
207
+ - Apply ordered path, count, strip, depth, collision, and filter policy even to TAR records parsers would ignore (`V`, `A`, `I`, `M`, and unknown typeflags). Safely omit accepted unsupported records, validate raw names hidden by metadata or NUL terminators, and align native device/FIFO filtering and GNUDumpDir handling with JavaScript.
208
+ - Stop starting archive destination mutations at the timeout boundary and wait for any already-running destination mutation and rollback before rejecting. Non-mutating work retains prompt deadlines; publication cannot continue after the timeout is reported.
209
+ - Match `readArchiveEntry()` to extraction's validated canonical pre-strip paths and effective metadata names across all supported formats/backends. Preserve directory, link, collision, integrity, and byte-limit checks; read `maxBytes` remains a requested-entry budget, separate from archive-wide decoding and metadata limits.
210
+ - Charge TAR `maxEntryBytes` and `maxExtractedBytes` only to entries accepted after strip/filter policy, not skipped or fully stripped members. Raw framing, logical entry counts, metadata, and absolute decoded-byte limits still apply to the whole archive.
211
+ - Accept highly compressible gzip TARs within fs-safe's explicit limits consistently across backends by disabling node-tar's extra 1000x ratio threshold only after complete decoded-byte admission. Archive, decoded, entry, output, and deadline limits remain enforced.
212
+ - Preserve large finite TAR limits such as `Number.MAX_VALUE` in native `auto`/`require` modes through shared internal metadata/decoded-byte and u32 entry-count clamping before backend selection; retain high-level payload budgets and reject malformed direct native limits.
213
+ - Update native gzip/DEFLATE decoding to flate2 1.1.10 and miniz_oxide 0.9.1, including upstream incomplete-stream fixes. Truncated bodies, missing trailers, and checksum failures reject before extraction publishes files or an entry read returns bytes.
214
+
215
+ ### Durable queues, stores, and locks
216
+
217
+ - Claim durable queue generations under a fail-closed cross-process lock using no-replace hardlinks and recoverable source retirement. Acknowledgement and quarantine preserve newer same-ID replacements, and quarantine collisions preserve existing failed-entry evidence.
218
+ - Fsync affected directories for queue creation, claims, acknowledgement, quarantine, marker cleanup, and retirement; propagate durability failures. Synchronous file-store writes now fsync temps before rename and parent directories after publication.
219
+ - Retry Root-backed sidecar acquisition when the owner unlinks its record after the waiter opens it, but only after the same Root capability proves absence. Replacements remain fail-closed; generic `Root.open()` behavior is unchanged.
220
+ - Propagate asynchronous sidecar release and failed-acquire deletion failures, preserve paired errors, and retain failed release state for a safe retry through the same handle or manager drain.
221
+ - Clamp synchronous lock backoff to the remaining finite deadline instead of overshooting the timeout or blocking forever.
222
+
223
+ ## 0.6.0 - 2026-08-29
224
+
225
+ ### Highlights
226
+
227
+ - Install only the matching native platform package; deployments using native mode `require` or native-only features must keep optional dependencies enabled. See the [0.6 migration guide](https://fs-safe.io/migrating-to-0.6.html).
228
+ - Strengthen root, secure, secret, and pathname-hash identity checks with lossless bigint comparisons and fail-closed handling of unknown Windows identities.
229
+ - Add native-required Linux/macOS `stageFileInDirectory()` with retained-directory cleanup, private staging, identity-checked publication, and async disposal.
230
+ - Validate physical ZIP metadata and names before decoder normalization or collapse, align bounded TAR/PAX and stripped-path handling, and reject ZIP symlinks disguised as directories.
231
+
232
+ ### Security and Correctness
233
+
234
+ - Validate physical ZIP local/central and Unicode name metadata before decoding, rejecting traversal, hidden duplicates, and conflicting interpretations consistently in extraction and bounded reads.
235
+
236
+ - Verify pathname SHA-256 hashing with lossless pre-open, descriptor, and current-path identities; fail closed on unknown Windows identities after one bounded retry without reopening the file.
237
+ - Preserve underlying command diagnostics (command, timing, timeout flag, exit code/signal, and sanitized stderr) and cause on Windows ACL `permission-unverified` errors without changing verification semantics.
238
+ - Verify secure and secret read identities with lossless bigint stats, reject replaced paths and retargeted aliases, and fail closed on unknown Windows identities after one bounded re-inspection; preserve the secure reader's numeric `Stats` receipt and permission options without letting them bypass identity checks.
239
+ - Apply the same exact identity checks to guarded root reads, rejecting parent-directory replacements even when distinct Windows file IDs round to the same number; retain numeric read receipts and keep Windows write reopens anchored to the writer's exact retained identity.
240
+ - Verify `Root.write()` and `create()` through retained descriptors and exact bigint identities for restrictive final modes, retaining guarded Windows path opens when pathname identity is unavailable; preserve explicit mode zero in `copyIn()`.
241
+ - Preserve filesystem failures from `ensureDirectoryWithinRoot()` and `pathScope().ensureDir()` in an optional operational `FsSafeError` diagnostic with the original cause and bounded, escaped display text, instead of misreporting them as containment violations; keep nonthrowing string results and directory safety checks.
242
+ - Accept bounded local PAX paths, sizes, and descriptive metadata, including inert binary macOS provenance xattrs, consistently in JavaScript and native TAR extraction/reads; reject ambiguous records, extension chains, and sparse semantics while retaining byte/count limits and guarded staging. Return TAR read traversal failures through the public promise instead of escaping the parser callback.
243
+ - Add native-required Linux/macOS `stageFileInDirectory()` under `advanced` with retained-directory abort cleanup, private `0600` staging until publication is identity-checked, exact identity checks, explicit publication/cleanup receipts, and async disposal; share that ownership with POSIX native streaming writes so parent moves no longer strand their unpublished temps.
244
+ - Share native writer admission and direct-child cleanup mechanisms; preserve combined POSIX coordinator operation/disposal failures with `SuppressedError` while keeping staged preparation/cleanup receipts and Windows close policy unchanged.
245
+ - Fail closed when synchronous sidecar compromise checks hit I/O errors and invoke `onCompromised` once instead of throwing from the interval. Thanks @SebTardif.
246
+ - Reject ZIP symlink-mode entries with a trailing slash or DOS directory bit before creating output, aligning JavaScript extraction with native link policy while preserving explicit filtering. Thanks @Yigtwxx.
247
+ - Make the validated stripped path authoritative during JavaScript TAR extraction, fixing `ENOENT` and native path disagreement for dot or empty components, including local PAX paths, while preserving pre-strip filter inputs. Thanks @Yigtwxx.
248
+ - Apply process-wide retry, timeout, and stale-policy defaults to synchronous file locks while preserving per-call overrides and caller-approved guarded recovery. Thanks @Yigtwxx.
249
+
250
+ ### Docs and Tooling
251
+
252
+ - Publish native bindings as platform-filtered optional packages and load only the matching package, avoiding installation of binaries for six unrelated targets; verify root-only npm/pnpm resolution and document omitted-optionals limits and native-only recovery guidance. Thanks @RomneyDa.
253
+ - Raise the Crabbox AWS root volume to 400 GiB to meet the runner image's snapshot minimum and avoid allocation failures before checks run.
254
+ - Restore six missing documentation navigation entries, remove the dangling page, correct the lock-config link, and reject missing, nonexistent, or duplicate registrations before replacing site output. Thanks @Yigtwxx.
255
+ - Fix the standalone native smoke script to use the numeric descriptor returned by `openBeneath()` for identity checks and cleanup.
256
+ - Accept npm 11 array and npm 12 package-name-keyed pack results while validating the intended package and its file metadata.
257
+
258
+ ### Dependencies and maintenance
259
+
260
+ - Refresh the Node and Rust dependency graphs, align development and CI on pnpm 11.24.0, and update the CodeQL, npm, and cargo-zigbuild pins while preserving the two-day dependency cooldown.
261
+
262
+ ## 0.5.6 - 2026-08-14
263
+
264
+ ### Security and Correctness
265
+
266
+ - Treat asynchronous sidecar compromise-check I/O failures as a lost lock and invoke `onCompromised` once, instead of leaking an unhandled rejection from the interval.
267
+ - Preserve replaced temporary paths during Windows cleanup when libuv reports a zero device or inode or a file index exceeds JavaScript's safe integer range, treating unknown or rounded identity as fail-closed instead of authorizing deletion.
268
+
269
+ ### Docs and Tooling
270
+
271
+ - Set up Node before pnpm when hydrating Crabbox runners so minimal images without a preinstalled npm can prepare the workspace.
272
+ ## 0.5.5 - 2026-08-12
273
+
274
+ ### Security and Correctness
275
+
276
+ - Prevent nondeterministic Windows read failures with `path-mismatch` when path-based stat reports zero file identity through libuv's FindFirstFile fallback under antivirus or indexer contention; zero Windows inodes are now treated as unknown identity like zero device serials.
277
+
278
+ ## 0.5.4 - 2026-08-10
279
+
280
+ **Highlight:** two security fixes in the publication path. If you run fs-safe on
281
+ Windows, the identity fix is the one that matters — rounded file indexes could
282
+ previously let a replaced path pass as the original.
283
+
284
+ ### Security and Correctness
285
+
286
+ - Compare exact bigint filesystem identities during exclusive publication and rollback cleanup. Windows rounds file indexes, so a replaced source or target path could previously masquerade as the original — and, worse, authorize deletion of an attacker's replacement. Identity comparisons are now exact.
287
+ - Open pinned and standalone regular-file reads nonblocking on POSIX before validating the descriptor type, so a raced FIFO or device cannot stall the worker. The same read-open flags are now shared by root reads, hashing, and move-copy fallbacks, so the guarantee holds on every path rather than just the one that was fixed.
288
+
289
+ ### Dependencies and maintenance
290
+
291
+ - Refresh the napi toolchain (napi 3.12.1, napi-derive 3.6.3, napi-build 2.4.1) and the Rust and Node development dependency graph.
292
+
293
+ ## 0.5.3 - 2026-08-08
294
+
295
+ ### Security and Correctness
296
+
297
+ - Reject NTFS alternate data stream archive entry names on Windows before extraction, keep JavaScript and native TAR/ZIP policy aligned, and fix one-code-unit native rename and hardlink metadata buffers.
298
+ - Reject synchronous secret reads when the path is retargeted after the preview check, matching the asynchronous reader's `path-mismatch` contract instead of returning bytes from the replacement file.
299
+ - Preserve dangling symlinks when trash moves cross filesystems instead of failing while following their missing targets.
300
+ - Reject non-canonical FileStore keys and malformed archive names before filesystem access, keep JavaScript/native TAR and ZIP rejection semantics aligned (including full-width base-256 sizes and empty ZIP files), and add deterministic property-based regression coverage for path aliasing, parser boundaries, collisions, truncation, and extraction limits.
301
+
302
+ ### Compatibility
303
+
304
+ - Report filesystem I/O failures from secret, `FileStore`, and temp-workspace twin readers as the new operational `read-failed` code with the original error in `cause`, replacing synchronous secret `invalid-path`, asynchronous secret and synchronous store `path-mismatch`, and raw Node errors; consumers matching the old wrapper or `EIO`-style top-level code should match `read-failed` and inspect `cause.code` instead.
305
+ - Preserve semantic path and validation codes in synchronous `FileStore` and temp-workspace reads: missing temp leaves now report `not-found`, stable directories report `not-file`, and hardlinks and symlinks report `hardlink` and `symlink`, replacing `path-mismatch` and fabricated raw `ENOENT` respectively to match their asynchronous twins; consumers treating either old result as absence or identity drift should match the specific path-state code instead.
306
+ - Report an existing non-directory ancestor as `not-file` from both `assertNoSymlinkParents()` variants, replacing asynchronous success and the synchronous helper's platform-dependent success or raw `ENOTDIR` under default `allowMissing`; callers relying on that acceptance should ensure every existing prefix component is a directory or handle `not-file`.
307
+
308
+ ### Docs and Tooling
309
+
310
+ - Measure coverage once per operating system and merge the platform reports before enforcing thresholds, so coverage reflects existing cross-platform execution rather than implying new test coverage.
311
+ - Refresh Vite and its Rolldown toolchain, and declare the native build CLI's Emscripten runtime peer explicitly.
312
+
313
+ ## 0.5.2 - 2026-08-02
314
+
315
+ ### Security and Correctness
316
+
317
+ - Reject negative, malformed, and oversized base-256 TAR sizes using the full encoded field, preventing high-order size bytes from bypassing archive metadata metering.
318
+ - Preserve unrelated files when the create-only JavaScript `Root.write()` fallback loses a parent-directory race during post-write verification, limiting failure cleanup to the inode created by the operation.
319
+ - Report the documented `not-file` code when a writable Root open reaches a non-regular descriptor on Windows, matching the existing POSIX `EISDIR` mapping.
320
+ - Serialize same-target `Root.write()` and `Root.copyIn()` calls before inspecting the existing destination, so ordinary overlapping writers do not race the mode-preservation open against another writer's atomic replacement.
321
+ - Serialize same-target directory replacements, confine their randomized backup names to the target parent, retain identity-bound exit cleanup after transient atomic/output/move staging cleanup failures, and refuse to publish EXDEV move copies when descriptor-bound mode application fails.
322
+ - Stream native pinned-write inputs only after create-only collision checks, avoiding backend-dependent eager buffering, and preserve explicit zero file modes instead of replacing them with `0o600`.
323
+ - Verify synchronous file-store publication by inode after rename and avoid pathname-based post-publication mode changes, so a raced symlink or hardlink swap fails closed without changing an unrelated target's permissions.
324
+ - Track live JSON-store mutation ownership separately from inherited async context, so continuations scheduled by an update can mutate the store after that update finishes while genuinely nested mutations remain rejected.
325
+ - Serialize private secret and file-store publications by canonical destination, preventing ordinary overlapping writers from tripping the fallback's post-rename identity fence while retaining atomic last-writer-wins replacement.
326
+ - Preserve replacement sidecars when asynchronous lock setup fails, remove an identity-matching `Root`-backed sidecar when its post-create open fails, and clean up synchronous sidecars on normal process exit.
327
+ - Pin each `Root` handle to the canonical root directory identity so root-path replacement cannot expose outside metadata through `stat()`, `exists()`, `list()`, or `walk()`, and preserve a swapped-in writable leaf when failed-open cleanup no longer owns its inode.
328
+ - Fail closed on invalid walk and absolute-path policies, keep standalone walk budgets bounded at runtime, reject final symlinks from absolute writable paths, and observe aborts that arrive during directory listing.
329
+ - Canonicalize configured local-root symlinks, recognize case-insensitive `file:` URL schemes (including unsafe device targets) using the requested platform's path semantics, validate every configured root, confine secure-temp fallback prefixes to one segment, preserve replaced temp-file directories during cleanup, return absolute install paths, and avoid splitting Unicode surrogate pairs while truncating filenames.
330
+ - Reject archive output names that collide after case or Unicode normalization, keeping extraction deterministic across JavaScript/native backends and case-insensitive filesystems.
331
+ - Escape control characters in archive-entry and root-path diagnostics, and reject NUL inputs plus embedded Windows drive-relative segments in the direct sync and async root resolvers before Node can echo raw attacker-controlled paths from a syscall error or resolve the two variants differently.
332
+ - Shell-quote POSIX permission-remediation paths, and report a secret file that grows past the synchronous read limit as `too-large` just like the asynchronous reader.
333
+ - Fence pathname SHA-256 hashing against pre-open identity replacement, propagate bounded-stream source failures while tearing down file streams on early consumer close, and report synchronous regular-file disappearance races as `path-mismatch` consistently with the async reader.
334
+ - Pin synchronous file-store roots across every parent-walk segment, so private and non-private writes reject a store root replaced during directory creation, and route deny-mutation ancestor canonicalization through the shared root resolver on Windows and POSIX.
335
+ - Keep the POSIX parent-directory no-follow identity check active for synchronous atomic-replacement adapters that omit `fchmodSync`, preventing the documented default adapter path from writing through a symlinked parent.
336
+ - Synchronize the actual destination after descriptor-bound mode application when atomic rename uses copy fallback, and include both bytes and mode in bounded fallback restoration.
337
+ - Continue accepting legacy atomic-replacement adapter literals that expose pathname `chmod` or `chmodSync` methods while keeping those methods unused.
338
+ - Reject archive NUL names, drive-relative path segments, duplicate output names (including collisions introduced by `stripComponents`), and ZIP CRC or declared-size mismatches before publishing output. Explicit zero archive limits now remain zero, and stripped TAR entries count toward `maxEntries`, keeping the native and JavaScript policies aligned.
339
+
340
+ - Reject non-file sidecars without spinning, and read contended async and synchronous sidecar locks through bounded, no-follow, identity-checked descriptors; keep valid `createdAt` timestamps authoritative under filesystem clock skew; fail closed when fallback Windows ACL inspection returns no verifiable access entries; preserve synchronous stale-reclaim guards owned by another acquirer; and share one process-exit cleanup listener across file-lock manager domains.
341
+
342
+ - Route `Root.copyIn()` and overwrite-capable `Root.write()` commits through a new descriptor-relative native replace rename, closing a parent-symlink swap that could create a missing destination directory outside the root before the JavaScript fallback detected the escape. Native `auto` and `require` mode now protect both create-only and replacing pinned writes; the explicitly best-effort JavaScript fallback remains available in `off` mode or when `auto` cannot load a binding.
343
+ - Report `not-found` rather than `invalid-path` or raw `ENOENT` when pinned `Root.write()` and `Root.copyIn()` calls cannot find their parent with `mkdir: false`, preserving the documented operational error category.
344
+ - Reject stable intermediate symlinks in default `Root` reads and the sync/async root-file helpers, while preserving `device-path` precedence for lexically explicit unsafe namespaces such as `/dev/fd`; compare the pre-open path identity with the opened descriptor so an in-root parent swap reports `path-mismatch`, open reads nonblocking where supported so a raced FIFO cannot pin a worker, and report followed symlink loops with the documented `symlink` code.
345
+ - Reject surrounding whitespace in every async and sync `FileStore` key instead of silently trimming one caller-supplied key onto another.
346
+ - Keep Windows-ignored trailing spaces and dots from disguising reserved device basenames such as `CON .` in `sanitizeUntrustedFileName()` output.
347
+ - Report overlong `Root` inputs as `invalid-path` instead of misclassifying the filesystem's `ENAMETOOLONG` failure as `outside-workspace`.
348
+
349
+ - Apply `movePathWithCopyFallback()` file and POSIX directory modes through staging descriptors before publication, so a replaceable staging pathname cannot redirect `chmod` to an unrelated symlink target. Windows no longer uses a pathname fallback for directory modes because Node cannot portably open a directory descriptor there and does not enforce POSIX modes.
350
+
351
+ - Reject drive-relative segments such as `C:secret.txt` and `a/C:b` in portable relative-path parsing and every `FileStore` key, and reject leading drive-relative spellings on `Root` destinations and `resolve()` with `invalid-path`. Existing-object Root operations, including reads, inspection, removal, and the source of `move()`, continue to accept legal POSIX filenames such as `c:notes.txt`; thanks @Yigtwxx for the fix.
352
+
353
+ - Apply atomic-replacement parent-directory modes through verified no-follow descriptors on POSIX, so a directory-entry swap cannot redirect `chmod` through a symlink to an unrelated directory. Windows keeps its explicit `mkdir(mode)`-only behavior because Node does not enforce POSIX directory modes there.
354
+ - Retry a contended file-lock acquisition when Windows denies access to a lock file whose directory entry is still being torn down, including when the native binding performs the exclusive create. Both the exclusive create and the holder's snapshot read reported that transient `EPERM` as a hard failure, so concurrent `acquireFileLock()` calls failed intermittently on Windows even though the very next attempt would have succeeded. Retries stay bounded, so a genuine permission denial still surfaces as `EPERM` rather than a lock timeout; thanks @Yigtwxx for the fix.
355
+ - Apply `replaceFileAtomic()` and `replaceFileAtomicSync()` modes through pinned temp-file descriptors before rename, and through pinned copy-fallback descriptors, so a post-rename symlink swap cannot redirect `chmod` to an unrelated file while exact modes remain independent of umask; thanks @yetval for reporting this (#86).
356
+ - Bound fallback Windows owner and ACL command execution to 30 seconds per process, tolerating loaded runners while still terminating wedged commands, and report owner-query failures as unverified instead of returning a partial permission classification; thanks @Yigtwxx for the diagnosis.
357
+ - Verify published npm bytes directly when registry integrity metadata conflicts, and cryptographically verify the registry signature plus Sigstore provenance against the package digest and the trusted fs-safe release workflow (#81).
358
+ - Report the documented `remove()` failure codes instead of collapsing every failure to `path-alias`. A missing target now throws `not-found`, a non-empty directory throws `not-empty`, and any other filesystem failure throws `not-removable`, while directory identity drift keeps reporting `path-mismatch`; thanks @Yigtwxx for the fix.
359
+
360
+ ### Compatibility
361
+
362
+ - Report access-denied failures from native Windows operations as `EPERM` rather than `EACCES`, matching Node/libuv and the JavaScript fallback. Consumers that matched the previous native-only `EACCES` code should accept `EPERM` as well when supporting older package versions.
363
+ - Add an optional `fchmodSync` operation to the injectable synchronous atomic-replacement filesystem type. Async adapters need no new member because their required `open()` returns a mode-capable `FileHandle`; custom sync adapters that pass `mode`, `dirMode`, or `preserveExistingMode` now fail before mutation when `fchmodSync` is absent, while plain `node:fs` injection and adapters that request none of those options remain compatible.
364
+ - Classify `not-found`, `not-empty` and `not-removable` as operational rather than policy errors, so `FsSafeError.category` no longer reports routine filesystem outcomes as safety-policy rejections.
365
+
366
+ ### Features
367
+
368
+ - Suffix Windows reserved basenames with `_` in `sanitizeUntrustedFileName()` while preserving case and extensions on every platform, including dollar names and superscript COM/LPT variants; thanks @SebTardif (#67).
369
+
370
+ ### Docs and Tooling
371
+
372
+ - Refresh the native package build CLI to `@napi-rs/cli` 3.8.2.
373
+ - Give parallel native archive tests collision-free temporary paths so one fixture cannot remove another test's file on coarse-resolution clocks.
374
+ - Include the README banner in the npm tarball and require it during pack checks so the published README does not reference a missing package asset; sanitize pnpm-only npm configuration from package-smoke subprocesses so the documented release check stays warning-free on newer npm versions.
375
+ - Audit every public export and documented default against generated declarations and real filesystem behavior, add executable documentation-contract coverage, and correct stale examples and security guarantees across root writes, local roots, shared types, paths, temp roots, archives, errors, and filename portability.
376
+
377
+ - Create GitHub Releases as drafts before npm publication, then attach immutable verification proof and promote them only after the published package passes the shared registry verifier, avoiding stranded releases during registry propagation incidents (#81).
378
+
379
+ ## 0.5.1 - 2026-08-01
380
+
381
+ ### Security and Correctness
382
+
383
+ - Stop trimming surrounding whitespace when normalizing Windows paths for comparison, so a space-padded root no longer compares equal to its unpadded sibling and `isPathInside` keeps reporting outside paths as outside.
384
+ - Apply `denyMutations` prefixes to the directory they name on Windows. A prefix with trailing whitespace previously compared equal to its unpadded sibling, so the named directory stayed writable while the sibling was blocked; the two `preserves trailing whitespace` deny-mutation cases now run on Windows instead of being skipped.
385
+ - Replace backtracking-prone path-segment, temp-name, and Windows device-path sanitizers with linear scans to keep attacker-controlled inputs from causing excessive CPU use.
386
+
387
+ ### Docs and Tooling
388
+
389
+ - Refresh the npm and Rust build toolchains, including the `zip` 8.6 native archive reader and the latest pinned CodeQL v4 action.
390
+ - Publish only the validated release tarball after asserting its byte identity against the release manifest, and tolerate npm registry propagation with bounded exponential backoff.
391
+
392
+ ## 0.5.0 - 2026-07-27
393
+
394
+ ### Highlights
395
+
396
+ - Add policy-driven archive entry filtering and mode handling, bounded single-entry archive reads, root-bounded async walking, synchronous sidecar locks, async secret reads, create-only secret writes, and exclusive file publication.
397
+ - Add public streaming `sha256File(path | FileHandle)` hashing with optional async native acceleration, plus policy-free Windows owner/DACL facts with owner and current-process-user SIDs and per-ACE masks and inheritance flags.
398
+ - Add native fd-relative ZIP and TAR extraction/read support with gzip, zstd, and bzip2 streaming; TypeScript evaluates the shared entry policy before Rust creates any output, and zstd/bzip2 report a typed native-required error when no binding is available.
399
+ - Bound PAX, GNU long-name/link, and sparse metadata with one `maxMetaEntryBytes` policy shared by node-tar and the native fixed-header metering reader, including typed failures for oversized or malformed metadata.
400
+ - Add `Root.walk()` subtree pruning and partial directory-error reporting for bounded best-effort consumers, plus a shared `maxEntryPathComponents` archive limit that rejects implicit-directory depth attacks before either extraction path creates output.
401
+ - Bundle all seven prebuilt native binaries inside the single `@openclaw/fs-safe` package for fd-relative opens, guarded directory creation and hardlinks, atomic no-replace rename, and file identity checks. This deliberately increases the package size in exchange for deterministic installs with no optional platform packages, downloads, postinstall step, or consumer Rust build; unsupported platforms silently use the guarded JavaScript fallback in `auto` mode.
402
+
403
+ ### Security and Correctness
404
+
405
+ - **Security — `resolveRootPath()` / `resolveRootPathSync()`:** Published releases through 0.4.7 validated a lexically normalized path spelling, so a caller-supplied path traversing an in-root symlink could pass validation while resolving outside the root. Version 0.5 fixes this with component-wise alias resolution. `root()` handles were **not** affected: their operations have contained this case since `5ddca80`, so exposure is limited to direct users of these two exported helpers.
406
+ - Prefer macOS 15.4's `O_RESOLVE_BENEATH` for native opens, retain the guarded component walk on older kernels, and apply an `F_GETPATH` post-open escape detector to both routes without claiming rename-race atomicity.
407
+ - Report open containment explicitly: native `openBeneath()` returns `{ fd, containment }` with `kernel-atomic` on Linux and `best-effort` on macOS/Windows, while JavaScript root open/read/writable results report `best-effort`.
408
+ - Serialize async `jsonStore` writes and read-modify-write updates in-process by canonical store path before taking the cross-process sidecar lock, preventing overlapping `write`, `update`, and `updateOr` calls from silently losing updates; reject nested same-path mutations with typed `store-reentrant-update` errors. Thanks @yetval for reporting this.
409
+ - Create `append`, `openWritable`, and fallback `copyIn` parents through guarded per-component walks and continue I/O through the resolved in-root parent, preventing symlink-swap races from creating directories outside the root while preserving valid in-root symlink parents. Thanks @yetval for reporting this.
410
+ - Add pinned-destination hardlink rejection and bounded original-content restoration to `replaceFileAtomic()` and its sync variant, including typed `restored` / `restore-failed` receipts for torn copy-fallback writes.
411
+ - Add sibling staging to `writeExternalFileWithinRoot()`: external producers can write a randomized file in the target directory for fsynced same-filesystem atomic replacement, while private workspace staging remains the cross-device-tolerant default; staged and final basenames share portable C0/C1 and Windows-invalid-character sanitization on every host.
412
+ - Enforce `movePathWithCopyFallback({ sourceHardlinks: "reject" })` with a streaming, entry-capped recursive preflight before mutation, closing a shipped 0.4.x gap where the common same-filesystem rename bypassed the policy; approved trees commit through a fresh staged copy with open-time and post-copy link-count fences so a scan/rename race cannot publish a hardlinked inode.
413
+ - Abort and tear down JavaScript TAR extraction immediately when entry policy, path validation, link rejection, or a budget fails, preventing node-tar from leaving a paused parser after rejected fleet-restore entries; both native and JavaScript paths now return the same typed archive-policy errors.
414
+ - Attach a post-creation failure receipt to `publishFileExclusive()` errors with the failing phase, whether this call created the target, its observed identity, and whether cleanup removed, preserved, or could not classify the target.
415
+ - Add `publishFileExclusive({ onSyncFailure: "rollback" | "preserve" })`: rollback remains the default, while preserve keeps a complete target after directory-sync failure and reports the failed sync outcome in the typed provenance receipt.
416
+ - Close the pinned publication source on parent-pinning failure so every acquired descriptor is released on every exit path.
417
+ - Remove the native loader's PATH-resolved `ldd` execution. Linux libc detection now uses the Node process report, conventional musl library filenames, and the Node executable's ELF interpreter without spawning a process at import time; an inconclusive probe conservatively attempts glibc and falls back normally in `auto` mode.
418
+ - Default archive extraction to `entryModes: "clamp"`, normalizing directories to `0o755` and files to `0o644` or `0o755` while always stripping setuid, setgid, and sticky bits; use `"preserve"` to retain safe archived rwx bits.
419
+ - Prefer native create-only commits, sidecar acquisition, hardlink publication, and the explicit `rename-noreplace` publication strategy when the platform binding is available, while retaining guarded JavaScript fallbacks for `auto` and `off` modes.
420
+ - Accelerate exclusive publication fallbacks with macOS `fclonefileat`, Linux `FICLONE` and `copy_file_range`, then the unchanged JavaScript byte loop; all paths retain exclusive creation, identity fencing, mode normalization, and SHA-256 verification through an async native hash task when available.
421
+ - Add direct Windows owner/DACL inspection and protected private-directory creation for the current owner, LocalSystem, and Administrators, while retaining the existing .NET/`icacls` behavior when native mode is unavailable, forced off, or encounters an unsupported descriptor form.
422
+ - Keep the public private-directory creator Windows-only and native-only so POSIX pathname races or inherited ACLs cannot weaken its privacy guarantee.
423
+ - Build Linux native opens on `openat2(RESOLVE_BENEATH | RESOLVE_NO_MAGICLINKS)`, macOS opens on an in-root `O_NOFOLLOW` component walk, and Windows opens on handle-relative `NtCreateFile` with reparse-point rejection.
424
+
425
+ ### Compatibility
426
+
427
+ - Remove the unsound process-scoped `allowReentrant` async file-lock option and replace it with owner-scoped `reentrantOwner` for async and sync locks: only matching, explicitly defined logical owners reuse a canonical in-process lock, releases are reference-counted and idempotent, and different or absent owners contend normally. Callers that passed the boolean must either remove it or migrate intentional nesting to a per-operation owner key; `jsonStore` remains ownerless and rejects nested same-file mutations immediately.
428
+ - Remove the persistent Python helper and its `pythonPath` configuration. Replace `configureFsSafePython`, `FS_SAFE_PYTHON_MODE`, and the OpenClaw Python aliases with `configureFsSafeNative` and `FS_SAFE_NATIVE_MODE`; 0.5 warns once and maps the former `auto`, `require`, and `off` policies solely as an upgrade bridge for shipped 0.4 consumers.
429
+ - Add `publishFileExclusive({ strategy: "rename-noreplace" })`; this strategy requires the native helper, atomically moves the source, and never replaces an existing destination.
430
+
431
+ ### Docs and Tooling
432
+
433
+ - Add an ordered 0.4-to-0.5 migration checklist and reconcile every new archive, native, publication, walk, lock, secret, permission, and temp-workspace contract with realistic examples and cross-links.
434
+ - Convert the repository to a pnpm workspace, test the Rust crate on Linux, macOS, and Windows, and publish all platform bindings, the native loader, and the root package through one protected-tag release pipeline with npm provenance.
435
+ - Replace unused napi-rs Android, FreeBSD, OpenHarmony, WASI, and unsupported-architecture loader branches with a checked-in loader for the seven packages actually published, and make publication benchmarks report the exercised clone/copy/JavaScript tier plus filesystem environment.
436
+
437
+ ## 0.4.7 - 2026-07-24
438
+
439
+ ### Features
440
+
441
+ - Add `@openclaw/fs-safe/durability` with identity-pinned directory handles,
442
+ explicit strict sync outcomes, synchronous and best-effort variants, and
443
+ durable nested-directory creation through every new parent edge.
444
+
445
+ ### Security and Correctness
446
+
447
+ - Reject final symlinks, FIFOs, non-directories, canonical-path drift, and
448
+ descriptor/path identity replacement before or after directory sync.
449
+ - Propagate POSIX directory synchronization failures while classifying known
450
+ unsupported Windows directory flushing only after revalidating the target;
451
+ directory-open access failures remain strict.
452
+ - Route sibling-temp, root, and pinned-write best-effort parent synchronization
453
+ through the shared guarded primitive instead of maintaining divergent implementations.
454
+
455
+ ### Docs and Tooling
456
+
457
+ - Document directory receipts, pin lifecycle, platform outcomes, custom
458
+ creation callbacks, and the boundary between filesystem durability and
459
+ application commit protocols.
460
+
461
+ ## 0.4.6 - 2026-07-24
462
+
463
+ ### Highlights
464
+
465
+ - Reject foreign-owned or unverifiable Windows files in secure reads while
466
+ preserving supported trusted local owners and exact extended drive paths.
467
+
468
+ ### Security and Correctness
469
+
470
+ - Report Windows owner SIDs and whether the owner is the current user,
471
+ LocalSystem, or built-in Administrators so credential-bearing executable
472
+ checks can reject foreign-owned paths even when their visible DACL is
473
+ read-only. Secure reads enforce the result and remote filesystems fail
474
+ closed.
475
+ - Read Windows owner and DACL data through the underlying .NET security
476
+ descriptor APIs so verification does not depend on PowerShell security-module
477
+ autoloading.
478
+ - Invoke `icacls.exe` with its supported path-only inspection syntax and use
479
+ the live Windows user/domain environment for named ACE classification, so
480
+ ACL verification works on supported Windows hosts instead of failing on the
481
+ invalid `/sid` argument.
482
+ - Normalize trailing Windows install-root separators with a bounded linear
483
+ scan so library-provided environment maps cannot trigger regex backtracking.
484
+
485
+ ### Docs and Tooling
486
+
487
+ - Add the public repository governance baseline, pinned CodeQL analysis,
488
+ package tarball/import validation, and protected tag-driven npm trusted
489
+ publishing with provenance and changelog-derived GitHub releases.
490
+ - Let tag-driven publishing continue from an expected registry miss into npm
491
+ trusted publishing instead of exiting before the publish attempt.
492
+ - Publish the generated tarball through an explicit relative path so npm treats
493
+ it as a local artifact instead of GitHub repository shorthand.
494
+
495
+ ## 0.4.5 - 2026-07-20
496
+
497
+ ### Highlights
498
+
499
+ - Preserve sidecar-lock ownership across filesystem identity drift without weakening legacy stale-lock checks.
500
+
501
+ ### Security and Correctness
502
+
503
+ - Give new sidecar locks an internal random ownership token outside the parsed JSON payload so release remains ownership-checked when virtual filesystems report different descriptor and pathname identities, while legacy locks retain the stricter identity-plus-content check.
504
+
505
+ ## 0.4.4 - 2026-07-18
506
+
507
+ ### Security and Correctness
508
+
509
+ - Restore opt-in stale sidecar recovery with an exclusive reclaim guard that serializes snapshot verification and unlink, preserving dead-owner recovery without allowing a competing reclaimer to delete a fresh replacement lock.
510
+
511
+ ## 0.4.3 - 2026-07-18
512
+
513
+ ### Compatibility
514
+
515
+ - Restore the pre-0.4.2 `readRegularFile` and `readRegularFileSync` overflow error message while retaining allocation-bounded reads and the structured `too-large` error on the new low-level bounded-read primitives.
516
+
517
+ ## 0.4.2 - 2026-07-18
518
+
519
+ ### Features
520
+
521
+ - Add bounded async/sync reads for already-open file descriptors and handles, plus optional byte caps for standalone JSON readers.
522
+
523
+ ### Security and Correctness
524
+
525
+ - Make capped root, regular-file, secure-file, secret-file, structured JSON, and synchronous store reads incremental so a file that grows after validation cannot trigger an unbounded allocation.
526
+ - Disable `remove-if-unchanged` stale sidecar deletion because a pathname identity check followed by unlink can delete a replacement lock; retain the deprecated recovery inputs for compatibility while all stale locks fail closed.
527
+
528
+ ### Compatibility
529
+
530
+ - Treat `EPERM` from pinned-write file and directory `fsync` calls as best effort for filesystems that permit the write but reject explicit synchronization.
531
+
532
+ ## 0.4.1 - 2026-07-01
533
+
534
+ ### Security and Correctness
535
+
536
+ - Update the optional TAR extractor to reject NUL-terminated PAX values, invalid negative entry sizes, and explosive decompression payloads.
537
+
538
+ ### Compatibility
539
+
540
+ - Add explicit `renameIdentity: "verify-content-with-lock"` writes for rclone-style FUSE mounts whose inode identity changes across rename, while keeping strict identity verification as the default and failing closed on stale cooperative locks. (#32, #33; thanks @jlautman)
541
+
542
+ ## 0.4.0 - 2026-06-17
543
+
544
+ ### Features
545
+
546
+ - Report unreadable walk roots and subdirectories through `failedDirs` from `walkDirectory()` and `walkDirectorySync()`, preserving readable results while letting destructive reconciliation distinguish incomplete scans from empty directories. (#29; thanks @amknight)
547
+
548
+ ### Compatibility
549
+
550
+ - Require Node.js 22 or newer for the npm package and docs, matching the maintained CI matrix.
551
+
552
+ ### Security and Correctness
553
+
554
+ - Fall back to the existing copy/remove move path when Windows denies directory renames with `EPERM`, preserving skill updates while watched files are locked. (#27; thanks @liuxingwei0601)
555
+ - Sync `root.append` file handles before close and sync the parent directory when append creates a file, preserving append-mode concurrency while improving durability. (#21; thanks @KumarAnandSingh)
556
+ - Reject known unsafe device and process-fd read paths before opening files, including `/dev/zero`, `/dev/random`, `/dev/fd/*`, `/proc/*/fd/*`, and Windows reserved device names.
557
+
558
+ ## 0.3.0 - 2026-05-21
559
+
560
+ ### Features
561
+
562
+ - Add opt-in `denyMutations` policies with exact `paths` and subtree `prefixes` so callers can protect application-sensitive files from root write, copy, move, remove, mkdir, and writable-open operations. (#20; thanks @amknight)
563
+
564
+ ### Security and Correctness
565
+
566
+ - Retry async JSON reads (`readJson`, `readJsonIfExists`, `tryReadJson`) up to five attempts with 50ms exponential backoff when the file is rotated mid-read by an atomic rename, and tag the underlying race as `FsSafeError("path-mismatch")` so callers can distinguish transient swaps from corruption. (#19; thanks @yetval)
567
+
568
+ ## 0.2.7 - 2026-05-20
569
+
570
+ ### Security and Correctness
571
+
572
+ - Restore best-effort Node write fallbacks when the Python helper is disabled or unavailable, preserving the `mode: "off"` contract while documenting the weaker POSIX same-UID race resistance compared with fd-relative helper commits.
573
+ - Harden DeepSec-reported archive staging and input pinning, secret and queue hardlink rejection, absolute output file validation, sidecar lock read failures, ClawSweeper dispatch trust checks, and scoped path defaults.
574
+
575
+ ## 0.2.6 - 2026-05-17
576
+
577
+ ### Security and Correctness
578
+
579
+ - Harden DeepSec-reported temp path handling, private secret writes, pinned helper commits, fallback mkdir writes, and dot-prefixed root relative paths against symlink, race, and relative-path edge cases.
580
+
581
+ ## 0.2.5 - 2026-05-16
582
+
583
+ ### Security and Correctness
584
+
585
+ - Reject Windows drive-letter paths on POSIX secure-file reads, missing path fallbacks under symlinked parents, swapped archive destination roots, broad domain ACL principals, and hardlinked sync store reads.
586
+ - Preserve top-level JSON `null` values in JSON stores and reject non-document JSON values such as top-level `undefined` before replacing files.
587
+ - Fix timeout error factories, root-relative path resolution at filesystem roots, dot-prefixed child names in root path helpers, durable queue directory modes, and pinned helper stale-worker events.
588
+
589
+ ### Build
590
+
591
+ - Clean `dist` before package builds and make prepack fail deterministically when dependencies are missing instead of resolving new toolchain versions at publish time.
592
+
593
+ ### Tests
594
+
595
+ - Added Clawpatch regression coverage for secure reads, path fallback validation, sync stores, archive destination races, Windows ACL classification, JSON writes/stores, durable queue modes, root create no-clobber behavior, and pinned helper worker replacement.
596
+
597
+ ## 0.2.4 - 2026-05-14
598
+
599
+ ### Features
600
+
601
+ - Add opt-in `remove-if-unchanged` stale lock recovery so callers can centralize compare-and-remove mechanics while keeping application-owned stale-owner policy.
602
+
603
+ ## 0.2.3 - 2026-05-14
604
+
605
+ ### Fixes
606
+
607
+ - Classify broad Windows ACL identities such as Anonymous Logon, Guests, Interactive, Local, and Network as world-equivalent so writable paths are not downgraded to group-writable findings.
608
+
609
+ ## 0.2.2 - 2026-05-11
610
+
611
+ ### Fixes
612
+
613
+ - Fall back to Node path guards for root stat and list operations on Windows, where the pinned Python helper is intentionally unsupported.
614
+
615
+ ## 0.2.1 - 2026-05-08
616
+
617
+ ### Fixes
618
+
619
+ - Align POSIX and Windows handling for literal `..`-prefixed write targets, preserve whitespace in direct home-relative path inputs, and run the check suite on Windows CI. (#14; thanks @sjf)
620
+ - Keep source prepack builds isolated from parent monorepo ambient type packages such as Bun typings. (#13; thanks @Kaspre)
621
+ - Let secret-file reads follow symlink paths through the pinned real target unless callers opt into `rejectSymlink: true`.
622
+
623
+ ## 0.2.0 - 2026-05-07
624
+
625
+ ### Features
626
+
627
+ - Add `writeExternalFileWithinRoot()` for libraries that require an output path while preserving caller-provided destination names. (#7; thanks @jesse-merhi)
628
+ - Add root JSON helpers and durable JSON queue helpers for file-backed work queues with pending, delivered, failed, and acknowledgement flows.
629
+ - Add `ensureAbsoluteDirectory()` for creating trusted absolute directory paths one segment at a time while rejecting symlink and non-directory components. (#12; thanks @jesse-merhi)
630
+ - Add a `durable: false` option to async atomic text and JSON writes so callers can preserve replace semantics while skipping temp-file and parent-directory fsync. (#9; thanks @sallyom)
631
+ - Add process-wide sidecar lock defaults while keeping JSON store locking opt-in per resource.
632
+
633
+ ### Security and Correctness
634
+
635
+ - Harden Root fallback mutators, archive merges, private store reads/writes, durable queue ids, JSON fallback writes, sibling temp writes, temp filename sanitization, and trash moves against symlink-swap and path traversal edge cases.
636
+ - Centralize safe path segment validation, directory identity guards, guarded mkdir, and guarded mutation wrappers so filesystem helpers reuse the same race-resistant checks.
637
+ - Route archive ZIP staging, temp workspace sync reads, secret-file commits, and atomic move/replace fallbacks through shared pinned-read or guarded-write primitives without applying private-directory modes to public paths.
638
+ - Close guarded fallback write handles without following path names if post-write directory verification fails, avoiding descriptor leaks and unsafe cleanup in symlink-swap races.
639
+ - Harden temp filename prefixes, local-root reads, private store imports, durable queue reads, and regular-file byte caps against Deepsec-reported path traversal, symlink, and oversized-read races.
640
+ - Harden sidecar lock cleanup and stale-lock handling so stale third-party locks fail closed instead of being deleted by path.
641
+
642
+ ### Compatibility
643
+
644
+ - Make cross-device move fallbacks reject source changes during staged copies and clean up only the source entries copied into the staged destination, preserving concurrent source additions or replacements instead of recursively deleting them.
645
+ - Preserve directory modes during cross-device directory moves.
646
+ - Preserve empty-directory pruning and broken-symlink trash moves across guarded fallback paths.
647
+ - Preserve sync file-store read policy errors for directory and hardlink validation failures.
648
+ - Preserve existing temp workspace leaf filename behavior for names such as `.env` and filenames containing spaces.
649
+ - Preserve public parent-directory modes when writing JSON, moving files across devices, and extracting archives.
650
+ - Make `prepack` portable on Windows and add the missing pnpm workspace `packages` field so package preparation succeeds consistently.
651
+
652
+ ### Tests
653
+
654
+ - Added regression coverage for the filesystem race and traversal findings fixed in this release.
655
+ - Added Deepsec regression coverage for unsafe temp tokens, dangling symlinks, default read caps, private `copyIn()` races, symlinked queue entries, oversized queue entries, and fresh sidecar lock preservation.
656
+ - Added regression coverage for external-output traversal rejection, guarded cleanup, sidecar lock stale handling, move fallback cleanup, durable queue validation, sync read policy failures, and absolute-directory validation.
657
+ - Added a static filesystem-boundary primitive check that blocks reintroducing known raw copy/read/guard patterns.
658
+
659
+ ### Docs and Tooling
660
+
661
+ - Added docs for external output writers, durable JSON queue helpers, sidecar lock defaults, boundary guardrails, and absolute-directory creation.
662
+ - Enable ClawSweeper dispatch for pull-request review automation.
663
+
664
+ ## 0.1.2 - 2026-05-06
665
+
666
+ ### Fixes
667
+
668
+ - Reject `fileStore()` and `fileStoreSync()` writes through symlinked parent directories so store commits cannot escape the configured root.
669
+
670
+ ### Tests
671
+
672
+ - Increased filesystem edge coverage around secure temp fallback handling, sibling-temp cleanup, local-root resolution, file locks, and file identity checks.
673
+ - Prevented POSIX test runs from leaving Windows-style secure-temp fallback paths in the repository root.
674
+
675
+ ### Docs
676
+
677
+ - Added missing docs pages for `@openclaw/fs-safe/config`, `@openclaw/fs-safe/store`, `@openclaw/fs-safe/advanced`, and `@openclaw/fs-safe/test-hooks`.
678
+ - Corrected path-helper docs for the synchronous `isPathInsideWithRealpath` and `safeRealpathSync` behavior.
679
+ - Included the Markdown docs in the npm package so README links resolve after install.
680
+
681
+ ## 0.1.1 - 2026-05-06
682
+
683
+ ### Fixes
684
+
685
+ - Preserve the caller's destination path spelling during staged archive merges so symlink-rebind checks catch alias races on macOS.
686
+ - Reject archive writes that gain a hardlink alias during post-write verification and clean up the destination file.
687
+
688
+ ## 0.1.0 - 2026-05-06
689
+
690
+ ### Features
691
+
692
+ - Added `root()` capability-style filesystem handles for root-bounded reads, writes, appends, moves, copies, directory listing, stat, mkdir, remove, JSON, streams, and existence checks.
693
+ - Added traversal, symlink, hardlink, alias, and post-open/post-write identity checks for untrusted relative paths.
694
+ - Added process-global Python helper configuration for stronger POSIX fd-relative mutation paths, with `auto`, `off`, and `require` modes.
695
+ - Added atomic file and directory replacement helpers with mode control, fsync options, retry handling, and copy-fallback behavior.
696
+ - Added JSON helpers, `fileStore()`, `jsonStore()`, private store mode, and file-backed temporary workspaces.
697
+ - Added secure absolute file reads, secret-file helpers, permissions inspection, Windows ACL helpers, and local-root readers.
698
+ - Added archive extraction and preflight helpers for ZIP/TAR with optional `jszip` and `tar` dependencies, size/count/path/link limits, and staged destination writes.
699
+ - Added file locks, async locks, bounded directory walking, install-path sanitizers, filename sanitization, regular-file helpers, trash moves, and advanced composition helpers.
700
+ - Added OpenClaw bypass-parity coverage, API coverage, a benchmark workflow, docs site generation, security docs, and coverage CI.