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