@openclaw/openshell-sandbox 2026.9.2 → 2026.9.4

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 (711) 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/openclaw.plugin.json +1 -0
  706. package/package.json +7 -4
  707. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/index.d.ts +0 -0
  708. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/index.js +0 -0
  709. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/license +0 -0
  710. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/package.json +0 -0
  711. /package/node_modules/{p-limit/node_modules/yocto-queue → yocto-queue}/readme.md +0 -0
@@ -0,0 +1,141 @@
1
+ # Local roots
2
+
3
+ The local-roots helpers accept a file path plus a list of trusted absolute
4
+ directories and return the first canonical root that contains the file. Use
5
+ them when configuration may name one of several approved media, cache, or
6
+ workspace roots.
7
+
8
+ ```ts
9
+ import {
10
+ readLocalFileFromRoots,
11
+ resolveLocalPathFromRootsSync,
12
+ } from "@openclaw/fs-safe/advanced";
13
+ ```
14
+
15
+ ## Input shape
16
+
17
+ Both helpers take one options object. `filePath` may be absolute, home-relative,
18
+ relative to the current working directory, or a local `file://` URL. Relative
19
+ inputs are resolved exactly as Node resolves them; they are not searched as a
20
+ basename under each root.
21
+
22
+ ```ts
23
+ type LocalRootsInputOptions = {
24
+ filePath: string;
25
+ roots: readonly string[]; // trusted absolute paths, checked in order
26
+ label?: string; // used in validation errors
27
+ };
28
+ ```
29
+
30
+ Roots may use `~` or local `file://` spellings, but each resolved root must be
31
+ absolute. Existing root symlinks are canonicalized before containment is
32
+ checked. Invalid root entries throw `FsSafeError("invalid-path")`; an invalid
33
+ `file://` input throws `Error`. A path that is valid but does not fall inside
34
+ any usable root returns `null`.
35
+
36
+ ## `resolveLocalPathFromRootsSync(options)`
37
+
38
+ ```ts
39
+ type ResolveLocalPathFromRootsSyncOptions = LocalRootsInputOptions & {
40
+ allowMissing?: boolean; // default false
41
+ requireFile?: boolean; // default false
42
+ };
43
+
44
+ type LocalRootsPathResult = {
45
+ path: string; // canonical candidate path
46
+ root: string; // canonical containing root
47
+ };
48
+ ```
49
+
50
+ For an existing upload:
51
+
52
+ ```ts
53
+ import { resolveLocalPathFromRootsSync } from "@openclaw/fs-safe/advanced";
54
+
55
+ const r = resolveLocalPathFromRootsSync({
56
+ filePath: "/srv/uploads/photo.jpg",
57
+ roots: ["/srv/uploads", "/srv/cache"],
58
+ requireFile: true,
59
+ });
60
+
61
+ if (!r) throw new Error("photo is outside the configured roots");
62
+ console.log(r.path); // canonical path to photo.jpg
63
+ console.log(r.root); // canonical /srv/uploads
64
+ ```
65
+
66
+ By default the candidate must exist. `allowMissing: true` instead canonicalizes
67
+ the nearest existing ancestor and validates the missing tail, which is useful
68
+ when selecting a future output location. `requireFile: true` rejects existing
69
+ directories and other non-file leaves. A missing suffix begins only at a
70
+ component that does not exist: dangling symlinks, descendants of dangling
71
+ symlinks, and candidates whose existing ancestors cannot be canonicalized are
72
+ rejected rather than treated as safe missing paths.
73
+
74
+ ## `readLocalFileFromRoots(options)`
75
+
76
+ The asynchronous helper opens the candidate through the matched [`Root`](root.md),
77
+ so no-follow, identity, hardlink, device-path, and byte-limit checks happen at
78
+ the read itself.
79
+
80
+ ```ts
81
+ type ReadLocalFileFromRootsOptions = LocalRootsInputOptions & {
82
+ hardlinks?: "reject" | "allow";
83
+ maxBytes?: number;
84
+ nonBlockingRead?: boolean;
85
+ symlinks?: "reject" | "follow-within-root";
86
+ };
87
+
88
+ type LocalRootsReadResult = ReadResult & {
89
+ root: string; // canonical containing root
90
+ };
91
+ ```
92
+
93
+ ```ts
94
+ const r = await readLocalFileFromRoots({
95
+ filePath: "/srv/uploads/photo.jpg",
96
+ roots: ["/srv/uploads", "/srv/cache"],
97
+ maxBytes: 8 * 1024 * 1024,
98
+ });
99
+ if (!r) throw new Error("photo is missing, unreadable, or outside the roots");
100
+ process.stdout.write(r.buffer);
101
+ ```
102
+
103
+ The helper returns `null` when no configured root can be opened or no safe read
104
+ succeeds. This intentionally collapses missing, outside-root, and per-root read
105
+ failures; use a single `Root` directly when the caller must distinguish those
106
+ outcomes. Omitting `maxBytes` preserves `Root`'s 16 MiB default.
107
+
108
+ ## File URL and Windows-path companions
109
+
110
+ The advanced surface also exports the normalization helpers used around this
111
+ API:
112
+
113
+ ```ts
114
+ import {
115
+ assertNoWindowsNetworkPath,
116
+ basenameFromMediaSource,
117
+ hasEncodedFileUrlSeparator,
118
+ isWindowsDriveLetterPath,
119
+ isWindowsNetworkPath,
120
+ safeFileURLToPath,
121
+ trySafeFileURLToPath,
122
+ } from "@openclaw/fs-safe/advanced";
123
+ ```
124
+
125
+ - `safeFileURLToPath(fileUrl)` parses a local file URL and refuses remote hosts
126
+ or paths that decode to Windows network paths.
127
+ - `trySafeFileURLToPath(fileUrl)` returns `undefined` instead of throwing.
128
+ - `isWindowsDriveLetterPath()` and `isWindowsNetworkPath()` classify Windows
129
+ absolute and network spellings.
130
+ - `assertNoWindowsNetworkPath()` throws for a network path on Windows.
131
+ - `basenameFromMediaSource()` extracts a best-effort filename from a URL, data
132
+ URI, or path.
133
+ - `hasEncodedFileUrlSeparator()` detects percent-encoded slash or backslash
134
+ spellings.
135
+
136
+ ## See also
137
+
138
+ - [`root()`](root.md) — use when one trusted root should preserve individual
139
+ failure codes.
140
+ - [Path helpers](path.md) — lexical and canonical containment primitives.
141
+ - [`pathScope()`](path-scope.md) — result-shaped single-root validation.
@@ -0,0 +1,196 @@
1
+ ---
2
+ title: Migrating to 0.5
3
+ description: "Ordered checklist for moving a 0.4 consumer from the Python helper to native mode and adopting the 0.5 API contracts."
4
+ ---
5
+
6
+ # Migrating from 0.4 to 0.5
7
+
8
+ Use this checklist from top to bottom. Version 0.5 replaces the Python worker,
9
+ changes the default archive mode policy, and adds explicit contracts for
10
+ publication, walking, locks, secrets, and native-only features. Nothing in this
11
+ guide requires a Rust toolchain: all supported native binaries are prebuilt.
12
+ Current releases install the matching exact-version optional platform package.
13
+
14
+ ## 1. Update the package and runtime
15
+
16
+ - Run on Node.js 22 or newer.
17
+ - Update `@openclaw/fs-safe` and regenerate every lock or shrinkwrap file your
18
+ deployment consumes.
19
+ - Keep optional dependencies enabled if you want JavaScript ZIP/TAR support.
20
+ Native loading no longer depends on Python. Keep optional dependencies enabled
21
+ for the matching native package and JavaScript ZIP/TAR decoders. An install
22
+ that omits them can still import fs-safe, but native-only features and missing
23
+ JS archive decoders fail with actionable errors.
24
+
25
+ If you call `resolveRootPath()` or `resolveRootPathSync()` directly, upgrade to
26
+ 0.5: versions through 0.4.7 could approve an in-root symlink traversal that
27
+ resolved outside the root. `root()` handles were not affected. See the
28
+ [affected versions and exposure](security-model.md#affected-versions-exposure).
29
+
30
+ ## 2. Replace Python helper configuration
31
+
32
+ Change startup configuration before the first filesystem operation:
33
+
34
+ ```ts
35
+ import { configureFsSafeNative } from "@openclaw/fs-safe/config";
36
+
37
+ configureFsSafeNative({ mode: "auto" });
38
+ ```
39
+
40
+ | Remove from 0.4 | Use in 0.5 |
41
+ |---|---|
42
+ | `configureFsSafePython({ mode })` | `configureFsSafeNative({ mode })` |
43
+ | `FS_SAFE_PYTHON_MODE` | `FS_SAFE_NATIVE_MODE` |
44
+ | `OPENCLAW_FS_SAFE_PYTHON_MODE` | `OPENCLAW_FS_SAFE_NATIVE_MODE` |
45
+ | `pythonPath`, `FS_SAFE_PYTHON`, pinned-Python aliases | Nothing; prebuilt native binaries do not use an interpreter |
46
+
47
+ The old names warn once and map `auto`, `off`, or `require` so a shipped 0.4
48
+ deployment does not silently change policy. Interpreter paths are ignored and
49
+ Python is never spawned. Treat that warning as an upgrade diagnostic, not as a
50
+ second supported helper path.
51
+
52
+ Choose the production mode deliberately:
53
+
54
+ - `auto` keeps guarded JavaScript fallbacks when a binding is unavailable.
55
+ - `off` makes fallback testing deterministic.
56
+ - `require` fails with `helper-unavailable` instead of weakening an operation
57
+ that expected native support.
58
+
59
+ See [Native helper policy](native-helper.md) and
60
+ [Native architecture](native.md).
61
+
62
+ ## 3. Audit every archive call
63
+
64
+ The 0.5 default is `entryModes: "clamp"`. Directories become `0o755`; files
65
+ become `0o644` or `0o755` when owner-execute was archived. Set
66
+ `entryModes: "preserve"` explicitly only if your 0.4 consumer intentionally
67
+ relied on archived rwx bits. Setuid, setgid, sticky bits, and archived ownership
68
+ are never restored.
69
+
70
+ ```ts
71
+ await extractArchive({
72
+ archivePath: uploadPath,
73
+ destDir: restoreRoot,
74
+ timeoutMs: 30_000,
75
+ entryModes: "clamp",
76
+ entryFilter: (entry) =>
77
+ entry.path.startsWith("snapshot/cache/") ? "skip" : "extract",
78
+ onFiltered: "skip-entry",
79
+ limits: {
80
+ maxArchiveBytes: 256 * 1024 * 1024,
81
+ maxEntries: 50_000,
82
+ maxExtractedBytes: 512 * 1024 * 1024,
83
+ maxEntryBytes: 256 * 1024 * 1024,
84
+ maxMetaEntryBytes: 1024 * 1024,
85
+ maxEntryPathComponents: 64,
86
+ },
87
+ });
88
+ ```
89
+
90
+ Returning `"skip"` rejects the archive unless `onFiltered: "skip-entry"` is
91
+ explicit. Zstd and bzip2 TAR are native-only; ZIP, TAR, and gzip retain guarded
92
+ JavaScript implementations. Catch `ArchiveLimitError` by its code, including
93
+ `archive-entry-path-components-exceeds-limit` for deep implicit-directory
94
+ attacks. See [Archive extraction](archive.md).
95
+
96
+ ## 4. Pick a publication failure policy
97
+
98
+ `publishFileExclusive()` never replaces an existing target. Choose a strategy
99
+ and decide what a post-create directory-sync failure means to your application:
100
+
101
+ ```ts
102
+ await publishFileExclusive({
103
+ sourcePath: stagedArchive,
104
+ targetPath: finalArchive,
105
+ strategy: "link-or-copy",
106
+ onSyncFailure: "preserve",
107
+ });
108
+ ```
109
+
110
+ `rollback` is the default: an unchanged target created by this call is removed
111
+ when directory sync throws. `preserve` keeps a complete but possibly
112
+ non-durable target and reports `cleanup: "preserved"` plus
113
+ `directorySync: { status: "failed", code? }` in the typed error. Backup
114
+ archives commonly need `preserve`; transactional protocols that expose only
115
+ durably committed names usually want `rollback`. See
116
+ [Directory durability](durability.md).
117
+
118
+ ## 5. Replace recursive scans with an explicit walk policy
119
+
120
+ Use `Root.walk()` for caller-controlled relative paths. Every examined entry
121
+ consumes the budget even when filtered:
122
+
123
+ ```ts
124
+ for await (const entry of workspace.walk("memory", {
125
+ maxDepth: 12,
126
+ maxEntries: 50_000,
127
+ symlinkPolicy: "skip",
128
+ entryFilter: (entry) =>
129
+ entry.kind === "directory" && entry.relativePath.endsWith("/.git")
130
+ ? "skip-subtree"
131
+ : "include",
132
+ onDirectoryError: "skip-and-report",
133
+ })) {
134
+ if (entry.kind === "directory-error") {
135
+ reportIncompleteSubtree(entry.relativePath, entry.error);
136
+ continue;
137
+ }
138
+ indexEntry(entry);
139
+ }
140
+ ```
141
+
142
+ The default directory-error policy remains `throw`. See
143
+ [Directory walking](walk.md).
144
+
145
+ ## 6. Adopt the focused concurrency and secret APIs
146
+
147
+ - Use `acquireFileLockSync()` only in synchronous boot or migration code; retry
148
+ waits block the thread. Request-serving paths should use `withFileLock()`.
149
+ - Remove the `allowReentrant` boolean from async file-lock options. If a logical
150
+ holder intentionally nests acquisition, pass the same operation-scoped
151
+ `reentrantOwner` string to each acquisition; different or missing owners
152
+ contend normally. Never replace the boolean with a process-wide constant.
153
+ Locked and unlocked `jsonStore` mutations serialize by canonical file path
154
+ and do not opt into lock reentrancy; nested same-file mutations from an update
155
+ callback fail with `store-reentrant-update`, so return the complete value from
156
+ the outer callback instead.
157
+ - Use `createSecretFileAtomic()` for first-writer-wins credentials and catch
158
+ `secret-exists`; use `writeSecretFileAtomic()` only when replacement is the
159
+ intended protocol.
160
+ - Async `readSecretFile()` is strict; `tryReadSecretFile()` returns `undefined`
161
+ only for missing or blank content and still rejects suspicious files.
162
+ - Check `tempWorkspace.cleanup()` results when ownership matters;
163
+ `identity-mismatch` deliberately preserves a replacement path.
164
+
165
+ See [File locks](sidecar-lock.md), [Secret files](secret-file.md), and
166
+ [Temp workspaces](temp.md).
167
+
168
+ ## 7. Gate native-only features
169
+
170
+ `createPrivateDirectory()` is Windows-only and native-only because a pathname
171
+ fallback cannot promise the same creation-time DACL. Zstd/bzip2 extraction and
172
+ `strategy: "rename-noreplace"` are also native-only. Test the unavailable path
173
+ instead of assuming installation always succeeds.
174
+
175
+ ## 8. Run both behavior families in CI
176
+
177
+ For each consumer workflow that matters:
178
+
179
+ 1. Run once with `FS_SAFE_NATIVE_MODE=auto` on every supported OS.
180
+ 2. Run once with `FS_SAFE_NATIVE_MODE=off` to prove the JavaScript fallback.
181
+ 3. Run native-required or native-only cases with `FS_SAFE_NATIVE_MODE=require`.
182
+ 4. Exercise archive traversal/link/depth limits, publication sync failure, and
183
+ partial-walk reporting with production-shaped fixtures.
184
+
185
+ For downstream staging and backup consumers:
186
+
187
+ - [ ] Replace private whole-file hashing with `sha256File(path | FileHandle)`
188
+ from `durability`; native mode keeps digest work off the event loop and
189
+ the JavaScript fallback remains streaming.
190
+ - [ ] If Windows trust policy depends on exact principals, consume
191
+ `readOwnerAndDacl()` from `permissions`, reject incomplete/null/remote
192
+ descriptors as your policy requires, skip inherit-only ACEs where
193
+ appropriate, and apply the application's own SID allowlist.
194
+
195
+ The [Testing](testing.md) page documents the test hooks and mode setup used by
196
+ fs-safe itself.
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: Migrating to 0.6
3
+ description: "Upgrade checklist for the platform-native package split."
4
+ ---
5
+
6
+ # Migrating from 0.5 to 0.6
7
+
8
+ Version 0.6 moves native bindings out of the root `@openclaw/fs-safe` tarball
9
+ and into exact-version platform packages. This removes unrelated operating
10
+ system and architecture binaries from each installation.
11
+
12
+ ## Keep optional dependencies enabled for native mode
13
+
14
+ Package managers select one binding by OS, CPU, and Linux libc. A normal
15
+ install needs no command change:
16
+
17
+ ```bash
18
+ pnpm add @openclaw/fs-safe
19
+ ```
20
+
21
+ If a deployment currently installs 0.5 with `--omit=optional`, `--no-optional`,
22
+ or an equivalent lockfile policy, change that policy before upgrading when it
23
+ uses native mode `require` or any native-only feature. Version 0.5 kept its
24
+ binding in the root tarball; version 0.6 intentionally does not.
25
+
26
+ Omitting optional dependencies remains supported for fallback-capable APIs in
27
+ `auto` mode. It disables native-only features such as zstd/bzip2 TAR handling,
28
+ retained-directory staging, atomic `rename-noreplace`, and Windows private
29
+ directory creation. Native mode `require` reports `helper-unavailable` when the
30
+ matching package is absent or incompatible.
31
+
32
+ ## Deployment checklist
33
+
34
+ 1. Remove any option or policy that omits optional dependencies when native
35
+ support is required.
36
+ 2. Regenerate every lockfile or shrinkwrap file consumed by deployment.
37
+ 3. Verify that the lock contains the matching `@openclaw/fs-safe-*` package.
38
+ 4. Run a native-required operation on every deployed OS/libc target.
39
+ 5. Keep an `FS_SAFE_NATIVE_MODE=off` lane when the guarded JavaScript fallback
40
+ is part of the application contract.
41
+
42
+ No Rust toolchain, postinstall build, or runtime download is introduced. See
43
+ [Native helper policy](native-helper.md) for the exact fallback boundary.
@@ -0,0 +1,118 @@
1
+ ---
2
+ title: Native helper policy
3
+ description: "How fs-safe loads its platform-specific native filesystem primitives and how auto, require, and off affect guarded fallbacks."
4
+ ---
5
+
6
+ # Native helper policy
7
+
8
+ `@openclaw/fs-safe` declares seven exact-version optional packages for Linux
9
+ x64/arm64 (glibc or musl), macOS x64/arm64, and Windows x64. Package-manager
10
+ OS, CPU, and libc filters install only the matching package. The loader requires
11
+ that package lazily, without runtime downloads, postinstall scripts, or a
12
+ consumer Rust build.
13
+
14
+ ```ts
15
+ import { configureFsSafeNative } from "@openclaw/fs-safe/config";
16
+
17
+ configureFsSafeNative({ mode: "auto" }); // default
18
+ configureFsSafeNative({ mode: "off" }); // guarded JavaScript only
19
+ configureFsSafeNative({ mode: "require" }); // fail closed when the binding is unavailable
20
+ ```
21
+
22
+ The equivalent environment variables are `FS_SAFE_NATIVE_MODE` and `OPENCLAW_FS_SAFE_NATIVE_MODE`. Accepted values are `auto`, `off`, `require`, `true`, `false`, `on`, `never`, `required`, `1`, and `0`.
23
+
24
+ ## Modes
25
+
26
+ | Mode | Behavior |
27
+ |---|---|
28
+ | `auto` | Prefer native primitives when the current platform package loads; otherwise silently use the guarded JavaScript path. |
29
+ | `off` | Do not load a native package. Use the guarded JavaScript path deterministically. |
30
+ | `require` | Throw `FsSafeError("helper-unavailable")` instead of falling back when an operation needs the native binding and it cannot load. |
31
+
32
+ TAR/gzip in the guarded JavaScript path uses a bundled, import-free WASM build
33
+ of the same Rust parser used by native. `off` still disables native filesystem
34
+ code; it does not disable this portable parser. ZIP fallback still requires
35
+ optional `jszip`, and zstd/bzip2 remain native-only.
36
+
37
+ Configure the mode once during startup. Loading is lazy and cached; changing from `auto` to `require` after a failed load changes failure policy but does not repeatedly probe the binary.
38
+
39
+ [`tempWorkspace()` and its scoped/sync variants](temp.md#private-temp-workspaces)
40
+ remain available in every mode. Their default compatible cleanup uses guarded
41
+ JavaScript quarantine when owned native tree removal is unavailable.
42
+ `cleanupSafety: "require-bounded"` instead rejects before child creation unless
43
+ no-replace quarantine plus descriptor-relative owned-tree removal are available.
44
+ On Linux, admission probes the exact `openat2` child-directory flags, including
45
+ `RESOLVE_NO_XDEV`, at runtime. An unavailable or denied probe selects compatible
46
+ JavaScript cleanup even in global `require` mode; `require-bounded` rejects before
47
+ child creation.
48
+ Already-created strict workspaces retain their binding
49
+ and descriptors across later mode changes.
50
+
51
+ [`stageFileInDirectory()`](staged-file.md) always requires native support on
52
+ Linux/macOS and rejects before creation when off, unavailable, or missing the
53
+ required capability. Windows is unsupported for this lifecycle. This does not
54
+ change the mode policy of existing fallback-capable APIs.
55
+
56
+ ## Native boundary
57
+
58
+ The native layer exposes policy-free filesystem mechanisms: beneath-root
59
+ open/mkdir/link, replace and no-replace rename, identity reads, archive decode/execution,
60
+ clone/copy/hash workers, and Windows security descriptor calls. The TypeScript
61
+ layer owns policy, retries, filters, budgets, modes, cleanup, error
62
+ normalization, and the decision to fall back.
63
+
64
+ - Linux uses `openat2` with `RESOLVE_BENEATH | RESOLVE_NO_MAGICLINKS`, `renameat`, and `renameat2(RENAME_NOREPLACE)`. Owned-tree cleanup enumerates and unlinks through retained directory descriptors and rejects device crossings.
65
+ - macOS 15.4 and newer prefer `O_RESOLVE_BENEATH`; older kernels resolve components with `O_NOFOLLOW` and restart in-root symlinks from the pinned root descriptor. Both routes use an `F_GETPATH` post-open escape detector and report `best-effort` because directory rename races are not atomic with that check. Publication uses `renameat` for replacement and `renameatx_np(RENAME_EXCL)` for no-replace; owned-tree cleanup uses descriptor-relative `openat`/`unlinkat`.
66
+ - Windows uses handle-relative `NtCreateFile`, rejects reparse points during root-bounded traversal, uses `FileRenameInfoEx` with replacement selected explicitly by the TypeScript policy layer, and deletes owned trees through exact opened handles with `FileDispositionInfoEx`; symlink/reparse entries in owned trees are removed as leaves and never traversed.
67
+
68
+ Native primitives back create-only and replacing pinned writes, async sidecar creation,
69
+ guarded publication, archive acceleration, and direct Windows ACL operations.
70
+ Equivalent JavaScript paths remain available for documented fallback-capable
71
+ features. See [Native architecture](native.md#javascript-fallback-guarantees-and-delta)
72
+ for the exact difference.
73
+
74
+ The guarded JavaScript mutation path is detection-based, not containment-atomic.
75
+ If a same-privilege peer can replace a writable parent after its identity guard
76
+ but before Node resolves a pathname mutation, the mutation can land outside the
77
+ intended root before the post-operation guard throws. Select `require` rather
78
+ than `auto` or `off` when that concurrent attacker is part of the threat model.
79
+
80
+ `openBeneath()` returns `{ fd, containment }`. `containment` is
81
+ `"kernel-atomic"` for Linux `openat2` and `"best-effort"` for macOS and
82
+ Windows. Public JavaScript root open/read/writable results also expose the
83
+ field and report `"best-effort"`; the label reports mechanism, not policy.
84
+
85
+ ## Migration from the Python helper
86
+
87
+ Version 0.5 removes the Python worker and interpreter-path selection. The mode
88
+ contract is unchanged, so migrate startup configuration directly:
89
+
90
+ | Python helper configuration | Native replacement |
91
+ |---|---|
92
+ | `configureFsSafePython({ mode: "auto" })` | `configureFsSafeNative({ mode: "auto" })` |
93
+ | `configureFsSafePython({ mode: "off" })` | `configureFsSafeNative({ mode: "off" })` |
94
+ | `configureFsSafePython({ mode: "require" })` | `configureFsSafeNative({ mode: "require" })` |
95
+ | `FS_SAFE_PYTHON_MODE` | `FS_SAFE_NATIVE_MODE` |
96
+ | `OPENCLAW_FS_SAFE_PYTHON_MODE` | `OPENCLAW_FS_SAFE_NATIVE_MODE` |
97
+ | `pythonPath`, `FS_SAFE_PYTHON`, and the OpenClaw interpreter-path aliases | Remove; prebuilt bindings do not use an interpreter path |
98
+
99
+ In 0.5, `configureFsSafePython` and the legacy Python environment names
100
+ remain only as an upgrade bridge. On the first config read they emit one
101
+ `DeprecationWarning` with code `FS_SAFE_PYTHON_DEPRECATED`, state the mapped
102
+ native mode, and then apply that mode. A legacy interpreter path without an
103
+ explicit mode maps to `auto` and the path itself is ignored. Native config has
104
+ the normal precedence over legacy environment config.
105
+
106
+ There is no silent alias and no Python execution fallback. The bridge exists
107
+ only to make shipped 0.4 configuration visible and predictable while the
108
+ consumer performs its 0.5 upgrade.
109
+
110
+ ## Related pages
111
+
112
+ - [Config](config.md)
113
+ - [Security model](security-model.md)
114
+ - [Writing](writing.md)
115
+ - [File locks](sidecar-lock.md)
116
+ - [Durability](durability.md)
117
+ - [Migrating to 0.5](migrating-to-0.5.md)
118
+ - [Migrating to 0.6](migrating-to-0.6.md)