@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
@@ -57,4 +57,3 @@ export declare function isGroupWritable(bits: number | null): boolean;
57
57
  export declare function isWorldReadable(bits: number | null): boolean;
58
58
  export declare function isGroupReadable(bits: number | null): boolean;
59
59
  export declare function formatPosixMode(mode: number): string;
60
- //# sourceMappingURL=permissions.d.ts.map
@@ -39,23 +39,9 @@ export async function inspectPathPermissions(targetPath, opts) {
39
39
  const admissionPlatform = process.platform === "win32"
40
40
  ? process.platform
41
41
  : (opts?.platform ?? process.platform);
42
- if (hasWindowsPathAlias(targetPath, "filesystem", admissionPlatform)) {
43
- const st = failedSafeStat("Path uses a Windows filesystem namespace alias");
44
- return {
45
- ok: false,
46
- isSymlink: false,
47
- isDir: false,
48
- mode: null,
49
- bits: null,
50
- source: "unknown",
51
- worldWritable: false,
52
- groupWritable: false,
53
- worldReadable: false,
54
- groupReadable: false,
55
- error: st.error,
56
- };
57
- }
58
- const st = await safeStatAdmitted(targetPath);
42
+ const st = hasWindowsPathAlias(targetPath, "filesystem", admissionPlatform)
43
+ ? failedSafeStat("Path uses a Windows filesystem namespace alias")
44
+ : await safeStatAdmitted(targetPath);
59
45
  if (!st.ok) {
60
46
  return {
61
47
  ok: false,
@@ -85,28 +71,20 @@ export async function inspectPathPermissions(targetPath, opts) {
85
71
  }
86
72
  const bits = modeBits(effectiveMode);
87
73
  const platform = opts?.platform ?? process.platform;
88
- if (platform === "win32") {
89
- return await inspectWindowsPermissions({
90
- targetPath,
91
- stat: st,
92
- effectiveIsDir,
93
- effectiveMode,
94
- bits,
95
- opts,
96
- });
97
- }
98
- return {
74
+ const windows = platform === "win32";
75
+ const permissions = {
99
76
  ok: true,
100
77
  isSymlink: st.isSymlink,
101
78
  isDir: effectiveIsDir,
102
79
  mode: effectiveMode,
103
80
  bits,
104
- source: "posix",
105
- worldWritable: isWorldWritable(bits),
106
- groupWritable: isGroupWritable(bits),
107
- worldReadable: isWorldReadable(bits),
108
- groupReadable: isGroupReadable(bits),
81
+ source: windows ? "unknown" : "posix",
82
+ worldWritable: !windows && isWorldWritable(bits),
83
+ groupWritable: !windows && isGroupWritable(bits),
84
+ worldReadable: !windows && isWorldReadable(bits),
85
+ groupReadable: !windows && isGroupReadable(bits),
109
86
  };
87
+ return windows ? await inspectWindowsPermissions(targetPath, permissions, opts) : permissions;
110
88
  }
111
89
  export function formatPermissionDetail(targetPath, perms) {
112
90
  if (perms.source === "windows-acl") {
@@ -22,4 +22,3 @@ export declare function preparePinnedWriteMutationAdmission(params: {
22
22
  relativeParentPath: string;
23
23
  mutationAdmission?: PinnedWriteMutationAdmission;
24
24
  }>;
25
- //# sourceMappingURL=pinned-mutation-admission.d.ts.map
@@ -36,4 +36,3 @@ export declare function mutationObservationCurrent(observation: MutationPathObse
36
36
  export declare function mutationObservationsCurrent(observations: readonly MutationPathObservation[], directories: readonly MutationDirectoryObservation[]): boolean;
37
37
  export declare function advanceMutationObservation(observation: MutationPathObservation, parent: MutationDirectoryObservation, child: MutationDirectoryObservation): MutationPathObservation | undefined;
38
38
  export {};
39
- //# sourceMappingURL=pinned-mutation-observation.d.ts.map
@@ -22,4 +22,3 @@ export declare function simpleSharedRoute(params: {
22
22
  rootIdentity: ExactRootIdentity;
23
23
  } | undefined;
24
24
  export {};
25
- //# sourceMappingURL=pinned-mutation-shared-route.d.ts.map
@@ -5,6 +5,7 @@ export type PinnedOpenSyncResult = {
5
5
  path: string;
6
6
  fd: number;
7
7
  stat: fs.Stats;
8
+ identity: fs.BigIntStats;
8
9
  } | {
9
10
  ok: false;
10
11
  reason: PinnedOpenSyncFailureReason;
@@ -27,4 +28,3 @@ export declare function openPinnedFileSync(params: {
27
28
  ioFs?: PinnedOpenSyncFs;
28
29
  finalAdmission?: PinnedOpenSyncFinalAdmission;
29
30
  }): PinnedOpenSyncResult;
30
- //# sourceMappingURL=pinned-open.d.ts.map
@@ -63,7 +63,7 @@ export function openPinnedFileSync(params) {
63
63
  preRealpathIdentity: pathIdentity,
64
64
  descriptorIdentity: identity,
65
65
  }) ?? realPath;
66
- const opened = { ok: true, path: admittedPath, fd, stat: openedStat };
66
+ const opened = { ok: true, path: admittedPath, fd, stat: openedStat, identity };
67
67
  fd = null;
68
68
  return opened;
69
69
  }
@@ -1,2 +1 @@
1
1
  export declare function validatePinnedOperationPayload(payload: Record<string, unknown>): void;
2
- //# sourceMappingURL=pinned-operation.d.ts.map
@@ -1,4 +1,3 @@
1
1
  import type { FileHandle } from "node:fs/promises";
2
2
  import type { PinnedWriteInput } from "./pinned-write-types.js";
3
3
  export declare function writePinnedInput(target: FileHandle | number, input: PinnedWriteInput, maxBytes?: number, assertBeforeMutation?: () => void): Promise<void>;
4
- //# sourceMappingURL=pinned-write-input.d.ts.map
@@ -1,6 +1,16 @@
1
+ import { types } from "node:util";
2
+ import { snapshotByteView } from "./byte-view.js";
1
3
  import { writeCopyFileToFd } from "./copy-file-input.js";
2
4
  import { FsSafeError } from "./errors.js";
3
5
  import { writeAllToFile } from "./write-file-handle.js";
6
+ const isUint8Array = types.isUint8Array;
7
+ function streamChunkBytes(chunk) {
8
+ if (Buffer.isBuffer(chunk))
9
+ return chunk;
10
+ if (!isUint8Array(chunk))
11
+ return Buffer.from(chunk);
12
+ return snapshotByteView(chunk);
13
+ }
4
14
  export async function writePinnedInput(target, input, maxBytes, assertBeforeMutation) {
5
15
  if (input.kind === "file") {
6
16
  await writeCopyFileToFd(typeof target === "number" ? target : target.fd, input, maxBytes, assertBeforeMutation);
@@ -19,7 +29,7 @@ export async function writePinnedInput(target, input, maxBytes, assertBeforeMuta
19
29
  }
20
30
  else {
21
31
  for await (const chunk of input.stream) {
22
- await write(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
32
+ await write(streamChunkBytes(chunk));
23
33
  }
24
34
  }
25
35
  }
@@ -1,5 +1,4 @@
1
1
  import type { FileHandle } from "node:fs/promises";
2
- export declare function assertPinnedWriteMode(fd: number, mode: number): void;
3
- export declare function preparePinnedWriteMode(handle: FileHandle, createdMode: number, assertBeforeMutation?: () => void): Promise<(() => void) | undefined>;
4
- export declare function pinnedWriteModeAssertion(fd: number, mode: number, assertBeforeMutation?: () => void): () => void;
5
- //# sourceMappingURL=pinned-write-mode.d.ts.map
2
+ export declare function assertPinnedWriteMode(fd: number, mode: number, privateCreation?: boolean): void;
3
+ export declare function preparePinnedWriteMode(handle: FileHandle, createdMode: number, assertBeforeMutation?: () => void, privateCreation?: boolean): Promise<(() => void) | undefined>;
4
+ export declare function pinnedWriteModeAssertion(fd: number, mode: number, assertBeforeMutation?: () => void, privateCreation?: boolean): () => void;
@@ -1,24 +1,31 @@
1
1
  import fs from "node:fs";
2
2
  import { FsSafeError } from "./errors.js";
3
3
  import { assertSynchronousCallbackResult } from "./mutation-authority.js";
4
- export function assertPinnedWriteMode(fd, mode) {
4
+ import { assertPrivateCreationFile } from "./creation-file-state.js";
5
+ export function assertPinnedWriteMode(fd, mode, privateCreation = false) {
5
6
  if (process.platform === "win32")
6
7
  return;
7
- if (Number(fs.fstatSync(fd, { bigint: true }).mode & 4095n) !== mode) {
8
- throw new FsSafeError("insecure-permissions", "filesystem did not enforce the secret file mode");
8
+ const stat = fs.fstatSync(fd, { bigint: true });
9
+ if (privateCreation)
10
+ assertPrivateCreationFile(stat, fd);
11
+ if (Number(stat.mode & 4095n) !== mode) {
12
+ throw new FsSafeError("insecure-permissions", "filesystem did not enforce the requested file mode");
9
13
  }
10
14
  }
11
- export async function preparePinnedWriteMode(handle, createdMode, assertBeforeMutation) {
15
+ export async function preparePinnedWriteMode(handle, createdMode, assertBeforeMutation, privateCreation = false) {
12
16
  if (process.platform === "win32")
13
17
  return assertBeforeMutation;
14
18
  assertSynchronousCallbackResult(assertBeforeMutation?.(), "assertBeforeMutation");
15
- if (createdMode !== 0o600)
19
+ if (createdMode !== 0o600) {
20
+ if (privateCreation)
21
+ assertPrivateCreationFile(fs.fstatSync(handle.fd, { bigint: true }), handle.fd);
16
22
  await handle.chmod(0o600);
17
- return pinnedWriteModeAssertion(handle.fd, 0o600, assertBeforeMutation);
23
+ }
24
+ return pinnedWriteModeAssertion(handle.fd, 0o600, assertBeforeMutation, privateCreation);
18
25
  }
19
- export function pinnedWriteModeAssertion(fd, mode, assertBeforeMutation) {
26
+ export function pinnedWriteModeAssertion(fd, mode, assertBeforeMutation, privateCreation = false) {
20
27
  return () => {
21
28
  assertSynchronousCallbackResult(assertBeforeMutation?.(), "assertBeforeMutation");
22
- assertPinnedWriteMode(fd, mode);
29
+ assertPinnedWriteMode(fd, mode, privateCreation);
23
30
  };
24
31
  }
@@ -3,4 +3,3 @@ import type { AsyncDirectoryGuard } from "./directory-guard.js";
3
3
  import { type FileIdentityStat } from "./file-identity.js";
4
4
  import type { PinnedWriteParams } from "./pinned-write-types.js";
5
5
  export declare function runPinnedStagedWrite(params: PinnedWriteParams, parentPath: string, parentGuard: AsyncDirectoryGuard<BigIntStats>): Promise<FileIdentityStat>;
6
- //# sourceMappingURL=pinned-write-staged.d.ts.map
@@ -9,7 +9,6 @@ import { syncDirectoryBestEffort } from "./directory-durability.js";
9
9
  import { FsSafeError } from "./errors.js";
10
10
  import { sameFileIdentity, sha256Hex } from "./file-identity.js";
11
11
  import { syncFileBestEffort } from "./file-sync.js";
12
- import { assertDarwinCreationAcl, privateFileMutationAssertion } from "./creation-darwin.js";
13
12
  import { withAsyncDirectoryGuards } from "./guarded-mutation.js";
14
13
  import { writePinnedInput } from "./pinned-write-input.js";
15
14
  import { assertPinnedWriteMode, pinnedWriteModeAssertion, preparePinnedWriteMode } from "./pinned-write-mode.js";
@@ -20,7 +19,8 @@ import { assertFinalSymlinkRejected } from "./root-symlink-policy.js";
20
19
  import { createStagedFileReceipt, settleStagedFile } from "./staged-file-settlement.js";
21
20
  import { getFsSafeTestHooks } from "./test-hooks.js";
22
21
  export async function runPinnedStagedWrite(params, parentPath, parentGuard) {
23
- const verifyPosixMode = params.verifyPosixMode === true && process.platform !== "win32";
22
+ const verifyPosixMode = process.platform !== "win32" &&
23
+ (params.verifyPosixMode === true || params.private === true);
24
24
  const targetPath = path.join(parentPath, params.basename);
25
25
  // Private staging must not consume the destination basename's filename budget.
26
26
  const tempPath = path.join(parentPath, `.fs-safe-${randomUUID()}.tmp`);
@@ -49,18 +49,15 @@ export async function runPinnedStagedWrite(params, parentPath, parentGuard) {
49
49
  : await fs.open(tempPath, tempFlags, verifyPosixMode ? 0o600 : params.mode);
50
50
  let verificationIdentity = fsSync.fstatSync(handle.fd, { bigint: true });
51
51
  tempIdentity = verificationIdentity;
52
- let assertBeforeMutation = params.private
53
- ? privateFileMutationAssertion(handle.fd, params.assertBeforeMutation) : params.assertBeforeMutation;
52
+ let assertBeforeMutation = params.assertBeforeMutation;
54
53
  const assertBeforeWrite = verifyPosixMode
55
- ? await preparePinnedWriteMode(handle, Number(tempIdentity.mode & 4095n), assertBeforeMutation)
54
+ ? await preparePinnedWriteMode(handle, Number(tempIdentity.mode & 4095n), assertBeforeMutation, params.private)
56
55
  : assertBeforeMutation;
57
56
  if (verifyPosixMode)
58
- assertPinnedWriteMode(handle.fd, 0o600);
57
+ assertPinnedWriteMode(handle.fd, 0o600, params.private);
59
58
  await writePinnedInput(handle, params.input, params.maxBytes, assertBeforeWrite);
60
59
  if (verifyPosixMode)
61
- assertPinnedWriteMode(handle.fd, 0o600);
62
- if (params.private)
63
- assertDarwinCreationAcl(handle.fd);
60
+ assertPinnedWriteMode(handle.fd, 0o600, params.private);
64
61
  tempStat = fsSync.fstatSync(handle.fd);
65
62
  const tempPathStat = fsSync.lstatSync(tempPath);
66
63
  if (tempPathStat.isSymbolicLink() || !sameFileIdentity(tempPathStat, tempStat)) {
@@ -69,8 +66,8 @@ export async function runPinnedStagedWrite(params, parentPath, parentGuard) {
69
66
  const expectedTempStat = tempStat;
70
67
  await handle.chmod(params.mode);
71
68
  if (verifyPosixMode) {
72
- assertPinnedWriteMode(handle.fd, params.mode);
73
- assertBeforeMutation = pinnedWriteModeAssertion(handle.fd, params.mode, assertBeforeMutation);
69
+ assertPinnedWriteMode(handle.fd, params.mode, params.private);
70
+ assertBeforeMutation = pinnedWriteModeAssertion(handle.fd, params.mode, params.assertBeforeMutation, params.private);
74
71
  }
75
72
  if (params.sync !== false) {
76
73
  if (params.strictFileSync)
@@ -146,6 +143,8 @@ export async function runPinnedStagedWrite(params, parentPath, parentGuard) {
146
143
  }
147
144
  });
148
145
  await params.verifyPublished?.((readHandle ?? handle).fd, verificationIdentity, parentGuard);
146
+ if (verifyPosixMode)
147
+ assertPinnedWriteMode((readHandle ?? handle).fd, params.mode, params.private);
149
148
  return { dev: verifiedIdentity.dev, ino: verifiedIdentity.ino };
150
149
  }
151
150
  catch (error) {
@@ -24,18 +24,15 @@ export type PinnedCreatedDirectoryReceipt = Readonly<{
24
24
  parent: MutationDirectoryObservation;
25
25
  child: MutationDirectoryObservation;
26
26
  }>;
27
+ export type PinnedMutationParentRequest = {
28
+ targetPath: string;
29
+ mutationPath: string;
30
+ phase: "parent" | "parent-create";
31
+ };
27
32
  export type PinnedMutationParentWalkSession = Readonly<{
28
33
  retainedTargetPath: string;
29
- tryAuthorizeAtParent(request: Readonly<{
30
- targetPath: string;
31
- mutationPath: string;
32
- phase: "parent" | "parent-create";
33
- }>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
34
- authorize(request: Readonly<{
35
- targetPath: string;
36
- mutationPath: string;
37
- phase: "parent" | "parent-create";
38
- }>): Promise<PinnedMutationAdmissionReceipt | undefined>;
34
+ tryAuthorizeAtParent(request: Readonly<PinnedMutationParentRequest>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
35
+ authorize(request: Readonly<PinnedMutationParentRequest>): Promise<PinnedMutationAdmissionReceipt | undefined>;
39
36
  advanceCreatedDirectory(receipt: PinnedCreatedDirectoryReceipt): PinnedMutationAuthorizationToken | undefined;
40
37
  dispose(): void;
41
38
  }>;
@@ -44,16 +41,8 @@ export type PinnedWriteMutationAdmission = Readonly<{
44
41
  beginParentWalk?(): string | undefined;
45
42
  beginSharedParentWalk?(): PinnedMutationParentWalkSession | undefined;
46
43
  beginNativeParentWalk?(): PinnedMutationParentWalkSession | undefined;
47
- tryAuthorizeAtParent?(request: Readonly<{
48
- targetPath: string;
49
- mutationPath: string;
50
- phase: "parent" | "parent-create";
51
- }>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
52
- authorize(request: Readonly<{
53
- targetPath: string;
54
- mutationPath: string;
55
- phase: "parent" | "parent-create";
56
- }>): Promise<PinnedMutationAdmissionReceipt | undefined>;
44
+ tryAuthorizeAtParent?(request: Readonly<PinnedMutationParentRequest>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
45
+ authorize(request: Readonly<PinnedMutationParentRequest>): Promise<PinnedMutationAdmissionReceipt | undefined>;
57
46
  advanceCreatedDirectory?(receipt: PinnedCreatedDirectoryReceipt): PinnedMutationAuthorizationToken | undefined;
58
47
  }>;
59
48
  export type PinnedWriteParams = {
@@ -77,4 +66,3 @@ export type PinnedWriteParams = {
77
66
  onPublished?: (identity: PublishedWriteIdentity) => void;
78
67
  verifyPublished?: (fd: number, identity: PublishedWriteIdentity, parentGuard: AnyAsyncDirectoryGuard) => Promise<void>;
79
68
  };
80
- //# sourceMappingURL=pinned-write-types.d.ts.map
@@ -11,4 +11,3 @@ export declare function withPinnedWriteRenameIdentityLock<T>(params: {
11
11
  targetPath: string;
12
12
  relativeTargetPath: string;
13
13
  }, run: () => Promise<T>): Promise<T>;
14
- //# sourceMappingURL=pinned-write.d.ts.map
@@ -1,5 +1,4 @@
1
1
  import { syncFileBestEffort } from "./file-sync.js";
2
- import { assertDarwinCreationAcl, privateFileMutationAssertion } from "./creation-darwin.js";
3
2
  import fsSync, {} from "node:fs";
4
3
  import fs from "node:fs/promises";
5
4
  import path from "node:path";
@@ -124,7 +123,8 @@ export async function withPinnedWriteRenameIdentityLock(params, run) {
124
123
  }, run);
125
124
  }
126
125
  async function runPinnedWriteFallback(params) {
127
- const verifyPosixMode = params.verifyPosixMode === true && process.platform !== "win32";
126
+ const verifyPosixMode = process.platform !== "win32" &&
127
+ (params.verifyPosixMode === true || params.private === true);
128
128
  const exactRoot = typeof params.rootIdentity?.dev === "bigint" && typeof params.rootIdentity.ino === "bigint"
129
129
  ? { dev: params.rootIdentity.dev, ino: params.rootIdentity.ino } : undefined;
130
130
  const mutationAdmission = params.mutationAdmission;
@@ -250,25 +250,23 @@ async function runPinnedWriteFallback(params) {
250
250
  },
251
251
  });
252
252
  let created = true;
253
+ let completed = false;
253
254
  let createdIdentity;
254
255
  try {
255
256
  const verificationIdentity = fsSync.fstatSync(handle.fd, { bigint: true });
256
257
  createdIdentity = verificationIdentity;
257
- let assertBeforeWrite = params.private
258
- ? privateFileMutationAssertion(handle.fd, assertBeforeMutation) : assertBeforeMutation;
259
- if (verifyPosixMode) {
260
- assertBeforeWrite = await preparePinnedWriteMode(handle, Number(createdIdentity.mode & 4095n), assertBeforeWrite);
261
- assertPinnedWriteMode(handle.fd, 0o600);
262
- }
258
+ const assertBeforeWrite = verifyPosixMode
259
+ ? await preparePinnedWriteMode(handle, Number(createdIdentity.mode & 4095n), assertBeforeMutation, params.private)
260
+ : assertBeforeMutation;
261
+ if (verifyPosixMode)
262
+ assertPinnedWriteMode(handle.fd, 0o600, params.private);
263
263
  await writePinnedInput(handle, params.input, params.maxBytes, assertBeforeWrite);
264
264
  if (verifyPosixMode)
265
- assertPinnedWriteMode(handle.fd, 0o600);
266
- if (params.private)
267
- assertDarwinCreationAcl(handle.fd);
265
+ assertPinnedWriteMode(handle.fd, 0o600, params.private);
268
266
  // Content writes may clear set-ID bits; finalize them through the owned fd.
269
267
  await handle.chmod(params.mode);
270
268
  if (verifyPosixMode)
271
- assertPinnedWriteMode(handle.fd, params.mode);
269
+ assertPinnedWriteMode(handle.fd, params.mode, params.private);
272
270
  if (params.sync !== false) {
273
271
  if (params.strictFileSync)
274
272
  await handle.sync();
@@ -281,6 +279,9 @@ async function runPinnedWriteFallback(params) {
281
279
  // Publication is complete. A failed outer check must not remove its target.
282
280
  created = false;
283
281
  await params.verifyPublished?.(handle.fd, verificationIdentity, parentGuard);
282
+ if (verifyPosixMode)
283
+ assertPinnedWriteMode(handle.fd, params.mode, params.private);
284
+ completed = true;
284
285
  return { dev: stat.dev, ino: stat.ino };
285
286
  }
286
287
  finally {
@@ -290,7 +291,10 @@ async function runPinnedWriteFallback(params) {
290
291
  }
291
292
  }
292
293
  finally {
293
- await handle.close().catch(() => undefined);
294
+ if (completed)
295
+ await handle.close();
296
+ else
297
+ await handle.close().catch(() => undefined);
294
298
  }
295
299
  }
296
300
  }
@@ -6,4 +6,3 @@ export type ReadFileWindowOptions = {
6
6
  export declare function readFileWindowFully(handle: FileHandle, buffer: Buffer, position: number, { signal }?: ReadFileWindowOptions): Promise<number>;
7
7
  /** Synchronous positional read; neither variant advances or closes its descriptor. */
8
8
  export declare function readFileWindowFullySync(fd: number, buffer: Buffer, position: number): number;
9
- //# sourceMappingURL=positional-read.d.ts.map
@@ -2,4 +2,3 @@ export type CreatePrivateDirectoryOptions = {
2
2
  platform?: NodeJS.Platform;
3
3
  };
4
4
  export declare function createPrivateDirectory(targetPath: string, options?: CreatePrivateDirectoryOptions): Promise<void>;
5
- //# sourceMappingURL=private-directory.d.ts.map
@@ -11,4 +11,3 @@ export declare function handoffCreatedFileSync(params: {
11
11
  verifyDescriptor?: (fd: number, path: string, links: number) => void;
12
12
  onPublished?: () => void;
13
13
  }): OwnedFileDescriptorSync;
14
- //# sourceMappingURL=private-producer-handoff-sync.d.ts.map
@@ -1,16 +1,13 @@
1
1
  import fs, {} from "node:fs";
2
2
  import { ownFileDescriptorSync } from "./create-owned-file.js";
3
- import { FsSafeError } from "./errors.js";
4
3
  import { assertSynchronousCallbackResult } from "./mutation-authority.js";
5
- import { assertInitialSource, assertParents, inspectLinkedFile, normalizeLinkError, } from "./private-producer-handoff.js";
4
+ import { assertInitialSource, FileHandoff, inspectLinkedFile, } from "./private-producer-handoff.js";
6
5
  import { resolveReadOpenFlags } from "./read-open-flags.js";
7
6
  export function handoffCreatedFileSync(params) {
8
7
  let retained = params.source;
9
8
  const owners = new Set([retained]);
10
9
  const failures = [];
11
- let publication = "not-published";
12
- let cleanup = "preserved";
13
- let closeFailed = false;
10
+ const state = new FileHandoff(params, params.identity, true);
14
11
  function close(owner) {
15
12
  // A throwing close may already have released the descriptor for reuse.
16
13
  owners.delete(owner);
@@ -18,42 +15,20 @@ export function handoffCreatedFileSync(params) {
18
15
  owner.close();
19
16
  }
20
17
  catch (error) {
21
- closeFailed = true;
18
+ state.closeFailed = true;
22
19
  throw error;
23
20
  }
24
21
  }
25
- function assertIdentityCurrent(owner, links) {
26
- assertParents(params);
27
- inspectLinkedFile(() => fs.fstatSync(owner.fd, { bigint: true }), params.identity, links, "created file descriptor");
28
- if (cleanup !== "removed") {
29
- inspectLinkedFile(() => fs.lstatSync(params.sourcePath, { bigint: true }), params.identity, links, "created file stage");
30
- }
31
- if (publication === "published") {
32
- inspectLinkedFile(() => fs.lstatSync(params.targetPath, { bigint: true }), params.identity, links, "created file destination");
33
- }
34
- }
35
22
  function verifyCurrent(owner, descriptorPath, links) {
36
- assertIdentityCurrent(owner, links);
23
+ state.inspect(owner, links);
37
24
  params.verifyDescriptor?.(owner.fd, descriptorPath, Number(links));
38
25
  }
39
26
  try {
40
27
  assertInitialSource(params.identity);
41
28
  verifyCurrent(retained, params.sourcePath, 1n);
42
29
  assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
43
- assertIdentityCurrent(retained, 1n);
44
- publication = "indeterminate";
45
- try {
46
- fs.linkSync(params.sourcePath, params.targetPath);
47
- }
48
- catch (error) {
49
- const normalized = normalizeLinkError(error);
50
- if (normalized instanceof FsSafeError &&
51
- (normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
52
- publication = "not-published";
53
- }
54
- throw normalized;
55
- }
56
- publication = "published";
30
+ state.inspect(retained, 1n);
31
+ state.publish();
57
32
  try {
58
33
  params.onPublished?.();
59
34
  }
@@ -74,12 +49,10 @@ export function handoffCreatedFileSync(params) {
74
49
  const descriptorPath = process.platform === "win32" ? params.targetPath : params.sourcePath;
75
50
  verifyCurrent(retained, descriptorPath, 2n);
76
51
  assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
77
- assertIdentityCurrent(retained, 2n);
78
- cleanup = "failed";
52
+ state.inspect(retained, 2n);
79
53
  // Link and unlink stay in one JS turn. Only the verified stage is removed;
80
54
  // publication has committed and the destination is never rollback cleanup.
81
- fs.unlinkSync(params.sourcePath);
82
- cleanup = "removed";
55
+ state.retireSource();
83
56
  verifyCurrent(retained, params.targetPath, 1n);
84
57
  }
85
58
  catch (error) {
@@ -95,20 +68,5 @@ export function handoffCreatedFileSync(params) {
95
68
  failures.push(error);
96
69
  }
97
70
  }
98
- const primary = failures[0];
99
- // Collision-as-no-op callers must still observe a failed settlement.
100
- const code = closeFailed || failures.length > 1
101
- ? "helper-failed"
102
- : primary instanceof FsSafeError ? primary.code : "helper-failed";
103
- throw new FsSafeError(code, "created file publication failed", {
104
- cause: failures.length === 1 ? primary : new AggregateError(failures, "created file publication and settlement failed"),
105
- details: {
106
- publication: { status: publication },
107
- cleanup,
108
- resources: closeFailed ? "close-failed" : "closed",
109
- path: params.targetPath,
110
- dev: params.identity.dev,
111
- ino: params.identity.ino,
112
- },
113
- });
71
+ throw state.failure(failures, "created file publication and settlement failed");
114
72
  }
@@ -1,5 +1,6 @@
1
1
  import { type BigIntStats } from "node:fs";
2
2
  import { type FileHandle } from "node:fs/promises";
3
+ import { FsSafeError } from "./errors.js";
3
4
  import { type TempPathRegistration } from "./temp-cleanup.js";
4
5
  export type PrivateProducerHandoff = {
5
6
  handle: FileHandle;
@@ -28,7 +29,25 @@ export declare function assertInitialSource(stat: BigIntStats): void;
28
29
  export declare function inspectLinkedFile(inspect: () => BigIntStats, expected: BigIntStats, links: bigint, label: string): BigIntStats;
29
30
  export declare function assertParents(params: HandoffParents): void;
30
31
  export declare function normalizeLinkError(error: unknown): unknown;
32
+ export declare class FileHandoff {
33
+ private readonly paths;
34
+ private readonly identity;
35
+ private readonly createdLabels;
36
+ siblingOwned: boolean;
37
+ publication: "not-published" | "published" | "indeterminate";
38
+ cleanup: "preserved" | "removed" | "failed";
39
+ closeFailed: boolean;
40
+ constructor(paths: HandoffPaths, identity: BigIntStats, createdLabels?: boolean);
41
+ inspect(owner: {
42
+ readonly fd: number;
43
+ }, links: bigint): {
44
+ opened: BigIntStats;
45
+ named?: BigIntStats;
46
+ };
47
+ publish(): void;
48
+ retireSource(): void;
49
+ failure(failures: readonly unknown[], aggregateMessage: string): FsSafeError;
50
+ }
31
51
  export declare function handoffPrivateProducerFile(params: ProducerHandoffParams): Promise<PrivateProducerHandoff>;
32
52
  export declare function handoffCreatedFile(params: CreatedHandoffParams): Promise<FileHandle>;
33
53
  export {};
34
- //# sourceMappingURL=private-producer-handoff.d.ts.map