privateer-agent 0.15.4 → 0.15.6

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 (229) hide show
  1. package/README.md +11 -0
  2. package/bin/boot-bundle.d.mts +2 -0
  3. package/bin/boot-bundle.mjs +44 -0
  4. package/bin/fresh-supervisor.d.mts +5 -1
  5. package/bin/fresh-supervisor.mjs +47 -10
  6. package/bin/privateer-launch.mjs +27 -3
  7. package/bin/privateer-subagent.mjs +5 -2
  8. package/bin/privateer-verify.mjs +12 -0
  9. package/bin/session-recovery.d.mts +53 -0
  10. package/bin/session-recovery.mjs +240 -0
  11. package/bin/session-seal-preload.mjs +17 -0
  12. package/bin/session-seal.d.mts +25 -0
  13. package/bin/session-seal.mjs +242 -0
  14. package/dist-boot/boot.mjs +3 -0
  15. package/dist-boot/c-27JKSMWL.mjs +1460 -0
  16. package/dist-boot/c-2BMRFV24.mjs +269 -0
  17. package/dist-boot/c-2CTF6JA3.mjs +166 -0
  18. package/dist-boot/c-2G3BBHRJ.mjs +84 -0
  19. package/dist-boot/c-2IDLKXX6.mjs +250 -0
  20. package/dist-boot/c-2NJD5VYM.mjs +8 -0
  21. package/dist-boot/c-2S5EEQPW.mjs +1602 -0
  22. package/dist-boot/c-2WRDCUVI.mjs +25 -0
  23. package/dist-boot/c-2YN3M256.mjs +14 -0
  24. package/dist-boot/c-37GM3GMU.mjs +187 -0
  25. package/dist-boot/c-3STKRSVO.mjs +2480 -0
  26. package/dist-boot/c-3TPV6TQQ.mjs +2320 -0
  27. package/dist-boot/c-3UVHLQDJ.mjs +225 -0
  28. package/dist-boot/c-42PUUZYC.mjs +697 -0
  29. package/dist-boot/c-4D5UMWVW.mjs +683 -0
  30. package/dist-boot/c-4ETZRMTA.mjs +46 -0
  31. package/dist-boot/c-4QT25BD5.mjs +1482 -0
  32. package/dist-boot/c-4WVR32AP.mjs +2579 -0
  33. package/dist-boot/c-5EMM567G.mjs +152 -0
  34. package/dist-boot/c-5FA4CV63.mjs +145 -0
  35. package/dist-boot/c-5GV3X3RB.mjs +14 -0
  36. package/dist-boot/c-5JCEPRIY.mjs +52 -0
  37. package/dist-boot/c-5NDKIIWT.mjs +16 -0
  38. package/dist-boot/c-5QL3AR26.mjs +4665 -0
  39. package/dist-boot/c-5XY6MFKN.mjs +5142 -0
  40. package/dist-boot/c-65UZIZC7.mjs +2897 -0
  41. package/dist-boot/c-6FUXKHOK.mjs +1969 -0
  42. package/dist-boot/c-6JHWQE4V.mjs +18242 -0
  43. package/dist-boot/c-6LOBR4I6.mjs +5280 -0
  44. package/dist-boot/c-6QHOZXKQ.mjs +14394 -0
  45. package/dist-boot/c-6ZO2SADQ.mjs +178 -0
  46. package/dist-boot/c-6ZORVVZP.mjs +1449 -0
  47. package/dist-boot/c-76QH4UCP.mjs +2441 -0
  48. package/dist-boot/c-77GO5L5Y.mjs +20982 -0
  49. package/dist-boot/c-7M23XFTN.mjs +5052 -0
  50. package/dist-boot/c-7TC367E2.mjs +32 -0
  51. package/dist-boot/c-7UOG7POX.mjs +1524 -0
  52. package/dist-boot/c-7VHP3FLN.mjs +376 -0
  53. package/dist-boot/c-A73JHZP2.mjs +13207 -0
  54. package/dist-boot/c-ABXULAFL.mjs +71 -0
  55. package/dist-boot/c-ANDD2AQO.mjs +74 -0
  56. package/dist-boot/c-AOY77AZL.mjs +1430 -0
  57. package/dist-boot/c-AXEPZ22I.mjs +108 -0
  58. package/dist-boot/c-B2Y7VNHU.mjs +427 -0
  59. package/dist-boot/c-B7VJUH73.mjs +77 -0
  60. package/dist-boot/c-BFW6CDVL.mjs +24 -0
  61. package/dist-boot/c-BHNIF2AR.mjs +188 -0
  62. package/dist-boot/c-BKF2O6BL.mjs +23 -0
  63. package/dist-boot/c-BOZXFTZN.mjs +8 -0
  64. package/dist-boot/c-BRNYJWZL.mjs +28 -0
  65. package/dist-boot/c-C3N4Z2HO.mjs +93 -0
  66. package/dist-boot/c-C4IV7ZFG.mjs +717 -0
  67. package/dist-boot/c-C5NK6UYV.mjs +793 -0
  68. package/dist-boot/c-C67644MB.mjs +1659 -0
  69. package/dist-boot/c-C6S2YB53.mjs +620 -0
  70. package/dist-boot/c-CDBEJSBF.mjs +37 -0
  71. package/dist-boot/c-CG47HBKU.mjs +435 -0
  72. package/dist-boot/c-CKCTWCT5.mjs +51 -0
  73. package/dist-boot/c-CN77DCGF.mjs +60 -0
  74. package/dist-boot/c-CRBXNKFO.mjs +1795 -0
  75. package/dist-boot/c-CRIHASQ6.mjs +973 -0
  76. package/dist-boot/c-CU4NGAUO.mjs +3786 -0
  77. package/dist-boot/c-CWRFLGQU.mjs +1883 -0
  78. package/dist-boot/c-CYQB2USO.mjs +32 -0
  79. package/dist-boot/c-DEE67DJO.mjs +379 -0
  80. package/dist-boot/c-DIFDBYOP.mjs +1258 -0
  81. package/dist-boot/c-DOSGVXDZ.mjs +34879 -0
  82. package/dist-boot/c-DR7XQI32.mjs +381 -0
  83. package/dist-boot/c-DTGPSB46.mjs +14666 -0
  84. package/dist-boot/c-DTHDNA4P.mjs +320 -0
  85. package/dist-boot/c-E4Z3Y5B5.mjs +3864 -0
  86. package/dist-boot/c-E66Z2TI7.mjs +203 -0
  87. package/dist-boot/c-EBU6RLRV.mjs +1527 -0
  88. package/dist-boot/c-EBZZNGSF.mjs +432 -0
  89. package/dist-boot/c-EC3LJ2KF.mjs +1032 -0
  90. package/dist-boot/c-EQBKXWNX.mjs +15829 -0
  91. package/dist-boot/c-EUEPIW4S.mjs +574 -0
  92. package/dist-boot/c-EX4YVWAT.mjs +378 -0
  93. package/dist-boot/c-EYZGSAJU.mjs +98 -0
  94. package/dist-boot/c-F75VRKY4.mjs +172 -0
  95. package/dist-boot/c-FH4NXKHV.mjs +177 -0
  96. package/dist-boot/c-FHNUCTEM.mjs +140 -0
  97. package/dist-boot/c-FJ5T42DS.mjs +5349 -0
  98. package/dist-boot/c-FPCNRL7G.mjs +1728 -0
  99. package/dist-boot/c-G4DLN7Q4.mjs +8 -0
  100. package/dist-boot/c-G56GYQFZ.mjs +2507 -0
  101. package/dist-boot/c-GLIOERDQ.mjs +1200 -0
  102. package/dist-boot/c-GMJ5HUBM.mjs +14 -0
  103. package/dist-boot/c-H3HSGMAQ.mjs +461 -0
  104. package/dist-boot/c-HIKTO6P7.mjs +275 -0
  105. package/dist-boot/c-I2MCJ34O.mjs +464 -0
  106. package/dist-boot/c-I3C6LBW4.mjs +765 -0
  107. package/dist-boot/c-I54OKQHW.mjs +387 -0
  108. package/dist-boot/c-IFSP3R4D.mjs +80 -0
  109. package/dist-boot/c-IZK77VB7.mjs +171 -0
  110. package/dist-boot/c-J3Y25UGE.mjs +54 -0
  111. package/dist-boot/c-J5IESS7W.mjs +27750 -0
  112. package/dist-boot/c-JJWZBY7L.mjs +254 -0
  113. package/dist-boot/c-JKTFXTGF.mjs +463 -0
  114. package/dist-boot/c-JN57AXQ4.mjs +77 -0
  115. package/dist-boot/c-KFIO6LUW.mjs +1096 -0
  116. package/dist-boot/c-KIEMEFWW.mjs +478 -0
  117. package/dist-boot/c-KIVXWBYD.mjs +28 -0
  118. package/dist-boot/c-KP6CRIP4.mjs +580 -0
  119. package/dist-boot/c-L26VOJX4.mjs +11558 -0
  120. package/dist-boot/c-L5GHWG5G.mjs +5988 -0
  121. package/dist-boot/c-M7NSQAKK.mjs +353 -0
  122. package/dist-boot/c-MCEWOPBW.mjs +56 -0
  123. package/dist-boot/c-MGPIEG7I.mjs +20 -0
  124. package/dist-boot/c-NREXJV3M.mjs +393 -0
  125. package/dist-boot/c-O5PP6CTX.mjs +162 -0
  126. package/dist-boot/c-OBQDHSXM.mjs +1774 -0
  127. package/dist-boot/c-OLQHHDD4.mjs +21 -0
  128. package/dist-boot/c-OXW4JQQH.mjs +319 -0
  129. package/dist-boot/c-P3D7ZUWN.mjs +1288 -0
  130. package/dist-boot/c-P4PQZVV5.mjs +948 -0
  131. package/dist-boot/c-P63T3XL2.mjs +26373 -0
  132. package/dist-boot/c-P6N5DQGZ.mjs +194 -0
  133. package/dist-boot/c-P7MLKQFC.mjs +58 -0
  134. package/dist-boot/c-PB3PZJL5.mjs +1276 -0
  135. package/dist-boot/c-PTN4S6G2.mjs +1259 -0
  136. package/dist-boot/c-PYCE5J7U.mjs +1083 -0
  137. package/dist-boot/c-Q4HYCRLB.mjs +19410 -0
  138. package/dist-boot/c-QUXMETGG.mjs +68 -0
  139. package/dist-boot/c-RDMJZCOX.mjs +356 -0
  140. package/dist-boot/c-ROGJK76M.mjs +17 -0
  141. package/dist-boot/c-RQJJ26T4.mjs +708 -0
  142. package/dist-boot/c-RSKCUPJF.mjs +7559 -0
  143. package/dist-boot/c-RVJU4O6P.mjs +37 -0
  144. package/dist-boot/c-S2RVHR3M.mjs +165 -0
  145. package/dist-boot/c-SKMK3PEE.mjs +91120 -0
  146. package/dist-boot/c-TI7SM4EG.mjs +20 -0
  147. package/dist-boot/c-TILJ6GXD.mjs +1235 -0
  148. package/dist-boot/c-TT6BCUJD.mjs +114 -0
  149. package/dist-boot/c-U4ITOXAN.mjs +2107 -0
  150. package/dist-boot/c-UGERXVO2.mjs +7120 -0
  151. package/dist-boot/c-UPBH5AXY.mjs +1363 -0
  152. package/dist-boot/c-US2PUNZL.mjs +597 -0
  153. package/dist-boot/c-UU4WZPPE.mjs +20 -0
  154. package/dist-boot/c-UWVIYPQS.mjs +39 -0
  155. package/dist-boot/c-V4RHQBPQ.mjs +17683 -0
  156. package/dist-boot/c-V5MRVK47.mjs +351 -0
  157. package/dist-boot/c-V6CL266R.mjs +1755 -0
  158. package/dist-boot/c-VJTMFKYE.mjs +14975 -0
  159. package/dist-boot/c-VJTRUKIB.mjs +773 -0
  160. package/dist-boot/c-W4IFSHPW.mjs +43 -0
  161. package/dist-boot/c-WETGB2CF.mjs +113 -0
  162. package/dist-boot/c-WO3QSZUU.mjs +1337 -0
  163. package/dist-boot/c-WQLH73TY.mjs +242 -0
  164. package/dist-boot/c-XL735JW5.mjs +500 -0
  165. package/dist-boot/c-Y7HADL5B.mjs +1107 -0
  166. package/dist-boot/c-YGQHSVSK.mjs +41 -0
  167. package/dist-boot/c-YMP2AMEB.mjs +10350 -0
  168. package/dist-boot/c-YRDO2WEF.mjs +12012 -0
  169. package/dist-boot/c-YUSTRATJ.mjs +8 -0
  170. package/dist-boot/c-Z2262R22.mjs +2697 -0
  171. package/dist-boot/c-Z4ALQMJC.mjs +709 -0
  172. package/dist-boot/c-Z5ZUQVUY.mjs +62 -0
  173. package/dist-boot/c-ZDZUKXF7.mjs +874 -0
  174. package/dist-boot/c-ZJYLGIC3.mjs +32 -0
  175. package/dist-boot/c-ZNA5CDMI.mjs +77 -0
  176. package/dist-boot/c-ZSO6DI3M.mjs +204 -0
  177. package/dist-boot/c-ZWUVHKMK.mjs +100 -0
  178. package/dist-boot/c-ZY4MESEW.mjs +832 -0
  179. package/dist-boot/c-ZZ5REI4L.mjs +329 -0
  180. package/dist-boot/cli.mjs +51 -0
  181. package/dist-boot/ext-anthropic-attribution.mjs +207 -0
  182. package/dist-boot/ext-pi-background-tasks.mjs +7234 -0
  183. package/dist-boot/ext-pi-subagents.mjs +37 -0
  184. package/dist-boot/ext-privateer-account.mjs +4426 -0
  185. package/dist-boot/ext-privateer-brand.mjs +5274 -0
  186. package/dist-boot/ext-privateer-codemode.mjs +37 -0
  187. package/dist-boot/ext-privateer-computer.mjs +626 -0
  188. package/dist-boot/ext-privateer-connect.mjs +1862 -0
  189. package/dist-boot/ext-privateer-context.mjs +323 -0
  190. package/dist-boot/ext-privateer-desktop.mjs +92 -0
  191. package/dist-boot/ext-privateer-final-audit.mjs +48 -0
  192. package/dist-boot/ext-privateer-fresh.mjs +81 -0
  193. package/dist-boot/ext-privateer-gate.mjs +5959 -0
  194. package/dist-boot/ext-privateer-hints.mjs +236 -0
  195. package/dist-boot/ext-privateer-media.mjs +2626 -0
  196. package/dist-boot/ext-privateer-models.mjs +3397 -0
  197. package/dist-boot/ext-privateer-posture.mjs +3006 -0
  198. package/dist-boot/ext-privateer-privacy.mjs +4578 -0
  199. package/dist-boot/ext-privateer-recovery.mjs +287 -0
  200. package/dist-boot/ext-privateer-speak.mjs +4754 -0
  201. package/dist-boot/ext-privateer-terminals.mjs +725 -0
  202. package/dist-boot/ext-privateer-tools.mjs +528 -0
  203. package/dist-boot/ext-privateer-truncation.mjs +74 -0
  204. package/dist-boot/ext-privateer-update.mjs +210 -0
  205. package/dist-boot/ext-privateer-vision.mjs +148 -0
  206. package/dist-boot/ext-privateer-web.mjs +543 -0
  207. package/dist-boot/ext-rpiv-ask-user-question.mjs +710 -0
  208. package/dist-boot/manifest.json +9 -0
  209. package/extensions/privateer-brand.ts +3 -1
  210. package/extensions/privateer-context.ts +4 -2
  211. package/extensions/privateer-final-audit.ts +17 -0
  212. package/extensions/privateer-gate.ts +55 -9
  213. package/extensions/privateer-recovery.ts +175 -0
  214. package/extensions/privateer-web.ts +4 -4
  215. package/package.json +3 -1
  216. package/patches/@earendil-works+pi-coding-agent+1.3.0.patch +199 -2
  217. package/patches/pi-background-tasks+2.6.10.patch +91 -7
  218. package/src/cli/chat.ts +7 -1
  219. package/src/config/moatManifest.json +2 -0
  220. package/src/config/whatsNew.json +4 -4
  221. package/src/context.ts +33 -5
  222. package/src/engine/finalAudit.ts +38 -0
  223. package/src/engine/stallWatchdog.ts +8 -1
  224. package/src/providers/account.ts +34 -3
  225. package/src/remote/attentionPush.ts +40 -0
  226. package/src/remote/liveTaskSession.ts +7 -1
  227. package/src/remote/relayClient.ts +38 -4
  228. package/src/remote/remoteBridge.ts +17 -0
  229. package/src/remote/transcriptSnapshot.ts +104 -0
