@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
@@ -50,12 +50,12 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
50
50
  var e = new Error(message);
51
51
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
52
  });
53
- import { assertDarwinCreationAcl, privateFileMutationAssertion } from "./creation-darwin.js";
53
+ import { assertDarwinCreationAcl } from "./creation-darwin.js";
54
54
  import { assertPrivateCreationFile } from "./creation-file-state.js";
55
55
  import { requireNativeBinding } from "./native.js";
56
56
  import { syncFileBestEffortSync } from "./file-sync.js";
57
57
  import { randomUUID } from "node:crypto";
58
- import fs from "node:fs";
58
+ import fs, {} from "node:fs";
59
59
  import path from "node:path";
60
60
  import { FsSafeError } from "./errors.js";
61
61
  import { assertSynchronousCallbackResult, MutationAuthorityError } from "./mutation-authority.js";
@@ -86,50 +86,33 @@ function assertBasename(name, portable) {
86
86
  }
87
87
  const NOT_PUBLISHED = Object.freeze({ status: "not-published" });
88
88
  class NativeStagedFile {
89
- #binding;
89
+ #owner;
90
90
  #closeFd;
91
- #parentFd;
92
- #closeParentFd;
93
- #directory;
94
- #portableNames;
95
- #publishedMode;
96
- #sync;
97
- #strictFileSync;
91
+ #assertBeforeMutation;
98
92
  #private;
99
93
  #verifyMode;
100
- #assertBeforeMutation;
101
- #name;
102
94
  #state = { status: "open", publication: NOT_PUBLISHED };
103
95
  #receipt;
104
96
  #rejectFinalSymlink = false;
105
- constructor(binding, parentFd, closeParentFd, directory, portableNames, publishedMode, sync, assertBeforeMutation, name = `.fs-safe-${randomUUID()}.tmp`, strictFileSync = false, permissionPolicy) {
106
- assertBasename(name, portableNames);
107
- this.#name = name;
108
- this.#closeFd = captureNativeFdClose(binding);
109
- this.#binding = binding;
110
- this.#parentFd = parentFd;
111
- this.#closeParentFd = closeParentFd;
112
- this.#directory = directory;
113
- this.#portableNames = portableNames;
114
- this.#publishedMode = publishedMode;
115
- this.#sync = sync;
116
- this.#strictFileSync = strictFileSync;
117
- this.#private = permissionPolicy === "private-creation";
118
- this.#verifyMode = permissionPolicy !== undefined;
119
- this.#assertBeforeMutation = assertBeforeMutation;
97
+ constructor(owner) {
98
+ const name = owner.name ?? `.fs-safe-${randomUUID()}.tmp`;
99
+ assertBasename(name, owner.portableNames !== false);
100
+ this.#closeFd = captureNativeFdClose(owner.binding);
101
+ this.#owner = { ...owner, name };
102
+ this.#assertBeforeMutation = owner.assertBeforeMutation;
103
+ this.#private = owner.permissionPolicy === "private-creation";
104
+ this.#verifyMode = owner.permissionPolicy !== undefined;
120
105
  }
121
106
  // Public staging supplies a Node parent; pinned writes supply a native parent.
122
107
  // The supplied closer owns parentFd even on construction or preparation failure.
123
- static async create(binding, parentFd, closeParentFd, directory, input, mode, maxBytes,
124
- // Public staging uses portable names; existing POSIX writes accept literal names.
125
- portableNames = true, sync = true, assertBeforeMutation, exclusiveBasename, strictFileSync = false, permissionPolicy) {
108
+ static async create(owner, input, maxBytes) {
126
109
  let staged;
127
110
  try {
128
- staged = new NativeStagedFile(binding, parentFd, closeParentFd, directory, portableNames, mode, sync, assertBeforeMutation, exclusiveBasename, strictFileSync, permissionPolicy);
111
+ staged = new NativeStagedFile(owner);
129
112
  }
130
113
  catch (error) {
131
114
  try {
132
- closeParentFd(parentFd);
115
+ owner.closeParentFd(owner.parentFd);
133
116
  }
134
117
  catch (closeError) {
135
118
  throw new AggregateError([error, closeError], "staged owner construction and close failed");
@@ -145,7 +128,13 @@ class NativeStagedFile {
145
128
  const exclusive = params.overwrite === false && params.input.kind === "buffer" && params.input.stageBeforePublish === false;
146
129
  // This owner never escapes. Only the internal verifier borrows its fd;
147
130
  // public descriptor methods remain await-free and cannot race disposal.
148
- const staged = __addDisposableResource(env_1, await NativeStagedFile.create(binding, parentFd, closeParentFd, directory, params.input, params.mode, params.maxBytes, false, params.sync, params.assertBeforeMutation, exclusive ? params.basename : undefined, params.strictFileSync, params.private ? "private-creation" : params.verifyPosixMode === true ? "mode-only" : undefined), true);
131
+ const staged = __addDisposableResource(env_1, await NativeStagedFile.create({
132
+ binding, parentFd, closeParentFd, directory, mode: params.mode, sync: params.sync,
133
+ // Public staging uses portable names; existing POSIX writes accept literal names.
134
+ portableNames: false, assertBeforeMutation: params.assertBeforeMutation,
135
+ name: exclusive ? params.basename : undefined, strictFileSync: params.strictFileSync,
136
+ permissionPolicy: params.private ? "private-creation" : params.verifyPosixMode === true ? "mode-only" : undefined,
137
+ }, params.input, params.maxBytes), true);
149
138
  staged.#rejectFinalSymlink = params.rejectFinalSymlink === true;
150
139
  if (params.input.kind === "file")
151
140
  await params.input.verifySource();
@@ -201,7 +190,7 @@ class NativeStagedFile {
201
190
  }
202
191
  #assertNamed(name, expectedMode) {
203
192
  const fd = this.#file();
204
- const stat = this.#binding.stagedFileMatches(this.#parentFd, name, fd)
193
+ const stat = this.#owner.binding.stagedFileMatches(this.#owner.parentFd, name, fd)
205
194
  ? fs.fstatSync(fd, { bigint: true }) : undefined;
206
195
  if (!stat || stat.nlink !== 1n) {
207
196
  throw new FsSafeError("path-mismatch", "staged entry no longer names the exclusive created file");
@@ -213,8 +202,8 @@ class NativeStagedFile {
213
202
  if (this.#open().publication.status !== "not-published") {
214
203
  throw new FsSafeError("helper-failed", "staged file publication has already been attempted");
215
204
  }
216
- assertStagedDirectoryCurrent(this.#directory);
217
- this.#assertNamed(this.#name, 0o600);
205
+ assertStagedDirectoryCurrent(this.#owner.directory);
206
+ this.#assertNamed(this.#owner.name, 0o600);
218
207
  }
219
208
  #assertPermissions(fd, stat, expectedMode) {
220
209
  if (this.#private)
@@ -228,7 +217,7 @@ class NativeStagedFile {
228
217
  }
229
218
  async #prepare(input, maxBytes) {
230
219
  try {
231
- const mode = this.#publishedMode;
220
+ const mode = this.#owner.mode;
232
221
  if (!Number.isInteger(mode) || mode < 0 || mode > 0o7777) {
233
222
  throw new FsSafeError("invalid-path", "invalid staged file mode");
234
223
  }
@@ -239,32 +228,35 @@ class NativeStagedFile {
239
228
  throw new FsSafeError("helper-unavailable", "required cloning cannot verify staged permissions before copying");
240
229
  }
241
230
  }
242
- assertStagedDirectoryCurrent(this.#directory);
231
+ assertStagedDirectoryCurrent(this.#owner.directory);
243
232
  // The exclusive open performs no fallible post-open checks. Store its fd
244
233
  // before every subsequent operation, including the first metadata read.
245
234
  const state = this.#open();
246
235
  if (this.#private)
247
- assertDarwinCreationAcl(this.#parentFd, "file");
236
+ assertDarwinCreationAcl(this.#owner.parentFd, "file");
248
237
  this.#assertBeforeMutation?.();
249
238
  if (this.#private)
250
- assertDarwinCreationAcl(this.#parentFd, "file");
239
+ assertDarwinCreationAcl(this.#owner.parentFd, "file");
251
240
  // Native copying populates its new file before returning its descriptor.
252
241
  const copied = input.kind === "file" && !this.#verifyMode
253
- ? await createNativeCopyFile(this.#binding, input, this.#parentFd, this.#name, maxBytes, false)
242
+ ? await createNativeCopyFile(this.#owner.binding, input, this.#owner.parentFd, this.#owner.name, maxBytes, false)
254
243
  : undefined;
255
244
  state.fileFd = copied?.fd;
256
245
  if (state.fileFd === undefined) {
257
246
  this.#assertBeforeMutation?.();
258
247
  if (this.#private)
259
- assertDarwinCreationAcl(this.#parentFd, "file");
260
- state.fileFd = this.#binding.createStagedFile(this.#parentFd, this.#name);
248
+ assertDarwinCreationAcl(this.#owner.parentFd, "file");
249
+ state.fileFd = this.#owner.binding.createStagedFile(this.#owner.parentFd, this.#owner.name);
261
250
  }
262
251
  const fd = state.fileFd;
263
252
  if (input.kind === "file")
264
253
  assertNativeCopyCompleted(input, copied);
265
- const assertBeforeChmod = this.#private
266
- ? privateFileMutationAssertion(fd, this.#assertBeforeMutation) : this.#assertBeforeMutation;
267
- assertBeforeChmod?.();
254
+ const assertBeforeChmod = this.#assertBeforeMutation;
255
+ const beforeChmodResult = assertBeforeChmod?.();
256
+ if (this.#private) {
257
+ assertSynchronousCallbackResult(beforeChmodResult, "assertBeforeMutation");
258
+ assertPrivateCreationFile(fs.fstatSync(fd, { bigint: true }), fd);
259
+ }
268
260
  fs.fchmodSync(fd, 0o600);
269
261
  // Some filesystems report successful chmod without enforcing its mode.
270
262
  if (this.#verifyMode)
@@ -278,14 +270,14 @@ class NativeStagedFile {
278
270
  await writePinnedInput(fd, input, maxBytes, assertBeforeMutation);
279
271
  if (this.#verifyMode)
280
272
  this.#assertStagePermissions(fd);
281
- if (this.#sync) {
282
- if (this.#strictFileSync)
273
+ if (this.#owner.sync !== false) {
274
+ if (this.#owner.strictFileSync)
283
275
  fs.fsyncSync(fd);
284
276
  else
285
277
  syncFileBestEffortSync(fd);
286
278
  }
287
279
  const stat = fs.fstatSync(fd, { bigint: true });
288
- this.#receipt = createStagedFileReceipt(this.#directory, this.#name, stat);
280
+ this.#receipt = createStagedFileReceipt(this.#owner.directory, this.#owner.name, stat);
289
281
  this.#assertCurrent();
290
282
  }
291
283
  catch (error) {
@@ -308,23 +300,23 @@ class NativeStagedFile {
308
300
  const overwrite = options?.overwrite;
309
301
  try {
310
302
  const state = this.#open();
311
- assertBasename(basename, this.#portableNames);
312
- if (basename === this.#name || typeof overwrite !== "boolean") {
303
+ assertBasename(basename, this.#owner.portableNames !== false);
304
+ if (basename === this.#owner.name || typeof overwrite !== "boolean") {
313
305
  throw new FsSafeError("invalid-path", "publication needs a distinct basename and explicit overwrite policy");
314
306
  }
315
307
  this.#assertCurrent();
316
- assertFinalSymlinkRejected(path.join(this.#directory.realPath, basename), this.#rejectFinalSymlink);
308
+ assertFinalSymlinkRejected(path.join(this.#owner.directory.realPath, basename), this.#rejectFinalSymlink);
317
309
  this.#assertBeforeMutation?.();
318
310
  if (this.#assertBeforeMutation) {
319
311
  this.#assertCurrent();
320
- assertFinalSymlinkRejected(path.join(this.#directory.realPath, basename), this.#rejectFinalSymlink);
312
+ assertFinalSymlinkRejected(path.join(this.#owner.directory.realPath, basename), this.#rejectFinalSymlink);
321
313
  }
322
314
  try {
323
315
  if (overwrite) {
324
- this.#binding.renameReplace(this.#parentFd, this.#name, this.#parentFd, basename);
316
+ this.#owner.binding.renameReplace(this.#owner.parentFd, this.#owner.name, this.#owner.parentFd, basename);
325
317
  }
326
318
  else {
327
- this.#binding.renameNoReplace(this.#parentFd, this.#name, this.#parentFd, basename);
319
+ this.#owner.binding.renameNoReplace(this.#owner.parentFd, this.#owner.name, this.#owner.parentFd, basename);
328
320
  }
329
321
  }
330
322
  catch (error) {
@@ -352,24 +344,24 @@ class NativeStagedFile {
352
344
  this.#open().publication = receipt;
353
345
  onPublished?.(receipt.staged.identity);
354
346
  const stagedMode = this.#assertNamed(basename, 0o600);
355
- assertStagedDirectoryCurrent(this.#directory);
347
+ assertStagedDirectoryCurrent(this.#owner.directory);
356
348
  // Keep contents private until the name passes its identity fence. Mode
357
349
  // changes use the owned fd, including for final mode 000.
358
350
  const fd = this.#file();
359
- if (this.#publishedMode !== 0o600 || stagedMode !== 0o600)
360
- fs.fchmodSync(fd, this.#publishedMode);
351
+ if (this.#owner.mode !== 0o600 || stagedMode !== 0o600)
352
+ fs.fchmodSync(fd, this.#owner.mode);
361
353
  // Content was synced during preparation. A lost chmod leaves 0600, no wider
362
354
  // than modes retaining owner rw; restrictive modes still need a durable correction.
363
- if (this.#sync && ((this.#publishedMode & 0o600) !== 0o600 || (stagedMode & ~this.#publishedMode) !== 0)) {
364
- if (this.#strictFileSync)
355
+ if (this.#owner.sync !== false && ((this.#owner.mode & 0o600) !== 0o600 || (stagedMode & ~this.#owner.mode) !== 0)) {
356
+ if (this.#owner.strictFileSync)
365
357
  fs.fsyncSync(fd);
366
358
  else
367
359
  syncFileBestEffortSync(fd);
368
360
  }
369
- if (this.#sync)
370
- syncFileBestEffortSync(this.#parentFd);
371
- this.#assertNamed(basename, this.#publishedMode);
372
- assertStagedDirectoryCurrent(this.#directory);
361
+ if (this.#owner.sync !== false)
362
+ syncFileBestEffortSync(this.#owner.parentFd);
363
+ this.#assertNamed(basename, this.#owner.mode);
364
+ assertStagedDirectoryCurrent(this.#owner.directory);
373
365
  return receipt;
374
366
  }
375
367
  #finalize() {
@@ -384,7 +376,7 @@ class NativeStagedFile {
384
376
  }
385
377
  else if (state.publication.status === "not-published" && state.fileFd !== undefined) {
386
378
  try {
387
- outcome = this.#binding.removeStagedFile(this.#parentFd, this.#name, state.fileFd);
379
+ outcome = this.#owner.binding.removeStagedFile(this.#owner.parentFd, this.#owner.name, state.fileFd);
388
380
  }
389
381
  catch (error) {
390
382
  outcome = "failed";
@@ -394,7 +386,7 @@ class NativeStagedFile {
394
386
  let resources = "closed";
395
387
  for (const [fd, closeFd] of [
396
388
  [state.fileFd, this.#closeFd],
397
- [this.#parentFd, this.#closeParentFd],
389
+ [this.#owner.parentFd, this.#owner.closeParentFd],
398
390
  ]) {
399
391
  if (fd === undefined) {
400
392
  continue;
@@ -408,7 +400,7 @@ class NativeStagedFile {
408
400
  }
409
401
  }
410
402
  const receipt = Object.freeze({
411
- temporaryBasename: this.#name,
403
+ temporaryBasename: this.#owner.name,
412
404
  publication: state.publication,
413
405
  status: outcome,
414
406
  resources,
@@ -444,5 +436,8 @@ export async function stageFileInDirectory(options) {
444
436
  const input = { kind: "buffer", data: Buffer.from(options.content) };
445
437
  const mode = options.mode ?? 0o600;
446
438
  const parent = openStagedDirectory(options.directory);
447
- return await createNativeStage(binding, parent.fd, fs.closeSync, parent.receipt, input, mode, undefined, true, true, undefined, undefined, false, "mode-only");
439
+ return await createNativeStage({
440
+ binding, parentFd: parent.fd, closeParentFd: fs.closeSync,
441
+ directory: parent.receipt, mode, permissionPolicy: "mode-only",
442
+ }, input);
448
443
  }
package/dist/native.d.ts CHANGED
@@ -11,4 +11,3 @@ export declare function getNativeBinding(): NativeBinding | undefined;
11
11
  export declare function requireNativeBinding(): NativeBinding;
12
12
  export declare function __setNativeLoaderForTest(loader: () => NativeBinding): void;
13
13
  export declare function __resetNativeLoaderForTest(): void;
14
- //# sourceMappingURL=native.d.ts.map
package/dist/native.js CHANGED
@@ -22,7 +22,7 @@ function isMuslFromReport() {
22
22
  return true;
23
23
  }
24
24
  catch {
25
- // Continue with filesystem and ELF inspection.
25
+ // Continue with ELF and filesystem inspection.
26
26
  }
27
27
  return undefined;
28
28
  }
@@ -114,7 +114,7 @@ function isMuslFromElfInterpreter() {
114
114
  function isMusl() {
115
115
  if (process.platform !== "linux")
116
116
  return false;
117
- for (const detector of [isMuslFromReport, isMuslFromFilesystem, isMuslFromElfInterpreter]) {
117
+ for (const detector of [isMuslFromReport, isMuslFromElfInterpreter, isMuslFromFilesystem]) {
118
118
  const result = detector();
119
119
  if (result !== undefined)
120
120
  return result;
@@ -5,4 +5,3 @@ export declare function recordExclusiveCreateFailure(error: unknown, filePath: s
5
5
  export declare function openedPathResolutionError(error?: Error): Error;
6
6
  export declare function recordPreOpenFileChange(error: unknown, handle: FileHandle, filePath: string, before: BigIntStats | undefined, opened: BigIntStats | undefined): Promise<void>;
7
7
  export declare function recordOpenedFileFailure(error: unknown, handle: FileHandle, filePath: string, identity: BigIntStats): Promise<void>;
8
- //# sourceMappingURL=opened-file-failure.d.ts.map
@@ -13,4 +13,3 @@ export declare function resolveOpenedFileRealPathForFd(fd: number, handleStat: F
13
13
  realPath: string;
14
14
  stat: Stats | BigIntStats;
15
15
  }>;
16
- //# sourceMappingURL=opened-realpath.d.ts.map
@@ -5,9 +5,18 @@ import { openedPathResolutionError } from "./opened-file-failure.js";
5
5
  import { sameFileIdentity } from "./file-identity.js";
6
6
  import { isNotFoundPathError } from "./path.js";
7
7
  import { realpathSync } from "./realpath.js";
8
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
8
9
  export async function resolveOpenedFileRealPathForHandle(handle, ioPath) {
9
- const handleStat = fsSync.fstatSync(handle.fd);
10
- return (await resolveOpenedFileRealPathForFd(handle.fd, handleStat, ioPath)).realPath;
10
+ const fd = handle.fd;
11
+ const identity = inspectFileIdentitySync(() => fsSync.fstatSync(fd, { bigint: true }));
12
+ const resolved = await resolveOpenedFileRealPathForFd(fd, identity, ioPath);
13
+ let first = resolved.stat;
14
+ inspectFileIdentitySync(() => {
15
+ const current = first ?? fsSync.statSync(resolved.realPath, { bigint: true });
16
+ first = undefined;
17
+ return current;
18
+ }, identity);
19
+ return resolved.realPath;
11
20
  }
12
21
  export async function resolveOpenedFileRealPathForFd(fd, handleStat, ioPath) {
13
22
  const statOptions = typeof handleStat.dev === "bigint" || typeof handleStat.ino === "bigint"
package/dist/output.d.ts CHANGED
@@ -14,4 +14,3 @@ export type ExternalFileWriteResult<T = void> = {
14
14
  result: T;
15
15
  };
16
16
  export declare function writeExternalFileWithinRoot<T = void>(options: ExternalFileWriteOptions<T>): Promise<ExternalFileWriteResult<T>>;
17
- //# sourceMappingURL=output.d.ts.map
@@ -5,4 +5,3 @@ export type OverwriteFileHandleOptions = {
5
5
  };
6
6
  /** Overwrite a borrowed, non-append read/write handle with best-effort failure rollback. */
7
7
  export declare function overwriteFileHandle(handle: FileHandle, data: Uint8Array, options?: OverwriteFileHandleOptions): Promise<void>;
8
- //# sourceMappingURL=overwrite-file-handle.d.ts.map
@@ -28,4 +28,3 @@ export type OwnerAndDaclResult = {
28
28
  platform: NodeJS.Platform;
29
29
  };
30
30
  export declare function readOwnerAndDacl(targetPath: string): OwnerAndDaclResult;
31
- //# sourceMappingURL=owner-dacl.d.ts.map
@@ -4,4 +4,3 @@ export type ProbePathCaseOptions = {
4
4
  };
5
5
  /** Observe local ASCII case behavior; unknown observations never imply an operating-system default. */
6
6
  export declare function probePathCaseInsensitiveSync(targetPath: string, options?: ProbePathCaseOptions): boolean | undefined;
7
- //# sourceMappingURL=path-case.d.ts.map
@@ -22,4 +22,3 @@ export declare function assertNoHardlinkedFinalPath(params: {
22
22
  boundaryLabel: string;
23
23
  allowFinalHardlinkForUnlink?: boolean;
24
24
  }): Promise<void>;
25
- //# sourceMappingURL=path-policy.d.ts.map
@@ -4,4 +4,3 @@ export type ResolvedPathPrefix = {
4
4
  readonly unresolvedSegments: readonly string[];
5
5
  };
6
6
  export declare function resolvePathPrefixSync(input: string): ResolvedPathPrefix;
7
- //# sourceMappingURL=path-prefix.d.ts.map
@@ -11,4 +11,3 @@ export declare function resolvePathWithinNormalizedRoot(params: ResolvePathWithi
11
11
  ok: false;
12
12
  error: string;
13
13
  };
14
- //# sourceMappingURL=path-scope-lexical.d.ts.map
@@ -4,4 +4,3 @@ export type PathSegmentRoute = Readonly<{
4
4
  }>;
5
5
  export declare function createPathSegmentRoute(segments: readonly string[]): PathSegmentRoute;
6
6
  export declare function joinPathSegmentRoute(base: string, route: PathSegmentRoute, offset: number, tail?: string): string;
7
- //# sourceMappingURL=path-segment-route.d.ts.map
@@ -9,4 +9,3 @@ export type ProbePathSuffixAliasesOptions = {
9
9
  };
10
10
  /** Observe bounded missing suffix aliases; the caller owns caching and ambiguity policy. */
11
11
  export declare function probePathSuffixAliasesSync(options: ProbePathSuffixAliasesOptions): boolean | undefined;
12
- //# sourceMappingURL=path-suffix-aliases.d.ts.map
package/dist/path.d.ts CHANGED
@@ -18,4 +18,3 @@ export declare function isPathInsideWithRealpath(basePath: string, candidatePath
18
18
  export declare function safeStatSync(targetPath: string): fs.Stats | null;
19
19
  export declare function splitSafeRelativePath(relativePath: string): string[];
20
20
  export declare function resolveSafeRelativePath(rootDir: string, relativePath: string): string;
21
- //# sourceMappingURL=path.d.ts.map
package/dist/path.js CHANGED
@@ -160,7 +160,8 @@ export function splitSafeRelativePath(relativePath) {
160
160
  export function resolveSafeRelativePath(rootDir, relativePath) {
161
161
  assertNoWindowsPathAlias(rootDir, "filesystem", "root dir uses a Windows filesystem namespace alias");
162
162
  const root = resolvePathPreservingWindowsRoot(rootDir);
163
- const target = resolvePathFromBasePreservingWindowsRoot(root, ...splitSafeRelativePath(relativePath));
163
+ splitSafeRelativePath(relativePath);
164
+ const target = resolvePathFromBasePreservingWindowsRoot(root, relativePath);
164
165
  if (!isPathInside(root, target)) {
165
166
  throw new FsSafeError("outside-workspace", "relative path escapes root");
166
167
  }
@@ -24,4 +24,3 @@ export declare function executePermissionCommand(command: string, args: string[]
24
24
  stdout: string;
25
25
  stderr: string;
26
26
  }>;
27
- //# sourceMappingURL=permission-exec.d.ts.map
@@ -8,7 +8,6 @@ export function formatPermissionErrorDetail(value) {
8
8
  const formatted = formatErrorDetail(value);
9
9
  return formatted.length > 400 ? `${formatted.slice(0, 399)}…` : formatted;
10
10
  }
11
- const MISSING_DATA_PROPERTY = Object.freeze({ found: false });
12
11
  const MAX_CAUGHT_FAILURE_PROTOTYPES = 4;
13
12
  const primitiveString = String;
14
13
  const isUint8Array = utilTypes.isUint8Array;
@@ -36,32 +35,28 @@ function isInspectableCaughtObject(value) {
36
35
  }
37
36
  }
38
37
  function dataProperty(value, name) {
39
- if (!isInspectableCaughtObject(value))
40
- return MISSING_DATA_PROPERTY;
41
38
  let current = value;
42
39
  for (let depth = 0; current !== null && depth < MAX_CAUGHT_FAILURE_PROTOTYPES; depth += 1) {
43
40
  if (!isInspectableCaughtObject(current))
44
- return MISSING_DATA_PROPERTY;
41
+ return undefined;
45
42
  let descriptor;
46
43
  try {
47
44
  descriptor = Object.getOwnPropertyDescriptor(current, name);
48
45
  }
49
46
  catch {
50
- return MISSING_DATA_PROPERTY;
47
+ return undefined;
51
48
  }
52
49
  if (descriptor) {
53
- return Object.hasOwn(descriptor, "value")
54
- ? { found: true, value: descriptor.value }
55
- : MISSING_DATA_PROPERTY;
50
+ return Object.hasOwn(descriptor, "value") ? descriptor : undefined;
56
51
  }
57
52
  try {
58
53
  current = Object.getPrototypeOf(current);
59
54
  }
60
55
  catch {
61
- return MISSING_DATA_PROPERTY;
56
+ return undefined;
62
57
  }
63
58
  }
64
- return MISSING_DATA_PROPERTY;
59
+ return undefined;
65
60
  }
66
61
  function caughtPrimitiveDisplay(value) {
67
62
  if (value !== null && (typeof value === "object" || typeof value === "function"))
@@ -78,9 +73,9 @@ export function formatCaughtPermissionFailure(error) {
78
73
  }
79
74
  const message = dataProperty(error, "message");
80
75
  const name = dataProperty(error, "name");
81
- const rawMessage = message.found && typeof message.value === "string"
76
+ const rawMessage = typeof message?.value === "string"
82
77
  ? message.value : "";
83
- const rawName = name.found && typeof name.value === "string"
78
+ const rawName = typeof name?.value === "string"
84
79
  ? name.value : "";
85
80
  const messageText = rawMessage.slice(0, 400);
86
81
  const nameText = rawName.slice(0, 400);
@@ -123,12 +118,11 @@ function commandFailureFields(error) {
123
118
  const signal = dataProperty(error, "signal");
124
119
  const stderr = dataProperty(error, "stderr");
125
120
  return {
126
- found: killed.found || code.found || signal.found || stderr.found,
127
- timedOut: killed.found && killed.value === true &&
128
- signal.found && signal.value === "SIGKILL",
129
- exitCode: code.found && typeof code.value === "number" ? code.value : null,
130
- signal: signal.found && typeof signal.value === "string" ? signal.value : null,
131
- stderr: stderr.found ? safeStderr(stderr.value) : "",
121
+ found: !!(killed || code || signal || stderr),
122
+ timedOut: killed?.value === true && signal?.value === "SIGKILL",
123
+ exitCode: typeof code?.value === "number" ? code.value : null,
124
+ signal: typeof signal?.value === "string" ? signal.value : null,
125
+ stderr: stderr ? safeStderr(stderr.value) : "",
132
126
  };
133
127
  }
134
128
  export class PermissionCommandError extends Error {
@@ -155,20 +149,20 @@ export class PermissionCommandError extends Error {
155
149
  export function getPermissionCommandFailure(error, command, durationMs) {
156
150
  if (isInspectableCaughtObject(error) && utilTypes.isNativeError(error)) {
157
151
  const name = dataProperty(error, "name");
158
- if (name.found && name.value === "PermissionCommandError") {
152
+ if (name?.value === "PermissionCommandError") {
159
153
  const wrappedCommand = dataProperty(error, "command");
160
154
  const wrappedDuration = dataProperty(error, "durationMs");
161
155
  const wrappedTimedOut = dataProperty(error, "timedOut");
162
156
  const wrappedExitCode = dataProperty(error, "exitCode");
163
157
  const wrappedSignal = dataProperty(error, "signal");
164
158
  const wrappedStderr = dataProperty(error, "stderr");
165
- if (wrappedCommand.found && typeof wrappedCommand.value === "string" &&
166
- wrappedDuration.found && typeof wrappedDuration.value === "number" &&
159
+ if (typeof wrappedCommand?.value === "string" &&
160
+ typeof wrappedDuration?.value === "number" &&
167
161
  Number.isSafeInteger(wrappedDuration.value) && wrappedDuration.value >= 0 &&
168
- wrappedTimedOut.found && typeof wrappedTimedOut.value === "boolean" &&
169
- wrappedExitCode.found && (wrappedExitCode.value === null || typeof wrappedExitCode.value === "number") &&
170
- wrappedSignal.found && (wrappedSignal.value === null || typeof wrappedSignal.value === "string") &&
171
- wrappedStderr.found) {
162
+ typeof wrappedTimedOut?.value === "boolean" &&
163
+ wrappedExitCode && (wrappedExitCode.value === null || typeof wrappedExitCode.value === "number") &&
164
+ wrappedSignal && (wrappedSignal.value === null || typeof wrappedSignal.value === "string") &&
165
+ wrappedStderr) {
172
166
  return {
173
167
  command: wrappedCommand.value,
174
168
  durationMs: wrappedDuration.value,
@@ -1,4 +1,3 @@
1
1
  export { formatOctal, formatPermissionDetail, formatPermissionRemediation, inspectPathPermissions, isGroupReadable, isGroupWritable, isWorldReadable, isWorldWritable, modeBits, safeStat, type PermissionCheck, type PermissionCheckOptions, type PermissionCommandFailure, type SafeStatResult, } from "./permissions.js";
2
2
  export { createPrivateDirectory, type CreatePrivateDirectoryOptions, } from "./private-directory.js";
3
3
  export { readOwnerAndDacl, type OwnerAndDaclResult, type WindowsAccessControlEntry, type WindowsAceFlags, } from "./owner-dacl.js";
4
- //# sourceMappingURL=permissions-public.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { type PermissionCommandFailure } from "./permission-exec.js";
2
- import { type PermissionCheck, type PermissionCheckOptions, type SafeStatResult } from "./permissions.js";
2
+ import { type PermissionCheck, type PermissionCheckOptions } from "./permissions.js";
3
3
  export type PermissionExec = (command: string, args: string[]) => Promise<{
4
4
  stdout: string;
5
5
  stderr: string;
@@ -31,14 +31,7 @@ export type IcaclsResetCommandOptions = {
31
31
  env?: NodeJS.ProcessEnv;
32
32
  userInfo?: WindowsUserInfoProvider;
33
33
  };
34
- export declare function inspectWindowsPermissions(params: {
35
- targetPath: string;
36
- stat: SafeStatResult;
37
- effectiveIsDir: boolean;
38
- effectiveMode: number | null;
39
- bits: number | null;
40
- opts?: PermissionCheckOptions;
41
- }): Promise<PermissionCheck>;
34
+ export declare function inspectWindowsPermissions(targetPath: string, unverified: Readonly<PermissionCheck>, opts?: PermissionCheckOptions): Promise<PermissionCheck>;
42
35
  export declare function resolveWindowsUserPrincipal(env?: NodeJS.ProcessEnv, userInfo?: WindowsUserInfoProvider): string | null;
43
36
  export declare function parseIcaclsOutput(output: string, targetPath: string): WindowsAclEntry[];
44
37
  export declare function summarizeWindowsAcl(entries: WindowsAclEntry[], env?: NodeJS.ProcessEnv): Pick<WindowsAclSummary, "trusted" | "untrustedWorld" | "untrustedGroup">;
@@ -56,4 +49,3 @@ export declare function createIcaclsResetCommand(targetPath: string, opts: Icacl
56
49
  args: string[];
57
50
  display: string;
58
51
  } | null;
59
- //# sourceMappingURL=permissions-windows.d.ts.map
@@ -39,20 +39,16 @@ const TRUSTED_BASE_ASCII = new Set([...TRUSTED_BASE].map(stripDiacritics));
39
39
  const normalize = (value) => normalizeLowercaseStringOrEmpty(value);
40
40
  const defaultWindowsUserInfo = () => os.userInfo();
41
41
  const defaultPermissionExec = executePermissionCommand;
42
- function inspectWindowsPermissionsNative(params) {
42
+ function inspectWindowsPermissionsNative(targetPath, unverified) {
43
43
  const native = getNativeBinding();
44
44
  if (!native)
45
45
  return undefined;
46
46
  try {
47
- const facts = native.readOwnerAndDacl(params.targetPath);
47
+ const facts = native.readOwnerAndDacl(targetPath);
48
48
  if (facts.fallbackRequired)
49
49
  return undefined;
50
50
  return {
51
- ok: true,
52
- isSymlink: params.stat.isSymlink,
53
- isDir: params.effectiveIsDir,
54
- mode: params.effectiveMode,
55
- bits: params.bits,
51
+ ...unverified,
56
52
  source: "windows-acl",
57
53
  worldWritable: facts.worldWritable,
58
54
  groupWritable: facts.groupWritable,
@@ -69,32 +65,20 @@ function inspectWindowsPermissionsNative(params) {
69
65
  return undefined;
70
66
  }
71
67
  }
72
- export async function inspectWindowsPermissions(params) {
73
- const unverified = {
74
- ok: true,
75
- isSymlink: params.stat.isSymlink,
76
- isDir: params.effectiveIsDir,
77
- mode: params.effectiveMode,
78
- bits: params.bits,
79
- source: "unknown",
80
- worldWritable: false,
81
- groupWritable: false,
82
- worldReadable: false,
83
- groupReadable: false,
84
- };
85
- if (hasWindowsPathAlias(params.targetPath, "filesystem", "win32")) {
68
+ export async function inspectWindowsPermissions(targetPath, unverified, opts) {
69
+ if (hasWindowsPathAlias(targetPath, "filesystem", "win32")) {
86
70
  return {
87
71
  ...unverified,
88
72
  error: "Path uses a Windows filesystem namespace alias",
89
73
  };
90
74
  }
91
- const native = inspectWindowsPermissionsNative(params);
75
+ const native = inspectWindowsPermissionsNative(targetPath, unverified);
92
76
  if (native)
93
77
  return native;
94
78
  const owner = await inspectWindowsOwner({
95
- targetPath: params.targetPath,
96
- env: params.opts?.env,
97
- exec: params.opts?.exec ?? defaultPermissionExec,
79
+ targetPath,
80
+ env: opts?.env,
81
+ exec: opts?.exec ?? defaultPermissionExec,
98
82
  });
99
83
  if (owner.error !== undefined) {
100
84
  const error = `Windows owner inspection failed: ${owner.error}`;
@@ -109,11 +93,7 @@ export async function inspectWindowsPermissions(params) {
109
93
  if (!acl.ok)
110
94
  return { ...unverified, ...ownerFields, error: acl.error, errorDetail: acl.errorDetail, errorCause: acl.errorCause };
111
95
  return {
112
- ok: true,
113
- isSymlink: params.stat.isSymlink,
114
- isDir: params.effectiveIsDir,
115
- mode: params.effectiveMode,
116
- bits: params.bits,
96
+ ...unverified,
117
97
  source: "windows-acl",
118
98
  worldWritable: acl.untrustedWorld.some((entry) => entry.canWrite),
119
99
  groupWritable: acl.untrustedGroup.some((entry) => entry.canWrite),