@openclaw/fs-safe 0.17.0 → 0.18.1

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 (690) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/absolute-path.d.ts +0 -1
  3. package/dist/advanced.d.ts +2 -2
  4. package/dist/archive-crc32.d.ts +0 -1
  5. package/dist/archive-deadline.d.ts +0 -1
  6. package/dist/archive-durability.d.ts +1 -2
  7. package/dist/archive-entry.d.ts +0 -1
  8. package/dist/archive-errors.d.ts +0 -1
  9. package/dist/archive-gzip-tail.d.ts +0 -1
  10. package/dist/archive-input.d.ts +0 -1
  11. package/dist/archive-kind.d.ts +0 -1
  12. package/dist/archive-limits.d.ts +0 -1
  13. package/dist/archive-merge.d.ts +2 -4
  14. package/dist/archive-merge.js +14 -4
  15. package/dist/archive-parser-errors.d.ts +0 -1
  16. package/dist/archive-parser.wasm +0 -0
  17. package/dist/archive-plan.d.ts +72 -2
  18. package/dist/archive-plan.js +86 -22
  19. package/dist/archive-read.d.ts +0 -1
  20. package/dist/archive-staging.d.ts +0 -1
  21. package/dist/archive-tar-stream.d.ts +0 -1
  22. package/dist/archive-tar-wasm.d.ts +1 -2
  23. package/dist/archive-zip-admission.d.ts +0 -1
  24. package/dist/archive-zip-count.d.ts +0 -1
  25. package/dist/archive-zip-directory.d.ts +1 -2
  26. package/dist/archive-zip-entry.d.ts +1 -2
  27. package/dist/archive-zip-entry.js +1 -1
  28. package/dist/archive-zip-integrity.d.ts +0 -1
  29. package/dist/archive-zip-loader.d.ts +0 -1
  30. package/dist/archive-zip-manifest.d.ts +0 -1
  31. package/dist/archive-zip-names.d.ts +0 -1
  32. package/dist/archive-zip-preflight.d.ts +0 -1
  33. package/dist/archive.d.ts +8 -6
  34. package/dist/archive.js +204 -168
  35. package/dist/async-lock.d.ts +0 -1
  36. package/dist/atomic.d.ts +3 -2
  37. package/dist/bounded-read-stream.d.ts +0 -1
  38. package/dist/bounded-read.d.ts +0 -1
  39. package/dist/byte-budget.d.ts +0 -1
  40. package/dist/byte-view.d.ts +0 -1
  41. package/dist/clone-metadata.d.ts +0 -1
  42. package/dist/config.d.ts +0 -1
  43. package/dist/containment.d.ts +0 -1
  44. package/dist/copy-file-input.d.ts +0 -1
  45. package/dist/copy-policy.d.ts +0 -1
  46. package/dist/copy-publication.d.ts +1 -2
  47. package/dist/copy-tree-portable.d.ts +0 -1
  48. package/dist/copy-tree-portable.js +9 -6
  49. package/dist/copy.d.ts +0 -1
  50. package/dist/copy.js +5 -5
  51. package/dist/create-owned-file.d.ts +0 -1
  52. package/dist/create.d.ts +16 -3
  53. package/dist/create.js +388 -2
  54. package/dist/creation-boundary.d.ts +60 -0
  55. package/dist/creation-boundary.js +371 -0
  56. package/dist/deny-mutations.d.ts +2 -3
  57. package/dist/deny-mutations.js +55 -35
  58. package/dist/device-path.d.ts +0 -1
  59. package/dist/directory-durability.d.ts +0 -1
  60. package/dist/directory-entry-path.d.ts +0 -1
  61. package/dist/directory-guard.d.ts +2 -7
  62. package/dist/directory-guard.js +25 -56
  63. package/dist/directory-mode-node.d.ts +0 -1
  64. package/dist/directory-mode-node.js +12 -2
  65. package/dist/directory-mode-owner.d.ts +0 -1
  66. package/dist/directory-receipt.d.ts +0 -1
  67. package/dist/durability.d.ts +2 -2
  68. package/dist/effective-uid.d.ts +0 -1
  69. package/dist/error-detail.d.ts +0 -1
  70. package/dist/errors.d.ts +0 -1
  71. package/dist/file-cleanup.d.ts +0 -1
  72. package/dist/file-contents.d.ts +0 -1
  73. package/dist/file-handle-transfer.d.ts +0 -1
  74. package/dist/file-hash.d.ts +0 -1
  75. package/dist/file-hash.js +170 -66
  76. package/dist/file-identity.d.ts +0 -1
  77. package/dist/file-lock-sync-acquisition.d.ts +22 -0
  78. package/dist/file-lock-sync-acquisition.js +98 -0
  79. package/dist/file-lock-sync-admission.d.ts +0 -2
  80. package/dist/file-lock-sync-admission.js +9 -48
  81. package/dist/file-lock-sync-root-acquire.d.ts +0 -1
  82. package/dist/file-lock-sync-root-acquire.js +33 -103
  83. package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
  84. package/dist/file-lock-sync-root-held.d.ts +0 -1
  85. package/dist/file-lock-sync-root-io.d.ts +0 -1
  86. package/dist/file-lock-sync-root-mutation.d.ts +4 -5
  87. package/dist/file-lock-sync-root-mutation.js +7 -9
  88. package/dist/file-lock-sync-root-options.d.ts +0 -1
  89. package/dist/file-lock-sync-root-registration.d.ts +0 -1
  90. package/dist/file-lock-sync-root.d.ts +3 -3
  91. package/dist/file-lock-sync-root.js +14 -87
  92. package/dist/file-lock-sync-stale-admission.d.ts +2 -7
  93. package/dist/file-lock-sync-stale-admission.js +18 -27
  94. package/dist/file-lock-sync.d.ts +4 -22
  95. package/dist/file-lock-sync.js +38 -117
  96. package/dist/file-lock.d.ts +0 -1
  97. package/dist/file-observation.d.ts +0 -1
  98. package/dist/file-store-boundary.d.ts +7 -2
  99. package/dist/file-store-boundary.js +64 -27
  100. package/dist/file-store-prune.d.ts +0 -1
  101. package/dist/file-store-sync-directory.d.ts +0 -1
  102. package/dist/file-store-sync-directory.js +194 -231
  103. package/dist/file-store-sync-write.d.ts +0 -1
  104. package/dist/file-store-sync-write.js +18 -29
  105. package/dist/file-store.d.ts +0 -1
  106. package/dist/file-store.js +4 -10
  107. package/dist/file-sync.d.ts +0 -1
  108. package/dist/filename.d.ts +0 -1
  109. package/dist/filename.js +1 -7
  110. package/dist/fs.d.ts +0 -1
  111. package/dist/guarded-mkdir.d.ts +1 -2
  112. package/dist/guarded-mutation.d.ts +0 -7
  113. package/dist/guarded-mutation.js +6 -11
  114. package/dist/guest-dispatch-python.d.ts +0 -1
  115. package/dist/guest-dispatch-python.js +41 -90
  116. package/dist/guest-native-python.d.ts +0 -1
  117. package/dist/guest.d.ts +0 -1
  118. package/dist/home-dir.d.ts +0 -1
  119. package/dist/index.d.ts +9 -7
  120. package/dist/install-path.d.ts +0 -1
  121. package/dist/json-document-store.d.ts +0 -1
  122. package/dist/json-durable-queue-directory.d.ts +13 -1
  123. package/dist/json-durable-queue-directory.js +134 -0
  124. package/dist/json-durable-queue-ownership.d.ts +0 -1
  125. package/dist/json-durable-queue-ownership.js +42 -61
  126. package/dist/json-durable-queue-read.d.ts +0 -1
  127. package/dist/json-durable-queue-read.js +13 -9
  128. package/dist/json-durable-queue.d.ts +0 -1
  129. package/dist/json-durable-queue.js +8 -132
  130. package/dist/json-store.d.ts +0 -1
  131. package/dist/json-store.js +1 -2
  132. package/dist/json-stringify.d.ts +0 -1
  133. package/dist/json.d.ts +0 -1
  134. package/dist/json.js +7 -17
  135. package/dist/local-file-access.d.ts +0 -1
  136. package/dist/local-file-access.js +3 -10
  137. package/dist/local-file-descriptor.d.ts +0 -1
  138. package/dist/local-roots.d.ts +0 -1
  139. package/dist/lock-config.d.ts +0 -1
  140. package/dist/move-path-cleanup.d.ts +0 -1
  141. package/dist/move-path-stage.d.ts +0 -1
  142. package/dist/move-path.d.ts +0 -1
  143. package/dist/move-path.js +1 -2
  144. package/dist/mutation-authority.d.ts +0 -1
  145. package/dist/native-binding.d.ts +0 -1
  146. package/dist/native-config.d.ts +0 -1
  147. package/dist/native-directory-observation.d.ts +0 -1
  148. package/dist/native-fallback-warning.d.ts +0 -1
  149. package/dist/native-operations.d.ts +1 -5
  150. package/dist/native-operations.js +2 -7
  151. package/dist/native-parent-admission.d.ts +0 -1
  152. package/dist/native-pinned-write-windows.d.ts +1 -2
  153. package/dist/native-pinned-write-windows.js +1 -1
  154. package/dist/native-pinned-write.d.ts +1 -2
  155. package/dist/native-pinned-write.js +7 -16
  156. package/dist/native-policy-directory-observation.d.ts +0 -1
  157. package/dist/native-policy-parent-windows.d.ts +1 -2
  158. package/dist/native-rename-outcome.d.ts +0 -1
  159. package/dist/native-staged-file.d.ts +17 -5
  160. package/dist/native-staged-file.js +56 -65
  161. package/dist/native.d.ts +0 -1
  162. package/dist/opened-file-failure.d.ts +0 -1
  163. package/dist/opened-realpath.d.ts +0 -1
  164. package/dist/output.d.ts +0 -1
  165. package/dist/overwrite-file-handle.d.ts +0 -1
  166. package/dist/owner-dacl.d.ts +0 -1
  167. package/dist/path-case.d.ts +0 -1
  168. package/dist/path-policy.d.ts +0 -1
  169. package/dist/path-prefix.d.ts +0 -1
  170. package/dist/path-scope-lexical.d.ts +0 -1
  171. package/dist/path-segment-route.d.ts +0 -1
  172. package/dist/path-suffix-aliases.d.ts +0 -1
  173. package/dist/path.d.ts +0 -1
  174. package/dist/permission-exec.d.ts +0 -1
  175. package/dist/permission-exec.js +19 -25
  176. package/dist/permissions-public.d.ts +0 -1
  177. package/dist/permissions-windows.d.ts +2 -10
  178. package/dist/permissions-windows.js +10 -30
  179. package/dist/permissions.d.ts +0 -1
  180. package/dist/permissions.js +8 -16
  181. package/dist/pinned-mutation-admission.d.ts +1 -2
  182. package/dist/pinned-mutation-observation.d.ts +0 -1
  183. package/dist/pinned-mutation-shared-route.d.ts +0 -1
  184. package/dist/pinned-open.d.ts +1 -1
  185. package/dist/pinned-open.js +7 -2
  186. package/dist/pinned-operation.d.ts +1 -2
  187. package/dist/pinned-operation.js +3 -16
  188. package/dist/pinned-write-input.d.ts +0 -1
  189. package/dist/pinned-write-mode.d.ts +0 -1
  190. package/dist/pinned-write-mode.js +1 -1
  191. package/dist/pinned-write-staged.d.ts +0 -1
  192. package/dist/pinned-write-staged.js +1 -2
  193. package/dist/pinned-write-types.d.ts +9 -21
  194. package/dist/pinned-write.d.ts +0 -2
  195. package/dist/pinned-write.js +3 -5
  196. package/dist/positional-read.d.ts +0 -1
  197. package/dist/private-directory.d.ts +0 -1
  198. package/dist/private-producer-handoff-sync.d.ts +2 -13
  199. package/dist/private-producer-handoff-sync.js +10 -52
  200. package/dist/private-producer-handoff.d.ts +23 -4
  201. package/dist/private-producer-handoff.js +69 -46
  202. package/dist/private-temp-workspace.d.ts +0 -1
  203. package/dist/private-temp-workspace.js +11 -37
  204. package/dist/publish-copy-stage.d.ts +1 -2
  205. package/dist/publish-file-failure.d.ts +0 -1
  206. package/dist/publish-file.d.ts +0 -2
  207. package/dist/publish-file.js +1 -2
  208. package/dist/read-open-flags.d.ts +0 -1
  209. package/dist/read-opened-file.d.ts +0 -1
  210. package/dist/realpath.d.ts +0 -1
  211. package/dist/recursive-mkdir-path.d.ts +0 -1
  212. package/dist/regular-file.d.ts +0 -1
  213. package/dist/regular-file.js +77 -139
  214. package/dist/replace-directory.d.ts +0 -1
  215. package/dist/replace-directory.js +1 -2
  216. package/dist/replace-file-copy-fallback.d.ts +0 -1
  217. package/dist/replace-file-copy-fallback.js +14 -3
  218. package/dist/replace-file-copy-source.d.ts +0 -1
  219. package/dist/replace-file-copy-source.js +6 -1
  220. package/dist/replace-file-descriptor.d.ts +0 -1
  221. package/dist/replace-file-descriptor.js +6 -1
  222. package/dist/replace-file-mode.d.ts +0 -1
  223. package/dist/replace-file-rename-policy.d.ts +1 -3
  224. package/dist/replace-file-temp-owner.d.ts +12 -13
  225. package/dist/replace-file-temp-owner.js +66 -85
  226. package/dist/replace-file.d.ts +3 -4
  227. package/dist/replace-file.js +1 -1
  228. package/dist/retained-directory-replacement.d.ts +0 -1
  229. package/dist/root-boundary.d.ts +0 -1
  230. package/dist/root-context.d.ts +0 -1
  231. package/dist/root-context.js +3 -7
  232. package/dist/root-create-input.d.ts +1 -2
  233. package/dist/root-directory-creation.d.ts +1 -2
  234. package/dist/root-directory-creation.js +1 -1
  235. package/dist/root-directory-list.d.ts +0 -1
  236. package/dist/root-directory-list.js +3 -7
  237. package/dist/root-directory.d.ts +0 -1
  238. package/dist/root-entries.d.ts +0 -1
  239. package/dist/root-entries.js +2 -2
  240. package/dist/root-errors.d.ts +4 -1
  241. package/dist/root-errors.js +5 -3
  242. package/dist/root-file-final-admission.d.ts +0 -1
  243. package/dist/root-file.d.ts +0 -1
  244. package/dist/root-impl.d.ts +2 -15
  245. package/dist/root-impl.js +136 -112
  246. package/dist/root-move-noreplace.d.ts +0 -1
  247. package/dist/root-move-noreplace.js +4 -10
  248. package/dist/root-move-preflight.d.ts +0 -1
  249. package/dist/root-observed-path.d.ts +0 -1
  250. package/dist/root-observed-path.js +2 -4
  251. package/dist/root-options.d.ts +1 -2
  252. package/dist/root-path-errors.d.ts +0 -1
  253. package/dist/root-path-existing.d.ts +3 -1
  254. package/dist/root-path-existing.js +38 -18
  255. package/dist/root-path-observation.d.ts +0 -1
  256. package/dist/root-path-stat.d.ts +0 -1
  257. package/dist/root-path-stat.js +2 -4
  258. package/dist/root-path.d.ts +0 -1
  259. package/dist/root-path.js +60 -188
  260. package/dist/root-paths-lexical.d.ts +0 -1
  261. package/dist/root-paths.d.ts +0 -1
  262. package/dist/root-public-types.d.ts +11 -0
  263. package/dist/root-read-admission.d.ts +0 -1
  264. package/dist/root-read-admission.js +31 -44
  265. package/dist/root-remove-identity.d.ts +0 -1
  266. package/dist/root-remove-identity.js +2 -4
  267. package/dist/root-remove-receipt.d.ts +0 -1
  268. package/dist/root-remove.d.ts +0 -1
  269. package/dist/root-remove.js +2 -4
  270. package/dist/root-symlink-policy.d.ts +0 -1
  271. package/dist/root-walk.d.ts +0 -1
  272. package/dist/root-write-admission.d.ts +1 -2
  273. package/dist/root-write-admission.js +3 -7
  274. package/dist/root-write-compatibility.d.ts +0 -1
  275. package/dist/root-write-complete-parent.d.ts +0 -1
  276. package/dist/root-write-complete-parent.js +2 -3
  277. package/dist/root-write-lock-binding.d.ts +0 -1
  278. package/dist/root-write-mode.d.ts +0 -1
  279. package/dist/root-write-publication.d.ts +0 -1
  280. package/dist/root-write-verification.d.ts +1 -2
  281. package/dist/root.d.ts +2 -7
  282. package/dist/safe-path-segment.d.ts +1 -2
  283. package/dist/safe-path-segment.js +2 -5
  284. package/dist/secret-file.d.ts +0 -1
  285. package/dist/secret-file.js +7 -18
  286. package/dist/secret-read-async.d.ts +0 -1
  287. package/dist/secret-read-async.js +5 -5
  288. package/dist/secret-read-policy.d.ts +0 -1
  289. package/dist/secret.d.ts +0 -1
  290. package/dist/secure-file-windows.d.ts +0 -6
  291. package/dist/secure-file-windows.js +13 -28
  292. package/dist/secure-file.d.ts +0 -1
  293. package/dist/secure-file.js +9 -9
  294. package/dist/secure-temp-dir.d.ts +0 -1
  295. package/dist/secure-temp-repair.d.ts +0 -1
  296. package/dist/secure-temp-repair.js +5 -1
  297. package/dist/sibling-staged-file.d.ts +0 -1
  298. package/dist/sibling-staged-file.js +32 -39
  299. package/dist/sibling-temp.d.ts +0 -1
  300. package/dist/sidecar-lock-acquire.d.ts +1 -2
  301. package/dist/sidecar-lock-acquire.js +37 -61
  302. package/dist/sidecar-lock-admission-context.d.ts +0 -1
  303. package/dist/sidecar-lock-admission-parser.d.ts +0 -1
  304. package/dist/sidecar-lock-admission.d.ts +1 -5
  305. package/dist/sidecar-lock-admission.js +1 -7
  306. package/dist/sidecar-lock-handle.d.ts +0 -1
  307. package/dist/sidecar-lock-policy.d.ts +4 -1
  308. package/dist/sidecar-lock-policy.js +23 -0
  309. package/dist/sidecar-lock-reclaim.d.ts +0 -1
  310. package/dist/sidecar-lock-registration.d.ts +13 -0
  311. package/dist/sidecar-lock-registration.js +47 -0
  312. package/dist/sidecar-lock-root.d.ts +0 -1
  313. package/dist/sidecar-lock-stale-admission.d.ts +0 -1
  314. package/dist/sidecar-lock-stale-admission.js +2 -6
  315. package/dist/sidecar-lock-target.d.ts +0 -1
  316. package/dist/sidecar-lock-types.d.ts +22 -17
  317. package/dist/sidecar-lock.d.ts +0 -1
  318. package/dist/sidecar-lock.js +16 -83
  319. package/dist/staged-directory.d.ts +0 -1
  320. package/dist/staged-file-settlement.d.ts +0 -1
  321. package/dist/staged-file-types.d.ts +0 -1
  322. package/dist/stat-observation.d.ts +0 -1
  323. package/dist/store.d.ts +0 -1
  324. package/dist/strict-file-identity.d.ts +0 -1
  325. package/dist/string-coerce.d.ts +0 -1
  326. package/dist/suppressed-error.d.ts +0 -1
  327. package/dist/symlink-parents.d.ts +0 -1
  328. package/dist/temp-cleanup.d.ts +0 -1
  329. package/dist/temp-target.d.ts +0 -1
  330. package/dist/temp-target.js +7 -46
  331. package/dist/temp-workspace-admission.d.ts +0 -8
  332. package/dist/temp-workspace-admission.js +1 -7
  333. package/dist/temp-workspace-child-admission.d.ts +16 -6
  334. package/dist/temp-workspace-child-admission.js +71 -15
  335. package/dist/temp-workspace-descriptor.d.ts +1 -7
  336. package/dist/temp-workspace-descriptor.js +1 -4
  337. package/dist/temp-workspace-owner.d.ts +1 -1
  338. package/dist/temp-workspace-owner.js +45 -22
  339. package/dist/temp-workspace-types.d.ts +0 -1
  340. package/dist/temp.d.ts +0 -1
  341. package/dist/test-hooks.d.ts +0 -1
  342. package/dist/text-atomic.d.ts +0 -1
  343. package/dist/text-atomic.js +1 -1
  344. package/dist/timing.d.ts +0 -1
  345. package/dist/trash.d.ts +0 -1
  346. package/dist/types.d.ts +0 -1
  347. package/dist/unicode-path.d.ts +0 -1
  348. package/dist/walk.d.ts +0 -1
  349. package/dist/windows-command.d.ts +0 -1
  350. package/dist/windows-owner.d.ts +0 -1
  351. package/dist/windows-owner.js +5 -2
  352. package/dist/windows-path-alias.d.ts +1 -1
  353. package/dist/windows-path-alias.js +12 -43
  354. package/dist/windows-path-syntax.d.ts +5 -0
  355. package/dist/windows-path-syntax.js +21 -0
  356. package/dist/windows-security-command.d.ts +0 -1
  357. package/dist/windows-security-facts.d.ts +0 -1
  358. package/dist/write-file-handle.d.ts +0 -1
  359. package/dist/write-open-flags.d.ts +0 -1
  360. package/dist/write-queue.d.ts +0 -1
  361. package/docs/advanced.md +3 -1
  362. package/docs/atomic.md +14 -0
  363. package/docs/copy.md +2 -0
  364. package/docs/mutation-policy-proof.md +6 -4
  365. package/docs/permissions.md +6 -0
  366. package/docs/root.md +10 -0
  367. package/docs/secret-file.md +8 -0
  368. package/docs/sidecar-lock.md +4 -0
  369. package/docs/store.md +6 -0
  370. package/docs/temp.md +8 -1
  371. package/docs/writing.md +14 -3
  372. package/package.json +8 -9
  373. package/dist/absolute-path.d.ts.map +0 -1
  374. package/dist/advanced.d.ts.map +0 -1
  375. package/dist/archive-crc32.d.ts.map +0 -1
  376. package/dist/archive-deadline.d.ts.map +0 -1
  377. package/dist/archive-durability.d.ts.map +0 -1
  378. package/dist/archive-entry.d.ts.map +0 -1
  379. package/dist/archive-errors.d.ts.map +0 -1
  380. package/dist/archive-gzip-tail.d.ts.map +0 -1
  381. package/dist/archive-input.d.ts.map +0 -1
  382. package/dist/archive-kind.d.ts.map +0 -1
  383. package/dist/archive-limits.d.ts.map +0 -1
  384. package/dist/archive-merge.d.ts.map +0 -1
  385. package/dist/archive-native.d.ts +0 -22
  386. package/dist/archive-native.d.ts.map +0 -1
  387. package/dist/archive-native.js +0 -98
  388. package/dist/archive-options.d.ts +0 -25
  389. package/dist/archive-options.d.ts.map +0 -1
  390. package/dist/archive-parser-errors.d.ts.map +0 -1
  391. package/dist/archive-plan.d.ts.map +0 -1
  392. package/dist/archive-policy.d.ts +0 -22
  393. package/dist/archive-policy.d.ts.map +0 -1
  394. package/dist/archive-policy.js +0 -38
  395. package/dist/archive-read.d.ts.map +0 -1
  396. package/dist/archive-staging.d.ts.map +0 -1
  397. package/dist/archive-tar-inspect.d.ts +0 -7
  398. package/dist/archive-tar-inspect.d.ts.map +0 -1
  399. package/dist/archive-tar-inspect.js +0 -62
  400. package/dist/archive-tar-stream.d.ts.map +0 -1
  401. package/dist/archive-tar-wasm.d.ts.map +0 -1
  402. package/dist/archive-tar.d.ts +0 -19
  403. package/dist/archive-tar.d.ts.map +0 -1
  404. package/dist/archive-tar.js +0 -21
  405. package/dist/archive-zip-admission.d.ts.map +0 -1
  406. package/dist/archive-zip-count.d.ts.map +0 -1
  407. package/dist/archive-zip-directory.d.ts.map +0 -1
  408. package/dist/archive-zip-entry.d.ts.map +0 -1
  409. package/dist/archive-zip-integrity.d.ts.map +0 -1
  410. package/dist/archive-zip-loader.d.ts.map +0 -1
  411. package/dist/archive-zip-manifest.d.ts.map +0 -1
  412. package/dist/archive-zip-names.d.ts.map +0 -1
  413. package/dist/archive-zip-preflight.d.ts.map +0 -1
  414. package/dist/archive.d.ts.map +0 -1
  415. package/dist/async-lock.d.ts.map +0 -1
  416. package/dist/atomic.d.ts.map +0 -1
  417. package/dist/bounded-read-stream.d.ts.map +0 -1
  418. package/dist/bounded-read.d.ts.map +0 -1
  419. package/dist/byte-budget.d.ts.map +0 -1
  420. package/dist/byte-view.d.ts.map +0 -1
  421. package/dist/clone-metadata.d.ts.map +0 -1
  422. package/dist/config.d.ts.map +0 -1
  423. package/dist/containment.d.ts.map +0 -1
  424. package/dist/copy-file-input.d.ts.map +0 -1
  425. package/dist/copy-policy.d.ts.map +0 -1
  426. package/dist/copy-publication.d.ts.map +0 -1
  427. package/dist/copy-tree-portable.d.ts.map +0 -1
  428. package/dist/copy.d.ts.map +0 -1
  429. package/dist/create-directory.d.ts +0 -20
  430. package/dist/create-directory.d.ts.map +0 -1
  431. package/dist/create-directory.js +0 -130
  432. package/dist/create-file-async.d.ts +0 -7
  433. package/dist/create-file-async.d.ts.map +0 -1
  434. package/dist/create-file-async.js +0 -121
  435. package/dist/create-file.d.ts +0 -8
  436. package/dist/create-file.d.ts.map +0 -1
  437. package/dist/create-file.js +0 -190
  438. package/dist/create-owned-file.d.ts.map +0 -1
  439. package/dist/create.d.ts.map +0 -1
  440. package/dist/creation-darwin.d.ts +0 -6
  441. package/dist/creation-darwin.d.ts.map +0 -1
  442. package/dist/creation-darwin.js +0 -70
  443. package/dist/creation-file-state.d.ts +0 -19
  444. package/dist/creation-file-state.d.ts.map +0 -1
  445. package/dist/creation-file-state.js +0 -118
  446. package/dist/creation-path.d.ts +0 -21
  447. package/dist/creation-path.d.ts.map +0 -1
  448. package/dist/creation-path.js +0 -71
  449. package/dist/creation-permissions.d.ts +0 -19
  450. package/dist/creation-permissions.d.ts.map +0 -1
  451. package/dist/creation-permissions.js +0 -125
  452. package/dist/deny-mutations.d.ts.map +0 -1
  453. package/dist/device-path.d.ts.map +0 -1
  454. package/dist/directory-durability.d.ts.map +0 -1
  455. package/dist/directory-entry-path.d.ts.map +0 -1
  456. package/dist/directory-guard.d.ts.map +0 -1
  457. package/dist/directory-mode-node.d.ts.map +0 -1
  458. package/dist/directory-mode-owner.d.ts.map +0 -1
  459. package/dist/directory-receipt.d.ts.map +0 -1
  460. package/dist/durability.d.ts.map +0 -1
  461. package/dist/effective-uid.d.ts.map +0 -1
  462. package/dist/error-detail.d.ts.map +0 -1
  463. package/dist/errors.d.ts.map +0 -1
  464. package/dist/file-cleanup.d.ts.map +0 -1
  465. package/dist/file-contents.d.ts.map +0 -1
  466. package/dist/file-handle-transfer.d.ts.map +0 -1
  467. package/dist/file-hash.d.ts.map +0 -1
  468. package/dist/file-identity.d.ts.map +0 -1
  469. package/dist/file-lock-sync-admission.d.ts.map +0 -1
  470. package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
  471. package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
  472. package/dist/file-lock-sync-root-held.d.ts.map +0 -1
  473. package/dist/file-lock-sync-root-io.d.ts.map +0 -1
  474. package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
  475. package/dist/file-lock-sync-root-options.d.ts.map +0 -1
  476. package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
  477. package/dist/file-lock-sync-root.d.ts.map +0 -1
  478. package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
  479. package/dist/file-lock-sync.d.ts.map +0 -1
  480. package/dist/file-lock.d.ts.map +0 -1
  481. package/dist/file-observation.d.ts.map +0 -1
  482. package/dist/file-store-boundary.d.ts.map +0 -1
  483. package/dist/file-store-copy-source.d.ts +0 -5
  484. package/dist/file-store-copy-source.d.ts.map +0 -1
  485. package/dist/file-store-copy-source.js +0 -31
  486. package/dist/file-store-limit.d.ts +0 -2
  487. package/dist/file-store-limit.d.ts.map +0 -1
  488. package/dist/file-store-limit.js +0 -8
  489. package/dist/file-store-path.d.ts +0 -3
  490. package/dist/file-store-path.d.ts.map +0 -1
  491. package/dist/file-store-path.js +0 -30
  492. package/dist/file-store-prune.d.ts.map +0 -1
  493. package/dist/file-store-sync-directory.d.ts.map +0 -1
  494. package/dist/file-store-sync-write.d.ts.map +0 -1
  495. package/dist/file-store.d.ts.map +0 -1
  496. package/dist/file-sync.d.ts.map +0 -1
  497. package/dist/filename.d.ts.map +0 -1
  498. package/dist/fs.d.ts.map +0 -1
  499. package/dist/guarded-mkdir.d.ts.map +0 -1
  500. package/dist/guarded-mutation.d.ts.map +0 -1
  501. package/dist/guest-dispatch-python.d.ts.map +0 -1
  502. package/dist/guest-native-python.d.ts.map +0 -1
  503. package/dist/guest.d.ts.map +0 -1
  504. package/dist/home-dir.d.ts.map +0 -1
  505. package/dist/index.d.ts.map +0 -1
  506. package/dist/install-path.d.ts.map +0 -1
  507. package/dist/json-document-store.d.ts.map +0 -1
  508. package/dist/json-durable-queue-directory.d.ts.map +0 -1
  509. package/dist/json-durable-queue-ownership.d.ts.map +0 -1
  510. package/dist/json-durable-queue-paths.d.ts +0 -11
  511. package/dist/json-durable-queue-paths.d.ts.map +0 -1
  512. package/dist/json-durable-queue-paths.js +0 -20
  513. package/dist/json-durable-queue-read.d.ts.map +0 -1
  514. package/dist/json-durable-queue.d.ts.map +0 -1
  515. package/dist/json-store.d.ts.map +0 -1
  516. package/dist/json-stringify.d.ts.map +0 -1
  517. package/dist/json.d.ts.map +0 -1
  518. package/dist/local-file-access.d.ts.map +0 -1
  519. package/dist/local-file-descriptor.d.ts.map +0 -1
  520. package/dist/local-roots.d.ts.map +0 -1
  521. package/dist/lock-config.d.ts.map +0 -1
  522. package/dist/move-path-cleanup.d.ts.map +0 -1
  523. package/dist/move-path-stage.d.ts.map +0 -1
  524. package/dist/move-path.d.ts.map +0 -1
  525. package/dist/mutation-authority.d.ts.map +0 -1
  526. package/dist/native-binding.d.ts.map +0 -1
  527. package/dist/native-config.d.ts.map +0 -1
  528. package/dist/native-directory-observation.d.ts.map +0 -1
  529. package/dist/native-fallback-warning.d.ts.map +0 -1
  530. package/dist/native-operations.d.ts.map +0 -1
  531. package/dist/native-parent-admission.d.ts.map +0 -1
  532. package/dist/native-pinned-write-windows.d.ts.map +0 -1
  533. package/dist/native-pinned-write.d.ts.map +0 -1
  534. package/dist/native-policy-directory-observation.d.ts.map +0 -1
  535. package/dist/native-policy-parent-windows.d.ts.map +0 -1
  536. package/dist/native-rename-outcome.d.ts.map +0 -1
  537. package/dist/native-staged-file.d.ts.map +0 -1
  538. package/dist/native.d.ts.map +0 -1
  539. package/dist/opened-file-failure.d.ts.map +0 -1
  540. package/dist/opened-realpath.d.ts.map +0 -1
  541. package/dist/output.d.ts.map +0 -1
  542. package/dist/overwrite-file-handle.d.ts.map +0 -1
  543. package/dist/owner-dacl.d.ts.map +0 -1
  544. package/dist/path-case.d.ts.map +0 -1
  545. package/dist/path-policy.d.ts.map +0 -1
  546. package/dist/path-prefix.d.ts.map +0 -1
  547. package/dist/path-scope-lexical.d.ts.map +0 -1
  548. package/dist/path-segment-route.d.ts.map +0 -1
  549. package/dist/path-suffix-aliases.d.ts.map +0 -1
  550. package/dist/path.d.ts.map +0 -1
  551. package/dist/permission-exec.d.ts.map +0 -1
  552. package/dist/permissions-public.d.ts.map +0 -1
  553. package/dist/permissions-windows.d.ts.map +0 -1
  554. package/dist/permissions.d.ts.map +0 -1
  555. package/dist/pinned-mutation-admission.d.ts.map +0 -1
  556. package/dist/pinned-mutation-observation.d.ts.map +0 -1
  557. package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
  558. package/dist/pinned-open.d.ts.map +0 -1
  559. package/dist/pinned-operation.d.ts.map +0 -1
  560. package/dist/pinned-write-input.d.ts.map +0 -1
  561. package/dist/pinned-write-mode.d.ts.map +0 -1
  562. package/dist/pinned-write-staged.d.ts.map +0 -1
  563. package/dist/pinned-write-types.d.ts.map +0 -1
  564. package/dist/pinned-write.d.ts.map +0 -1
  565. package/dist/positional-read.d.ts.map +0 -1
  566. package/dist/private-directory.d.ts.map +0 -1
  567. package/dist/private-producer-handoff-sync.d.ts.map +0 -1
  568. package/dist/private-producer-handoff.d.ts.map +0 -1
  569. package/dist/private-temp-workspace.d.ts.map +0 -1
  570. package/dist/publish-copy-stage.d.ts.map +0 -1
  571. package/dist/publish-file-failure.d.ts.map +0 -1
  572. package/dist/publish-file.d.ts.map +0 -1
  573. package/dist/read-open-flags.d.ts.map +0 -1
  574. package/dist/read-opened-file.d.ts.map +0 -1
  575. package/dist/realpath.d.ts.map +0 -1
  576. package/dist/recursive-mkdir-path.d.ts.map +0 -1
  577. package/dist/regular-file.d.ts.map +0 -1
  578. package/dist/replace-directory.d.ts.map +0 -1
  579. package/dist/replace-file-copy-fallback.d.ts.map +0 -1
  580. package/dist/replace-file-copy-source.d.ts.map +0 -1
  581. package/dist/replace-file-descriptor.d.ts.map +0 -1
  582. package/dist/replace-file-mode.d.ts.map +0 -1
  583. package/dist/replace-file-rename-policy.d.ts.map +0 -1
  584. package/dist/replace-file-temp-owner.d.ts.map +0 -1
  585. package/dist/replace-file.d.ts.map +0 -1
  586. package/dist/retained-directory-replacement.d.ts.map +0 -1
  587. package/dist/root-boundary.d.ts.map +0 -1
  588. package/dist/root-context.d.ts.map +0 -1
  589. package/dist/root-create-input.d.ts.map +0 -1
  590. package/dist/root-directory-creation.d.ts.map +0 -1
  591. package/dist/root-directory-list.d.ts.map +0 -1
  592. package/dist/root-directory.d.ts.map +0 -1
  593. package/dist/root-entries.d.ts.map +0 -1
  594. package/dist/root-errors.d.ts.map +0 -1
  595. package/dist/root-file-final-admission.d.ts.map +0 -1
  596. package/dist/root-file.d.ts.map +0 -1
  597. package/dist/root-impl.d.ts.map +0 -1
  598. package/dist/root-move-noreplace.d.ts.map +0 -1
  599. package/dist/root-move-preflight.d.ts.map +0 -1
  600. package/dist/root-observed-path.d.ts.map +0 -1
  601. package/dist/root-options.d.ts.map +0 -1
  602. package/dist/root-path-errors.d.ts.map +0 -1
  603. package/dist/root-path-existing.d.ts.map +0 -1
  604. package/dist/root-path-observation.d.ts.map +0 -1
  605. package/dist/root-path-stat.d.ts.map +0 -1
  606. package/dist/root-path-symlink.d.ts +0 -7
  607. package/dist/root-path-symlink.d.ts.map +0 -1
  608. package/dist/root-path-symlink.js +0 -55
  609. package/dist/root-path.d.ts.map +0 -1
  610. package/dist/root-paths-lexical.d.ts.map +0 -1
  611. package/dist/root-paths.d.ts.map +0 -1
  612. package/dist/root-read-admission.d.ts.map +0 -1
  613. package/dist/root-remove-identity.d.ts.map +0 -1
  614. package/dist/root-remove-receipt.d.ts.map +0 -1
  615. package/dist/root-remove.d.ts.map +0 -1
  616. package/dist/root-symlink-policy.d.ts.map +0 -1
  617. package/dist/root-walk.d.ts.map +0 -1
  618. package/dist/root-write-admission.d.ts.map +0 -1
  619. package/dist/root-write-compatibility.d.ts.map +0 -1
  620. package/dist/root-write-complete-parent.d.ts.map +0 -1
  621. package/dist/root-write-lock-binding.d.ts.map +0 -1
  622. package/dist/root-write-mode.d.ts.map +0 -1
  623. package/dist/root-write-publication.d.ts.map +0 -1
  624. package/dist/root-write-verification.d.ts.map +0 -1
  625. package/dist/root.d.ts.map +0 -1
  626. package/dist/safe-path-segment.d.ts.map +0 -1
  627. package/dist/secret-file.d.ts.map +0 -1
  628. package/dist/secret-read-async.d.ts.map +0 -1
  629. package/dist/secret-read-policy.d.ts.map +0 -1
  630. package/dist/secret.d.ts.map +0 -1
  631. package/dist/secure-file-windows.d.ts.map +0 -1
  632. package/dist/secure-file.d.ts.map +0 -1
  633. package/dist/secure-temp-dir.d.ts.map +0 -1
  634. package/dist/secure-temp-repair.d.ts.map +0 -1
  635. package/dist/sibling-staged-file.d.ts.map +0 -1
  636. package/dist/sibling-temp.d.ts.map +0 -1
  637. package/dist/sidecar-lock-acquire.d.ts.map +0 -1
  638. package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
  639. package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
  640. package/dist/sidecar-lock-admission.d.ts.map +0 -1
  641. package/dist/sidecar-lock-handle.d.ts.map +0 -1
  642. package/dist/sidecar-lock-policy.d.ts.map +0 -1
  643. package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
  644. package/dist/sidecar-lock-root.d.ts.map +0 -1
  645. package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
  646. package/dist/sidecar-lock-target.d.ts.map +0 -1
  647. package/dist/sidecar-lock-types.d.ts.map +0 -1
  648. package/dist/sidecar-lock.d.ts.map +0 -1
  649. package/dist/staged-directory.d.ts.map +0 -1
  650. package/dist/staged-file-settlement.d.ts.map +0 -1
  651. package/dist/staged-file-types.d.ts.map +0 -1
  652. package/dist/standalone-publication-path.d.ts +0 -2
  653. package/dist/standalone-publication-path.d.ts.map +0 -1
  654. package/dist/standalone-publication-path.js +0 -6
  655. package/dist/stat-observation.d.ts.map +0 -1
  656. package/dist/store.d.ts.map +0 -1
  657. package/dist/strict-file-identity.d.ts.map +0 -1
  658. package/dist/string-coerce.d.ts.map +0 -1
  659. package/dist/suppressed-error.d.ts.map +0 -1
  660. package/dist/symlink-parents.d.ts.map +0 -1
  661. package/dist/temp-cleanup.d.ts.map +0 -1
  662. package/dist/temp-target.d.ts.map +0 -1
  663. package/dist/temp-workspace-admission.d.ts.map +0 -1
  664. package/dist/temp-workspace-child-admission.d.ts.map +0 -1
  665. package/dist/temp-workspace-descriptor.d.ts.map +0 -1
  666. package/dist/temp-workspace-identity.d.ts +0 -15
  667. package/dist/temp-workspace-identity.d.ts.map +0 -1
  668. package/dist/temp-workspace-identity.js +0 -41
  669. package/dist/temp-workspace-owner.d.ts.map +0 -1
  670. package/dist/temp-workspace-permissions.d.ts +0 -4
  671. package/dist/temp-workspace-permissions.d.ts.map +0 -1
  672. package/dist/temp-workspace-permissions.js +0 -32
  673. package/dist/temp-workspace-types.d.ts.map +0 -1
  674. package/dist/temp.d.ts.map +0 -1
  675. package/dist/test-hooks.d.ts.map +0 -1
  676. package/dist/text-atomic.d.ts.map +0 -1
  677. package/dist/timing.d.ts.map +0 -1
  678. package/dist/trash.d.ts.map +0 -1
  679. package/dist/types.d.ts.map +0 -1
  680. package/dist/unicode-path.d.ts.map +0 -1
  681. package/dist/walk.d.ts.map +0 -1
  682. package/dist/windows-command.d.ts.map +0 -1
  683. package/dist/windows-owner.d.ts.map +0 -1
  684. package/dist/windows-path-alias.d.ts.map +0 -1
  685. package/dist/windows-security-command.d.ts.map +0 -1
  686. package/dist/windows-security-facts.d.ts.map +0 -1
  687. package/dist/write-file-handle.d.ts.map +0 -1
  688. package/dist/write-open-flags.d.ts.map +0 -1
  689. package/dist/write-queue.d.ts.map +0 -1
  690. /package/dist/{archive-options.js → root-public-types.js} +0 -0
