@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
@@ -220,13 +220,21 @@ async function removeOne(root, targetPath, options, receipts) {
220
220
  throw normalizeRemoveGuardError(error);
221
221
  }
222
222
  try {
223
- const isDirectory = fsSync.lstatSync(targetPath).isDirectory();
223
+ const identity = options.assertBeforeMutation
224
+ ? inspectFileIdentitySync(() => fsSync.lstatSync(targetPath, { bigint: true })) : undefined;
225
+ const isDirectory = (identity ?? fsSync.lstatSync(targetPath)).isDirectory();
224
226
  if (!isDirectory && options[nonrecursiveRemovalKind] === "directory") {
225
227
  throw new FsSafeError("path-mismatch", "store entry is no longer a directory");
226
228
  }
227
229
  assertFinalSymlinkRejected(targetPath, options.mutationSymlinks !== undefined);
228
230
  assertNotAborted(options.signal);
229
231
  options.assertBeforeMutation?.();
232
+ if (identity) {
233
+ assertNotAborted(options.signal);
234
+ admission.assertCurrent();
235
+ inspectFileIdentitySync(() => fsSync.lstatSync(targetPath, { bigint: true }), identity);
236
+ assertFinalSymlinkRejected(targetPath, options.mutationSymlinks !== undefined);
237
+ }
230
238
  await (isDirectory ? fs.rmdir(targetPath) : fs.unlink(targetPath));
231
239
  }
