@openclaw/openshell-sandbox 2026.9.1 → 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,347 @@
1
+ # Writing
2
+
3
+ The `Root` handle exposes a tight set of mutation verbs. Replacement writes
4
+ (`write`, `writeJson`, and `copyIn`) publish with a sibling-temp commit so no
5
+ half-written replacement appears at the destination. Create-only writes
6
+ (`create`, `createJson`, and `write` with `overwrite: false`) use sibling-temp
7
+ staging with an atomic no-replace rename only on backends that provide one —
8
+ the native binding, which `require` mode guarantees and `auto` mode uses when
9
+ the binding loads. The pure-JavaScript fallback has no atomic no-clobber
10
+ rename and does not stage: it claims the final name exclusively with `O_EXCL`
11
+ and writes content in place, so a concurrent observer can see the new file
12
+ before its content is complete. Use `require` mode when that visibility window
13
+ matters.
14
+ `append` and `openWritable` intentionally modify an opened file in place;
15
+ `move`, `remove`, and `mkdir` mutate directory entries rather than file bytes.
16
+ Each verb applies the boundary checks appropriate to its operation.
17
+
18
+ ```ts
19
+ await fs.write("state.json", body);
20
+ await fs.create("seed.json", initial); // throws if exists
21
+ await fs.writeJson("config.json", state);
22
+ await fs.append("logs/today.log", line);
23
+ await fs.copyIn("inbox/upload.bin", "/tmp/upload.bin");
24
+ await fs.move("notes/draft.md", "notes/published.md");
25
+ await fs.remove("logs/yesterday.log");
26
+ await fs.mkdir("snapshots/2026/05");
27
+ ```
28
+
29
+ ## What replacement writes do
30
+
31
+ 1. Resolve the relative target against the canonical root and reject anything that escapes (`outside-workspace`).
32
+ 2. If `mkdir: true`, create missing parent directories relative to a pinned parent fd in the native path, or with per-component identity guards in the JavaScript fallback.
33
+ 3. Pin or guard the parent directory for the selected mechanism. Native operations use a parent fd; guarded JavaScript verifies directory identity before and after mutation. The JavaScript check cannot make the intervening pathname syscall atomic, so a same-privilege peer that can replace the parent may cause an out-of-root side effect before detection. Use native `require` mode for that threat model; see the [security model](security-model.md#symlinks-write-side).
34
+ 4. Write data to a sibling temp file in the same directory.
35
+ 5. Atomically rename the temp file over the destination.
36
+ 6. Stat the resulting fd and verify identity.
37
+
38
+ Private sibling temporary names are independent of the destination basename,
39
+ so staging does not add a suffix to an otherwise valid long filename.
40
+
41
+ A failure before the final rename leaves the destination at its previous
42
+ contents. A successful rename publishes the complete replacement. This
43
+ old-or-new guarantee does not apply to `append()` or `openWritable()`, which
44
+ write in place, or to lower-level atomic helpers when their explicitly
45
+ non-atomic permission-error copy fallback is enabled.
46
+
47
+ Post-publication verification can still reject after a complete replacement has
48
+ been committed. Rejection does not promise that a successful rename was rolled
49
+ back; the published file or a raced replacement may remain at the destination.
50
+
51
+ ## Denying mutations
52
+
53
+ All mutation verbs accept `denyMutations?: DenyMutationPolicy`, either as a root default or per-call option:
54
+
55
+ ```ts
56
+ const fs = await root("/srv/workspace", {
57
+ denyMutations: {
58
+ paths: ["/srv/workspace/.env"],
59
+ prefixes: ["/srv/workspace/.ssh"],
60
+ },
61
+ });
62
+
63
+ await fs.write(".env", "x"); // throws FsSafeError code "denied-path"
64
+ await fs.remove(".ssh/id_rsa"); // throws FsSafeError code "denied-path"
65
+ ```
66
+
67
+ `paths` blocks exact absolute paths. `prefixes` blocks absolute paths and everything below them. fs-safe preserves path strings exactly and canonicalizes through existing ancestors before comparing, so a mutation through a symlinked ancestor to a denied path is still denied. Root-level and per-call policies are additive; per-call policy can add denies, but cannot clear root defaults.
68
+
69
+ ## Write verbs
70
+
71
+ ### `fs.write(rel, data, options?)`
72
+
73
+ Overwrite or create. Always atomic.
74
+
75
+ ```ts
76
+ await fs.write("state/last-run.json", JSON.stringify(run));
77
+ await fs.write("notes/today.txt", "hello\n", { encoding: "utf8" });
78
+ ```
79
+
80
+ `data` accepts `string | Buffer`. `mode` sets the file's POSIX mode. If neither the call nor `RootDefaults` supplies it, a replacement preserves the existing file mode and a new file uses `0o600`. `mkdir` and `overwrite` both default to `true`; set `overwrite: false` for the same no-clobber behavior as `create()`.
81
+
82
+ #### Write options
83
+
84
+ | Option | Type | Default / behavior |
85
+ |---|---|---|
86
+ | `denyMutations` | `DenyMutationPolicy` | Merged with root-level denies. |
87
+ | `durable` | `boolean` | `true`; use `false` to skip file and parent fsync. |
88
+ | `encoding` | `BufferEncoding` | `"utf8"` for strings. |
89
+ | `mkdir` | `boolean` | `true`; creates missing parents. |
90
+ | `mode` | `number` | Inherited on replacement, otherwise `0o600`. |
91
+ | `overwrite` | `boolean` | `true`; `false` is create-only. |
92
+ | `renameIdentity` | `RenameIdentityPolicy` | `"strict"`. |
93
+
94
+ `write`, `create`, `writeJson`, `createJson`, and `append` accept `durable`.
95
+ Precedence is per-call option, then `Root.defaults.durable`, then `true`;
96
+ an explicitly `undefined` call option preserves the root default.
97
+ `durable: false` keeps the sibling-temp replace/rename behavior of replacement
98
+ writes but skips file and parent-directory fsync calls. Create-only and append
99
+ publication behavior, permissions, identity checks, and error codes are unchanged.
100
+ Use it only for reconstructible data: a crash may lose the write or leave the
101
+ previous file. `copyIn`, `move`, and streaming `openWritable` do not use this option.
102
+ The existing pure-JavaScript Windows writer performs no fsync calls in either
103
+ setting; native Windows writes honor the option. Directory sync remains best-effort.
104
+
105
+ POSIX modes without read permission, including `0o000` and `0o200`, succeed:
106
+ final verification uses a descriptor retained by the writer rather than reopening
107
+ the published file. The requested mode is not relaxed for verification.
108
+ Publication verification compares exact bigint descriptor and pathname identities,
109
+ including large file indexes that cannot be represented by a JavaScript number.
110
+ With durability enabled (the default), native publication syncs content before rename and syncs the parent directory.
111
+ Modes that retain owner read/write skip the extra mode-only file sync: after a
112
+ crash, the file may retain staged mode `0o600` instead of the wider requested mode.
113
+ Modes that remove owner read or write, and corrections of observed wider staging
114
+ permissions, keep the post-chmod file sync.
115
+ Later reads still obey OS permissions, and access checks on a pre-existing
116
+ destination are unchanged. The explicit FUSE compatibility policy still requires
117
+ a readable destination to prove matching content when rename changes its identity.
118
+
119
+ When Windows cannot report a pathname's identity, the publication verifier reopens
120
+ the name and compares that descriptor's exact identity with the original retained
121
+ file, without reading bytes. It also rechecks links and root/parent containment.
122
+ This write-specific proof does not relax ordinary reads: unknown pathname metadata
123
+ alone is never proof that the name still refers to the expected file.
124
+
125
+ ### `fs.create(rel, data, options?)`
126
+
127
+ Don't-clobber variant of `write()`. Throws `already-exists` if the target is there.
128
+ Create-only preflight preserves boundary, alias, hardlink, and type checks without
129
+ opening an existing target to inherit its mode; a fresh file uses the requested
130
+ mode or the normal new-file default. When the native binding is in use
131
+ (`require` mode, or `auto` mode with a successfully loaded binding), content is
132
+ staged privately and published with an atomic no-replace rename, so the name
133
+ never appears before its bytes. In the pure-JavaScript fallback the name is
134
+ claimed exclusively first and content is written afterward, so observers can
135
+ briefly see an empty file; failure cleanup removes a claimed file only when its
136
+ identity is unchanged.
137
+
138
+ ```ts
139
+ try {
140
+ await fs.create("config/seed.json", initial);
141
+ } catch (err) {
142
+ if (err instanceof FsSafeError && err.code !== "already-exists") throw err;
143
+ }
144
+ ```
145
+
146
+ ### `fs.writeJson(rel, value, options?)`
147
+
148
+ `JSON.stringify(value, replacer, space)` + atomic write. Adds a trailing newline by default.
149
+
150
+ ```ts
151
+ await fs.writeJson("config.json", state, { space: 2 });
152
+ await fs.writeJson("compact.json", state, { trailingNewline: false });
153
+ ```
154
+
155
+ Options:
156
+
157
+ ```ts
158
+ type RootWriteJsonOptions = RootWriteOptions & {
159
+ replacer?: (this: any, key: string, value: any) => any | (number | string)[];
160
+ space?: number | string;
161
+ trailingNewline?: boolean; // default true
162
+ };
163
+ ```
164
+
165
+ `createJson(rel, value, options?)` is the don't-clobber variant.
166
+
167
+ ### `fs.append(rel, data, options?)`
168
+
169
+ Open in append mode, write, sync the file handle, and close. Honors `mkdir` for the parent directory and syncs the parent directory when the append creates the file. `durable: false` skips both syncs. Pass `prependNewlineIfNeeded: true` to insert a `\n` if the file does not already end in one.
170
+
171
+ ```ts
172
+ await fs.append("logs/today.log", `[${ts}] ${line}\n`);
173
+ await fs.append("notes/scratch.md", "* new bullet", { prependNewlineIfNeeded: true });
174
+ ```
175
+
176
+ For high-volume logging, consider [`openWritable`](#openwritable) and a long-lived append handle. Direct append-mode writes preserve kernel append semantics, but they are not atomic against external rotators that rename or unlink the target.
177
+
178
+ ### `fs.copyIn(rel, sourceAbsPath, options?)`
179
+
180
+ Bring a file from outside the root into the root, atomically. The source path must be absolute. The library streams the source through the boundary, writes to a sibling temp, and renames over the destination.
181
+
182
+ ```ts
183
+ await fs.copyIn("inbox/upload.bin", "/tmp/incoming.bin", {
184
+ maxBytes: 64 * 1024 * 1024,
185
+ });
186
+ ```
187
+
188
+ Options are `{ denyMutations?, maxBytes?, mkdir?, mode?, sourceHardlinks? }`.
189
+ Use `sourceHardlinks: "reject"` to refuse if the source itself is a hardlinked
190
+ alias. There is no encoding option: copying preserves source bytes.
191
+
192
+ ### `fs.move(from, to, options?)`
193
+
194
+ Rename one path inside the root to another. Defaults to no clobber:
195
+
196
+ ```ts
197
+ await fs.move("incoming/foo.txt", "archive/foo.txt");
198
+ await fs.move("incoming/foo.txt", "archive/foo.txt", { overwrite: true });
199
+ ```
200
+
201
+ Both `from` and `to` are bounded; `..` in either is rejected.
202
+
203
+ ### `fs.remove(rel)`
204
+
205
+ Unlink a file or `rmdir` an empty directory. Non-empty directories throw `not-empty`. For atomic directory replacement, use [`replaceDirectoryAtomic`](atomic.md#replacedirectoryatomic).
206
+
207
+ ```ts
208
+ await fs.remove("logs/yesterday.log");
209
+ await fs.remove("snapshots/empty-dir"); // ok
210
+ await fs.remove("snapshots/full-dir"); // throws not-empty
211
+ ```
212
+
213
+ ### `fs.mkdir(rel)`
214
+
215
+ `mkdir -p`. Creates missing parents.
216
+
217
+ ```ts
218
+ await fs.mkdir("snapshots/2026/05");
219
+ ```
220
+
221
+ ### `fs.ensureRoot()`
222
+
223
+ Treats `""` / `"."` as the root itself. Useful when a generic helper computes a relative directory and might end up at the root.
224
+
225
+ ```ts
226
+ const targetRel = path.relative(fs.rootReal, candidateAbs); // could be "" if candidateAbs === root
227
+ await fs.ensureRoot(); // accepts "" without throwing
228
+ ```
229
+
230
+ ## `openWritable()` for streaming
231
+
232
+ When `write` doesn't fit (very large outputs, slow producers), open a writable handle:
233
+
234
+ ```ts
235
+ const opened = await fs.openWritable("logs/current.log", { writeMode: "append" });
236
+ try {
237
+ for await (const chunk of source) {
238
+ await opened.handle.appendFile(chunk);
239
+ }
240
+ } finally {
241
+ await opened.handle.close();
242
+ }
243
+ ```
244
+
245
+ Options are `{ denyMutations?, mkdir?, mode?, writeMode? }`, where `writeMode`
246
+ is `"replace"` (default), `"append"`, or `"update"`. `replace` truncates existing
247
+ files; `update` keeps existing contents. Streaming writes go directly to the
248
+ destination — there is no atomic-rename step. If you need both streaming and
249
+ atomicity, write to a sibling temp yourself and rename when done; the
250
+ [`atomic`](atomic.md) helpers can do this for you.
251
+
252
+ On POSIX, existing-target opens use `O_NONBLOCK` as an admission safeguard so
253
+ a no-reader FIFO cannot stall regular-file validation. This does not change
254
+ ordinary regular-file write semantics. `replace` and `update` remain write-only
255
+ opens, including for mode `0o200` files; replacement truncation happens only
256
+ after type, identity, and boundary checks pass. Rejected existing paths are
257
+ never cleanup-owned or unlinked.
258
+
259
+ ## Write defaults vs per-call options
260
+
261
+ Set `mkdir: true` once on `root()`; pass text encodings per call when needed:
262
+
263
+ ```ts
264
+ const fs = await root("/srv/workspace", {
265
+ mkdir: true,
266
+ });
267
+
268
+ await fs.write("notes/today.txt", "ascii", { encoding: "utf8" });
269
+ await fs.write("data/blob.bin", buffer); // mkdir true, no encoding because data is Buffer
270
+ await fs.write("data/blob.bin", buffer, { mkdir: false }); // override
271
+ ```
272
+
273
+ ## Errors you'll catch
274
+
275
+ | Code | When |
276
+ |---|---|
277
+ | `outside-workspace` | Target resolves outside the root. |
278
+ | `already-exists` | `create()` / `createJson()` / `move({ overwrite: false })` hit an existing target. |
279
+ | `not-found` | Parent does not exist and `mkdir` is false. |
280
+ | `not-empty` | `remove()` on a non-empty directory. |
281
+ | `not-removable` | `remove()` could not unlink/rmdir (typically permissions or device busy). |
282
+ | `path-mismatch` | Post-write fd identity check did not match. Almost always a parallel writer, or a FUSE mount with unstable inode numbers — see `renameIdentity` below. |
283
+ | `too-large` | `copyIn()` source exceeded `maxBytes`. |
284
+ | `symlink` | A path component is a symlink and policy is `reject`. |
285
+ | `hardlink` | `sourceHardlinks: "reject"` saw `nlink > 1`. |
286
+
287
+ Full list in [Errors](errors.md).
288
+
289
+ ## Common patterns
290
+
291
+ ### Replace if changed
292
+
293
+ ```ts
294
+ const next = JSON.stringify(state);
295
+ const prev = await fs.readText("state.json").catch(() => "");
296
+ if (prev !== next) await fs.write("state.json", next);
297
+ ```
298
+
299
+ ### Stage many writes, then commit
300
+
301
+ ```ts
302
+ const stagingDir = "snapshots/incoming";
303
+ await fs.mkdir(stagingDir);
304
+ for (const file of files) await fs.write(`${stagingDir}/${file.name}`, file.body);
305
+ await fs.move(stagingDir, "snapshots/2026-05-05", { overwrite: true });
306
+ ```
307
+
308
+ For a true commit-or-rollback over a *directory*, use [`replaceDirectoryAtomic`](atomic.md#replacedirectoryatomic).
309
+
310
+ ### Rotate logs
311
+
312
+ ```ts
313
+ const today = `logs/${formatDate(new Date())}.log`;
314
+ try {
315
+ await fs.create(today, "");
316
+ } catch (err) {
317
+ if (!(err instanceof FsSafeError) || err.code !== "already-exists") throw err;
318
+ }
319
+ await fs.append(today, line);
320
+ ```
321
+
322
+ ## FUSE mounts and unstable inode numbers
323
+
324
+ Some FUSE mounts — rclone is a confirmed example — assign the destination a different inode number from the source temp file as a result of rename, even within a single process with zero concurrency. Repeated stats of an unchanged destination remain stable, but the source-to-destination `(dev, ino)` comparison always fails with `path-mismatch`.
325
+
326
+ Set `renameIdentity: "verify-content-with-lock"` on the root (or per call) to use a SHA-256 content comparison under a cooperative sidecar lock instead:
327
+
328
+ ```ts
329
+ const fs = await root("/mnt/rclone-workspace", {
330
+ renameIdentity: "verify-content-with-lock",
331
+ });
332
+
333
+ await fs.write("state.json", body); // succeeds on rclone FUSE
334
+ ```
335
+
336
+ **How it works.** The full write runs under an exclusive per-target lock named `.fs-safe-write-<sha256>.lock` in the root. Keeping the lock in the already-canonical root avoids creating an unguarded lock path through a missing or raced target parent. The guarded Node fallback accepts the source-temp-to-destination inode mismatch only when the SHA-256 of the re-read bytes matches the SHA-256 of the bytes written. Subsequent path identity checks remain strict, so this mode requires an unchanged destination path to report stable identity. It deliberately stays on the guarded JavaScript path because content verification replaces the normal inode-preserving rename contract. The lock is released before the call returns.
337
+
338
+ **Security note.** `verify-content-with-lock` proves that the bytes observed after rename match the requested write and prevents *cooperating* writers from interleaving. It does **not** prove that the destination still names the temp-file object, retain fd-relative parent pinning, or stop a same-UID process that ignores the advisory lock. Do not use this option on directories writable by untrusted same-UID processes. Strict identity verification remains the default.
339
+
340
+ Lock recovery is fail-closed. If a process crashes and leaves the root-level `.fs-safe-write-<sha256>.lock`, a later write reports the stale lock instead of deleting it based on a host-local PID. Recover only under external authority that excludes every competing writer; see [File lock](sidecar-lock.md#stale-recovery-guarded-remove-if-unchanged).
341
+
342
+ ## See also
343
+
344
+ - [Atomic writes](atomic.md) — the lower-level `replaceFileAtomic` and friends.
345
+ - [JSON files](json.md) — standalone JSON helpers without going through `root()`.
346
+ - [Reading](reading.md) — companion read API.
347
+ - [Errors](errors.md) — every code, when it fires.
@@ -0,0 +1,187 @@
1
+ {
2
+ "name": "@openclaw/fs-safe",
3
+ "version": "0.8.5",
4
+ "description": "Capability-style filesystem roots for Node.js apps that handle untrusted relative paths.",
5
+ "keywords": [
6
+ "filesystem",
7
+ "openclaw",
8
+ "path-traversal",
9
+ "security",
10
+ "typescript"
11
+ ],
12
+ "homepage": "https://fs-safe.io",
13
+ "bugs": {
14
+ "url": "https://github.com/openclaw/fs-safe/issues"
15
+ },
16
+ "license": "MIT",
17
+ "author": "OpenClaw Team <dev@openclaw.ai>",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/openclaw/fs-safe.git"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public",
24
+ "provenance": true
25
+ },
26
+ "files": [
27
+ "dist/archive-parser.wasm",
28
+ "dist/**/*.js",
29
+ "dist/**/*.d.ts",
30
+ "dist/**/*.d.ts.map",
31
+ "docs/**/*.md",
32
+ "docs/assets/readme-banner.jpg",
33
+ "README.md",
34
+ "CHANGELOG.md",
35
+ "SECURITY.md",
36
+ "LICENSE"
37
+ ],
38
+ "type": "module",
39
+ "sideEffects": false,
40
+ "exports": {
41
+ ".": {
42
+ "types": "./dist/index.d.ts",
43
+ "default": "./dist/index.js"
44
+ },
45
+ "./root": {
46
+ "types": "./dist/root.d.ts",
47
+ "default": "./dist/root.js"
48
+ },
49
+ "./config": {
50
+ "types": "./dist/config.d.ts",
51
+ "default": "./dist/config.js"
52
+ },
53
+ "./path": {
54
+ "types": "./dist/path.d.ts",
55
+ "default": "./dist/path.js"
56
+ },
57
+ "./output": {
58
+ "types": "./dist/output.d.ts",
59
+ "default": "./dist/output.js"
60
+ },
61
+ "./advanced": {
62
+ "types": "./dist/advanced.d.ts",
63
+ "default": "./dist/advanced.js"
64
+ },
65
+ "./json": {
66
+ "types": "./dist/json.d.ts",
67
+ "default": "./dist/json.js"
68
+ },
69
+ "./store": {
70
+ "types": "./dist/store.d.ts",
71
+ "default": "./dist/store.js"
72
+ },
73
+ "./secret": {
74
+ "types": "./dist/secret.d.ts",
75
+ "default": "./dist/secret.js"
76
+ },
77
+ "./permissions": {
78
+ "types": "./dist/permissions-public.d.ts",
79
+ "default": "./dist/permissions-public.js"
80
+ },
81
+ "./secure-file": {
82
+ "types": "./dist/secure-file.d.ts",
83
+ "default": "./dist/secure-file.js"
84
+ },
85
+ "./file-lock": {
86
+ "types": "./dist/file-lock.d.ts",
87
+ "default": "./dist/file-lock.js"
88
+ },
89
+ "./walk": {
90
+ "types": "./dist/walk.d.ts",
91
+ "default": "./dist/walk.js"
92
+ },
93
+ "./temp": {
94
+ "types": "./dist/temp.d.ts",
95
+ "default": "./dist/temp.js"
96
+ },
97
+ "./secure-temp-root": {
98
+ "types": "./dist/secure-temp-dir.d.ts",
99
+ "default": "./dist/secure-temp-dir.js"
100
+ },
101
+ "./atomic": {
102
+ "types": "./dist/atomic.d.ts",
103
+ "default": "./dist/atomic.js"
104
+ },
105
+ "./durability": {
106
+ "types": "./dist/durability.d.ts",
107
+ "default": "./dist/durability.js"
108
+ },
109
+ "./archive": {
110
+ "types": "./dist/archive.d.ts",
111
+ "default": "./dist/archive.js"
112
+ },
113
+ "./errors": {
114
+ "types": "./dist/errors.d.ts",
115
+ "default": "./dist/errors.js"
116
+ },
117
+ "./types": {
118
+ "types": "./dist/types.d.ts",
119
+ "default": "./dist/types.js"
120
+ },
121
+ "./test-hooks": {
122
+ "types": "./dist/test-hooks.d.ts",
123
+ "default": "./dist/test-hooks.js"
124
+ },
125
+ "./package.json": "./package.json"
126
+ },
127
+ "scripts": {
128
+ "benchmark": "node scripts/benchmark.mjs",
129
+ "benchmark:publish": "pnpm build && node scripts/bench-publish.mjs",
130
+ "build": "node scripts/prepack-build.mjs",
131
+ "lint:file-size": "node scripts/check-file-size.mjs",
132
+ "lint:fs-boundary": "node scripts/check-fs-boundary-primitives.mjs",
133
+ "prepack": "node scripts/prepack-build.mjs",
134
+ "test": "vitest run",
135
+ "test:coverage": "vitest run --coverage",
136
+ "test:coverage:collect": "pnpm build && vitest run --coverage --coverage.reporter=json --coverage.thresholds.lines=0 --coverage.thresholds.functions=0 --coverage.thresholds.statements=0 --coverage.thresholds.branches=0",
137
+ "test:coverage:merge": "node scripts/merge-coverage.mjs",
138
+ "test:security": "vitest run test/fs-safe.test.ts test/read-boundary-bypass.test.ts test/write-boundary-bypass.test.ts test/additional-boundary-bypass.test.ts test/adversarial-boundary-payloads.test.ts",
139
+ "check": "pnpm lint:file-size && pnpm lint:fs-boundary && pnpm build && pnpm docs:check && pnpm test && node scripts/check-pack.mjs",
140
+ "docs:check": "node scripts/check-doc-examples.mjs",
141
+ "docs:site": "node scripts/build-docs-site.mjs",
142
+ "native:build": "pnpm --filter @openclaw/fs-safe-native-build build",
143
+ "native:test": "cargo test --workspace",
144
+ "pack:check": "pnpm build && node scripts/check-pack.mjs",
145
+ "public-api:update": "pnpm build && node scripts/check-pack.mjs --update-public-api",
146
+ "package:collect": "node scripts/check-release-packages.mjs --output release-artifacts",
147
+ "package:smoke": "node scripts/check-release-packages.mjs --allow-host-only --output release-artifacts",
148
+ "check:changed": "pnpm run check",
149
+ "release:notes": "node scripts/release-notes.mjs",
150
+ "test:changed": "pnpm run test",
151
+ "crabbox:hydrate": "crabbox actions hydrate",
152
+ "crabbox:run": "crabbox run",
153
+ "crabbox:stop": "crabbox stop",
154
+ "crabbox:warmup": "crabbox warmup",
155
+ "archive:wasm": "node scripts/build-archive-wasm.mjs",
156
+ "archive:producer-smoke": "node scripts/archive-producer-smoke.mjs"
157
+ },
158
+ "optionalDependencies": {
159
+ "@openclaw/fs-safe-darwin-arm64": "0.8.5",
160
+ "@openclaw/fs-safe-darwin-x64": "0.8.5",
161
+ "@openclaw/fs-safe-linux-arm64-gnu": "0.8.5",
162
+ "@openclaw/fs-safe-linux-arm64-musl": "0.8.5",
163
+ "@openclaw/fs-safe-linux-x64-gnu": "0.8.5",
164
+ "@openclaw/fs-safe-linux-x64-musl": "0.8.5",
165
+ "@openclaw/fs-safe-win32-x64-msvc": "0.8.5",
166
+ "jszip": "^3.10.1"
167
+ },
168
+ "devDependencies": {
169
+ "@emnapi/runtime": "2.0.0-alpha.4",
170
+ "@napi-rs/cli": "3.9.0",
171
+ "@types/node": "^26.4.1",
172
+ "@vitest/coverage-v8": "5.0.0",
173
+ "fast-check": "^4.9.0",
174
+ "istanbul-lib-coverage": "3.2.2",
175
+ "istanbul-lib-report": "3.0.1",
176
+ "istanbul-reports": "3.2.0",
177
+ "sigstore": "5.0.0",
178
+ "tar": "7.5.22",
179
+ "typescript": "^7.0.2",
180
+ "vite": "8.2.2",
181
+ "vitest": "^5.0.0"
182
+ },
183
+ "engines": {
184
+ "node": ">=22"
185
+ },
186
+ "packageManager": "pnpm@11.25.0"
187
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@openclaw/fs-safe-darwin-arm64",
3
+ "version": "0.8.5",
4
+ "description": "macOS arm64 native binding for @openclaw/fs-safe.",
5
+ "license": "MIT",
6
+ "author": "OpenClaw Team <dev@openclaw.ai>",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/openclaw/fs-safe.git",
10
+ "directory": "packages/darwin-arm64"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "provenance": true
15
+ },
16
+ "os": [
17
+ "darwin"
18
+ ],
19
+ "cpu": [
20
+ "arm64"
21
+ ],
22
+ "main": "fs-safe-native.node",
23
+ "files": [
24
+ "fs-safe-native.node"
25
+ ],
26
+ "engines": {
27
+ "node": ">=22"
28
+ }
29
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@openclaw/fs-safe-darwin-x64",
3
+ "version": "0.8.5",
4
+ "description": "macOS x64 native binding for @openclaw/fs-safe.",
5
+ "license": "MIT",
6
+ "author": "OpenClaw Team <dev@openclaw.ai>",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/openclaw/fs-safe.git",
10
+ "directory": "packages/darwin-x64"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "provenance": true
15
+ },
16
+ "os": [
17
+ "darwin"
18
+ ],
19
+ "cpu": [
20
+ "x64"
21
+ ],
22
+ "main": "fs-safe-native.node",
23
+ "files": [
24
+ "fs-safe-native.node"
25
+ ],
26
+ "engines": {
27
+ "node": ">=22"
28
+ }
29
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@openclaw/fs-safe-linux-arm64-gnu",
3
+ "version": "0.8.5",
4
+ "description": "Linux arm64 glibc native binding for @openclaw/fs-safe.",
5
+ "license": "MIT",
6
+ "author": "OpenClaw Team <dev@openclaw.ai>",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/openclaw/fs-safe.git",
10
+ "directory": "packages/linux-arm64-gnu"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "provenance": true
15
+ },
16
+ "os": [
17
+ "linux"
18
+ ],
19
+ "cpu": [
20
+ "arm64"
21
+ ],
22
+ "libc": [
23
+ "glibc"
24
+ ],
25
+ "main": "fs-safe-native.node",
26
+ "files": [
27
+ "fs-safe-native.node"
28
+ ],
29
+ "engines": {
30
+ "node": ">=22"
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@openclaw/fs-safe-linux-arm64-musl",
3
+ "version": "0.8.5",
4
+ "description": "Linux arm64 musl native binding for @openclaw/fs-safe.",
5
+ "license": "MIT",
6
+ "author": "OpenClaw Team <dev@openclaw.ai>",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/openclaw/fs-safe.git",
10
+ "directory": "packages/linux-arm64-musl"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "provenance": true
15
+ },
16
+ "os": [
17
+ "linux"
18
+ ],
19
+ "cpu": [
20
+ "arm64"
21
+ ],
22
+ "libc": [
23
+ "musl"
24
+ ],
25
+ "main": "fs-safe-native.node",
26
+ "files": [
27
+ "fs-safe-native.node"
28
+ ],
29
+ "engines": {
30
+ "node": ">=22"
31
+ }
32
+ }