@burdenoff/fe-libs 2026.1007.5 → 2026.1008.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 (119) hide show
  1. package/dist/shared/assistant/api.d.ts +11 -0
  2. package/dist/shared/assistant/api.d.ts.map +1 -1
  3. package/dist/shared/assistant/api.js +6 -2
  4. package/dist/shared/assistant/attachmentCommit.d.ts +175 -0
  5. package/dist/shared/assistant/attachmentCommit.d.ts.map +1 -0
  6. package/dist/shared/assistant/attachmentCommit.js +638 -0
  7. package/dist/shared/assistant/attachments.d.ts +39 -19
  8. package/dist/shared/assistant/attachments.d.ts.map +1 -1
  9. package/dist/shared/assistant/conversation.d.ts +14 -0
  10. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  11. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts +8 -1
  12. package/dist/shared/assistant/createSandboxAssistantTransport.d.ts.map +1 -1
  13. package/dist/shared/assistant/createSandboxAssistantTransport.js +70 -51
  14. package/dist/shared/assistant/history/historyEngine.js +280 -280
  15. package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -1
  16. package/dist/shared/assistant/history/historyMapping.js +19 -12
  17. package/dist/shared/assistant/i18nManifest.d.ts +23 -2
  18. package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
  19. package/dist/shared/assistant/i18nManifest.js +26 -3
  20. package/dist/shared/assistant/index.d.ts +9 -0
  21. package/dist/shared/assistant/index.d.ts.map +1 -1
  22. package/dist/shared/assistant/localUiCommandCopy.d.ts +23 -0
  23. package/dist/shared/assistant/localUiCommandCopy.d.ts.map +1 -1
  24. package/dist/shared/assistant/localUiCommandCopy.js +60 -23
  25. package/dist/shared/assistant/localUiCommands.d.ts +29 -0
  26. package/dist/shared/assistant/localUiCommands.d.ts.map +1 -1
  27. package/dist/shared/assistant/localUiCommands.js +18 -7
  28. package/dist/shared/assistant/types.d.ts +19 -8
  29. package/dist/shared/assistant/types.d.ts.map +1 -1
  30. package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
  31. package/dist/shared/assistant/ui/AssistantChatArea.js +1624 -1266
  32. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +18 -3
  33. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts.map +1 -1
  34. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.js +1 -1
  35. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts +5 -0
  36. package/dist/shared/assistant/ui/AssistantMessageItem.d.ts.map +1 -1
  37. package/dist/shared/assistant/ui/AssistantMessageItem.js +89 -84
  38. package/dist/shared/assistant/ui/AssistantMessageList.d.ts +5 -0
  39. package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
  40. package/dist/shared/assistant/ui/AssistantMessageList.js +26 -25
  41. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts +45 -0
  42. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts.map +1 -0
  43. package/dist/shared/assistant/ui/AssistantUiOfferLink.js +56 -0
  44. package/dist/shared/assistant/ui/assistantOverlayState.d.ts +9 -0
  45. package/dist/shared/assistant/ui/assistantOverlayState.d.ts.map +1 -1
  46. package/dist/shared/assistant/ui/assistantOverlayState.js +37 -28
  47. package/dist/shared/assistant/ui/composer/AssistantAttachmentChips.d.ts +8 -5
  48. package/dist/shared/assistant/ui/composer/AssistantAttachmentChips.d.ts.map +1 -1
  49. package/dist/shared/assistant/ui/composer/AssistantAttachmentChips.js +26 -9
  50. package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts +3 -2
  51. package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts.map +1 -1
  52. package/dist/shared/assistant/ui/composer/AssistantComposer.js +214 -125
  53. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.d.ts.map +1 -1
  54. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.js +1 -1
  55. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +15 -0
  56. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts.map +1 -1
  57. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.js +127 -118
  58. package/dist/shared/assistant/ui/voice/VoiceConversationView.d.ts +6 -1
  59. package/dist/shared/assistant/ui/voice/VoiceConversationView.d.ts.map +1 -1
  60. package/dist/shared/assistant/ui/voice/VoiceConversationView.js +7 -7
  61. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts +6 -1
  62. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts.map +1 -1
  63. package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.js +15 -12
  64. package/dist/shared/assistant/uiActions/actOnResolve.d.ts +108 -0
  65. package/dist/shared/assistant/uiActions/actOnResolve.d.ts.map +1 -0
  66. package/dist/shared/assistant/uiActions/actOnResolve.js +51 -0
  67. package/dist/shared/assistant/uiActions/linkContext.d.ts +29 -0
  68. package/dist/shared/assistant/uiActions/linkContext.d.ts.map +1 -1
  69. package/dist/shared/assistant/uiActions/linkContext.js +37 -10
  70. package/dist/shared/assistant/uiActions/navIntent.d.ts +58 -0
  71. package/dist/shared/assistant/uiActions/navIntent.d.ts.map +1 -0
  72. package/dist/shared/assistant/uiActions/navIntent.js +79 -0
  73. package/dist/shared/assistant/uiActions/navigateAction.d.ts +6 -1
  74. package/dist/shared/assistant/uiActions/navigateAction.d.ts.map +1 -1
  75. package/dist/shared/assistant/uiActions/navigateAction.js +18 -14
  76. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts +16 -2
  77. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts.map +1 -1
  78. package/dist/shared/assistant/uiActions/navigationOutcome.js +6 -2
  79. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts +39 -0
  80. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts.map +1 -0
  81. package/dist/shared/assistant/uiActions/offerYesOnSurface.js +34 -0
  82. package/dist/shared/assistant/uiActions/uiCatalogue.d.ts +14 -0
  83. package/dist/shared/assistant/uiActions/uiCatalogue.d.ts.map +1 -1
  84. package/dist/shared/assistant/uiActions/uiCatalogue.js +23 -3
  85. package/dist/shared/assistant/uiActions/uiOffers.d.ts +249 -0
  86. package/dist/shared/assistant/uiActions/uiOffers.d.ts.map +1 -0
  87. package/dist/shared/assistant/uiActions/uiOffers.js +195 -0
  88. package/dist/shared/assistant/useAssistantAttachments.d.ts +20 -2
  89. package/dist/shared/assistant/useAssistantAttachments.d.ts.map +1 -1
  90. package/dist/shared/assistant/useAssistantAttachments.js +146 -202
  91. package/dist/shared/assistant/useAttachmentCommitter.d.ts +17 -0
  92. package/dist/shared/assistant/useAttachmentCommitter.d.ts.map +1 -0
  93. package/dist/shared/assistant/useAttachmentCommitter.js +41 -0
  94. package/dist/shared/assistant/voiceCommit.d.ts +36 -0
  95. package/dist/shared/assistant/voiceCommit.d.ts.map +1 -0
  96. package/dist/shared/assistant/voiceCommit.js +24 -0
  97. package/dist/shared/assistant/writeProposals.d.ts +6 -0
  98. package/dist/shared/assistant/writeProposals.d.ts.map +1 -1
  99. package/dist/shared/assistant/writeReplyBinder.d.ts +40 -0
  100. package/dist/shared/assistant/writeReplyBinder.d.ts.map +1 -1
  101. package/dist/shared/assistant/writeReplyBinder.js +100 -83
  102. package/dist/shared/assistant/writeReplySend.d.ts +14 -0
  103. package/dist/shared/assistant/writeReplySend.d.ts.map +1 -1
  104. package/dist/shared/assistant/writeReplySend.js +32 -29
  105. package/dist/shared/hooks/index.d.ts +2 -0
  106. package/dist/shared/hooks/index.d.ts.map +1 -1
  107. package/dist/shared/navigation/unsavedChanges.d.ts +83 -0
  108. package/dist/shared/navigation/unsavedChanges.d.ts.map +1 -0
  109. package/dist/shared/navigation/unsavedChanges.js +46 -0
  110. package/dist/shared-assistant.js +247 -238
  111. package/dist/shared-hooks.js +10 -9
  112. package/dist/shared.js +20 -19
  113. package/dist/storage/filesPort.d.ts +111 -0
  114. package/dist/storage/filesPort.d.ts.map +1 -0
  115. package/dist/storage/filesPort.js +262 -0
  116. package/dist/storage/index.d.ts +2 -0
  117. package/dist/storage/index.d.ts.map +1 -1
  118. package/dist/storage/index.js +9 -8
  119. package/package.json +1 -1
