@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
@@ -2,11 +2,12 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { FsSafeError } from "./errors.js";
4
4
  import { captureRootSyncAcquireOptions } from "./file-lock-sync-root-options.js";
5
- import { defaultSyncShouldReclaim, foreignSyncHeldLock, getSyncLockAdmissions, syncLockTimeout } from "./file-lock-sync-admission.js";
6
- import { computeSidecarLockDelayMs, isTransientLockFileDenial, maxTransientLockDenials, } from "./sidecar-lock-policy.js";
5
+ import { defaultSyncShouldReclaim, foreignSyncHeldLock } from "./file-lock-sync-admission.js";
6
+ import { isTransientLockFileDenial } from "./sidecar-lock-policy.js";
7
7
  import { serializeSidecarLockPayload, } from "./sidecar-lock-reclaim.js";
8
8
  import { createSuppressedError } from "./suppressed-error.js";
9
- import { sleepSync } from "./timing.js";
9
+ import { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
10
+ import { assertSynchronousCallbackResult } from "./mutation-authority.js";
10
11
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
11
12
  import { admitFileLockSyncRootPath, assertFileLockSyncRootPathsCurrent, captureFileLockSyncRootAuthority, normalizeFileLockSyncTargetWithRoot, } from "./file-lock-sync-root.js";
12
13
  import { cleanupCreatedRootSyncLock, FileLockSyncRootArbitrationCollision, tryReuseCurrentRootSyncHeldLock, } from "./file-lock-sync-root-arbitration.js";
@@ -36,20 +37,6 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
36
37
  const heldLocks = getRootSyncHeldLocks();
37
38
  const currentTargetHolder = () => heldLocks.get(normalizedTargetPath) ??
38
39
  foreignSyncHeldLock("root", normalizedTargetPath);
39
- const admissions = getSyncLockAdmissions();
40
- const admissionToken = {};
41
- let ownsAdmission = false;
42
- const assertAdmission = () => {
43
- if (admissions.get(normalizedTargetPath) !== admissionToken) {
44
- throw syncLockTimeout(lockPath, normalizedTargetPath);
45
- }
46
- };
47
- const releaseAdmission = () => {
48
- if (ownsAdmission && admissions.get(normalizedTargetPath) === admissionToken) {
49
- admissions.delete(normalizedTargetPath);
50
- }
51
- ownsAdmission = false;
52
- };
53
40
  const arbitration = Object.freeze({
54
41
  authority,
55
42
  heldLocks,
@@ -58,44 +45,15 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
58
45
  reentrantOwner: options.reentrantOwner,
59
46
  });
60
47
  if (heldLocks.has(normalizedTargetPath) && !foreignSyncHeldLock("root", normalizedTargetPath)) {
61
- assertFileLockSyncRootPathsCurrent(guardedPaths, true, true);
48
+ assertFileLockSyncRootPathsCurrent(guardedPaths);
62
49
  const initiallyReusable = tryReuseCurrentRootSyncHeldLock(arbitration);
63
50
  if (initiallyReusable)
64
51
  return initiallyReusable;
65
52
  }
66
- const startedAt = Date.now();
67
- let attempt = 0;
68
- let transientDenials = 0;
53
+ const acquisition = new SyncLockAcquisition(lockPath, normalizedTargetPath, options.retry, options.timeoutMs);
69
54
  let ownedReclaimGuard;
70
55
  let reclaimCleanupAttempted = false;
71
56
  const reuseCurrentHeld = () => ownedReclaimGuard ? undefined : tryReuseCurrentRootSyncHeldLock(arbitration);
72
- const waitForRetry = () => {
73
- releaseAdmission();
74
- const elapsed = Date.now() - startedAt;
75
- const timedOut = options.timeoutMs !== undefined && elapsed >= options.timeoutMs;
76
- if (timedOut || (options.retry.retries !== undefined && attempt >= options.retry.retries)) {
77
- throw syncLockTimeout(lockPath, normalizedTargetPath);
78
- }
79
- const remaining = options.timeoutMs === undefined || options.timeoutMs === Number.POSITIVE_INFINITY
80
- ? Number.POSITIVE_INFINITY
81
- : Math.max(0, options.timeoutMs - elapsed);
82
- sleepSync(Math.min(computeSidecarLockDelayMs(options.retry, attempt), remaining));
83
- attempt += 1;
84
- };
85
- const retryLockFileDenial = (error) => {
86
- if (!isTransientLockFileDenial(error, lockPath) ||
87
- ++transientDenials > maxTransientLockDenials)
88
- return false;
89
- try {
90
- waitForRetry();
91
- }
92
- catch (waitError) {
93
- if (waitError.code === "file_lock_timeout")
94
- throw error;
95
- throw waitError;
96
- }
97
- return true;
98
- };
99
57
  const releaseReclaimGuard = () => {
100
58
  const receipt = ownedReclaimGuard;
101
59
  if (!receipt)
@@ -115,19 +73,14 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
115
73
  };
116
74
  try {
117
75
  while (true) {
118
- if (!ownsAdmission) {
119
- if (admissions.has(normalizedTargetPath))
120
- throw syncLockTimeout(lockPath, normalizedTargetPath);
121
- admissions.set(normalizedTargetPath, admissionToken);
122
- ownsAdmission = true;
123
- }
124
- assertAdmission();
125
- assertFileLockSyncRootPathsCurrent(guardedPaths, true, true);
126
- assertAdmission();
76
+ acquisition.reserve();
77
+ acquisition.assert();
78
+ assertFileLockSyncRootPathsCurrent(guardedPaths);
79
+ acquisition.assert();
127
80
  if (ownedReclaimGuard)
128
81
  assertOwnedReclaimGuardCurrent();
129
- if (!ownedReclaimGuard && fileLockSyncRootGuardExists(reclaimRootPath, true)) {
130
- waitForRetry();
82
+ if (!ownedReclaimGuard && fileLockSyncRootGuardExists(reclaimRootPath)) {
83
+ acquisition.waitForRetry();
131
84
  continue;
132
85
  }
133
86
  if (currentTargetHolder() !== undefined) {
@@ -136,16 +89,16 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
136
89
  return reused;
137
90
  }
138
91
  const payload = Reflect.apply(options.payload, options.optionsReceiver, []);
139
- assertAdmission();
92
+ acquisition.assert();
140
93
  const { raw, ownershipToken } = serializeSidecarLockPayload(payload);
141
- assertAdmission();
94
+ acquisition.assert();
142
95
  if (ownedReclaimGuard)
143
96
  assertOwnedReclaimGuardCurrent();
144
97
  if (currentTargetHolder() !== undefined) {
145
98
  const reused = reuseCurrentHeld();
146
99
  if (reused)
147
100
  return reused;
148
- waitForRetry();
101
+ acquisition.waitForRetry();
149
102
  continue;
150
103
  }
151
104
  let fd;
@@ -153,9 +106,9 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
153
106
  let unpublishedTimer;
154
107
  let lockFileCreateOpenFailure;
155
108
  try {
156
- const created = createFileLockSyncRootFile(lockRootPath, 0o600, {
109
+ const created = createFileLockSyncRootFile(lockRootPath, {
157
110
  assertBeforeOpen: () => {
158
- assertAdmission();
111
+ acquisition.assert();
159
112
  if (ownedReclaimGuard)
160
113
  assertOwnedReclaimGuardCurrent();
161
114
  if (currentTargetHolder() !== undefined)
@@ -192,29 +145,11 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
192
145
  snapshot,
193
146
  };
194
147
  const returnedHandle = createRootSyncHeldLockHandle(createdHeld);
195
- if (options.onCompromised && (options.compromiseCheckIntervalMs ?? 0) > 0) {
196
- const timer = setInterval(() => {
197
- let stillHeld;
198
- try {
199
- stillHeld = returnedHandle.verifyStillHeld();
200
- }
201
- catch {
202
- stillHeld = false;
203
- }
204
- if (!stillHeld && createdHeld.timer) {
205
- clearInterval(createdHeld.timer);
206
- createdHeld.timer = undefined;
207
- Reflect.apply(options.onCompromised, options.optionsReceiver, [{ lockPath, normalizedTargetPath }]);
208
- }
209
- }, options.compromiseCheckIntervalMs);
210
- unpublishedTimer = timer;
211
- createdHeld.timer = timer;
212
- timer.unref();
213
- }
148
+ acquisition.monitor(createdHeld, returnedHandle, options.onCompromised, options.compromiseCheckIntervalMs, options.optionsReceiver, (timer) => { unpublishedTimer = timer; });
214
149
  if (currentTargetHolder() !== undefined) {
215
150
  throw new FileLockSyncRootArbitrationCollision();
216
151
  }
217
- assertAdmission();
152
+ acquisition.assert();
218
153
  heldLocks.set(normalizedTargetPath, createdHeld);
219
154
  fd = undefined;
220
155
  unpublishedTimer = undefined;
@@ -239,12 +174,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
239
174
  const reused = reuseCurrentHeld();
240
175
  if (reused)
241
176
  return reused;
242
- waitForRetry();
177
+ acquisition.waitForRetry();
243
178
  continue;
244
179
  }
245
180
  const fromLockFileOpen = lockFileCreateOpenFailure !== undefined &&
246
181
  lockFileCreateOpenFailure.error === error;
247
- if (fromLockFileOpen && retryLockFileDenial(error))
182
+ if (fromLockFileOpen && acquisition.retryDenial(error))
248
183
  continue;
249
184
  if (!fromLockFileOpen || error.code !== "EEXIST")
250
185
  throw error;
@@ -253,14 +188,14 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
253
188
  const reused = reuseCurrentHeld();
254
189
  if (reused)
255
190
  return reused;
256
- waitForRetry();
191
+ acquisition.waitForRetry();
257
192
  continue;
258
193
  }
259
194
  if (currentTargetHolder() !== undefined) {
260
195
  const reused = reuseCurrentHeld();
261
196
  if (reused)
262
197
  return reused;
263
- waitForRetry();
198
+ acquisition.waitForRetry();
264
199
  continue;
265
200
  }
266
201
  let lockFileOpenDenied = false;
@@ -271,7 +206,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
271
206
  });
272
207
  }
273
208
  catch (readError) {
274
- if (lockFileOpenDenied && retryLockFileDenial(readError))
209
+ if (lockFileOpenDenied && acquisition.retryDenial(readError))
275
210
  continue;
276
211
  throw readError;
277
212
  }
@@ -279,12 +214,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
279
214
  const reused = reuseCurrentHeld();
280
215
  if (reused)
281
216
  return reused;
282
- waitForRetry();
217
+ acquisition.waitForRetry();
283
218
  continue;
284
219
  }
285
- assertAdmission();
220
+ acquisition.assert();
286
221
  if (!current) {
287
- waitForRetry();
222
+ acquisition.waitForRetry();
288
223
  continue;
289
224
  }
290
225
  const snapshot = current.snapshot;
@@ -299,7 +234,8 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
299
234
  nowMs,
300
235
  heldByThisProcess: false,
301
236
  }]);