@@ -0,0 +1,381 @@
1
+ import{createRequire as __pvCR}from"node:module";import{fileURLToPath as __pvF}from"node:url";import{dirname as __pvD}from"node:path";const require=__pvCR(import.meta.url);const __pvUrl=(r)=>new URL(r,import.meta.url).href;const __pvFile=(r)=>__pvF(new URL(r,import.meta.url));
2
+ import {
3
+ __name
4
+ } from "./c-CN77DCGF.mjs";
5
+
6
+ // node_modules/pi-background-tasks/src/core/durable-fs.ts?ext=pi-background-tasks
7
+ import { randomBytes } from "node:crypto";
8
+ import { open as nodeOpen, rename as nodeRename, rm as nodeRm } from "node:fs/promises";
9
+ import { basename, dirname, join } from "node:path";
10
+ var DurableFileCancellationError = class extends Error {
11
+ static {
12
+ __name(this, "DurableFileCancellationError");
13
+ }
14
+ code = "durable_file_cancelled";
15
+ path;
16
+ reason;
17
+ cleanupFailures;
18
+ targetPath;
19
+ temporaryPath;
20
+ renameCompleted;
21
+ constructor(input) {
22
+ const reasonText = describeCause(input.reason);
23
+ const cleanupText = input.cleanupFailures.length === 0 ? "" : ` Cleanup failures: ${input.cleanupFailures.map(formatFailureForMessage).join("; ")}`;
24
+ const commitText = input.renameCompleted ? ` Replacement may already be visible at ${input.targetPath ?? input.path}.` : "";
25
+ super(`Durable file operation cancelled for ${input.path}: ${reasonText}.${commitText}${cleanupText}`);
26
+ this.name = "DurableFileCancellationError";
27
+ this.path = input.path;
28
+ this.reason = input.reason;
29
+ this.cleanupFailures = [...input.cleanupFailures];
30
+ this.targetPath = input.targetPath;
31
+ this.temporaryPath = input.temporaryPath;
32
+ this.renameCompleted = input.renameCompleted;
33
+ }
34
+ };
35
+ var DurableFileError = class extends Error {
36
+ static {
37
+ __name(this, "DurableFileError");
38
+ }
39
+ operation;
40
+ path;
41
+ nativeCode;
42
+ primaryCause;
43
+ cleanupFailures;
44
+ targetPath;
45
+ temporaryPath;
46
+ renameCompleted;
47
+ constructor(input) {
48
+ super(formatDurableMessage(input));
49
+ this.name = "DurableFileError";
50
+ this.operation = input.operation;
51
+ this.path = input.path;
52
+ this.nativeCode = nativeCodeForCause(input.cause);
53
+ this.primaryCause = input.cause;
54
+ this.cleanupFailures = [...input.cleanupFailures];
55
+ this.targetPath = input.targetPath;
56
+ this.temporaryPath = input.temporaryPath;
57
+ this.renameCompleted = input.renameCompleted;
58
+ }
59
+ };
60
+ function failure(operation, path, cause) {
61
+ return { operation, path, cause };
62
+ }
63
+ __name(failure, "failure");
64
+ function durableError(input) {
65
+ return new DurableFileError(input);
66
+ }
67
+ __name(durableError, "durableError");
68
+ function nativeCodeForCause(cause) {
69
+ if (typeof cause !== "object" || cause === null) return void 0;
70
+ const code = Reflect.get(cause, "code");
71
+ return typeof code === "string" ? code : void 0;
72
+ }
73
+ __name(nativeCodeForCause, "nativeCodeForCause");
74
+ function describeCause(cause) {
75
+ if (cause instanceof Error) {
76
+ const message = cause.message.length > 0 ? cause.message : String(cause);
77
+ return `${cause.name}: ${message}`;
78
+ }
79
+ return String(cause);
80
+ }
81
+ __name(describeCause, "describeCause");
82
+ function formatFailureForMessage(entry) {
83
+ const code = nativeCodeForCause(entry.cause);
84
+ const codeText = code === void 0 ? "" : ` (code ${code})`;
85
+ return `${entry.operation} ${entry.path}${codeText}: ${describeCause(entry.cause)}`;
86
+ }
87
+ __name(formatFailureForMessage, "formatFailureForMessage");
88
+ function formatDurableMessage(input) {
89
+ const primary = formatFailureForMessage({
90
+ operation: input.operation,
91
+ path: input.path,
92
+ cause: input.cause
93
+ });
94
+ const segments = [`Durable file operation failed: ${primary}`];
95
+ if (input.targetPath !== void 0) segments.push(`target: ${input.targetPath}`);
96
+ if (input.temporaryPath !== void 0) segments.push(`temporary: ${input.temporaryPath}`);
97
+ if (input.renameCompleted) {
98
+ const target = input.targetPath ?? input.path;
99
+ segments.push(`Replacement may already be visible at ${target}.`);
100
+ }
101
+ if (input.cleanupFailures.length > 0) {
102
+ const cleanupText = input.cleanupFailures.map(formatFailureForMessage).join("; ");
103
+ segments.push(`Cleanup failures: ${cleanupText}`);
104
+ }
105
+ return segments.join(" ");
106
+ }
107
+ __name(formatDurableMessage, "formatDurableMessage");
108
+ async function writeSyncClose(handle, path, data, signal) {
109
+ const cleanupFailures = [];
110
+ let primaryFailure;
111
+ let cancelled = signal?.aborted === true;
112
+ if (!cancelled) {
113
+ try {
114
+ await handle.writeFile(data);
115
+ } catch (error) {
116
+ primaryFailure = failure("write_file", path, error);
117
+ }
118
+ cancelled = signal?.aborted === true;
119
+ }
120
+ if (primaryFailure === void 0 && !cancelled) {
121
+ try {
122
+ await handle.sync();
123
+ } catch (error) {
124
+ primaryFailure = failure("sync_file", path, error);
125
+ }
126
+ cancelled = signal?.aborted === true;
127
+ }
128
+ try {
129
+ await handle.close();
130
+ } catch (error) {
131
+ const closeFailure = failure("close_file", path, error);
132
+ if (primaryFailure === void 0) primaryFailure = closeFailure;
133
+ else cleanupFailures.push(closeFailure);
134
+ }
135
+ cancelled ||= signal?.aborted === true;
136
+ return { primaryFailure, cleanupFailures, cancelled };
137
+ }
138
+ __name(writeSyncClose, "writeSyncClose");
139
+ async function syncCloseDirectory(handle, path) {
140
+ const cleanupFailures = [];
141
+ let primaryFailure;
142
+ try {
143
+ await handle.sync();
144
+ } catch (error) {
145
+ primaryFailure = failure("sync_directory", path, error);
146
+ }
147
+ try {
148
+ await handle.close();
149
+ } catch (error) {
150
+ const closeFailure = failure("close_directory", path, error);
151
+ if (primaryFailure === void 0) primaryFailure = closeFailure;
152
+ else cleanupFailures.push(closeFailure);
153
+ }
154
+ return { primaryFailure, cleanupFailures, cancelled: false };
155
+ }
156
+ __name(syncCloseDirectory, "syncCloseDirectory");
157
+ function cancellationReason(signal) {
158
+ return signal.reason ?? new Error("operation aborted");
159
+ }
160
+ __name(cancellationReason, "cancellationReason");
161
+ function throwCancellation(signal, path, cleanupFailures, targetPath, temporaryPath, renameCompleted) {
162
+ const reason = cancellationReason(signal);
163
+ if (cleanupFailures.length === 0 && !renameCompleted && reason instanceof Error) throw reason;
164
+ throw new DurableFileCancellationError({
165
+ path,
166
+ reason,
167
+ cleanupFailures,
168
+ targetPath,
169
+ temporaryPath,
170
+ renameCompleted
171
+ });
172
+ }
173
+ __name(throwCancellation, "throwCancellation");
174
+ function throwDurable(primaryFailure, cleanupFailures, targetPath, temporaryPath, renameCompleted) {
175
+ throw durableError({
176
+ operation: primaryFailure.operation,
177
+ path: primaryFailure.path,
178
+ cause: primaryFailure.cause,
179
+ cleanupFailures,
180
+ targetPath,
181
+ temporaryPath,
182
+ renameCompleted
183
+ });
184
+ }
185
+ __name(throwDurable, "throwDurable");
186
+ async function removeTemporary(operations, temporaryPath, cleanupFailures) {
187
+ try {
188
+ await operations.remove(temporaryPath);
189
+ } catch (error) {
190
+ cleanupFailures.push(failure("remove_temp", temporaryPath, error));
191
+ }
192
+ }
193
+ __name(removeTemporary, "removeTemporary");
194
+ function isAborted(signal) {
195
+ return signal?.aborted === true;
196
+ }
197
+ __name(isAborted, "isAborted");
198
+ async function writeWithOperations(operations, path, data, options) {
199
+ const signal = options.signal;
200
+ if (signal !== void 0 && isAborted(signal))
201
+ throwCancellation(signal, path, [], path, void 0, false);
202
+ let handle;
203
+ try {
204
+ handle = await operations.openWritable(path, "w");
205
+ } catch (error) {
206
+ if (signal !== void 0 && isAborted(signal))
207
+ throwCancellation(signal, path, [], path, void 0, false);
208
+ throwDurable(failure("open_file", path, error), [], path, void 0, false);
209
+ }
210
+ const result = await writeSyncClose(handle, path, data, signal);
211
+ if (result.primaryFailure !== void 0) {
212
+ throwDurable(result.primaryFailure, result.cleanupFailures, path, void 0, false);
213
+ }
214
+ if (result.cancelled && signal !== void 0) {
215
+ throwCancellation(signal, path, result.cleanupFailures, path, void 0, false);
216
+ }
217
+ }
218
+ __name(writeWithOperations, "writeWithOperations");
219
+ async function syncDirectoryAfterRename(operations, targetPath, temporaryPath) {
220
+ if (operations.platform === "win32") return;
221
+ const directoryPath = dirname(targetPath);
222
+ let handle;
223
+ try {
224
+ handle = await operations.openDirectory(directoryPath);
225
+ } catch (error) {
226
+ throwDurable(failure("open_directory", directoryPath, error), [], targetPath, temporaryPath, true);
227
+ }
228
+ const result = await syncCloseDirectory(handle, directoryPath);
229
+ if (result.primaryFailure !== void 0) {
230
+ throwDurable(result.primaryFailure, result.cleanupFailures, targetPath, temporaryPath, true);
231
+ }
232
+ }
233
+ __name(syncDirectoryAfterRename, "syncDirectoryAfterRename");
234
+ async function replaceWithOperations(operations, path, data, options) {
235
+ const signal = options.signal;
236
+ if (signal !== void 0 && isAborted(signal))
237
+ throwCancellation(signal, path, [], path, void 0, false);
238
+ const temporaryPath = operations.temporaryPath(path);
239
+ let handle;
240
+ try {
241
+ handle = await operations.openWritable(temporaryPath, "wx", 384);
242
+ } catch (error) {
243
+ if (signal !== void 0 && isAborted(signal))
244
+ throwCancellation(signal, temporaryPath, [], path, temporaryPath, false);
245
+ throwDurable(failure("open_file", temporaryPath, error), [], path, temporaryPath, false);
246
+ }
247
+ const writeResult = await writeSyncClose(handle, temporaryPath, data, signal);
248
+ if (writeResult.primaryFailure !== void 0) {
249
+ await removeTemporary(operations, temporaryPath, writeResult.cleanupFailures);
250
+ throwDurable(writeResult.primaryFailure, writeResult.cleanupFailures, path, temporaryPath, false);
251
+ }
252
+ if (writeResult.cancelled && signal !== void 0) {
253
+ await removeTemporary(operations, temporaryPath, writeResult.cleanupFailures);
254
+ throwCancellation(
255
+ signal,
256
+ temporaryPath,
257
+ writeResult.cleanupFailures,
258
+ path,
259
+ temporaryPath,
260
+ false
261
+ );
262
+ }
263
+ const renameResult = await renameWithWindowsContention(
264
+ operations,
265
+ temporaryPath,
266
+ path,
267
+ signal
268
+ );
269
+ if (renameResult.cancelled && signal !== void 0) {
270
+ const cleanupFailures = [];
271
+ await removeTemporary(operations, temporaryPath, cleanupFailures);
272
+ throwCancellation(signal, temporaryPath, cleanupFailures, path, temporaryPath, false);
273
+ }
274
+ if (renameResult.error !== void 0) {
275
+ const cleanupFailures = [];
276
+ await removeTemporary(operations, temporaryPath, cleanupFailures);
277
+ throwDurable(
278
+ failure("rename_file", path, renameResult.error),
279
+ cleanupFailures,
280
+ path,
281
+ temporaryPath,
282
+ false
283
+ );
284
+ }
285
+ await syncDirectoryAfterRename(operations, path, temporaryPath);
286
+ if (signal !== void 0 && isAborted(signal)) {
287
+ throwCancellation(signal, path, [], path, temporaryPath, true);
288
+ }
289
+ }
290
+ __name(replaceWithOperations, "replaceWithOperations");
291
+ var WINDOWS_RENAME_CONTENTION_CODES = /* @__PURE__ */ new Set([
292
+ "EPERM",
293
+ "EACCES",
294
+ "EBUSY"
295
+ ]);
296
+ var WINDOWS_RENAME_ATTEMPTS = 10;
297
+ var WINDOWS_RENAME_RETRY_DELAY_MS = 20;
298
+ function delay(ms, signal) {
299
+ if (isAborted(signal)) return Promise.resolve();
300
+ return new Promise((resolve) => {
301
+ const timer = setTimeout(() => {
302
+ signal?.removeEventListener("abort", aborted);
303
+ resolve();
304
+ }, ms);
305
+ const aborted = /* @__PURE__ */ __name(() => {
306
+ clearTimeout(timer);
307
+ resolve();
308
+ }, "aborted");
309
+ signal?.addEventListener("abort", aborted, { once: true });
310
+ });
311
+ }
312
+ __name(delay, "delay");
313
+ async function renameWithWindowsContention(operations, temporaryPath, targetPath, signal) {
314
+ const attempts = operations.platform === "win32" ? WINDOWS_RENAME_ATTEMPTS : 1;
315
+ let lastError;
316
+ for (let attempt = 1; attempt <= attempts; attempt++) {
317
+ if (isAborted(signal)) return { error: void 0, cancelled: true };
318
+ try {
319
+ await operations.rename(temporaryPath, targetPath);
320
+ return { error: void 0, cancelled: false };
321
+ } catch (error) {
322
+ lastError = error;
323
+ if (isAborted(signal)) return { error: void 0, cancelled: true };
324
+ const code = nativeCodeForCause(error);
325
+ const retryable = operations.platform === "win32" && code !== void 0 && WINDOWS_RENAME_CONTENTION_CODES.has(code);
326
+ if (!retryable || attempt === attempts) return { error, cancelled: false };
327
+ await delay(WINDOWS_RENAME_RETRY_DELAY_MS * attempt, signal);
328
+ }
329
+ }
330
+ return { error: lastError, cancelled: false };
331
+ }
332
+ __name(renameWithWindowsContention, "renameWithWindowsContention");
333
+ function temporaryPathForTarget(target) {
334
+ return join(
335
+ dirname(target),
336
+ `.${basename(target)}.${String(process.pid)}.${randomBytes(6).toString("hex")}.tmp`
337
+ );
338
+ }
339
+ __name(temporaryPathForTarget, "temporaryPathForTarget");
340
+ var nodeOperations = {
341
+ platform: process.platform,
342
+ async openWritable(path, flag, mode) {
343
+ if (mode === void 0) return nodeOpen(path, flag);
344
+ return nodeOpen(path, flag, mode);
345
+ },
346
+ async openDirectory(path) {
347
+ return nodeOpen(path, "r");
348
+ },
349
+ async rename(source, target) {
350
+ await nodeRename(source, target);
351
+ },
352
+ async remove(path) {
353
+ await nodeRm(path, { force: true });
354
+ },
355
+ temporaryPath: temporaryPathForTarget
356
+ };
357
+ var defaultWriter = createDurableFileWriter(nodeOperations);
358
+ function createDurableFileWriter(operations) {
359
+ return {
360
+ async write(path, data, options = {}) {
361
+ await writeWithOperations(operations, path, data, options);
362
+ },
363
+ async replace(path, data, options = {}) {
364
+ await replaceWithOperations(operations, path, data, options);
365
+ }
366
+ };
367
+ }
368
+ __name(createDurableFileWriter, "createDurableFileWriter");
369
+ async function writeFileDurable(path, data, options = {}) {
370
+ await defaultWriter.write(path, data, options);
371
+ }
372
+ __name(writeFileDurable, "writeFileDurable");
373
+ async function replaceFileDurable(path, data, options = {}) {
374
+ await defaultWriter.replace(path, data, options);
375
+ }
376
+ __name(replaceFileDurable, "replaceFileDurable");
377
+
378
+ export {
379
+ writeFileDurable,
380
+ replaceFileDurable
381
+ };