232
240
  catch (error) {
@@ -436,6 +444,12 @@ export async function removePathInRootFallback(root, targetPath, options, receip
436
444
  assertFinalSymlinkRejected(target, options.mutationSymlinks !== undefined, details(target, "remove"));
437
445
  assertNotAborted(options.signal);
438
446
  options.assertBeforeMutation?.();
447
+ if (options.assertBeforeMutation) {
448
+ assertNotAborted(options.signal);
449
+ if (!inspect(target, initial))
450
+ return;
451
+ assertFinalSymlinkRejected(target, options.mutationSymlinks !== undefined, details(target, "remove"));
452
+ }
439
453
  try {
440
454
  await (initial.isDirectory() ? fs.rmdir(target) : fs.unlink(target));
441
455
  }
@@ -11,4 +11,3 @@ export declare function mutationSymlinkResolution(symlinks: MutationSymlinkPolic
11
11
  resolveCanonical: boolean;
12
12
  };
13
13
  export declare function assertFinalSymlinkRejected(targetPath: string, reject: boolean | undefined, details?: FsSafeErrorDetails): void;
14
- //# sourceMappingURL=root-symlink-policy.d.ts.map
@@ -39,4 +39,3 @@ type RootWalkCapability = {
39
39
  };
40
40
  export declare function walkRoot(root: RootWalkCapability, relativePath: string, options: RootWalkOptions): AsyncGenerator<RootWalkEntry>;
41
41
  export {};
42
- //# sourceMappingURL=root-walk.d.ts.map
@@ -63,4 +63,3 @@ export declare function resolveGuardedWritePathInRoot(root: RootContext, params:
63
63
  export declare function resolveGuardedWriteTargetInRoot(root: RootContext, params: GuardedWritePathOptions): Promise<GuardedRootWriteTarget>;
64
64
  export declare function resolvePinnedWriteTargetInRoot(root: RootContext, relativePath: string, requestedMode?: number, denyMutations?: DenyMutationPolicy, overwrite?: boolean, mutationSymlinks?: MutationSymlinkPolicy): Promise<PinnedWriteTarget>;
65
65
  export {};
66
- //# sourceMappingURL=root-write-admission.d.ts.map
@@ -9,4 +9,3 @@ export declare function withRootFallbackCompatibilityLock<T>(params: {
9
9
  relativePath: string;
10
10
  assertBeforeMutation: () => void;
11
11
  }) => Promise<T>): Promise<T>;
12
- //# sourceMappingURL=root-write-compatibility.d.ts.map
@@ -39,4 +39,3 @@ export type SharedRootWriteTarget = Readonly<{
39
39
  export declare function assertPreparedRootWriteParentCurrent(prepared: PreparedRootWriteParent, verifyTarget?: boolean): void;
40
40
  export declare function prepareSharedRootWriteTarget(root: RootContext, params: SharedRootWriteTargetParams): Promise<SharedRootWriteTarget>;
41
41
  export {};
42
- //# sourceMappingURL=root-write-complete-parent.d.ts.map
@@ -12,4 +12,3 @@ export declare function createRootWriteLockBinding(params: Readonly<{
12
12
  assertCurrent: () => void;
13
13
  dispose(): void;
14
14
  }>;
15
- //# sourceMappingURL=root-write-lock-binding.d.ts.map
@@ -5,4 +5,3 @@ export declare function inheritWriteTargetMode(params: {
5
5
  rootIdentity?: RootBoundaryIdentity;
6
6
  requestedMode?: number;
7
7
  }): Promise<number>;
8
- //# sourceMappingURL=root-write-mode.d.ts.map
@@ -21,4 +21,3 @@ export declare function finishRootFallbackWrite(params: {
21
21
  }>;
22
22
  onVerificationFailure: (error: unknown) => void;
23
23
  }): Promise<void>;
24
- //# sourceMappingURL=root-write-publication.d.ts.map
@@ -9,4 +9,3 @@ export declare function verifyAtomicWriteResult(params: {
9
9
  expectedMode?: number;
10
10
  parentGuard: AnyAsyncDirectoryGuard;
11
11
  }): Promise<void>;
12
- //# sourceMappingURL=root-write-verification.d.ts.map
package/dist/root.d.ts CHANGED
@@ -4,4 +4,3 @@ export type { CopyCloneMode } from "./copy-policy.js";
4
4
  export type { RootEntriesOptions } from "./root-entries.js";
5
5
  export type { ContainmentGuarantee } from "./containment.js";
6
6
  export type { RootWalkDataEntry, RootWalkDataEntryKind, RootWalkDirectoryErrorBehavior, RootWalkEntry, RootWalkEntryFilter, RootWalkEntryFilterResult, RootWalkEntryKind, RootWalkLimitBehavior, RootWalkOptions, RootWalkSymlinkPolicy, } from "./root-walk.js";
7
- //# sourceMappingURL=root.d.ts.map
@@ -7,6 +7,5 @@ export declare function assertNoDriveRelativePathSegments(value: string, label:
7
7
  export declare function trimHyphenEdges(value: string): string;
8
8
  export declare function isSafePathSegment(segment: string, options?: SafePathSegmentOptions): boolean;
9
9
  export declare function assertSafePathSegment(segment: string, options?: SafePathSegmentOptions): string;
10
- export declare function sanitizeSafePathSegment(value: string, fallback: string, options?: SafePathSegmentOptions): string;
10
+ export declare function sanitizeSafePathSegment(value: string): string | undefined;
11
11
  export declare function assertSafePathPrefix(prefix: string, options?: SafePathSegmentOptions): string;
12
- //# sourceMappingURL=safe-path-segment.d.ts.map
@@ -47,17 +47,14 @@ export function assertSafePathSegment(segment, options = {}) {
47
47
  }
48
48
  return segment;
49
49
  }
50
- export function sanitizeSafePathSegment(value, fallback, options = {}) {
50
+ export function sanitizeSafePathSegment(value) {
51
51
  const sanitized = value
52
52
  .trim()
53
53
  .replace(/[\\/]+/g, "-")
54
54
  .replace(/\0/g, "")
55
55
  .replace(/[^A-Za-z0-9._-]+/g, "-");
56
56
  const trimmed = trimHyphenEdges(sanitized);
57
- if (isSafePathSegment(trimmed, options)) {
58
- return trimmed;
59
- }
60
- return assertSafePathSegment(fallback, { ...options, label: "fallback path segment" });
57
+ return isSafePathSegment(trimmed, { allowDotPrefix: true }) ? trimmed : undefined;
61
58
  }
62
59
  export function assertSafePathPrefix(prefix, options = {}) {
63
60
  // Prefixes are often derived from safe filenames. Normalize harmless
@@ -23,4 +23,3 @@ export declare function prepareSecretFileWrite(params: Omit<SecretFileWriteParam
23
23
  export declare function writeSecretFileAtomic(params: SecretFileWriteParams): Promise<void>;
24
24
  export declare function createSecretFileAtomic(params: SecretFileWriteParams): Promise<void>;
25
25
  export {};
26
- //# sourceMappingURL=secret-file.d.ts.map
@@ -31,29 +31,19 @@ export function readSecretFileSync(filePath, label, options = {}) {
31
31
  }
32
32
  let raw;
33
33
  try {
34
- const openedIdentity = inspectFileIdentitySync(() => {
35
- const stat = fs.fstatSync(opened.fd, { bigint: true });
36
- if (!stat.isFile() || (rejectHardlinks && stat.nlink > 1n)) {
37
- throw new FsSafeError("path-mismatch", "security validation failed");
38
- }
39
- return stat;
40
- }, previewStat);
41
- inspectFileIdentitySync(() => {
42
- const stat = fs.lstatSync(opened.path, { bigint: true });
43
- if (!stat.isFile() || (rejectHardlinks && stat.nlink > 1n)) {
44
- throw new FsSafeError("path-mismatch", "security validation failed");
45
- }
46
- return stat;
47
- }, openedIdentity);
34
+ // The pin already compared the descriptor and resolved name without yielding.
35
+ const openedIdentity = inspectFileIdentitySync(() => opened.identity, previewStat);
48
36
  inspectFileIdentitySync(() => inspectInput("secret path became a symlink"), openedIdentity);
49
37
  raw = readFileDescriptorBoundedSync(opened.fd, maxBytes).toString("utf8");
50
38
  }
51
39
  catch (error) {
40
+ try {
41
+ fs.closeSync(opened.fd);
42
+ }
43
+ catch { /* Preserve the read failure. */ }
52
44
  throw secretReadError(error instanceof FsSafeError ? error.code : "read-failed", "read", label, resolvedPath, error);
53
45
  }
54
- finally {
55
- fs.closeSync(opened.fd);
56
- }
46
+ fs.closeSync(opened.fd);
57
47
  return trimSecretFileContent(raw, label, resolvedPath);
58
48
  }
59
49
  export function tryReadSecretFileSync(filePath, label, options = {}) {
@@ -1,4 +1,3 @@
1
1
  import { type SecretFileReadOptions } from "./secret-read-policy.js";
2
2
  export declare function readSecretFile(filePath: string, label: string, options?: SecretFileReadOptions): Promise<string>;
3
3
  export declare function tryReadSecretFile(filePath: string | undefined, label: string, options?: SecretFileReadOptions): Promise<string | undefined>;
4
- //# sourceMappingURL=secret-read-async.d.ts.map
@@ -5,11 +5,11 @@ import { assertNoUnsafeDeviceReadPath } from "./device-path.js";
5
5
  import { FsSafeError } from "./errors.js";
6
6
  import { resolveReadOpenFlags } from "./read-open-flags.js";
7
7
  import { realpathSync } from "./realpath.js";
8
- import { inspectFileIdentity } from "./strict-file-identity.js";
8
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
9
9
  import { prepareSecretRead, secretPathErrorCode, secretReadError, trimSecretFileContent, } from "./secret-read-policy.js";
10
10
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
11
11
  export async function readSecretFile(filePath, label, options = {}) {
12
- const { resolvedPath, maxBytes, rejectSymlink, rejectHardlinks, previewStat, inspectInput } = prepareSecretRead(filePath, label, options);
12
+ const { resolvedPath, maxBytes, rejectHardlinks, previewStat, inspectInput } = prepareSecretRead(filePath, label, options);
13
13
  let handle;
14
14
  let raw;
15
15
  try {
@@ -18,20 +18,20 @@ export async function readSecretFile(filePath, label, options = {}) {
18
18
  assertNoUnsafeDeviceReadPath(realPath);
19
19
  handle = await fs.open(realPath, resolveReadOpenFlags());
20
20
  const openedHandle = handle;
21
- const openedStat = await inspectFileIdentity(async () => {
21
+ const openedStat = inspectFileIdentitySync(() => {
22
22
  const stat = fsSync.fstatSync(openedHandle.fd, { bigint: true });
23
23
  if (!stat.isFile() || (rejectHardlinks && stat.nlink > 1n)) {
24
24
  throw new FsSafeError("path-mismatch", "security validation failed");
25
25
  }
26
26
  return stat;
27
27
  }, previewStat);
28
- await inspectFileIdentity(async () => {
28
+ inspectFileIdentitySync(() => {
29
29
  const stat = fsSync.lstatSync(realPath, { bigint: true });
30
30
  if (!stat.isFile())
31
31
  throw new FsSafeError("path-mismatch", "security validation failed");
32
32
  return stat;
33
33
  }, openedStat);
34
- await inspectFileIdentity(() => inspectInput("secret path became a symlink"), openedStat);
34
+ inspectFileIdentitySync(() => inspectInput("secret path became a symlink"), openedStat);
35
35
  raw = (await readFileHandleBounded(handle, maxBytes)).toString("utf8");
36
36
  }
37
37
  catch (error) {
@@ -18,4 +18,3 @@ export declare function prepareSecretRead(filePath: string, label: string, optio
18
18
  previewStat: BigIntStats;
19
19
  inspectInput: (symlinkMessage: string) => BigIntStats;
20
20
  };
21
- //# sourceMappingURL=secret-read-policy.d.ts.map
package/dist/secret.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  export { createSecretFileAtomic, PRIVATE_SECRET_DIR_MODE, PRIVATE_SECRET_FILE_MODE, readSecretFileSync, tryReadSecretFileSync, writeSecretFileAtomic, } from "./secret-file.js";
2
2
  export { DEFAULT_SECRET_FILE_MAX_BYTES, type SecretFileReadOptions } from "./secret-read-policy.js";
3
3
  export { readSecretFile, tryReadSecretFile } from "./secret-read-async.js";
4
- //# sourceMappingURL=secret.d.ts.map
@@ -1,11 +1,6 @@
1
1
  import type { BigIntStats, Stats } from "node:fs";
2
2
  import type { PermissionCheck } from "./permissions.js";
3
3
  type ExactIdentity = Pick<BigIntStats, "dev" | "ino">;
4
- export declare function inspectSecureWindowsDescriptor(params: {
5
- fd: number;
6
- identity: ExactIdentity;
7
- stat: Stats;
8
- }): PermissionCheck;
9
4
  /** Both mechanisms inspect the same borrowed handle; the caller owns its lifetime. */
10
5
  export declare function inspectSecureWindowsFile(params: {
11
6
  fd: number;
@@ -13,4 +8,3 @@ export declare function inspectSecureWindowsFile(params: {
13
8
  stat: Stats;
14
9
  }): Promise<PermissionCheck>;
15
10
  export {};
16
- //# sourceMappingURL=secure-file-windows.d.ts.map
@@ -29,27 +29,6 @@ function parseIdentity(value) {
29
29
  ino: BigInt(`0x${match[2]}`),
30
30
  };
31
31
  }
32
- export function inspectSecureWindowsDescriptor(params) {
33
- let native;
34
- try {
35
- native = getNativeBinding();
36
- }
37
- catch (cause) {
38
- permissionUnverified("Windows descriptor ACL verification requires the matching native helper", cause);
39
- }
40
- const inspect = native?.inspectWindowsSecureFileHandle;
41
- if (typeof inspect !== "function") {
42
- permissionUnverified("Windows descriptor ACL verification requires an up-to-date native helper");
43
- }
44
- let result;
45
- try {
46
- result = inspect.call(native, params.fd);
47
- }
48
- catch (cause) {
49
- permissionUnverified("Windows descriptor ACL verification failed", cause);
50
- }
51
- return inspectDescriptorResult(params, result, "native");
52
- }
53
32
  function inspectDescriptorResult(params, result, mechanism) {
54
33
  if (!isRecord(result))
55
34
  permissionUnverified("Windows descriptor ACL facts were malformed");
@@ -85,19 +64,25 @@ export async function inspectSecureWindowsFile(params) {
85
64
  catch (cause) {
86
65
  permissionUnverified("Windows descriptor ACL verification requires the matching native helper", cause);
87
66
  }
88
- if (typeof native?.inspectWindowsSecureFileHandle === "function") {
89
- return inspectSecureWindowsDescriptor(params);
90
- }
91
- if (getFsSafeNativeConfig().mode === "require") {
67
+ const inspect = native?.inspectWindowsSecureFileHandle;
68
+ const nativeAvailable = typeof inspect === "function";
69
+ if (!nativeAvailable && getFsSafeNativeConfig().mode === "require") {
92
70
  permissionUnverified("Windows descriptor ACL verification requires an up-to-date native helper");
93
71
  }
94
- warnNativeFallback("windows-secure-file", "Windows descriptor ACL inspection uses a slower built-in system command.");
72
+ if (!nativeAvailable) {
73
+ warnNativeFallback("windows-secure-file", "Windows descriptor ACL inspection uses a slower built-in system command.");
74
+ }
95
75
  let result;
96
76
  try {
97
- result = await inspectWindowsDescriptorCommand(params.fd);
77
+ if (nativeAvailable) {
78
+ result = inspect.call(native, params.fd);
79
+ }
80
+ else {
81
+ result = await inspectWindowsDescriptorCommand(params.fd);
82
+ }
98
83
  }
99
84
  catch (cause) {
100
85
  permissionUnverified("Windows descriptor ACL verification failed", cause);
101
86
  }
102
- return inspectDescriptorResult(params, result, "system-command");
87
+ return inspectDescriptorResult(params, result, nativeAvailable ? "native" : "system-command");
103
88
  }
@@ -29,4 +29,3 @@ export type SecureFileReadResult = {
29
29
  permissions?: PermissionCheck;
30
30
  };
31
31
  export declare function readSecureFile(options: SecureFileReadOptions): Promise<SecureFileReadResult>;
32
- //# sourceMappingURL=secure-file.d.ts.map
@@ -12,7 +12,7 @@ import { formatPermissionErrorDetail } from "./permission-exec.js";
12
12
  import { resolveReadOpenFlags } from "./read-open-flags.js";
13
13
  import { realpathSync } from "./realpath.js";
14
14
  import { inspectPathPermissions, isGroupReadable, isGroupWritable, isWorldReadable, isWorldWritable, modeBits, } from "./permissions.js";
15
- import { inspectFileIdentity } from "./strict-file-identity.js";
15
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
16
16
  import { inspectSecureWindowsFile } from "./secure-file-windows.js";
17
17
  import { scheduleTimeout } from "./timing.js";
18
18
  import { anchorWindowsDriveRelativePath, assertNoWindowsPathAlias, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
@@ -139,9 +139,9 @@ async function openSecureHandle(options, maxBytes) {
139
139
  if (!openedStat.isFile()) {
140
140
  throw new FsSafeError("not-file", `${label(options)} must be a file: ${options.filePath}`);
141
141
  }
142
- const openedIdentity = await inspectFileIdentity(() => fsSync.fstatSync(handle.fd, { bigint: true }));
142
+ const openedIdentity = inspectFileIdentitySync(() => fsSync.fstatSync(handle.fd, { bigint: true }));
143
143
  assertNotHardlinked(options, openedIdentity);
144
- await inspectFileIdentity(async () => {
144
+ inspectFileIdentitySync(() => {
145
145
  const pathStat = options.trust?.allowSymlink
146
146
  ? fsSync.statSync(options.filePath, { bigint: true })
147
147
  : fsSync.lstatSync(options.filePath, { bigint: true });
@@ -153,7 +153,7 @@ async function openSecureHandle(options, maxBytes) {
153
153
  }, openedIdentity);
154
154
  const realPath = realpathSync.native(options.filePath);
155
155
  assertNoWindowsPathAlias(realPath, "filesystem", `${label(options)} resolved path uses a Windows filesystem namespace alias`);
156
- await inspectFileIdentity(() => {
156
+ inspectFileIdentitySync(() => {
157
157
  const realPathStat = fsSync.statSync(realPath, { bigint: true });
158
158
  assertNotHardlinked(options, realPathStat);
159
159
  return realPathStat;
@@ -168,11 +168,11 @@ async function openSecureHandle(options, maxBytes) {
168
168
  throw err;
169
169
  }
170
170
  }
171
- async function assertTrustedDirs(options, realPath) {
171
+ function assertTrustedDirs(options, realPath) {
172
172
  if (!options.trust?.trustedDirs || options.trust.trustedDirs.length === 0) {
173
173
  return;
174
174
  }
175
- const trusted = await Promise.all(options.trust.trustedDirs.map(async (dir) => {
175
+ const trusted = options.trust.trustedDirs.map((dir) => {
176
176
  let realPath;
177
177
  try {
178
178
  realPath = realpathSync.native(dir);
@@ -182,7 +182,7 @@ async function assertTrustedDirs(options, realPath) {
182
182
  }
183
183
  assertNoWindowsPathAlias(realPath, "filesystem", "trusted directory uses a Windows filesystem namespace alias");
184
184
  return realPath;
185
- }));
185
+ });
186
186
  if (!trusted.some((dir) => isPathInside(dir, realPath))) {
187
187
  throw new FsSafeError("outside-workspace", `${label(options)} is outside trustedDirs: ${realPath}`);
188
188
  }
@@ -281,10 +281,10 @@ export async function readSecureFile(options) {
281
281
  assertNoWindowsPathAlias(options.filePath, "filesystem", `${label(options)} path uses a Windows filesystem namespace alias`);
282
282
  const opened = await openSecureHandle(options, maxBytes);
283
283
  try {
284
- await assertTrustedDirs(options, opened.realPath);
284
+ assertTrustedDirs(options, opened.realPath);
285
285
  const permissions = await assertSecurePermissions(options, opened.pathStat, opened.realPath, opened.identity, opened.handle.fd);
286
286
  const buffer = await readHandleWithTimeout(opened.handle, options.io?.timeoutMs, maxBytes);
287
- const finalIdentity = await inspectFileIdentity(() => fsSync.fstatSync(opened.handle.fd, { bigint: true }), opened.identity);
287
+ const finalIdentity = inspectFileIdentitySync(() => fsSync.fstatSync(opened.handle.fd, { bigint: true }), opened.identity);
288
288
  if (!finalIdentity.isFile()) {
289
289
  throw new FsSafeError("not-file", `${label(options)} must remain a file: ${options.filePath}`);
290
290
  }
@@ -27,4 +27,3 @@ export type ResolveSecureTempRootOptions = {
27
27
  warningPrefix?: string;
28
28
  };
29
29
  export declare function resolveSecureTempRoot(options: ResolveSecureTempRootOptions): string;
30
- //# sourceMappingURL=secure-temp-dir.d.ts.map
@@ -32,4 +32,3 @@ export declare function secureTempDirectoryReceipt(stat: ExactDirectoryStat, uid
32
32
  /** No pathname chmod, search-only descriptors, procfs, or reopening fallback. */
33
33
  export declare function repairSecureTempDirectory(candidate: string, expected: SecureTempDirectoryReceipt, uid: number, adapter: SecureTempRepairAdapter, access: () => void, repaired: () => void, finalize?: boolean): void;
34
34
  export {};
35
- //# sourceMappingURL=secure-temp-repair.d.ts.map
@@ -15,4 +15,3 @@ export declare function writeCallbackSibling<T>(params: {
15
15
  filePath: string;
16
16
  result: T;
17
17
  }>;
18
- //# sourceMappingURL=sibling-staged-file.d.ts.map
@@ -2,7 +2,7 @@ import { syncFileBestEffort } from "./file-sync.js";
2
2
  import fsSync, {} from "node:fs";
3
3
  import fs, {} from "node:fs/promises";
4
4
  import path from "node:path";
5
- import { assertAsyncDirectoryGuard, assertDirectoryIdentitySync, createAsyncDirectoryGuard, } from "./directory-guard.js";
5
+ import { assertDirectoryIdentitySync, createAsyncDirectoryGuard, } from "./directory-guard.js";
6
6
  import { syncDirectoryBestEffort } from "./directory-durability.js";
7
7
  import { isWindowsReservedDeviceName } from "./device-path.js";
8
8
  import { FsSafeError } from "./errors.js";
@@ -10,7 +10,7 @@ import { getNativeBinding } from "./native.js";
10
10
  import { handoffPrivateProducerFile, } from "./private-producer-handoff.js";
11
11
  import { resolveReadOpenFlags } from "./read-open-flags.js";
12
12
  import { rootFromDirectoryGuard } from "./root-impl.js";
13
- import { inspectFileIdentity } from "./strict-file-identity.js";
13
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
14
14
  import { registerTempPathForExit } from "./temp-cleanup.js";
15
15
  import { createOwnedTempFile } from "./temp-target.js";
16
16
  import { serializePathWrite } from "./write-queue.js";
@@ -52,8 +52,8 @@ function assertRegularFile(stat) {
52
52
  throw new FsSafeError("hardlink", "sibling temp must have exactly one link");
53
53
  }
54
54
  }
55
- async function inspectStage(inspect, expected) {
56
- return await inspectFileIdentity(async () => {
55
+ function inspectStage(inspect, expected) {
56
+ return inspectFileIdentitySync(() => {
57
57
  const stat = inspect();
58
58
  assertRegularFile(stat);
59
59
  return stat;
@@ -67,12 +67,7 @@ function aggregateErrors(errors, message) {
67
67
  // Own the workspace before the producer can leave partial output. The finished
68
68
  // file still enters the ordinary sibling admission and publication lifecycle.
69
69
  async function writeIsolatedProducer(params) {
70
- const tempPath = params.tempPath;
71
- const write = params.write;
72
- const writeReceiver = params.writeReceiver;
73
- const parentGuard = params.parentGuard;
74
- const assertParent = params.assertParent;
75
- const syncTempFile = params.syncTempFile;
70
+ const { tempPath, write, writeReceiver, parentGuard, assertParent, syncTempFile } = params;
76
71
  assertParent();
77
72
  const targetRoot = rootFromDirectoryGuard(parentGuard);
78
73
  // Select the handoff before invoking the producer. Missing required native
@@ -150,7 +145,9 @@ export async function writeCallbackSibling(params) {
150
145
  const syncTempFile = params.syncTempFile;
151
146
  const syncParentDir = params.syncParentDir;
152
147
  const guard = await createAsyncDirectoryGuard(parent, { bigint: true });
153
- const assertParent = () => assertAsyncDirectoryGuard(guard);
148
+ const assertParent = () => assertDirectoryIdentitySync(parent, {
149
+ dev: guard.stat.dev, ino: guard.stat.ino, realPath: guard.realPath,
150
+ });
154
151
  let handle;
155
152
  let identity;
156
153
  let unregister;
@@ -158,10 +155,10 @@ export async function writeCallbackSibling(params) {
158
155
  let renamed = false;
159
156
  let failure;
160
157
  const inspectPath = (pathname, expected) => inspectStage(() => fsSync.lstatSync(pathname, { bigint: true }), expected);
161
- const assertCurrent = async (pathname) => {
162
- await assertParent();
163
- const opened = await inspectStage(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity);
164
- const current = await inspectPath(pathname, opened);
158
+ const assertCurrent = (pathname) => {
159
+ assertParent();
160
+ const opened = inspectStage(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity);
161
+ const current = inspectPath(pathname, opened);
165
162
  if (maxBytes !== undefined &&
166
163
  (opened.size > maxBytes || current.size > maxBytes)) {
167
164
  throw new FsSafeError("too-large", `sibling temp exceeds maxBytes (${maxBytes})`);
@@ -176,11 +173,7 @@ export async function writeCallbackSibling(params) {
176
173
  writeReceiver: params,
177
174
  parentGuard: guard,
178
175
  syncTempFile: syncTempFile,
179
- assertParent: () => assertDirectoryIdentitySync(parent, {
180
- dev: guard.stat.dev,
181
- ino: guard.stat.ino,
182
- realPath: guard.realPath,
183
- }),
176
+ assertParent,
184
177
  });
185
178
  result = isolated.result;
186
179
  cleanupWorkspace = isolated.cleanupWorkspace;
@@ -193,13 +186,10 @@ export async function writeCallbackSibling(params) {
193
186
  else {
194
187
  result = await Reflect.apply(write, params, [tempPath]);
195
188
  }
196
- await assertParent();
197
- if (handle) {
198
- const opened = await inspectStage(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity);
199
- await inspectPath(tempPath, opened);
200
- }
201
- else {
202
- const before = await inspectPath(tempPath);
189
+ assertParent();
190
+ let expected = identity;
191
+ if (!handle) {
192
+ expected = inspectPath(tempPath);
203
193
  try {
204
194
  // No create/truncate flags; O_NONBLOCK also bounds a FIFO swap during open.
205
195
  const access = syncTempFile ? fsSync.constants.O_RDWR : fsSync.constants.O_RDONLY;
@@ -211,12 +201,14 @@ export async function writeCallbackSibling(params) {
211
201
  }
212
202
  throw error;
213
203
  }
214
- const opened = await inspectStage(() => fsSync.fstatSync(handle.fd, { bigint: true }), before);
215
- await inspectPath(tempPath, opened);
204
+ }
205
+ const opened = inspectStage(() => fsSync.fstatSync(handle.fd, { bigint: true }), expected);
206
+ inspectPath(tempPath, opened);
207
+ if (!identity) {
216
208
  identity = opened;
217
209
  unregister = registerTempPathForExit(tempPath, { identity, singleLinkFile: true });
218
210
  }
219
- await assertParent();
211
+ assertParent();
220
212
  if (cleanupWorkspace) {
221
213
  const cleanup = cleanupWorkspace;
222
214
  cleanupWorkspace = undefined;
@@ -233,7 +225,7 @@ export async function writeCallbackSibling(params) {
233
225
  throw new FsSafeError("invalid-path", "final path must differ from the sibling temp path");
234
226
  }
235
227
  await serializePathWrite(filePath, async () => {
236
- await assertCurrent(tempPath);
228
+ assertCurrent(tempPath);
237
229
  if (mode !== undefined) {
238
230
  try {
239
231
  await handle.chmod(mode);
@@ -242,20 +234,21 @@ export async function writeCallbackSibling(params) {
242
234
  if (!ignoreModeError)
243
235
  throw error;
244
236
  }
237
+ assertCurrent(tempPath);
245
238
  }
246
239
  if (syncTempFile) {
247
- await assertCurrent(tempPath);
248
240
  await syncFileBestEffort(handle);
241
+ assertCurrent(tempPath);
249
242
  }
250
- await assertCurrent(tempPath);
251
243
  await fs.rename(tempPath, filePath);
252
244
  // A later verification failure never authorizes rollback of the final name.
253
245
  renamed = true;
254
246
  unregister();
255
- await assertCurrent(filePath);
256
- if (syncParentDir)
247
+ assertCurrent(filePath);
248
+ if (syncParentDir) {
257
249
  await syncDirectoryBestEffort(parent);
258
- await assertCurrent(filePath);
250
+ assertCurrent(filePath);
251
+ }
259
252
  });
260
253
  return { filePath, result };
261
254
  }
@@ -276,9 +269,9 @@ export async function writeCallbackSibling(params) {
276
269
  try {
277
270
  if (!renamed && identity) {
278
271
  try {
279
- await assertParent();
280
- await inspectStage(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity);
281
- await inspectPath(tempPath, identity);
272
+ assertParent();
273
+ inspectStage(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity);
274
+ inspectPath(tempPath, identity);
282
275
  await fs.unlink(tempPath);
283
276
  unregister?.();
284
277
  }
@@ -26,4 +26,3 @@ export declare function writeViaSiblingTempPath(params: {
26
26
  fallbackFileName?: string;
27
27
  tempPrefix?: string;
28
28
  }): Promise<void>;
29
- //# sourceMappingURL=sibling-temp.d.ts.map
@@ -1,5 +1,4 @@
1
1
  import type { SidecarLockAcquireOptions, SidecarLockHandle } from "./sidecar-lock-types.js";
2
- import { type SidecarLockAcquisitionContext } from "./sidecar-lock-admission.js";
2
+ import type { SidecarLockAcquisitionContext } from "./sidecar-lock-admission.js";
3
3
  export type { HeldSidecarLock } from "./sidecar-lock-admission.js";
4
4
  export declare function acquireSidecarLock<TPayload extends Record<string, unknown>>(options: SidecarLockAcquireOptions<TPayload>, context: SidecarLockAcquisitionContext): Promise<SidecarLockHandle>;
5
- //# sourceMappingURL=sidecar-lock-acquire.d.ts.map