302
- assertAdmission();
237
+ assertSynchronousCallbackResult(reclaim, "shouldReclaim");
238
+ acquisition.assert();
303
239
  if (!fileLockSyncRootSnapshotStillCurrent(lockRootPath, current)) {
304
240
  throw new FsSafeError("path-mismatch", "sidecar changed during reclaim policy callback");
305
241
  }
@@ -313,7 +249,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
313
249
  options.shouldRemoveStaleLock) {
314
250
  const guard = createFileLockSyncRootDirectory(reclaimRootPath);
315
251
  if (!guard) {
316
- waitForRetry();
252
+ acquisition.waitForRetry();
317
253
  continue;
318
254
  }
319
255
  ownedReclaimGuard = guard;
@@ -324,11 +260,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
324
260
  raw: snapshot.raw,
325
261
  payload: snapshot.payload,
326
262
  }]);
327
- assertAdmission();
263
+ assertSynchronousCallbackResult(approved, "shouldRemoveStaleLock");
264
+ acquisition.assert();
328
265
  assertOwnedReclaimGuardCurrent();
329
266
  if (approved) {
330
267
  const removed = removeFileLockSyncRootFile(lockRootPath, current.receipt, snapshot, () => {
331
- assertAdmission();
268
+ acquisition.assert();
332
269
  assertOwnedReclaimGuardCurrent();
333
270
  if (currentTargetHolder() !== undefined)
334
271
  throw new FileLockSyncRootArbitrationCollision();
@@ -349,7 +286,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
349
286
  normalizedTargetPath,
350
287
  });
351
288
  }
