@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.
Files changed (45) hide show
  1. package/dist/connections/api.d.ts.map +1 -1
  2. package/dist/connections/api.js +4 -3
  3. package/dist/connections/oauthPopup.d.ts.map +1 -1
  4. package/dist/connections/oauthPopup.js +8 -9
  5. package/dist/shared/assistant/conversation.d.ts +5 -1
  6. package/dist/shared/assistant/conversation.d.ts.map +1 -1
  7. package/dist/shared/assistant/history/historyApi.d.ts +25 -9
  8. package/dist/shared/assistant/history/historyApi.d.ts.map +1 -1
  9. package/dist/shared/assistant/history/historyApi.js +220 -75
  10. package/dist/shared/assistant/history/historyControls.d.ts +86 -0
  11. package/dist/shared/assistant/history/historyControls.d.ts.map +1 -0
  12. package/dist/shared/assistant/history/historyControls.js +80 -0
  13. package/dist/shared/assistant/history/historyEngine.d.ts +23 -3
  14. package/dist/shared/assistant/history/historyEngine.d.ts.map +1 -1
  15. package/dist/shared/assistant/history/historyEngine.js +578 -369
  16. package/dist/shared/assistant/history/historyErrors.d.ts +25 -5
  17. package/dist/shared/assistant/history/historyErrors.d.ts.map +1 -1
  18. package/dist/shared/assistant/history/historyErrors.js +39 -30
  19. package/dist/shared/assistant/history/historyList.d.ts +33 -7
  20. package/dist/shared/assistant/history/historyList.d.ts.map +1 -1
  21. package/dist/shared/assistant/history/historyList.js +72 -51
  22. package/dist/shared/assistant/history/historyOperations.d.ts +36 -7
  23. package/dist/shared/assistant/history/historyOperations.d.ts.map +1 -1
  24. package/dist/shared/assistant/history/historyOperations.js +100 -25
  25. package/dist/shared/assistant/history/historyStatus.d.ts +27 -1
  26. package/dist/shared/assistant/history/historyStatus.d.ts.map +1 -1
  27. package/dist/shared/assistant/history/historyStatus.js +6 -2
  28. package/dist/shared/assistant/history/historyStore.d.ts +29 -7
  29. package/dist/shared/assistant/history/historyStore.d.ts.map +1 -1
  30. package/dist/shared/assistant/history/historyStore.js +172 -103
  31. package/dist/shared/assistant/history/historyTransportErrors.d.ts +28 -0
  32. package/dist/shared/assistant/history/historyTransportErrors.d.ts.map +1 -0
  33. package/dist/shared/assistant/history/historyTransportErrors.js +16 -0
  34. package/dist/shared/assistant/history/historyTypes.d.ts +80 -1
  35. package/dist/shared/assistant/history/historyTypes.d.ts.map +1 -1
  36. package/dist/shared/assistant/history/stampRegistry.d.ts +19 -1
  37. package/dist/shared/assistant/history/stampRegistry.d.ts.map +1 -1
  38. package/dist/shared/assistant/history/stampRegistry.js +13 -1
  39. package/dist/shared/assistant/index.d.ts +2 -0
  40. package/dist/shared/assistant/index.d.ts.map +1 -1
  41. package/dist/shared/assistant/store.d.ts +8 -0
  42. package/dist/shared/assistant/store.d.ts.map +1 -1
  43. package/dist/shared/assistant/store.js +50 -46
  44. package/dist/shared-assistant.js +164 -162
  45. 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 { isHistoryConversationBusy as t, setAssistantStorageFullHandler as n, setHistoryOpenFilterSource as r, setHistoryStampSource as i } from "./stampRegistry.js";
