@openclaw/fs-safe 0.16.0 → 0.18.0

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 (705) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +8 -1
  3. package/dist/absolute-path.d.ts +0 -1
  4. package/dist/absolute-path.js +2 -8
  5. package/dist/advanced.d.ts +2 -1
  6. package/dist/advanced.js +2 -0
  7. package/dist/archive-crc32.d.ts +0 -1
  8. package/dist/archive-deadline.d.ts +0 -1
  9. package/dist/archive-deadline.js +22 -23
  10. package/dist/archive-durability.d.ts +0 -1
  11. package/dist/archive-entry.d.ts +0 -1
  12. package/dist/archive-errors.d.ts +0 -1
  13. package/dist/archive-gzip-tail.d.ts +0 -1
  14. package/dist/archive-input.d.ts +0 -1
  15. package/dist/archive-kind.d.ts +0 -1
  16. package/dist/archive-limits.d.ts +0 -1
  17. package/dist/archive-merge.d.ts +3 -4
  18. package/dist/archive-merge.js +17 -7
  19. package/dist/archive-native.d.ts +3 -14
  20. package/dist/archive-native.js +46 -70
  21. package/dist/archive-options.d.ts +9 -2
  22. package/dist/archive-parser-errors.d.ts +0 -1
  23. package/dist/archive-parser.wasm +0 -0
  24. package/dist/archive-plan.d.ts +10 -1
  25. package/dist/archive-plan.js +31 -21
  26. package/dist/archive-policy.d.ts +0 -1
  27. package/dist/archive-read.d.ts +0 -1
  28. package/dist/archive-staging.d.ts +0 -1
  29. package/dist/archive-tar-inspect.d.ts +0 -1
  30. package/dist/archive-tar-stream.d.ts +0 -1
  31. package/dist/archive-tar-wasm.d.ts +0 -1
  32. package/dist/archive-tar.d.ts +0 -1
  33. package/dist/archive-zip-admission.d.ts +0 -1
  34. package/dist/archive-zip-count.d.ts +0 -1
  35. package/dist/archive-zip-count.js +21 -1
  36. package/dist/archive-zip-directory.d.ts +0 -1
  37. package/dist/archive-zip-directory.js +23 -1
  38. package/dist/archive-zip-entry.d.ts +0 -1
  39. package/dist/archive-zip-integrity.d.ts +0 -1
  40. package/dist/archive-zip-loader.d.ts +2 -1
  41. package/dist/archive-zip-loader.js +7 -0
  42. package/dist/archive-zip-manifest.d.ts +0 -1
  43. package/dist/archive-zip-names.d.ts +0 -1
  44. package/dist/archive-zip-names.js +7 -2
  45. package/dist/archive-zip-preflight.d.ts +0 -1
  46. package/dist/archive.d.ts +0 -1
  47. package/dist/archive.js +93 -164
  48. package/dist/async-lock.d.ts +0 -1
  49. package/dist/atomic.d.ts +0 -1
  50. package/dist/bounded-read-stream.d.ts +0 -1
  51. package/dist/bounded-read.d.ts +0 -1
  52. package/dist/byte-budget.d.ts +0 -1
  53. package/dist/byte-view.d.ts +2 -0
  54. package/dist/byte-view.js +13 -0
  55. package/dist/clone-metadata.d.ts +0 -1
  56. package/dist/config.d.ts +0 -1
  57. package/dist/containment.d.ts +0 -1
  58. package/dist/copy-file-input.d.ts +0 -1
  59. package/dist/copy-policy.d.ts +0 -1
  60. package/dist/copy-publication.d.ts +0 -1
  61. package/dist/copy-tree-portable.d.ts +0 -1
  62. package/dist/copy-tree-portable.js +9 -6
  63. package/dist/copy.d.ts +0 -1
  64. package/dist/copy.js +5 -5
  65. package/dist/create-directory.d.ts +0 -2
  66. package/dist/create-directory.js +3 -22
  67. package/dist/create-file-async.d.ts +0 -1
  68. package/dist/create-file.d.ts +0 -1
  69. package/dist/create-file.js +3 -14
  70. package/dist/create-owned-file.d.ts +0 -1
  71. package/dist/create.d.ts +1 -2
  72. package/dist/create.js +1 -1
  73. package/dist/creation-darwin.d.ts +0 -2
  74. package/dist/creation-darwin.js +0 -9
  75. package/dist/creation-file-state.d.ts +0 -1
  76. package/dist/creation-path.d.ts +2 -1
  77. package/dist/creation-path.js +12 -0
  78. package/dist/creation-permissions.d.ts +0 -1
  79. package/dist/creation-permissions.js +28 -38
  80. package/dist/deny-mutations.d.ts +2 -3
  81. package/dist/deny-mutations.js +55 -35
  82. package/dist/device-path.d.ts +0 -1
  83. package/dist/directory-durability.d.ts +6 -7
  84. package/dist/directory-entry-path.d.ts +0 -1
  85. package/dist/directory-guard.d.ts +2 -7
  86. package/dist/directory-guard.js +25 -56
  87. package/dist/directory-mode-node.d.ts +0 -1
  88. package/dist/directory-mode-owner.d.ts +0 -1
  89. package/dist/directory-receipt.d.ts +2 -3
  90. package/dist/directory-receipt.js +15 -19
  91. package/dist/durability.d.ts +0 -1
  92. package/dist/effective-uid.d.ts +0 -1
  93. package/dist/error-detail.d.ts +0 -1
  94. package/dist/errors.d.ts +0 -1
  95. package/dist/file-cleanup.d.ts +1 -1
  96. package/dist/file-cleanup.js +7 -4
  97. package/dist/file-contents.d.ts +5 -0
  98. package/dist/file-contents.js +40 -0
  99. package/dist/file-handle-transfer.d.ts +0 -1
  100. package/dist/file-hash.d.ts +0 -1
  101. package/dist/file-hash.js +186 -70
  102. package/dist/file-identity.d.ts +0 -1
  103. package/dist/file-lock-sync-acquisition.d.ts +22 -0
  104. package/dist/file-lock-sync-acquisition.js +98 -0
  105. package/dist/file-lock-sync-admission.d.ts +0 -2
  106. package/dist/file-lock-sync-admission.js +9 -48
  107. package/dist/file-lock-sync-root-acquire.d.ts +0 -1
  108. package/dist/file-lock-sync-root-acquire.js +35 -98
  109. package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
  110. package/dist/file-lock-sync-root-held.d.ts +1 -3
  111. package/dist/file-lock-sync-root-held.js +7 -5
  112. package/dist/file-lock-sync-root-io.d.ts +0 -1
  113. package/dist/file-lock-sync-root-mutation.d.ts +4 -5
  114. package/dist/file-lock-sync-root-mutation.js +7 -9
  115. package/dist/file-lock-sync-root-options.d.ts +0 -1
  116. package/dist/file-lock-sync-root-registration.d.ts +0 -1
  117. package/dist/file-lock-sync-root.d.ts +1 -2
  118. package/dist/file-lock-sync-root.js +14 -87
  119. package/dist/file-lock-sync-stale-admission.d.ts +2 -7
  120. package/dist/file-lock-sync-stale-admission.js +24 -23
  121. package/dist/file-lock-sync.d.ts +0 -1
  122. package/dist/file-lock-sync.js +46 -128
  123. package/dist/file-lock.d.ts +0 -1
  124. package/dist/file-observation.d.ts +0 -1
  125. package/dist/file-store-boundary.d.ts +0 -2
  126. package/dist/file-store-boundary.js +6 -26
  127. package/dist/file-store-copy-source.d.ts +1 -2
  128. package/dist/file-store-copy-source.js +1 -1
  129. package/dist/file-store-limit.d.ts +1 -2
  130. package/dist/file-store-limit.js +2 -3
  131. package/dist/file-store-path.d.ts +0 -1
  132. package/dist/file-store-prune.d.ts +0 -1
  133. package/dist/file-store-sync-directory.d.ts +0 -1
  134. package/dist/file-store-sync-directory.js +194 -231
  135. package/dist/file-store-sync-write.d.ts +0 -1
  136. package/dist/file-store-sync-write.js +16 -26
  137. package/dist/file-store.d.ts +0 -1
  138. package/dist/file-store.js +6 -7
  139. package/dist/file-sync.d.ts +0 -1
  140. package/dist/filename.d.ts +0 -1
  141. package/dist/filename.js +1 -7
  142. package/dist/fs.d.ts +0 -1
  143. package/dist/guarded-mkdir.d.ts +0 -1
  144. package/dist/guarded-mkdir.js +6 -27
  145. package/dist/guarded-mutation.d.ts +0 -7
  146. package/dist/guarded-mutation.js +6 -11
  147. package/dist/guest-dispatch-python.d.ts +0 -1
  148. package/dist/guest-dispatch-python.js +41 -90
  149. package/dist/guest-native-python.d.ts +0 -1
  150. package/dist/guest.d.ts +0 -1
  151. package/dist/home-dir.d.ts +0 -1
  152. package/dist/index.d.ts +0 -1
  153. package/dist/install-path.d.ts +0 -1
  154. package/dist/install-path.js +2 -5
  155. package/dist/json-document-store.d.ts +0 -1
  156. package/dist/json-durable-queue-directory.d.ts +13 -1
  157. package/dist/json-durable-queue-directory.js +134 -0
  158. package/dist/json-durable-queue-ownership.d.ts +0 -1
  159. package/dist/json-durable-queue-ownership.js +43 -66
  160. package/dist/json-durable-queue-read.d.ts +0 -1
  161. package/dist/json-durable-queue-read.js +6 -6
  162. package/dist/json-durable-queue.d.ts +0 -1
  163. package/dist/json-durable-queue.js +17 -139
  164. package/dist/json-store.d.ts +0 -1
  165. package/dist/json-stringify.d.ts +0 -1
  166. package/dist/json.d.ts +0 -1
  167. package/dist/json.js +38 -90
  168. package/dist/local-file-access.d.ts +0 -1
  169. package/dist/local-file-access.js +3 -10
  170. package/dist/local-file-descriptor.d.ts +0 -1
  171. package/dist/local-roots.d.ts +0 -1
  172. package/dist/local-roots.js +19 -21
  173. package/dist/lock-config.d.ts +0 -1
  174. package/dist/move-path-cleanup.d.ts +5 -20
  175. package/dist/move-path-cleanup.js +57 -21
  176. package/dist/move-path-stage.d.ts +0 -1
  177. package/dist/move-path.d.ts +0 -1
  178. package/dist/move-path.js +62 -39
  179. package/dist/mutation-authority.d.ts +0 -1
  180. package/dist/native-binding.d.ts +0 -1
  181. package/dist/native-config.d.ts +0 -1
  182. package/dist/native-directory-observation.d.ts +0 -1
  183. package/dist/native-fallback-warning.d.ts +0 -1
  184. package/dist/native-operations.d.ts +1 -5
  185. package/dist/native-operations.js +2 -6
  186. package/dist/native-parent-admission.d.ts +0 -1
  187. package/dist/native-pinned-write-windows.d.ts +0 -1
  188. package/dist/native-pinned-write.d.ts +0 -1
  189. package/dist/native-pinned-write.js +4 -10
  190. package/dist/native-policy-directory-observation.d.ts +0 -1
  191. package/dist/native-policy-parent-windows.d.ts +0 -1
  192. package/dist/native-rename-outcome.d.ts +0 -1
  193. package/dist/native-staged-file.d.ts +17 -4
  194. package/dist/native-staged-file.js +63 -68
  195. package/dist/native.d.ts +0 -1
  196. package/dist/native.js +2 -2
  197. package/dist/opened-file-failure.d.ts +0 -1
  198. package/dist/opened-realpath.d.ts +0 -1
  199. package/dist/opened-realpath.js +11 -2
  200. package/dist/output.d.ts +0 -1
  201. package/dist/overwrite-file-handle.d.ts +0 -1
  202. package/dist/owner-dacl.d.ts +0 -1
  203. package/dist/path-case.d.ts +0 -1
  204. package/dist/path-policy.d.ts +0 -1
  205. package/dist/path-prefix.d.ts +0 -1
  206. package/dist/path-scope-lexical.d.ts +0 -1
  207. package/dist/path-segment-route.d.ts +0 -1
  208. package/dist/path-suffix-aliases.d.ts +0 -1
  209. package/dist/path.d.ts +0 -1
  210. package/dist/path.js +2 -1
  211. package/dist/permission-exec.d.ts +0 -1
  212. package/dist/permission-exec.js +19 -25
  213. package/dist/permissions-public.d.ts +0 -1
  214. package/dist/permissions-windows.d.ts +2 -10
  215. package/dist/permissions-windows.js +10 -30
  216. package/dist/permissions.d.ts +0 -1
  217. package/dist/permissions.js +11 -33
  218. package/dist/pinned-mutation-admission.d.ts +0 -1
  219. package/dist/pinned-mutation-observation.d.ts +0 -1
  220. package/dist/pinned-mutation-shared-route.d.ts +0 -1
  221. package/dist/pinned-open.d.ts +1 -1
  222. package/dist/pinned-open.js +1 -1
  223. package/dist/pinned-operation.d.ts +0 -1
  224. package/dist/pinned-write-input.d.ts +0 -1
  225. package/dist/pinned-write-input.js +11 -1
  226. package/dist/pinned-write-mode.d.ts +3 -4
  227. package/dist/pinned-write-mode.js +15 -8
  228. package/dist/pinned-write-staged.d.ts +0 -1
  229. package/dist/pinned-write-staged.js +10 -11
  230. package/dist/pinned-write-types.d.ts +9 -21
  231. package/dist/pinned-write.d.ts +0 -1
  232. package/dist/pinned-write.js +17 -13
  233. package/dist/positional-read.d.ts +0 -1
  234. package/dist/private-directory.d.ts +0 -1
  235. package/dist/private-producer-handoff-sync.d.ts +0 -1
  236. package/dist/private-producer-handoff-sync.js +9 -51
  237. package/dist/private-producer-handoff.d.ts +20 -1
  238. package/dist/private-producer-handoff.js +69 -46
  239. package/dist/private-temp-workspace.d.ts +0 -1
  240. package/dist/private-temp-workspace.js +11 -36
  241. package/dist/publish-copy-stage.d.ts +0 -1
  242. package/dist/publish-file-failure.d.ts +0 -1
  243. package/dist/publish-file.d.ts +2 -3
  244. package/dist/publish-file.js +56 -96
  245. package/dist/read-open-flags.d.ts +0 -1
  246. package/dist/read-opened-file.d.ts +0 -1
  247. package/dist/realpath.d.ts +0 -1
  248. package/dist/recursive-mkdir-path.d.ts +0 -1
  249. package/dist/regular-file.d.ts +0 -1
  250. package/dist/regular-file.js +107 -178
  251. package/dist/replace-directory.d.ts +0 -1
  252. package/dist/replace-file-copy-fallback.d.ts +0 -1
  253. package/dist/replace-file-copy-fallback.js +42 -29
  254. package/dist/replace-file-copy-source.d.ts +0 -1
  255. package/dist/replace-file-copy-source.js +19 -23
  256. package/dist/replace-file-descriptor.d.ts +0 -1
  257. package/dist/replace-file-descriptor.js +16 -17
  258. package/dist/replace-file-mode.d.ts +0 -1
  259. package/dist/replace-file-rename-policy.d.ts +0 -1
  260. package/dist/replace-file-temp-owner.d.ts +12 -13
  261. package/dist/replace-file-temp-owner.js +72 -91
  262. package/dist/replace-file.d.ts +0 -1
  263. package/dist/replace-file.js +9 -13
  264. package/dist/retained-directory-replacement.d.ts +0 -1
  265. package/dist/root-boundary.d.ts +0 -1
  266. package/dist/root-context.d.ts +0 -1
  267. package/dist/root-create-input.d.ts +0 -1
  268. package/dist/root-directory-creation.d.ts +0 -1
  269. package/dist/root-directory-list.d.ts +0 -1
  270. package/dist/root-directory-list.js +20 -3
  271. package/dist/root-directory.d.ts +0 -1
  272. package/dist/root-entries.d.ts +0 -1
  273. package/dist/root-errors.d.ts +0 -1
  274. package/dist/root-file-final-admission.d.ts +1 -2
  275. package/dist/root-file-final-admission.js +5 -2
  276. package/dist/root-file.d.ts +0 -1
  277. package/dist/root-file.js +3 -2
  278. package/dist/root-impl.d.ts +2 -10
  279. package/dist/root-impl.js +164 -111
  280. package/dist/root-move-noreplace.d.ts +2 -1
  281. package/dist/root-move-noreplace.js +2 -2
  282. package/dist/root-move-preflight.d.ts +0 -1
  283. package/dist/root-observed-path.d.ts +0 -1
  284. package/dist/root-options.d.ts +0 -1
  285. package/dist/root-path-errors.d.ts +0 -1
  286. package/dist/root-path-existing.d.ts +3 -1
  287. package/dist/root-path-existing.js +39 -18
  288. package/dist/root-path-observation.d.ts +0 -1
  289. package/dist/root-path-stat.d.ts +0 -1
  290. package/dist/root-path.d.ts +0 -1
  291. package/dist/root-path.js +60 -188
  292. package/dist/root-paths-lexical.d.ts +0 -1
  293. package/dist/root-paths.d.ts +0 -1
  294. package/dist/root-read-admission.d.ts +0 -1
  295. package/dist/root-read-admission.js +31 -39
  296. package/dist/root-remove-identity.d.ts +0 -1
  297. package/dist/root-remove-receipt.d.ts +0 -1
  298. package/dist/root-remove.d.ts +0 -1
  299. package/dist/root-remove.js +15 -1
  300. package/dist/root-symlink-policy.d.ts +0 -1
  301. package/dist/root-walk.d.ts +0 -1
  302. package/dist/root-write-admission.d.ts +0 -1
  303. package/dist/root-write-compatibility.d.ts +0 -1
  304. package/dist/root-write-complete-parent.d.ts +0 -1
  305. package/dist/root-write-lock-binding.d.ts +0 -1
  306. package/dist/root-write-mode.d.ts +0 -1
  307. package/dist/root-write-publication.d.ts +0 -1
  308. package/dist/root-write-verification.d.ts +0 -1
  309. package/dist/root.d.ts +0 -1
  310. package/dist/safe-path-segment.d.ts +1 -2
  311. package/dist/safe-path-segment.js +2 -5
  312. package/dist/secret-file.d.ts +0 -1
  313. package/dist/secret-file.js +7 -17
  314. package/dist/secret-read-async.d.ts +0 -1
  315. package/dist/secret-read-async.js +5 -5
  316. package/dist/secret-read-policy.d.ts +0 -1
  317. package/dist/secret.d.ts +0 -1
  318. package/dist/secure-file-windows.d.ts +0 -6
  319. package/dist/secure-file-windows.js +13 -28
  320. package/dist/secure-file.d.ts +0 -1
  321. package/dist/secure-file.js +9 -9
  322. package/dist/secure-temp-dir.d.ts +0 -1
  323. package/dist/secure-temp-repair.d.ts +0 -1
  324. package/dist/sibling-staged-file.d.ts +0 -1
  325. package/dist/sibling-staged-file.js +32 -39
  326. package/dist/sibling-temp.d.ts +0 -1
  327. package/dist/sidecar-lock-acquire.d.ts +1 -2
  328. package/dist/sidecar-lock-acquire.js +35 -58
  329. package/dist/sidecar-lock-admission-context.d.ts +0 -1
  330. package/dist/sidecar-lock-admission-parser.d.ts +0 -1
  331. package/dist/sidecar-lock-admission.d.ts +1 -5
  332. package/dist/sidecar-lock-admission.js +1 -7
  333. package/dist/sidecar-lock-handle.d.ts +3 -1
  334. package/dist/sidecar-lock-handle.js +6 -0
  335. package/dist/sidecar-lock-policy.d.ts +3 -1
  336. package/dist/sidecar-lock-policy.js +16 -0
  337. package/dist/sidecar-lock-reclaim.d.ts +1 -2
  338. package/dist/sidecar-lock-reclaim.js +11 -8
  339. package/dist/sidecar-lock-registration.d.ts +13 -0
  340. package/dist/sidecar-lock-registration.js +47 -0
  341. package/dist/sidecar-lock-root.d.ts +0 -1
  342. package/dist/sidecar-lock-stale-admission.d.ts +0 -1
  343. package/dist/sidecar-lock-target.d.ts +0 -1
  344. package/dist/sidecar-lock-types.d.ts +0 -1
  345. package/dist/sidecar-lock.d.ts +0 -1
  346. package/dist/sidecar-lock.js +19 -88
  347. package/dist/staged-directory.d.ts +2 -3
  348. package/dist/staged-file-settlement.d.ts +0 -1
  349. package/dist/staged-file-types.d.ts +0 -1
  350. package/dist/standalone-publication-path.d.ts +0 -1
  351. package/dist/stat-observation.d.ts +0 -1
  352. package/dist/store.d.ts +0 -1
  353. package/dist/strict-file-identity.d.ts +1 -2
  354. package/dist/strict-file-identity.js +9 -9
  355. package/dist/string-coerce.d.ts +0 -1
  356. package/dist/suppressed-error.d.ts +0 -1
  357. package/dist/symlink-parents.d.ts +0 -1
  358. package/dist/symlink-parents.js +2 -27
  359. package/dist/temp-cleanup.d.ts +0 -1
  360. package/dist/temp-target.d.ts +0 -1
  361. package/dist/temp-target.js +7 -46
  362. package/dist/temp-workspace-admission.d.ts +0 -8
  363. package/dist/temp-workspace-admission.js +0 -4
  364. package/dist/temp-workspace-child-admission.d.ts +0 -4
  365. package/dist/temp-workspace-child-admission.js +0 -12
  366. package/dist/temp-workspace-descriptor.d.ts +0 -6
  367. package/dist/temp-workspace-descriptor.js +0 -2
  368. package/dist/temp-workspace-identity.d.ts +0 -1
  369. package/dist/temp-workspace-owner.d.ts +1 -1
  370. package/dist/temp-workspace-owner.js +49 -26
  371. package/dist/temp-workspace-permissions.d.ts +0 -1
  372. package/dist/temp-workspace-types.d.ts +0 -1
  373. package/dist/temp.d.ts +0 -1
  374. package/dist/test-hooks.d.ts +0 -1
  375. package/dist/text-atomic.d.ts +0 -1
  376. package/dist/timing.d.ts +0 -1
  377. package/dist/trash.d.ts +0 -1
  378. package/dist/types.d.ts +0 -1
  379. package/dist/unicode-path.d.ts +0 -1
  380. package/dist/unicode-path.js +3 -0
  381. package/dist/walk.d.ts +0 -1
  382. package/dist/walk.js +4 -2
  383. package/dist/windows-command.d.ts +0 -1
  384. package/dist/windows-owner.d.ts +0 -1
  385. package/dist/windows-owner.js +4 -1
  386. package/dist/windows-path-alias.d.ts +0 -1
  387. package/dist/windows-path-alias.js +7 -43
  388. package/dist/windows-path-syntax.d.ts +5 -0
  389. package/dist/windows-path-syntax.js +21 -0
  390. package/dist/windows-security-command.d.ts +0 -1
  391. package/dist/windows-security-facts.d.ts +0 -1
  392. package/dist/write-file-handle.d.ts +7 -1
  393. package/dist/write-file-handle.js +23 -0
  394. package/dist/write-open-flags.d.ts +0 -1
  395. package/dist/write-open-flags.js +1 -8
  396. package/dist/write-queue.d.ts +0 -1
  397. package/dist/write-queue.js +1 -4
  398. package/docs/advanced.md +68 -1
  399. package/docs/archive.md +41 -2
  400. package/docs/atomic.md +43 -5
  401. package/docs/contributing.md +4 -0
  402. package/docs/copy.md +2 -0
  403. package/docs/creation.md +8 -4
  404. package/docs/durability.md +35 -0
  405. package/docs/file-contents.md +68 -0
  406. package/docs/json.md +5 -4
  407. package/docs/local-roots.md +2 -0
  408. package/docs/mutation-policy-proof.md +11 -7
  409. package/docs/native.md +9 -8
  410. package/docs/path.md +4 -4
  411. package/docs/permissions.md +6 -0
  412. package/docs/public-api.md +5 -0
  413. package/docs/quickstart.md +1 -1
  414. package/docs/reading.md +2 -2
  415. package/docs/regular-file.md +3 -0
  416. package/docs/root.md +19 -0
  417. package/docs/secret-file.md +4 -0
  418. package/docs/sidecar-lock.md +9 -1
  419. package/docs/staged-file.md +4 -3
  420. package/docs/store.md +3 -1
  421. package/docs/temp.md +4 -1
  422. package/docs/types.md +18 -2
  423. package/docs/walk.md +7 -0
  424. package/docs/writing.md +18 -5
  425. package/package.json +8 -9
  426. package/dist/absolute-path.d.ts.map +0 -1
  427. package/dist/advanced.d.ts.map +0 -1
  428. package/dist/archive-crc32.d.ts.map +0 -1
  429. package/dist/archive-deadline.d.ts.map +0 -1
  430. package/dist/archive-durability.d.ts.map +0 -1
  431. package/dist/archive-entry.d.ts.map +0 -1
  432. package/dist/archive-errors.d.ts.map +0 -1
  433. package/dist/archive-gzip-tail.d.ts.map +0 -1
  434. package/dist/archive-input.d.ts.map +0 -1
  435. package/dist/archive-kind.d.ts.map +0 -1
  436. package/dist/archive-limits.d.ts.map +0 -1
  437. package/dist/archive-merge.d.ts.map +0 -1
  438. package/dist/archive-native.d.ts.map +0 -1
  439. package/dist/archive-options.d.ts.map +0 -1
  440. package/dist/archive-parser-errors.d.ts.map +0 -1
  441. package/dist/archive-plan.d.ts.map +0 -1
  442. package/dist/archive-policy.d.ts.map +0 -1
  443. package/dist/archive-read.d.ts.map +0 -1
  444. package/dist/archive-staging.d.ts.map +0 -1
  445. package/dist/archive-tar-inspect.d.ts.map +0 -1
  446. package/dist/archive-tar-stream.d.ts.map +0 -1
  447. package/dist/archive-tar-wasm.d.ts.map +0 -1
  448. package/dist/archive-tar.d.ts.map +0 -1
  449. package/dist/archive-zip-admission.d.ts.map +0 -1
  450. package/dist/archive-zip-count.d.ts.map +0 -1
  451. package/dist/archive-zip-directory.d.ts.map +0 -1
  452. package/dist/archive-zip-entry.d.ts.map +0 -1
  453. package/dist/archive-zip-integrity.d.ts.map +0 -1
  454. package/dist/archive-zip-loader.d.ts.map +0 -1
  455. package/dist/archive-zip-manifest.d.ts.map +0 -1
  456. package/dist/archive-zip-names.d.ts.map +0 -1
  457. package/dist/archive-zip-preflight.d.ts.map +0 -1
  458. package/dist/archive.d.ts.map +0 -1
  459. package/dist/async-lock.d.ts.map +0 -1
  460. package/dist/atomic.d.ts.map +0 -1
  461. package/dist/bounded-read-stream.d.ts.map +0 -1
  462. package/dist/bounded-read.d.ts.map +0 -1
  463. package/dist/byte-budget.d.ts.map +0 -1
  464. package/dist/clone-metadata.d.ts.map +0 -1
  465. package/dist/config.d.ts.map +0 -1
  466. package/dist/containment.d.ts.map +0 -1
  467. package/dist/copy-file-input.d.ts.map +0 -1
  468. package/dist/copy-policy.d.ts.map +0 -1
  469. package/dist/copy-publication.d.ts.map +0 -1
  470. package/dist/copy-tree-portable.d.ts.map +0 -1
  471. package/dist/copy.d.ts.map +0 -1
  472. package/dist/create-directory.d.ts.map +0 -1
  473. package/dist/create-file-async.d.ts.map +0 -1
  474. package/dist/create-file.d.ts.map +0 -1
  475. package/dist/create-owned-file.d.ts.map +0 -1
  476. package/dist/create.d.ts.map +0 -1
  477. package/dist/creation-darwin.d.ts.map +0 -1
  478. package/dist/creation-file-state.d.ts.map +0 -1
  479. package/dist/creation-path.d.ts.map +0 -1
  480. package/dist/creation-permissions.d.ts.map +0 -1
  481. package/dist/deny-mutations.d.ts.map +0 -1
  482. package/dist/device-path.d.ts.map +0 -1
  483. package/dist/directory-durability.d.ts.map +0 -1
  484. package/dist/directory-entry-path.d.ts.map +0 -1
  485. package/dist/directory-guard.d.ts.map +0 -1
  486. package/dist/directory-mode-node.d.ts.map +0 -1
  487. package/dist/directory-mode-owner.d.ts.map +0 -1
  488. package/dist/directory-receipt.d.ts.map +0 -1
  489. package/dist/durability.d.ts.map +0 -1
  490. package/dist/effective-uid.d.ts.map +0 -1
  491. package/dist/error-detail.d.ts.map +0 -1
  492. package/dist/errors.d.ts.map +0 -1
  493. package/dist/file-cleanup.d.ts.map +0 -1
  494. package/dist/file-handle-transfer.d.ts.map +0 -1
  495. package/dist/file-hash.d.ts.map +0 -1
  496. package/dist/file-identity.d.ts.map +0 -1
  497. package/dist/file-lock-sync-admission.d.ts.map +0 -1
  498. package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
  499. package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
  500. package/dist/file-lock-sync-root-held.d.ts.map +0 -1
  501. package/dist/file-lock-sync-root-io.d.ts.map +0 -1
  502. package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
  503. package/dist/file-lock-sync-root-options.d.ts.map +0 -1
  504. package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
  505. package/dist/file-lock-sync-root.d.ts.map +0 -1
  506. package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
  507. package/dist/file-lock-sync.d.ts.map +0 -1
  508. package/dist/file-lock.d.ts.map +0 -1
  509. package/dist/file-observation.d.ts.map +0 -1
  510. package/dist/file-store-boundary.d.ts.map +0 -1
  511. package/dist/file-store-copy-source.d.ts.map +0 -1
  512. package/dist/file-store-limit.d.ts.map +0 -1
  513. package/dist/file-store-path.d.ts.map +0 -1
  514. package/dist/file-store-prune.d.ts.map +0 -1
  515. package/dist/file-store-sync-directory.d.ts.map +0 -1
  516. package/dist/file-store-sync-write.d.ts.map +0 -1
  517. package/dist/file-store.d.ts.map +0 -1
  518. package/dist/file-sync.d.ts.map +0 -1
  519. package/dist/filename.d.ts.map +0 -1
  520. package/dist/fs.d.ts.map +0 -1
  521. package/dist/guarded-mkdir.d.ts.map +0 -1
  522. package/dist/guarded-mutation.d.ts.map +0 -1
  523. package/dist/guest-dispatch-python.d.ts.map +0 -1
  524. package/dist/guest-native-python.d.ts.map +0 -1
  525. package/dist/guest.d.ts.map +0 -1
  526. package/dist/home-dir.d.ts.map +0 -1
  527. package/dist/index.d.ts.map +0 -1
  528. package/dist/install-path.d.ts.map +0 -1
  529. package/dist/json-document-store.d.ts.map +0 -1
  530. package/dist/json-durable-queue-directory.d.ts.map +0 -1
  531. package/dist/json-durable-queue-ownership.d.ts.map +0 -1
  532. package/dist/json-durable-queue-paths.d.ts +0 -11
  533. package/dist/json-durable-queue-paths.d.ts.map +0 -1
  534. package/dist/json-durable-queue-paths.js +0 -42
  535. package/dist/json-durable-queue-read.d.ts.map +0 -1
  536. package/dist/json-durable-queue.d.ts.map +0 -1
  537. package/dist/json-store.d.ts.map +0 -1
  538. package/dist/json-stringify.d.ts.map +0 -1
  539. package/dist/json.d.ts.map +0 -1
  540. package/dist/local-file-access.d.ts.map +0 -1
  541. package/dist/local-file-descriptor.d.ts.map +0 -1
  542. package/dist/local-roots.d.ts.map +0 -1
  543. package/dist/lock-config.d.ts.map +0 -1
  544. package/dist/move-path-cleanup.d.ts.map +0 -1
  545. package/dist/move-path-stage.d.ts.map +0 -1
  546. package/dist/move-path.d.ts.map +0 -1
  547. package/dist/mutation-authority.d.ts.map +0 -1
  548. package/dist/native-binding.d.ts.map +0 -1
  549. package/dist/native-config.d.ts.map +0 -1
  550. package/dist/native-directory-observation.d.ts.map +0 -1
  551. package/dist/native-fallback-warning.d.ts.map +0 -1
  552. package/dist/native-operations.d.ts.map +0 -1
  553. package/dist/native-parent-admission.d.ts.map +0 -1
  554. package/dist/native-pinned-write-windows.d.ts.map +0 -1
  555. package/dist/native-pinned-write.d.ts.map +0 -1
  556. package/dist/native-policy-directory-observation.d.ts.map +0 -1
  557. package/dist/native-policy-parent-windows.d.ts.map +0 -1
  558. package/dist/native-rename-outcome.d.ts.map +0 -1
  559. package/dist/native-staged-file.d.ts.map +0 -1
  560. package/dist/native.d.ts.map +0 -1
  561. package/dist/opened-file-failure.d.ts.map +0 -1
  562. package/dist/opened-realpath.d.ts.map +0 -1
  563. package/dist/output.d.ts.map +0 -1
  564. package/dist/overwrite-file-handle.d.ts.map +0 -1
  565. package/dist/owner-dacl.d.ts.map +0 -1
  566. package/dist/path-case.d.ts.map +0 -1
  567. package/dist/path-policy.d.ts.map +0 -1
  568. package/dist/path-prefix.d.ts.map +0 -1
  569. package/dist/path-scope-lexical.d.ts.map +0 -1
  570. package/dist/path-segment-route.d.ts.map +0 -1
  571. package/dist/path-suffix-aliases.d.ts.map +0 -1
  572. package/dist/path.d.ts.map +0 -1
  573. package/dist/permission-exec.d.ts.map +0 -1
  574. package/dist/permissions-public.d.ts.map +0 -1
  575. package/dist/permissions-windows.d.ts.map +0 -1
  576. package/dist/permissions.d.ts.map +0 -1
  577. package/dist/pinned-mutation-admission.d.ts.map +0 -1
  578. package/dist/pinned-mutation-observation.d.ts.map +0 -1
  579. package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
  580. package/dist/pinned-open.d.ts.map +0 -1
  581. package/dist/pinned-operation.d.ts.map +0 -1
  582. package/dist/pinned-write-input.d.ts.map +0 -1
  583. package/dist/pinned-write-mode.d.ts.map +0 -1
  584. package/dist/pinned-write-staged.d.ts.map +0 -1
  585. package/dist/pinned-write-types.d.ts.map +0 -1
  586. package/dist/pinned-write.d.ts.map +0 -1
  587. package/dist/positional-read.d.ts.map +0 -1
  588. package/dist/private-directory.d.ts.map +0 -1
  589. package/dist/private-producer-handoff-sync.d.ts.map +0 -1
  590. package/dist/private-producer-handoff.d.ts.map +0 -1
  591. package/dist/private-temp-workspace.d.ts.map +0 -1
  592. package/dist/publish-copy-stage.d.ts.map +0 -1
  593. package/dist/publish-file-failure.d.ts.map +0 -1
  594. package/dist/publish-file.d.ts.map +0 -1
  595. package/dist/read-open-flags.d.ts.map +0 -1
  596. package/dist/read-opened-file.d.ts.map +0 -1
  597. package/dist/realpath.d.ts.map +0 -1
  598. package/dist/recursive-mkdir-path.d.ts.map +0 -1
  599. package/dist/regular-file.d.ts.map +0 -1
  600. package/dist/replace-directory.d.ts.map +0 -1
  601. package/dist/replace-file-copy-fallback.d.ts.map +0 -1
  602. package/dist/replace-file-copy-source.d.ts.map +0 -1
  603. package/dist/replace-file-descriptor.d.ts.map +0 -1
  604. package/dist/replace-file-mode.d.ts.map +0 -1
  605. package/dist/replace-file-rename-policy.d.ts.map +0 -1
  606. package/dist/replace-file-temp-owner.d.ts.map +0 -1
  607. package/dist/replace-file.d.ts.map +0 -1
  608. package/dist/retained-directory-replacement.d.ts.map +0 -1
  609. package/dist/root-boundary.d.ts.map +0 -1
  610. package/dist/root-context.d.ts.map +0 -1
  611. package/dist/root-create-input.d.ts.map +0 -1
  612. package/dist/root-directory-creation.d.ts.map +0 -1
  613. package/dist/root-directory-list.d.ts.map +0 -1
  614. package/dist/root-directory.d.ts.map +0 -1
  615. package/dist/root-entries.d.ts.map +0 -1
  616. package/dist/root-errors.d.ts.map +0 -1
  617. package/dist/root-file-final-admission.d.ts.map +0 -1
  618. package/dist/root-file.d.ts.map +0 -1
  619. package/dist/root-impl.d.ts.map +0 -1
  620. package/dist/root-move-noreplace.d.ts.map +0 -1
  621. package/dist/root-move-preflight.d.ts.map +0 -1
  622. package/dist/root-observed-path.d.ts.map +0 -1
  623. package/dist/root-options.d.ts.map +0 -1
  624. package/dist/root-path-errors.d.ts.map +0 -1
  625. package/dist/root-path-existing.d.ts.map +0 -1
  626. package/dist/root-path-observation.d.ts.map +0 -1
  627. package/dist/root-path-stat.d.ts.map +0 -1
  628. package/dist/root-path-symlink.d.ts +0 -7
  629. package/dist/root-path-symlink.d.ts.map +0 -1
  630. package/dist/root-path-symlink.js +0 -55
  631. package/dist/root-path.d.ts.map +0 -1
  632. package/dist/root-paths-lexical.d.ts.map +0 -1
  633. package/dist/root-paths.d.ts.map +0 -1
  634. package/dist/root-read-admission.d.ts.map +0 -1
  635. package/dist/root-remove-identity.d.ts.map +0 -1
  636. package/dist/root-remove-receipt.d.ts.map +0 -1
  637. package/dist/root-remove.d.ts.map +0 -1
  638. package/dist/root-symlink-policy.d.ts.map +0 -1
  639. package/dist/root-walk.d.ts.map +0 -1
  640. package/dist/root-write-admission.d.ts.map +0 -1
  641. package/dist/root-write-compatibility.d.ts.map +0 -1
  642. package/dist/root-write-complete-parent.d.ts.map +0 -1
  643. package/dist/root-write-lock-binding.d.ts.map +0 -1
  644. package/dist/root-write-mode.d.ts.map +0 -1
  645. package/dist/root-write-publication.d.ts.map +0 -1
  646. package/dist/root-write-verification.d.ts.map +0 -1
  647. package/dist/root.d.ts.map +0 -1
  648. package/dist/safe-path-segment.d.ts.map +0 -1
  649. package/dist/secret-file.d.ts.map +0 -1
  650. package/dist/secret-read-async.d.ts.map +0 -1
  651. package/dist/secret-read-policy.d.ts.map +0 -1
  652. package/dist/secret.d.ts.map +0 -1
  653. package/dist/secure-file-windows.d.ts.map +0 -1
  654. package/dist/secure-file.d.ts.map +0 -1
  655. package/dist/secure-temp-dir.d.ts.map +0 -1
  656. package/dist/secure-temp-repair.d.ts.map +0 -1
  657. package/dist/sibling-staged-file.d.ts.map +0 -1
  658. package/dist/sibling-temp.d.ts.map +0 -1
  659. package/dist/sidecar-lock-acquire.d.ts.map +0 -1
  660. package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
  661. package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
  662. package/dist/sidecar-lock-admission.d.ts.map +0 -1
  663. package/dist/sidecar-lock-handle.d.ts.map +0 -1
  664. package/dist/sidecar-lock-policy.d.ts.map +0 -1
  665. package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
  666. package/dist/sidecar-lock-root.d.ts.map +0 -1
  667. package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
  668. package/dist/sidecar-lock-target.d.ts.map +0 -1
  669. package/dist/sidecar-lock-types.d.ts.map +0 -1
  670. package/dist/sidecar-lock.d.ts.map +0 -1
  671. package/dist/staged-directory.d.ts.map +0 -1
  672. package/dist/staged-file-settlement.d.ts.map +0 -1
  673. package/dist/staged-file-types.d.ts.map +0 -1
  674. package/dist/standalone-publication-path.d.ts.map +0 -1
  675. package/dist/stat-observation.d.ts.map +0 -1
  676. package/dist/store.d.ts.map +0 -1
  677. package/dist/strict-file-identity.d.ts.map +0 -1
  678. package/dist/string-coerce.d.ts.map +0 -1
  679. package/dist/suppressed-error.d.ts.map +0 -1
  680. package/dist/symlink-parents.d.ts.map +0 -1
  681. package/dist/temp-cleanup.d.ts.map +0 -1
  682. package/dist/temp-target.d.ts.map +0 -1
  683. package/dist/temp-workspace-admission.d.ts.map +0 -1
  684. package/dist/temp-workspace-child-admission.d.ts.map +0 -1
  685. package/dist/temp-workspace-descriptor.d.ts.map +0 -1
  686. package/dist/temp-workspace-identity.d.ts.map +0 -1
  687. package/dist/temp-workspace-owner.d.ts.map +0 -1
  688. package/dist/temp-workspace-permissions.d.ts.map +0 -1
  689. package/dist/temp-workspace-types.d.ts.map +0 -1
  690. package/dist/temp.d.ts.map +0 -1
  691. package/dist/test-hooks.d.ts.map +0 -1
  692. package/dist/text-atomic.d.ts.map +0 -1
  693. package/dist/timing.d.ts.map +0 -1
  694. package/dist/trash.d.ts.map +0 -1
  695. package/dist/types.d.ts.map +0 -1
  696. package/dist/unicode-path.d.ts.map +0 -1
  697. package/dist/walk.d.ts.map +0 -1
  698. package/dist/windows-command.d.ts.map +0 -1
  699. package/dist/windows-owner.d.ts.map +0 -1
  700. package/dist/windows-path-alias.d.ts.map +0 -1
  701. package/dist/windows-security-command.d.ts.map +0 -1
  702. package/dist/windows-security-facts.d.ts.map +0 -1
  703. package/dist/write-file-handle.d.ts.map +0 -1
  704. package/dist/write-open-flags.d.ts.map +0 -1
  705. package/dist/write-queue.d.ts.map +0 -1