352
- waitForRetry();
289
+ acquisition.waitForRetry();
353
290
  }
354
291
  }
355
292
  }
@@ -365,6 +302,6 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
365
302
  throw error;
366
303
  }
367
304
  finally {
368
- releaseAdmission();
305
+ acquisition.release();
369
306
  }
370
307
  }
@@ -15,4 +15,3 @@ export type FileLockSyncRootArbitration = Readonly<{
15
15
  }>;
16
16
  export declare function tryReuseCurrentRootSyncHeldLock(arbitration: FileLockSyncRootArbitration): FileLockSyncHandle | undefined;
17
17
  export declare function cleanupCreatedRootSyncLock(lockRootPath: FileLockSyncRootPath, fd: number, receipt: FileLockSyncRootFileReceipt, timer?: NodeJS.Timeout): void;
18
- //# sourceMappingURL=file-lock-sync-root-arbitration.d.ts.map
@@ -28,7 +28,5 @@ export declare function getRootSyncHeldLocks(): Map<string, RootSyncHeldLock>;
28
28
  export declare function ensureRootSyncExitCleanupRegistered(): void;
29
29
  export declare function verifyRootSyncHeldLock(held: RootSyncHeldLock): boolean;
30
30
  export declare function createRootSyncHeldLockHandle(held: RootSyncHeldLock): FileLockSyncHandle;