@@ -0,0 +1,638 @@
1
+ import { classifyFilesError as e, extractErrorMessage as t } from "../../storage/retryPolicy.js";
2
+ import { FilesPortAbortError as n, FilesPortError as r } from "../../storage/filesPort.js";
3
+ //#region src/shared/assistant/attachmentCommit.ts
4
+ var i = 5 * 1024 * 1024, a = {
5
+ concurrency: 2,
6
+ gatewayAttempts: 2,
7
+ gatewayRetryDelayMs: 1500,
8
+ putRetries: 1,
9
+ putRetryDelayMs: 1e3,
10
+ lookupAttempts: 2,
11
+ lookupRetryDelayMs: 500,
12
+ completeReissues: 1,
13
+ settleGraceMs: 3e3,
14
+ discardAttempts: 2,
15
+ finalDrainRounds: 3,
16
+ finalDrainDelayMs: 5e3
17
+ }, o = {
18
+ quotaNotProvisioned: "QUOTA_NOT_PROVISIONED",
19
+ quotaExceeded: "QUOTA_EXCEEDED",
20
+ tooLarge: "ATTACHMENT_TOO_LARGE_FOR_DIRECT_UPLOAD",
21
+ noBytes: "ATTACHMENT_NO_BYTES",
22
+ noDownloadUrl: "ATTACHMENT_NO_DOWNLOAD_URL",
23
+ timeout: "ATTACHMENT_SAVE_TIMEOUT",
24
+ uploadFailed: "ATTACHMENT_UPLOAD_FAILED",
25
+ folderFailed: "ATTACHMENT_FOLDER_FAILED"
26
+ }, s = {
27
+ [o.quotaNotProvisioned]: "This workspace has no file storage, so the attachment could not be saved.",
28
+ [o.quotaExceeded]: "There is not enough file storage left for these attachments.",
29
+ [o.tooLarge]: "This file is over 5 MB and cannot be saved to Files.",
30
+ [o.noBytes]: "The file is empty or no longer available.",
31
+ [o.noDownloadUrl]: "The file was saved but could not be linked.",
32
+ [o.timeout]: "Saving took too long."
33
+ }, c = () => {};
34
+ function l(e, t) {
35
+ return new Promise((n) => {
36
+ if (t?.aborted) {
37
+ n();
38
+ return;
39
+ }
40
+ let r = () => {
41
+ clearTimeout(i), n();
42
+ }, i = setTimeout(() => {
43
+ t?.removeEventListener("abort", r), n();
44
+ }, e);
45
+ t?.addEventListener("abort", r, { once: !0 });
46
+ });
47
+ }
48
+ function u(e) {
49
+ return e instanceof n || e instanceof Error && e.name === "AbortError";
50
+ }
51
+ function d(e) {
52
+ return e instanceof r ? e.source : e;
53
+ }
54
+ function f(t) {
55
+ return e(d(t));
56
+ }
57
+ function p(e) {
58
+ let t = d(e);
59
+ if (!t || typeof t != "object") return [];
60
+ let n = t;
61
+ return (n.errors ?? n.graphQLErrors ?? []).map((e) => e.extensions?.code).filter((e) => typeof e == "string");
62
+ }
63
+ function m(e) {
64
+ return p(e)[0];
65
+ }
66
+ function h(e) {
67
+ if (p(e).length > 0) return !0;
68
+ let t = d(e), n = t && typeof t == "object" ? t.statusCode : void 0;
69
+ return typeof n == "number" && n >= 400 && n < 500 && n !== 408;
70
+ }
71
+ function g(e) {
72
+ return u(e) || f(e) !== null ? !0 : !h(e);
73
+ }
74
+ function _(e, n) {
75
+ return e instanceof r && e.message ? e.message : t(e) ?? n;
76
+ }
77
+ function v(e, t, r) {
78
+ return t.aborted ? (e.then((e) => r?.(e), c), Promise.reject(new n())) : new Promise((i, a) => {
79
+ let o = !1, s = () => {
80
+ o || (o = !0, a(new n()));
81
+ };
82
+ t.addEventListener("abort", s, { once: !0 }), e.then((e) => {
83
+ if (t.removeEventListener("abort", s), o) {
84
+ r?.(e);
85
+ return;
86
+ }
87
+ o = !0, i(e);
88
+ }, (e) => {
89
+ t.removeEventListener("abort", s), !o && (o = !0, a(e));
90
+ });
91
+ });
92
+ }
93
+ function y() {
94
+ let e = c, t = {
95
+ promise: new Promise((t) => {
96
+ e = t;
97
+ }),
98
+ settled: !1,
99
+ resolve: (n) => {
100
+ t.settled || (t.settled = !0, e(n));
101
+ }
102
+ };
103
+ return t;
104
+ }
105
+ function b(e) {
106
+ return e.includes(".") ? e.substring(e.lastIndexOf(".") + 1) : "";
107
+ }
108
+ function x(e, t) {
109
+ e.reason === "none" && (e.reason = t), e.abort();
110
+ }
111
+ function S(e) {
112
+ if (e.signal.aborted) throw new n();
113
+ }
114
+ async function C(e, t, n) {
115
+ for (let r = 1;; r += 1) {
116
+ S(e);
117
+ try {
118
+ return await v(t(), e.signal, n);
119
+ } catch (t) {
120
+ if (u(t) || e.signal.aborted || r >= e.policy.gatewayAttempts || f(t) === null) throw t;
121
+ await e.sleep(e.policy.gatewayRetryDelayMs, e.signal);
122
+ }
123
+ }
124
+ }
125
+ function w(e, t) {
126
+ return new Promise((r, i) => {
127
+ let a = !1, o = new AbortController();
128
+ t.then((e) => {
129
+ a = !0, o.abort(), r(e);
130
+ }, (e) => {
131
+ a = !0, o.abort(), i(e);
132
+ });
133
+ let s = () => {
134
+ e.sleep(e.policy.settleGraceMs, o.signal).then(() => {
135
+ a || o.signal.aborted || (a = !0, i(new n()));
136
+ });
137
+ };
138
+ e.signal.aborted ? s() : e.signal.addEventListener("abort", s, { once: !0 });
139
+ });
140
+ }
141
+ function T(e) {
142
+ if (!e) return {
143
+ state: "other",
144
+ status: "MISSING"
145
+ };
146
+ let t = e.status.toUpperCase();
147
+ return t === "FINALIZED" && e.fileId ? {
148
+ state: "finalized",
149
+ fileId: e.fileId
150
+ } : t === "IN_PROGRESS" || t === "PENDING" ? { state: "in-progress" } : {
151
+ state: "other",
152
+ status: t
153
+ };
154
+ }
155
+ async function E(e, t) {
156
+ for (let n = 1; n <= e.policy.lookupAttempts; n += 1) try {
157
+ return T(await e.port.getSession(t));
158
+ } catch (t) {
159
+ if (f(t) === null) break;
160
+ n < e.policy.lookupAttempts && await e.sleep(e.policy.lookupRetryDelayMs);
161
+ }
162
+ try {
163
+ let n = (await e.port.listSessions()).find((e) => e.id === t);
164
+ return n ? T(n) : { state: "unknown" };
165
+ } catch {
166
+ return { state: "unknown" };
167
+ }
168
+ }
169
+ function D(e, t, n) {
170
+ let r = Math.max(0, Math.min(100, Math.round(n)));
171
+ r !== t.lastProgress && (t.lastProgress = r, e.patch(t, { progress: r }));
172
+ }
173
+ async function O(e, t, n) {
174
+ let { attachment: i, blob: a } = t.draft;
175
+ if (!a) throw Error("no bytes");
176
+ let s = await C(e, () => e.port.initiate({
177
+ fileName: i.filename,
178
+ fileSize: a.size,
179
+ mimeType: i.mimeType,
180
+ extension: b(i.filename),
181
+ folderId: n
182
+ }), (t) => {
183
+ e.port.abort(t.sessionId).catch(c);
184
+ });
185
+ if (t.sessionId = s.sessionId, !s.uploadUrl) throw new k(o.tooLarge);
186
+ D(e, t, 5);
187
+ for (let n = 0;; n += 1) {
188
+ S(e);
189
+ try {
190
+ await e.port.put({
191
+ url: s.uploadUrl,
192
+ blob: a,
193
+ mimeType: i.mimeType,
194
+ signal: e.signal,
195
+ onProgress: (n) => D(e, t, 5 + n * 85)
196
+ });
197
+ return;
198
+ } catch (t) {
199
+ if (u(t) || e.signal.aborted || !(t instanceof r && (t.httpStatus === void 0 || t.httpStatus >= 500)) || n >= e.policy.putRetries) throw t;
200
+ await e.sleep(e.policy.putRetryDelayMs, e.signal);
201
+ }
202
+ }
203
+ }
204
+ var k = class extends Error {
205
+ code;
206
+ constructor(e, t) {
207
+ super(t ?? s[e] ?? e), this.code = e, this.name = "AttachmentCommitError";
208
+ }
209
+ };
210
+ async function A(e, t, n) {
211
+ let r = t.draft.blob, i = t.sessionId;
212
+ if (!r || !i) throw Error("not staged");
213
+ let a = {
214
+ sessionId: i,
215
+ fileSize: r.size,
216
+ folderId: n
217
+ };
218
+ t.completeIssued = !0;
219
+ let s, c;
220
+ try {
221
+ s = await w(e, e.port.complete(a));
222
+ } catch (e) {
223
+ c = e;
224
+ }
225
+ let l = 0;
226
+ for (; !s;) {
227
+ if (!g(c)) throw c;
228
+ if (e.signal.aborted) throw t.unresolved = !0, c;
229
+ let r = await E(e, i);
230
+ if (r.state === "finalized") {
231
+ t.fileId = r.fileId, s = {
232
+ fileId: r.fileId,
233
+ name: null,
234
+ folderId: n,
235
+ downloadUrl: null
236
+ };
237
+ break;
238
+ }
239
+ if (r.state === "in-progress" && !e.signal.aborted && f(c) !== null && l < e.policy.completeReissues) {
240
+ l += 1;
241
+ try {
242
+ s = await w(e, e.port.complete(a));
243
+ } catch (e) {
244
+ c = e;
245
+ }
246
+ continue;
247
+ }
248
+ throw (r.state === "unknown" || r.state === "in-progress" || u(c)) && (t.unresolved = !0), c;
249
+ }
250
+ t.fileId = s.fileId;
251
+ let d = s.downloadUrl ?? await C(e, () => e.port.getDownloadUrl(s.fileId)).catch((e) => {
252
+ if (u(e)) throw e;
253
+ return null;
254
+ });
255
+ if (!d) throw new k(o.noDownloadUrl);
256
+ t.downloadUrl = d, t.urlResolvedAt = e.now(), t.done = !0;
257
+ }
258
+ async function j(e, t) {
259
+ for (let n = 1;; n += 1) try {
260
+ return await t();
261
+ } catch (t) {
262
+ if (n >= e.policy.discardAttempts || f(t) === null) throw t;
263
+ await e.sleep(e.policy.gatewayRetryDelayMs);
264
+ }
265
+ }
266
+ async function M(e, t) {
267
+ try {
268
+ await j(e, () => e.port.deleteFile(t)) || e.store.entries.push({
269
+ kind: "file",
270
+ fileId: t
271
+ });
272
+ } catch {
273
+ e.store.entries.push({
274
+ kind: "file",
275
+ fileId: t
276
+ });
277
+ }
278
+ }
279
+ async function N(e, t) {
280
+ if (!t.handedOver) {
281
+ if (t.fileId) {
282
+ let n = t.fileId;
283
+ t.fileId = void 0, t.done = !1, await M(e, n);
284
+ return;
285
+ }
286
+ if (t.sessionId) {
287
+ if (!t.completeIssued) {
288
+ try {
289
+ await e.port.abort(t.sessionId);
290
+ } catch {}
291
+ return;
292
+ }
293
+ t.unresolved && (t.unresolved = !1, e.store.entries.push({
294
+ kind: "session",
295
+ sessionId: t.sessionId
296
+ }));
297
+ }
298
+ }
299
+ }
300
+ async function P(e, t, n = {}) {
301
+ for (; t.draining;) await t.draining;
302
+ let r = F(e, t, n);
303
+ t.draining = r;
304
+ try {
305
+ await r;
306
+ } finally {
307
+ t.draining === r && (t.draining = void 0);
308
+ }
309
+ }
310
+ async function F(e, t, n) {
311
+ let r = t.entries.splice(0, t.entries.length);
312
+ if (r.length === 0) return;
313
+ let i = {
314
+ port: e,
315
+ policy: {
316
+ ...a,
317
+ ...n.policy
318
+ },
319
+ sleep: n.sleep ?? l,
320
+ store: t
321
+ };
322
+ for (let e of r) {
323
+ if (e.kind === "file") {
324
+ await M(i, e.fileId);
325
+ continue;
326
+ }
327
+ let n = await E(i, e.sessionId);
328
+ n.state === "finalized" ? await M(i, n.fileId) : (n.state === "unknown" || n.state === "in-progress") && t.entries.push(e);
329
+ }
330
+ }
331
+ function I(e, t) {
332
+ let n = t instanceof k ? t : null;
333
+ return {
334
+ id: e.draft.attachment.id,
335
+ message: n ? n.message : _(t, "The attachment could not be saved."),
336
+ code: n ? n.code : m(t) ?? o.uploadFailed
337
+ };
338
+ }
339
+ function L(e) {
340
+ return !e.attachment.fileId && !e.attachment.inlineOnly;
341
+ }
342
+ async function R(e) {
343
+ let t = e.mode ?? "all-or-nothing", n = {
344
+ ...a,
345
+ ...e.policy
346
+ }, r = e.pendingDiscard ?? { entries: [] }, i = new AbortController(), o = {
347
+ port: e.port,
348
+ signal: i.signal,
349
+ abort: () => i.abort(),
350
+ reason: "none",
351
+ policy: n,
352
+ now: e.now ?? (() => Date.now()),
353
+ sleep: e.sleep ?? l,
354
+ patch: (t, n) => e.onChange?.(t.draft.attachment.id, n),
355
+ store: r
356
+ }, s = [];
357
+ for (let t of e.drafts) L(t) && s.push({
358
+ index: s.length,
359
+ draft: t,
360
+ completeIssued: !1,
361
+ unresolved: !1,
362
+ done: !1,
363
+ handedOver: !1,
364
+ stopped: !1,
365
+ lastProgress: -1
366
+ });
367
+ let c = new AbortController(), u = () => x(o, "cancelled");
368
+ e.signal?.aborted ? u() : e.signal?.addEventListener("abort", u, { once: !0 });
369
+ try {
370
+ s.length > 0 && await z(o, s, e, t, c);
371
+ } catch (e) {
372
+ for (let t of s) t.failure ??= I(t, e);
373
+ x(o, "failed");
374
+ } finally {
375
+ c.abort(), e.signal?.removeEventListener("abort", u);
376
+ }
377
+ return H(o, s, e, t);
378
+ }
379
+ async function z(e, t, i, a, s) {
380
+ let c = a === "all-or-nothing";
381
+ for (let e of t) {
382
+ let t = e.draft.blob;
383
+ !t || t.size === 0 ? e.failure = I(e, new k(o.noBytes)) : t.size > 5242880 && (e.failure = I(e, new k(o.tooLarge)));
384
+ }
385
+ if (c && t.some((e) => e.failure)) {
386
+ x(e, "failed");
387
+ return;
388
+ }
389
+ let l = t.filter((e) => !e.failure);
390
+ if (l.length === 0) return;
391
+ for (let t of l) e.patch(t, {
392
+ status: "uploading",
393
+ progress: 0,
394
+ saveError: void 0,
395
+ progressNote: void 0
396
+ }), t.lastProgress = 0;
397
+ i.budgetMs !== void 0 && e.sleep(i.budgetMs, s.signal).then(() => {
398
+ s.signal.aborted || x(e, "budget");
399
+ });
400
+ try {
401
+ await v(P(e.port, e.store, {
402
+ sleep: e.sleep,
403
+ policy: e.policy
404
+ }), e.signal);
405
+ let t = await V(e, l, c);
406
+ if (t) {
407
+ for (let e of l) e.failure = I(e, t);
408
+ x(e, "failed");
409
+ return;
410
+ }
411
+ if (l = l.filter((e) => !e.failure), l.length === 0) {
412
+ x(e, "failed");
413
+ return;
414
+ }
415
+ } catch (e) {
416
+ if (!u(e)) throw e;
417
+ return;
418
+ }
419
+ let d;
420
+ try {
421
+ d = (await C(e, () => e.port.ensureFolder(i.folderPath))).id;
422
+ } catch (t) {
423
+ if (!u(t)) {
424
+ let n = t instanceof r ? t : new k(o.folderFailed);
425
+ for (let e of l) e.failure = I(e, n);
426
+ x(e, "failed");
427
+ }
428
+ return;
429
+ }
430
+ let f = l.map(() => y()), p = 0, m = Array.from({ length: Math.min(B(e), l.length) }, async () => {
431
+ for (;;) {
432
+ if (e.signal.aborted) return;
433
+ let t = p;
434
+ p += 1;
435
+ let n = l[t];
436
+ if (!n) return;
437
+ try {
438
+ await O(e, n, d), f[t]?.resolve({ ok: !0 });
439
+ } catch (r) {
440
+ f[t]?.resolve({
441
+ ok: !1,
442
+ error: r
443
+ }), c && !u(r) && (n.failure = I(n, r), x(e, "failed"));
444
+ }
445
+ }
446
+ }), h = Promise.all(m).then(() => {
447
+ for (let e of f) e.resolve({
448
+ ok: !1,
449
+ error: new n()
450
+ });
451
+ });
452
+ await Promise.all([(async () => {
453
+ for (let t = 0; t < l.length; t += 1) {
454
+ let n = l[t], r = await f[t]?.promise;
455
+ if (!(!n || !r)) {
456
+ if (!r.ok) {
457
+ if (u(r.error)) {
458
+ if (n.stopped = !0, e.signal.aborted && c) break;
459
+ continue;
460
+ }
461
+ if (n.failure ??= I(n, r.error), c) {
462
+ x(e, "failed");
463
+ break;
464
+ }
465
+ continue;
466
+ }
467
+ if (e.signal.aborted) {
468
+ n.stopped = !0;
469
+ break;
470
+ }
471
+ try {
472
+ await A(e, n, d), D(e, n, 100);
473
+ } catch (t) {
474
+ if (u(t) ? n.stopped = !0 : (n.failure = I(n, t), c && x(e, "failed")), c) break;
475
+ }
476
+ }
477
+ }
478
+ })(), h]);
479
+ }
480
+ function B(e) {
481
+ return Math.max(1, Math.floor(e.policy.concurrency));
482
+ }
483
+ async function V(e, t, n) {
484
+ if (!e.port.getStorageQuota) return null;
485
+ let r;
486
+ try {
487
+ r = await v(e.port.getStorageQuota(), e.signal);
488
+ } catch (e) {
489
+ if (u(e)) throw e;
490
+ return null;
491
+ }
492
+ if (r.state === "not-provisioned") return new k(o.quotaNotProvisioned);
493
+ if (r.state === "ok" && r.remainingBytes !== null) {
494
+ let e = (e) => e.draft.blob?.size ?? 0;
495
+ if (t.reduce((t, n) => t + e(n), 0) > r.remainingBytes) {
496
+ let i = new k(o.quotaExceeded);
497
+ if (n) return i;
498
+ let a = r.remainingBytes;
499
+ for (let n of t) e(n) <= a ? a -= e(n) : n.failure = I(n, i);
500
+ }
501
+ }
502
+ return null;
503
+ }
504
+ async function H(e, t, n, r) {
505
+ let i = r === "all-or-nothing";
506
+ if (e.reason === "budget") for (let e of t) !e.done && !e.failure && (e.failure = I(e, new k(o.timeout)));
507
+ let a = e.reason === "cancelled", s = t.some((e) => e.failure), c = t.every((e) => e.done), l = !a && (i ? c && !s : !0), u = l ? t.filter((e) => !e.done) : t;
508
+ for (let t of u) await N(e, t);
509
+ for (let n of t) l && n.done ? e.patch(n, {
510
+ status: "ready",
511
+ fileId: n.fileId,
512
+ downloadUrl: n.downloadUrl,
513
+ urlResolvedAt: n.urlResolvedAt,
514
+ progress: void 0,
515
+ saveError: void 0,
516
+ progressNote: void 0
517
+ }) : e.patch(n, {
518
+ status: "ready",
519
+ progress: void 0,
520
+ progressNote: void 0,
521
+ saveError: a ? void 0 : n.failure?.message
522
+ });
523
+ let d = t.flatMap((e) => e.failure ? [e.failure] : []);
524
+ if (!l) return {
525
+ ok: !1,
526
+ cancelled: a,
527
+ failures: a ? [] : d,
528
+ message: a ? void 0 : d[0]?.message
529
+ };
530
+ let f = new Map(t.map((e) => [e.draft.attachment.id, e])), p = [];
531
+ for (let e of n.drafts) {
532
+ let t = f.get(e.attachment.id);
533
+ t ? t.done && p.push({
534
+ ...e.attachment,
535
+ status: "ready",
536
+ fileId: t.fileId,
537
+ downloadUrl: t.downloadUrl,
538
+ urlResolvedAt: t.urlResolvedAt,
539
+ progress: void 0,
540
+ saveError: void 0,
541
+ progressNote: void 0
542
+ }) : p.push(e.attachment);
543
+ }
544
+ let m = t.filter((e) => e.done);
545
+ return {
546
+ ok: !0,
547
+ attachments: p,
548
+ dropped: d,
549
+ handedOver: () => {
550
+ for (let e of m) e.handedOver = !0;
551
+ },
552
+ rollback: async () => {
553
+ for (let t of m) t.handedOver || (await N(e, t), e.patch(t, {
554
+ fileId: void 0,
555
+ downloadUrl: void 0,
556
+ urlResolvedAt: void 0
557
+ }));
558
+ }
559
+ };
560
+ }
561
+ function U(e) {
562
+ let t = { entries: [] }, n = null, r = null, i = /* @__PURE__ */ new Set(), o = (e) => {
563
+ let t = e.catch(() => void 0).then(() => {
564
+ i.delete(t);
565
+ });
566
+ return i.add(t), e;
567
+ };
568
+ return {
569
+ commit: (i, a = {}) => {
570
+ if (n) return n;
571
+ let s = new AbortController();
572
+ r = s;
573
+ let c = a.signal;
574
+ c?.aborted ? s.abort() : c?.addEventListener("abort", () => s.abort(), { once: !0 });
575
+ let l = R({
576
+ port: e.port,
577
+ folderPath: e.folderPath,
578
+ drafts: i,
579
+ signal: s.signal,
580
+ mode: a.mode,
581
+ budgetMs: a.budgetMs,
582
+ onChange: e.onChange,
583
+ pendingDiscard: t,
584
+ policy: e.policy,
585
+ now: e.now,
586
+ sleep: e.sleep
587
+ }).then((e) => e.ok ? {
588
+ ...e,
589
+ rollback: () => o(e.rollback())
590
+ } : e).finally(() => {
591
+ n = null, r = null;
592
+ });
593
+ return n = l, l;
594
+ },
595
+ cancel: () => r?.abort(),
596
+ get isCommitting() {
597
+ return n !== null;
598
+ },
599
+ discardPending: async () => {
600
+ let r = n;
601
+ for (r && await r.catch(() => void 0); i.size > 0;) await Promise.all([...i]);
602
+ let o = () => P(e.port, t, {
603
+ sleep: e.sleep,
604
+ policy: e.policy
605
+ });
606
+ await o();
607
+ let s = {
608
+ ...a,
609
+ ...e.policy
610
+ }, c = e.sleep ?? l;
611
+ for (let e = 1; e <= s.finalDrainRounds && t.entries.length > 0; e += 1) await c(s.finalDrainDelayMs * e), await o();
612
+ },
613
+ get pendingDiscard() {
614
+ return t.entries;
615
+ }
616
+ };
617
+ }
618
+ var W = 1800 * 1e3;
619
+ function G(e, t, n = W) {
620
+ return e.fileId ? e.urlResolvedAt === void 0 ? !0 : t - e.urlResolvedAt > n : !1;
621
+ }
622
+ async function K(e, t, n = Date.now()) {
623
+ return Promise.all(e.map(async (e) => {
624
+ if (!e.fileId || !G(e, n)) return e;
625
+ try {
626
+ let r = await t(e.fileId);
627
+ return r ? {
628
+ ...e,
629
+ downloadUrl: r,
630
+ urlResolvedAt: n
631
+ } : e;
632
+ } catch {
633
+ return e;
634
+ }
635
+ }));
636
+ }
637
+ //#endregion
638
+ export { o as ATTACHMENT_COMMIT_CODES, a as ATTACHMENT_COMMIT_POLICY, i as ATTACHMENT_DIRECT_UPLOAD_MAX_BYTES, W as ATTACHMENT_URL_MAX_AGE_MS, G as attachmentUrlIsStale, R as commitAttachments, U as createAttachmentCommitter, P as drainPendingDiscards, K as refreshStaleAttachmentUrls };