@@ -149,6 +149,7 @@ export async function mkdirPathComponentsWithGuards(params) {
149
149
  if (params.revalidateParentAfterBeforeComponent) {
150
150
  await assertAsyncDirectoryGuard(parentGuard);
151
151
  }
152
+ let shouldCreate = true;
152
153
  if (params.beforeCreateComponent) {
153
154
  let missing = false;
154
155
  try {
@@ -159,6 +160,7 @@ export async function mkdirPathComponentsWithGuards(params) {
159
160
  throw error;
160
161
  missing = true;
161
162
  }
163
+ shouldCreate = missing;
162
164
  if (missing) {
163
165
  let prospectiveParent = retainedParentPath;
164
166
  if (!prospectiveParent) {
@@ -177,36 +179,12 @@ export async function mkdirPathComponentsWithGuards(params) {
177
179
  if (!params.synchronousAuthorizationIncludesFence)
178
180
  inspectGuardCurrent(parentGuard);
179
181
  }
180
- params.assertBeforeMutation?.();
181
- // Authority callbacks are an explicit freshness boundary. Recheck the
182
- // exact parent synchronously so no callback-observed authority is
183
- // carried into a pathname mkdir after the parent was swapped.
184
- inspectGuardCurrent(parentGuard);
185
- try {
186
- if (params.private) {
187
- await createDirectoryWithAdmission(next, {
188
- private: true,
189
- mode: params.mode,
190
- assertBeforeMutation: params.assertBeforeMutation,
191
- }, {
192
- expectedParentIdentity: {
193
- dev: parentGuard.stat.dev, ino: parentGuard.stat.ino, realPath: parentGuard.realPath,
194
- },
195
- });
196
- }
197
- else {
198
- await fs.mkdir(next, { mode: params.mode });
199
- }
200
- created = true;
201
- }
202
- catch (error) {
203
- if (!isDirectoryCollision(error))
204
- throw error;
205
- }
206
182
  }
207
183
  }
208
- else {
184
+ if (shouldCreate) {
209
185
  params.assertBeforeMutation?.();
186
+ // Both policy and ordinary mkdir must renew the parent after callbacks.
187
+ inspectGuardCurrent(parentGuard);
210
188
  try {
211
189
  if (params.private) {
212
190
  await createDirectoryWithAdmission(next, {
@@ -222,6 +200,7 @@ export async function mkdirPathComponentsWithGuards(params) {
222
200
  else {
223
201
  await fs.mkdir(next, { mode: params.mode });
224
202
  }
203
+ created = true;
225
204
  }
226
205
  catch (error) {
227
206
  if (!isDirectoryCollision(error))
@@ -13,21 +13,15 @@ export declare function guardedRename(params: {
13
13
  onRenamed?: () => void;
14
14
  from: string;
15
15
  to: string;
16
- targetRoot?: string;
17
- verifyAfter?: boolean;
18
16
  }): Promise<void>;
19
17
  export declare function guardedRenameSync(params: {
20
18
  from: string;
21
19
  to: string;
22
- targetRoot?: string;
23
- verifyAfter?: boolean;
24
20
  }): void;
25
21
  export declare function guardedRm(params: {
26
22
  target: string;
27
23
  assertBeforeMutation?: () => void;
28
24
  recursive?: boolean;
29
- force?: boolean;
30
- verifyAfter?: boolean;
31
25
  }): Promise<void>;
32
26
  export declare function guardedRmSync(params: {
33
27
  target: string;
@@ -36,4 +30,3 @@ export declare function guardedRmSync(params: {
36
30
  force?: boolean;
37
31
  verifyAfter?: boolean;
38
32
  }): void;
39
- //# sourceMappingURL=guarded-mutation.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import fsSync, {} from "node:fs";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
- import { assertAsyncDirectoryGuard, assertSyncDirectoryGuard, createAsyncDirectoryGuard, createNearestExistingDirectoryGuard, createNearestExistingSyncDirectoryGuard, createSyncDirectoryGuard, } from "./directory-guard.js";
4
+ import { assertAsyncDirectoryGuard, assertSyncDirectoryGuard, createAsyncDirectoryGuard, createSyncDirectoryGuard, } from "./directory-guard.js";
5
5
  export async function withAsyncDirectoryGuards(guards, mutate, options = {}) {
6
6
  for (const guard of guards) {
7
7
  await assertAsyncDirectoryGuard(guard);
@@ -44,9 +44,7 @@ export function withSyncDirectoryGuards(guards, mutate, options = {}) {
44
44
  }
45
45
  export async function guardedRename(params) {
46
46
  const sourceGuard = await createAsyncDirectoryGuard(path.dirname(params.from));
47
- const targetGuard = params.targetRoot
48
- ? await createNearestExistingDirectoryGuard(params.targetRoot, path.dirname(params.to))
49
- : await createAsyncDirectoryGuard(path.dirname(params.to));
47
+ const targetGuard = await createAsyncDirectoryGuard(path.dirname(params.to));
50
48
  await withAsyncDirectoryGuards([sourceGuard, targetGuard], async () => {
51
49
  if (params.onSourceInspected) {
52
50
  params.onSourceInspected(fsSync.lstatSync(params.from, { bigint: true }));
@@ -55,14 +53,12 @@ export async function guardedRename(params) {
55
53
  params.assertBeforeRename?.();
56
54
  await fs.rename(params.from, params.to);
57
55
  params.onRenamed?.();
58
- }, { verifyAfter: params.verifyAfter });
56
+ });
59
57
  }
60
58
  export function guardedRenameSync(params) {
61
59
  const sourceGuard = createSyncDirectoryGuard(path.dirname(params.from));
62
- const targetGuard = params.targetRoot
63
- ? createNearestExistingSyncDirectoryGuard(params.targetRoot, path.dirname(params.to))
64
- : createSyncDirectoryGuard(path.dirname(params.to));
65
- withSyncDirectoryGuards([sourceGuard, targetGuard], () => fsSync.renameSync(params.from, params.to), { verifyAfter: params.verifyAfter });
60
+ const targetGuard = createSyncDirectoryGuard(path.dirname(params.to));
61
+ withSyncDirectoryGuards([sourceGuard, targetGuard], () => fsSync.renameSync(params.from, params.to));
66
62
  }
67
63
  export async function guardedRm(params) {
68
64
  const guard = await createAsyncDirectoryGuard(path.dirname(params.target));
@@ -70,9 +66,8 @@ export async function guardedRm(params) {
70
66
  params.assertBeforeMutation?.();
71
67
  await fs.rm(params.target, {
72
68
  ...(params.recursive !== undefined ? { recursive: params.recursive } : {}),
73
- ...(params.force !== undefined ? { force: params.force } : {}),
74
69
  });
75
- }, { verifyAfter: params.verifyAfter });
70
+ });
76
71
  }
77
72
  export function guardedRmSync(params) {
78
73
  const guard = createSyncDirectoryGuard(path.dirname(params.target));
@@ -1,2 +1 @@
1
1
  export declare const GUEST_FILESYSTEM_DISPATCH_PYTHON: string;
2
- //# sourceMappingURL=guest-dispatch-python.d.ts.map
@@ -1,5 +1,5 @@
1
1
  export const GUEST_FILESYSTEM_DISPATCH_PYTHON = [
2
- "if operation == 'copy':",
2
+ "if operation in ('copy', 'rename'):",
3
3
  " src_root_fd = open_dir(sys.argv[2])",
4
4
  " dst_root_fd = open_dir(sys.argv[5])",
5
5
  " src_parent_fd = None",
@@ -7,7 +7,10 @@ export const GUEST_FILESYSTEM_DISPATCH_PYTHON = [
7
7
  " try:",
8
8
  " src_parent_fd = walk_dir(src_root_fd, sys.argv[3], False)",
9
9
  " dst_parent_fd = walk_dir(dst_root_fd, sys.argv[6], sys.argv[8] == '1')",
10
- " copy_file_atomic(src_parent_fd, sys.argv[4], dst_parent_fd, sys.argv[7])",
10
+ " if operation == 'copy':",
11
+ " copy_file_atomic(src_parent_fd, sys.argv[4], dst_parent_fd, sys.argv[7])",
12
+ " else:",
13
+ " move_entry(src_parent_fd, sys.argv[4], dst_parent_fd, sys.argv[7])",
11
14
  " finally:",
12
15
  " if src_parent_fd is not None:",
13
16
  " os.close(src_parent_fd)",
@@ -15,103 +18,51 @@ export const GUEST_FILESYSTEM_DISPATCH_PYTHON = [
15
18
  " os.close(dst_parent_fd)",
16
19
  " os.close(src_root_fd)",
17
20
  " os.close(dst_root_fd)",
18
- "elif operation == 'write':",
21
+ "elif operation in ('write', 'create', 'read', 'readdir', 'mkdirp', 'remove'):",
19
22
  " root_fd = open_dir(sys.argv[2])",
20
23
  " parent_fd = None",
21
24
  " try:",
22
- " parent_fd = walk_dir(root_fd, sys.argv[3], sys.argv[5] == '1')",
23
- " write_atomic(parent_fd, sys.argv[4], sys.stdin.buffer)",
24
- " finally:",
25
- " if parent_fd is not None:",
26
- " os.close(parent_fd)",
27
- " os.close(root_fd)",
28
- "elif operation == 'create':",
29
- " root_fd = open_dir(sys.argv[2])",
30
- " parent_fd = None",
31
- " try:",
32
- " parent_fd = walk_dir(root_fd, sys.argv[3], sys.argv[5] == '1')",
33
- " try:",
34
- " create_exclusive(parent_fd, sys.argv[4], sys.stdin.buffer)",
35
- " except FileExistsError:",
36
- " sys.exit(SANDBOX_CREATE_EXISTS_EXIT_CODE)",
37
- " finally:",
38
- " if parent_fd is not None:",
39
- " os.close(parent_fd)",
40
- " os.close(root_fd)",
41
- "elif operation == 'read':",
42
- " root_fd = open_dir(sys.argv[2])",
43
- " parent_fd = None",
44
- " try:",
45
- " parent_fd = walk_dir(root_fd, sys.argv[3], False)",
46
- " if len(sys.argv) > 5:",
47
- " read_file_bounded(parent_fd, sys.argv[4], int(sys.argv[5]))",
48
- " else:",
49
- " read_file(parent_fd, sys.argv[4])",
50
- " except FileNotFoundError:",
51
- " sys.exit(SANDBOX_READ_NOT_FOUND_EXIT_CODE)",
52
- " finally:",
53
- " if parent_fd is not None:",
54
- " os.close(parent_fd)",
55
- " os.close(root_fd)",
56
- "elif operation == 'readdir':",
57
- " root_fd = open_dir(sys.argv[2])",
58
- " target_fd = None",
59
- " try:",
60
- " target_fd = walk_dir(root_fd, sys.argv[3], False)",
61
- " with os.scandir(target_fd) as entries:",
62
- " print(json.dumps([{'name': entry.name, 'isDirectory': entry.is_dir(follow_symlinks=False), 'isFile': entry.is_file(follow_symlinks=False)} for entry in entries]))",
63
- " finally:",
64
- " if target_fd is not None:",
65
- " os.close(target_fd)",
66
- " os.close(root_fd)",
67
- "elif operation == 'mkdirp':",
68
- " root_fd = open_dir(sys.argv[2])",
69
- " target_fd = None",
70
- " try:",
71
- " target_fd = walk_dir(root_fd, sys.argv[3], True)",
72
- " os.fsync(target_fd)",
73
- " finally:",
74
- " if target_fd is not None:",
75
- " os.close(target_fd)",
76
- " os.close(root_fd)",
77
- "elif operation == 'remove':",
78
- " root_fd = open_dir(sys.argv[2])",
79
- " parent_fd = None",
80
- " try:",
81
- " parent_fd = walk_dir(root_fd, sys.argv[3], False)",
82
- " try:",
83
- " if sys.argv[5] == '1':",
84
- " remove_tree(parent_fd, sys.argv[4])",
25
+ " mkdir_enabled = operation == 'mkdirp' or (operation in ('write', 'create') and sys.argv[5] == '1')",
26
+ " parent_fd = walk_dir(root_fd, sys.argv[3], mkdir_enabled)",
27
+ " if operation == 'write':",
28
+ " write_atomic(parent_fd, sys.argv[4], sys.stdin.buffer)",
29
+ " elif operation == 'create':",
30
+ " try:",
31
+ " create_exclusive(parent_fd, sys.argv[4], sys.stdin.buffer)",
32
+ " except FileExistsError:",
33
+ " sys.exit(SANDBOX_CREATE_EXISTS_EXIT_CODE)",
34
+ " elif operation == 'read':",
35
+ " if len(sys.argv) > 5:",
36
+ " read_file_bounded(parent_fd, sys.argv[4], int(sys.argv[5]))",
85
37
  " else:",
86
- " entry_stat = os.lstat(sys.argv[4], dir_fd=parent_fd)",
87
- " if stat.S_ISDIR(entry_stat.st_mode) and not stat.S_ISLNK(entry_stat.st_mode):",
88
- " os.rmdir(sys.argv[4], dir_fd=parent_fd)",
89
- " else:",
90
- " os.unlink(sys.argv[4], dir_fd=parent_fd)",
38
+ " read_file(parent_fd, sys.argv[4])",
39
+ " elif operation == 'readdir':",
40
+ " with os.scandir(parent_fd) as entries:",
41
+ " print(json.dumps([{'name': entry.name, 'isDirectory': entry.is_dir(follow_symlinks=False), 'isFile': entry.is_file(follow_symlinks=False)} for entry in entries]))",
42
+ " elif operation == 'mkdirp':",
91
43
  " os.fsync(parent_fd)",
92
- " except FileNotFoundError:",
93
- " if sys.argv[6] != '1':",
94
- " raise",
44
+ " elif operation == 'remove':",
45
+ " try:",
46
+ " if sys.argv[5] == '1':",
47
+ " remove_tree(parent_fd, sys.argv[4])",
48
+ " else:",
49
+ " entry_stat = os.lstat(sys.argv[4], dir_fd=parent_fd)",
50
+ " if stat.S_ISDIR(entry_stat.st_mode) and not stat.S_ISLNK(entry_stat.st_mode):",
51
+ " os.rmdir(sys.argv[4], dir_fd=parent_fd)",
52
+ " else:",
53
+ " os.unlink(sys.argv[4], dir_fd=parent_fd)",
54
+ " os.fsync(parent_fd)",
55
+ " except FileNotFoundError:",
56
+ " if sys.argv[6] != '1':",
57
+ " raise",
58
+ " except FileNotFoundError:",
59
+ " if operation == 'read':",
60
+ " sys.exit(SANDBOX_READ_NOT_FOUND_EXIT_CODE)",
61
+ " raise",
95
62
  " finally:",
96
63
  " if parent_fd is not None:",
97
64
  " os.close(parent_fd)",
98
65
  " os.close(root_fd)",
99
- "elif operation == 'rename':",
100
- " src_root_fd = open_dir(sys.argv[2])",
101
- " dst_root_fd = open_dir(sys.argv[5])",
102
- " src_parent_fd = None",
103
- " dst_parent_fd = None",
104
- " try:",
105
- " src_parent_fd = walk_dir(src_root_fd, sys.argv[3], False)",
106
- " dst_parent_fd = walk_dir(dst_root_fd, sys.argv[6], sys.argv[8] == '1')",
107
- " move_entry(src_parent_fd, sys.argv[4], dst_parent_fd, sys.argv[7])",
108
- " finally:",
109
- " if src_parent_fd is not None:",
110
- " os.close(src_parent_fd)",
111
- " if dst_parent_fd is not None:",
112
- " os.close(dst_parent_fd)",
113
- " os.close(src_root_fd)",
114
- " os.close(dst_root_fd)",
115
66
  "else:",
116
67
  " raise RuntimeError('unknown sandbox mutation operation: ' + operation)",
117
68
  ].join("\n");
@@ -1,4 +1,3 @@
1
1
  export declare const GUEST_FILESYSTEM_CREATE_STAGING_PYTHON: string;
2
2
  export declare const GUEST_FILESYSTEM_RENAME_NO_REPLACE_PYTHON: string;
3
3
  export declare const GUEST_FILESYSTEM_CREATE_EXCLUSIVE_PYTHON: string;
4
- //# sourceMappingURL=guest-native-python.d.ts.map
package/dist/guest.d.ts CHANGED
@@ -6,4 +6,3 @@ export declare const GUEST_FILESYSTEM_READ_NOT_FOUND_EXIT_CODE = 2;
6
6
  /** Python 3 source for the descriptor-relative guest filesystem protocol. See docs/guest.md. */
7
7
  export declare const GUEST_FILESYSTEM_PYTHON: string;
8
8
  export { GUEST_FILESYSTEM_RENAME_NO_REPLACE_PYTHON };
9
- //# sourceMappingURL=guest.d.ts.map
@@ -9,4 +9,3 @@ export declare function resolveHomeRelativePath(input: string, opts?: {
9
9
  env?: NodeJS.ProcessEnv;
10
10
  homedir?: () => string;
11
11
  }): string;
12
- //# sourceMappingURL=home-dir.d.ts.map
package/dist/index.d.ts CHANGED
@@ -4,4 +4,3 @@ export type { ContainmentGuarantee } from "./containment.js";
4
4
  export { configureFsSafePython, configureFsSafeNative, getFsSafeNativeConfig, type FsSafePythonConfig, type FsSafeNativeConfig, type FsSafeNativeMode, } from "./native-config.js";
5
5
  export { writeExternalFileWithinRoot, type ExternalFileWriteOptions, type ExternalFileWriteResult, } from "./output.js";
6
6
  export { configureFsSafeLocks, getFsSafeLockConfig, type FsSafeLockConfig, } from "./lock-config.js";
7
- //# sourceMappingURL=index.d.ts.map
@@ -23,4 +23,3 @@ export declare function assertCanonicalPathWithinBase(params: {
23
23
  candidatePath: string;
24
24
  boundaryLabel: string;
25
25
  }): Promise<void>;
26
- //# sourceMappingURL=install-path.d.ts.map
@@ -15,11 +15,8 @@ export function safeDirName(input) {
15
15
  export function safePathSegmentHashed(input) {
16
16
  const trimmed = input.trim();
17
17
  const base = trimmed
18
- .replaceAll(/[\\/]/g, "-")
19
- .replaceAll(/[^a-zA-Z0-9._-]/g, "-")
20
- .replaceAll(/-+/g, "-")
21
- .replaceAll(/^-+/g, "")
22
- .replaceAll(/-+$/g, "");
18
+ .replaceAll(/[^a-zA-Z0-9._]+/g, "-")
19
+ .replaceAll(/^-|-$/g, "");
23
20
  const normalized = base.length > 0 ? base : "skill";
24
21
  const safe = normalized === "." || normalized === ".." ? "skill" : normalized;
25
22
  if (safe !== trimmed || safe.length > 60) {
@@ -35,4 +35,3 @@ export type JsonStoreAdapter<T> = {
35
35
  }): Promise<void>;
36
36
  };
37
37
  export declare function createJsonStore<T>(adapter: JsonStoreAdapter<T>, options?: JsonFileStoreOptions): JsonStore<T>;
38
- //# sourceMappingURL=json-document-store.d.ts.map
@@ -1,2 +1,14 @@
1
+ export declare function queueDirectories(queueDir: string, failedDir: string): Promise<{
2
+ queue: QueueDirectory;
3
+ failed: QueueDirectory;
4
+ }>;
5
+ declare class QueueDirectory {
6
+ private readonly dir;
7
+ private readonly root;
8
+ private readonly allowSymlinkBase;
9
+ constructor(dir: string);
10
+ ensure(): Promise<void>;
11
+ assert(allowMissing?: boolean): Promise<void>;
12
+ }
1
13
  export declare function syncQueueDirectoryCreation(dir: string, validationBase: string): Promise<void>;
2
- //# sourceMappingURL=json-durable-queue-directory.d.ts.map
14
+ export {};
@@ -1,7 +1,141 @@
1
+ import fs from "node:fs";
1
2
  import path from "node:path";
2
3
  import { syncDirectory } from "./directory-durability.js";
3
4
  import { isPathRelativeEscape } from "./path.js";
4
5
  import { realpathSync } from "./realpath.js";
6
+ import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
7
+ import { assertNoWindowsPathAlias, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
8
+ export async function queueDirectories(queueDir, failedDir) {
9
+ const queue = new QueueDirectory(queueDir);
10
+ return { queue, failed: new QueueDirectory(failedDir) };
11
+ }
12
+ class QueueDirectory {
13
+ dir;
14
+ root;
15
+ allowSymlinkBase;
16
+ constructor(dir) {
17
+ this.dir = dir;
18
+ this.root = path.parse(resolveQueueFilesystemPath(dir)).root;
19
+ this.allowSymlinkBase = process.platform === "darwin";
20
+ }
21
+ async ensure() {
22
+ await this.assert(true);
23
+ await fs.promises.mkdir(recursiveMkdirPath(this.dir), { recursive: true, mode: 0o700 });
24
+ await this.assert();
25
+ await chmodQueueDirectory(this.dir);
26
+ await syncQueueDirectoryCreation(this.dir, this.root);
27
+ }
28
+ async assert(allowMissing = false) {
29
+ const dir = this.dir;
30
+ let base = resolveQueueFilesystemPath(this.root);
31
+ let target = resolveQueueFilesystemPath(dir);
32
+ let current = base;
33
+ let baseStat = fs.lstatSync(base);
34
+ if (baseStat.isSymbolicLink() && this.allowSymlinkBase) {
35
+ const relative = path.relative(base, target);
36
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
37
+ throw new Error(`durable queue path is not a directory: ${dir}`);
38
+ }
39
+ base = realpathSync.native(base);
40
+ target = path.join(base, ...relative.split(path.sep).filter(Boolean));
41
+ current = base;
42
+ baseStat = fs.lstatSync(base);
43
+ }
44
+ if (baseStat.isSymbolicLink() || !baseStat.isDirectory()) {
45
+ throw new Error(`durable queue path is not a directory: ${dir}`);
46
+ }
47
+ const segments = path.relative(base, target).split(path.sep).filter(Boolean);
48
+ for (let index = 0; index < segments.length; index++) {
49
+ const segment = segments[index];
50
+ if (segment === undefined) {
51
+ continue;
52
+ }
53
+ current = path.join(current, segment);
54
+ let stat;
55
+ try {
56
+ stat = fs.lstatSync(current);
57
+ }
58
+ catch (error) {
59
+ if (allowMissing && error.code === "ENOENT") {
60
+ return;
61
+ }
62
+ throw error;
63
+ }
64
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
65
+ if (stat.isSymbolicLink() && this.allowSymlinkBase) {
66
+ if (await isDarwinSystemAlias(current, stat)) {
67
+ current = realpathSync.native(current);
68
+ continue;
69
+ }
70
+ }
71
+ throw new Error(`durable queue path is not a directory: ${dir}`);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ async function isDarwinSystemAlias(dir, stat) {
77
+ if (process.platform !== "darwin" || !stat.isSymbolicLink()) {
78
+ return false;
79
+ }
80
+ const resolved = path.resolve(dir);
81
+ if (resolved !== "/tmp" && resolved !== "/var") {
82
+ return false;
83
+ }
84
+ try {
85
+ return realpathSync.native(resolved) === `/private${resolved}`;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ async function chmodQueueDirectory(dir) {
92
+ const noFollow = typeof fs.constants.O_NOFOLLOW === "number" && process.platform !== "win32"
93
+ ? fs.constants.O_NOFOLLOW
94
+ : 0;
95
+ const directoryFlag = typeof fs.constants.O_DIRECTORY === "number" && process.platform !== "win32"
96
+ ? fs.constants.O_DIRECTORY
97
+ : 0;
98
+ if (noFollow || directoryFlag) {
99
+ let handle;
100
+ try {
101
+ handle = await fs.promises.open(dir, fs.constants.O_RDONLY | noFollow | directoryFlag);
102
+ const stat = fs.fstatSync(handle.fd);
103
+ if (!stat.isDirectory()) {
104
+ throw new Error(`durable queue path is not a directory: ${dir}`);
105
+ }
106
+ try {
107
+ await handle.chmod(0o700);
108
+ }
109
+ catch {
110
+ // Best-effort on platforms that do not enforce POSIX modes.
111
+ }
112
+ return;
113
+ }
114
+ finally {
115
+ try {
116
+ await handle?.close();
117
+ }
118
+ catch {
119
+ // Best-effort cleanup after chmod/open failures.
120
+ }
121
+ }
122
+ }
123
+ const stat = fs.lstatSync(dir);
124
+ if (stat.isSymbolicLink() || !stat.isDirectory()) {
125
+ throw new Error(`durable queue path is not a directory: ${dir}`);
126
+ }
127
+ try {
128
+ await fs.promises.chmod(dir, 0o700);
129
+ }
130
+ catch {
131
+ // Best-effort on platforms that do not enforce POSIX modes.
132
+ }
133
+ }
134
+ function resolveQueueFilesystemPath(value) {
135
+ const resolved = resolvePathPreservingWindowsRoot(value);
136
+ assertNoWindowsPathAlias(resolved);
137
+ return resolved;
138
+ }
5
139
  export async function syncQueueDirectoryCreation(dir, validationBase) {
6
140
  const baseReal = realpathSync.native(validationBase);
7
141
  const targetReal = realpathSync.native(dir);
@@ -21,4 +21,3 @@ export declare function moveDurableQueueEntryToFailed(params: {
21
21
  failedPath: string;
22
22
  }): Promise<void>;
23
23
  export declare function getErrorCode(error: unknown): string | null;
24
- //# sourceMappingURL=json-durable-queue-ownership.d.ts.map