3
- import { useAssistantStore as a } from "../store.js";
4
- import { isTurnInFlight as o } from "../turnState.js";
5
- import { getActorId as s, getWorkspaceId as c } from "../context.js";
6
- import { createGatewayHistoryTransport as l } from "./historyApi.js";
7
- import { ASSISTANT_HISTORY_QUOTA_RETRY_MS as u, ASSISTANT_HISTORY_SCHEMA_PAUSE_MS as d, assistantHistoryBackoffMs as ee, classifyAssistantHistoryError as f, planAssistantHistoryRetry as te } from "./historyErrors.js";
8
- import { assistantHistoryScopeKey as p, completeAssistantHistoryScope as ne, isLegacyHistoryConvKey as re } from "./historyTypes.js";
9
- import { historyConvKeyOf as ie, historyHeaderOf as m, historyScopeKeyOfStamp as h, materializeHistoryHeader as ae, selectHistoryEvictions as oe } from "./historyList.js";
10
- import { fromHistoryEntry as se, historyEntriesMatchKind as ce, isHistoryClientId as le, toHistoryEntries as ue } from "./historyMapping.js";
11
- import { applyHistoryPage as de, planHistoryEarlierLoad as fe, planHistoryOpenLoad as pe } from "./historyMerge.js";
12
- import { assistantHistoryGenerationOf as me, isCurrentAssistantHistoryGeneration as he, useAssistantHistoryStatus as ge } from "./historyStatus.js";
13
- import { assistantHistoryStore as g } from "./historyStore.js";
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 _e = 1e3, ve = 3e4, ye = 2e3, be = 15e3, xe = 5 * 6e4, Se = 2e3, Ce = 100, we = 10, Te = 100, Ee = 5, De = 3, Oe = 2, ke = [10, 0], Ae = 3e4, _ = 1440 * 60 * 1e3;
16
- function v() {
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 je() {
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 Me(e, t) {
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 Ne = (e, t) => {
49
+ var Le = (e, t) => {
48
50
  console.warn(`[assistant] history: ${e}`, t ?? "");
49
- }, Pe = (e) => e.entries.map((e) => e.clientMessageId);
50
- function y(l) {
51
- let { transport: g, storage: _, clock: v } = l, y = _.useStore, b = l.mainStore ?? a, x = l.status ?? ge, Fe = l.locks === void 0 ? je() : l.locks, Ie = l.random ?? Math.random, S = () => Me(l.readActorId ?? s, null), Le = () => Me(l.readWorkspaceId ?? c, ""), Re = l.isConversationBusy ?? t, C = l.log ?? Ne, w = /* @__PURE__ */ new Map(), T = null, E = null, D = null, O = 0, k = !1, ze = !1, A = !1, Be = null, Ve = !1, He = !1, j = 0, Ue = -Infinity, M = null, We = !1, N = null, Ge = /* @__PURE__ */ new Set(), P = /* @__PURE__ */ new Map(), F = /* @__PURE__ */ new Map(), I = /* @__PURE__ */ new Map(), L = /* @__PURE__ */ new Set(), R = [], z = () => v.now(), B = () => E ? p(E) : null, Ke = () => z() < O, V = () => T !== null && D === null && _.isBoundToActiveProfile(), H = () => V() && E !== null && !Ke() && !k, U = (e) => (L.add(e), e.finally(() => L.delete(e)).catch(() => void 0), e), W = (e, t, n, r = !1) => {
52
- let i = z() + Math.max(0, t), a = I.get(e);
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 && v.clearTimeout(a.handle);
55
- let o = v.setTimeout(() => {
56
- I.get(e)?.handle === o && I.delete(e), n();
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
- I.set(e, {
66
+ R.set(e, {
59
67
  handle: o,
60
68
  at: i
61
69
  });
62
- }, qe = (e) => {
63
- let t = I.get(e);
64
- t && v.clearTimeout(t.handle), I.delete(e);
65
- }, Je = () => me(x.getState(), _.boundKey()), G = (e) => T !== null && _.isBoundToActiveProfile() && he(e, x.getState(), _.boundKey()), K = (e) => b.getState().conversations.find((t) => t.id === e), q = (e) => o(b.getState().processingByConversationId[e]?.status) || Me(() => Re(e), !0), Ye = (e, t) => {
66
- let n = y.getState().scopes[e]?.headers[t];
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 = x.getState().olderHeaders;
76
+ let r = E.getState().olderHeaders;
69
77
  return r?.scopeKey === e ? r.headers[t] ?? null : null;
70
- }, Xe = () => {
71
- if (D) return D;
72
- if (_.isBoundToActiveProfile()) return Promise.resolve(!0);
73
- if (_.heldByNewerBuild() || _.activeProfileKey() === null) return Promise.resolve(!1);
74
- x.getState().noteUnsavedDelete(void 0);
75
- let e = U(_.rebind().then(() => _.isBoundToActiveProfile(), () => !1));
76
- return D = e, e.then(() => {
77
- D === e && (D = null);
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
- }, Ze = (e) => {
80
- let t = e ? p(e) : null, n = t !== B();
81
- E = e, x.getState().setHistoryScope(T, T === null ? null : t), !(!n || T === null) && (k = !1, qe("auth"), j = 0, Ue = -Infinity, M = null, N = null, P.clear(), U(Xe().then((t) => {
82
- !t || E !== e || (Y(), X(), $("scope"), Q());
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
- }, J = () => {
85
- if (T === null) return;
86
- let e = ne(S(), Le(), T);
87
- if ((e ? p(e) : null) !== B()) {
88
- Ze(e);
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 = _.activeProfileKey();
92
- if (t === null || t === _.boundKey()) {
93
- Y();
104
+ let t = x.activeProfileKey();
105
+ if (t === null || t === x.boundKey()) {
106
+ ht();
94
107
  return;
95
108
  }
96
- U(Xe().then((e) => {
97
- e && (X(), Y(), $("bind"), Q());
109
+ U(pt().then((e) => {
110
+ e && (X(), ht(), $("bind"), Q());
98
111
  }));
99
112
  };
100
- function Y() {
113
+ function ht() {
101
114
  let e = B();
102
115
  if (e === null) return;
103
- let t = b.getState(), n = t.conversations.find((e) => e.id === t.activeConversationId);
104
- !n?.sync || h(n.sync) === e || q(n.id) || t.setActiveConversation(null);
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 (!_.isBoundToActiveProfile()) return;
108
- let e = y.getState().tombstones, t = x.getState().olderHeaders;
109
- t && Object.keys(t.headers).some((t) => t in e) && x.getState().setOlderHeaders({
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 = b.getState(), r = n.conversations.filter((t) => {
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 && h(t.sync) === n.scopeKey;
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) x.getState().noteRemoteDelete({
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 Qe(e, t, n) {
127
- let r = y.getState();
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
- x.getState().setHistoryPaused(Ke() ? O : void 0, e.class);
149
+ E.getState().setHistoryPaused(st() ? M : void 0, e.class);
137
150
  }
138
- function $e(e, t) {
139
- O = Math.max(O, z() + e), x.getState().setHistoryPaused(O, t.class), W("pause", O - z(), () => {
140
- x.getState().setHistoryPaused(void 0, t.class), $("resume"), Q();
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 et(e) {
144
- k = !0, Z(e), W("auth", xe, () => {
145
- k = !1, $("auth-recheck"), Q();
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 tt(e) {
161
+ function yt(e) {
149
162
  switch (e.class) {
150
- case "schema-unavailable": return $e(d, e), !0;
151
- case "auth": return et(e), !0;
152
- case "scope-inactive": return Z(e), J(), !0;
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 nt = (e) => e.product === T && S() === e.actorId, rt = (e, t, n, r) => {
157
- if (T === null) return;
158
- let i = K(e), a = i?.sync;
159
- if (!i || !a || a.origin !== "created" && a.origin !== "remote" || !nt(a)) return;
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
- b.getState().patchConversationSync(e, (e) => ({
175
+ T.getState().patchConversationSync(e, (e) => ({
162
176
  ...e,
163
177
  blocked: "scope"
164
178
  }));
165
179
  return;
166
180
  }
167
- let s = t.map((e) => i.messages.find((t) => t.id === e));
168
- if (s.length === 0 || !le(e)) return;
169
- let c = s.filter((e) => e !== void 0);
170
- if (c.length !== s.length) return;
171
- let l = ue(c, {
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 (!ce(n, l)) {
177
- C("a committed turn does not have the shape the server stores; kept on this device", {
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: l.map((e) => e.role)
193
+ roles: c.map((e) => e.role)
180
194
  });
181
195
  return;
182
196
  }
183
- let u = {
197
+ let l = {
184
198
  id: `save:${e}:${t.join("+")}`,
185
199
  type: "save",
186
- scopeKey: h(a),
200
+ scopeKey: y(a),
187
201
  convKey: e,
188
202
  kind: n,
189
- entries: l,
203
+ entries: c,
190
204
  attempts: 0
191
- }, d = () => {
192
- if (!_.isBoundToActiveProfile() || !nt(a)) return;
193
- let n = y.getState();
194
- e in n.tombstones || (n.enqueueHistoryItem(u), y.getState().outbox.some((e) => e.id === u.id) && (b.getState().markHistoryState(e, t, "pending"), Q()));
195
- }, ee = () => {
196
- V() ? d() : U(Xe().then((e) => e ? d() : void 0));
197
- }, f = b.getState().processingByConversationId[e];
198
- if (n === "NOTE" && o(f?.status)) {
199
- F.set(e, [...F.get(e) ?? [], ee]);
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
- ee();
216
+ f();
203
217
  };
204
- function it(e) {
205
- for (let [t, n] of [...F]) o(e.processingByConversationId[t]?.status) || (F.delete(t), U(Promise.resolve().then(() => {
206
- if (T !== null) for (let e of n) e();
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 at = (e) => {
210
- let t = b.getState(), n = t.conversations.find((t) => t.id === e), r = n?.sync, i = B();
211
- if (n && !r || T === null || !_.isBoundToActiveProfile()) {
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 ? h(r) : i;
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 = Ye(a, e);
234
+ let o = ut(a, e);
221
235
  if (!n && !o) return;
222
- let s = r?.origin === "legacy" || o?.legacy === !0 || re(e), c = r?.serverId ?? o?.serverId ?? (re(e) ? e.slice(7) : void 0), l = y.getState(), u = z(), d = !s || c ? {
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 && b.getState().deleteConversation(e), l.recordHistoryDelete(e, {
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 && _.persistFailing() && x.getState().noteUnsavedDelete({
250
+ }, d), d && x.persistFailing() && E.getState().noteUnsavedDelete({
237
251
  conversationId: e,
238
252
  at: u
239
253
  }), Q();
240
- }, ot = (e) => e.nextAttemptAt === void 0 || e.nextAttemptAt <= z(), Q = () => {
241
- if (!H()) return;
242
- if (ze) {
243
- A = !0, Be?.();
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
- ze = !0, A = !1;
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:${_.boundKey() ?? ""}:${e}`;
251
- if (!Fe) {
252
- await st(e);
298
+ let t = `bf-assistant-history:${x.boundKey() ?? ""}:${e}`;
299
+ if (!Be) {
300
+ await Ot(e);
253
301
  return;
254
302
  }
255
- await Fe.request(t, async (t) => {
256
- t ? await st(e) : W("drain", be, Q);
303
+ await Be.request(t, async (t) => {
304
+ t ? await Ot(e) : W("drain", we, Q);
257
305
  });
258
- })().catch((e) => C("the save queue stopped unexpectedly", e)).finally(() => {
259
- ze = !1, A && Q();
306
+ })().catch((e) => D("the save queue stopped unexpectedly", e)).finally(() => {
307
+ Ke = !1, qe && Q();
260
308
  }));
261
309
  };
262
- async function st(e) {
310
+ async function Ot(e) {
263
311
  let t = /* @__PURE__ */ new Map();
264
- for (; !(!H() || B() !== e);) {
265
- A = !1;
312
+ for (; !(!V() || B() !== e);) {
313
+ qe = !1;
266
314
  let n = null, r = /* @__PURE__ */ new Map();
267
- for (let t of y.getState().outbox) t.scopeKey === e && !r.has(t.convKey) && r.set(t.convKey, t);
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 (!ot(a)) {
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 >= Oe || t.set(i, ct(i, e).finally(() => {
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
- Be = e;
334
+ Je = e;
281
335
  });
282
- await Promise.race([...t.values(), i]), Be = null;
336
+ await Promise.race([...t.values(), i]), Je = null;
283
337
  }
284
338
  await Promise.all(t.values());
285
339
  }
286
- async function ct(e, t) {
340
+ async function kt(e, t) {
287
341
  for (;;) {
288
- if (!H() || B() !== t) return;
289
- let n = y.getState().outbox.find((n) => n.convKey === e && n.scopeKey === t);
290
- if (!n || !ot(n) || (n.type === "save" ? await lt(n) : await dt(n)) === "stop") return;
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 lt(e) {
294
- if (e.convKey in y.getState().tombstones) return y.getState().completeHistoryItems([e.id], z()), "next";
295
- let t = E;
296
- if (!t || p(t) !== e.scopeKey) return "stop";
297
- let n = _.boundKey(), r;
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 g.save(t, {
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 ft(e, t, n);
359
+ return Ft(e, t, n);
306
360
  }
307
- return ut(e, r, n), "next";
361
+ return jt(e, r, n), "next";
308
362
  }
309
- function ut(e, t, n) {
310
- if (_.boundKey() !== n) return;
311
- let r = y.getState(), i = r.outbox.some((t) => t.id === e.id);
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
- Qe(e.convKey, e.scopeKey, t.conversation.id), $("deleted");
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 && C("the server did not keep some message details", t.droppedMetadataKeys), r.applyHistoryHeaders(e.scopeKey, { [e.convKey]: m(t.conversation) });
322
- let a = K(e.convKey);
323
- if (a?.sync && h(a.sync) === e.scopeKey) {
324
- let n = new Set(Pe(e)), r = {};
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
- b.getState().markHistoryState(e.convKey, [...n], "saved", r), b.getState().patchConversationSync(e.convKey, (e) => {
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", ye, () => $("applied"), !0);
392
+ W("pull-after-save", Ce, () => $("applied"), !0);
339
393
  }
340
- async function dt(e) {
341
- let t = E;
342
- if (!t || p(t) !== e.scopeKey) return "stop";
343
- let n = e.legacy && e.serverId ? { conversationId: e.serverId } : { clientConversationId: e.convKey }, r = _.boundKey(), i;
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 g.remove(t, n);
399
+ i = await b.remove(t, n);
346
400
  } catch (t) {
347
- return ft(e, t, r);
401
+ return Ft(e, t, r);
348
402
  }
349
- if (_.boundKey() !== r) return "stop";
350
- let a = y.getState();
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
- }), x.getState().unsavedDelete?.conversationId === e.convKey && x.getState().noteUnsavedDelete(void 0), "next";
359
- }
360
- function ft(e, t, n) {
361
- let r = f(t);
362
- if (_.boundKey() !== n) return "stop";
363
- let i = te(r, e, Ie), a = y.getState();
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()), b.getState().patchConversationSync(e.convKey, (e) => ({
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), C("the server refused a saved turn; it stays on this device", r), "next";
369
- case "pause": return tt(r), "stop";
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, u)
375
- })), b.getState().patchConversationSync(e.convKey, (e) => ({
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 tt(r), "stop";
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 (H() && !((e === "focus" || e === "visibility") && z() - Ue < ve)) {
389
- if (Ve) {
390
- He = !0;
504
+ if (V() && !((e === "focus" || e === "visibility") && z() - Qe < Se)) {
505
+ if (Ye) {
506
+ Xe = !0;
391
507
  return;
392
508
  }
393
- Ve = !0, He = !1, Ue = z(), U(pt().catch((e) => C("a history pull stopped unexpectedly", e)).finally(() => {
394
- Ve = !1, He && $("again");
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 pt() {
399
- let e = E, t = Je();
514
+ async function It() {
515
+ let e = A, t = G();
400
516
  if (!e || !t) return;
401
- gt(t.scopeKey);
517
+ zt(t.scopeKey);
402
518
  let n = !1;
403
- for (let r = 0; r < we; r += 1) {
404
- let i = y.getState().scopes[t.scopeKey], a = i?.gen ?? 0, o;
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 g.changes(e, {
407
- first: Ce,
522
+ o = await b.changes(e, {
523
+ first: De,
408
524
  after: i?.cursor ?? null
409
525
  });
410
526
  } catch (e) {
411
- G(t) && yt(e);
527
+ K(t) && Ht(e);
412
528
  return;
413
529
  }
414
- if (!G(t)) return;
415
- if (j = 0, o.resetRequired && !ht(i)) {
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 = y.getState().resetHistoryScope(t.scopeKey, z());
419
- N = {
534
+ let e = w.getState().resetHistoryScope(t.scopeKey, z());
535
+ F = {
420
536
  scopeKey: t.scopeKey,
421
537
  gen: e,
422
- candidates: _t(t.scopeKey),
538
+ candidates: Bt(t.scopeKey),
423
539
  seen: /* @__PURE__ */ new Set()
424
540
  }, r = -1;
425
541
  continue;
426
542
  }
427
- if (!mt(t.scopeKey, a, o)) return;
543
+ if (!Lt(t.scopeKey, a, o)) return;
428
544
  if (!o.pageInfo.hasNextPage) {
429
- vt(t.scopeKey), kt();
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 mt(e, t, n) {
436
- let r = y.getState(), i = {}, a = {}, o = [], s = r.scopes[e]?.cursorRev ?? 0;
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 = ie(t);
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
- N?.scopeKey === e && N.seen.add(n), !(n in r.tombstones) && (i[n] = m(t), o.push({
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)) y.getState().dropHistoryItems(e, (e) => e.type === "delete", z());
575
+ for (let e of Object.keys(a)) w.getState().dropHistoryItems(e, (e) => e.type === "delete", z());
460
576
  X();
461
- let c = b.getState();
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 || h(n.sync) !== e || b.getState().patchConversationSync(t.convKey, (e) => ({
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 ht(e) {
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 gt(e) {
478
- let t = y.getState().scopes[e], n = t?.gen ?? 0;
479
- if (t?.rescanning && !(N?.scopeKey === e && N.gen === n)) {
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
- N = null;
597
+ F = null;
482
598
  return;
483
599
  }
484
- N = {
600
+ F = {
485
601
  scopeKey: e,
486
602
  gen: n,
487
- candidates: _t(e),
603
+ candidates: Bt(e),
488
604
  seen: new Set(Object.keys(t.headers))
489
605
  };
490
606
  }
491
607
  }
492
- function _t(e) {
493
- return new Set(b.getState().conversations.filter((t) => t.sync !== void 0 && !!t.sync.serverId && h(t.sync) === e).map((e) => e.id));
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 vt(e) {
496
- let t = N;
497
- if (!t || t.scopeKey !== e || (N = null, (y.getState().scopes[e]?.gen ?? 0) !== t.gen)) return;
498
- let n = new Set(y.getState().outbox.map((e) => e.convKey)), r = b.getState(), i = r.conversations.filter((r) => t.candidates.has(r.id) && r.sync !== void 0 && h(r.sync) === e && !t.seen.has(r.id) && !n.has(r.id) && !q(r.id)).map((e) => e.id);
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) && x.getState().noteRemoteDelete({
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 yt(e) {
508
- let t = f(e);
623
+ function Ht(e) {
624
+ let t = h(e);
509
625
  if (t.class === "rejected") {
510
- $e(d, t);
626
+ _t(m, t);
511
627
  return;
512
628
  }
513
- tt(t) || (j += 1, W("pull-retry", Math.max(ee(j, Ie), t.retryAfterMs ?? 0), () => $("retry")));
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
- let bt = () => {
516
- let e = E, t = Je();
517
- !H() || !e || !t || We || (We = !0, U((async () => {
518
- let n = x.getState().olderHeaders, r = n?.scopeKey === t.scopeKey ? { ...n.headers } : {}, i = M?.scopeKey === t.scopeKey ? M.cursor : null, a = !0;
519
- for (let n = 0; n < Ee && a; n += 1) {
520
- let n = await g.conversations(e, {
521
- first: Te,
522
- after: i
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 (!G(t)) return;
525
- let o = y.getState(), s = o.scopes[t.scopeKey]?.headers ?? {}, c = 0;
526
- for (let e of n.nodes) {
527
- let t = ie(e);
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
- if (i = n.pageInfo.endCursor ?? i, a = n.pageInfo.hasNextPage, M = {
531
- scopeKey: t.scopeKey,
532
- cursor: i
533
- }, c > 0) break;
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
- let o = y.getState().tombstones, s = Object.fromEntries(Object.entries(r).filter(([e]) => !(e in o)));
536
- x.getState().setOlderHeaders({
537
- scopeKey: t.scopeKey,
538
- headers: s,
539
- hasMore: a
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
- G(t) && yt(e);
744
+ K(r) && Ht(e);
543
745
  }).finally(() => {
544
- We = !1;
545
- })));
546
- }, xt = (e, t = {}) => {
547
- let n = b.getState(), r = n.conversations.find((t) => t.id === e), i = B();
548
- if (T === null || i === null || !E) {
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 (!(_.isBoundToActiveProfile() && e in y.getState().tombstones)) {
754
+ if (!(x.isBoundToActiveProfile() && e in w.getState().tombstones)) {
553
755
  if (!r) {
554
- let a = Ye(i, e);
555
- if (!a || a.gone || (y.getState().applyHistoryHeaders(i, { [e]: a }), n.upsertRemoteConversation(ae(e, a, E, {
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 = K(e), !r)) return;
767
+ })), r = q(e), !r) return;
560
768
  }
561
- r.sync && h(r.sync) !== i || (b.getState().setActiveConversation(e), r.sync && (b.getState().patchConversationSync(e, (e) => ({
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
- })), St(e, "open")), kt());
772
+ })), Xt(e, "open")), rn());
565
773
  }
566
- }, St = (e, t) => {
567
- let n = E, r = B();
568
- if (T === null || !n || r === null || Ge.has(e) || _.heldByNewerBuild()) return;
569
- if (!H()) {
570
- Et(e, t);
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 = K(e)?.sync;
574
- if (!i || h(i) !== r || e in y.getState().tombstones) return;
575
- if (q(e)) {
576
- Et(e, t);
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 = Ye(r, e), o = t === "earlier" ? fe(i) : pe(i, a ? a.lastMessageSeq : null);
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 = Je();
582
- s && (Ge.add(e), x.getState().setConversationLoading(e, !0), x.getState().setConversationLoadError(e, !1), U(Ct(e, n, i.origin === "legacy" ? { conversationId: i.serverId ?? e.slice(7) } : { clientConversationId: e }, o, s, t).catch((t) => Tt(e, i, t, s)).finally(() => {
583
- Ge.delete(e), G(s) && x.getState().setConversationLoading(e, !1);
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 Ct(e, t, n, r, i, a) {
794
+ async function Zt(e, t, n, r, i, a) {
587
795
  let o = r.paging;
588
- for (let s = 0; s < De; s += 1) {
589
- let s = await g.entries(t, n, o);
590
- if (!G(i)) return;
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
- Qe(e, i.scopeKey, s.conversation.id);
800
+ gt(e, i.scopeKey, s.conversation.id);
593
801
  return;
594
802
  }
595
- let c = wt(e, i.scopeKey, s, r);
803
+ let c = Qt(e, i.scopeKey, s, r);
596
804
  if (c === "deferred") {
597
- Et(e, a);
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 = K(e)?.sync?.lastSeq ?? 0, u = s.nodes.at(-1)?.seq ?? null;
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 wt(e, t, n, r) {
610
- if (e in y.getState().tombstones) return "skipped";
611
- let i = K(e), a = i?.sync;
612
- if (!i || !a || h(a) !== t) return "skipped";
613
- if (q(e)) return "deferred";
614
- y.getState().applyHistoryHeaders(t, { [e]: m(n.conversation) });
615
- let o = n.nodes.map(se), { messages: s, syncPatch: c } = de(a, i.messages, o, n, r);
616
- return b.getState().applyHistoryEntries(e, s, c), "applied";
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 Tt(e, t, n, r) {
619
- if (!G(r)) return;
620
- let i = f(n);
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
- y.getState().markHistoryHeaderGone(r.scopeKey, e), x.getState().setConversationLoadError(e, !0), C("the server does not have a conversation the list showed", e);
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
- x.getState().setConversationLoadError(e, !0), i.class === "rejected" ? $e(d, i) : tt(i);
834
+ E.getState().setConversationLoadError(e, !0), i.class === "rejected" ? _t(m, i) : yt(i);
627
835
  }
628
- function Et(e, t) {
629
- P.get(e) !== "open" && P.set(e, t), W("deferred-loads", Se, Dt);
836
+ function en(e, t) {
837
+ I.get(e) !== "open" && I.set(e, t), W("deferred-loads", Ee, tn);
630
838
  }
631
- function Dt() {
632
- if (!H()) {
633
- P.size > 0 && T !== null && W("deferred-loads", Se, Dt);
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 [...P]) q(e) || (P.delete(e), St(e, t));
637
- P.size > 0 && W("deferred-loads", Se, Dt);
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 Ot(e) {
640
- if (!_.isBoundToActiveProfile()) return [];
641
- let t = y.getState(), n = new Set(t.outbox.map((e) => e.convKey)), r = b.getState(), i = oe({
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) || q(e.id) || !e.sync) return !0;
647
- let r = t.scopes[h(e.sync)]?.headers[e.id];
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 kt() {
654
- Ot(25);
861
+ function rn() {
862
+ nn(25);
655
863
  }
656
- function At(e) {
657
- for (let t of ke) if (Ot(t).length !== 0 && !e()) return;
864
+ function an(e) {
865
+ for (let t of Pe) if (nn(t).length !== 0 && !e()) return;
658
866
  }
659
- function jt() {
660
- if (_.isBoundToActiveProfile()) {
661
- for (let e of ke) if (Ot(e).length !== 0 && _.flush()) return;
662
- W("history-flush", Ae, Mt);
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 Mt() {
666
- !_.isBoundToActiveProfile() || !_.persistFailing() || _.flush();
873
+ function sn() {
874
+ !x.isBoundToActiveProfile() || !x.persistFailing() || x.flush();
667
875
  }
668
- function Nt(e) {
876
+ function cn(e) {
669
877
  if (e) {
670
- jt();
878
+ on();
671
879
  return;
672
880
  }
673
- qe("history-flush"), x.getState().unsavedDelete && x.getState().noteUnsavedDelete(void 0);
881
+ lt("history-flush"), E.getState().unsavedDelete && E.getState().noteUnsavedDelete(void 0);
674
882
  }
675
- function Pt() {
676
- let e = T === null ? null : ne(S(), Le(), T), t = e ? p(e) : null, n = _.isBoundToActiveProfile() ? y.getState().tombstones : {};
677
- return (e) => !e.sync || t !== null && p(e.sync) === t && !(e.id in n);
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 Ft() {
680
- if (l.watchScope === !1) return;
887
+ function un() {
888
+ if (g.watchScope === !1) return;
681
889
  let t = () => {
682
- J(), W("scope-poll", _e, t, !0);
890
+ Y(), W("scope-poll", xe, t, !0);
683
891
  };
684
- if (W("scope-poll", _e, t, !0), typeof window > "u" || typeof window.addEventListener != "function") return;
892
+ if (W("scope-poll", xe, t, !0), typeof window > "u" || typeof window.addEventListener != "function") return;
685
893
  let n = () => {
686
- J(), $("focus"), Q();
894
+ Y(), $("focus"), Q();
687
895
  }, r = () => {
688
- typeof document < "u" && document.visibilityState !== "visible" || (J(), $("visibility"), Q());
896
+ typeof document < "u" && document.visibilityState !== "visible" || (Y(), $("visibility"), Q());
689
897
  }, i = () => {
690
- J(), Mt(), zt(), $("online"), Q();
691
- }, a = () => J(), o = () => Mt();
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), R.push(() => {
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 It(e) {
697
- T = e, i(() => T === null || _.heldByNewerBuild() ? null : ne(S(), Le(), T)), n(At), r(Pt), _.setWriteListener(Nt), R.push(y.subscribe((e, t) => {
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
- }), b.subscribe((e, t) => {
703
- let n = e.activeConversationId, r = n !== null && o(t.processingByConversationId[n]?.status) && !o(e.processingByConversationId[n]?.status);
704
- (n !== t.activeConversationId || r) && (J(), Y()), F.size > 0 && e.processingByConversationId !== t.processingByConversationId && it(e), P.size > 0 && e.processingByConversationId !== t.processingByConversationId && Dt();
705
- })), Ft(), J();
706
- }
707
- function Lt() {
708
- T = null, E = null, i(null), n(null), r(null), _.setWriteListener(null), x.getState().noteUnsavedDelete(void 0);
709
- for (let e of R) e();
710
- R = [];
711
- for (let e of [...I.keys()]) qe(e);
712
- P.clear(), F.clear(), k = !1, x.getState().setHistoryScope(null, null);
713
- }
714
- let Rt = (e) => {
715
- w.set(e, (w.get(e) ?? 0) + 1), T === null ? It(e) : T !== e && C("a second product asked for server history in the same page; the first keeps it", {
716
- active: T,
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 = (w.get(e) ?? 1) - 1;
724
- if (n > 0 ? w.set(e, n) : w.delete(e), e !== T || w.has(e)) return;
725
- Lt();
726
- let r = w.keys().next();
727
- r.done || It(r.value);
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 zt() {
731
- if (!V()) return;
732
- let e = y.getState();
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: Rt,
740
- setScope: Ze,
741
- refreshScope: J,
742
- recordCommittedEntries: rt,
743
- deleteConversation: at,
744
- openConversation: xt,
745
- loadEarlier: (e) => St(e, "earlier"),
746
- loadOlderHeaders: bt,
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 (!V()) return;
749
- let e = y.getState();
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 && L.size > 0; e += 1) await Promise.allSettled([...L]);
970
+ for (let e = 0; e < 1e3 && at.size > 0; e += 1) await Promise.allSettled([...at]);
762
971
  },
763
972
  dispose() {
764
- w.clear(), T !== null && Lt();
973
+ O.clear(), k !== null && fn();
765
974
  }
766
975
  };
767
976
  }
768
- var b = y({
769
- transport: l(),
770
- storage: g,
771
- clock: v()
977
+ var T = w({
978
+ transport: g(),
979
+ storage: b,
980
+ clock: S()
772
981
  });
773
982
  //#endregion
774
- export { _ as ASSISTANT_HISTORY_RESET_TRUST_MS, b as assistantHistory, y as createAssistantHistoryEngine, v as createSystemHistoryClock };
983
+ export { x as ASSISTANT_HISTORY_RESET_TRUST_MS, T as assistantHistory, w as createAssistantHistoryEngine, S as createSystemHistoryClock };