@@ -0,0 +1,371 @@
1
+ import fs, {} from "node:fs";
2
+ import fsAsync from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { assertDirectoryIdentitySync, inspectDirectoryIdentitySync, } from "./directory-guard.js";
5
+ import { nodeDarwinDirectoryMetadataFlags, nodeDirectorySearchOnlyFlags } from "./directory-mode-node.js";
6
+ import { FsSafeError } from "./errors.js";
7
+ import { sameFileIdentityForCleanup } from "./file-identity.js";
8
+ import { assertSynchronousCallbackResult } from "./mutation-authority.js";
9
+ import { getNativeBinding } from "./native.js";
10
+ import { getFsSafeNativeConfig } from "./native-config.js";
11
+ import { warnNativeFallback } from "./native-fallback-warning.js";
12
+ import { assertNoNulPathInput } from "./path.js";
13
+ import { realpathSync } from "./realpath.js";
14
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
15
+ import { assertNoWindowsPathAlias, resolvePathPreservingWindowsRoot } from "./windows-path-alias.js";
16
+ import { inspectWindowsDirectoryCommand, inspectWindowsDirectoryCommandSync, protectPrivateWindowsFileCommand, protectPrivateWindowsFileCommandSync, verifyPrivateWindowsFileCommand, verifyPrivateWindowsFileCommandSync, hasUnsettledWindowsSecurityCommand, } from "./windows-security-command.js";
17
+ export function resolveCreationPermissions(options, directory) {
18
+ const privatePath = options.private;
19
+ const mode = options.mode;
20
+ if (privatePath !== undefined && typeof privatePath !== "boolean") {
21
+ throw new TypeError("private must be a boolean");
22
+ }
23
+ if (mode !== undefined && (!Number.isInteger(mode) || mode < 0 || mode > 0o7777)) {
24
+ throw new RangeError("mode must contain only permission bits");
25
+ }
26
+ if (privatePath && mode !== undefined && (mode & 0o7077) !== 0) {
27
+ throw new FsSafeError("insecure-permissions", "private creation requires owner-only permission bits");
28
+ }
29
+ if (privatePath)
30
+ assertDarwinPrivateCreationAvailable();
31
+ if (privatePath && directory)
32
+ assertDarwinPrivateDirectoryMode(mode ?? 0o700);
33
+ return { private: privatePath === true, mode: mode ?? (privatePath ? directory ? 0o700 : 0o600 : undefined) };
34
+ }
35
+ function assertPrivatePosixDirectory(stat) {
36
+ if (typeof process.getuid !== "function" || stat.uid !== BigInt(process.getuid())) {
37
+ throw new FsSafeError("not-owned", "private directory must belong to the current user");
38
+ }
39
+ if ((stat.mode & 3647n) !== 0n) {
40
+ throw new FsSafeError("insecure-permissions", "existing directory is not private");
41
+ }
42
+ }
43
+ function unavailable() {
44
+ throw new FsSafeError("helper-unavailable", "private Windows creation requires an up-to-date native helper");
45
+ }
46
+ export function assertPrivateFileCreationAvailable() {
47
+ const native = getNativeBinding();
48
+ if (process.platform !== "win32" || getFsSafeNativeConfig().mode !== "require")
49
+ return;
50
+ if (typeof native?.createPrivateDirectoryWithParentIdentity !== "function" ||
51
+ typeof native.inspectWindowsDirectory !== "function" ||
52
+ typeof native.protectPrivateWindowsFile !== "function" ||
53
+ typeof native.verifyPrivateWindowsFile !== "function")
54
+ unavailable();
55
+ }
56
+ function commandFallback() {
57
+ if (getFsSafeNativeConfig().mode === "require")
58
+ unavailable();
59
+ warnNativeFallback("windows-private-creation", "Private Windows creation uses a slower built-in system command.");
60
+ }
61
+ function creationOperation(name) {
62
+ const native = getNativeBinding();
63
+ const operation = native?.[name];
64
+ if (typeof operation === "function")
65
+ return operation.bind(native);
66
+ commandFallback();
67
+ return undefined;
68
+ }
69
+ /** Full Windows identity, with security validation when requested; no repairs. */
70
+ export function inspectCreationDirectorySync(targetPath, privatePath) {
71
+ assertNoWindowsPathAlias(targetPath, "filesystem");
72
+ const inspect = creationOperation("inspectWindowsDirectory");
73
+ return (inspect ? inspect(targetPath, privatePath) : inspectWindowsDirectoryCommandSync(targetPath, privatePath)).identity;
74
+ }
75
+ export async function inspectCreationDirectory(targetPath, privatePath) {
76
+ assertNoWindowsPathAlias(targetPath, "filesystem");
77
+ const inspect = creationOperation("inspectWindowsDirectory");
78
+ return (inspect ? inspect(targetPath, privatePath) : await inspectWindowsDirectoryCommand(targetPath, privatePath)).identity;
79
+ }
80
+ export function assertPrivateDirectorySync(targetPath) {
81
+ const stat = inspectDirectoryIdentitySync(targetPath);
82
+ if (process.platform === "win32")
83
+ inspectCreationDirectorySync(targetPath, true);
84
+ else {
85
+ assertPrivatePosixDirectory(stat);
86
+ assertDarwinCreationDirectoryAcl(targetPath, stat);
87
+ }
88
+ inspectDirectoryIdentitySync(targetPath, stat);
89
+ }
90
+ export async function assertPrivateDirectory(targetPath) {
91
+ const stat = inspectDirectoryIdentitySync(targetPath);
92
+ if (process.platform === "win32")
93
+ await inspectCreationDirectory(targetPath, true);
94
+ else {
95
+ assertPrivatePosixDirectory(stat);
96
+ assertDarwinCreationDirectoryAcl(targetPath, stat);
97
+ }
98
+ inspectDirectoryIdentitySync(targetPath, stat);
99
+ }
100
+ export function protectCreatedFileSync(fd, targetPath, parentIdentity) {
101
+ const protect = creationOperation("protectPrivateWindowsFile");
102
+ return (protect ? protect(fd, targetPath, parentIdentity)
103
+ : protectPrivateWindowsFileCommandSync(fd, targetPath, parentIdentity)).identity;
104
+ }
105
+ export async function protectCreatedFile(fd, targetPath, parentIdentity) {
106
+ const protect = creationOperation("protectPrivateWindowsFile");
107
+ return (protect ? protect(fd, targetPath, parentIdentity)
108
+ : await protectPrivateWindowsFileCommand(fd, targetPath, parentIdentity)).identity;
109
+ }
110
+ export function verifyCreatedFileSync(fd, targetPath, identity, parentIdentity, links = 1) {
111
+ const verify = creationOperation("verifyPrivateWindowsFile");
112
+ if (verify)
113
+ verify(fd, targetPath, identity, parentIdentity, links);
114
+ else
115
+ verifyPrivateWindowsFileCommandSync(fd, targetPath, identity, parentIdentity, links);
116
+ }
117
+ export async function verifyCreatedFile(fd, targetPath, identity, parentIdentity, links = 1) {
118
+ const verify = creationOperation("verifyPrivateWindowsFile");
119
+ if (verify)
120
+ verify(fd, targetPath, identity, parentIdentity, links);
121
+ else
122
+ await verifyPrivateWindowsFileCommand(fd, targetPath, identity, parentIdentity, links);
123
+ }
124
+ function inspector() {
125
+ const native = getNativeBinding();
126
+ if (typeof native?.inspectDarwinAcl !== "function") {
127
+ throw new FsSafeError("helper-unavailable", "private Darwin creation requires native descriptor ACL inspection");
128
+ }
129
+ return native.inspectDarwinAcl.bind(native);
130
+ }
131
+ export function assertDarwinPrivateCreationAvailable() {
132
+ if (process.platform === "darwin")
133
+ inspector();
134
+ }
135
+ export function assertDarwinPrivateDirectoryMode(mode) {
136
+ if (process.platform === "darwin" && ((mode & ~process.umask()) & 0o500) === 0) {
137
+ throw new FsSafeError("helper-unavailable", "private Darwin directory ACL inspection requires owner read or search permission");
138
+ }
139
+ }
140
+ export function assertDarwinCreationAcl(fd, inheritanceTarget) {
141
+ if (process.platform !== "darwin")
142
+ return;
143
+ const inspect = inspector();
144
+ const state = inspect(fd, inheritanceTarget)?.state;
145
+ if (state === "present") {
146
+ throw new FsSafeError("insecure-permissions", inheritanceTarget
147
+ ? "private creation parent has inheritable Darwin ACL entries"
148
+ : "private creation object has Darwin ACL entries");
149
+ }
150
+ if (state !== "absent" && state !== "empty") {
151
+ throw new FsSafeError("helper-unavailable", "native Darwin ACL inspection returned incomplete facts");
152
+ }
153
+ }
154
+ export function assertDarwinCreationDirectoryAcl(pathname, expected, inheritanceTarget) {
155
+ if (process.platform !== "darwin")
156
+ return;
157
+ assertDarwinPrivateCreationAvailable();
158
+ let fd;
159
+ try {
160
+ fd = fs.openSync(pathname, nodeDarwinDirectoryMetadataFlags());
161
+ }
162
+ catch (error) {
163
+ if (error.code !== "EACCES")
164
+ throw error;
165
+ const search = nodeDirectorySearchOnlyFlags();
166
+ if (!search)
167
+ throw error;
168
+ try {
169
+ fd = fs.openSync(pathname, search.flags | fs.constants.O_DIRECTORY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
170
+ }
171
+ catch (cause) {
172
+ if (cause.code !== "EACCES")
173
+ throw cause;
174
+ throw new FsSafeError("helper-unavailable", "private Darwin directory ACL inspection requires owner read or search permission", { cause });
175
+ }
176
+ }
177
+ try {
178
+ const opened = inspectFileIdentitySync(() => fs.fstatSync(fd, { bigint: true }), expected);
179
+ if (!opened.isDirectory())
180
+ throw new FsSafeError("path-mismatch", "ACL target is not the admitted directory");
181
+ assertDarwinCreationAcl(fd, inheritanceTarget);
182
+ inspectDirectoryIdentitySync(pathname, expected);
183
+ }
184
+ finally {
185
+ fs.closeSync(fd);
186
+ }
187
+ }
188
+ export function assertCreationFile(fd, pathname, expected) {
189
+ const opened = inspectFileIdentitySync(() => fs.fstatSync(fd, { bigint: true }), expected);
190
+ const named = inspectFileIdentitySync(() => fs.lstatSync(pathname, { bigint: true }), opened);
191
+ if (!opened.isFile() || !named.isFile() || named.isSymbolicLink() || opened.nlink !== 1n || named.nlink !== 1n) {
192
+ throw new FsSafeError("path-mismatch", "created file is not the expected single-linked regular file");
193
+ }
194
+ return opened;
195
+ }
196
+ export function assertPrivateCreationFile(stat, fd) {
197
+ if (process.platform === "win32")
198
+ return;
199
+ if (typeof process.getuid !== "function" || stat.uid !== BigInt(process.getuid())) {
200
+ throw new FsSafeError("not-owned", "created private file must belong to the current user");
201
+ }
202
+ if ((stat.mode & 3647n) !== 0n) {
203
+ throw new FsSafeError("insecure-permissions", "created private file is not owner-only");
204
+ }
205
+ assertDarwinCreationAcl(fd);
206
+ }
207
+ function assertRecordedFile(current, identity) {
208
+ if (!current.isFile() || current.isSymbolicLink() || !sameFileIdentityForCleanup(current, identity)) {
209
+ throw new FsSafeError("path-mismatch", "created file cleanup preserved a replacement");
210
+ }
211
+ }
212
+ export function removeRecordedCreationFileSync(pathname, identity, assertParent) {
213
+ assertParent();
214
+ let current;
215
+ try {
216
+ current = fs.lstatSync(pathname, { bigint: true });
217
+ }
218
+ catch (error) {
219
+ if (error?.code === "ENOENT")
220
+ return;
221
+ throw error;
222
+ }
223
+ assertRecordedFile(current, identity);
224
+ fs.unlinkSync(pathname);
225
+ }
226
+ export async function removeRecordedCreationFile(pathname, identity, assertParent) {
227
+ assertParent();
228
+ let current;
229
+ try {
230
+ current = await fsAsync.lstat(pathname, { bigint: true });
231
+ }
232
+ catch (error) {
233
+ if (error?.code === "ENOENT")
234
+ return;
235
+ throw error;
236
+ }
237
+ assertParent();
238
+ assertRecordedFile(current, identity);
239
+ // Recheck after the awaited observation before dispatching the unlink.
240
+ assertRecordedFile(fs.lstatSync(pathname, { bigint: true }), identity);
241
+ await fsAsync.unlink(pathname);
242
+ }
243
+ export function creationPublicationAfterFailure(error, recorded) {
244
+ if (error instanceof FsSafeError) {
245
+ const publication = error.details?.publication;
246
+ if (publication && typeof publication === "object" && "status" in publication &&
247
+ publication.status === "indeterminate")
248
+ return "indeterminate";
249
+ }
250
+ return recorded;
251
+ }
252
+ export function hasPreservedCreationArtifacts(error) {
253
+ if (!(error instanceof FsSafeError))
254
+ return false;
255
+ if (error.details?.cleanup === "preserved" || error.details?.cleanup === "failed")
256
+ return true;
257
+ const publication = error.details?.publication;
258
+ return publication !== null && typeof publication === "object" && "status" in publication &&
259
+ (publication.status === "published" || publication.status === "indeterminate");
260
+ }
261
+ export function rethrowPrivateStageCreationFailure(error, path, stageDirectory) {
262
+ if (error instanceof FsSafeError && error.code === "already-exists") {
263
+ throw new FsSafeError("helper-failed", "private file staging path already exists", {
264
+ cause: error, details: { publication: { status: "not-published" }, path, stageDirectory },
265
+ });
266
+ }
267
+ const publication = error instanceof FsSafeError ? error.details?.publication : undefined;
268
+ const created = error instanceof FsSafeError && error.details?.path === stageDirectory &&
269
+ publication !== null && typeof publication === "object" && "status" in publication &&
270
+ publication.status === "published";
271
+ let unconfirmed = hasUnsettledWindowsSecurityCommand(error);
272
+ if (error !== null && (typeof error === "object" || typeof error === "function")) {
273
+ try {
274
+ const outcome = Object.getOwnPropertyDescriptor(error, "creationOutcome");
275
+ unconfirmed ||= Boolean(outcome && "value" in outcome && outcome.value === "unconfirmed");
276
+ }
277
+ catch {
278
+ unconfirmed = true;
279
+ }
280
+ }
281
+ if (created || unconfirmed) {
282
+ throw privateFileSettlementFailure({
283
+ primary: error, cleanup: [], publication: "not-published", path, stageDirectory, preserved: true,
284
+ });
285
+ }
286
+ throw error;
287
+ }
288
+ export function privateFileSettlementFailure(params) {
289
+ return new FsSafeError("helper-failed", "file creation or staging settlement failed", {
290
+ cause: params.cleanup.length
291
+ ? new AggregateError([params.primary, ...params.cleanup], "file creation and cleanup failed")
292
+ : params.primary,
293
+ details: {
294
+ publication: { status: params.publication }, path: params.path, stageDirectory: params.stageDirectory,
295
+ cleanup: params.preserved || params.publication === "indeterminate" ? "preserved" : params.cleanup.length ? "failed" : "removed",
296
+ },
297
+ });
298
+ }
299
+ export function assertBeforeCreation(selected, permissions, assertion, kind) {
300
+ if (permissions.private)
301
+ assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, kind);
302
+ assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
303
+ selected.assertParent();
304
+ if (permissions.private && kind === "directory")
305
+ assertDarwinPrivateDirectoryMode(permissions.mode);
306
+ if (permissions.private)
307
+ assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, kind);
308
+ }
309
+ export function creationAdmissionFromParent(parent) {
310
+ const { dev, ino } = parent.stat;
311
+ if (typeof dev !== "bigint" || typeof ino !== "bigint") {
312
+ throw new FsSafeError("path-mismatch", "private creation requires an exact parent identity");
313
+ }
314
+ const identity = inspectDirectoryIdentitySync(parent.dir, { dev, ino });
315
+ return { expectedParentIdentity: { dev: identity.dev, ino: identity.ino, realPath: parent.realPath } };
316
+ }
317
+ export function prepareCreationPath(input, expectedParent) {
318
+ expectedParent = expectedParent && { dev: expectedParent.dev, ino: expectedParent.ino, realPath: expectedParent.realPath };
319
+ assertNoNulPathInput(input);
320
+ assertNoWindowsPathAlias(input, "filesystem");
321
+ if (process.platform === "win32" && input.replaceAll("/", "\\").split("\\")
322
+ .some(component => component.endsWith(".") || component.endsWith(" "))) {
323
+ throw new FsSafeError("invalid-path", "creation path contains an ambiguous Windows component");
324
+ }
325
+ const target = resolvePathPreservingWindowsRoot(input);
326
+ const directory = path.dirname(target);
327
+ if (target === directory || input.length === 0) {
328
+ throw new FsSafeError("invalid-path", "creation requires a child name");
329
+ }
330
+ if (expectedParent)
331
+ assertDirectoryIdentitySync(directory, expectedParent);
332
+ const stat = inspectDirectoryIdentitySync(directory);
333
+ const realPath = realpathSync.native(directory);
334
+ const parent = { dir: directory, realPath, stat };
335
+ const assertParent = () => {
336
+ assertDirectoryIdentitySync(directory, { dev: stat.dev, ino: stat.ino, realPath });
337
+ if (expectedParent)
338
+ assertDirectoryIdentitySync(directory, expectedParent);
339
+ };
340
+ assertParent();
341
+ return { target, parent, assertParent };
342
+ }
343
+ export function creationCollision(error) {
344
+ if (error?.code === "EEXIST") {
345
+ return new FsSafeError("already-exists", "creation target already exists", { cause: error });
346
+ }
347
+ return error;
348
+ }
349
+ /** Remove only the recorded empty stage; never traverse a replaced directory. */
350
+ export function removeCreationDirectory(directory, identity, assertParent) {
351
+ assertParent();
352
+ try {
353
+ assertDirectoryIdentitySync(directory, identity);
354
+ fs.rmdirSync(directory);
355
+ }
356
+ catch (error) {
357
+ if (error?.code !== "ENOENT")
358
+ throw error;
359
+ }
360
+ }
361
+ export async function removeCreationDirectoryAsync(directory, identity, assertParent) {
362
+ assertParent();
363
+ try {
364
+ assertDirectoryIdentitySync(directory, identity);
365
+ await fsAsync.rmdir(directory);
366
+ }
367
+ catch (error) {
368
+ if (error?.code !== "ENOENT")
369
+ throw error;
370
+ }
371
+ }
@@ -1,4 +1,4 @@
1
- export declare function resolveMutationComparablePaths(rawPath: string): Promise<Set<string>>;
1
+ export declare function resolveMutationComparablePaths(rawPath: string): Set<string>;
2
2
  export type DenyMutationPolicy = {
3
3
  paths?: readonly string[];
4
4
  prefixes?: readonly string[];
@@ -6,7 +6,6 @@ export type DenyMutationPolicy = {
6
6
  type DenyMutationCheckOptions = {
7
7
  protectAncestors?: boolean;
8
8
  };
9
- export declare function assertMutationNotDenied(filePath: string, policy: DenyMutationPolicy | undefined, options?: DenyMutationCheckOptions): Promise<void>;
9
+ export declare function assertMutationNotDenied(filePath: string, policy: DenyMutationPolicy | undefined, options?: DenyMutationCheckOptions, mode?: "root" | "sync-root-lock"): void;
10
10
  export declare function mergeDenyMutationPolicies(defaultPolicy: DenyMutationPolicy | undefined, callPolicy: DenyMutationPolicy | undefined): DenyMutationPolicy | undefined;
11
11
  export {};
12
- //# sourceMappingURL=deny-mutations.d.ts.map
@@ -1,61 +1,81 @@
1
+ import fs from "node:fs";
1
2
  import path from "node:path";
2
3
  import { FsSafeError } from "./errors.js";
3
- import { assertNoNulPathInput, isPathInside } from "./path.js";
4
- import { resolvePathViaExistingAncestor } from "./root-path-existing.js";
5
- import { assertNoWindowsPathAlias, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
6
- export async function resolveMutationComparablePaths(rawPath) {
4
+ import { assertNoNulPathInput, isNotFoundPathError, isPathInside } from "./path.js";
5
+ import { realpathSync } from "./realpath.js";
6
+ import { resolveExistingAncestor } from "./root-path-existing.js";
7
+ import { assertNoWindowsPathAlias, pathForWindowsFilesystem, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
8
+ export function resolveMutationComparablePaths(rawPath) {
7
9
  assertNoNulPathInput(rawPath, "path contains a NUL byte");
8
10
  assertNoWindowsPathAlias(rawPath, "filesystem", "mutation path uses a Windows filesystem namespace alias");
9
11
  const resolved = resolvePathPreservingWindowsRoot(rawPath);
10
12
  assertNoWindowsPathAlias(resolved, "filesystem", "mutation path uses a Windows filesystem namespace alias");
11
- const canonical = await resolvePathViaExistingAncestor(resolved);
13
+ const canonical = resolveExistingAncestor(resolved, "native");
12
14
  assertNoWindowsPathAlias(canonical, "filesystem", "mutation path uses a Windows filesystem namespace alias");
13
15
  return new Set([resolved, canonical]);
14
16
  }
15
- function isSamePath(left, right) {
16
- return isPathInside(left, right) && isPathInside(right, left);
17
- }
18
- function hasPolicyEntries(policy) {
19
- return Boolean(policy?.paths?.length || policy?.prefixes?.length);
17
+ function strictMutationComparablePaths(pathname) {
18
+ const resolved = resolvePathPreservingWindowsRoot(pathname);
19
+ assertNoWindowsPathAlias(resolved, "filesystem", "mutation path uses a Windows filesystem namespace alias");
20
+ let cursor = resolved;
21
+ const filesystemRoot = path.parse(resolved).root;
22
+ while (cursor !== filesystemRoot) {
23
+ try {
24
+ fs.lstatSync(pathForWindowsFilesystem(cursor));
25
+ break;
26
+ }
27
+ catch (error) {
28
+ if (!isNotFoundPathError(error))
29
+ throw error;
30
+ cursor = path.dirname(cursor);
31
+ }
32
+ }
33
+ // Synchronous Root locks require authority-grade canonicalization. Keep
34
+ // ambiguous existing ancestors distinct from Root's lexical fallback.
35
+ const canonicalAncestor = realpathSync.native(pathForWindowsFilesystem(cursor));
36
+ assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "mutation path uses a Windows filesystem namespace alias");
37
+ const canonical = cursor === resolved
38
+ ? canonicalAncestor
39
+ : path.resolve(canonicalAncestor, `.${path.sep}${resolved.slice(cursor.length)}`);
40
+ assertNoWindowsPathAlias(canonical, "filesystem", "mutation path uses a Windows filesystem namespace alias");
41
+ return path.relative(path.resolve(resolved), path.resolve(canonical)) === ""
42
+ ? [resolved] : [resolved, canonical];
20
43
  }
21
- function policyPathEntries(entries) {
44
+ function policyPathEntries(entries, strict) {
22
45
  const paths = [];
23
46
  for (const entry of entries ?? []) {
47
+ if (strict && (!entry || !path.isAbsolute(entry))) {
48
+ throw new FsSafeError("invalid-path", "deny mutation paths must be non-empty absolute paths");
49
+ }
24
50
  if (entry.length === 0) {
25
51
  throw new FsSafeError("invalid-path", "deny mutation paths must be non-empty");
26
52
  }
27
53
  assertNoNulPathInput(entry, "deny mutation path contains a NUL byte");
28
54
  assertNoWindowsPathAlias(entry, "filesystem", "deny mutation path uses a Windows filesystem namespace alias");
29
- if (!path.isAbsolute(entry)) {
55
+ if (!strict && !path.isAbsolute(entry)) {
30
56
  throw new FsSafeError("invalid-path", "deny mutation paths must be absolute");
31
57
  }
32
- paths.push(entry);
58
+ paths.push(strict ? resolvePathPreservingWindowsRoot(entry) : entry);
33
59
  }
34
60
  return paths;
35
61
  }
36
- export async function assertMutationNotDenied(filePath, policy, options = {}) {
37
- if (!hasPolicyEntries(policy)) {
62
+ export function assertMutationNotDenied(filePath, policy, options = {}, mode = "root") {
63
+ if (!policy?.paths?.length && !policy?.prefixes?.length)
38
64
  return;
39
- }
40
- const targetPaths = await resolveMutationComparablePaths(filePath);
41
- for (const deniedPath of policyPathEntries(policy.paths)) {
42
- const deniedPaths = await resolveMutationComparablePaths(deniedPath);
43
- for (const target of targetPaths) {
44
- for (const denied of deniedPaths) {
45
- if (isSamePath(denied, target) ||
46
- (options.protectAncestors === true && isPathInside(target, denied))) {
47
- throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
48
- }
49
- }
50
- }
51
- }
52
- for (const deniedPrefix of policyPathEntries(policy.prefixes)) {
53
- const deniedPaths = await resolveMutationComparablePaths(deniedPrefix);
54
- for (const target of targetPaths) {
55
- for (const denied of deniedPaths) {
56
- if (isPathInside(denied, target) ||
57
- (options.protectAncestors === true && isPathInside(target, denied))) {
58
- throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
65
+ const strict = mode === "sync-root-lock";
66
+ const comparablePaths = strict ? strictMutationComparablePaths : resolveMutationComparablePaths;
67
+ const targets = comparablePaths(filePath);
68
+ // Validate one complete phase at a time. A paths denial must not read or
69
+ // canonicalize prefixes, and invalid later paths retain validation precedence.
70
+ for (const kind of ["paths", "prefixes"]) {
71
+ for (const entry of policyPathEntries(policy[kind], strict)) {
72
+ const deniedPaths = comparablePaths(entry);
73
+ for (const target of targets) {
74
+ for (const denied of deniedPaths) {
75
+ if ((isPathInside(denied, target) && (kind === "prefixes" || isPathInside(target, denied))) ||
76
+ (options.protectAncestors === true && isPathInside(target, denied))) {
77
+ throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
78
+ }
59
79
  }
60
80
  }
61
81
  }
@@ -12,4 +12,3 @@ export declare function isWindowsReservedDeviceName(name: string): boolean;
12
12
  export declare function matchUnsafeDeviceReadPath(filePath: string, options?: UnsafeDeviceReadPathOptions): UnsafeDeviceReadPathMatch | undefined;
13
13
  export declare function isUnsafeDeviceReadPath(filePath: string, options?: UnsafeDeviceReadPathOptions): boolean;
14
14
  export declare function assertNoUnsafeDeviceReadPath(filePath: string, options?: UnsafeDeviceReadPathOptions): void;
15
- //# sourceMappingURL=device-path.d.ts.map
@@ -41,4 +41,3 @@ export declare function syncDirectorySync(directory: string | DirectoryReceipt<S
41
41
  export declare function syncDirectoryBestEffort(directoryPath: string): Promise<void>;
42
42
  export declare function syncDirectoryBestEffortSync(directoryPath: string): void;
43
43
  export declare function ensureDurableDirectory(options: EnsureDurableDirectoryOptions): Promise<DurableDirectoryReceipt>;
44
- //# sourceMappingURL=directory-durability.d.ts.map
@@ -1,3 +1,2 @@
1
1
  /** Strip only trailing separators: lstat must inspect the entry, not follow a leaf link. */
2
2
  export declare function directoryEntryPath(dir: string, platform?: NodeJS.Platform): string;
3
- //# sourceMappingURL=directory-entry-path.d.ts.map
@@ -6,11 +6,7 @@ export type AsyncDirectoryGuard<T extends Stats | BigIntStats = Stats> = {
6
6
  stat: T;
7
7
  };
8
8
  export type AnyAsyncDirectoryGuard = AsyncDirectoryGuard<Stats | BigIntStats>;
9
- export type SyncDirectoryGuard = {
10
- dir: string;
11
- realPath: string;
12
- stat: Stats;
13
- };
9
+ export type SyncDirectoryGuard = AsyncDirectoryGuard;
14
10
  export type DirectoryIdentity = Readonly<{
15
11
  dev: bigint;
16
12
  ino: bigint;
@@ -30,8 +26,8 @@ export declare function createAsyncDirectoryGuard(dir: string, options?: {
30
26
  export declare function createAsyncDirectoryGuard(dir: string, options: {
31
27
  bigint: boolean;
32
28
  }): Promise<AnyAsyncDirectoryGuard>;
33
- export declare function assertAsyncDirectoryGuard(guard: AnyAsyncDirectoryGuard): Promise<void>;
34
29
  export declare function createSyncDirectoryGuard(dir: string): SyncDirectoryGuard;
30
+ export declare function assertAsyncDirectoryGuard(guard: AnyAsyncDirectoryGuard): Promise<void>;
35
31
  export declare function assertSyncDirectoryGuard(guard: SyncDirectoryGuard | AnyAsyncDirectoryGuard): void;
36
32
  export declare function createNearestExistingDirectoryGuard(rootReal: string, targetPath: string): Promise<AsyncDirectoryGuard>;
37
33
  export declare function createNearestExistingDirectoryGuard(rootReal: string, targetPath: string, options: {
@@ -57,4 +53,3 @@ export declare function extendDirectoryObservationGuard(observation: StatObserva
57
53
  export declare function inspectDirectoryObservationSync(dir: string, expected?: ExactStatIdentity): StatObservationReceipt;
58
54
  export declare function assertDirectoryObservationSync(dir: string, expected: ExactStatIdentity): Stats | BigIntStats;
59
55
  export declare function assertDirectoryObservationGuardSync(guard: DirectoryObservationGuard): void;
60
- //# sourceMappingURL=directory-guard.d.ts.map