@openclaw/signal 2026.9.4 → 2026.9.6

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 (1331) hide show
  1. package/assets/activity.svg +40 -0
  2. package/assets/icon.png +0 -0
  3. package/dist/{accounts-DO4HMqaK.js → .setup/accounts-BV6tDOTc.mjs} +20 -5
  4. package/dist/.setup/api-B9-B1L7Q.mjs +17 -0
  5. package/dist/.setup/api-CGh4eWR8.mjs +12 -0
  6. package/dist/{approval-auth-pNCKKotV.js → .setup/approval-auth-BBI9BTRm.mjs} +3 -3
  7. package/dist/{approval-handler.runtime-DCPJkIqo.js → .setup/approval-handler.runtime-C3vN5OWd.mjs} +11 -11
  8. package/dist/{approval-reactions-CjhdkJ8P.js → .setup/approval-reactions-DDQvPP_z.mjs} +14 -14
  9. package/dist/{channel-CyQvEuyA.js → .setup/channel-DhzTcFsK.mjs} +56 -33
  10. package/dist/{channel.runtime--koF_1H0.js → .setup/channel.runtime-CG79z_Vy.mjs} +3 -3
  11. package/dist/{client-B3C0ciqU.js → .setup/client-BseAt7F7.mjs} +311 -41
  12. package/dist/{client-adapter-CNc5wzzs.js → .setup/client-adapter-dvFa47YL.mjs} +1 -1
  13. package/dist/{config-schema-DfEbpMVQ.js → .setup/config-schema-aQwwMGUj.mjs} +19 -3
  14. package/dist/{doctor-contract-api-D0SnglP4.js → .setup/doctor-contract-api-Rbq_sRTI.mjs} +79 -15
  15. package/dist/{install-signal-cli-QlEIfWBv.js → .setup/install-signal-cli-BDbzFcU2.mjs} +30 -61
  16. package/dist/{monitor-BiNWxMB3.js → .setup/monitor-Dnz6Ygz5.mjs} +39 -26
  17. package/dist/{probe-kOJqyjWz.js → .setup/probe-DXT2eLnw.mjs} +3 -3
  18. package/dist/{question-reactions-BFR9Mf-O.js → .setup/question-reactions-C8cSEjVf.mjs} +3 -3
  19. package/dist/{reaction-runtime-api-CWqDv5-q.js → .setup/reaction-runtime-api-BnQGHcrB.mjs} +6 -5
  20. package/dist/{rpc-context-dXSy4NtF.js → .setup/rpc-context-CwwADZ1b.mjs} +1 -1
  21. package/dist/{send-Bz0x0JC1.js → .setup/send-B78M_eFp.mjs} +7 -6
  22. package/dist/{send.runtime-CeV1p7Sq.js → .setup/send.runtime-CLnCWvrM.mjs} +1 -1
  23. package/dist/{transport-detection-Do2pYMAH.js → .setup/transport-detection-CoiRl7Gx.mjs} +60 -26
  24. package/dist/{transport-detection.runtime-QasZp3BE.js → .setup/transport-detection.runtime-Tlhuv3T_.mjs} +1 -1
  25. package/dist/{transport-policy-DxvSMHp9.js → .setup/transport-policy-5VSnj5ma.mjs} +2 -33
  26. package/dist/.setup/transport-probes.runtime-WprAyBbL.mjs +2 -0
  27. package/dist/.setup/transport-url-CAC0JcuI.mjs +55 -0
  28. package/dist/api.js +11 -16
  29. package/dist/channel-config-api.js +1 -1
  30. package/dist/channel-plugin-api.js +1 -1
  31. package/dist/contract-api.js +4 -4
  32. package/dist/doctor-contract-api.js +1 -1
  33. package/dist/reaction-runtime-api.js +1 -1
  34. package/dist/runtime-api.js +9 -9
  35. package/dist/setup-entry.js +2 -1
  36. package/node_modules/@openclaw/fs-safe/CHANGELOG.md +1187 -0
  37. package/node_modules/@openclaw/fs-safe/LICENSE +22 -0
  38. package/node_modules/@openclaw/fs-safe/README.md +654 -0
  39. package/node_modules/@openclaw/fs-safe/SECURITY.md +45 -0
  40. package/node_modules/@openclaw/fs-safe/dist/absolute-path.d.ts +32 -0
  41. package/node_modules/@openclaw/fs-safe/dist/absolute-path.js +323 -0
  42. package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts +36 -0
  43. package/node_modules/@openclaw/fs-safe/dist/advanced.js +38 -0
  44. package/node_modules/@openclaw/fs-safe/dist/archive-crc32.d.ts +1 -0
  45. package/node_modules/@openclaw/fs-safe/dist/archive-crc32.js +19 -0
  46. package/node_modules/@openclaw/fs-safe/dist/archive-deadline.d.ts +11 -0
  47. package/node_modules/@openclaw/fs-safe/dist/archive-deadline.js +101 -0
  48. package/node_modules/@openclaw/fs-safe/dist/archive-durability.d.ts +23 -0
  49. package/node_modules/@openclaw/fs-safe/dist/archive-durability.js +180 -0
  50. package/node_modules/@openclaw/fs-safe/dist/archive-entry.d.ts +13 -0
  51. package/node_modules/@openclaw/fs-safe/dist/archive-entry.js +85 -0
  52. package/node_modules/@openclaw/fs-safe/dist/archive-errors.d.ts +12 -0
  53. package/node_modules/@openclaw/fs-safe/dist/archive-errors.js +23 -0
  54. package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.d.ts +20 -0
  55. package/node_modules/@openclaw/fs-safe/dist/archive-gzip-tail.js +99 -0
  56. package/node_modules/@openclaw/fs-safe/dist/archive-input.d.ts +18 -0
  57. package/node_modules/@openclaw/fs-safe/dist/archive-input.js +98 -0
  58. package/node_modules/@openclaw/fs-safe/dist/archive-kind.d.ts +7 -0
  59. package/node_modules/@openclaw/fs-safe/dist/archive-kind.js +71 -0
  60. package/node_modules/@openclaw/fs-safe/dist/archive-limits.d.ts +56 -0
  61. package/node_modules/@openclaw/fs-safe/dist/archive-limits.js +131 -0
  62. package/node_modules/@openclaw/fs-safe/dist/archive-merge.d.ts +22 -0
  63. package/node_modules/@openclaw/fs-safe/dist/archive-merge.js +283 -0
  64. package/node_modules/@openclaw/fs-safe/dist/archive-parser-errors.d.ts +1 -0
  65. package/node_modules/@openclaw/fs-safe/dist/archive-parser-errors.js +12 -0
  66. package/node_modules/@openclaw/fs-safe/dist/archive-parser.wasm +0 -0
  67. package/node_modules/@openclaw/fs-safe/dist/archive-plan.d.ts +90 -0
  68. package/node_modules/@openclaw/fs-safe/dist/archive-plan.js +119 -0
  69. package/node_modules/@openclaw/fs-safe/dist/archive-read.d.ts +5 -0
  70. package/node_modules/@openclaw/fs-safe/dist/archive-read.js +243 -0
  71. package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts +33 -0
  72. package/node_modules/@openclaw/fs-safe/dist/archive-staging.js +308 -0
  73. package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.d.ts +27 -0
  74. package/node_modules/@openclaw/fs-safe/dist/archive-tar-stream.js +127 -0
  75. package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.d.ts +29 -0
  76. package/node_modules/@openclaw/fs-safe/dist/archive-tar-wasm.js +203 -0
  77. package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.d.ts +7 -0
  78. package/node_modules/@openclaw/fs-safe/dist/archive-zip-admission.js +96 -0
  79. package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.d.ts +1 -0
  80. package/node_modules/@openclaw/fs-safe/dist/archive-zip-count.js +160 -0
  81. package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.d.ts +21 -0
  82. package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.js +263 -0
  83. package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.d.ts +24 -0
  84. package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.js +42 -0
  85. package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.d.ts +4 -0
  86. package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.js +40 -0
  87. package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.d.ts +8 -0
  88. package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.js +147 -0
  89. package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.d.ts +4 -0
  90. package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.js +22 -0
  91. package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.d.ts +17 -0
  92. package/node_modules/@openclaw/fs-safe/dist/archive-zip-names.js +149 -0
  93. package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts +5 -0
  94. package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.js +13 -0
  95. package/node_modules/@openclaw/fs-safe/dist/archive.d.ts +17 -0
  96. package/node_modules/@openclaw/fs-safe/dist/archive.js +329 -0
  97. package/node_modules/@openclaw/fs-safe/dist/async-lock.d.ts +1 -0
  98. package/node_modules/@openclaw/fs-safe/dist/async-lock.js +17 -0
  99. package/node_modules/@openclaw/fs-safe/dist/atomic.d.ts +6 -0
  100. package/node_modules/@openclaw/fs-safe/dist/atomic.js +4 -0
  101. package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.d.ts +2 -0
  102. package/node_modules/@openclaw/fs-safe/dist/bounded-read-stream.js +15 -0
  103. package/node_modules/@openclaw/fs-safe/dist/bounded-read.d.ts +25 -0
  104. package/node_modules/@openclaw/fs-safe/dist/bounded-read.js +143 -0
  105. package/node_modules/@openclaw/fs-safe/dist/byte-budget.d.ts +3 -0
  106. package/node_modules/@openclaw/fs-safe/dist/byte-budget.js +9 -0
  107. package/node_modules/@openclaw/fs-safe/dist/byte-view.d.ts +2 -0
  108. package/node_modules/@openclaw/fs-safe/dist/byte-view.js +13 -0
  109. package/node_modules/@openclaw/fs-safe/dist/clone-metadata.d.ts +19 -0
  110. package/node_modules/@openclaw/fs-safe/dist/clone-metadata.js +36 -0
  111. package/node_modules/@openclaw/fs-safe/dist/config.d.ts +2 -0
  112. package/node_modules/@openclaw/fs-safe/dist/config.js +2 -0
  113. package/node_modules/@openclaw/fs-safe/dist/containment.d.ts +1 -0
  114. package/node_modules/@openclaw/fs-safe/dist/containment.js +1 -0
  115. package/node_modules/@openclaw/fs-safe/dist/copy-file-input.d.ts +21 -0
  116. package/node_modules/@openclaw/fs-safe/dist/copy-file-input.js +71 -0
  117. package/node_modules/@openclaw/fs-safe/dist/copy-policy.d.ts +2 -0
  118. package/node_modules/@openclaw/fs-safe/dist/copy-policy.js +8 -0
  119. package/node_modules/@openclaw/fs-safe/dist/copy-publication.d.ts +20 -0
  120. package/node_modules/@openclaw/fs-safe/dist/copy-publication.js +33 -0
  121. package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.d.ts +8 -0
  122. package/node_modules/@openclaw/fs-safe/dist/copy-tree-portable.js +245 -0
  123. package/node_modules/@openclaw/fs-safe/dist/copy.d.ts +15 -0
  124. package/node_modules/@openclaw/fs-safe/dist/copy.js +143 -0
  125. package/node_modules/@openclaw/fs-safe/dist/create-owned-file.d.ts +7 -0
  126. package/node_modules/@openclaw/fs-safe/dist/create-owned-file.js +16 -0
  127. package/node_modules/@openclaw/fs-safe/dist/create.d.ts +17 -0
  128. package/node_modules/@openclaw/fs-safe/dist/create.js +388 -0
  129. package/node_modules/@openclaw/fs-safe/dist/creation-boundary.d.ts +60 -0
  130. package/node_modules/@openclaw/fs-safe/dist/creation-boundary.js +371 -0
  131. package/node_modules/@openclaw/fs-safe/dist/deny-mutations.d.ts +11 -0
  132. package/node_modules/@openclaw/fs-safe/dist/deny-mutations.js +95 -0
  133. package/node_modules/@openclaw/fs-safe/dist/device-path.d.ts +14 -0
  134. package/node_modules/@openclaw/fs-safe/dist/device-path.js +139 -0
  135. package/node_modules/@openclaw/fs-safe/dist/directory-durability.d.ts +43 -0
  136. package/node_modules/@openclaw/fs-safe/dist/directory-durability.js +286 -0
  137. package/node_modules/@openclaw/fs-safe/dist/directory-entry-path.d.ts +2 -0
  138. package/node_modules/@openclaw/fs-safe/dist/directory-entry-path.js +21 -0
  139. package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts +55 -0
  140. package/node_modules/@openclaw/fs-safe/dist/directory-guard.js +179 -0
  141. package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts +21 -0
  142. package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.js +209 -0
  143. package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.d.ts +20 -0
  144. package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.js +78 -0
  145. package/node_modules/@openclaw/fs-safe/dist/directory-receipt.d.ts +23 -0
  146. package/node_modules/@openclaw/fs-safe/dist/directory-receipt.js +123 -0
  147. package/node_modules/@openclaw/fs-safe/dist/durability.d.ts +4 -0
  148. package/node_modules/@openclaw/fs-safe/dist/durability.js +3 -0
  149. package/node_modules/@openclaw/fs-safe/dist/effective-uid.d.ts +1 -0
  150. package/node_modules/@openclaw/fs-safe/dist/effective-uid.js +25 -0
  151. package/node_modules/@openclaw/fs-safe/dist/error-detail.d.ts +2 -0
  152. package/node_modules/@openclaw/fs-safe/dist/error-detail.js +13 -0
  153. package/node_modules/@openclaw/fs-safe/dist/errors.d.ts +13 -0
  154. package/node_modules/@openclaw/fs-safe/dist/errors.js +26 -0
  155. package/node_modules/@openclaw/fs-safe/dist/file-cleanup.d.ts +19 -0
  156. package/node_modules/@openclaw/fs-safe/dist/file-cleanup.js +81 -0
  157. package/node_modules/@openclaw/fs-safe/dist/file-contents.d.ts +5 -0
  158. package/node_modules/@openclaw/fs-safe/dist/file-contents.js +40 -0
  159. package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.d.ts +15 -0
  160. package/node_modules/@openclaw/fs-safe/dist/file-handle-transfer.js +190 -0
  161. package/node_modules/@openclaw/fs-safe/dist/file-hash.d.ts +16 -0
  162. package/node_modules/@openclaw/fs-safe/dist/file-hash.js +296 -0
  163. package/node_modules/@openclaw/fs-safe/dist/file-identity.d.ts +7 -0
  164. package/node_modules/@openclaw/fs-safe/dist/file-identity.js +48 -0
  165. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-acquisition.d.ts +22 -0
  166. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-acquisition.js +98 -0
  167. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-admission.d.ts +17 -0
  168. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-admission.js +54 -0
  169. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-acquire.d.ts +3 -0
  170. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-acquire.js +303 -0
  171. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-arbitration.d.ts +17 -0
  172. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-arbitration.js +66 -0
  173. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-held.d.ts +32 -0
  174. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-held.js +395 -0
  175. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-io.d.ts +43 -0
  176. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-io.js +209 -0
  177. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-mutation.d.ts +16 -0
  178. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-mutation.js +275 -0
  179. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-options.d.ts +19 -0
  180. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-options.js +58 -0
  181. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-registration.d.ts +1 -0
  182. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-registration.js +90 -0
  183. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root.d.ts +36 -0
  184. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root.js +288 -0
  185. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-stale-admission.d.ts +19 -0
  186. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-stale-admission.js +199 -0
  187. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.d.ts +17 -0
  188. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.js +341 -0
  189. package/node_modules/@openclaw/fs-safe/dist/file-lock.d.ts +23 -0
  190. package/node_modules/@openclaw/fs-safe/dist/file-lock.js +66 -0
  191. package/node_modules/@openclaw/fs-safe/dist/file-observation.d.ts +8 -0
  192. package/node_modules/@openclaw/fs-safe/dist/file-observation.js +22 -0
  193. package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts +38 -0
  194. package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.js +177 -0
  195. package/node_modules/@openclaw/fs-safe/dist/file-store-prune.d.ts +11 -0
  196. package/node_modules/@openclaw/fs-safe/dist/file-store-prune.js +109 -0
  197. package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.d.ts +15 -0
  198. package/node_modules/@openclaw/fs-safe/dist/file-store-sync-directory.js +319 -0
  199. package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.d.ts +9 -0
  200. package/node_modules/@openclaw/fs-safe/dist/file-store-sync-write.js +128 -0
  201. package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts +65 -0
  202. package/node_modules/@openclaw/fs-safe/dist/file-store.js +362 -0
  203. package/node_modules/@openclaw/fs-safe/dist/file-sync.d.ts +4 -0
  204. package/node_modules/@openclaw/fs-safe/dist/file-sync.js +19 -0
  205. package/node_modules/@openclaw/fs-safe/dist/filename.d.ts +8 -0
  206. package/node_modules/@openclaw/fs-safe/dist/filename.js +138 -0
  207. package/node_modules/@openclaw/fs-safe/dist/fs.d.ts +12 -0
  208. package/node_modules/@openclaw/fs-safe/dist/fs.js +30 -0
  209. package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.d.ts +25 -0
  210. package/node_modules/@openclaw/fs-safe/dist/guarded-mkdir.js +281 -0
  211. package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.d.ts +32 -0
  212. package/node_modules/@openclaw/fs-safe/dist/guarded-mutation.js +81 -0
  213. package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.d.ts +1 -0
  214. package/node_modules/@openclaw/fs-safe/dist/guest-dispatch-python.js +68 -0
  215. package/node_modules/@openclaw/fs-safe/dist/guest-native-python.d.ts +3 -0
  216. package/node_modules/@openclaw/fs-safe/dist/guest-native-python.js +135 -0
  217. package/node_modules/@openclaw/fs-safe/dist/guest.d.ts +8 -0
  218. package/node_modules/@openclaw/fs-safe/dist/guest.js +424 -0
  219. package/node_modules/@openclaw/fs-safe/dist/home-dir.d.ts +11 -0
  220. package/node_modules/@openclaw/fs-safe/dist/home-dir.js +149 -0
  221. package/node_modules/@openclaw/fs-safe/dist/index.d.ts +9 -0
  222. package/node_modules/@openclaw/fs-safe/dist/index.js +5 -0
  223. package/node_modules/@openclaw/fs-safe/dist/install-path.d.ts +25 -0
  224. package/node_modules/@openclaw/fs-safe/dist/install-path.js +136 -0
  225. package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts +37 -0
  226. package/node_modules/@openclaw/fs-safe/dist/json-document-store.js +105 -0
  227. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.d.ts +14 -0
  228. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-directory.js +154 -0
  229. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts +23 -0
  230. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.js +355 -0
  231. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.d.ts +5 -0
  232. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-read.js +65 -0
  233. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts +45 -0
  234. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.js +215 -0
  235. package/node_modules/@openclaw/fs-safe/dist/json-store.d.ts +8 -0
  236. package/node_modules/@openclaw/fs-safe/dist/json-store.js +15 -0
  237. package/node_modules/@openclaw/fs-safe/dist/json-stringify.d.ts +1 -0
  238. package/node_modules/@openclaw/fs-safe/dist/json-stringify.js +7 -0
  239. package/node_modules/@openclaw/fs-safe/dist/json.d.ts +49 -0
  240. package/node_modules/@openclaw/fs-safe/dist/json.js +323 -0
  241. package/node_modules/@openclaw/fs-safe/dist/local-file-access.d.ts +8 -0
  242. package/node_modules/@openclaw/fs-safe/dist/local-file-access.js +84 -0
  243. package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.d.ts +16 -0
  244. package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.js +84 -0
  245. package/node_modules/@openclaw/fs-safe/dist/local-roots.d.ts +25 -0
  246. package/node_modules/@openclaw/fs-safe/dist/local-roots.js +160 -0
  247. package/node_modules/@openclaw/fs-safe/dist/lock-config.d.ts +9 -0
  248. package/node_modules/@openclaw/fs-safe/dist/lock-config.js +12 -0
  249. package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.d.ts +30 -0
  250. package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.js +224 -0
  251. package/node_modules/@openclaw/fs-safe/dist/move-path-stage.d.ts +7 -0
  252. package/node_modules/@openclaw/fs-safe/dist/move-path-stage.js +56 -0
  253. package/node_modules/@openclaw/fs-safe/dist/move-path.d.ts +20 -0
  254. package/node_modules/@openclaw/fs-safe/dist/move-path.js +390 -0
  255. package/node_modules/@openclaw/fs-safe/dist/mutation-authority.d.ts +8 -0
  256. package/node_modules/@openclaw/fs-safe/dist/mutation-authority.js +36 -0
  257. package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts +162 -0
  258. package/node_modules/@openclaw/fs-safe/dist/native-binding.js +8 -0
  259. package/node_modules/@openclaw/fs-safe/dist/native-config.d.ts +16 -0
  260. package/node_modules/@openclaw/fs-safe/dist/native-config.js +71 -0
  261. package/node_modules/@openclaw/fs-safe/dist/native-directory-observation.d.ts +16 -0
  262. package/node_modules/@openclaw/fs-safe/dist/native-directory-observation.js +37 -0
  263. package/node_modules/@openclaw/fs-safe/dist/native-fallback-warning.d.ts +3 -0
  264. package/node_modules/@openclaw/fs-safe/dist/native-fallback-warning.js +11 -0
  265. package/node_modules/@openclaw/fs-safe/dist/native-operations.d.ts +15 -0
  266. package/node_modules/@openclaw/fs-safe/dist/native-operations.js +111 -0
  267. package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.d.ts +34 -0
  268. package/node_modules/@openclaw/fs-safe/dist/native-parent-admission.js +147 -0
  269. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.d.ts +6 -0
  270. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write-windows.js +252 -0
  271. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.d.ts +4 -0
  272. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.js +472 -0
  273. package/node_modules/@openclaw/fs-safe/dist/native-policy-directory-observation.d.ts +11 -0
  274. package/node_modules/@openclaw/fs-safe/dist/native-policy-directory-observation.js +61 -0
  275. package/node_modules/@openclaw/fs-safe/dist/native-policy-parent-windows.d.ts +13 -0
  276. package/node_modules/@openclaw/fs-safe/dist/native-policy-parent-windows.js +209 -0
  277. package/node_modules/@openclaw/fs-safe/dist/native-rename-outcome.d.ts +3 -0
  278. package/node_modules/@openclaw/fs-safe/dist/native-rename-outcome.js +8 -0
  279. package/node_modules/@openclaw/fs-safe/dist/native-staged-file.d.ts +45 -0
  280. package/node_modules/@openclaw/fs-safe/dist/native-staged-file.js +442 -0
  281. package/node_modules/@openclaw/fs-safe/dist/native.d.ts +13 -0
  282. package/node_modules/@openclaw/fs-safe/dist/native.js +209 -0
  283. package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.d.ts +7 -0
  284. package/node_modules/@openclaw/fs-safe/dist/opened-file-failure.js +46 -0
  285. package/node_modules/@openclaw/fs-safe/dist/opened-realpath.d.ts +15 -0
  286. package/node_modules/@openclaw/fs-safe/dist/opened-realpath.js +102 -0
  287. package/node_modules/@openclaw/fs-safe/dist/output.d.ts +16 -0
  288. package/node_modules/@openclaw/fs-safe/dist/output.js +139 -0
  289. package/node_modules/@openclaw/fs-safe/dist/overwrite-file-handle.d.ts +7 -0
  290. package/node_modules/@openclaw/fs-safe/dist/overwrite-file-handle.js +46 -0
  291. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts +30 -0
  292. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.js +36 -0
  293. package/node_modules/@openclaw/fs-safe/dist/path-case.d.ts +6 -0
  294. package/node_modules/@openclaw/fs-safe/dist/path-case.js +136 -0
  295. package/node_modules/@openclaw/fs-safe/dist/path-policy.d.ts +24 -0
  296. package/node_modules/@openclaw/fs-safe/dist/path-policy.js +49 -0
  297. package/node_modules/@openclaw/fs-safe/dist/path-prefix.d.ts +6 -0
  298. package/node_modules/@openclaw/fs-safe/dist/path-prefix.js +104 -0
  299. package/node_modules/@openclaw/fs-safe/dist/path-scope-lexical.d.ts +13 -0
  300. package/node_modules/@openclaw/fs-safe/dist/path-scope-lexical.js +37 -0
  301. package/node_modules/@openclaw/fs-safe/dist/path-segment-route.d.ts +6 -0
  302. package/node_modules/@openclaw/fs-safe/dist/path-segment-route.js +24 -0
  303. package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.d.ts +11 -0
  304. package/node_modules/@openclaw/fs-safe/dist/path-suffix-aliases.js +394 -0
  305. package/node_modules/@openclaw/fs-safe/dist/path.d.ts +20 -0
  306. package/node_modules/@openclaw/fs-safe/dist/path.js +169 -0
  307. package/node_modules/@openclaw/fs-safe/dist/permission-exec.d.ts +26 -0
  308. package/node_modules/@openclaw/fs-safe/dist/permission-exec.js +197 -0
  309. package/node_modules/@openclaw/fs-safe/dist/permissions-public.d.ts +3 -0
  310. package/node_modules/@openclaw/fs-safe/dist/permissions-public.js +3 -0
  311. package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts +51 -0
  312. package/node_modules/@openclaw/fs-safe/dist/permissions-windows.js +319 -0
  313. package/node_modules/@openclaw/fs-safe/dist/permissions.d.ts +59 -0
  314. package/node_modules/@openclaw/fs-safe/dist/permissions.js +132 -0
  315. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.d.ts +24 -0
  316. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.js +419 -0
  317. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.d.ts +38 -0
  318. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-observation.js +205 -0
  319. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.d.ts +24 -0
  320. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.js +70 -0
  321. package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts +30 -0
  322. package/node_modules/@openclaw/fs-safe/dist/pinned-open.js +99 -0
  323. package/node_modules/@openclaw/fs-safe/dist/pinned-operation.d.ts +1 -0
  324. package/node_modules/@openclaw/fs-safe/dist/pinned-operation.js +22 -0
  325. package/node_modules/@openclaw/fs-safe/dist/pinned-write-input.d.ts +3 -0
  326. package/node_modules/@openclaw/fs-safe/dist/pinned-write-input.js +35 -0
  327. package/node_modules/@openclaw/fs-safe/dist/pinned-write-mode.d.ts +4 -0
  328. package/node_modules/@openclaw/fs-safe/dist/pinned-write-mode.js +31 -0
  329. package/node_modules/@openclaw/fs-safe/dist/pinned-write-staged.d.ts +5 -0
  330. package/node_modules/@openclaw/fs-safe/dist/pinned-write-staged.js +185 -0
  331. package/node_modules/@openclaw/fs-safe/dist/pinned-write-types.d.ts +68 -0
  332. package/node_modules/@openclaw/fs-safe/dist/pinned-write-types.js +1 -0
  333. package/node_modules/@openclaw/fs-safe/dist/pinned-write.d.ts +12 -0
  334. package/node_modules/@openclaw/fs-safe/dist/pinned-write.js +300 -0
  335. package/node_modules/@openclaw/fs-safe/dist/positional-read.d.ts +8 -0
  336. package/node_modules/@openclaw/fs-safe/dist/positional-read.js +36 -0
  337. package/node_modules/@openclaw/fs-safe/dist/private-directory.d.ts +4 -0
  338. package/node_modules/@openclaw/fs-safe/dist/private-directory.js +30 -0
  339. package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff-sync.d.ts +3 -0
  340. package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff-sync.js +72 -0
  341. package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.d.ts +53 -0
  342. package/node_modules/@openclaw/fs-safe/dist/private-producer-handoff.js +358 -0
  343. package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.d.ts +7 -0
  344. package/node_modules/@openclaw/fs-safe/dist/private-temp-workspace.js +341 -0
  345. package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.d.ts +13 -0
  346. package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.js +56 -0
  347. package/node_modules/@openclaw/fs-safe/dist/publish-file-failure.d.ts +27 -0
  348. package/node_modules/@openclaw/fs-safe/dist/publish-file-failure.js +22 -0
  349. package/node_modules/@openclaw/fs-safe/dist/publish-file.d.ts +19 -0
  350. package/node_modules/@openclaw/fs-safe/dist/publish-file.js +332 -0
  351. package/node_modules/@openclaw/fs-safe/dist/read-open-flags.d.ts +7 -0
  352. package/node_modules/@openclaw/fs-safe/dist/read-open-flags.js +13 -0
  353. package/node_modules/@openclaw/fs-safe/dist/read-opened-file.d.ts +20 -0
  354. package/node_modules/@openclaw/fs-safe/dist/read-opened-file.js +18 -0
  355. package/node_modules/@openclaw/fs-safe/dist/realpath.d.ts +3 -0
  356. package/node_modules/@openclaw/fs-safe/dist/realpath.js +43 -0
  357. package/node_modules/@openclaw/fs-safe/dist/recursive-mkdir-path.d.ts +2 -0
  358. package/node_modules/@openclaw/fs-safe/dist/recursive-mkdir-path.js +8 -0
  359. package/node_modules/@openclaw/fs-safe/dist/regular-file.d.ts +37 -0
  360. package/node_modules/@openclaw/fs-safe/dist/regular-file.js +317 -0
  361. package/node_modules/@openclaw/fs-safe/dist/replace-directory.d.ts +6 -0
  362. package/node_modules/@openclaw/fs-safe/dist/replace-directory.js +287 -0
  363. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.d.ts +38 -0
  364. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.js +341 -0
  365. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.d.ts +20 -0
  366. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-source.js +101 -0
  367. package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.d.ts +50 -0
  368. package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.js +160 -0
  369. package/node_modules/@openclaw/fs-safe/dist/replace-file-mode.d.ts +2 -0
  370. package/node_modules/@openclaw/fs-safe/dist/replace-file-mode.js +10 -0
  371. package/node_modules/@openclaw/fs-safe/dist/replace-file-rename-policy.d.ts +5 -0
  372. package/node_modules/@openclaw/fs-safe/dist/replace-file-rename-policy.js +30 -0
  373. package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts +49 -0
  374. package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.js +356 -0
  375. package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts +58 -0
  376. package/node_modules/@openclaw/fs-safe/dist/replace-file.js +336 -0
  377. package/node_modules/@openclaw/fs-safe/dist/retained-directory-replacement.d.ts +25 -0
  378. package/node_modules/@openclaw/fs-safe/dist/retained-directory-replacement.js +193 -0
  379. package/node_modules/@openclaw/fs-safe/dist/root-boundary.d.ts +29 -0
  380. package/node_modules/@openclaw/fs-safe/dist/root-boundary.js +186 -0
  381. package/node_modules/@openclaw/fs-safe/dist/root-context.d.ts +43 -0
  382. package/node_modules/@openclaw/fs-safe/dist/root-context.js +232 -0
  383. package/node_modules/@openclaw/fs-safe/dist/root-create-input.d.ts +16 -0
  384. package/node_modules/@openclaw/fs-safe/dist/root-create-input.js +93 -0
  385. package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.d.ts +12 -0
  386. package/node_modules/@openclaw/fs-safe/dist/root-directory-creation.js +225 -0
  387. package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts +38 -0
  388. package/node_modules/@openclaw/fs-safe/dist/root-directory-list.js +382 -0
  389. package/node_modules/@openclaw/fs-safe/dist/root-directory.d.ts +22 -0
  390. package/node_modules/@openclaw/fs-safe/dist/root-directory.js +141 -0
  391. package/node_modules/@openclaw/fs-safe/dist/root-entries.d.ts +10 -0
  392. package/node_modules/@openclaw/fs-safe/dist/root-entries.js +61 -0
  393. package/node_modules/@openclaw/fs-safe/dist/root-errors.d.ts +16 -0
  394. package/node_modules/@openclaw/fs-safe/dist/root-errors.js +92 -0
  395. package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.d.ts +20 -0
  396. package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.js +86 -0
  397. package/node_modules/@openclaw/fs-safe/dist/root-file.d.ts +46 -0
  398. package/node_modules/@openclaw/fs-safe/dist/root-file.js +208 -0
  399. package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts +117 -0
  400. package/node_modules/@openclaw/fs-safe/dist/root-impl.js +1443 -0
  401. package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.d.ts +15 -0
  402. package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.js +205 -0
  403. package/node_modules/@openclaw/fs-safe/dist/root-move-preflight.d.ts +7 -0
  404. package/node_modules/@openclaw/fs-safe/dist/root-move-preflight.js +16 -0
  405. package/node_modules/@openclaw/fs-safe/dist/root-observed-path.d.ts +8 -0
  406. package/node_modules/@openclaw/fs-safe/dist/root-observed-path.js +93 -0
  407. package/node_modules/@openclaw/fs-safe/dist/root-options.d.ts +84 -0
  408. package/node_modules/@openclaw/fs-safe/dist/root-options.js +18 -0
  409. package/node_modules/@openclaw/fs-safe/dist/root-path-errors.d.ts +12 -0
  410. package/node_modules/@openclaw/fs-safe/dist/root-path-errors.js +22 -0
  411. package/node_modules/@openclaw/fs-safe/dist/root-path-existing.d.ts +12 -0
  412. package/node_modules/@openclaw/fs-safe/dist/root-path-existing.js +160 -0
  413. package/node_modules/@openclaw/fs-safe/dist/root-path-observation.d.ts +62 -0
  414. package/node_modules/@openclaw/fs-safe/dist/root-path-observation.js +180 -0
  415. package/node_modules/@openclaw/fs-safe/dist/root-path-stat.d.ts +4 -0
  416. package/node_modules/@openclaw/fs-safe/dist/root-path-stat.js +151 -0
  417. package/node_modules/@openclaw/fs-safe/dist/root-path.d.ts +53 -0
  418. package/node_modules/@openclaw/fs-safe/dist/root-path.js +443 -0
  419. package/node_modules/@openclaw/fs-safe/dist/root-paths-lexical.d.ts +8 -0
  420. package/node_modules/@openclaw/fs-safe/dist/root-paths-lexical.js +22 -0
  421. package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts +62 -0
  422. package/node_modules/@openclaw/fs-safe/dist/root-paths.js +296 -0
  423. package/node_modules/@openclaw/fs-safe/dist/root-public-types.d.ts +11 -0
  424. package/node_modules/@openclaw/fs-safe/dist/root-public-types.js +1 -0
  425. package/node_modules/@openclaw/fs-safe/dist/root-read-admission.d.ts +25 -0
  426. package/node_modules/@openclaw/fs-safe/dist/root-read-admission.js +86 -0
  427. package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.d.ts +14 -0
  428. package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.js +87 -0
  429. package/node_modules/@openclaw/fs-safe/dist/root-remove-receipt.d.ts +16 -0
  430. package/node_modules/@openclaw/fs-safe/dist/root-remove-receipt.js +37 -0
  431. package/node_modules/@openclaw/fs-safe/dist/root-remove.d.ts +6 -0
  432. package/node_modules/@openclaw/fs-safe/dist/root-remove.js +464 -0
  433. package/node_modules/@openclaw/fs-safe/dist/root-symlink-policy.d.ts +13 -0
  434. package/node_modules/@openclaw/fs-safe/dist/root-symlink-policy.js +34 -0
  435. package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts +41 -0
  436. package/node_modules/@openclaw/fs-safe/dist/root-walk.js +198 -0
  437. package/node_modules/@openclaw/fs-safe/dist/root-write-admission.d.ts +65 -0
  438. package/node_modules/@openclaw/fs-safe/dist/root-write-admission.js +304 -0
  439. package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.d.ts +11 -0
  440. package/node_modules/@openclaw/fs-safe/dist/root-write-compatibility.js +23 -0
  441. package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.d.ts +41 -0
  442. package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.js +180 -0
  443. package/node_modules/@openclaw/fs-safe/dist/root-write-lock-binding.d.ts +14 -0
  444. package/node_modules/@openclaw/fs-safe/dist/root-write-lock-binding.js +162 -0
  445. package/node_modules/@openclaw/fs-safe/dist/root-write-mode.d.ts +7 -0
  446. package/node_modules/@openclaw/fs-safe/dist/root-write-mode.js +72 -0
  447. package/node_modules/@openclaw/fs-safe/dist/root-write-publication.d.ts +23 -0
  448. package/node_modules/@openclaw/fs-safe/dist/root-write-publication.js +85 -0
  449. package/node_modules/@openclaw/fs-safe/dist/root-write-verification.d.ts +11 -0
  450. package/node_modules/@openclaw/fs-safe/dist/root-write-verification.js +95 -0
  451. package/node_modules/@openclaw/fs-safe/dist/root.d.ts +2 -0
  452. package/node_modules/@openclaw/fs-safe/dist/root.js +1 -0
  453. package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.d.ts +11 -0
  454. package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.js +74 -0
  455. package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts +25 -0
  456. package/node_modules/@openclaw/fs-safe/dist/secret-file.js +337 -0
  457. package/node_modules/@openclaw/fs-safe/dist/secret-read-async.d.ts +3 -0
  458. package/node_modules/@openclaw/fs-safe/dist/secret-read-async.js +58 -0
  459. package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.d.ts +20 -0
  460. package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.js +68 -0
  461. package/node_modules/@openclaw/fs-safe/dist/secret.d.ts +3 -0
  462. package/node_modules/@openclaw/fs-safe/dist/secret.js +3 -0
  463. package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.d.ts +10 -0
  464. package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.js +88 -0
  465. package/node_modules/@openclaw/fs-safe/dist/secure-file.d.ts +31 -0
  466. package/node_modules/@openclaw/fs-safe/dist/secure-file.js +297 -0
  467. package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.d.ts +29 -0
  468. package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.js +181 -0
  469. package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.d.ts +34 -0
  470. package/node_modules/@openclaw/fs-safe/dist/secure-temp-repair.js +110 -0
  471. package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.d.ts +17 -0
  472. package/node_modules/@openclaw/fs-safe/dist/sibling-staged-file.js +301 -0
  473. package/node_modules/@openclaw/fs-safe/dist/sibling-temp.d.ts +28 -0
  474. package/node_modules/@openclaw/fs-safe/dist/sibling-temp.js +132 -0
  475. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.d.ts +4 -0
  476. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.js +442 -0
  477. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-context.d.ts +18 -0
  478. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-context.js +60 -0
  479. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-parser.d.ts +42 -0
  480. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-parser.js +113 -0
  481. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission.d.ts +31 -0
  482. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission.js +1 -0
  483. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.d.ts +26 -0
  484. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.js +48 -0
  485. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts +19 -0
  486. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.js +113 -0
  487. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.d.ts +67 -0
  488. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.js +375 -0
  489. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-registration.d.ts +13 -0
  490. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-registration.js +47 -0
  491. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.d.ts +2 -0
  492. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-root.js +79 -0
  493. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-stale-admission.d.ts +38 -0
  494. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-stale-admission.js +228 -0
  495. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-target.d.ts +7 -0
  496. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-target.js +55 -0
  497. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-types.d.ts +68 -0
  498. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-types.js +1 -0
  499. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.d.ts +13 -0
  500. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.js +280 -0
  501. package/node_modules/@openclaw/fs-safe/dist/staged-directory.d.ts +27 -0
  502. package/node_modules/@openclaw/fs-safe/dist/staged-directory.js +148 -0
  503. package/node_modules/@openclaw/fs-safe/dist/staged-file-settlement.d.ts +16 -0
  504. package/node_modules/@openclaw/fs-safe/dist/staged-file-settlement.js +57 -0
  505. package/node_modules/@openclaw/fs-safe/dist/staged-file-types.d.ts +55 -0
  506. package/node_modules/@openclaw/fs-safe/dist/staged-file-types.js +1 -0
  507. package/node_modules/@openclaw/fs-safe/dist/stat-observation.d.ts +10 -0
  508. package/node_modules/@openclaw/fs-safe/dist/stat-observation.js +64 -0
  509. package/node_modules/@openclaw/fs-safe/dist/store.d.ts +3 -0
  510. package/node_modules/@openclaw/fs-safe/dist/store.js +3 -0
  511. package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.d.ts +5 -0
  512. package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.js +88 -0
  513. package/node_modules/@openclaw/fs-safe/dist/string-coerce.d.ts +4 -0
  514. package/node_modules/@openclaw/fs-safe/dist/string-coerce.js +16 -0
  515. package/node_modules/@openclaw/fs-safe/dist/suppressed-error.d.ts +5 -0
  516. package/node_modules/@openclaw/fs-safe/dist/suppressed-error.js +15 -0
  517. package/node_modules/@openclaw/fs-safe/dist/symlink-parents.d.ts +11 -0
  518. package/node_modules/@openclaw/fs-safe/dist/symlink-parents.js +58 -0
  519. package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.d.ts +13 -0
  520. package/node_modules/@openclaw/fs-safe/dist/temp-cleanup.js +88 -0
  521. package/node_modules/@openclaw/fs-safe/dist/temp-target.d.ts +31 -0
  522. package/node_modules/@openclaw/fs-safe/dist/temp-target.js +238 -0
  523. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.d.ts +14 -0
  524. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.js +392 -0
  525. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.d.ts +23 -0
  526. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.js +151 -0
  527. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.d.ts +42 -0
  528. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.js +342 -0
  529. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.d.ts +24 -0
  530. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.js +403 -0
  531. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-types.d.ts +39 -0
  532. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-types.js +1 -0
  533. package/node_modules/@openclaw/fs-safe/dist/temp.d.ts +3 -0
  534. package/node_modules/@openclaw/fs-safe/dist/temp.js +2 -0
  535. package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts +31 -0
  536. package/node_modules/@openclaw/fs-safe/dist/test-hooks.js +13 -0
  537. package/node_modules/@openclaw/fs-safe/dist/text-atomic.d.ts +13 -0
  538. package/node_modules/@openclaw/fs-safe/dist/text-atomic.js +16 -0
  539. package/node_modules/@openclaw/fs-safe/dist/timing.d.ts +8 -0
  540. package/node_modules/@openclaw/fs-safe/dist/timing.js +59 -0
  541. package/node_modules/@openclaw/fs-safe/dist/trash.d.ts +4 -0
  542. package/node_modules/@openclaw/fs-safe/dist/trash.js +219 -0
  543. package/node_modules/@openclaw/fs-safe/dist/types.d.ts +22 -0
  544. package/node_modules/@openclaw/fs-safe/dist/types.js +1 -0
  545. package/node_modules/@openclaw/fs-safe/dist/unicode-path.d.ts +2 -0
  546. package/node_modules/@openclaw/fs-safe/dist/unicode-path.js +16 -0
  547. package/node_modules/@openclaw/fs-safe/dist/walk.d.ts +40 -0
  548. package/node_modules/@openclaw/fs-safe/dist/walk.js +207 -0
  549. package/node_modules/@openclaw/fs-safe/dist/windows-command.d.ts +1 -0
  550. package/node_modules/@openclaw/fs-safe/dist/windows-command.js +34 -0
  551. package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts +28 -0
  552. package/node_modules/@openclaw/fs-safe/dist/windows-owner.js +101 -0
  553. package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.d.ts +39 -0
  554. package/node_modules/@openclaw/fs-safe/dist/windows-path-alias.js +122 -0
  555. package/node_modules/@openclaw/fs-safe/dist/windows-path-syntax.d.ts +5 -0
  556. package/node_modules/@openclaw/fs-safe/dist/windows-path-syntax.js +21 -0
  557. package/node_modules/@openclaw/fs-safe/dist/windows-security-bridge.cs +336 -0
  558. package/node_modules/@openclaw/fs-safe/dist/windows-security-bridge.ps1 +15 -0
  559. package/node_modules/@openclaw/fs-safe/dist/windows-security-command.d.ts +25 -0
  560. package/node_modules/@openclaw/fs-safe/dist/windows-security-command.js +363 -0
  561. package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.d.ts +5 -0
  562. package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.js +108 -0
  563. package/node_modules/@openclaw/fs-safe/dist/write-file-handle.d.ts +13 -0
  564. package/node_modules/@openclaw/fs-safe/dist/write-file-handle.js +49 -0
  565. package/node_modules/@openclaw/fs-safe/dist/write-open-flags.d.ts +4 -0
  566. package/node_modules/@openclaw/fs-safe/dist/write-open-flags.js +27 -0
  567. package/node_modules/@openclaw/fs-safe/dist/write-queue.d.ts +1 -0
  568. package/node_modules/@openclaw/fs-safe/dist/write-queue.js +15 -0
  569. package/node_modules/@openclaw/fs-safe/docs/advanced.md +269 -0
  570. package/node_modules/@openclaw/fs-safe/docs/archive.md +843 -0
  571. package/node_modules/@openclaw/fs-safe/docs/assets/readme-banner.jpg +0 -0
  572. package/node_modules/@openclaw/fs-safe/docs/atomic.md +521 -0
  573. package/node_modules/@openclaw/fs-safe/docs/config.md +136 -0
  574. package/node_modules/@openclaw/fs-safe/docs/contributing.md +262 -0
  575. package/node_modules/@openclaw/fs-safe/docs/copy.md +197 -0
  576. package/node_modules/@openclaw/fs-safe/docs/creation.md +132 -0
  577. package/node_modules/@openclaw/fs-safe/docs/directory-identity.md +85 -0
  578. package/node_modules/@openclaw/fs-safe/docs/durability.md +438 -0
  579. package/node_modules/@openclaw/fs-safe/docs/entries.md +109 -0
  580. package/node_modules/@openclaw/fs-safe/docs/errors.md +240 -0
  581. package/node_modules/@openclaw/fs-safe/docs/file-contents.md +68 -0
  582. package/node_modules/@openclaw/fs-safe/docs/file-store.md +364 -0
  583. package/node_modules/@openclaw/fs-safe/docs/filename.md +110 -0
  584. package/node_modules/@openclaw/fs-safe/docs/guest.md +146 -0
  585. package/node_modules/@openclaw/fs-safe/docs/in-place-write.md +81 -0
  586. package/node_modules/@openclaw/fs-safe/docs/index.md +86 -0
  587. package/node_modules/@openclaw/fs-safe/docs/install-path.md +216 -0
  588. package/node_modules/@openclaw/fs-safe/docs/install.md +222 -0
  589. package/node_modules/@openclaw/fs-safe/docs/json-store.md +240 -0
  590. package/node_modules/@openclaw/fs-safe/docs/json.md +225 -0
  591. package/node_modules/@openclaw/fs-safe/docs/local-roots.md +150 -0
  592. package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.5.md +205 -0
  593. package/node_modules/@openclaw/fs-safe/docs/migrating-to-0.6.md +48 -0
  594. package/node_modules/@openclaw/fs-safe/docs/mutation-policy-proof.md +69 -0
  595. package/node_modules/@openclaw/fs-safe/docs/native-helper.md +177 -0
  596. package/node_modules/@openclaw/fs-safe/docs/native.md +289 -0
  597. package/node_modules/@openclaw/fs-safe/docs/output.md +193 -0
  598. package/node_modules/@openclaw/fs-safe/docs/path-case.md +64 -0
  599. package/node_modules/@openclaw/fs-safe/docs/path-prefix.md +74 -0
  600. package/node_modules/@openclaw/fs-safe/docs/path-scope.md +159 -0
  601. package/node_modules/@openclaw/fs-safe/docs/path-suffix-aliases.md +204 -0
  602. package/node_modules/@openclaw/fs-safe/docs/path.md +219 -0
  603. package/node_modules/@openclaw/fs-safe/docs/permissions.md +286 -0
  604. package/node_modules/@openclaw/fs-safe/docs/positional-read.md +63 -0
  605. package/node_modules/@openclaw/fs-safe/docs/private-file-store.md +68 -0
  606. package/node_modules/@openclaw/fs-safe/docs/public-api.md +161 -0
  607. package/node_modules/@openclaw/fs-safe/docs/quickstart.md +154 -0
  608. package/node_modules/@openclaw/fs-safe/docs/reading.md +196 -0
  609. package/node_modules/@openclaw/fs-safe/docs/regular-file.md +193 -0
  610. package/node_modules/@openclaw/fs-safe/docs/root.md +545 -0
  611. package/node_modules/@openclaw/fs-safe/docs/secret-file.md +299 -0
  612. package/node_modules/@openclaw/fs-safe/docs/secure-file.md +112 -0
  613. package/node_modules/@openclaw/fs-safe/docs/security-model.md +269 -0
  614. package/node_modules/@openclaw/fs-safe/docs/sidecar-lock.md +595 -0
  615. package/node_modules/@openclaw/fs-safe/docs/staged-file.md +192 -0
  616. package/node_modules/@openclaw/fs-safe/docs/store.md +127 -0
  617. package/node_modules/@openclaw/fs-safe/docs/temp.md +760 -0
  618. package/node_modules/@openclaw/fs-safe/docs/test-hooks.md +110 -0
  619. package/node_modules/@openclaw/fs-safe/docs/testing.md +189 -0
  620. package/node_modules/@openclaw/fs-safe/docs/timing.md +123 -0
  621. package/node_modules/@openclaw/fs-safe/docs/types.md +211 -0
  622. package/node_modules/@openclaw/fs-safe/docs/walk.md +250 -0
  623. package/node_modules/@openclaw/fs-safe/docs/writing.md +641 -0
  624. package/node_modules/@openclaw/fs-safe/package.json +200 -0
  625. package/node_modules/@openclaw/fs-safe-darwin-arm64/fs-safe-native.node +0 -0
  626. package/node_modules/@openclaw/fs-safe-darwin-arm64/package.json +29 -0
  627. package/node_modules/@openclaw/fs-safe-darwin-x64/fs-safe-native.node +0 -0
  628. package/node_modules/@openclaw/fs-safe-darwin-x64/package.json +29 -0
  629. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/fs-safe-native.node +0 -0
  630. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/package.json +32 -0
  631. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/fs-safe-native.node +0 -0
  632. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/package.json +32 -0
  633. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/fs-safe-native.node +0 -0
  634. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/package.json +32 -0
  635. package/node_modules/@openclaw/fs-safe-linux-x64-musl/fs-safe-native.node +0 -0
  636. package/node_modules/@openclaw/fs-safe-linux-x64-musl/package.json +32 -0
  637. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/fs-safe-native.node +0 -0
  638. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/package.json +29 -0
  639. package/node_modules/core-util-is/LICENSE +19 -0
  640. package/node_modules/core-util-is/README.md +3 -0
  641. package/node_modules/core-util-is/lib/util.js +107 -0
  642. package/node_modules/core-util-is/package.json +38 -0
  643. package/node_modules/immediate/LICENSE.txt +20 -0
  644. package/node_modules/immediate/README.md +93 -0
  645. package/node_modules/immediate/dist/immediate.js +75 -0
  646. package/node_modules/immediate/dist/immediate.min.js +1 -0
  647. package/node_modules/immediate/lib/browser.js +69 -0
  648. package/node_modules/immediate/lib/index.js +73 -0
  649. package/node_modules/immediate/package.json +42 -0
  650. package/node_modules/inherits/LICENSE +16 -0
  651. package/node_modules/inherits/README.md +42 -0
  652. package/node_modules/inherits/inherits.js +9 -0
  653. package/node_modules/inherits/inherits_browser.js +27 -0
  654. package/node_modules/inherits/package.json +29 -0
  655. package/node_modules/isarray/.npmignore +1 -0
  656. package/node_modules/isarray/.travis.yml +4 -0
  657. package/node_modules/isarray/Makefile +6 -0
  658. package/node_modules/isarray/README.md +60 -0
  659. package/node_modules/isarray/component.json +19 -0
  660. package/node_modules/isarray/index.js +5 -0
  661. package/node_modules/isarray/package.json +45 -0
  662. package/node_modules/isarray/test.js +20 -0
  663. package/node_modules/jszip/.codeclimate.yml +16 -0
  664. package/node_modules/jszip/.editorconfig +8 -0
  665. package/node_modules/jszip/.eslintrc.js +43 -0
  666. package/node_modules/jszip/.github/FUNDING.yml +1 -0
  667. package/node_modules/jszip/.github/actions/setup/action.yml +23 -0
  668. package/node_modules/jszip/.github/workflows/benchmark.yml +38 -0
  669. package/node_modules/jszip/.github/workflows/main.yml +55 -0
  670. package/node_modules/jszip/CHANGES.md +210 -0
  671. package/node_modules/jszip/LICENSE.markdown +651 -0
  672. package/node_modules/jszip/README.markdown +33 -0
  673. package/node_modules/jszip/dist/jszip.js +11586 -0
  674. package/node_modules/jszip/dist/jszip.min.js +13 -0
  675. package/node_modules/jszip/index.d.ts +344 -0
  676. package/node_modules/jszip/lib/base64.js +106 -0
  677. package/node_modules/jszip/lib/compressedObject.js +74 -0
  678. package/node_modules/jszip/lib/compressions.js +14 -0
  679. package/node_modules/jszip/lib/crc32.js +77 -0
  680. package/node_modules/jszip/lib/defaults.js +11 -0
  681. package/node_modules/jszip/lib/external.js +18 -0
  682. package/node_modules/jszip/lib/flate.js +85 -0
  683. package/node_modules/jszip/lib/generate/ZipFileWorker.js +539 -0
  684. package/node_modules/jszip/lib/generate/index.js +57 -0
  685. package/node_modules/jszip/lib/index.js +55 -0
  686. package/node_modules/jszip/lib/license_header.js +11 -0
  687. package/node_modules/jszip/lib/load.js +88 -0
  688. package/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +74 -0
  689. package/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +42 -0
  690. package/node_modules/jszip/lib/nodejsUtils.js +57 -0
  691. package/node_modules/jszip/lib/object.js +384 -0
  692. package/node_modules/jszip/lib/readable-stream-browser.js +10 -0
  693. package/node_modules/jszip/lib/reader/ArrayReader.js +57 -0
  694. package/node_modules/jszip/lib/reader/DataReader.js +116 -0
  695. package/node_modules/jszip/lib/reader/NodeBufferReader.js +19 -0
  696. package/node_modules/jszip/lib/reader/StringReader.js +38 -0
  697. package/node_modules/jszip/lib/reader/Uint8ArrayReader.js +22 -0
  698. package/node_modules/jszip/lib/reader/readerFor.js +28 -0
  699. package/node_modules/jszip/lib/signature.js +7 -0
  700. package/node_modules/jszip/lib/stream/ConvertWorker.js +26 -0
  701. package/node_modules/jszip/lib/stream/Crc32Probe.js +24 -0
  702. package/node_modules/jszip/lib/stream/DataLengthProbe.js +29 -0
  703. package/node_modules/jszip/lib/stream/DataWorker.js +116 -0
  704. package/node_modules/jszip/lib/stream/GenericWorker.js +263 -0
  705. package/node_modules/jszip/lib/stream/StreamHelper.js +214 -0
  706. package/node_modules/jszip/lib/support.js +38 -0
  707. package/node_modules/jszip/lib/utf8.js +275 -0
  708. package/node_modules/jszip/lib/utils.js +510 -0
  709. package/node_modules/jszip/lib/zipEntries.js +261 -0
  710. package/node_modules/jszip/lib/zipEntry.js +293 -0
  711. package/node_modules/jszip/lib/zipObject.js +133 -0
  712. package/node_modules/jszip/package.json +67 -0
  713. package/node_modules/jszip/sponsors.md +21 -0
  714. package/node_modules/jszip/tsconfig.json +101 -0
  715. package/node_modules/jszip/vendor/FileSaver.js +247 -0
  716. package/node_modules/lie/README.md +62 -0
  717. package/node_modules/lie/dist/lie.js +350 -0
  718. package/node_modules/lie/dist/lie.min.js +1 -0
  719. package/node_modules/lie/dist/lie.polyfill.js +358 -0
  720. package/node_modules/lie/dist/lie.polyfill.min.js +1 -0
  721. package/node_modules/lie/lib/browser.js +273 -0
  722. package/node_modules/lie/lib/index.js +298 -0
  723. package/node_modules/lie/license.md +7 -0
  724. package/node_modules/lie/lie.d.ts +244 -0
  725. package/node_modules/lie/package.json +69 -0
  726. package/node_modules/lie/polyfill.js +4 -0
  727. package/node_modules/pako/CHANGELOG.md +164 -0
  728. package/node_modules/pako/LICENSE +21 -0
  729. package/node_modules/pako/README.md +191 -0
  730. package/node_modules/pako/dist/pako.js +6818 -0
  731. package/node_modules/pako/dist/pako.min.js +1 -0
  732. package/node_modules/pako/dist/pako_deflate.js +3997 -0
  733. package/node_modules/pako/dist/pako_deflate.min.js +1 -0
  734. package/node_modules/pako/dist/pako_inflate.js +3300 -0
  735. package/node_modules/pako/dist/pako_inflate.min.js +1 -0
  736. package/node_modules/pako/index.js +14 -0
  737. package/node_modules/pako/lib/deflate.js +400 -0
  738. package/node_modules/pako/lib/inflate.js +423 -0
  739. package/node_modules/pako/lib/utils/common.js +105 -0
  740. package/node_modules/pako/lib/utils/strings.js +187 -0
  741. package/node_modules/pako/lib/zlib/README +59 -0
  742. package/node_modules/pako/lib/zlib/adler32.js +51 -0
  743. package/node_modules/pako/lib/zlib/constants.js +68 -0
  744. package/node_modules/pako/lib/zlib/crc32.js +59 -0
  745. package/node_modules/pako/lib/zlib/deflate.js +1874 -0
  746. package/node_modules/pako/lib/zlib/gzheader.js +58 -0
  747. package/node_modules/pako/lib/zlib/inffast.js +345 -0
  748. package/node_modules/pako/lib/zlib/inflate.js +1556 -0
  749. package/node_modules/pako/lib/zlib/inftrees.js +343 -0
  750. package/node_modules/pako/lib/zlib/messages.js +32 -0
  751. package/node_modules/pako/lib/zlib/trees.js +1222 -0
  752. package/node_modules/pako/lib/zlib/zstream.js +47 -0
  753. package/node_modules/pako/package.json +44 -0
  754. package/node_modules/process-nextick-args/index.js +45 -0
  755. package/node_modules/process-nextick-args/license.md +19 -0
  756. package/node_modules/process-nextick-args/package.json +25 -0
  757. package/node_modules/process-nextick-args/readme.md +18 -0
  758. package/node_modules/readable-stream/.travis.yml +34 -0
  759. package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  760. package/node_modules/readable-stream/GOVERNANCE.md +136 -0
  761. package/node_modules/readable-stream/LICENSE +47 -0
  762. package/node_modules/readable-stream/README.md +58 -0
  763. package/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  764. package/node_modules/readable-stream/duplex-browser.js +1 -0
  765. package/node_modules/readable-stream/duplex.js +1 -0
  766. package/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  767. package/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  768. package/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  769. package/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  770. package/node_modules/readable-stream/lib/_stream_writable.js +685 -0
  771. package/node_modules/readable-stream/lib/internal/streams/BufferList.js +78 -0
  772. package/node_modules/readable-stream/lib/internal/streams/destroy.js +84 -0
  773. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  774. package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  775. package/node_modules/readable-stream/package.json +52 -0
  776. package/node_modules/readable-stream/passthrough.js +1 -0
  777. package/node_modules/readable-stream/readable-browser.js +7 -0
  778. package/node_modules/readable-stream/readable.js +19 -0
  779. package/node_modules/readable-stream/transform.js +1 -0
  780. package/node_modules/readable-stream/writable-browser.js +1 -0
  781. package/node_modules/readable-stream/writable.js +8 -0
  782. package/node_modules/safe-buffer/LICENSE +21 -0
  783. package/node_modules/safe-buffer/README.md +584 -0
  784. package/node_modules/safe-buffer/index.d.ts +187 -0
  785. package/node_modules/safe-buffer/index.js +62 -0
  786. package/node_modules/safe-buffer/package.json +37 -0
  787. package/node_modules/setimmediate/LICENSE.txt +20 -0
  788. package/node_modules/setimmediate/package.json +30 -0
  789. package/node_modules/setimmediate/setImmediate.js +186 -0
  790. package/node_modules/string_decoder/.travis.yml +50 -0
  791. package/node_modules/string_decoder/LICENSE +48 -0
  792. package/node_modules/string_decoder/README.md +47 -0
  793. package/node_modules/string_decoder/lib/string_decoder.js +296 -0
  794. package/node_modules/string_decoder/package.json +31 -0
  795. package/node_modules/util-deprecate/History.md +16 -0
  796. package/node_modules/util-deprecate/LICENSE +24 -0
  797. package/node_modules/util-deprecate/README.md +53 -0
  798. package/node_modules/util-deprecate/browser.js +67 -0
  799. package/node_modules/util-deprecate/node.js +6 -0
  800. package/node_modules/util-deprecate/package.json +27 -0
  801. package/node_modules/zod/README.md +29 -2
  802. package/node_modules/zod/compile.cjs +96 -0
  803. package/node_modules/zod/compile.d.cts +1 -0
  804. package/node_modules/zod/compile.d.ts +1 -0
  805. package/node_modules/zod/compile.js +52 -0
  806. package/node_modules/zod/index.cjs +21 -2
  807. package/node_modules/zod/index.d.cts +1 -2
  808. package/node_modules/zod/index.d.ts +1 -2
  809. package/node_modules/zod/index.js +5 -2
  810. package/node_modules/zod/locales/index.cjs +19 -0
  811. package/node_modules/zod/mini/index.cjs +19 -0
  812. package/node_modules/zod/package.json +20 -8
  813. package/node_modules/zod/src/compile.ts +56 -0
  814. package/node_modules/zod/src/index.ts +5 -2
  815. package/node_modules/zod/src/v3/ZodError.ts +22 -12
  816. package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
  817. package/node_modules/zod/src/v3/tests/error.test.ts +35 -0
  818. package/node_modules/zod/src/v3/tests/intersection.test.ts +18 -0
  819. package/node_modules/zod/src/v3/tests/language-server.test.ts +1 -2
  820. package/node_modules/zod/src/v3/tests/object.test.ts +3 -6
  821. package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -80
  822. package/node_modules/zod/src/v3/tests/string.test.ts +6 -0
  823. package/node_modules/zod/src/v3/types.ts +5 -5
  824. package/node_modules/zod/src/v4/classic/checks.ts +1 -0
  825. package/node_modules/zod/src/v4/classic/compat.ts +26 -18
  826. package/node_modules/zod/src/v4/classic/deep-partial.ts +76 -0
  827. package/node_modules/zod/src/v4/classic/errors.ts +59 -44
  828. package/node_modules/zod/src/v4/classic/external.ts +14 -9
  829. package/node_modules/zod/src/v4/classic/from-json-schema.ts +363 -78
  830. package/node_modules/zod/src/v4/classic/in-out.ts +45 -0
  831. package/node_modules/zod/src/v4/classic/index.ts +2 -2
  832. package/node_modules/zod/src/v4/classic/iso.ts +2 -72
  833. package/node_modules/zod/src/v4/classic/parse.ts +10 -4
  834. package/node_modules/zod/src/v4/classic/schemas.ts +640 -375
  835. package/node_modules/zod/src/v4/classic/tests/apply.test.ts +27 -0
  836. package/node_modules/zod/src/v4/classic/tests/array.test.ts +2 -2
  837. package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +186 -0
  838. package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +36 -1
  839. package/node_modules/zod/src/v4/classic/tests/catch.test.ts +278 -0
  840. package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +1 -2
  841. package/node_modules/zod/src/v4/classic/tests/codec.test.ts +2 -1
  842. package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +3 -3
  843. package/node_modules/zod/src/v4/classic/tests/credit-card.test.ts +76 -0
  844. package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +985 -0
  845. package/node_modules/zod/src/v4/classic/tests/date.test.ts +30 -0
  846. package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +32 -18
  847. package/node_modules/zod/src/v4/classic/tests/deep-partial.test.ts +380 -0
  848. package/node_modules/zod/src/v4/classic/tests/default-locale.test.ts +32 -0
  849. package/node_modules/zod/src/v4/classic/tests/default.test.ts +46 -0
  850. package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +31 -7
  851. package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +261 -13
  852. package/node_modules/zod/src/v4/classic/tests/enum.test.ts +20 -0
  853. package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +112 -2
  854. package/node_modules/zod/src/v4/classic/tests/error.test.ts +403 -6
  855. package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +582 -10
  856. package/node_modules/zod/src/v4/classic/tests/function.test.ts +31 -0
  857. package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +2 -9
  858. package/node_modules/zod/src/v4/classic/tests/hash.test.ts +1 -2
  859. package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
  860. package/node_modules/zod/src/v4/classic/tests/in-out.test.ts +159 -0
  861. package/node_modules/zod/src/v4/classic/tests/index.test.ts +21 -2
  862. package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +319 -0
  863. package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +67 -0
  864. package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +136 -0
  865. package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +215 -0
  866. package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +3 -10
  867. package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +36 -1
  868. package/node_modules/zod/src/v4/classic/tests/literal.test.ts +12 -1
  869. package/node_modules/zod/src/v4/classic/tests/map.test.ts +12 -0
  870. package/node_modules/zod/src/v4/classic/tests/number.test.ts +85 -9
  871. package/node_modules/zod/src/v4/classic/tests/object.test.ts +301 -12
  872. package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +235 -0
  873. package/node_modules/zod/src/v4/classic/tests/optional.test.ts +49 -16
  874. package/node_modules/zod/src/v4/classic/tests/partial.test.ts +51 -4
  875. package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +70 -0
  876. package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +20 -2
  877. package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
  878. package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -68
  879. package/node_modules/zod/src/v4/classic/tests/record.test.ts +186 -18
  880. package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +79 -3
  881. package/node_modules/zod/src/v4/classic/tests/redos.test.ts +68 -0
  882. package/node_modules/zod/src/v4/classic/tests/refine.test.ts +60 -0
  883. package/node_modules/zod/src/v4/classic/tests/set.test.ts +9 -0
  884. package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
  885. package/node_modules/zod/src/v4/classic/tests/string.test.ts +222 -6
  886. package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +18 -0
  887. package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +44 -3
  888. package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1812 -204
  889. package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +45 -30
  890. package/node_modules/zod/src/v4/classic/tests/union.test.ts +39 -2
  891. package/node_modules/zod/src/v4/classic/tests/validate.test.ts +645 -0
  892. package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
  893. package/node_modules/zod/src/v4/core/api.ts +87 -35
  894. package/node_modules/zod/src/v4/core/checks.ts +119 -146
  895. package/node_modules/zod/src/v4/core/compile.ts +2313 -0
  896. package/node_modules/zod/src/v4/core/core.ts +99 -22
  897. package/node_modules/zod/src/v4/core/doc.ts +17 -9
  898. package/node_modules/zod/src/v4/core/errors.ts +113 -25
  899. package/node_modules/zod/src/v4/core/index.ts +3 -0
  900. package/node_modules/zod/src/v4/core/json-schema-generator.ts +8 -3
  901. package/node_modules/zod/src/v4/core/json-schema-processors.ts +424 -156
  902. package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
  903. package/node_modules/zod/src/v4/core/memoizer.ts +331 -0
  904. package/node_modules/zod/src/v4/core/parse.ts +164 -50
  905. package/node_modules/zod/src/v4/core/regexes.ts +42 -15
  906. package/node_modules/zod/src/v4/core/registries.ts +2 -2
  907. package/node_modules/zod/src/v4/core/schemas.ts +1000 -538
  908. package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
  909. package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +1004 -0
  910. package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
  911. package/node_modules/zod/src/v4/core/tests/compile-global.test.ts +89 -0
  912. package/node_modules/zod/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
  913. package/node_modules/zod/src/v4/core/tests/compile-stats.test.ts +34 -0
  914. package/node_modules/zod/src/v4/core/tests/compile.test.ts +2036 -0
  915. package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
  916. package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +1 -2
  917. package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +1 -2
  918. package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +3 -3
  919. package/node_modules/zod/src/v4/core/tests/locales/parity.test.ts +42 -0
  920. package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
  921. package/node_modules/zod/src/v4/core/tests/locales/tk.test.ts +69 -0
  922. package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
  923. package/node_modules/zod/src/v4/core/tests/treeshake.test.ts +51 -0
  924. package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +133 -0
  925. package/node_modules/zod/src/v4/core/to-json-schema.ts +283 -48
  926. package/node_modules/zod/src/v4/core/util.ts +454 -157
  927. package/node_modules/zod/src/v4/core/versions.ts +2 -2
  928. package/node_modules/zod/src/v4/core/visit.ts +193 -0
  929. package/node_modules/zod/src/v4/index.ts +3 -3
  930. package/node_modules/zod/src/v4/locales/ar.ts +5 -0
  931. package/node_modules/zod/src/v4/locales/az.ts +5 -0
  932. package/node_modules/zod/src/v4/locales/be.ts +12 -0
  933. package/node_modules/zod/src/v4/locales/bg.ts +5 -0
  934. package/node_modules/zod/src/v4/locales/bn.ts +123 -0
  935. package/node_modules/zod/src/v4/locales/ca.ts +5 -0
  936. package/node_modules/zod/src/v4/locales/ckb.ts +140 -0
  937. package/node_modules/zod/src/v4/locales/cs.ts +5 -0
  938. package/node_modules/zod/src/v4/locales/da.ts +7 -2
  939. package/node_modules/zod/src/v4/locales/de.ts +5 -0
  940. package/node_modules/zod/src/v4/locales/el.ts +3 -0
  941. package/node_modules/zod/src/v4/locales/en.ts +17 -4
  942. package/node_modules/zod/src/v4/locales/eo.ts +5 -0
  943. package/node_modules/zod/src/v4/locales/es.ts +4 -0
  944. package/node_modules/zod/src/v4/locales/fa.ts +5 -0
  945. package/node_modules/zod/src/v4/locales/fi.ts +5 -0
  946. package/node_modules/zod/src/v4/locales/fr-CA.ts +5 -0
  947. package/node_modules/zod/src/v4/locales/fr.ts +21 -14
  948. package/node_modules/zod/src/v4/locales/gu.ts +123 -0
  949. package/node_modules/zod/src/v4/locales/he.ts +8 -1
  950. package/node_modules/zod/src/v4/locales/hi.ts +126 -0
  951. package/node_modules/zod/src/v4/locales/hr.ts +4 -0
  952. package/node_modules/zod/src/v4/locales/hu.ts +5 -0
  953. package/node_modules/zod/src/v4/locales/hy.ts +11 -0
  954. package/node_modules/zod/src/v4/locales/id.ts +5 -0
  955. package/node_modules/zod/src/v4/locales/index.ts +11 -0
  956. package/node_modules/zod/src/v4/locales/is.ts +5 -0
  957. package/node_modules/zod/src/v4/locales/it.ts +5 -0
  958. package/node_modules/zod/src/v4/locales/ja.ts +5 -0
  959. package/node_modules/zod/src/v4/locales/ka.ts +5 -0
  960. package/node_modules/zod/src/v4/locales/km.ts +5 -0
  961. package/node_modules/zod/src/v4/locales/kn.ts +126 -0
  962. package/node_modules/zod/src/v4/locales/ko.ts +5 -0
  963. package/node_modules/zod/src/v4/locales/lt.ts +4 -0
  964. package/node_modules/zod/src/v4/locales/mk.ts +5 -0
  965. package/node_modules/zod/src/v4/locales/ms.ts +5 -0
  966. package/node_modules/zod/src/v4/locales/ne.ts +128 -0
  967. package/node_modules/zod/src/v4/locales/nl.ts +5 -0
  968. package/node_modules/zod/src/v4/locales/nn.ts +121 -0
  969. package/node_modules/zod/src/v4/locales/no.ts +7 -2
  970. package/node_modules/zod/src/v4/locales/ota.ts +5 -0
  971. package/node_modules/zod/src/v4/locales/pl.ts +5 -0
  972. package/node_modules/zod/src/v4/locales/ps.ts +5 -0
  973. package/node_modules/zod/src/v4/locales/pt-BR.ts +161 -0
  974. package/node_modules/zod/src/v4/locales/pt.ts +101 -58
  975. package/node_modules/zod/src/v4/locales/ro.ts +3 -0
  976. package/node_modules/zod/src/v4/locales/ru.ts +12 -0
  977. package/node_modules/zod/src/v4/locales/sk.ts +123 -0
  978. package/node_modules/zod/src/v4/locales/sl.ts +5 -0
  979. package/node_modules/zod/src/v4/locales/sv.ts +7 -2
  980. package/node_modules/zod/src/v4/locales/ta.ts +5 -0
  981. package/node_modules/zod/src/v4/locales/tg.ts +135 -0
  982. package/node_modules/zod/src/v4/locales/th.ts +5 -0
  983. package/node_modules/zod/src/v4/locales/tk.ts +113 -0
  984. package/node_modules/zod/src/v4/locales/tr.ts +5 -0
  985. package/node_modules/zod/src/v4/locales/uk.ts +5 -0
  986. package/node_modules/zod/src/v4/locales/ur.ts +5 -0
  987. package/node_modules/zod/src/v4/locales/uz.ts +3 -0
  988. package/node_modules/zod/src/v4/locales/vi.ts +5 -0
  989. package/node_modules/zod/src/v4/locales/yo.ts +5 -0
  990. package/node_modules/zod/src/v4/locales/zh-CN.ts +5 -0
  991. package/node_modules/zod/src/v4/locales/zh-TW.ts +5 -0
  992. package/node_modules/zod/src/v4/mini/checks.ts +1 -0
  993. package/node_modules/zod/src/v4/mini/deep-partial.ts +73 -0
  994. package/node_modules/zod/src/v4/mini/external.ts +12 -1
  995. package/node_modules/zod/src/v4/mini/in-out.ts +45 -0
  996. package/node_modules/zod/src/v4/mini/parse.ts +2 -0
  997. package/node_modules/zod/src/v4/mini/schemas.ts +167 -63
  998. package/node_modules/zod/src/v4/mini/tests/apply.test.ts +33 -0
  999. package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +62 -1
  1000. package/node_modules/zod/src/v4/mini/tests/checks.test.ts +14 -0
  1001. package/node_modules/zod/src/v4/mini/tests/codec.test.ts +35 -1
  1002. package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
  1003. package/node_modules/zod/src/v4/mini/tests/cyclic-data.test.ts +84 -0
  1004. package/node_modules/zod/src/v4/mini/tests/deep-partial.test.ts +54 -0
  1005. package/node_modules/zod/src/v4/mini/tests/error.test.ts +23 -4
  1006. package/node_modules/zod/src/v4/mini/tests/functions.test.ts +9 -0
  1007. package/node_modules/zod/src/v4/mini/tests/index.test.ts +158 -5
  1008. package/node_modules/zod/src/v4/mini/tests/number.test.ts +14 -0
  1009. package/node_modules/zod/src/v4/mini/tests/object.test.ts +65 -0
  1010. package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +16 -0
  1011. package/node_modules/zod/src/v4/mini/tests/string.test.ts +44 -0
  1012. package/node_modules/zod/v3/ZodError.cjs +41 -12
  1013. package/node_modules/zod/v3/ZodError.d.cts +1 -1
  1014. package/node_modules/zod/v3/ZodError.d.ts +1 -1
  1015. package/node_modules/zod/v3/ZodError.js +22 -12
  1016. package/node_modules/zod/v3/errors.cjs +19 -0
  1017. package/node_modules/zod/v3/external.cjs +19 -0
  1018. package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
  1019. package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
  1020. package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
  1021. package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
  1022. package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
  1023. package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
  1024. package/node_modules/zod/v3/helpers/util.cjs +19 -0
  1025. package/node_modules/zod/v3/index.cjs +19 -0
  1026. package/node_modules/zod/v3/standard-schema.cjs +19 -0
  1027. package/node_modules/zod/v3/types.cjs +26 -5
  1028. package/node_modules/zod/v3/types.js +7 -5
  1029. package/node_modules/zod/v4/classic/checks.cjs +21 -1
  1030. package/node_modules/zod/v4/classic/checks.d.cts +1 -1
  1031. package/node_modules/zod/v4/classic/checks.d.ts +1 -1
  1032. package/node_modules/zod/v4/classic/checks.js +1 -1
  1033. package/node_modules/zod/v4/classic/coerce.cjs +19 -0
  1034. package/node_modules/zod/v4/classic/compat.cjs +19 -0
  1035. package/node_modules/zod/v4/classic/compat.d.cts +9 -11
  1036. package/node_modules/zod/v4/classic/compat.d.ts +9 -11
  1037. package/node_modules/zod/v4/classic/deep-partial.cjs +58 -0
  1038. package/node_modules/zod/v4/classic/deep-partial.d.cts +14 -0
  1039. package/node_modules/zod/v4/classic/deep-partial.d.ts +14 -0
  1040. package/node_modules/zod/v4/classic/deep-partial.js +13 -0
  1041. package/node_modules/zod/v4/classic/errors.cjs +62 -34
  1042. package/node_modules/zod/v4/classic/errors.d.cts +3 -4
  1043. package/node_modules/zod/v4/classic/errors.d.ts +3 -4
  1044. package/node_modules/zod/v4/classic/errors.js +43 -34
  1045. package/node_modules/zod/v4/classic/external.cjs +51 -27
  1046. package/node_modules/zod/v4/classic/external.d.cts +5 -2
  1047. package/node_modules/zod/v4/classic/external.d.ts +5 -2
  1048. package/node_modules/zod/v4/classic/external.js +5 -8
  1049. package/node_modules/zod/v4/classic/from-json-schema.cjs +376 -75
  1050. package/node_modules/zod/v4/classic/from-json-schema.js +357 -75
  1051. package/node_modules/zod/v4/classic/in-out.cjs +82 -0
  1052. package/node_modules/zod/v4/classic/in-out.d.cts +8 -0
  1053. package/node_modules/zod/v4/classic/in-out.d.ts +8 -0
  1054. package/node_modules/zod/v4/classic/in-out.js +36 -0
  1055. package/node_modules/zod/v4/classic/index.cjs +21 -2
  1056. package/node_modules/zod/v4/classic/index.d.cts +1 -2
  1057. package/node_modules/zod/v4/classic/index.d.ts +1 -2
  1058. package/node_modules/zod/v4/classic/index.js +2 -2
  1059. package/node_modules/zod/v4/classic/iso.cjs +30 -22
  1060. package/node_modules/zod/v4/classic/iso.d.cts +2 -17
  1061. package/node_modules/zod/v4/classic/iso.d.ts +2 -17
  1062. package/node_modules/zod/v4/classic/iso.js +2 -17
  1063. package/node_modules/zod/v4/classic/parse.cjs +23 -1
  1064. package/node_modules/zod/v4/classic/parse.d.cts +17 -4
  1065. package/node_modules/zod/v4/classic/parse.d.ts +17 -4
  1066. package/node_modules/zod/v4/classic/parse.js +1 -0
  1067. package/node_modules/zod/v4/classic/schemas.cjs +591 -426
  1068. package/node_modules/zod/v4/classic/schemas.d.cts +68 -19
  1069. package/node_modules/zod/v4/classic/schemas.d.ts +68 -19
  1070. package/node_modules/zod/v4/classic/schemas.js +564 -424
  1071. package/node_modules/zod/v4/core/api.cjs +66 -24
  1072. package/node_modules/zod/v4/core/api.d.cts +22 -12
  1073. package/node_modules/zod/v4/core/api.d.ts +22 -12
  1074. package/node_modules/zod/v4/core/api.js +44 -24
  1075. package/node_modules/zod/v4/core/checks.cjs +88 -128
  1076. package/node_modules/zod/v4/core/checks.d.cts +29 -13
  1077. package/node_modules/zod/v4/core/checks.d.ts +29 -13
  1078. package/node_modules/zod/v4/core/checks.js +68 -127
  1079. package/node_modules/zod/v4/core/compile.cjs +1908 -0
  1080. package/node_modules/zod/v4/core/compile.d.cts +65 -0
  1081. package/node_modules/zod/v4/core/compile.d.ts +65 -0
  1082. package/node_modules/zod/v4/core/compile.js +1858 -0
  1083. package/node_modules/zod/v4/core/core.cjs +101 -19
  1084. package/node_modules/zod/v4/core/core.d.cts +16 -4
  1085. package/node_modules/zod/v4/core/core.d.ts +16 -4
  1086. package/node_modules/zod/v4/core/core.js +83 -20
  1087. package/node_modules/zod/v4/core/doc.cjs +31 -9
  1088. package/node_modules/zod/v4/core/doc.d.cts +3 -1
  1089. package/node_modules/zod/v4/core/doc.d.ts +3 -1
  1090. package/node_modules/zod/v4/core/doc.js +12 -9
  1091. package/node_modules/zod/v4/core/errors.cjs +126 -25
  1092. package/node_modules/zod/v4/core/errors.d.cts +4 -0
  1093. package/node_modules/zod/v4/core/errors.d.ts +4 -0
  1094. package/node_modules/zod/v4/core/errors.js +107 -25
  1095. package/node_modules/zod/v4/core/index.cjs +24 -1
  1096. package/node_modules/zod/v4/core/index.d.cts +3 -0
  1097. package/node_modules/zod/v4/core/index.d.ts +3 -0
  1098. package/node_modules/zod/v4/core/index.js +3 -0
  1099. package/node_modules/zod/v4/core/json-schema-generator.cjs +24 -1
  1100. package/node_modules/zod/v4/core/json-schema-generator.d.cts +2 -2
  1101. package/node_modules/zod/v4/core/json-schema-generator.d.ts +2 -2
  1102. package/node_modules/zod/v4/core/json-schema-generator.js +6 -2
  1103. package/node_modules/zod/v4/core/json-schema-processors.cjs +441 -156
  1104. package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
  1105. package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
  1106. package/node_modules/zod/v4/core/json-schema-processors.js +400 -158
  1107. package/node_modules/zod/v4/core/json-schema.cjs +19 -0
  1108. package/node_modules/zod/v4/core/json-schema.d.cts +2 -1
  1109. package/node_modules/zod/v4/core/json-schema.d.ts +2 -1
  1110. package/node_modules/zod/v4/core/memoizer.cjs +360 -0
  1111. package/node_modules/zod/v4/core/memoizer.d.cts +15 -0
  1112. package/node_modules/zod/v4/core/memoizer.d.ts +15 -0
  1113. package/node_modules/zod/v4/core/memoizer.js +311 -0
  1114. package/node_modules/zod/v4/core/parse.cjs +148 -46
  1115. package/node_modules/zod/v4/core/parse.d.cts +14 -11
  1116. package/node_modules/zod/v4/core/parse.d.ts +14 -11
  1117. package/node_modules/zod/v4/core/parse.js +127 -45
  1118. package/node_modules/zod/v4/core/regexes.cjs +54 -17
  1119. package/node_modules/zod/v4/core/regexes.d.cts +5 -0
  1120. package/node_modules/zod/v4/core/regexes.d.ts +5 -0
  1121. package/node_modules/zod/v4/core/regexes.js +32 -15
  1122. package/node_modules/zod/v4/core/registries.cjs +19 -0
  1123. package/node_modules/zod/v4/core/registries.js +2 -2
  1124. package/node_modules/zod/v4/core/schemas.cjs +785 -386
  1125. package/node_modules/zod/v4/core/schemas.d.cts +123 -34
  1126. package/node_modules/zod/v4/core/schemas.d.ts +123 -34
  1127. package/node_modules/zod/v4/core/schemas.js +753 -386
  1128. package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
  1129. package/node_modules/zod/v4/core/to-json-schema.cjs +269 -45
  1130. package/node_modules/zod/v4/core/to-json-schema.d.cts +45 -5
  1131. package/node_modules/zod/v4/core/to-json-schema.d.ts +45 -5
  1132. package/node_modules/zod/v4/core/to-json-schema.js +247 -44
  1133. package/node_modules/zod/v4/core/util.cjs +372 -157
  1134. package/node_modules/zod/v4/core/util.d.cts +79 -1
  1135. package/node_modules/zod/v4/core/util.d.ts +79 -1
  1136. package/node_modules/zod/v4/core/util.js +341 -156
  1137. package/node_modules/zod/v4/core/versions.cjs +21 -2
  1138. package/node_modules/zod/v4/core/versions.d.cts +1 -1
  1139. package/node_modules/zod/v4/core/versions.d.ts +1 -1
  1140. package/node_modules/zod/v4/core/versions.js +2 -2
  1141. package/node_modules/zod/v4/core/visit.cjs +214 -0
  1142. package/node_modules/zod/v4/core/visit.d.cts +30 -0
  1143. package/node_modules/zod/v4/core/visit.d.ts +30 -0
  1144. package/node_modules/zod/v4/core/visit.js +169 -0
  1145. package/node_modules/zod/v4/index.cjs +34 -5
  1146. package/node_modules/zod/v4/index.d.cts +2 -2
  1147. package/node_modules/zod/v4/index.d.ts +2 -2
  1148. package/node_modules/zod/v4/index.js +3 -2
  1149. package/node_modules/zod/v4/locales/ar.cjs +5 -0
  1150. package/node_modules/zod/v4/locales/ar.js +5 -0
  1151. package/node_modules/zod/v4/locales/az.cjs +5 -0
  1152. package/node_modules/zod/v4/locales/az.js +5 -0
  1153. package/node_modules/zod/v4/locales/be.cjs +12 -0
  1154. package/node_modules/zod/v4/locales/be.js +12 -0
  1155. package/node_modules/zod/v4/locales/bg.cjs +5 -0
  1156. package/node_modules/zod/v4/locales/bg.js +5 -0
  1157. package/node_modules/zod/v4/locales/bn.cjs +140 -0
  1158. package/node_modules/zod/v4/locales/bn.d.cts +5 -0
  1159. package/node_modules/zod/v4/locales/bn.d.ts +4 -0
  1160. package/node_modules/zod/v4/locales/bn.js +113 -0
  1161. package/node_modules/zod/v4/locales/ca.cjs +5 -0
  1162. package/node_modules/zod/v4/locales/ca.js +5 -0
  1163. package/node_modules/zod/v4/locales/ckb.cjs +160 -0
  1164. package/node_modules/zod/v4/locales/ckb.d.cts +5 -0
  1165. package/node_modules/zod/v4/locales/ckb.d.ts +4 -0
  1166. package/node_modules/zod/v4/locales/ckb.js +133 -0
  1167. package/node_modules/zod/v4/locales/cs.cjs +5 -0
  1168. package/node_modules/zod/v4/locales/cs.js +5 -0
  1169. package/node_modules/zod/v4/locales/da.cjs +7 -2
  1170. package/node_modules/zod/v4/locales/da.js +7 -2
  1171. package/node_modules/zod/v4/locales/de.cjs +5 -0
  1172. package/node_modules/zod/v4/locales/de.js +5 -0
  1173. package/node_modules/zod/v4/locales/el.cjs +3 -0
  1174. package/node_modules/zod/v4/locales/el.js +3 -0
  1175. package/node_modules/zod/v4/locales/en.cjs +16 -4
  1176. package/node_modules/zod/v4/locales/en.js +16 -4
  1177. package/node_modules/zod/v4/locales/eo.cjs +5 -0
  1178. package/node_modules/zod/v4/locales/eo.js +5 -0
  1179. package/node_modules/zod/v4/locales/es.cjs +4 -0
  1180. package/node_modules/zod/v4/locales/es.js +4 -0
  1181. package/node_modules/zod/v4/locales/fa.cjs +5 -0
  1182. package/node_modules/zod/v4/locales/fa.js +5 -0
  1183. package/node_modules/zod/v4/locales/fi.cjs +5 -0
  1184. package/node_modules/zod/v4/locales/fi.js +5 -0
  1185. package/node_modules/zod/v4/locales/fr-CA.cjs +5 -0
  1186. package/node_modules/zod/v4/locales/fr-CA.js +5 -0
  1187. package/node_modules/zod/v4/locales/fr.cjs +18 -14
  1188. package/node_modules/zod/v4/locales/fr.js +18 -14
  1189. package/node_modules/zod/v4/locales/gu.cjs +140 -0
  1190. package/node_modules/zod/v4/locales/gu.d.cts +5 -0
  1191. package/node_modules/zod/v4/locales/gu.d.ts +4 -0
  1192. package/node_modules/zod/v4/locales/gu.js +113 -0
  1193. package/node_modules/zod/v4/locales/he.cjs +7 -0
  1194. package/node_modules/zod/v4/locales/he.js +7 -0
  1195. package/node_modules/zod/v4/locales/hi.cjs +138 -0
  1196. package/node_modules/zod/v4/locales/hi.d.cts +5 -0
  1197. package/node_modules/zod/v4/locales/hi.d.ts +4 -0
  1198. package/node_modules/zod/v4/locales/hi.js +111 -0
  1199. package/node_modules/zod/v4/locales/hr.cjs +4 -0
  1200. package/node_modules/zod/v4/locales/hr.js +4 -0
  1201. package/node_modules/zod/v4/locales/hu.cjs +5 -0
  1202. package/node_modules/zod/v4/locales/hu.js +5 -0
  1203. package/node_modules/zod/v4/locales/hy.cjs +11 -0
  1204. package/node_modules/zod/v4/locales/hy.js +11 -0
  1205. package/node_modules/zod/v4/locales/id.cjs +5 -0
  1206. package/node_modules/zod/v4/locales/id.js +5 -0
  1207. package/node_modules/zod/v4/locales/index.cjs +43 -2
  1208. package/node_modules/zod/v4/locales/index.d.cts +11 -0
  1209. package/node_modules/zod/v4/locales/index.d.ts +11 -0
  1210. package/node_modules/zod/v4/locales/index.js +11 -0
  1211. package/node_modules/zod/v4/locales/is.cjs +5 -0
  1212. package/node_modules/zod/v4/locales/is.js +5 -0
  1213. package/node_modules/zod/v4/locales/it.cjs +5 -0
  1214. package/node_modules/zod/v4/locales/it.js +5 -0
  1215. package/node_modules/zod/v4/locales/ja.cjs +5 -0
  1216. package/node_modules/zod/v4/locales/ja.js +5 -0
  1217. package/node_modules/zod/v4/locales/ka.cjs +5 -0
  1218. package/node_modules/zod/v4/locales/ka.js +5 -0
  1219. package/node_modules/zod/v4/locales/km.cjs +5 -0
  1220. package/node_modules/zod/v4/locales/km.js +5 -0
  1221. package/node_modules/zod/v4/locales/kn.cjs +143 -0
  1222. package/node_modules/zod/v4/locales/kn.d.cts +5 -0
  1223. package/node_modules/zod/v4/locales/kn.d.ts +4 -0
  1224. package/node_modules/zod/v4/locales/kn.js +116 -0
  1225. package/node_modules/zod/v4/locales/ko.cjs +5 -0
  1226. package/node_modules/zod/v4/locales/ko.js +5 -0
  1227. package/node_modules/zod/v4/locales/lt.cjs +4 -0
  1228. package/node_modules/zod/v4/locales/lt.js +4 -0
  1229. package/node_modules/zod/v4/locales/mk.cjs +5 -0
  1230. package/node_modules/zod/v4/locales/mk.js +5 -0
  1231. package/node_modules/zod/v4/locales/ms.cjs +5 -0
  1232. package/node_modules/zod/v4/locales/ms.js +5 -0
  1233. package/node_modules/zod/v4/locales/ne.cjs +138 -0
  1234. package/node_modules/zod/v4/locales/ne.d.cts +5 -0
  1235. package/node_modules/zod/v4/locales/ne.d.ts +4 -0
  1236. package/node_modules/zod/v4/locales/ne.js +111 -0
  1237. package/node_modules/zod/v4/locales/nl.cjs +5 -0
  1238. package/node_modules/zod/v4/locales/nl.js +5 -0
  1239. package/node_modules/zod/v4/locales/nn.cjs +140 -0
  1240. package/node_modules/zod/v4/locales/nn.d.cts +5 -0
  1241. package/node_modules/zod/v4/locales/nn.d.ts +4 -0
  1242. package/node_modules/zod/v4/locales/nn.js +113 -0
  1243. package/node_modules/zod/v4/locales/no.cjs +7 -2
  1244. package/node_modules/zod/v4/locales/no.js +7 -2
  1245. package/node_modules/zod/v4/locales/ota.cjs +5 -0
  1246. package/node_modules/zod/v4/locales/ota.js +5 -0
  1247. package/node_modules/zod/v4/locales/pl.cjs +5 -0
  1248. package/node_modules/zod/v4/locales/pl.js +5 -0
  1249. package/node_modules/zod/v4/locales/ps.cjs +5 -0
  1250. package/node_modules/zod/v4/locales/ps.js +5 -0
  1251. package/node_modules/zod/v4/locales/pt-BR.cjs +170 -0
  1252. package/node_modules/zod/v4/locales/pt-BR.d.cts +5 -0
  1253. package/node_modules/zod/v4/locales/pt-BR.d.ts +4 -0
  1254. package/node_modules/zod/v4/locales/pt-BR.js +143 -0
  1255. package/node_modules/zod/v4/locales/pt.cjs +89 -55
  1256. package/node_modules/zod/v4/locales/pt.js +89 -55
  1257. package/node_modules/zod/v4/locales/ro.cjs +3 -0
  1258. package/node_modules/zod/v4/locales/ro.js +3 -0
  1259. package/node_modules/zod/v4/locales/ru.cjs +12 -0
  1260. package/node_modules/zod/v4/locales/ru.js +12 -0
  1261. package/node_modules/zod/v4/locales/sk.cjs +143 -0
  1262. package/node_modules/zod/v4/locales/sk.d.cts +5 -0
  1263. package/node_modules/zod/v4/locales/sk.d.ts +4 -0
  1264. package/node_modules/zod/v4/locales/sk.js +116 -0
  1265. package/node_modules/zod/v4/locales/sl.cjs +5 -0
  1266. package/node_modules/zod/v4/locales/sl.js +5 -0
  1267. package/node_modules/zod/v4/locales/sv.cjs +7 -2
  1268. package/node_modules/zod/v4/locales/sv.js +7 -2
  1269. package/node_modules/zod/v4/locales/ta.cjs +5 -0
  1270. package/node_modules/zod/v4/locales/ta.js +5 -0
  1271. package/node_modules/zod/v4/locales/tg.cjs +144 -0
  1272. package/node_modules/zod/v4/locales/tg.d.cts +5 -0
  1273. package/node_modules/zod/v4/locales/tg.d.ts +4 -0
  1274. package/node_modules/zod/v4/locales/tg.js +117 -0
  1275. package/node_modules/zod/v4/locales/th.cjs +5 -0
  1276. package/node_modules/zod/v4/locales/th.js +5 -0
  1277. package/node_modules/zod/v4/locales/tk.cjs +134 -0
  1278. package/node_modules/zod/v4/locales/tk.d.cts +5 -0
  1279. package/node_modules/zod/v4/locales/tk.d.ts +4 -0
  1280. package/node_modules/zod/v4/locales/tk.js +107 -0
  1281. package/node_modules/zod/v4/locales/tr.cjs +5 -0
  1282. package/node_modules/zod/v4/locales/tr.js +5 -0
  1283. package/node_modules/zod/v4/locales/uk.cjs +5 -0
  1284. package/node_modules/zod/v4/locales/uk.js +5 -0
  1285. package/node_modules/zod/v4/locales/ur.cjs +5 -0
  1286. package/node_modules/zod/v4/locales/ur.js +5 -0
  1287. package/node_modules/zod/v4/locales/uz.cjs +3 -0
  1288. package/node_modules/zod/v4/locales/uz.js +3 -0
  1289. package/node_modules/zod/v4/locales/vi.cjs +5 -0
  1290. package/node_modules/zod/v4/locales/vi.js +5 -0
  1291. package/node_modules/zod/v4/locales/yo.cjs +5 -0
  1292. package/node_modules/zod/v4/locales/yo.js +5 -0
  1293. package/node_modules/zod/v4/locales/zh-CN.cjs +5 -0
  1294. package/node_modules/zod/v4/locales/zh-CN.js +5 -0
  1295. package/node_modules/zod/v4/locales/zh-TW.cjs +5 -0
  1296. package/node_modules/zod/v4/locales/zh-TW.js +5 -0
  1297. package/node_modules/zod/v4/mini/checks.cjs +21 -1
  1298. package/node_modules/zod/v4/mini/checks.d.cts +1 -1
  1299. package/node_modules/zod/v4/mini/checks.d.ts +1 -1
  1300. package/node_modules/zod/v4/mini/checks.js +1 -1
  1301. package/node_modules/zod/v4/mini/coerce.cjs +19 -0
  1302. package/node_modules/zod/v4/mini/deep-partial.cjs +58 -0
  1303. package/node_modules/zod/v4/mini/deep-partial.d.cts +14 -0
  1304. package/node_modules/zod/v4/mini/deep-partial.d.ts +14 -0
  1305. package/node_modules/zod/v4/mini/deep-partial.js +13 -0
  1306. package/node_modules/zod/v4/mini/external.cjs +33 -1
  1307. package/node_modules/zod/v4/mini/external.d.cts +5 -2
  1308. package/node_modules/zod/v4/mini/external.d.ts +5 -2
  1309. package/node_modules/zod/v4/mini/external.js +3 -1
  1310. package/node_modules/zod/v4/mini/in-out.cjs +82 -0
  1311. package/node_modules/zod/v4/mini/in-out.d.cts +8 -0
  1312. package/node_modules/zod/v4/mini/in-out.d.ts +8 -0
  1313. package/node_modules/zod/v4/mini/in-out.js +36 -0
  1314. package/node_modules/zod/v4/mini/index.cjs +19 -0
  1315. package/node_modules/zod/v4/mini/iso.cjs +19 -0
  1316. package/node_modules/zod/v4/mini/parse.cjs +22 -1
  1317. package/node_modules/zod/v4/mini/parse.d.cts +1 -1
  1318. package/node_modules/zod/v4/mini/parse.d.ts +1 -1
  1319. package/node_modules/zod/v4/mini/parse.js +1 -1
  1320. package/node_modules/zod/v4/mini/schemas.cjs +117 -53
  1321. package/node_modules/zod/v4/mini/schemas.d.cts +49 -14
  1322. package/node_modules/zod/v4/mini/schemas.d.ts +49 -14
  1323. package/node_modules/zod/v4/mini/schemas.js +92 -51
  1324. package/node_modules/zod/v4-mini/index.cjs +19 -0
  1325. package/openclaw.plugin.json +35 -42
  1326. package/package.json +10 -6
  1327. package/dist/transport-probes.runtime-DV7x4VWu.js +0 -2
  1328. package/node_modules/zod/src/v4/core/config.ts +0 -15
  1329. /package/dist/{identity-YXPmgFMu.js → .setup/identity-YXPmgFMu.mjs} +0 -0
  1330. /package/dist/{normalize-l_b99hap.js → .setup/normalize-l_b99hap.mjs} +0 -0
  1331. /package/dist/{rolldown-runtime-8H4AJuhK.js → .setup/rolldown-runtime-8H4AJuhK.mjs} +0 -0