31
- export declare function isRootSyncHeldLockHandle(handle: FileLockSyncHandle): boolean;
32
- export declare function withRootSyncHeldLockHandle<T>(lock: FileLockSyncHandle, fn: () => T): T;
31
+ export declare function withSyncHeldLockHandle<T>(lock: FileLockSyncHandle, fn: () => T): T;
33
32
  export {};
34
- //# sourceMappingURL=file-lock-sync-root-held.d.ts.map
@@ -223,7 +223,12 @@ export function ensureRootSyncExitCleanupRegistered() {
223
223
  ensureFileLockSyncRootExitCleanupRegistered(releaseAllRootSyncHeldLocks);
224
224
  }
225
225
  export function verifyRootSyncHeldLock(held) {
226
- const current = readRootSidecarSnapshotSync(held.rootPath, held.parsePayload, undefined, held.rootReceipt);
226
+ const rootPath = held.rootPath;
227
+ const parsePayload = held.parsePayload;
228
+ const rootReceipt = held.rootReceipt;
229
+ const current = parsePayload
230
+ ? readRootSidecarSnapshotSync(rootPath, parsePayload, undefined, rootReceipt)
231
+ : readFileLockSyncRootSnapshot(rootPath, { expectedReceipt: rootReceipt });
227
232
  if (!current)
228
233
  return false;
229
234
  return current.receipt.identity.dev === held.rootReceipt.identity.dev &&
@@ -369,10 +374,7 @@ export function createRootSyncHeldLockHandle(held) {
369
374
  rootSyncHandleDispositions.set(handle, disposition);
370
375
  return handle;
371
376
  }
372
- export function isRootSyncHeldLockHandle(handle) {
373
- return rootSyncHandleDispositions.has(handle);
374
- }
375
- export function withRootSyncHeldLockHandle(lock, fn) {
377
+ export function withSyncHeldLockHandle(lock, fn) {
376
378
  let result;
377
379
  try {
378
380
  result = fn();
@@ -41,4 +41,3 @@ export declare function readFileLockSyncRootSnapshot(pathAuthority: FileLockSync
41
41
  export declare function fileLockSyncRootSnapshotStillCurrent(pathAuthority: FileLockSyncRootPath, observed: FileLockSyncRootSnapshot): boolean;
42
42
  export declare function fileReceiptCurrentAfterParentCheck(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): boolean;
43
43
  export declare function fileLockSyncRootReceiptStillCurrent(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): boolean;
44
- //# sourceMappingURL=file-lock-sync-root-io.d.ts.map
@@ -1,17 +1,16 @@
1
1
  import { type SidecarLockSnapshot } from "./sidecar-lock-reclaim.js";
2
2
  import { type FileLockSyncRootPath } from "./file-lock-sync-root.js";
3
3
  import { type FileLockSyncRootDirectoryReceipt, type FileLockSyncRootFileReceipt } from "./file-lock-sync-root-io.js";
4
- export declare function createFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, mode: number, options?: {
5
- assertBeforeOpen?: () => void;
6
- onOpenFailure?: (error: unknown) => void;
4
+ export declare function createFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, options: {
5
+ assertBeforeOpen: () => void;
6
+ onOpenFailure: (error: unknown) => void;
7
7
  }): {
8
8
  fd: number;
9
9
  receipt: FileLockSyncRootFileReceipt;
10
10
  };
11
11
  export declare function refreshFileLockSyncRootFileReceipt(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): FileLockSyncRootFileReceipt;
12
12
  export declare function removeFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt, expected?: SidecarLockSnapshot, assertBeforeRemove?: () => boolean | void): boolean;
13
- export declare function fileLockSyncRootGuardExists(pathAuthority: FileLockSyncRootPath, pathAlreadyCurrent?: boolean): boolean;
13
+ export declare function fileLockSyncRootGuardExists(pathAuthority: FileLockSyncRootPath): boolean;
14
14
  export declare function createFileLockSyncRootDirectory(pathAuthority: FileLockSyncRootPath): FileLockSyncRootDirectoryReceipt | null;
15
15
  export declare function removeFileLockSyncRootDirectory(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootDirectoryReceipt): boolean;
16
16
  export declare function fileLockSyncRootDirectoryReceiptStillCurrent(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootDirectoryReceipt): boolean;
17
- //# sourceMappingURL=file-lock-sync-root-mutation.d.ts.map
@@ -76,7 +76,7 @@ function ensureParent(pathAuthority) {
76
76
  assertDirectoryCurrent(currentReceipt);
77
77
  return currentReceipt;
78
78
  }
79
- export function createFileLockSyncRootFile(pathAuthority, mode, options = {}) {
79
+ export function createFileLockSyncRootFile(pathAuthority, options) {
80
80
  const parent = ensureParent(pathAuthority);
81
81
  if (invokeFileLockSyncRootMutationAuthority(pathAuthority.authority)) {
82
82
  assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
@@ -88,12 +88,12 @@ export function createFileLockSyncRootFile(pathAuthority, mode, options = {}) {
88
88
  let fd;
89
89
  let receipt;
90
90
  try {
91
- options.assertBeforeOpen?.();
91
+ options.assertBeforeOpen();
92
92
  try {
93
- fd = fs.openSync(pathForWindowsFilesystem(pathAuthority.path), fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | noFollow, mode);
93
+ fd = fs.openSync(pathForWindowsFilesystem(pathAuthority.path), fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | noFollow, 0o600);
94
94
  }
95
95
  catch (error) {
96
- options.onOpenFailure?.(error);
96
+ options.onOpenFailure(error);
97
97
  throw error;
98
98
  }
99
99
  const opened = inspectFileIdentitySync(() => fs.fstatSync(fd, { bigint: true }));
@@ -193,11 +193,9 @@ export function removeFileLockSyncRootFile(pathAuthority, receipt, expected, ass
193
193
  }
194
194
  throw new FsSafeError("path-mismatch", "sidecar lock was replaced during removal");
195
195
  }
196
- export function fileLockSyncRootGuardExists(pathAuthority, pathAlreadyCurrent = false) {
197
- if (!pathAlreadyCurrent)
198
- assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
199
- // A shared path admission may skip only duplicate resolution, never this
200
- // operation-local Root identity fence before fresh directory inspection.
196
+ export function fileLockSyncRootGuardExists(pathAuthority) {
197
+ // The caller already admitted this path; every guard observation still needs
198
+ // an operation-local Root identity fence before fresh directory inspection.
201
199
  assertRootIdentityCurrentSync(pathAuthority.authority.context);
202
200
  let stat;
203
201
  try {
@@ -17,4 +17,3 @@ type CapturedRootSyncAcquireOptions<TPayload extends Record<string, unknown>> =
17
17
  }>;
18
18
  export declare function captureRootSyncAcquireOptions<TPayload extends Record<string, unknown>>(options: FileLockSyncAcquireOptions<TPayload>): CapturedRootSyncAcquireOptions<TPayload>;
19
19
  export {};
20
- //# sourceMappingURL=file-lock-sync-root-options.d.ts.map
@@ -1,2 +1 @@
1
1
  export declare function ensureFileLockSyncRootExitCleanupRegistered(cleanupHandler: () => void): void;
2
- //# sourceMappingURL=file-lock-sync-root-registration.d.ts.map
@@ -30,7 +30,6 @@ type RootPathResolutionPolicy = Readonly<{
30
30
  }>;
31
31
  export declare function admitFileLockSyncRootPath(authority: FileLockSyncRootAuthority, requestedPath: string): FileLockSyncRootPath;
32
32
  export declare function assertFileLockSyncRootResolvedPathCurrent(pathAuthority: FileLockSyncRootPath): void;
33
- export declare function assertFileLockSyncRootPathsCurrent(paths: readonly FileLockSyncRootPath[], invokeAuthority?: boolean, pathsAlreadyCurrent?: boolean): void;
33
+ export declare function assertFileLockSyncRootPathsCurrent(paths: readonly FileLockSyncRootPath[]): void;
34
34
  export declare function normalizeFileLockSyncTargetWithRoot(authority: FileLockSyncRootAuthority, resolvedTargetPath: string): string;
35
35
  export {};
36
- //# sourceMappingURL=file-lock-sync-root.d.ts.map
@@ -1,8 +1,8 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import {} from "./deny-mutations.js";
3
+ import { assertMutationNotDenied } from "./deny-mutations.js";
4
4
  import { FsSafeError } from "./errors.js";
5
- import { assertNoNulPathInput, isNotFoundPathError, isPathInside } from "./path.js";
5
+ import { assertNoNulPathInput, isNotFoundPathError } from "./path.js";
6
6
  import { resolveRootPathSync } from "./root-path.js";
7
7
  import { isRootPathEscapeError } from "./root-path-errors.js";
8
8
  import { admitPathInsideRoot } from "./root-boundary.js";
@@ -100,68 +100,8 @@ function absoluteRootPath(authority, relativePath) {
100
100
  assertNoWindowsPathAlias(absolute, "filesystem", "sidecar lock path uses a Windows filesystem namespace alias");
101
101
  return absolute;
102
102
  }
103
- function assertValidPolicyEntries(entries) {
104
- const captured = [];
105
- for (const entry of entries ?? []) {
106
- if (!entry || !path.isAbsolute(entry)) {
107
- throw new FsSafeError("invalid-path", "deny mutation paths must be non-empty absolute paths");
108
- }
109
- assertNoNulPathInput(entry, "deny mutation path contains a NUL byte");
110
- assertNoWindowsPathAlias(entry, "filesystem", "deny mutation path uses a Windows filesystem namespace alias");
111
- captured.push(resolvePathPreservingWindowsRoot(entry));
112
- }
113
- return captured;
114
- }
115
- function mutationComparablePaths(pathname) {
116
- const resolved = resolvePathPreservingWindowsRoot(pathname);
117
- assertNoWindowsPathAlias(resolved, "filesystem", "mutation path uses a Windows filesystem namespace alias");
118
- let cursor = resolved;
119
- const missing = [];
120
- while (path.parse(cursor).root !== cursor) {
121
- try {
122
- fs.lstatSync(pathForWindowsFilesystem(cursor));
123
- break;
124
- }
125
- catch (error) {
126
- if (!isNotFoundPathError(error))
127
- throw error;
128
- missing.unshift(path.basename(cursor));
129
- cursor = path.dirname(cursor);
130
- }
131
- }
132
- // Deny policy is an authority boundary: unlike advisory key normalization,
133
- // an ambiguous existing ancestor must not silently fall back to lexical form.
134
- const canonicalAncestor = realpathSync.native(pathForWindowsFilesystem(cursor));
135
- assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "mutation path uses a Windows filesystem namespace alias");
136
- const canonical = missing.length === 0
137
- ? canonicalAncestor
138
- : path.resolve(canonicalAncestor, ...missing);
139
- assertNoWindowsPathAlias(canonical, "filesystem", "mutation path uses a Windows filesystem namespace alias");
140
- return samePath(resolved, canonical) ? [resolved] : [resolved, canonical];
141
- }
142
103
  export function assertFileLockSyncRootMutationAllowed(pathname, policy, protectAncestors = false) {
143
- if (!policy?.paths?.length && !policy?.prefixes?.length)
144
- return;
145
- const targets = mutationComparablePaths(pathname);
146
- for (const entry of assertValidPolicyEntries(policy.paths)) {
147
- for (const denied of mutationComparablePaths(entry)) {
148
- for (const target of targets) {
149
- if ((isPathInside(denied, target) && isPathInside(target, denied)) ||
150
- (protectAncestors && isPathInside(target, denied))) {
151
- throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
152
- }
153
- }
154
- }
155
- }
156
- for (const entry of assertValidPolicyEntries(policy.prefixes)) {
157
- for (const denied of mutationComparablePaths(entry)) {
158
- for (const target of targets) {
159
- if (isPathInside(denied, target) || (protectAncestors && isPathInside(target, denied))) {
160
- throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
161
- }
162
- }
163
- }
164
- }
104
+ assertMutationNotDenied(pathname, policy, { protectAncestors }, "sync-root-lock");
165
105
  }
166
106
  function resolveAdmittedPath(authority, absolutePath, policy, rootPath) {
167
107
  const context = authority.context;
@@ -279,24 +219,14 @@ function assertMissingParentMutationsAllowed(pathAuthority) {
279
219
  assertFileLockSyncRootMutationAllowed(current, authority.denyMutations);
280
220
  }
281
221
  }
282
- export function assertFileLockSyncRootPathsCurrent(paths, invokeAuthority = false, pathsAlreadyCurrent = false) {
222
+ export function assertFileLockSyncRootPathsCurrent(paths) {
283
223
  const authority = paths[0]?.authority;
284
224
  for (const pathAuthority of paths) {
285
225
  if (authority && pathAuthority.authority !== authority) {
286
226
  throw new FsSafeError("path-mismatch", "sidecar paths use different Root authority");
287
227
  }
288
228
  }
289
- if (!pathsAlreadyCurrent) {
290
- if (authority)
291
- assertRootIdentityCurrentSync(authority.context);
292
- for (const pathAuthority of paths) {
293
- assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
294
- assertMissingParentMutationsAllowed(pathAuthority);
295
- }
296
- if (authority)
297
- assertRootIdentityCurrentSync(authority.context);
298
- }
299
- if (invokeAuthority && authority && invokeFileLockSyncRootMutationAuthority(authority)) {
229
+ if (authority && invokeFileLockSyncRootMutationAuthority(authority)) {
300
230
  assertRootIdentityCurrentSync(authority.context);
301
231
  for (const pathAuthority of paths) {
302
232
  assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
@@ -309,16 +239,13 @@ function resolveTargetPathViaExistingAncestorSync(targetPath) {
309
239
  const normalized = resolvePathPreservingWindowsRoot(targetPath);
310
240
  const canonicalize = process.platform === "win32" ? realpathSync.native : realpathSync;
311
241
  let cursor = normalized;
312
- const missing = [];
242
+ let canonicalAncestor;
313
243
  while (true) {
314
244
  try {
315
245
  fs.lstatSync(pathForWindowsFilesystem(cursor));
316
246
  try {
317
- const canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
318
- assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "file-lock target ancestor uses a Windows filesystem namespace alias");
319
- return missing.length === 0
320
- ? resolvePathPreservingWindowsRoot(canonicalAncestor)
321
- : resolvePathPreservingWindowsRoot(path.resolve(canonicalAncestor, ...missing));
247
+ canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
248
+ break;
322
249
  }
323
250
  catch (error) {
324
251
  if (!isNotFoundPathError(error))
@@ -336,15 +263,15 @@ function resolveTargetPathViaExistingAncestorSync(targetPath) {
336
263
  if (parent === cursor) {
337
264
  // Filesystem roots are expected to exist; preserve the underlying
338
265
  // not-found diagnosis if a synthetic namespace violates that premise.
339
- const canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
340
- assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "file-lock target ancestor uses a Windows filesystem namespace alias");
341
- return missing.length === 0
342
- ? resolvePathPreservingWindowsRoot(canonicalAncestor)
343
- : resolvePathPreservingWindowsRoot(path.resolve(canonicalAncestor, ...missing));
266
+ canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
267
+ break;
344
268
  }
345
- missing.unshift(path.basename(cursor));
346
269
  cursor = parent;
347
270
  }
271
+ assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "file-lock target ancestor uses a Windows filesystem namespace alias");
272
+ return resolvePathPreservingWindowsRoot(cursor === normalized
273
+ ? canonicalAncestor
274
+ : path.resolve(canonicalAncestor, `.${path.sep}${normalized.slice(cursor.length)}`));
348
275
  }
349
276
  export function normalizeFileLockSyncTargetWithRoot(authority, resolvedTargetPath) {
350
277
  assertNoNulPathInput(resolvedTargetPath, "file-lock target contains a NUL byte");
@@ -1,4 +1,5 @@
1
1
  import type { FileLockSyncAcquireOptions } from "./file-lock-sync.js";
2
+ import type { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
2
3
  import type { SidecarLockStaleRecovery } from "./sidecar-lock-types.js";
3
4
  export type SyncStaleOptionsState<TPayload extends Record<string, unknown>> = {
4
5
  shouldReclaimObserved?: boolean;
@@ -7,18 +8,12 @@ export type SyncStaleOptionsState<TPayload extends Record<string, unknown>> = {
7
8
  shouldRemove?: FileLockSyncAcquireOptions<TPayload>["shouldRemoveStaleLock"];
8
9
  };
9
10
  /** Handle one exclusive-create conflict without surrendering canonical admission. */
10
- export declare function handleSyncStaleAdmission<TPayload extends Record<string, unknown>>(params: {
11
- hasToken(): boolean;
11
+ export declare function handleSyncStaleAdmission<TPayload extends Record<string, unknown>>(acquisition: SyncLockAcquisition, params: {
12
12
  currentHeld(): unknown;
13
- lockPath: string;
14
- normalizedTargetPath: string;
15
13
  options: FileLockSyncAcquireOptions<TPayload>;
16
14
  parsePayload?: (raw: string) => unknown;
17
15
  reclaimGuardPath: string;
18
- retryLockFileDenial(error: unknown): boolean;
19
16
  staleMs: number;
20
17
  staleOptions: SyncStaleOptionsState<TPayload>;
21
18
  staleRecovery?: SidecarLockStaleRecovery;
22
- waitForRetry(): void;
23
19
  }): void;
24
- //# sourceMappingURL=file-lock-sync-stale-admission.d.ts.map