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