@burdenoff/fe-libs 2026.1030.3 → 2026.1030.4
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.
- package/dist/shared/assistant/abortSignal.d.ts +2 -0
- package/dist/shared/assistant/abortSignal.js +9 -0
- package/dist/shared/assistant/history/historyEngine.js +424 -423
- package/dist/shared/assistant/index.d.ts +1 -0
- package/dist/shared/assistant/speech/hostedTtsSpeechEngine.js +137 -136
- package/dist/shared/assistant/workflowApi.js +71 -70
- package/dist/shared-assistant.js +345 -344
- package/package.json +1 -1
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import { PROFILE_STORAGE_CHANGE_EVENT as e } from "../../providers/shell/ProfileStorageManager.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { throwIfAborted as t } from "../abortSignal.js";
|
|
3
|
+
import { coalesceUpdatePatch as n, historyFilterKey as r, isValidUpdatePatch as i, normaliseHistoryTitle as a } from "./historyControls.js";
|
|
4
|
+
import { isHistoryConversationBusy as o, setAssistantStorageFullHandler as s, setHistoryOpenFilterSource as c, setHistoryRenameSink as l, setHistoryStampSource as u } from "./stampRegistry.js";
|
|
5
|
+
import { useAssistantStore as d } from "../store.js";
|
|
6
|
+
import { getActorId as f, getWorkspaceId as ee } from "../context.js";
|
|
6
7
|
import { isTurnInFlight as p } from "../turnState.js";
|
|
7
|
-
import { AssistantHistoryControlsUnavailableError as
|
|
8
|
-
import { ASSISTANT_HISTORY_QUOTA_RETRY_MS as
|
|
8
|
+
import { AssistantHistoryControlsUnavailableError as m, AssistantHistorySearchUnavailableError as te } from "./historyTransportErrors.js";
|
|
9
|
+
import { ASSISTANT_HISTORY_QUOTA_RETRY_MS as ne, ASSISTANT_HISTORY_SCHEMA_PAUSE_MS as re, assistantHistoryBackoffMs as ie, classifyAssistantHistoryError as h, planAssistantHistoryRetry as ae } from "./historyErrors.js";
|
|
9
10
|
import "./historySearchQuery.js";
|
|
10
|
-
import { ASSISTANT_HISTORY_CONTROLS_RECHECK_MS as
|
|
11
|
-
import { assistantHistoryScopeKey as _, completeAssistantHistoryScope as
|
|
12
|
-
import { historyConvKeyOf as
|
|
13
|
-
import { fromHistoryEntry as
|
|
14
|
-
import { applyHistoryPage as
|
|
15
|
-
import { assistantHistoryGenerationOf as
|
|
16
|
-
import { assistantHistoryStore as
|
|
11
|
+
import { ASSISTANT_HISTORY_CONTROLS_RECHECK_MS as oe, createGatewayHistoryTransport as g } from "./historyApi.js";
|
|
12
|
+
import { assistantHistoryScopeKey as _, completeAssistantHistoryScope as se, isLegacyHistoryConvKey as ce } from "./historyTypes.js";
|
|
13
|
+
import { historyConvKeyOf as le, historyHeaderOf as v, historyScopeKeyOfStamp as y, materializeHistoryHeader as ue, selectHistoryEvictions as de } from "./historyList.js";
|
|
14
|
+
import { fromHistoryEntry as fe, historyEntriesMatchKind as pe, isHistoryClientId as me, toHistoryEntries as he } from "./historyMapping.js";
|
|
15
|
+
import { applyHistoryPage as ge, planHistoryEarlierLoad as _e, planHistoryOpenLoad as ve } from "./historyMerge.js";
|
|
16
|
+
import { assistantHistoryGenerationOf as ye, isCurrentAssistantHistoryGeneration as be, useAssistantHistoryStatus as xe } from "./historyStatus.js";
|
|
17
|
+
import { assistantHistoryStore as b, headerHasControls as Se } from "./historyStore.js";
|
|
17
18
|
//#region src/shared/assistant/history/historyEngine.ts
|
|
18
|
-
var
|
|
19
|
-
function
|
|
19
|
+
var Ce = 1e3, we = 3e4, Te = 2e3, Ee = 15e3, De = 5 * 6e4, Oe = 2e3, ke = 100, Ae = 10, je = 100, Me = 5, Ne = 3, Pe = 2, Fe = 10 * 6e4, Ie = [10, 0], Le = 3e4, x = 1440 * 60 * 1e3;
|
|
20
|
+
function S() {
|
|
20
21
|
let e = /* @__PURE__ */ new Map(), t = 0;
|
|
21
22
|
return {
|
|
22
23
|
now: () => Date.now(),
|
|
@@ -34,165 +35,165 @@ function C() {
|
|
|
34
35
|
}
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
|
-
function
|
|
38
|
+
function Re() {
|
|
38
39
|
let e = typeof navigator > "u" ? void 0 : navigator.locks;
|
|
39
40
|
return !e || typeof e.request != "function" ? null : { request: (t, n) => new Promise((r, i) => {
|
|
40
41
|
e.request(t, { ifAvailable: !0 }, (e) => n(e !== null).then(r, i)).catch(i);
|
|
41
42
|
}) };
|
|
42
43
|
}
|
|
43
|
-
function
|
|
44
|
+
function C(e, t) {
|
|
44
45
|
try {
|
|
45
46
|
return e();
|
|
46
47
|
} catch {
|
|
47
48
|
return t;
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
var
|
|
51
|
+
var ze = (e, t) => {
|
|
51
52
|
console.warn(`[assistant] history: ${e}`, t ?? "");
|
|
52
53
|
};
|
|
53
|
-
function
|
|
54
|
+
function Be(e) {
|
|
54
55
|
if (!e.titleLocked) return e;
|
|
55
56
|
let t = { ...e };
|
|
56
57
|
return delete t.titleLocked, t;
|
|
57
58
|
}
|
|
58
|
-
var
|
|
59
|
-
function
|
|
60
|
-
let { transport:
|
|
59
|
+
var Ve = (e) => e.entries.map((e) => e.clientMessageId);
|
|
60
|
+
function w(g) {
|
|
61
|
+
let { transport: b, storage: x, clock: S } = g, w = x.useStore, T = g.mainStore ?? d, E = g.status ?? xe, He = g.locks === void 0 ? Re() : g.locks, Ue = g.random ?? Math.random, We = () => C(g.readActorId ?? f, null), Ge = () => C(g.readWorkspaceId ?? ee, ""), Ke = g.isConversationBusy ?? o, D = g.log ?? ze, O = /* @__PURE__ */ new Map(), k = null, A = null, j = null, M = 0, qe = !1, Je = !1, Ye = !1, Xe = null, Ze = !1, Qe = !1, $e = 0, et = -Infinity, N = null, tt = !1, nt = /* @__PURE__ */ new Set(), rt = 0, it = !1, P = null, at = -Infinity, F = null, I = null, ot = /* @__PURE__ */ new Set(), L = /* @__PURE__ */ new Map(), R = /* @__PURE__ */ new Map(), z = /* @__PURE__ */ new Map(), st = /* @__PURE__ */ new Set(), ct = [], B = () => S.now(), V = () => A ? _(A) : null, lt = () => B() < M, ut = () => k !== null && j === null && x.isBoundToActiveProfile(), H = () => ut() && A !== null && !lt() && !qe, U = () => C(() => b.controlsAvailable(), !1), W = (e) => (st.add(e), e.finally(() => st.delete(e)).catch(() => void 0), e), G = (e, t, n, r = !1) => {
|
|
61
62
|
let i = B() + Math.max(0, t), a = z.get(e);
|
|
62
63
|
if (a && !r && a.at <= i) return;
|
|
63
|
-
a &&
|
|
64
|
-
let o =
|
|
64
|
+
a && S.clearTimeout(a.handle);
|
|
65
|
+
let o = S.setTimeout(() => {
|
|
65
66
|
z.get(e)?.handle === o && z.delete(e), n();
|
|
66
67
|
}, Math.max(0, t));
|
|
67
68
|
z.set(e, {
|
|
68
69
|
handle: o,
|
|
69
70
|
at: i
|
|
70
71
|
});
|
|
71
|
-
},
|
|
72
|
+
}, dt = (e) => {
|
|
72
73
|
let t = z.get(e);
|
|
73
|
-
t &&
|
|
74
|
-
}, K = () =>
|
|
75
|
-
let n =
|
|
74
|
+
t && S.clearTimeout(t.handle), z.delete(e);
|
|
75
|
+
}, K = () => ye(E.getState(), x.boundKey()), q = (e) => k !== null && x.isBoundToActiveProfile() && be(e, E.getState(), x.boundKey()), J = (e) => T.getState().conversations.find((t) => t.id === e), Y = (e) => p(T.getState().processingByConversationId[e]?.status) || C(() => Ke(e), !0), ft = (e, t) => {
|
|
76
|
+
let n = w.getState().scopes[e]?.headers[t];
|
|
76
77
|
if (n) return n;
|
|
77
|
-
let r =
|
|
78
|
+
let r = E.getState().olderHeaders;
|
|
78
79
|
return (r?.scopeKey === e ? r.headers[t] : void 0) || ((F && F.gen.scopeKey === e && q(F.gen) ? F.headers[t] : void 0) ?? null);
|
|
79
|
-
},
|
|
80
|
-
if (!
|
|
80
|
+
}, pt = (e) => {
|
|
81
|
+
if (!x.isBoundToActiveProfile()) return;
|
|
81
82
|
let t;
|
|
82
|
-
for (let n of
|
|
83
|
+
for (let n of w.getState().outbox) n.type === "update" && n.convKey === e && n.patch.title !== void 0 && (t = n.patch.title);
|
|
83
84
|
return t;
|
|
84
|
-
},
|
|
85
|
-
if (
|
|
86
|
-
if (
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
-
let e = W(
|
|
90
|
-
return
|
|
91
|
-
|
|
85
|
+
}, mt = (e, t) => pt(e) === void 0 ? t : void 0, ht = () => {
|
|
86
|
+
if (j) return j;
|
|
87
|
+
if (x.isBoundToActiveProfile()) return Promise.resolve(!0);
|
|
88
|
+
if (x.heldByNewerBuild() || x.activeProfileKey() === null) return Promise.resolve(!1);
|
|
89
|
+
E.getState().noteUnsavedDelete(void 0);
|
|
90
|
+
let e = W(x.rebind().then(() => x.isBoundToActiveProfile(), () => !1));
|
|
91
|
+
return j = e, e.then(() => {
|
|
92
|
+
j === e && (j = null);
|
|
92
93
|
}), e;
|
|
93
|
-
},
|
|
94
|
+
}, gt = (e) => {
|
|
94
95
|
let t = e ? _(e) : null, n = t !== V();
|
|
95
|
-
|
|
96
|
-
!t ||
|
|
96
|
+
A = e, E.getState().setHistoryScope(k, k === null ? null : t), !(!n || k === null) && (qe = !1, dt("auth"), $e = 0, et = -Infinity, N = null, I = null, P = null, at = -Infinity, L.clear(), W(ht().then((t) => {
|
|
97
|
+
!t || A !== e || (_t(), vt(), $("scope"), Q());
|
|
97
98
|
})));
|
|
98
99
|
}, X = () => {
|
|
99
|
-
if (
|
|
100
|
-
let e =
|
|
100
|
+
if (k === null) return;
|
|
101
|
+
let e = se(We(), Ge(), k);
|
|
101
102
|
if ((e ? _(e) : null) !== V()) {
|
|
102
|
-
|
|
103
|
+
gt(e);
|
|
103
104
|
return;
|
|
104
105
|
}
|
|
105
|
-
let t =
|
|
106
|
-
if (t === null || t ===
|
|
107
|
-
|
|
106
|
+
let t = x.activeProfileKey();
|
|
107
|
+
if (t === null || t === x.boundKey()) {
|
|
108
|
+
_t();
|
|
108
109
|
return;
|
|
109
110
|
}
|
|
110
|
-
W(
|
|
111
|
-
e && (
|
|
111
|
+
W(ht().then((e) => {
|
|
112
|
+
e && (vt(), _t(), $("bind"), Q());
|
|
112
113
|
}));
|
|
113
114
|
};
|
|
114
|
-
function
|
|
115
|
+
function _t() {
|
|
115
116
|
let e = V();
|
|
116
117
|
if (e === null) return;
|
|
117
|
-
let t =
|
|
118
|
-
!n?.sync ||
|
|
118
|
+
let t = T.getState(), n = t.conversations.find((e) => e.id === t.activeConversationId);
|
|
119
|
+
!n?.sync || y(n.sync) === e || Y(n.id) || t.setActiveConversation(null);
|
|
119
120
|
}
|
|
120
|
-
function
|
|
121
|
-
if (!
|
|
122
|
-
let e =
|
|
123
|
-
t && Object.keys(t.headers).some((t) => t in e) &&
|
|
121
|
+
function vt() {
|
|
122
|
+
if (!x.isBoundToActiveProfile()) return;
|
|
123
|
+
let e = w.getState().tombstones, t = E.getState().olderHeaders;
|
|
124
|
+
t && Object.keys(t.headers).some((t) => t in e) && E.getState().setOlderHeaders({
|
|
124
125
|
...t,
|
|
125
126
|
headers: Object.fromEntries(Object.entries(t.headers).filter(([t]) => !(t in e)))
|
|
126
127
|
}), F && Object.keys(F.headers).some((t) => t in e) && (F = {
|
|
127
128
|
gen: F.gen,
|
|
128
129
|
headers: Object.fromEntries(Object.entries(F.headers).filter(([t]) => !(t in e)))
|
|
129
130
|
});
|
|
130
|
-
let n =
|
|
131
|
+
let n = T.getState(), r = n.conversations.filter((t) => {
|
|
131
132
|
let n = e[t.id];
|
|
132
|
-
return t.sync !== void 0 && n !== void 0 &&
|
|
133
|
+
return t.sync !== void 0 && n !== void 0 && y(t.sync) === n.scopeKey;
|
|
133
134
|
}).map((e) => e.id);
|
|
134
135
|
if (r.length === 0) return;
|
|
135
136
|
let i = n.activeConversationId;
|
|
136
137
|
n.removeConversationsSilently(r);
|
|
137
|
-
for (let e of r)
|
|
138
|
+
for (let e of r) E.getState().noteRemoteDelete({
|
|
138
139
|
conversationId: e,
|
|
139
140
|
wasActive: e === i,
|
|
140
141
|
at: B()
|
|
141
142
|
});
|
|
142
143
|
}
|
|
143
|
-
function
|
|
144
|
-
let r =
|
|
144
|
+
function yt(e, t, n) {
|
|
145
|
+
let r = w.getState();
|
|
145
146
|
r.recordHistoryTombstone(e, {
|
|
146
147
|
scopeKey: t,
|
|
147
148
|
at: B(),
|
|
148
149
|
confirmed: !0,
|
|
149
150
|
serverId: n
|
|
150
|
-
}), r.dropHistoryItems(e, () => !0, B()),
|
|
151
|
+
}), r.dropHistoryItems(e, () => !0, B()), vt();
|
|
151
152
|
}
|
|
152
153
|
function Z(e) {
|
|
153
|
-
|
|
154
|
+
E.getState().setHistoryPaused(lt() ? M : void 0, e.class);
|
|
154
155
|
}
|
|
155
|
-
function
|
|
156
|
-
|
|
157
|
-
|
|
156
|
+
function bt(e, t) {
|
|
157
|
+
M = Math.max(M, B() + e), E.getState().setHistoryPaused(M, t.class), G("pause", M - B(), () => {
|
|
158
|
+
E.getState().setHistoryPaused(void 0, t.class), $("resume"), Q();
|
|
158
159
|
}, !0);
|
|
159
160
|
}
|
|
160
|
-
function
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
function xt(e) {
|
|
162
|
+
qe = !0, Z(e), G("auth", De, () => {
|
|
163
|
+
qe = !1, $("auth-recheck"), Q();
|
|
163
164
|
}, !0);
|
|
164
165
|
}
|
|
165
|
-
function
|
|
166
|
+
function St(e) {
|
|
166
167
|
switch (e.class) {
|
|
167
|
-
case "schema-unavailable": return
|
|
168
|
-
case "auth": return
|
|
168
|
+
case "schema-unavailable": return bt(re, e), !0;
|
|
169
|
+
case "auth": return xt(e), !0;
|
|
169
170
|
case "scope-inactive": return Z(e), X(), !0;
|
|
170
171
|
case "controls-unavailable": return Z(e), !0;
|
|
171
172
|
default: return Z(e), !1;
|
|
172
173
|
}
|
|
173
174
|
}
|
|
174
|
-
let
|
|
175
|
-
if (
|
|
175
|
+
let Ct = (e) => e.product === k && We() === e.actorId, wt = (e, t, n, r) => {
|
|
176
|
+
if (k === null) return;
|
|
176
177
|
let i = J(e), a = i?.sync;
|
|
177
|
-
if (!i || !a || a.origin !== "created" && a.origin !== "remote" || !
|
|
178
|
+
if (!i || !a || a.origin !== "created" && a.origin !== "remote" || !Ct(a)) return;
|
|
178
179
|
if (r !== a.workspaceId) {
|
|
179
|
-
|
|
180
|
+
T.getState().patchConversationSync(e, (e) => ({
|
|
180
181
|
...e,
|
|
181
182
|
blocked: "scope"
|
|
182
183
|
}));
|
|
183
184
|
return;
|
|
184
185
|
}
|
|
185
186
|
let o = t.map((e) => i.messages.find((t) => t.id === e));
|
|
186
|
-
if (o.length === 0 || !
|
|
187
|
+
if (o.length === 0 || !me(e)) return;
|
|
187
188
|
let s = o.filter((e) => e !== void 0);
|
|
188
189
|
if (s.length !== o.length) return;
|
|
189
|
-
let c =
|
|
190
|
+
let c = he(s, {
|
|
190
191
|
productId: a.product,
|
|
191
192
|
clientConversationId: e,
|
|
192
193
|
kind: n
|
|
193
194
|
});
|
|
194
|
-
if (!
|
|
195
|
-
|
|
195
|
+
if (!pe(n, c)) {
|
|
196
|
+
D("a committed turn does not have the shape the server stores; kept on this device", {
|
|
196
197
|
kind: n,
|
|
197
198
|
roles: c.map((e) => e.role)
|
|
198
199
|
});
|
|
@@ -201,43 +202,43 @@ function T(g) {
|
|
|
201
202
|
let l = {
|
|
202
203
|
id: `save:${e}:${t.join("+")}`,
|
|
203
204
|
type: "save",
|
|
204
|
-
scopeKey:
|
|
205
|
+
scopeKey: y(a),
|
|
205
206
|
convKey: e,
|
|
206
207
|
kind: n,
|
|
207
208
|
entries: c,
|
|
208
209
|
attempts: 0
|
|
209
210
|
}, u = () => {
|
|
210
|
-
if (!
|
|
211
|
-
let n =
|
|
212
|
-
e in n.tombstones || (n.enqueueHistoryItem(l),
|
|
211
|
+
if (!x.isBoundToActiveProfile() || !Ct(a)) return;
|
|
212
|
+
let n = w.getState();
|
|
213
|
+
e in n.tombstones || (n.enqueueHistoryItem(l), w.getState().outbox.some((e) => e.id === l.id) && (T.getState().markHistoryState(e, t, "pending"), Q()));
|
|
213
214
|
}, d = () => {
|
|
214
|
-
|
|
215
|
-
}, f =
|
|
215
|
+
ut() ? u() : W(ht().then((e) => e ? u() : void 0));
|
|
216
|
+
}, f = T.getState().processingByConversationId[e];
|
|
216
217
|
if (n === "NOTE" && p(f?.status)) {
|
|
217
218
|
R.set(e, [...R.get(e) ?? [], d]);
|
|
218
219
|
return;
|
|
219
220
|
}
|
|
220
221
|
d();
|
|
221
222
|
};
|
|
222
|
-
function
|
|
223
|
+
function Tt(e) {
|
|
223
224
|
for (let [t, n] of [...R]) p(e.processingByConversationId[t]?.status) || (R.delete(t), W(Promise.resolve().then(() => {
|
|
224
|
-
if (
|
|
225
|
+
if (k !== null) for (let e of n) e();
|
|
225
226
|
})));
|
|
226
227
|
}
|
|
227
|
-
let
|
|
228
|
-
let t =
|
|
229
|
-
if (n && !r ||
|
|
228
|
+
let Et = (e) => {
|
|
229
|
+
let t = T.getState(), n = t.conversations.find((t) => t.id === e), r = n?.sync, i = V();
|
|
230
|
+
if (n && !r || k === null || !x.isBoundToActiveProfile()) {
|
|
230
231
|
n && t.deleteConversation(e);
|
|
231
232
|
return;
|
|
232
233
|
}
|
|
233
|
-
let a = r ?
|
|
234
|
+
let a = r ? y(r) : i;
|
|
234
235
|
if (a === null) {
|
|
235
236
|
n && t.deleteConversation(e);
|
|
236
237
|
return;
|
|
237
238
|
}
|
|
238
|
-
let o =
|
|
239
|
+
let o = ft(a, e);
|
|
239
240
|
if (!n && !o) return;
|
|
240
|
-
let s = r?.origin === "legacy" || o?.legacy === !0 ||
|
|
241
|
+
let s = r?.origin === "legacy" || o?.legacy === !0 || ce(e), c = r?.serverId ?? o?.serverId ?? (ce(e) ? e.slice(7) : void 0), l = w.getState(), u = B(), d = !s || c ? {
|
|
241
242
|
id: `delete:${e}:${u}`,
|
|
242
243
|
type: "delete",
|
|
243
244
|
scopeKey: a,
|
|
@@ -246,143 +247,143 @@ function T(g) {
|
|
|
246
247
|
...c ? { serverId: c } : {},
|
|
247
248
|
attempts: 0
|
|
248
249
|
} : null;
|
|
249
|
-
n &&
|
|
250
|
+
n && T.getState().deleteConversation(e), l.recordHistoryDelete(e, {
|
|
250
251
|
scopeKey: a,
|
|
251
252
|
at: u,
|
|
252
253
|
confirmed: d === null,
|
|
253
254
|
...c ? { serverId: c } : {}
|
|
254
|
-
}, d), d &&
|
|
255
|
+
}, d), d && x.persistFailing() && E.getState().noteUnsavedDelete({
|
|
255
256
|
conversationId: e,
|
|
256
257
|
at: u
|
|
257
258
|
}), Q();
|
|
258
|
-
},
|
|
259
|
-
let
|
|
260
|
-
if (
|
|
261
|
-
let o =
|
|
262
|
-
...
|
|
263
|
-
title:
|
|
259
|
+
}, Dt = (e, t) => {
|
|
260
|
+
let r = V();
|
|
261
|
+
if (k === null || r === null || !A || !x.isBoundToActiveProfile()) return !1;
|
|
262
|
+
let o = t.title === void 0 ? { ...t } : {
|
|
263
|
+
...t,
|
|
264
|
+
title: a(t.title)
|
|
264
265
|
};
|
|
265
|
-
if (!
|
|
266
|
-
let s =
|
|
266
|
+
if (!i(o)) return !1;
|
|
267
|
+
let s = w.getState();
|
|
267
268
|
if (e in s.tombstones) return !1;
|
|
268
269
|
let c = J(e), l = c?.sync;
|
|
269
|
-
if (c && !l || l && (
|
|
270
|
-
let u =
|
|
270
|
+
if (c && !l || l && (y(l) !== r || !Ct(l))) return !1;
|
|
271
|
+
let u = ft(r, e);
|
|
271
272
|
if (!c && (!u || u.gone)) return !1;
|
|
272
|
-
let d = l?.origin === "legacy" || u?.legacy === !0 ||
|
|
273
|
+
let d = l?.origin === "legacy" || u?.legacy === !0 || ce(e), f = l?.serverId ?? u?.serverId ?? (ce(e) ? e.slice(7) : void 0);
|
|
273
274
|
if (d && !f) return !1;
|
|
274
|
-
let
|
|
275
|
-
if (!d && !f && !u && !
|
|
276
|
-
let
|
|
277
|
-
for (let t of s.outbox) t.type === "update" && t.convKey === e && t.scopeKey ===
|
|
278
|
-
let te = m && !
|
|
279
|
-
|
|
275
|
+
let ee = s.outbox.some((t) => t.type === "save" && t.convKey === e && t.scopeKey === r);
|
|
276
|
+
if (!d && !f && !u && !ee) return !1;
|
|
277
|
+
let p = B(), m = null;
|
|
278
|
+
for (let t of s.outbox) t.type === "update" && t.convKey === e && t.scopeKey === r && (m = t);
|
|
279
|
+
let te = m && !nt.has(m.id) ? m : null, ne = te ? n(te.patch, o) : o;
|
|
280
|
+
rt += 1;
|
|
280
281
|
let re = {
|
|
281
|
-
id: `update:${e}:${
|
|
282
|
+
id: `update:${e}:${p}:${rt}`,
|
|
282
283
|
type: "update",
|
|
283
|
-
scopeKey:
|
|
284
|
+
scopeKey: r,
|
|
284
285
|
convKey: e,
|
|
285
286
|
legacy: d,
|
|
286
287
|
...f ? { serverId: f } : {},
|
|
287
288
|
patch: ne,
|
|
288
|
-
at:
|
|
289
|
+
at: p,
|
|
289
290
|
attempts: 0
|
|
290
291
|
};
|
|
291
|
-
return s.queueHistoryUpdate(re, te?.id ?? null,
|
|
292
|
-
},
|
|
292
|
+
return s.queueHistoryUpdate(re, te?.id ?? null, p), w.getState().outbox.some((e) => e.id === re.id) ? (o.title !== void 0 && c && T.getState().patchConversationSync(e, Be, { title: o.title }), Q(), !0) : !1;
|
|
293
|
+
}, Ot = (e) => e.type === "update" && (!U() || !At(e)), kt = (e, t) => w.getState().outbox.find((n) => n.convKey === e && n.scopeKey === t && !Ot(n)), At = (e) => e.nextAttemptAt === void 0 || e.nextAttemptAt <= B(), Q = () => {
|
|
293
294
|
if (!H()) return;
|
|
294
|
-
if (
|
|
295
|
-
|
|
295
|
+
if (Je) {
|
|
296
|
+
Ye = !0, Xe?.();
|
|
296
297
|
return;
|
|
297
298
|
}
|
|
298
|
-
|
|
299
|
+
Je = !0, Ye = !1;
|
|
299
300
|
let e = V();
|
|
300
301
|
W((async () => {
|
|
301
302
|
if (e === null) return;
|
|
302
|
-
let t = `bf-assistant-history:${
|
|
303
|
-
if (!
|
|
304
|
-
await
|
|
303
|
+
let t = `bf-assistant-history:${x.boundKey() ?? ""}:${e}`;
|
|
304
|
+
if (!He) {
|
|
305
|
+
await jt(e);
|
|
305
306
|
return;
|
|
306
307
|
}
|
|
307
|
-
await
|
|
308
|
-
t ? await
|
|
308
|
+
await He.request(t, async (t) => {
|
|
309
|
+
t ? await jt(e) : G("drain", Ee, Q);
|
|
309
310
|
});
|
|
310
|
-
})().catch((e) =>
|
|
311
|
-
|
|
311
|
+
})().catch((e) => D("the save queue stopped unexpectedly", e)).finally(() => {
|
|
312
|
+
Je = !1, Ye && Q();
|
|
312
313
|
}));
|
|
313
314
|
};
|
|
314
|
-
async function
|
|
315
|
+
async function jt(e) {
|
|
315
316
|
let t = /* @__PURE__ */ new Map();
|
|
316
317
|
for (; !(!H() || V() !== e);) {
|
|
317
|
-
|
|
318
|
+
Ye = !1;
|
|
318
319
|
let n = null, r = /* @__PURE__ */ new Map();
|
|
319
|
-
for (let t of
|
|
320
|
-
if (
|
|
320
|
+
for (let t of w.getState().outbox) if (!(t.scopeKey !== e || r.has(t.convKey))) {
|
|
321
|
+
if (Ot(t)) {
|
|
321
322
|
U() && t.nextAttemptAt !== void 0 && (n = n === null ? t.nextAttemptAt : Math.min(n, t.nextAttemptAt));
|
|
322
323
|
continue;
|
|
323
324
|
}
|
|
324
325
|
r.set(t.convKey, t);
|
|
325
326
|
}
|
|
326
327
|
for (let [i, a] of r) if (!t.has(i)) {
|
|
327
|
-
if (!
|
|
328
|
+
if (!At(a)) {
|
|
328
329
|
let e = a.nextAttemptAt ?? B();
|
|
329
330
|
n = n === null ? e : Math.min(n, e);
|
|
330
331
|
continue;
|
|
331
332
|
}
|
|
332
|
-
t.size >=
|
|
333
|
+
t.size >= Pe || t.set(i, Mt(i, e).finally(() => {
|
|
333
334
|
t.delete(i);
|
|
334
335
|
}));
|
|
335
336
|
}
|
|
336
337
|
if (n !== null && G("drain", n - B(), Q), t.size === 0) break;
|
|
337
338
|
let i = new Promise((e) => {
|
|
338
|
-
|
|
339
|
+
Xe = e;
|
|
339
340
|
});
|
|
340
|
-
await Promise.race([...t.values(), i]),
|
|
341
|
+
await Promise.race([...t.values(), i]), Xe = null;
|
|
341
342
|
}
|
|
342
343
|
await Promise.all(t.values());
|
|
343
344
|
}
|
|
344
|
-
async function
|
|
345
|
+
async function Mt(e, t) {
|
|
345
346
|
for (;;) {
|
|
346
347
|
if (!H() || V() !== t) return;
|
|
347
|
-
let n =
|
|
348
|
-
if (!n || !
|
|
348
|
+
let n = kt(e, t);
|
|
349
|
+
if (!n || !At(n) || (n.type === "save" ? await Nt(n) : n.type === "delete" ? await Ft(n) : await It(n)) === "stop") return;
|
|
349
350
|
}
|
|
350
351
|
}
|
|
351
|
-
async function
|
|
352
|
-
if (e.convKey in
|
|
353
|
-
let t =
|
|
352
|
+
async function Nt(e) {
|
|
353
|
+
if (e.convKey in w.getState().tombstones) return w.getState().completeHistoryItems([e.id], B()), "next";
|
|
354
|
+
let t = A;
|
|
354
355
|
if (!t || _(t) !== e.scopeKey) return "stop";
|
|
355
|
-
let n =
|
|
356
|
+
let n = x.boundKey(), r;
|
|
356
357
|
try {
|
|
357
|
-
r = await
|
|
358
|
+
r = await b.save(t, {
|
|
358
359
|
clientConversationId: e.convKey,
|
|
359
360
|
kind: e.kind,
|
|
360
361
|
entries: e.entries
|
|
361
362
|
});
|
|
362
363
|
} catch (t) {
|
|
363
|
-
return
|
|
364
|
+
return Rt(e, t, n);
|
|
364
365
|
}
|
|
365
|
-
return
|
|
366
|
+
return Pt(e, r, n), "next";
|
|
366
367
|
}
|
|
367
|
-
function
|
|
368
|
-
if (
|
|
369
|
-
let r =
|
|
368
|
+
function Pt(e, t, n) {
|
|
369
|
+
if (x.boundKey() !== n) return;
|
|
370
|
+
let r = w.getState(), i = r.outbox.some((t) => t.id === e.id);
|
|
370
371
|
if (e.convKey in r.tombstones) {
|
|
371
372
|
r.completeHistoryItems([e.id], B());
|
|
372
373
|
return;
|
|
373
374
|
}
|
|
374
375
|
if (t.outcome === "CONVERSATION_DELETED") {
|
|
375
|
-
|
|
376
|
+
yt(e.convKey, e.scopeKey, t.conversation.id), $("deleted");
|
|
376
377
|
return;
|
|
377
378
|
}
|
|
378
379
|
if (r.completeHistoryItems([e.id], B()), !i) return;
|
|
379
|
-
t.droppedMetadataKeys.length > 0 &&
|
|
380
|
+
t.droppedMetadataKeys.length > 0 && D("the server did not keep some message details", t.droppedMetadataKeys), r.applyHistoryHeaders(e.scopeKey, { [e.convKey]: v(t.conversation) });
|
|
380
381
|
let a = J(e.convKey);
|
|
381
|
-
if (a?.sync &&
|
|
382
|
-
let n = new Set(
|
|
382
|
+
if (a?.sync && y(a.sync) === e.scopeKey) {
|
|
383
|
+
let n = new Set(Ve(e)), r = {};
|
|
383
384
|
for (let e of t.entries) e.clientMessageId && n.has(e.clientMessageId) && e.seq !== null && (r[e.clientMessageId] = e.seq);
|
|
384
385
|
let i = Object.values(r);
|
|
385
|
-
|
|
386
|
+
T.getState().markHistoryState(e.convKey, [...n], "saved", r), T.getState().patchConversationSync(e.convKey, (e) => {
|
|
386
387
|
let n = e.lastSeq ?? 0, r = i.length > 0 && Math.min(...i) === n + 1 ? Math.max(...i) : n;
|
|
387
388
|
return {
|
|
388
389
|
...e,
|
|
@@ -391,21 +392,21 @@ function T(g) {
|
|
|
391
392
|
lastSeq: r,
|
|
392
393
|
...e.blocked === "quota" ? { blocked: void 0 } : {}
|
|
393
394
|
};
|
|
394
|
-
}, { title:
|
|
395
|
+
}, { title: mt(e.convKey, t.conversation.title) });
|
|
395
396
|
}
|
|
396
|
-
G("pull-after-save",
|
|
397
|
+
G("pull-after-save", Te, () => $("applied"), !0);
|
|
397
398
|
}
|
|
398
|
-
async function
|
|
399
|
-
let t =
|
|
399
|
+
async function Ft(e) {
|
|
400
|
+
let t = A;
|
|
400
401
|
if (!t || _(t) !== e.scopeKey) return "stop";
|
|
401
|
-
let n = e.legacy && e.serverId ? { conversationId: e.serverId } : { clientConversationId: e.convKey }, r =
|
|
402
|
+
let n = e.legacy && e.serverId ? { conversationId: e.serverId } : { clientConversationId: e.convKey }, r = x.boundKey(), i;
|
|
402
403
|
try {
|
|
403
|
-
i = await
|
|
404
|
+
i = await b.remove(t, n);
|
|
404
405
|
} catch (t) {
|
|
405
|
-
return
|
|
406
|
+
return Rt(e, t, r);
|
|
406
407
|
}
|
|
407
|
-
if (
|
|
408
|
-
let a =
|
|
408
|
+
if (x.boundKey() !== r) return "stop";
|
|
409
|
+
let a = w.getState();
|
|
409
410
|
a.completeHistoryItems([e.id], B());
|
|
410
411
|
let o = i.conversation?.id ?? e.serverId;
|
|
411
412
|
return a.recordHistoryTombstone(e.convKey, {
|
|
@@ -413,38 +414,38 @@ function T(g) {
|
|
|
413
414
|
at: B(),
|
|
414
415
|
confirmed: !0,
|
|
415
416
|
...o ? { serverId: o } : {}
|
|
416
|
-
}),
|
|
417
|
+
}), E.getState().unsavedDelete?.conversationId === e.convKey && E.getState().noteUnsavedDelete(void 0), "next";
|
|
417
418
|
}
|
|
418
|
-
async function
|
|
419
|
-
if (e.convKey in
|
|
420
|
-
let t =
|
|
419
|
+
async function It(e) {
|
|
420
|
+
if (e.convKey in w.getState().tombstones) return w.getState().completeHistoryItems([e.id], B()), "next";
|
|
421
|
+
let t = A;
|
|
421
422
|
if (!t || _(t) !== e.scopeKey) return "stop";
|
|
422
|
-
let n = e.legacy && e.serverId ? { conversationId: e.serverId } : { clientConversationId: e.convKey }, r =
|
|
423
|
-
|
|
423
|
+
let n = e.legacy && e.serverId ? { conversationId: e.serverId } : { clientConversationId: e.convKey }, r = x.boundKey(), i;
|
|
424
|
+
nt.add(e.id);
|
|
424
425
|
try {
|
|
425
|
-
i = await
|
|
426
|
+
i = await b.update(t, n, e.patch);
|
|
426
427
|
} catch (t) {
|
|
427
|
-
if (
|
|
428
|
-
if (t instanceof
|
|
428
|
+
if (x.boundKey() !== r) return "stop";
|
|
429
|
+
if (t instanceof m) return U() && w.getState().updateHistoryItem(e.id, (e) => ({
|
|
429
430
|
...e,
|
|
430
|
-
nextAttemptAt: B() +
|
|
431
|
+
nextAttemptAt: B() + oe
|
|
431
432
|
})), "stop";
|
|
432
433
|
let n = h(t);
|
|
433
|
-
return n.class === "not-found" || n.class === "rejected" ? (
|
|
434
|
+
return n.class === "not-found" || n.class === "rejected" ? (w.getState().completeHistoryItems([e.id], B()), Z(n), D("the server did not take a conversation change; dropped", n), "next") : Rt(e, t, r);
|
|
434
435
|
} finally {
|
|
435
|
-
|
|
436
|
+
nt.delete(e.id);
|
|
436
437
|
}
|
|
437
|
-
return
|
|
438
|
+
return Lt(e, i, r), "next";
|
|
438
439
|
}
|
|
439
|
-
function
|
|
440
|
-
if (
|
|
441
|
-
let r =
|
|
440
|
+
function Lt(e, t, n) {
|
|
441
|
+
if (x.boundKey() !== n) return;
|
|
442
|
+
let r = w.getState();
|
|
442
443
|
if (e.convKey in r.tombstones) {
|
|
443
444
|
r.completeHistoryItems([e.id], B());
|
|
444
445
|
return;
|
|
445
446
|
}
|
|
446
447
|
if (t.outcome === "CONVERSATION_DELETED") {
|
|
447
|
-
|
|
448
|
+
yt(e.convKey, e.scopeKey, t.conversation.id), $("deleted");
|
|
448
449
|
return;
|
|
449
450
|
}
|
|
450
451
|
let i = B();
|
|
@@ -453,8 +454,8 @@ function T(g) {
|
|
|
453
454
|
...e.patch.title === void 0 ? {} : { title: e.patch.title },
|
|
454
455
|
...e.patch.archived === void 0 ? {} : { archived: e.patch.archived }
|
|
455
456
|
};
|
|
456
|
-
e.patch.pinned === !0 && (t.title !== void 0 || t.archived !== void 0) ? (
|
|
457
|
-
id: `update:${e.convKey}:${i}:${
|
|
457
|
+
e.patch.pinned === !0 && (t.title !== void 0 || t.archived !== void 0) ? (rt += 1, r.queueHistoryUpdate({
|
|
458
|
+
id: `update:${e.convKey}:${i}:${rt}`,
|
|
458
459
|
type: "update",
|
|
459
460
|
scopeKey: e.scopeKey,
|
|
460
461
|
convKey: e.convKey,
|
|
@@ -463,40 +464,40 @@ function T(g) {
|
|
|
463
464
|
patch: t,
|
|
464
465
|
at: e.at,
|
|
465
466
|
attempts: 0
|
|
466
|
-
}, e.id, i)) : r.completeHistoryItems([e.id], i),
|
|
467
|
+
}, e.id, i)) : r.completeHistoryItems([e.id], i), E.getState().notePinLimit({
|
|
467
468
|
conversationId: e.convKey,
|
|
468
469
|
limit: 50,
|
|
469
470
|
at: i
|
|
470
471
|
});
|
|
471
472
|
} else r.completeHistoryItems([e.id], i);
|
|
472
|
-
|
|
473
|
+
w.getState().applyHistoryHeaders(e.scopeKey, { [e.convKey]: v(t.conversation) });
|
|
473
474
|
let a = J(e.convKey);
|
|
474
|
-
a?.sync &&
|
|
475
|
+
a?.sync && y(a.sync) === e.scopeKey && T.getState().patchConversationSync(e.convKey, (e) => ({
|
|
475
476
|
...e,
|
|
476
477
|
serverId: t.conversation.id,
|
|
477
478
|
revision: Math.max(e.revision ?? 0, t.conversation.revision)
|
|
478
|
-
}), { title:
|
|
479
|
+
}), { title: mt(e.convKey, t.conversation.title) }), G("pull-after-save", Te, () => $("applied"), !0);
|
|
479
480
|
}
|
|
480
|
-
function
|
|
481
|
+
function Rt(e, t, n) {
|
|
481
482
|
let r = h(t);
|
|
482
|
-
if (
|
|
483
|
-
let i =
|
|
483
|
+
if (x.boundKey() !== n) return "stop";
|
|
484
|
+
let i = ae(r, e, Ue), a = w.getState();
|
|
484
485
|
switch (i.action) {
|
|
485
|
-
case "drop": return a.completeHistoryItems([e.id], B()), e.type === "save" &&
|
|
486
|
+
case "drop": return a.completeHistoryItems([e.id], B()), e.type === "save" && T.getState().patchConversationSync(e.convKey, (e) => ({
|
|
486
487
|
...e,
|
|
487
488
|
blocked: "invalid"
|
|
488
|
-
})), Z(r),
|
|
489
|
-
case "pause": return
|
|
489
|
+
})), Z(r), D("the server refused a saved turn; it stays on this device", r), "next";
|
|
490
|
+
case "pause": return St(r), "stop";
|
|
490
491
|
case "park": return a.updateHistoryItem(e.id, (e) => ({
|
|
491
492
|
...e,
|
|
492
493
|
attempts: e.attempts + 1,
|
|
493
494
|
...e.type === "save" ? { parked: "quota" } : {},
|
|
494
|
-
nextAttemptAt: B() + Math.max(i.delayMs,
|
|
495
|
-
})), e.type === "save" &&
|
|
495
|
+
nextAttemptAt: B() + Math.max(i.delayMs, ne)
|
|
496
|
+
})), e.type === "save" && T.getState().patchConversationSync(e.convKey, (e) => ({
|
|
496
497
|
...e,
|
|
497
498
|
blocked: "quota"
|
|
498
499
|
})), Z(r), "stop";
|
|
499
|
-
case "hold": return
|
|
500
|
+
case "hold": return St(r), "stop";
|
|
500
501
|
case "retry": return a.updateHistoryItem(e.id, (e) => ({
|
|
501
502
|
...e,
|
|
502
503
|
attempts: e.attempts + 1,
|
|
@@ -505,62 +506,62 @@ function T(g) {
|
|
|
505
506
|
}
|
|
506
507
|
}
|
|
507
508
|
let $ = (e) => {
|
|
508
|
-
if (H() && !((e === "focus" || e === "visibility") && B() -
|
|
509
|
-
if (
|
|
510
|
-
|
|
509
|
+
if (H() && !((e === "focus" || e === "visibility") && B() - et < we)) {
|
|
510
|
+
if (Ze) {
|
|
511
|
+
Qe = !0;
|
|
511
512
|
return;
|
|
512
513
|
}
|
|
513
|
-
|
|
514
|
-
|
|
514
|
+
Ze = !0, Qe = !1, et = B(), W(zt().catch((e) => D("a history pull stopped unexpectedly", e)).finally(() => {
|
|
515
|
+
Ze = !1, k !== null && !U() && G("controls-recheck", oe, () => $("controls-recheck")), Qe && $("again");
|
|
515
516
|
}));
|
|
516
517
|
}
|
|
517
518
|
};
|
|
518
|
-
async function
|
|
519
|
-
let e =
|
|
519
|
+
async function zt() {
|
|
520
|
+
let e = A, t = K();
|
|
520
521
|
if (!e || !t) return;
|
|
521
|
-
|
|
522
|
+
Ht(t.scopeKey);
|
|
522
523
|
let n = !1;
|
|
523
|
-
for (let r = 0; r <
|
|
524
|
-
let i =
|
|
524
|
+
for (let r = 0; r < Ae; r += 1) {
|
|
525
|
+
let i = w.getState().scopes[t.scopeKey], a = i?.gen ?? 0, o;
|
|
525
526
|
try {
|
|
526
|
-
o = await
|
|
527
|
-
first:
|
|
527
|
+
o = await b.changes(e, {
|
|
528
|
+
first: ke,
|
|
528
529
|
after: i?.cursor ?? null
|
|
529
530
|
});
|
|
530
531
|
} catch (e) {
|
|
531
|
-
q(t) &&
|
|
532
|
+
q(t) && Gt(e);
|
|
532
533
|
return;
|
|
533
534
|
}
|
|
534
535
|
if (!q(t)) return;
|
|
535
|
-
if (
|
|
536
|
+
if ($e = 0, o.resetRequired && !Vt(i)) {
|
|
536
537
|
if (n) return;
|
|
537
538
|
n = !0;
|
|
538
|
-
let e =
|
|
539
|
+
let e = w.getState().resetHistoryScope(t.scopeKey, B());
|
|
539
540
|
I = {
|
|
540
541
|
scopeKey: t.scopeKey,
|
|
541
542
|
gen: e,
|
|
542
|
-
candidates:
|
|
543
|
+
candidates: Ut(t.scopeKey),
|
|
543
544
|
seen: /* @__PURE__ */ new Set()
|
|
544
545
|
}, r = -1;
|
|
545
546
|
continue;
|
|
546
547
|
}
|
|
547
|
-
if (!
|
|
548
|
+
if (!Bt(t.scopeKey, a, o)) return;
|
|
548
549
|
if (!o.pageInfo.hasNextPage) {
|
|
549
|
-
|
|
550
|
+
Wt(t.scopeKey), ln(), qt(t);
|
|
550
551
|
return;
|
|
551
552
|
}
|
|
552
553
|
}
|
|
553
554
|
G("pull-more", 0, () => $("more"));
|
|
554
555
|
}
|
|
555
|
-
function
|
|
556
|
-
let r =
|
|
556
|
+
function Bt(e, t, n) {
|
|
557
|
+
let r = w.getState(), i = {}, a = {}, o = [], s = r.scopes[e]?.cursorRev ?? 0;
|
|
557
558
|
for (let t of n.nodes) {
|
|
558
|
-
let n =
|
|
559
|
+
let n = le(t);
|
|
559
560
|
if (s = Math.max(s, t.revision), t.deleted) {
|
|
560
561
|
a[n] = { serverId: t.id };
|
|
561
562
|
continue;
|
|
562
563
|
}
|
|
563
|
-
I?.scopeKey === e && I.seen.add(n), !(n in r.tombstones) && (i[n] =
|
|
564
|
+
I?.scopeKey === e && I.seen.add(n), !(n in r.tombstones) && (i[n] = v(t), o.push({
|
|
564
565
|
convKey: n,
|
|
565
566
|
serverId: t.id,
|
|
566
567
|
revision: t.revision,
|
|
@@ -576,26 +577,26 @@ function T(g) {
|
|
|
576
577
|
last: !n.pageInfo.hasNextPage,
|
|
577
578
|
at: B()
|
|
578
579
|
})) return !1;
|
|
579
|
-
for (let e of Object.keys(a))
|
|
580
|
-
|
|
581
|
-
let c =
|
|
580
|
+
for (let e of Object.keys(a)) w.getState().dropHistoryItems(e, (e) => e.type === "delete", B());
|
|
581
|
+
vt();
|
|
582
|
+
let c = T.getState();
|
|
582
583
|
for (let t of o) {
|
|
583
584
|
let n = c.conversations.find((e) => e.id === t.convKey);
|
|
584
|
-
!n?.sync ||
|
|
585
|
+
!n?.sync || y(n.sync) !== e || T.getState().patchConversationSync(t.convKey, (e) => ({
|
|
585
586
|
...e,
|
|
586
587
|
serverId: t.serverId,
|
|
587
588
|
revision: Math.max(e.revision ?? 0, t.revision)
|
|
588
|
-
}), { title:
|
|
589
|
+
}), { title: mt(t.convKey, t.title) });
|
|
589
590
|
}
|
|
590
591
|
return !0;
|
|
591
592
|
}
|
|
592
|
-
function
|
|
593
|
+
function Vt(e) {
|
|
593
594
|
if (e?.resetAt === void 0) return !1;
|
|
594
595
|
let t = B() - e.resetAt;
|
|
595
596
|
return t >= 0 && t < 864e5;
|
|
596
597
|
}
|
|
597
|
-
function
|
|
598
|
-
let t =
|
|
598
|
+
function Ht(e) {
|
|
599
|
+
let t = w.getState().scopes[e], n = t?.gen ?? 0;
|
|
599
600
|
if (t?.rescanning && !(I?.scopeKey === e && I.gen === n)) {
|
|
600
601
|
if (t.hasOlderHeaders) {
|
|
601
602
|
I = null;
|
|
@@ -604,243 +605,243 @@ function T(g) {
|
|
|
604
605
|
I = {
|
|
605
606
|
scopeKey: e,
|
|
606
607
|
gen: n,
|
|
607
|
-
candidates:
|
|
608
|
+
candidates: Ut(e),
|
|
608
609
|
seen: new Set(Object.keys(t.headers))
|
|
609
610
|
};
|
|
610
611
|
}
|
|
611
612
|
}
|
|
612
|
-
function Ht(e) {
|
|
613
|
-
return new Set(E.getState().conversations.filter((t) => t.sync !== void 0 && !!t.sync.serverId && b(t.sync) === e).map((e) => e.id));
|
|
614
|
-
}
|
|
615
613
|
function Ut(e) {
|
|
614
|
+
return new Set(T.getState().conversations.filter((t) => t.sync !== void 0 && !!t.sync.serverId && y(t.sync) === e).map((e) => e.id));
|
|
615
|
+
}
|
|
616
|
+
function Wt(e) {
|
|
616
617
|
let t = I;
|
|
617
|
-
if (!t || t.scopeKey !== e || (I = null, (
|
|
618
|
-
let n = new Set(
|
|
618
|
+
if (!t || t.scopeKey !== e || (I = null, (w.getState().scopes[e]?.gen ?? 0) !== t.gen)) return;
|
|
619
|
+
let n = new Set(w.getState().outbox.map((e) => e.convKey)), r = T.getState(), i = r.conversations.filter((r) => t.candidates.has(r.id) && r.sync !== void 0 && y(r.sync) === e && !t.seen.has(r.id) && !n.has(r.id) && !Y(r.id)).map((e) => e.id);
|
|
619
620
|
if (i.length === 0) return;
|
|
620
621
|
let a = r.activeConversationId;
|
|
621
|
-
r.removeConversationsSilently(i), a !== null && i.includes(a) &&
|
|
622
|
+
r.removeConversationsSilently(i), a !== null && i.includes(a) && E.getState().noteRemoteDelete({
|
|
622
623
|
conversationId: a,
|
|
623
624
|
wasActive: !0,
|
|
624
625
|
at: B()
|
|
625
626
|
});
|
|
626
627
|
}
|
|
627
|
-
function
|
|
628
|
+
function Gt(e) {
|
|
628
629
|
let t = h(e);
|
|
629
630
|
if (t.class === "rejected") {
|
|
630
|
-
|
|
631
|
+
bt(re, t);
|
|
631
632
|
return;
|
|
632
633
|
}
|
|
633
|
-
|
|
634
|
-
}
|
|
635
|
-
function Gt(e) {
|
|
636
|
-
let t = T.getState().scopes[e]?.headers ?? {};
|
|
637
|
-
return Object.values(t).some((e) => !e.gone && !be(e));
|
|
634
|
+
St(t) || ($e += 1, G("pull-retry", Math.max(ie($e, Ue), t.retryAfterMs ?? 0), () => $("retry")));
|
|
638
635
|
}
|
|
639
636
|
function Kt(e) {
|
|
637
|
+
let t = w.getState().scopes[e]?.headers ?? {};
|
|
638
|
+
return Object.values(t).some((e) => !e.gone && !Se(e));
|
|
639
|
+
}
|
|
640
|
+
function qt(e) {
|
|
640
641
|
if (P !== null || !U() || !q(e)) return;
|
|
641
|
-
let t =
|
|
642
|
-
if (!
|
|
643
|
-
|
|
642
|
+
let t = w.getState().scopes[e.scopeKey]?.gen ?? 0;
|
|
643
|
+
if (!Kt(e.scopeKey)) {
|
|
644
|
+
w.getState().scopes[e.scopeKey] && w.getState().markHistoryScopeControls(e.scopeKey, t);
|
|
644
645
|
return;
|
|
645
646
|
}
|
|
646
|
-
B() -
|
|
647
|
+
B() - at < Fe || (at = B(), P = {
|
|
647
648
|
gen: e,
|
|
648
649
|
storeGen: t,
|
|
649
650
|
cursor: null
|
|
650
|
-
},
|
|
651
|
+
}, Jt());
|
|
651
652
|
}
|
|
652
|
-
function
|
|
653
|
-
let e = P, t =
|
|
653
|
+
function Jt() {
|
|
654
|
+
let e = P, t = A;
|
|
654
655
|
if (!e || !t || !H() || !q(e.gen)) {
|
|
655
656
|
P = null;
|
|
656
657
|
return;
|
|
657
658
|
}
|
|
658
659
|
let n = e.gen.scopeKey;
|
|
659
660
|
W((async () => {
|
|
660
|
-
for (let r = 0; r <
|
|
661
|
-
let r = await
|
|
662
|
-
first:
|
|
661
|
+
for (let r = 0; r < Ae; r += 1) {
|
|
662
|
+
let r = await b.changes(t, {
|
|
663
|
+
first: ke,
|
|
663
664
|
after: e.cursor
|
|
664
665
|
});
|
|
665
666
|
if (P !== e || !q(e.gen)) return;
|
|
666
|
-
if (!U() || (
|
|
667
|
+
if (!U() || (w.getState().scopes[n]?.gen ?? 0) !== e.storeGen) {
|
|
667
668
|
P = null;
|
|
668
669
|
return;
|
|
669
670
|
}
|
|
670
|
-
let i =
|
|
671
|
+
let i = w.getState().tombstones, a = {};
|
|
671
672
|
for (let e of r.nodes) {
|
|
672
|
-
let t =
|
|
673
|
-
e.deleted || t in i || (a[t] =
|
|
673
|
+
let t = le(e);
|
|
674
|
+
e.deleted || t in i || (a[t] = v(e));
|
|
674
675
|
}
|
|
675
|
-
if (Object.keys(a).length > 0 &&
|
|
676
|
-
P = null,
|
|
676
|
+
if (Object.keys(a).length > 0 && w.getState().applyHistoryHeaders(n, a), e.cursor = r.pageInfo.endCursor ?? e.cursor, !r.pageInfo.hasNextPage) {
|
|
677
|
+
P = null, w.getState().markHistoryScopeControls(n, e.storeGen), ln();
|
|
677
678
|
return;
|
|
678
679
|
}
|
|
679
680
|
}
|
|
680
|
-
G("controls-repull", 0,
|
|
681
|
+
G("controls-repull", 0, Jt, !0);
|
|
681
682
|
})().catch((t) => {
|
|
682
|
-
P === e && (P = null), q(e.gen) &&
|
|
683
|
+
P === e && (P = null), q(e.gen) && Gt(t);
|
|
683
684
|
}));
|
|
684
685
|
}
|
|
685
|
-
function
|
|
686
|
-
let e =
|
|
687
|
-
|
|
686
|
+
function Yt() {
|
|
687
|
+
let e = A, t = K();
|
|
688
|
+
it || !H() || !e || !t || !U() || (it = !0, W(b.conversations(e, {
|
|
688
689
|
first: 50,
|
|
689
690
|
after: null,
|
|
690
691
|
filter: { pinned: !0 }
|
|
691
692
|
}).then((e) => {
|
|
692
693
|
if (!q(t)) return;
|
|
693
|
-
let n =
|
|
694
|
+
let n = w.getState().tombstones, r = {};
|
|
694
695
|
for (let t of e.nodes) {
|
|
695
|
-
let e =
|
|
696
|
-
t.deleted || e in n || (r[e] =
|
|
696
|
+
let e = le(t);
|
|
697
|
+
t.deleted || e in n || (r[e] = v(t));
|
|
697
698
|
}
|
|
698
|
-
Object.keys(r).length > 0 &&
|
|
699
|
+
Object.keys(r).length > 0 && w.getState().applyHistoryHeaders(t.scopeKey, r);
|
|
699
700
|
}).catch((e) => {
|
|
700
|
-
q(t) &&
|
|
701
|
+
q(t) && St(h(e));
|
|
701
702
|
}).finally(() => {
|
|
702
|
-
|
|
703
|
+
it = !1;
|
|
703
704
|
})));
|
|
704
705
|
}
|
|
705
|
-
function
|
|
706
|
-
if (
|
|
706
|
+
function Xt(e) {
|
|
707
|
+
if (E.getState().setControlsAvailable(e), k === null) return;
|
|
707
708
|
if (!e) {
|
|
708
|
-
G("controls-recheck",
|
|
709
|
+
G("controls-recheck", oe, () => $("controls-recheck"));
|
|
709
710
|
return;
|
|
710
711
|
}
|
|
711
|
-
|
|
712
|
+
dt("controls-recheck"), Q();
|
|
712
713
|
let t = K();
|
|
713
|
-
t &&
|
|
714
|
+
t && qt(t);
|
|
714
715
|
}
|
|
715
|
-
let
|
|
716
|
-
let t =
|
|
717
|
-
if (!H() || !t || !
|
|
718
|
-
|
|
719
|
-
let i = e && U() ? e : void 0, a =
|
|
716
|
+
let Zt = (e) => {
|
|
717
|
+
let t = A, n = K();
|
|
718
|
+
if (!H() || !t || !n || tt) return;
|
|
719
|
+
tt = !0;
|
|
720
|
+
let i = e && U() ? e : void 0, a = r(i);
|
|
720
721
|
W((async () => {
|
|
721
|
-
let e =
|
|
722
|
-
for (let e = 0; e <
|
|
723
|
-
let e = await
|
|
724
|
-
first:
|
|
722
|
+
let e = E.getState().olderHeaders, r = e?.scopeKey === n.scopeKey ? { ...e.headers } : {}, o = N?.scopeKey === n.scopeKey && N.filterKey === a ? N.cursor : null, s = !0;
|
|
723
|
+
for (let e = 0; e < Me && s; e += 1) {
|
|
724
|
+
let e = await b.conversations(t, {
|
|
725
|
+
first: je,
|
|
725
726
|
after: o,
|
|
726
727
|
...i ? { filter: i } : {}
|
|
727
728
|
});
|
|
728
|
-
if (!q(
|
|
729
|
-
let c =
|
|
729
|
+
if (!q(n)) return;
|
|
730
|
+
let c = w.getState(), l = c.scopes[n.scopeKey]?.headers ?? {}, u = 0;
|
|
730
731
|
for (let t of e.nodes) {
|
|
731
|
-
let e =
|
|
732
|
-
t.deleted || e in c.tombstones || e in l || e in
|
|
732
|
+
let e = le(t);
|
|
733
|
+
t.deleted || e in c.tombstones || e in l || e in r || (r[e] = v(t), u += 1);
|
|
733
734
|
}
|
|
734
|
-
if (o = e.pageInfo.endCursor ?? o, s = e.pageInfo.hasNextPage,
|
|
735
|
-
scopeKey:
|
|
735
|
+
if (o = e.pageInfo.endCursor ?? o, s = e.pageInfo.hasNextPage, N = {
|
|
736
|
+
scopeKey: n.scopeKey,
|
|
736
737
|
filterKey: a,
|
|
737
738
|
cursor: o
|
|
738
739
|
}, u > 0) break;
|
|
739
740
|
}
|
|
740
|
-
let c =
|
|
741
|
-
|
|
742
|
-
scopeKey:
|
|
741
|
+
let c = w.getState().tombstones, l = Object.fromEntries(Object.entries(r).filter(([e]) => !(e in c)));
|
|
742
|
+
E.getState().setOlderHeaders({
|
|
743
|
+
scopeKey: n.scopeKey,
|
|
743
744
|
headers: l,
|
|
744
745
|
hasMore: s,
|
|
745
746
|
filterKey: a
|
|
746
747
|
});
|
|
747
748
|
})().catch((e) => {
|
|
748
|
-
q(
|
|
749
|
+
q(n) && Gt(e);
|
|
749
750
|
}).finally(() => {
|
|
750
|
-
|
|
751
|
+
tt = !1;
|
|
751
752
|
}));
|
|
752
|
-
},
|
|
753
|
-
let
|
|
754
|
-
if (!H() || !
|
|
755
|
-
let
|
|
753
|
+
}, Qt = async (e) => {
|
|
754
|
+
let n = A, r = K();
|
|
755
|
+
if (!H() || !n || !r) throw new te();
|
|
756
|
+
let i = await b.conversations(n, {
|
|
756
757
|
first: 50,
|
|
757
758
|
after: e.after,
|
|
758
759
|
query: e.query,
|
|
759
760
|
...e.filter ? { filter: e.filter } : {}
|
|
760
761
|
}, e.signal ? { signal: e.signal } : {});
|
|
761
|
-
if (e.signal
|
|
762
|
-
let
|
|
763
|
-
for (let e of
|
|
764
|
-
let t =
|
|
765
|
-
if (e.deleted || t in
|
|
766
|
-
let
|
|
767
|
-
|
|
762
|
+
if (t(e.signal), !q(r)) throw new te();
|
|
763
|
+
let a = w.getState().tombstones, o = [], s = {};
|
|
764
|
+
for (let e of i.nodes) {
|
|
765
|
+
let t = le(e);
|
|
766
|
+
if (e.deleted || t in a) continue;
|
|
767
|
+
let n = v(e);
|
|
768
|
+
o.push({
|
|
768
769
|
convKey: t,
|
|
769
|
-
header:
|
|
770
|
-
scopeKey:
|
|
771
|
-
}),
|
|
770
|
+
header: n,
|
|
771
|
+
scopeKey: r.scopeKey
|
|
772
|
+
}), s[t] = n;
|
|
772
773
|
}
|
|
773
774
|
return F = {
|
|
774
|
-
gen:
|
|
775
|
+
gen: r,
|
|
775
776
|
headers: {
|
|
776
777
|
...e.after !== null && F && q(F.gen) ? F.headers : {},
|
|
777
|
-
...
|
|
778
|
+
...s
|
|
778
779
|
}
|
|
779
780
|
}, {
|
|
780
|
-
hits:
|
|
781
|
-
hasMore:
|
|
782
|
-
endCursor:
|
|
781
|
+
hits: o,
|
|
782
|
+
hasMore: i.pageInfo.hasNextPage,
|
|
783
|
+
endCursor: i.pageInfo.endCursor
|
|
783
784
|
};
|
|
784
|
-
},
|
|
785
|
+
}, $t = () => {
|
|
785
786
|
F = null;
|
|
786
|
-
},
|
|
787
|
-
let n =
|
|
788
|
-
if (
|
|
787
|
+
}, en = (e, t = {}) => {
|
|
788
|
+
let n = T.getState(), r = n.conversations.find((t) => t.id === e), i = V();
|
|
789
|
+
if (k === null || i === null || !A) {
|
|
789
790
|
r && n.setActiveConversation(e);
|
|
790
791
|
return;
|
|
791
792
|
}
|
|
792
|
-
if (!(
|
|
793
|
+
if (!(x.isBoundToActiveProfile() && e in w.getState().tombstones)) {
|
|
793
794
|
if (!r) {
|
|
794
|
-
let a =
|
|
795
|
+
let a = ft(i, e);
|
|
795
796
|
if (!a || a.gone) return;
|
|
796
|
-
|
|
797
|
-
let o =
|
|
798
|
-
if (n.upsertRemoteConversation(
|
|
797
|
+
w.getState().applyHistoryHeaders(i, { [e]: a });
|
|
798
|
+
let o = pt(e);
|
|
799
|
+
if (n.upsertRemoteConversation(ue(e, o === void 0 ? a : {
|
|
799
800
|
...a,
|
|
800
801
|
title: o
|
|
801
|
-
},
|
|
802
|
+
}, A, {
|
|
802
803
|
modes: t.modes ?? [],
|
|
803
804
|
autoRouting: n.autoRouting,
|
|
804
805
|
openedAt: new Date(B()).toISOString()
|
|
805
806
|
})), r = J(e), !r) return;
|
|
806
807
|
}
|
|
807
|
-
r.sync &&
|
|
808
|
+
r.sync && y(r.sync) !== i || (T.getState().setActiveConversation(e), r.sync && (T.getState().patchConversationSync(e, (e) => ({
|
|
808
809
|
...e,
|
|
809
810
|
openedAt: new Date(B()).toISOString()
|
|
810
|
-
})),
|
|
811
|
+
})), tn(e, "open")), ln());
|
|
811
812
|
}
|
|
812
|
-
},
|
|
813
|
-
let n =
|
|
814
|
-
if (
|
|
813
|
+
}, tn = (e, t) => {
|
|
814
|
+
let n = A, r = V();
|
|
815
|
+
if (k === null || !n || r === null || ot.has(e) || x.heldByNewerBuild()) return;
|
|
815
816
|
if (!H()) {
|
|
816
|
-
|
|
817
|
+
on(e, t);
|
|
817
818
|
return;
|
|
818
819
|
}
|
|
819
820
|
let i = J(e)?.sync;
|
|
820
|
-
if (!i ||
|
|
821
|
+
if (!i || y(i) !== r || e in w.getState().tombstones) return;
|
|
821
822
|
if (Y(e)) {
|
|
822
|
-
|
|
823
|
+
on(e, t);
|
|
823
824
|
return;
|
|
824
825
|
}
|
|
825
|
-
let a =
|
|
826
|
+
let a = ft(r, e), o = t === "earlier" ? _e(i) : ve(i, a ? a.lastMessageSeq : null);
|
|
826
827
|
if (!o) return;
|
|
827
828
|
let s = K();
|
|
828
|
-
s && (
|
|
829
|
-
|
|
829
|
+
s && (ot.add(e), E.getState().setConversationLoading(e, !0), E.getState().setConversationLoadError(e, !1), W(nn(e, n, i.origin === "legacy" ? { conversationId: i.serverId ?? e.slice(7) } : { clientConversationId: e }, o, s, t).catch((t) => an(e, i, t, s)).finally(() => {
|
|
830
|
+
ot.delete(e), q(s) && E.getState().setConversationLoading(e, !1);
|
|
830
831
|
})));
|
|
831
832
|
};
|
|
832
|
-
async function
|
|
833
|
+
async function nn(e, t, n, r, i, a) {
|
|
833
834
|
let o = r.paging;
|
|
834
|
-
for (let s = 0; s <
|
|
835
|
-
let s = await
|
|
835
|
+
for (let s = 0; s < Ne; s += 1) {
|
|
836
|
+
let s = await b.entries(t, n, o);
|
|
836
837
|
if (!q(i)) return;
|
|
837
838
|
if (s.conversation.deleted) {
|
|
838
|
-
|
|
839
|
+
yt(e, i.scopeKey, s.conversation.id);
|
|
839
840
|
return;
|
|
840
841
|
}
|
|
841
|
-
let c =
|
|
842
|
+
let c = rn(e, i.scopeKey, s, r);
|
|
842
843
|
if (c === "deferred") {
|
|
843
|
-
|
|
844
|
+
on(e, a);
|
|
844
845
|
return;
|
|
845
846
|
}
|
|
846
847
|
if (c !== "applied" || r.kind !== "catch-up" || !s.pageInfo.hasNextPage) return;
|
|
@@ -852,172 +853,172 @@ function T(g) {
|
|
|
852
853
|
};
|
|
853
854
|
}
|
|
854
855
|
}
|
|
855
|
-
function
|
|
856
|
-
if (e in
|
|
856
|
+
function rn(e, t, n, r) {
|
|
857
|
+
if (e in w.getState().tombstones) return "skipped";
|
|
857
858
|
let i = J(e), a = i?.sync;
|
|
858
|
-
if (!i || !a ||
|
|
859
|
+
if (!i || !a || y(a) !== t) return "skipped";
|
|
859
860
|
if (Y(e)) return "deferred";
|
|
860
|
-
|
|
861
|
-
let o = n.nodes.map(
|
|
862
|
-
return
|
|
861
|
+
w.getState().applyHistoryHeaders(t, { [e]: v(n.conversation) });
|
|
862
|
+
let o = n.nodes.map(fe), { messages: s, syncPatch: c } = ge(a, i.messages, o, n, r);
|
|
863
|
+
return T.getState().applyHistoryEntries(e, s, c), "applied";
|
|
863
864
|
}
|
|
864
|
-
function
|
|
865
|
+
function an(e, t, n, r) {
|
|
865
866
|
if (!q(r)) return;
|
|
866
867
|
let i = h(n);
|
|
867
868
|
if (i.class === "not-found") {
|
|
868
869
|
if (t.origin === "created") return;
|
|
869
|
-
|
|
870
|
+
w.getState().markHistoryHeaderGone(r.scopeKey, e), E.getState().setConversationLoadError(e, !0), D("the server does not have a conversation the list showed", e);
|
|
870
871
|
return;
|
|
871
872
|
}
|
|
872
|
-
|
|
873
|
+
E.getState().setConversationLoadError(e, !0), i.class === "rejected" ? bt(re, i) : St(i);
|
|
873
874
|
}
|
|
874
|
-
function
|
|
875
|
-
L.get(e) !== "open" && L.set(e, t), G("deferred-loads",
|
|
875
|
+
function on(e, t) {
|
|
876
|
+
L.get(e) !== "open" && L.set(e, t), G("deferred-loads", Oe, sn);
|
|
876
877
|
}
|
|
877
|
-
function
|
|
878
|
+
function sn() {
|
|
878
879
|
if (!H()) {
|
|
879
|
-
L.size > 0 &&
|
|
880
|
+
L.size > 0 && k !== null && G("deferred-loads", Oe, sn);
|
|
880
881
|
return;
|
|
881
882
|
}
|
|
882
|
-
for (let [e, t] of [...L]) Y(e) || (L.delete(e),
|
|
883
|
-
L.size > 0 && G("deferred-loads",
|
|
883
|
+
for (let [e, t] of [...L]) Y(e) || (L.delete(e), tn(e, t));
|
|
884
|
+
L.size > 0 && G("deferred-loads", Oe, sn);
|
|
884
885
|
}
|
|
885
|
-
function
|
|
886
|
-
if (!
|
|
887
|
-
let t =
|
|
886
|
+
function cn(e) {
|
|
887
|
+
if (!x.isBoundToActiveProfile()) return [];
|
|
888
|
+
let t = w.getState(), n = new Set(t.outbox.map((e) => e.convKey)), r = T.getState(), i = de({
|
|
888
889
|
conversations: r.conversations,
|
|
889
890
|
activeConversationId: r.activeConversationId,
|
|
890
891
|
max: e,
|
|
891
892
|
isProtected: (e) => {
|
|
892
893
|
if (n.has(e.id) || Y(e.id) || !e.sync) return !0;
|
|
893
|
-
let r = t.scopes[
|
|
894
|
+
let r = t.scopes[y(e.sync)]?.headers[e.id];
|
|
894
895
|
return !r || r.gone === !0;
|
|
895
896
|
}
|
|
896
897
|
});
|
|
897
898
|
return i.length > 0 && r.evictConversations(i), i;
|
|
898
899
|
}
|
|
899
|
-
function
|
|
900
|
-
|
|
900
|
+
function ln() {
|
|
901
|
+
cn(25);
|
|
901
902
|
}
|
|
902
|
-
function
|
|
903
|
-
for (let t of
|
|
903
|
+
function un(e) {
|
|
904
|
+
for (let t of Ie) if (cn(t).length !== 0 && !e()) return;
|
|
904
905
|
}
|
|
905
|
-
function
|
|
906
|
-
if (
|
|
907
|
-
for (let e of
|
|
908
|
-
G("history-flush",
|
|
906
|
+
function dn() {
|
|
907
|
+
if (x.isBoundToActiveProfile()) {
|
|
908
|
+
for (let e of Ie) if (cn(e).length !== 0 && x.flush()) return;
|
|
909
|
+
G("history-flush", Le, fn);
|
|
909
910
|
}
|
|
910
911
|
}
|
|
911
|
-
function
|
|
912
|
-
!
|
|
912
|
+
function fn() {
|
|
913
|
+
!x.isBoundToActiveProfile() || !x.persistFailing() || x.flush();
|
|
913
914
|
}
|
|
914
|
-
function
|
|
915
|
+
function pn(e) {
|
|
915
916
|
if (e) {
|
|
916
|
-
|
|
917
|
+
dn();
|
|
917
918
|
return;
|
|
918
919
|
}
|
|
919
|
-
|
|
920
|
+
dt("history-flush"), E.getState().unsavedDelete && E.getState().noteUnsavedDelete(void 0);
|
|
920
921
|
}
|
|
921
|
-
function
|
|
922
|
-
let e =
|
|
922
|
+
function mn() {
|
|
923
|
+
let e = k === null ? null : se(We(), Ge(), k), t = e ? _(e) : null, n = x.isBoundToActiveProfile() ? w.getState().tombstones : {};
|
|
923
924
|
return (e) => !e.sync || t !== null && _(e.sync) === t && !(e.id in n);
|
|
924
925
|
}
|
|
925
|
-
function
|
|
926
|
+
function hn() {
|
|
926
927
|
if (g.watchScope === !1) return;
|
|
927
928
|
let t = () => {
|
|
928
|
-
X(), G("scope-poll",
|
|
929
|
+
X(), G("scope-poll", Ce, t, !0);
|
|
929
930
|
};
|
|
930
|
-
if (G("scope-poll",
|
|
931
|
+
if (G("scope-poll", Ce, t, !0), typeof window > "u" || typeof window.addEventListener != "function") return;
|
|
931
932
|
let n = () => {
|
|
932
933
|
X(), $("focus"), Q();
|
|
933
934
|
}, r = () => {
|
|
934
935
|
typeof document < "u" && document.visibilityState !== "visible" || (X(), $("visibility"), Q());
|
|
935
936
|
}, i = () => {
|
|
936
|
-
X(),
|
|
937
|
-
}, a = () => X(), o = () =>
|
|
938
|
-
window.addEventListener("focus", n), window.addEventListener("online", i), window.addEventListener("pagehide", o), window.addEventListener("popstate", a), window.addEventListener("storage", a), window.addEventListener(e, a), typeof document < "u" && document.addEventListener("visibilitychange", r),
|
|
937
|
+
X(), fn(), yn(), $("online"), Q();
|
|
938
|
+
}, a = () => X(), o = () => fn();
|
|
939
|
+
window.addEventListener("focus", n), window.addEventListener("online", i), window.addEventListener("pagehide", o), window.addEventListener("popstate", a), window.addEventListener("storage", a), window.addEventListener(e, a), typeof document < "u" && document.addEventListener("visibilitychange", r), ct.push(() => {
|
|
939
940
|
window.removeEventListener("focus", n), window.removeEventListener("online", i), window.removeEventListener("pagehide", o), window.removeEventListener("popstate", a), window.removeEventListener("storage", a), window.removeEventListener(e, a), typeof document < "u" && document.removeEventListener("visibilitychange", r);
|
|
940
941
|
});
|
|
941
942
|
}
|
|
942
|
-
function
|
|
943
|
-
|
|
944
|
-
if (e.tombstones !== t.tombstones &&
|
|
943
|
+
function gn(e) {
|
|
944
|
+
k = e, u(() => k === null || x.heldByNewerBuild() ? null : se(We(), Ge(), k)), s(un), c(mn), l((e, t) => Dt(e, { title: t })), x.setWriteListener(pn), E.getState().setControlsAvailable(U()), ct.push(b.onControlsChange(Xt), w.subscribe((e, t) => {
|
|
945
|
+
if (e.tombstones !== t.tombstones && vt(), e.outbox !== t.outbox) {
|
|
945
946
|
let n = new Set(t.outbox.map((e) => e.id));
|
|
946
947
|
e.outbox.some((e) => !n.has(e.id)) && Q();
|
|
947
948
|
}
|
|
948
|
-
}),
|
|
949
|
+
}), T.subscribe((e, t) => {
|
|
949
950
|
let n = e.activeConversationId, r = n !== null && p(t.processingByConversationId[n]?.status) && !p(e.processingByConversationId[n]?.status);
|
|
950
|
-
(n !== t.activeConversationId || r) && (X(),
|
|
951
|
-
})),
|
|
952
|
-
}
|
|
953
|
-
function
|
|
954
|
-
|
|
955
|
-
for (let e of
|
|
956
|
-
|
|
957
|
-
for (let e of [...z.keys()])
|
|
958
|
-
L.clear(), R.clear(), P = null,
|
|
959
|
-
}
|
|
960
|
-
let
|
|
961
|
-
|
|
962
|
-
active:
|
|
951
|
+
(n !== t.activeConversationId || r) && (X(), _t()), R.size > 0 && e.processingByConversationId !== t.processingByConversationId && Tt(e), L.size > 0 && e.processingByConversationId !== t.processingByConversationId && sn();
|
|
952
|
+
})), hn(), X();
|
|
953
|
+
}
|
|
954
|
+
function _n() {
|
|
955
|
+
k = null, A = null, u(null), s(null), c(null), l(null), x.setWriteListener(null), E.getState().noteUnsavedDelete(void 0);
|
|
956
|
+
for (let e of ct) e();
|
|
957
|
+
ct = [];
|
|
958
|
+
for (let e of [...z.keys()]) dt(e);
|
|
959
|
+
L.clear(), R.clear(), P = null, at = -Infinity, F = null, qe = !1, E.getState().setHistoryScope(null, null);
|
|
960
|
+
}
|
|
961
|
+
let vn = (e) => {
|
|
962
|
+
O.set(e, (O.get(e) ?? 0) + 1), k === null ? gn(e) : k !== e && D("a second product asked for server history in the same page; the first keeps it", {
|
|
963
|
+
active: k,
|
|
963
964
|
asked: e
|
|
964
965
|
});
|
|
965
966
|
let t = !1;
|
|
966
967
|
return () => {
|
|
967
968
|
if (t) return;
|
|
968
969
|
t = !0;
|
|
969
|
-
let n = (
|
|
970
|
-
if (n > 0 ?
|
|
971
|
-
|
|
972
|
-
let r =
|
|
973
|
-
r.done ||
|
|
970
|
+
let n = (O.get(e) ?? 1) - 1;
|
|
971
|
+
if (n > 0 ? O.set(e, n) : O.delete(e), e !== k || O.has(e)) return;
|
|
972
|
+
_n();
|
|
973
|
+
let r = O.keys().next();
|
|
974
|
+
r.done || gn(r.value);
|
|
974
975
|
};
|
|
975
976
|
};
|
|
976
|
-
function
|
|
977
|
-
if (!
|
|
978
|
-
let e =
|
|
977
|
+
function yn() {
|
|
978
|
+
if (!ut()) return;
|
|
979
|
+
let e = w.getState();
|
|
979
980
|
for (let t of e.outbox) t.nextAttemptAt === void 0 || t.type === "save" && t.parked || e.updateHistoryItem(t.id, (e) => ({
|
|
980
981
|
...e,
|
|
981
982
|
nextAttemptAt: void 0
|
|
982
983
|
}));
|
|
983
984
|
}
|
|
984
985
|
return {
|
|
985
|
-
enable:
|
|
986
|
-
setScope:
|
|
986
|
+
enable: vn,
|
|
987
|
+
setScope: gt,
|
|
987
988
|
refreshScope: X,
|
|
988
|
-
recordCommittedEntries:
|
|
989
|
-
deleteConversation:
|
|
990
|
-
updateConversation:
|
|
991
|
-
openConversation:
|
|
992
|
-
loadEarlier: (e) =>
|
|
993
|
-
loadOlderHeaders: (e) =>
|
|
994
|
-
searchConversations:
|
|
995
|
-
clearSearchResults:
|
|
989
|
+
recordCommittedEntries: wt,
|
|
990
|
+
deleteConversation: Et,
|
|
991
|
+
updateConversation: Dt,
|
|
992
|
+
openConversation: en,
|
|
993
|
+
loadEarlier: (e) => tn(e, "earlier"),
|
|
994
|
+
loadOlderHeaders: (e) => Zt(e),
|
|
995
|
+
searchConversations: Qt,
|
|
996
|
+
clearSearchResults: $t,
|
|
996
997
|
notePanelOpened: () => {
|
|
997
|
-
if (!
|
|
998
|
-
let e =
|
|
998
|
+
if (!ut()) return;
|
|
999
|
+
let e = w.getState();
|
|
999
1000
|
for (let t of e.outbox) t.type !== "save" || !t.parked || e.updateHistoryItem(t.id, (e) => ({
|
|
1000
1001
|
...e,
|
|
1001
1002
|
parked: void 0,
|
|
1002
1003
|
nextAttemptAt: void 0,
|
|
1003
1004
|
attempts: e.attempts + 1
|
|
1004
1005
|
}));
|
|
1005
|
-
|
|
1006
|
+
C(() => b.recheckControls(), void 0), $("history-open"), Q(), Yt();
|
|
1006
1007
|
},
|
|
1007
1008
|
pull: $,
|
|
1008
1009
|
drain: Q,
|
|
1009
1010
|
async settled() {
|
|
1010
|
-
for (let e = 0; e < 1e3 &&
|
|
1011
|
+
for (let e = 0; e < 1e3 && st.size > 0; e += 1) await Promise.allSettled([...st]);
|
|
1011
1012
|
},
|
|
1012
1013
|
dispose() {
|
|
1013
|
-
|
|
1014
|
+
O.clear(), F = null, k !== null && _n();
|
|
1014
1015
|
}
|
|
1015
1016
|
};
|
|
1016
1017
|
}
|
|
1017
|
-
var
|
|
1018
|
+
var T = w({
|
|
1018
1019
|
transport: g(),
|
|
1019
|
-
storage:
|
|
1020
|
-
clock:
|
|
1020
|
+
storage: b,
|
|
1021
|
+
clock: S()
|
|
1021
1022
|
});
|
|
1022
1023
|
//#endregion
|
|
1023
|
-
export {
|
|
1024
|
+
export { x as ASSISTANT_HISTORY_RESET_TRUST_MS, T as assistantHistory, w as createAssistantHistoryEngine, S as createSystemHistoryClock };
|