@@ -0,0 +1,843 @@
1
+ # Archive extraction
2
+
3
+ `@openclaw/fs-safe/archive` extracts ZIP and TAR archives behind one API, with traversal checks, blocked-link-type rejection, and entry-count and byte budgets. When the native binding is available for the current platform, Rust streams ZIP, TAR, gzip, zstd, and bzip2 while TypeScript remains the sole policy owner; every accepted output is created fd-relative in a private staging root. Extraction then merges through the same safe-open boundary used by direct writes — a symlinked entry can't trick the merge into following an out-of-tree path.
4
+
5
+ TAR admission uses one Rust core compiled into both the native binding and a
6
+ bundled, import-free WebAssembly module. In `off`, or `auto` when the native
7
+ binding is unavailable, extraction and bounded entry reads use that module for
8
+ plain TAR, gzip, zstd, and bzip2. Zstd and bzip2 use bundled WASM builds of the
9
+ same codec implementations used by native; gzip uses Node's built-in decoder.
10
+ These TAR routes work with all optional dependencies omitted and need no
11
+ runtime interpreter, download, install script, or consumer compiler toolchain.
12
+ ZIP fallback still requires optional `jszip`.
13
+
14
+ The shared TAR parser reuses the already-validated owned path for ordinary
15
+ members. Original header names and USTAR prefixes still undergo validation
16
+ even when PAX or GNU metadata supplies an override; effective override paths
17
+ retain their separate checks. Empty USTAR prefixes retain field decoding and
18
+ padding checks; path validation applies to nonempty prefixes. Joining an
19
+ admitted prefix and name with a separator preserves their checked components,
20
+ so the parser does not repeat the same component validation on the joined path.
21
+
22
+ `auto` prefers an available native binding; a native operation failure is
23
+ terminal and never retries through WASM. `require` rejects a missing binding
24
+ with `FsSafeError("helper-unavailable")`, including for zstd/bzip2 suffix
25
+ resolution. The separate `inspectTarArchive()` API still accepts only plain TAR
26
+ and gzip.
27
+
28
+ ```ts
29
+ import { extractArchive, resolveArchiveKind } from "@openclaw/fs-safe/archive";
30
+ ```
31
+
32
+ ## `extractArchive`
33
+
34
+ ```ts
35
+ await extractArchive({
36
+ archivePath: "/srv/uploads/plugin.zip",
37
+ destDir: "/srv/workspace/plugins/plugin",
38
+ kind: "zip", // optional; resolveArchiveKind() can infer
39
+ timeoutMs: 15_000, // hard budget; active destination mutation is joined
40
+ stripComponents: 0, // tar-style strip-leading-dirs
41
+ entryModes: "clamp", // default; use "preserve" for archive rwx bits
42
+ entryUmask: 0, // default; remove these bits from final modes
43
+ entryFilter: ({ path, kind, size }) => "extract",
44
+ onFiltered: "reject-archive", // default; opt into "skip-entry" explicitly
45
+ limits: {
46
+ maxArchiveBytes: 256 * 1024 * 1024,
47
+ maxEntries: 50_000,
48
+ maxExtractedBytes: 512 * 1024 * 1024,
49
+ maxEntryBytes: 256 * 1024 * 1024,
50
+ maxMetaEntryBytes: 1024 * 1024,
51
+ maxEntryPathComponents: 256,
52
+ },
53
+ });
54
+ ```
55
+
56
+ ### Parameters
57
+
58
+ ```ts
59
+ type ExtractArchiveOptions = {
60
+ archivePath: string; // absolute path to the archive
61
+ destDir: string; // absolute destination directory; must already exist
62
+ timeoutMs: number; // positive elapsed-time budget; <= 0/non-finite disables it
63
+ durable?: boolean; // false; opt into syncing published files and directories before completion
64
+ kind?: ArchiveKind; // "zip" | "tar" | "tar-zstd" | "tar-bzip2"
65
+ stripComponents?: number; // strip N leading dirs from entry paths
66
+ tarGzip?: boolean; // when archive is .tar.gz/.tgz
67
+ limits?: ArchiveExtractLimits;
68
+ logger?: ArchiveLogger; // { info?, warn? }
69
+ entryModes?: "clamp" | "preserve";
70
+ entryUmask?: number; // integer 0..0o777; defaults to 0
71
+ entryFilter?: (entry: { path: string; kind: ArchiveEntryKind; size: number }) =>
72
+ "extract" | "skip";
73
+ onFiltered?: "reject-archive" | "skip-entry";
74
+ };
75
+ ```
76
+
77
+ `durable` defaults to `false`. Private staging never fsyncs, and publication copies
78
+ defer opted-in durability until the complete merge succeeds. With `durable: true`, the final pass syncs each
79
+ published file once (at most eight concurrently), then each published directory
80
+ once, deepest first, and finally the destination directory. All work stays inside
81
+ the extraction deadline; active syncs are joined before rejection. File sync
82
+ failures use the same error surface as `Root.copyIn()`; directory I/O failures
83
+ also reject, with the existing platform limitations on directory flushing.
84
+
85
+ Deadline checks use a monotonic clock, including before queued mutations start
86
+ and before reporting success. Synchronous caller code can delay the timer, but
87
+ cannot permit the next operation after the budget expires. This does not
88
+ interrupt a callback halfway through execution or replace its own thrown error;
89
+ active destination mutations are still joined before timeout rejection.
90
+ Files whose final mode prevents reading, including `0o000` and write-only files,
91
+ sync once through the copy's retained descriptor during publication. Permissions
92
+ are never widened to reopen them. Directory modes are finalized after the file
93
+ pass, with a descriptor pinned before chmod for syncing restrictive directories.
94
+ Existing inaccessible directories are never widened; an existing search-only
95
+ directory must become readable in its final mode if no readable sync descriptor
96
+ can be acquired before chmod.
97
+
98
+ The default suits extractions into temporary or reconstructible locations.
99
+ It skips all file and directory syncs while preserving atomic file publication,
100
+ mode enforcement, identity checks, and containment checks. Successful `durable: true`
101
+ extraction syncs file contents and directory entries before returning; failures
102
+ can leave a partially published tree as described below.
103
+
104
+ For a crash-safe install workflow, extract with the default into a scratch
105
+ directory, then apply the caller's durability policy: sync the staged files and
106
+ directories before publishing with [`replaceDirectoryAtomic`](atomic.md#replacedirectoryatomic),
107
+ and sync the affected parent directories afterward. The directory swap alone
108
+ does not sync the staged tree. Alternatively, pass `durable: true` when extracted
109
+ files must be on stable storage before the extraction call returns, subject to
110
+ the platform's flushing guarantees. A plain fsync on macOS does not flush the
111
+ drive cache.
112
+
113
+ `entryModes` defaults to `"clamp"`: directories become `0o755`; files become
114
+ `0o644`, or `0o755` when the archived owner-execute bit is set. `"preserve"`
115
+ keeps archived read/write/execute bits. Both policies strip setuid, setgid, and
116
+ sticky bits, and neither applies archived ownership. An explicit zero mode,
117
+ including a mode containing only stripped special bits, stays zero under
118
+ `"preserve"`. Absent metadata defaults to `0o644` for files and `0o755` for
119
+ directories; ZIP UNIX creator records with zero attributes are explicit zero,
120
+ while non-UNIX ZIP records use the absent-metadata defaults.
121
+
122
+ `entryUmask` removes permission bits after the selected mode policy: final modes
123
+ are the policy result `& ~entryUmask`. It applies to files, explicit directories,
124
+ and implicit parent directories, including existing destination directories.
125
+ The destination root and private staging modes are unchanged. The default `0`
126
+ preserves existing behavior; invalid masks reject before extraction begins.
127
+ fs-safe neither reads nor changes the process umask. Pass
128
+ `entryUmask: process.umask()` explicitly when that is the caller's policy.
129
+ Windows retains the POSIX-mode limitations described below.
130
+
131
+ TAR mode fields containing only NUL/ASCII-space padding use absent defaults.
132
+ Both backends recognize GNU binary modes, including signed values,
133
+ within JavaScript's safe-integer range before masking permission bits.
134
+ Malformed or unsupported mode fields consistently fall back to zero, matching
135
+ the former native behavior. This replaces JavaScript's decoder-dependent octal
136
+ prefix parsing, defaulting, or rejection for malformed fields. Ordinary octal,
137
+ absent, explicit zero, and supported GNU binary fields retain their behavior.
138
+
139
+ Final modes remain separate from private working staging permissions: files
140
+ stay `0o600` and directories `0o700` until publication. Files receive their final
141
+ mode through the guarded copy's owned writer descriptor. Directories are pinned
142
+ before descending and finalized after their children, including empty and
143
+ restrictive directories. Explicit accepted directory modes win regardless of
144
+ archive order; implicit parents receive `0o755 & ~entryUmask`. Existing destination directories
145
+ also receive the requested final mode. They are never temporarily widened to
146
+ allow child writes; insufficient write/search access still rejects.
147
+
148
+ Directory mode changes use a retained no-follow read descriptor when possible.
149
+ On macOS x64/arm64, read-denied directories can use a retained search descriptor.
150
+ On Linux x64/arm64, the Node-only search route retains an `O_PATH` descriptor and
151
+ changes modes through its exact `/proc/self/fd/N` reference after verifying the
152
+ procfs namespace and followed identity. The descriptor stays open through the
153
+ operation and verification; original root, ancestor and named-directory checks
154
+ still apply. This route trusts host mount-namespace integrity and does not claim
155
+ atomic ancestry checks or protection against privileged mount replacement.
156
+ Readable directories do not depend on procfs. A Linux search-only directory
157
+ needing a mode change requires accessible, genuine procfs; unavailable or
158
+ untrusted authority rejects explicitly instead of silently accepting a wrong
159
+ mode. Other unsupported search-only routes also fail closed. Windows retains
160
+ its existing bounded lack of POSIX mode enforcement. Best-effort mode handling
161
+ applies only to the mode change itself: an authority or deadline check that
162
+ fails immediately before dispatch still propagates, including a custom
163
+ one-shot structural check. A check failure observed immediately after dispatch
164
+ is retained while post-dispatch authority verification and final mode inspection
165
+ settle, then propagated with its exact JavaScript value, including falsy values.
166
+
167
+ Extraction and TAR inspection first copy the admitted source into a private
168
+ staging file. This copy reuses at most 512 KiB of scratch space, reduced for
169
+ small inputs and capped by the archive byte limit plus one overflow-probe byte.
170
+ Each read stays within the remaining budget plus that probe; deadline checks
171
+ surround reads, and short writes finish before the buffer is reused.
172
+
173
+ Native extraction is deliberately split into two phases. Rust first reports an
174
+ entry manifest without creating paths. TypeScript validates paths, applies
175
+ `stripComponents`, filters, limits, and mode policy, then passes an explicit
176
+ accepted-entry plan back to Rust. Rust owns raw-stream admission, decompression,
177
+ and fd-relative `mkdirBeneath`/exclusive-open writes. This keeps filter policy identical
178
+ between native and JavaScript paths rather than reimplementing it in Rust.
179
+
180
+ ZIP extraction and bounded reads admit every physical central-directory record and its referenced local header before either decoder can normalize or collapse names. Raw names and valid Unicode Path names must pass traversal checks before stripping, filtering, or selecting a requested member; duplicate or colliding names reject with `entry-path`, even in unrelated or skipped members. Materially conflicting local/central or Unicode interpretations, malformed critical metadata, and ambiguous framing reject with `ArchiveFormatError`. Harmless internal separator and dot-component equivalence is allowed only after validation; every raw and Unicode interpretation must also agree on whether its name ends in `/` or `\`. Ordinary legacy filename decoding remains backend-selected. Native ZIP extraction groups nearby metadata reads into at most two 4 KiB read-ahead buffers per admission pass; larger records retain separately bounded reads. Buffered record views remain stable across eviction, and cached work periodically yields for deadline checks.
181
+
182
+ ZIP end-record admission searches the bounded comment window for signatures
183
+ while retaining complete comment-length and ambiguity checks. Dense signature
184
+ sequences fall back to the bounded byte scan.
185
+ The separate `readZipCentralDirectoryEntryCount(buffer)` hint uses bounded
186
+ reverse searches for comments and retains its latest-valid-record selection;
187
+ it does not replace strict archive admission.
188
+
189
+ ZIP admission establishes each entry's kind before callbacks: a high-word UNIX
190
+ symlink type takes precedence regardless of creator, followed by the DOS directory
191
+ bit, the exact UNIX directory type, or a terminal slash/backslash. Native manifests
192
+ must agree with this kind, physical index, size, known path, and UNIX-creator mode
193
+ before extraction or any member read. Bounded ZIP reads retain this metadata from
194
+ their single admission pass without another input copy or scan.
195
+
196
+ Portable ZIP preflight, extraction, and reads bind every decoder insertion to
197
+ its admitted physical record before JSZip can coerce its type or discard its
198
+ payload. Names, physical order, original directory/permission metadata,
199
+ compression method, compressed and decoded sizes, and CRC must agree. The
200
+ private loader then applies the admitted kind, preserving UNIX-only directory
201
+ attributes, backslash-only directories, and high-word symlinks from any creator.
202
+ Symlinks remain subject to the existing filter and blocked-link policy.
203
+ UNIX socket and block-device type bits do not turn regular-file payloads into
204
+ empty directories. Directory and symlink callbacks receive their physical
205
+ declared sizes; directory bodies are not published as files. Unsupported
206
+ link-like types remain visible as `other` and are safely omitted when accepted.
207
+ UNIX creator metadata and permission defaults remain as described above.
208
+
209
+ The loader adapter belongs to one private JSZip instance and is removed after
210
+ loading, including failure. Public preflight still returns ordinary JSZip entry
211
+ objects, with directory keys ending in `/` and recognizable symlink type bits.
212
+ Compressed data is retained even for declared-zero entries, so an empty-size
213
+ claim cannot bypass payload-size or CRC verification during extraction or reads.
214
+
215
+ Within one ZIP entry, identical local and central name bytes reuse the same
216
+ decoded validation. Unicode Path admission is shared only when both the raw names
217
+ and the complete Unicode fields match; different fields still verify their own
218
+ CRC and interpretation. Shared backing memory is checked independently. Decoded
219
+ name validation is not reused across entries or archives.
220
+ UTF-8-flagged ASCII names in nonshared backing memory reuse their raw-path
221
+ validation, and an identical decoded spelling reuses its canonical key. Shared
222
+ name bytes still undergo independent decoding and validation; Unicode Path
223
+ fields retain their own CRC and interpretation checks.
224
+
225
+ `stripComponents` removes leading nonempty, non-`.` path components after
226
+ normalizing separators. For example, `./pkg/hello.txt` with
227
+ `stripComponents: 1` extracts to `hello.txt` on both backends. Entries with no
228
+ remaining components are skipped before the filter callback, but still count
229
+ toward `maxEntries` and undergo traversal validation. JavaScript TAR extraction
230
+ copies the admitted payload range to this accepted output path, so depth checks,
231
+ collision checks, writes, and mode application agree.
232
+
233
+ An `entryFilter` sees the validated **canonical effective archive path before
234
+ stripping**, entry kind, and declared size. On every JavaScript and native
235
+ ZIP/TAR backend (including gzip, zstd, and bzip2), backslashes become `/`,
236
+ empty and `.` components are removed, and trailing separators are removed from
237
+ directory paths. For example, `./pkg//state\cache/value` is presented as
238
+ `pkg/state/cache/value`, even with `stripComponents: 1`. Case and Unicode
239
+ spelling are preserved. Local PAX `path`, GNU long-name, and supported ZIP
240
+ Unicode Path names use the same canonicalization.
241
+ Callbacks follow physical archive order, including ZIP names that look like
242
+ integer object keys. The public ZIP loader's `files` object retains ordinary
243
+ JavaScript object enumeration and mutation behavior.
244
+
245
+ Raw paths undergo traversal, absolute/drive-path, and NUL validation **before**
246
+ canonicalization; normalization cannot turn an unsafe path into an accepted
247
+ one. Stripping and output collision checks use this same canonical identity.
248
+ On Windows, archive admission also rejects reserved device segments such as
249
+ `NUL`, `CON.txt`, and `nul .txt` with `ArchiveSecurityError("entry-path")`,
250
+ before extraction or bounded member reads. Ignored trailing spaces in the stem
251
+ before an extension do not bypass this check. Ordinary members with these names
252
+ remain valid on POSIX; this is a host-specific device guard, not a portable-name
253
+ restriction.
254
+ Filters that compare exact strings should use canonical pre-strip paths,
255
+ including directory names without a trailing `/`.
256
+ Returning `"skip"` rejects the whole archive unless `onFiltered` is
257
+ explicitly `"skip-entry"`. Runtime values other than `"reject-archive"` and
258
+ `"skip-entry"` reject before extraction starts instead of falling through to
259
+ skip behavior. Path traversal and archive-wide entry-count checks still apply
260
+ to skipped entries.
261
+ `maxEntryBytes` and `maxExtractedBytes` charge only entries accepted after
262
+ stripping and filtering. Skipping a large member does not consume these payload
263
+ budgets. The separate complete-stream decoded limit still applies to all TAR
264
+ content, including skipped or fully stripped members.
265
+
266
+ For example, a fleet restore can omit regenerated cache entries while rejecting
267
+ any other policy mismatch by default:
268
+
269
+ ```ts
270
+ await extractArchive({
271
+ archivePath: snapshotPath,
272
+ destDir: restoreRoot,
273
+ timeoutMs: 30_000,
274
+ entryFilter: ({ path: entryPath, kind }) =>
275
+ kind === "directory" && entryPath === "state/cache"
276
+ ? "skip"
277
+ : entryPath.startsWith("state/cache/")
278
+ ? "skip"
279
+ : "extract",
280
+ onFiltered: "skip-entry",
281
+ limits: { maxEntries: 50_000, maxEntryPathComponents: 64 },
282
+ });
283
+ ```
284
+
285
+ If skipping was not explicitly part of the restore contract, omit
286
+ `onFiltered`; the first `"skip"` then rejects the complete archive with
287
+ `ArchiveSecurityError("entry-filtered")`.
288
+
289
+ Both TAR routes finish bounded admission before TypeScript policy evaluation,
290
+ so a rejected plan never starts extraction. The JavaScript path owns its input,
291
+ decoder, and WASM parser streams, joining their teardown on validation, write,
292
+ or timeout failure.
293
+
294
+ TAR character devices, block devices, and FIFOs are presented to the filter as
295
+ `kind: "other"`. Accepted entries of these types reject with
296
+ `ArchiveSecurityError("entry-link")`; an explicit `"skip-entry"` filter can omit
297
+ them. GNU typeflag `D` (`GNUDumpDir`) is a directory on both backends, including
298
+ its filter kind, canonical path, and directory creation policy. Its declared
299
+ body size follows the existing TAR strip/filter payload budgets; dump contents
300
+ are not restored as files.
301
+
302
+ Unsupported logical TAR records, including volume headers (`V`), Solaris ACL
303
+ records (`A`), inodes (`I`), continuations (`M`), and unrecognized typeflags,
304
+ still undergo entry counting, raw/effective path validation, stripping, depth
305
+ and output collision checks in physical order. Each remaining record reaches
306
+ `entryFilter` once with its canonical pre-strip path, `kind: "other"`, and
307
+ declared effective size. A filter skip rejects with `"entry-filtered"` unless
308
+ `onFiltered: "skip-entry"` is explicit. Accepted unsupported records are safely
309
+ omitted and do not consume output payload budgets. The shared core admits these records explicitly. GNU long names describe one such
310
+ record and are then cleared; local PAX on unsupported types and GNU sparse
311
+ `S` records retain their existing fail-closed format policy.
312
+
313
+ If `kind` is omitted, the helper calls `resolveArchiveKind(archivePath)` and throws if the extension is not recognized. Pass `kind` explicitly when the archive name doesn't carry the type (e.g. content-addressed names). Archive inputs must remain regular files from preview through descriptor admission; POSIX opens are no-follow and nonblocking, so a FIFO swap cannot stall before deadline checks resume. On Windows, archive source and destination filesystem paths reject NTFS alternate-stream and directory-index namespace spellings such as `file:stream` and `dir::$INDEX_ALLOCATION`; ordinary colon-bearing POSIX names remain valid. A positive finite `timeoutMs` is a wall-clock budget; zero, negative, `NaN`, and infinity disable the deadline. Non-mutating work rejects promptly when the budget expires. If a live destination mutation is already in flight, rejection waits only for that mutation and any rollback to finish; no later destination mutation can begin.
314
+
315
+ Extraction captures the destination's lossless filesystem identity before any
316
+ entry filter runs and retains that capability through final publication. If a
317
+ filter or concurrent actor renames or replaces the destination, extraction
318
+ rejects with `destination-symlink-traversal` before publishing into the
319
+ replacement. This check uses bigint device and inode identities so large native
320
+ identifiers cannot compare equal after JavaScript number rounding.
321
+
322
+ The destination merge is nontransactional: each file is published atomically,
323
+ but completed files and directories can remain when a later copy, post-copy
324
+ check, mode application, or deadline fails. This also applies to
325
+ `mergeExtractedTreeIntoDestination()`. Guarded `Root.copyIn()` owns unpublished
326
+ stage cleanup and preserves completed publications. The archive merge never
327
+ acquires rollback authority over the current destination name. Replacing a
328
+ source path after publication rejects the merge with `path-mismatch` while
329
+ preserving the admitted bytes already published, or any later destination edit.
330
+ A failure before publication preserves a pre-existing file, and rejection does
331
+ not grant authority to delete a substituted file or alias. Failed extraction does not
332
+ restore overwritten contents. Active destination mutations and their guarded
333
+ cleanup still finish before rejection; no later destination mutation begins.
334
+ Portable ZIP output is not eligible for publication until its stream closes or
335
+ the defensive `FileHandle` close succeeds. If that fallback close rejects,
336
+ `extractArchive()` propagates the error and publishes no entry from the staged
337
+ tree. Cleanup retains its best-effort `FileHandle` close; it does not transfer
338
+ the descriptor to a raw or native closer.
339
+ New directories whose finalization was never reached can retain their
340
+ private working mode after failure. Failure cleanup closes retained descriptors;
341
+ it does not run a cleanup chmod sweep or roll back the archive. The public merge
342
+ helper still derives modes from its external source tree and must be able to
343
+ read that source; it never chmods an unreadable external source to admit it.
344
+ It retains the source root and each active child directory's exact identity
345
+ through traversal and copy verification. Each source file is opened once,
346
+ admitted against that root and its earlier exact identity observation, and
347
+ copied from the admitted descriptor; public file modes use that descriptor's
348
+ ordinary permission bits. Replacing a source ancestor or leaf rejects the
349
+ merge before replacement bytes can be published. These checks do not provide
350
+ a snapshot against writes to the same source inode.
351
+ That helper retains per-copy durability and immediate postorder directory-mode
352
+ finalization; the deferred pass described above belongs to `extractArchive()`.
353
+
354
+ ### Limits
355
+
356
+ ```ts
357
+ type ArchiveExtractLimits = {
358
+ maxArchiveBytes?: number; // refuse if archivePath stat'd size exceeds this
359
+ maxEntries?: number; // refuse before extracting if entry count > this
360
+ maxExtractedBytes?: number; // cap total payload bytes accepted after strip/filter
361
+ maxEntryBytes?: number; // cap one accepted entry after strip/filter
362
+ maxMetaEntryBytes?: number; // refuse one PAX/GNU metadata body above this
363
+ maxEntryPathComponents?: number; // bound output path depth after stripComponents
364
+ };
365
+ ```
366
+
367
+ Defaults exist for each (`DEFAULT_MAX_ARCHIVE_BYTES_ZIP`, `DEFAULT_MAX_ENTRIES`, `DEFAULT_MAX_EXTRACTED_BYTES`, `DEFAULT_MAX_ENTRY_BYTES`, `DEFAULT_MAX_META_ENTRY_BYTES`, `DEFAULT_MAX_ENTRY_PATH_COMPONENTS`). An explicit zero remains zero rather than selecting the default. `maxEntries` counts every archive entry, including entries removed by `stripComponents` or an explicit filter. The path-component default is 256. It is evaluated after `stripComponents` and before TypeScript accepts an entry for either JavaScript or native extraction, so rejected entries cannot cause implicit parent-directory creation. The same resolved 1 MiB metadata default applies to the native and WASM core.
368
+
369
+ A limit violation throws `ArchiveLimitError`. Its constant and string code are:
370
+
371
+ | Constant | Code |
372
+ |---|---|
373
+ | `ARCHIVE_SIZE_EXCEEDS_LIMIT` | `archive-size-exceeds-limit` |
374
+ | `ENTRY_COUNT_EXCEEDS_LIMIT` | `archive-entry-count-exceeds-limit` |
375
+ | `EXTRACTED_SIZE_EXCEEDS_LIMIT` | `archive-extracted-size-exceeds-limit` |
376
+ | `DECODED_SIZE_EXCEEDS_LIMIT` | `archive-decoded-size-exceeds-limit` |
377
+ | `ENTRY_EXTRACTED_SIZE_EXCEEDS_LIMIT` | `archive-entry-extracted-size-exceeds-limit` |
378
+ | `META_ENTRY_SIZE_EXCEEDS_LIMIT` | `archive-meta-entry-size-exceeds-limit` |
379
+ | `ENTRY_PATH_COMPONENTS_EXCEEDS_LIMIT` | `archive-entry-path-components-exceeds-limit` |
380
+ | `MANIFEST_SIZE_EXCEEDS_LIMIT` | `archive-manifest-size-exceeds-limit` |
381
+
382
+ `MANIFEST_SIZE_EXCEEDS_LIMIT` is an active internal TAR admission limit, shared
383
+ by JavaScript and native extraction and bounded reads. Each logical member,
384
+ including ignored, filtered, and fully stripped members, charges
385
+ `64 + 2 * UTF-8 byte length of its effective pre-strip path` before emission or
386
+ retention. PAX/GNU metadata headers do not themselves charge a member cost.
387
+ The allowance is independent of `maxArchiveBytes`: derive a per-member path
388
+ allowance of `max(256, min(maxMetaEntryBytes, max(1, maxEntryPathComponents) * 256))`,
389
+ apply the same 64-byte overhead and doubled path cost, multiply by `maxEntries`,
390
+ and cap the total at 64 MiB using saturating arithmetic. Zero and very large
391
+ public limits remain deterministic. There is no public `maxManifestBytes`
392
+ option; this charged manifest budget supplements the decoded and metadata
393
+ limits rather than bounding the complete process heap.
394
+
395
+ Catch and branch on the code to surface a meaningful response to the caller.
396
+
397
+ Entry policy failures throw `ArchiveSecurityError`. Its entry-related codes
398
+ are `"entry-path"`, `"entry-link"`, and `"entry-filtered"`; destination-race
399
+ codes remain `"destination-not-directory"`, `"destination-symlink"`, and
400
+ `"destination-symlink-traversal"`.
401
+
402
+ ## What it defends against
403
+
404
+ - **Path traversal:** entries with `..`, absolute paths, NUL bytes, or Windows drive-relative segments such as `C:secret` and `nested/C:secret` are rejected (`ArchiveSecurityError`). On Windows, path segments containing `:` are also rejected as alternate data stream names before either backend writes to the filesystem.
405
+ - **Symlink/hardlink entries:** rejected by default, including ZIP entries whose Unix mode says symlink while their name ends in a slash or their DOS directory bit is set. An explicit `entryFilter` with `onFiltered: "skip-entry"` can omit these entries. Some archives ship symlink/hardlink entries that point outside the destination once resolved; `extractArchive` does not follow them.
406
+ - **Ambiguous output names:** duplicate names and distinct names that collide after `stripComponents`, case normalization, or Unicode normalization are rejected instead of relying on backend- or volume-specific overwrite order.
407
+ - **TOCTOU during merge:** extraction first writes to a private temp dir, then merges into `destDir` using the same boundary checks as `root().write()`. Destination symlink swaps are checked with the selected platform mechanism; non-Linux routes retain the best-effort race window documented in the [security model](security-model.md#containment-guarantees-by-platform).
408
+ - **Zip bombs:** `maxExtractedBytes` and `maxEntryBytes` apply to *post-decompression* bytes, so highly-compressed payloads hit the cap before they exhaust disk.
409
+ - **Corrupt ZIP payloads:** streamed output must match both the central-directory CRC and declared uncompressed size before it can leave private staging.
410
+ - **Gzip container integrity:** every concatenated gzip member must have a complete valid header, body, CRC32, and ISIZE trailer. A completed member may be followed by all-zero compressed-container padding (including system-tar stdout padding), bounded by the original archive-byte limit. The padding must remain zero through physical EOF; nonzero bytes or another member after padding reject. Truncation and corruption reject before publication or selected bytes return on both backends. Compressed padding is separate from decoded TAR EOF and does not bypass its checks.
411
+ - **Slow-loris archives:** `timeoutMs` is a hard wall-clock budget for non-mutating work. Extraction is aborted on overrun; if a destination mutation is already in flight, that mutation and rollback are joined before rejection so archive-controlled publication cannot continue afterward.
412
+ - **Metadata bombs:** a streaming pass-through reader rejects oversized PAX, GNU long-name, and GNU long-link bodies before buffering their bodies. It understands octal and base-256 fixed sizes and validates bounded local PAX bodies before using their size overrides for member framing. Original archive bytes remain unchanged.
413
+
414
+ Native gzip, zstd, and bzip2 readers check cancellation before refilling
415
+ compressed input and before each decoded read, including buffered output. These checks
416
+ apply to file extraction and in-memory member reads; they cannot interrupt an
417
+ already-running filesystem read or a decoder step using already-buffered input.
418
+ Portable zstd/bzip2 decoding checks cancellation between bounded codec steps and
419
+ periodically yields to the event loop, including while consuming output-free
420
+ members. An individual WASM call cannot be interrupted. Teardown joins the input,
421
+ parser, and any Node decoder streams before disposing their shared WASM state.
422
+
423
+ ### Raw TAR framing
424
+
425
+ Extraction and bounded reads admit the complete decoded TAR stream through the
426
+ shared Rust core. This applies to plain TAR, gzip, zstd, and bzip2 on native and
427
+ fallback paths. The native and WASM builds enforce the same framing rules:
428
+
429
+ - Every nonzero header must have a valid unsigned octal checksum, delimited
430
+ within its field. Checksum validation precedes metadata allocation and member
431
+ policy. Fixed name, prefix, and linkname fields require strict UTF-8 and NUL
432
+ padding. Raw hardlink (`1`) and symlink (`2`) headers require a nonempty
433
+ linkname; every other type, including PAX/GNU metadata, requires an empty
434
+ linkname. This check precedes metadata handling and member/filter policy.
435
+ - Directory (`5`), hardlink (`1`), and symlink (`2`) raw headers must declare
436
+ zero body bytes, whether or not local PAX metadata is present. Valid zero-size
437
+ links remain subject to the existing link/filter policy.
438
+ - EOF requires two consecutive, complete 512-byte zero blocks at a header
439
+ boundary. A header after just one zero block, a missing/partial EOF marker,
440
+ and any nonzero bytes after EOF reject. Additional zero padding after EOF may
441
+ have any byte length within the decoded ceiling; zero blocks inside a declared
442
+ member body are payload.
443
+ - Headers and padded bodies must be complete. Size fields accept unsigned
444
+ octal with ASCII-space/NUL padding or supported positive base-256 encoding;
445
+ malformed numbers and non-padding bytes after a NUL reject. Raw sizes and
446
+ padded sizes must fit `Number.MAX_SAFE_INTEGER`, even with PAX overrides,
447
+ before member budgets are considered.
448
+
449
+ Framing failures use `ArchiveFormatError("archive-header-invalid")`, except
450
+ invalid UTF-8 or nonzero bytes after the first NUL in fixed name, linkname,
451
+ and USTAR prefix fields, which use `ArchiveSecurityError("entry-path")`.
452
+ Missing linknames on links and nonempty linknames on non-links still use the
453
+ format error. PAX `x` and GNU long-name/long-link `L`/`K` payloads retain their
454
+ existing support and metadata limits; the zero-body rule is not applied to all
455
+ non-regular types.
456
+ PAX effective sizes determine regular-member framing. Admission preserves input
457
+ bytes and emits an ordered manifest with exact effective names, types, modes,
458
+ sizes, and decoded payload offsets. TypeScript owns filtering, stripping,
459
+ collisions, permissions, and accepted-output limits. Executors replay admitted
460
+ ranges from the immutable staged input; no second TAR parser interprets PAX,
461
+ GNU names, or payload lengths. Native writes remain descriptor-relative;
462
+ JavaScript writes use the shared guarded private staging and pinned-write helpers.
463
+
464
+ Original member names and USTAR prefixes are validated even when overridden.
465
+ Non-padding bytes after a fixed path field's NUL terminator reject. The core
466
+ enforces the 255-byte component ceiling under NFC and NFD, including Hangul
467
+ expansion. Every replay drains and validates physical EOF before publication or
468
+ returning selected bytes. Unrequested, filtered, and stripped members cannot
469
+ bypass validation. Decompression remains streaming; no complete decoded archive
470
+ is retained in memory or written to a decoded spool.
471
+
472
+ The WASM transport has fixed 64 KiB input/output windows, one pending member
473
+ event, and a 256 MiB maximum linear memory per isolated session. The parser and
474
+ portable zstd/bzip2 decoder share that session and memory ceiling. JavaScript
475
+ gzip decoding also emits chunks of at most 64 KiB for both staged files and
476
+ buffered inputs. Metadata is bounded before allocation; codec allocation
477
+ failure rejects. Stream backpressure bounds queued chunks, and completion or
478
+ error releases the session's parser and decoder state after stream teardown.
479
+ The manifest retains the existing charged budget below; linear memory is an
480
+ additional execution resource bound, not a new public limit option.
481
+
482
+ Portable zstd/bzip2 decoding consumes every concatenated member through physical
483
+ EOF and verifies container integrity, including available checksums. Zstd
484
+ skippable frames are consumed without becoming TAR data. Truncated members and
485
+ trailing non-container bytes reject with `ArchiveFormatError` before filters,
486
+ publication, or selected bytes are returned. Decoded TAR EOF and byte-budget
487
+ checks still apply across member boundaries; a second TAR after EOF is not
488
+ silently ignored. The gzip-only compressed-padding policy above does not extend
489
+ to zstd/bzip2 containers.
490
+
491
+ The raw meter enforces `maxEntries` before consuming each logical member's body,
492
+ including members later skipped by filtering or stripping. PAX/GNU metadata
493
+ headers do not count as members; their payloads use `maxMetaEntryBytes`.
494
+ The meter does not receive `maxEntryBytes` or `maxExtractedBytes`: those payload
495
+ budgets apply only after strip/filter acceptance, using declared effective
496
+ sizes and excluding block padding. JavaScript's entry checker and the native
497
+ accepted-plan builder retain this shared policy. Every TAR admission/parser
498
+ pass has a separate absolute decoded ceiling:
499
+ `maxExtractedBytes + maxArchiveBytes`, safely clamped to
500
+ `Number.MAX_SAFE_INTEGER` (768 MiB with defaults). It counts every admitted
501
+ decoded byte: headers, bodies, metadata, all block padding, both EOF blocks,
502
+ and zero padding after EOF. It bounds complete decoding before parser policy,
503
+ including all filtered/stripped content; cumulative metadata and zero tails
504
+ cannot bypass this bound. Exceeding this ceiling throws
505
+ `ArchiveLimitError("archive-decoded-size-exceeds-limit")`.
506
+
507
+ The same TypeScript helper derives the ceiling for JavaScript and every native
508
+ TAR pass. Before selecting a backend, it caps internal metadata/decoded limits at
509
+ `Number.MAX_SAFE_INTEGER` and logical entry counts at `2^32 - 1`. Larger finite
510
+ options such as `Number.MAX_VALUE` remain valid; high-level payload budgets keep
511
+ their large values. The decoded ceiling uses clamped `maxExtractedBytes` and
512
+ archive overhead with safe addition. Ordinary limits, including
513
+ zero and the existing defaulting/rounding rules, retain their behavior.
514
+ There is no new public option. This is an absolute decoded admission
515
+ cap, not a decompression-ratio policy; bounded stream/codec read-ahead remains.
516
+ There is no independent TAR parser decompression-ratio threshold.
517
+
518
+ ### Bounded local PAX support
519
+
520
+ Extraction and single-entry reads accept one nonempty local POSIX `x` header
521
+ (USTAR or GNU header format) immediately before one regular/contiguous file,
522
+ directory, symlink, or hardlink. `path`, `linkpath`, and `size` override that
523
+ member only. Effective paths still pass traversal validation before stripping,
524
+ then the output paths pass depth and collision checks. The filter receives the
525
+ canonical effective pre-strip path, followed by link policy checks. PAX never
526
+ permits link creation. Effective sizes drive framing, filters, and the existing output-byte
527
+ budgets; `maxEntries` still counts members, not their metadata headers.
528
+
529
+ Records must have exact byte lengths, ASCII keys, a final newline, and no
530
+ duplicate keys or unconsumed bytes. `path` and `linkpath` must be nonempty strict
531
+ UTF-8 without NUL. Unicode, a leading BOM, numeric-looking names, and embedded
532
+ newlines preserve their exact spelling; newlines inside a byte-counted value
533
+ are data. Windows filesystem filename restrictions still apply during creation.
534
+ Ownership names retain the existing nonempty printable-ASCII contract. Raw name,
535
+ USTAR prefix, and link fields still require strict UTF-8 and NUL padding even
536
+ when metadata overrides them. Raw link targets must be present only on links.
537
+ `size`, `uid`, and `gid`
538
+ must be canonical unsigned decimal safe integers (zero is valid; signs, leading
539
+ zeros, fractions, and exponents are not). Padded member sizes must also fit the
540
+ safe integer range. Raw and effective directory/link sizes must both be zero;
541
+ non-directory paths ending with a separator and `linkpath` on non-links are
542
+ rejected rather than allowing parser-specific type or framing changes.
543
+
544
+ The descriptive allowlist is `mtime`, `atime`, `ctime` (signed decimal seconds
545
+ with optional fractional digits, within JavaScript's Date range), `uid`, `gid`,
546
+ `uname`, and `gname`. These attributes are accepted but not restored to the
547
+ destination. `LIBARCHIVE.xattr.*` and `SCHILY.xattr.*` with nonempty ASCII
548
+ alphanumeric/dot/underscore/hyphen suffixes are also accepted as inert metadata,
549
+ never restored as extended attributes. Their values are byte-counted and may
550
+ contain NUL, non-UTF8 bytes, or newlines, including macOS provenance metadata.
551
+
552
+ Global `g`, old `X`, old GNU `N`, empty/dangling/repeated local headers, mixed
553
+ PAX/GNU extension chains, unknown keys, charset declarations, ACL extensions,
554
+ and all sparse extensions (including `GNU.sparse.*`, `SCHILY.filetype`,
555
+ `SCHILY.realsize`, and `SCHILY.size`) fail closed with
556
+ `ArchiveFormatError("archive-header-invalid")`. GNU sparse extension blocks are still
557
+ metered in 512-byte units before rejection, preserving metadata-limit errors
558
+ for excessive chains. The per-body `maxMetaEntryBytes` limit bounds PAX storage
559
+ and duplicate-key state; one local header per member prevents local metadata
560
+ chains without introducing a new limit or changing defaults.
561
+
562
+ ### Bounded GNU long names and links
563
+
564
+ The shared core buffers GNU long-name `L` and long-link `K` bodies within
565
+ `maxMetaEntryBytes`. A body must contain a nonempty
566
+ UTF-8 name, with either no NUL or exactly one terminal NUL. Embedded NULs,
567
+ additional terminal NULs, bytes after a NUL, and invalid UTF-8 reject with
568
+ `ArchiveFormatError("archive-header-invalid")`. The core preserves original
569
+ archive bytes, including the optional terminator and block padding.
570
+
571
+ One logical member may have at most one `L` and one `K`, in either order.
572
+ Repeated metadata of either kind, mixed PAX/GNU chains in either direction,
573
+ and GNU metadata without a following member reject with the same format error.
574
+ Pending metadata is cleared only when its described member is admitted;
575
+ metadata records do not count toward `maxEntries`.
576
+
577
+ An `L` name undergoes raw-path validation before parser normalization, stripping,
578
+ or filtering; unsafe paths reject with `ArchiveSecurityError("entry-path")`.
579
+ The validated name remains pending until its described header arrives. An
580
+ effective name ending in `/` or `\` requires raw directory type `5` or `D`;
581
+ other types reject with `ArchiveFormatError` before filtering, preventing the
582
+ parsers from disagreeing about a member's type.
583
+ `K` validates encoding and NUL structure without authorizing link creation.
584
+ Normal link/filter policy still governs the described member. Canonical
585
+ pre-strip filter paths, decoded-stream ceilings, and physical EOF checks apply
586
+ to plain/gzip TAR and zstd/bzip2 alike.
587
+
588
+ ## `inspectTarArchive`
589
+
590
+ Inspect accepted TAR members without creating an extracted tree. This operation
591
+ uses the same complete Rust/WASM admission and TypeScript extraction planner as
592
+ `extractArchive`, with zero stripping. It detects plain TAR or gzip from the
593
+ input bytes; ZIP, zstd, and bzip2 are not part of this inspection API.
594
+
595
+ ```ts
596
+ import { inspectTarArchive } from "@openclaw/fs-safe/archive";
597
+
598
+ const entries = await inspectTarArchive({
599
+ archivePath: "/srv/uploads/tree.tar.gz",
600
+ timeoutMs: 30_000,
601
+ limits: {
602
+ maxArchiveBytes: 16 * 1024 * 1024,
603
+ maxEntries: 5_000,
604
+ maxEntryBytes: 16 * 1024 * 1024,
605
+ maxExtractedBytes: 64 * 1024 * 1024,
606
+ },
607
+ entryFilter: ({ kind }) => kind === "file" || kind === "directory" ? "extract" : "skip",
608
+ onFiltered: "reject-archive",
609
+ });
610
+ ```
611
+
612
+ `InspectTarArchiveOptions` accepts `archivePath`, `timeoutMs`, `limits`,
613
+ `entryFilter`, and `onFiltered`, with the same defaults and error classes as
614
+ extraction. The result is a frozen array of frozen `InspectedTarEntry` records:
615
+ `{ path: string; kind: "file" | "directory"; size: number }`, in archive order.
616
+ `size` is the effective declared payload length. `path` is extraction's
617
+ canonical pre-strip identity: case, Unicode spelling, BOM, and embedded LF are
618
+ preserved, while separators and dot components follow the existing archive path
619
+ contract. No human-readable tar listing or escape decoding is involved.
620
+
621
+ Full framing, gzip integrity, EOF, metadata, decoded-byte, and manifest-budget
622
+ validation finishes before the caller's filter runs. The shared planner then
623
+ applies traversal, collision, depth, blocked-type, and accepted-payload limits.
624
+ A failure returns no partial result. Filter callbacks are decisions, not admission
625
+ receipts: later policy, collision, or budget checks can still reject the archive.
626
+ Only the resolved Promise/result is authorization-worthy; do not perform
627
+ irreversible actions from a filter callback.
628
+
629
+ Root-only records count toward entry limits but produce no result; PAX/GNU metadata headers are not members. Only accepted
630
+ file/directory members appear, not implicit parent directories. Unsupported
631
+ records follow extraction's omission policy unless the filter rejects them, as
632
+ in the example. AppleDouble records encoded as ordinary files are ordinary
633
+ members, not hidden metadata.
634
+
635
+ Inspection pins and privately stages its input, then cleans up that copy. It
636
+ neither creates destination paths nor tests destination permissions or platform
637
+ filename restrictions. Its result is evidence about those inspected bytes, not
638
+ an extraction capability or a promise that a later file at `archivePath` is
639
+ unchanged. Callers making authorization decisions must retain the same private
640
+ immutable archive or verify byte identity before extracting with matching
641
+ filter/limit settings. Extraction always performs its own admission and guarded
642
+ publication. Native `off`, `auto`, and `require` retain their existing selection
643
+ and availability semantics; inspection does not fall back after native failure.
644
+
645
+ ## `resolveArchiveKind`
646
+
647
+ ```ts
648
+ import { resolveArchiveKind, type ArchiveKind } from "@openclaw/fs-safe/archive";
649
+
650
+ const kind = resolveArchiveKind("upload.zip"); // "zip"
651
+ const tar = resolveArchiveKind("upload.tar.gz"); // "tar"
652
+ const zstd = resolveArchiveKind("upload.tar.zst"); // "tar-zstd" in auto/off; require checks native
653
+ const unknown = resolveArchiveKind("upload.bin"); // null
654
+ ```
655
+
656
+ Recognizes:
657
+
658
+ - `*.zip` → `"zip"`
659
+ - `*.tar`, `*.tar.gz`, `*.tgz` → `"tar"`
660
+ - `*.tar.zst`, `*.tar.zstd`, `*.tzst` → `"tar-zstd"`
661
+ - `*.tar.bz2`, `*.tbz2`, `*.tbz` → `"tar-bzip2"`
662
+
663
+ Returns `null` for unknown extensions; check the result before calling
664
+ `extractArchive` if the filename is caller-controlled. Recognized zstd and bzip2
665
+ TAR extensions resolve in `auto` and `off` even without a native binding, using
666
+ the bundled codecs for subsequent extraction or reads. Explicit `require`
667
+ still checks native availability during suffix resolution and throws
668
+ `FsSafeError("helper-unavailable")` when the binding cannot load.
669
+
670
+ For a deployment that requires native archive processing, configure native mode
671
+ before the first archive call so a missing binding fails at the boundary:
672
+
673
+ ```ts
674
+ import { configureFsSafeNative } from "@openclaw/fs-safe/config";
675
+ import { extractArchive } from "@openclaw/fs-safe/archive";
676
+
677
+ configureFsSafeNative({ mode: "require" });
678
+ await extractArchive({
679
+ archivePath: "/srv/restore/snapshot.tar.zst",
680
+ destDir: "/srv/restore/staging",
681
+ kind: "tar-zstd",
682
+ timeoutMs: 60_000,
683
+ });
684
+ ```
685
+
686
+ ## `readArchiveEntry`
687
+
688
+ `readArchiveEntry(archivePath, entryPath, { maxBytes, kind? })` reads one
689
+ regular-file entry into a bounded `Buffer` without extracting a tree. It reads
690
+ the input through an identity-checked descriptor, rejects a requested link or
691
+ directory, and rejects duplicate entry names anywhere in the archive. Unrequested
692
+ links and directories do not prevent reading a regular file; no links are followed
693
+ or created. It verifies ZIP CRC and declared size,
694
+ and throws `ArchiveLimitError` if the requested entry's output exceeds
695
+ `maxBytes`. ZIP output within that cap must match the declared uncompressed
696
+ size exactly; either a shorter or longer payload throws
697
+ `ArchiveFormatError("archive-header-invalid")` before bytes are returned on
698
+ both JavaScript and native backends.
699
+ For TAR, `maxBytes` applies only to that requested entry: a larger
700
+ unrequested member remains valid within the default archive admission limits.
701
+ TAR traversal uses default entry-count, compressed-input, and metadata limits,
702
+ plus the 768 MiB decoded ceiling derived from default extracted/archive byte
703
+ limits. It does not apply payload budgets to unrequested members. ZIP
704
+ inputs retain the archive subpath's 256 MiB compressed-input ceiling.
705
+ With a native binding it uses the same Rust decoders as extraction, including
706
+ zstd and bzip2 TAR. Without native, the guarded fallback uses bundled WASM for
707
+ TAR admission and zstd/bzip2 decoding, Node gunzip for gzip, and optional JSZip
708
+ for ZIP. Native `require` still rejects an unavailable binding.
709
+ Archive member reads retain their private in-memory input without a disk
710
+ snapshot. JavaScript ZIP member reads reuse their completed physical admission
711
+ when loading the decoder, which still checks its decoded names and entry count.
712
+ The native ZIP reader retains the private allocation and parsed directory across worker-thread
713
+ inspection and reading without an extra archive-byte copy.
714
+ Decompression still allocates its bounded output; Node receives that native
715
+ allocation without another copy where external buffers are supported.
716
+ Native TAR retains the fully admitted member offsets alongside the same input
717
+ allocation. Plain TAR copies only the selected payload range after full archive
718
+ validation. Gzip, zstd, and bzip2 replay bounded decompression and still validate
719
+ all framing, trailers, and physical padding before returning. The fallback also
720
+ retains admitted member offsets. After full admission, plain TAR copies the
721
+ selected range directly from its private snapshot; gzip, zstd, and bzip2 replay
722
+ bounded decompression through the same parser. WASM transport and selected
723
+ output use owned copies, so reusable codec windows cannot escape to callers.
724
+ Returned buffers own their bytes, so changing a result cannot modify an archive
725
+ reader or retain an unrelated part of the input through its backing ArrayBuffer.
726
+
727
+ Requested paths and effective member names use extraction's canonical pre-strip
728
+ identity: backslashes become `/`, and repeated separators and `.` components
729
+ are removed after raw-path validation. For example, `./pkg//value` and
730
+ `pkg\value` both address `pkg/value`, including supported GNU/PAX and ZIP
731
+ Unicode Path names. Case and Unicode spelling are preserved. Requests ending
732
+ in `/` or `\` still reject as non-files. Canonical duplicate members reject
733
+ before an unrelated requested entry can be returned.
734
+
735
+ ```ts
736
+ const rawManifest = await readArchiveEntry(uploadPath, "package/manifest.json", {
737
+ maxBytes: 64 * 1024,
738
+ });
739
+ const manifest = JSON.parse(rawManifest.toString("utf8")) as PluginManifest;
740
+ validatePluginManifest(manifest);
741
+ ```
742
+
743
+ ## Lower-level building blocks
744
+
745
+ The archive subpath also exports the helpers `extractArchive` is built on. Most callers will not need them, but they are stable and documented:
746
+
747
+ | Function | Purpose |
748
+ |---|---|
749
+ | `withStagedArchiveDestination(opts)` | Creates a private staging dir outside the destination, calls your `run(stagingDir)`, then cleans it up. |
750
+ | `mergeExtractedTreeIntoDestination(opts)` | The merge step alone — staged tree → destination through boundary checks. |
751
+ | `prepareArchiveDestinationDir(destDir)` | Canonicalizes and asserts the destination directory. |
752
+ | `prepareArchiveOutputPath({ destinationDir, destinationRealDir, relPath, outPath, originalPath, isDirectory, deadline? })` | Validates and prepares parents for an already-resolved entry output path. |
753
+ | `loadZipArchiveWithPreflight(buffer, limits?)` | Loads a JSZip from a `Buffer` or `Uint8Array` with size/entry-count preflight before unzipping. |
754
+ | `readZipCentralDirectoryEntryCount(buffer)` | Returns the entry count from an already-loaded ZIP `Buffer` or `Uint8Array` without decoding payloads. |
755
+ | `createTarEntryPreflightChecker(opts)` | Returns a per-entry checker for use as a `tar.x` `onReadEntry` hook. |
756
+
757
+ These let you build custom extractors that share the same safety machinery — for example, a streaming uploader that wants to refuse archives with too many entries before reading any payloads.
758
+
759
+ ## Path helpers
760
+
761
+ `archive-entry` exports a handful of low-level helpers for entry-path normalization:
762
+
763
+ ```ts
764
+ import {
765
+ isWindowsDrivePath,
766
+ normalizeArchiveEntryPath,
767
+ resolveArchiveOutputPath,
768
+ stripArchivePath,
769
+ validateArchiveEntryPath,
770
+ } from "@openclaw/fs-safe/archive";
771
+ ```
772
+
773
+ - `validateArchiveEntryPath(raw, opts)` — throws `ArchiveSecurityError` for `..`, absolute, NUL-containing, drive-relative, or otherwise unsafe entry paths, including alternate data stream names on Windows.
774
+ - `normalizeArchiveEntryPath(raw)` — converts backslashes in the entry path to forward slashes.
775
+ - `stripArchivePath(entryPath, n)` — normalize separators, drop empty and `.` components, then strip the leading N components, returning `null` if none remain.
776
+ - `resolveArchiveOutputPath({ rootDir, relPath, originalPath, escapeLabel? })` — combines the validated relative path with the root and rejects escapes using the original archive path for diagnostics.
777
+ - `isWindowsDrivePath(value)` — detects drive-relative segments such as `C:secret` or `nested/C:secret` that should be rejected.
778
+
779
+ Validate attacker-controlled paths before calling normalization or stripping
780
+ helpers. After validation, `stripArchivePath(entryPath, 0)` returns the canonical
781
+ pre-strip identity used by extraction filters (or `null` for an empty path).
782
+
783
+ ## Common patterns
784
+
785
+ ### Extract an upload, surface budget violations
786
+
787
+ ```ts
788
+ import { extractArchive, ArchiveLimitError, ARCHIVE_LIMIT_ERROR_CODE } from "@openclaw/fs-safe/archive";
789
+
790
+ try {
791
+ await extractArchive({
792
+ archivePath: upload.path,
793
+ destDir: targetDir,
794
+ kind: "zip",
795
+ timeoutMs: 30_000,
796
+ limits: {
797
+ maxArchiveBytes: 100 * 1024 * 1024,
798
+ maxEntries: 10_000,
799
+ maxExtractedBytes: 200 * 1024 * 1024,
800
+ maxEntryBytes: 50 * 1024 * 1024,
801
+ },
802
+ });
803
+ } catch (err) {
804
+ if (err instanceof ArchiveLimitError) {
805
+ return reply(413, { code: err.code, message: err.message });
806
+ }
807
+ throw err;
808
+ }
809
+ ```
810
+
811
+ ### Decide kind from MIME, not filename
812
+
813
+ ```ts
814
+ const kind: ArchiveKind = mime === "application/zip" ? "zip" : "tar";
815
+ await extractArchive({ archivePath, destDir, kind, timeoutMs: 10_000 });
816
+ ```
817
+
818
+ ### Stage to private dir, then commit as a directory
819
+
820
+ ```ts
821
+ import { withTempWorkspace } from "@openclaw/fs-safe/temp";
822
+ import { replaceDirectoryAtomic } from "@openclaw/fs-safe/atomic";
823
+
824
+ await withTempWorkspace({ rootDir: "/srv/site/tmp", prefix: "extract-" }, async (ws) => {
825
+ await extractArchive({
826
+ archivePath: upload.path,
827
+ destDir: ws.dir,
828
+ timeoutMs: 30_000,
829
+ });
830
+ await replaceDirectoryAtomic({
831
+ stagedDir: ws.dir,
832
+ targetDir: "/srv/site/plugin",
833
+ });
834
+ });
835
+ ```
836
+
837
+ ## See also
838
+
839
+ - [Atomic writes](atomic.md) — `replaceDirectoryAtomic` for staged directory replacement.
840
+ - [Temp workspaces](temp.md) — extract into a private workspace and commit as one step.
841
+ - [Errors](errors.md) — `FsSafeError` codes the underlying writes can raise.
842
+ - [Migrating to 0.5](migrating-to-0.5.md) — clamp-default and native-format upgrade checklist.
843
+ - [`extractArchive` source](https://github.com/openclaw/fs-safe/blob/main/src/archive.ts).