@burdenoff/fe-libs 2026.926.5 → 2026.927.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/shared/assistant/conversation.d.ts +91 -3
- package/dist/shared/assistant/conversation.d.ts.map +1 -1
- package/dist/shared/assistant/gatewayClient.d.ts +15 -0
- package/dist/shared/assistant/gatewayClient.d.ts.map +1 -1
- package/dist/shared/assistant/gatewayClient.js +1 -1
- package/dist/shared/assistant/guardedStorage.d.ts +4 -2
- package/dist/shared/assistant/guardedStorage.d.ts.map +1 -1
- package/dist/shared/assistant/guardedStorage.js +1 -1
- package/dist/shared/assistant/history/historyApi.d.ts +38 -0
- package/dist/shared/assistant/history/historyApi.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyApi.js +153 -0
- package/dist/shared/assistant/history/historyEngine.d.ts +96 -0
- package/dist/shared/assistant/history/historyEngine.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyEngine.js +774 -0
- package/dist/shared/assistant/history/historyErrors.d.ts +72 -0
- package/dist/shared/assistant/history/historyErrors.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyErrors.js +74 -0
- package/dist/shared/assistant/history/historyList.d.ts +115 -0
- package/dist/shared/assistant/history/historyList.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyList.js +116 -0
- package/dist/shared/assistant/history/historyMapping.d.ts +65 -0
- package/dist/shared/assistant/history/historyMapping.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyMapping.js +383 -0
- package/dist/shared/assistant/history/historyMerge.d.ts +65 -0
- package/dist/shared/assistant/history/historyMerge.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyMerge.js +97 -0
- package/dist/shared/assistant/history/historyOperations.d.ts +24 -0
- package/dist/shared/assistant/history/historyOperations.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyOperations.js +125 -0
- package/dist/shared/assistant/history/historyResume.d.ts +56 -0
- package/dist/shared/assistant/history/historyResume.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyResume.js +55 -0
- package/dist/shared/assistant/history/historyStatus.d.ts +76 -0
- package/dist/shared/assistant/history/historyStatus.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyStatus.js +47 -0
- package/dist/shared/assistant/history/historyStore.d.ts +192 -0
- package/dist/shared/assistant/history/historyStore.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyStore.js +503 -0
- package/dist/shared/assistant/history/historyTimestamps.d.ts +11 -0
- package/dist/shared/assistant/history/historyTimestamps.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyTimestamps.js +9 -0
- package/dist/shared/assistant/history/historyTypes.d.ts +256 -0
- package/dist/shared/assistant/history/historyTypes.d.ts.map +1 -0
- package/dist/shared/assistant/history/historyTypes.js +20 -0
- package/dist/shared/assistant/history/profileBoundStorage.d.ts +36 -0
- package/dist/shared/assistant/history/profileBoundStorage.d.ts.map +1 -0
- package/dist/shared/assistant/history/profileBoundStorage.js +74 -0
- package/dist/shared/assistant/history/stampRegistry.d.ts +84 -0
- package/dist/shared/assistant/history/stampRegistry.d.ts.map +1 -0
- package/dist/shared/assistant/history/stampRegistry.js +58 -0
- package/dist/shared/assistant/history/useAssistantServerHistory.d.ts +18 -0
- package/dist/shared/assistant/history/useAssistantServerHistory.d.ts.map +1 -0
- package/dist/shared/assistant/history/useAssistantServerHistory.js +12 -0
- package/dist/shared/assistant/i18nManifest.d.ts +18 -0
- package/dist/shared/assistant/i18nManifest.d.ts.map +1 -1
- package/dist/shared/assistant/i18nManifest.js +18 -0
- package/dist/shared/assistant/index.d.ts +16 -0
- package/dist/shared/assistant/index.d.ts.map +1 -1
- package/dist/shared/assistant/liveTurns.d.ts +7 -0
- package/dist/shared/assistant/liveTurns.d.ts.map +1 -1
- package/dist/shared/assistant/liveTurns.js +35 -32
- package/dist/shared/assistant/spokenTurns.d.ts +20 -0
- package/dist/shared/assistant/spokenTurns.d.ts.map +1 -1
- package/dist/shared/assistant/spokenTurns.js +13 -8
- package/dist/shared/assistant/store.d.ts +35 -1
- package/dist/shared/assistant/store.d.ts.map +1 -1
- package/dist/shared/assistant/store.js +93 -24
- package/dist/shared/assistant/ui/AIAssistantPanel.d.ts +16 -0
- package/dist/shared/assistant/ui/AIAssistantPanel.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AIAssistantPanel.js +63 -60
- package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.js +730 -672
- package/dist/shared/assistant/ui/AssistantConversationList.d.ts +17 -0
- package/dist/shared/assistant/ui/AssistantConversationList.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantConversationList.js +252 -145
- package/dist/shared/assistant/ui/AssistantHistoryNotices.d.ts +36 -0
- package/dist/shared/assistant/ui/AssistantHistoryNotices.d.ts.map +1 -0
- package/dist/shared/assistant/ui/AssistantHistoryNotices.js +103 -0
- package/dist/shared/assistant/ui/AssistantOverlay.d.ts +4 -0
- package/dist/shared/assistant/ui/AssistantOverlay.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantOverlay.js +97 -94
- package/dist/shared/assistant/ui/AssistantSpokenTurnsNotice.d.ts +5 -3
- package/dist/shared/assistant/ui/AssistantSpokenTurnsNotice.d.ts.map +1 -1
- package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts +6 -0
- package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts.map +1 -1
- package/dist/shared/assistant/ui/composer/AssistantComposer.js +54 -54
- package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts +9 -0
- package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.d.ts.map +1 -1
- package/dist/shared/assistant/ui/voice/VoiceTranscriptDrawer.js +37 -32
- package/dist/shared/assistant/voice/turnVisibility.d.ts +7 -5
- package/dist/shared/assistant/voice/turnVisibility.d.ts.map +1 -1
- package/dist/shared/assistant/voice/voiceTranscript.d.ts +3 -2
- package/dist/shared/assistant/voice/voiceTranscript.d.ts.map +1 -1
- package/dist/shared-assistant.js +153 -137
- package/package.json +1 -1
|
@@ -1,3 +1,20 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The history drawer.
|
|
4
|
+
*
|
|
5
|
+
* ★★ BOFF-7335: with server history OFF (every product that has not opted in)
|
|
6
|
+
* this is the device's own list, exactly as it always was. With it ON, two
|
|
7
|
+
* groups, never mixed:
|
|
8
|
+
*
|
|
9
|
+
* - "This workspace": this account's conversations in this workspace — the
|
|
10
|
+
* ones held here and the ones only the server has so far (opened, they are
|
|
11
|
+
* read from it) — newest first, with "Show older conversations" past the
|
|
12
|
+
* ones kept on this device.
|
|
13
|
+
* - "On this device": everything from before history was on. Never uploaded;
|
|
14
|
+
* usable exactly as before.
|
|
15
|
+
*
|
|
16
|
+
* A conversation of another account or workspace is not listed, and a deleted
|
|
17
|
+
* one is gone from the list at once, before the server has heard of it.
|
|
18
|
+
*/
|
|
2
19
|
export declare const AssistantConversationList: FC;
|
|
3
20
|
//# sourceMappingURL=AssistantConversationList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantConversationList.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantConversationList.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"AssistantConversationList.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantConversationList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AA0B9E;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAmdvC,CAAC"}
|
|
@@ -4,162 +4,269 @@ import { chatTurns as n } from "../voice/turnVisibility.js";
|
|
|
4
4
|
import { useAssistantStore as r } from "../store.js";
|
|
5
5
|
import { getAssistantDisplayContent as i } from "../displayContent.js";
|
|
6
6
|
import { useOverlayFocus as a } from "./useOverlayFocus.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { AssistantHistoryUnsavedDeleteNotice as o } from "./AssistantHistoryNotices.js";
|
|
8
|
+
import { selectAssistantHistoryList as s } from "../history/historyList.js";
|
|
9
|
+
import { useAssistantHistoryStatus as c } from "../history/historyStatus.js";
|
|
10
|
+
import { useAssistantHistoryStore as l } from "../history/historyStore.js";
|
|
11
|
+
import { assistantHistory as u } from "../history/historyEngine.js";
|
|
12
|
+
import { useEffect as d, useMemo as f, useState as p } from "react";
|
|
13
|
+
import { Check as m, MessageSquare as h, PanelLeftClose as g, Pencil as _, Plus as v, Trash2 as y } from "lucide-react";
|
|
14
|
+
import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
10
15
|
//#region src/shared/assistant/ui/AssistantConversationList.tsx
|
|
11
|
-
var
|
|
12
|
-
let
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
var C = () => {
|
|
17
|
+
let C = t(), { modes: w } = e(), { conversations: T, activeConversationId: E, processingByConversationId: ee, setActiveConversation: te, setMode: D, createConversation: O, deleteConversation: k, renameConversation: A, setConversationListOpen: j } = r(), [M, N] = p(null), [P, F] = p(""), I = c((e) => e.product !== null), L = c((e) => e.scopeKey), R = c((e) => e.loadingIds), z = c((e) => e.olderHeaders), B = c((e) => e.unsavedDelete !== void 0), V = l((e) => L === null ? void 0 : e.scopes[L]), H = l((e) => e.tombstones), U = f(() => I ? s({
|
|
18
|
+
conversations: T,
|
|
19
|
+
scopeKey: L,
|
|
20
|
+
headers: V?.headers ?? {},
|
|
21
|
+
olderHeaders: z && z.scopeKey === L ? z.headers : void 0,
|
|
22
|
+
tombstones: H,
|
|
23
|
+
loadingIds: R
|
|
24
|
+
}) : null, [
|
|
25
|
+
I,
|
|
26
|
+
T,
|
|
27
|
+
L,
|
|
28
|
+
V,
|
|
29
|
+
z,
|
|
30
|
+
H,
|
|
31
|
+
R
|
|
32
|
+
]), W = z && z.scopeKey === L ? z.hasMore : V?.hasOlderHeaders === !0;
|
|
33
|
+
d(() => {
|
|
34
|
+
I && u.notePanelOpened();
|
|
35
|
+
}, [I]);
|
|
36
|
+
let G = () => {
|
|
37
|
+
O(), j(!1);
|
|
38
|
+
}, K = (e) => {
|
|
39
|
+
if (I) {
|
|
40
|
+
u.openConversation(e, { modes: w }), j(!1);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
let t = T.find((t) => t.id === e);
|
|
44
|
+
te(e), t && D(t.mode), j(!1);
|
|
45
|
+
}, q = (e, t) => {
|
|
46
|
+
N(e), F(t);
|
|
47
|
+
}, J = () => {
|
|
48
|
+
M && P.trim() && A(M, P.trim()), N(null);
|
|
49
|
+
}, Y = (e, t) => {
|
|
50
|
+
e.stopPropagation(), I ? u.deleteConversation(t) : k(t);
|
|
51
|
+
}, X = (e, t) => {
|
|
52
|
+
let r = e.id === E, a = e.id === M, o = w.find((t) => t.id === e.mode), s = n(e.messages), c = s[s.length - 1], l = s.length === 0 && e.messages.length > 0, u = ee[e.id], d = c ? i(c, u, C).text.slice(0, 60) : "";
|
|
53
|
+
return /* @__PURE__ */ x("div", {
|
|
54
|
+
role: "button",
|
|
55
|
+
tabIndex: 0,
|
|
56
|
+
onKeyDown: (t) => {
|
|
57
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), !a && K(e.id));
|
|
58
|
+
},
|
|
59
|
+
onClick: () => !a && K(e.id),
|
|
60
|
+
className: `group px-3 py-2 cursor-pointer hover:bg-bg-elevated transition-colors ${r ? "bg-bg-elevated border-l-2 border-action-primary-bg" : ""}`,
|
|
61
|
+
children: a ? /* @__PURE__ */ S("div", {
|
|
62
|
+
className: "flex items-center gap-1",
|
|
63
|
+
children: [/* @__PURE__ */ x("input", {
|
|
64
|
+
"aria-label": C("conversations.renameLabel", "Conversation title"),
|
|
65
|
+
value: P,
|
|
66
|
+
onChange: (e) => F(e.target.value),
|
|
67
|
+
onKeyDown: (e) => {
|
|
68
|
+
e.key === "Enter" && J(), e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), N(null));
|
|
69
|
+
},
|
|
70
|
+
className: "flex-1 text-xs bg-bg-sunken border border-border-default rounded px-2 py-1 text-text-primary focus:outline-none focus:border-action-primary-bg",
|
|
71
|
+
onClick: (e) => e.stopPropagation()
|
|
72
|
+
}), /* @__PURE__ */ x("button", {
|
|
73
|
+
type: "button",
|
|
74
|
+
onClick: (e) => {
|
|
75
|
+
e.stopPropagation(), J();
|
|
76
|
+
},
|
|
77
|
+
className: "p-1 hover:bg-bg-sunken rounded",
|
|
78
|
+
"aria-label": C("conversations.saveTitle", "Save title"),
|
|
79
|
+
children: /* @__PURE__ */ x(m, { className: "size-3 text-status-success-text" })
|
|
80
|
+
})]
|
|
81
|
+
}) : /* @__PURE__ */ S(b, { children: [
|
|
82
|
+
/* @__PURE__ */ S("div", {
|
|
83
|
+
className: "flex items-center justify-between",
|
|
84
|
+
children: [/* @__PURE__ */ x("span", {
|
|
85
|
+
className: "text-xs font-medium text-text-primary truncate flex-1",
|
|
86
|
+
children: t ? t.title : e.title
|
|
87
|
+
}), /* @__PURE__ */ S("div", {
|
|
88
|
+
className: "hidden group-hover:flex group-focus-within:flex items-center gap-0.5 ml-1",
|
|
89
|
+
children: [/* @__PURE__ */ x("button", {
|
|
90
|
+
type: "button",
|
|
91
|
+
onClick: (t) => {
|
|
92
|
+
t.stopPropagation(), q(e.id, e.title);
|
|
93
|
+
},
|
|
94
|
+
className: "p-0.5 hover:bg-bg-sunken rounded",
|
|
95
|
+
"aria-label": C("conversations.rename", "Rename conversation"),
|
|
96
|
+
children: /* @__PURE__ */ x(_, { className: "size-3 text-text-muted" })
|
|
97
|
+
}), /* @__PURE__ */ x("button", {
|
|
98
|
+
type: "button",
|
|
99
|
+
onClick: (t) => Y(t, e.id),
|
|
100
|
+
className: "p-0.5 hover:bg-bg-sunken rounded",
|
|
101
|
+
"aria-label": C("conversations.delete", "Delete conversation"),
|
|
102
|
+
"data-testid": "delete-conversation",
|
|
103
|
+
children: /* @__PURE__ */ x(y, { className: "size-3 text-status-error-text" })
|
|
104
|
+
})]
|
|
105
|
+
})]
|
|
106
|
+
}),
|
|
107
|
+
/* @__PURE__ */ S("div", {
|
|
108
|
+
className: "flex items-center gap-1.5 mt-0.5",
|
|
109
|
+
children: [
|
|
110
|
+
/* @__PURE__ */ x("span", {
|
|
111
|
+
className: "text-[10px] text-text-muted px-1 py-0.5 bg-bg-sunken rounded",
|
|
112
|
+
children: o?.label ?? e.mode
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ S("span", {
|
|
115
|
+
className: "text-[10px] text-text-muted",
|
|
116
|
+
children: [s.length, " msgs"]
|
|
117
|
+
}),
|
|
118
|
+
u && u.status !== "idle" && /* @__PURE__ */ x("span", {
|
|
119
|
+
className: "text-[10px] text-action-primary-bg px-1 py-0.5 bg-bg-sunken rounded",
|
|
120
|
+
children: u.status
|
|
121
|
+
}),
|
|
122
|
+
t?.badges
|
|
123
|
+
]
|
|
124
|
+
}),
|
|
125
|
+
d && /* @__PURE__ */ x("p", {
|
|
126
|
+
className: "text-[10px] text-text-muted truncate mt-0.5",
|
|
127
|
+
children: d
|
|
128
|
+
}),
|
|
129
|
+
l && /* @__PURE__ */ x("p", {
|
|
130
|
+
className: "text-[10px] text-text-muted truncate mt-0.5",
|
|
131
|
+
children: C("conversationList.voiceOnly", "Spoken conversation")
|
|
132
|
+
})
|
|
133
|
+
] })
|
|
134
|
+
}, e.id);
|
|
135
|
+
}, Z = (e) => {
|
|
136
|
+
let t = "text-[10px] text-text-muted px-1 py-0.5 bg-bg-sunken rounded", n = e.blocked === "quota" ? C("history.notSavedQuota", "Not saved yet: this workspace has reached its conversation limit. It will be saved when there is room.") : e.blocked === "invalid" ? C("history.notSavedInvalid", "Part of this conversation couldn't be saved. It stays on this device.") : e.blocked === "scope" ? C("history.notSavedScope", "Some turns were sent from another workspace. They stay on this device.") : null;
|
|
137
|
+
return /* @__PURE__ */ S(b, { children: [
|
|
138
|
+
e.legacy ? /* @__PURE__ */ x("span", {
|
|
139
|
+
className: t,
|
|
140
|
+
"data-testid": "history-badge-read-only",
|
|
141
|
+
children: C("history.badgeReadOnly", "Read-only")
|
|
142
|
+
}) : null,
|
|
143
|
+
n === null ? null : /* @__PURE__ */ x("span", {
|
|
144
|
+
className: t,
|
|
145
|
+
title: n,
|
|
146
|
+
"data-testid": "history-badge-not-saved",
|
|
147
|
+
children: C("history.badgeNotSaved", "Not saved")
|
|
148
|
+
}),
|
|
149
|
+
e.loading ? /* @__PURE__ */ x("span", {
|
|
150
|
+
className: t,
|
|
151
|
+
"data-testid": "history-badge-loading",
|
|
152
|
+
children: C("history.badgeLoading", "Loading…")
|
|
153
|
+
}) : null
|
|
154
|
+
] });
|
|
155
|
+
}, Q = C("history.untitled", "Untitled conversation"), ne = (e) => /* @__PURE__ */ S("div", {
|
|
156
|
+
role: "button",
|
|
157
|
+
tabIndex: 0,
|
|
158
|
+
onKeyDown: (t) => {
|
|
159
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), K(e.key));
|
|
160
|
+
},
|
|
161
|
+
onClick: () => K(e.key),
|
|
162
|
+
className: `group px-3 py-2 cursor-pointer hover:bg-bg-elevated transition-colors ${e.key === E ? "bg-bg-elevated border-l-2 border-action-primary-bg" : ""}`,
|
|
163
|
+
"data-testid": "history-server-row",
|
|
164
|
+
children: [/* @__PURE__ */ S("div", {
|
|
165
|
+
className: "flex items-center justify-between",
|
|
166
|
+
children: [/* @__PURE__ */ x("span", {
|
|
167
|
+
className: "text-xs font-medium text-text-primary truncate flex-1",
|
|
168
|
+
children: e.title || Q
|
|
169
|
+
}), /* @__PURE__ */ x("div", {
|
|
170
|
+
className: "hidden group-hover:flex group-focus-within:flex items-center gap-0.5 ml-1",
|
|
171
|
+
children: /* @__PURE__ */ x("button", {
|
|
172
|
+
type: "button",
|
|
173
|
+
onClick: (t) => Y(t, e.key),
|
|
174
|
+
className: "p-0.5 hover:bg-bg-sunken rounded",
|
|
175
|
+
"aria-label": C("conversations.delete", "Delete conversation"),
|
|
176
|
+
"data-testid": "delete-conversation",
|
|
177
|
+
children: /* @__PURE__ */ x(y, { className: "size-3 text-status-error-text" })
|
|
178
|
+
})
|
|
179
|
+
})]
|
|
180
|
+
}), /* @__PURE__ */ x("div", {
|
|
181
|
+
className: "flex items-center gap-1.5 mt-0.5",
|
|
182
|
+
children: Z(e)
|
|
183
|
+
})]
|
|
184
|
+
}, e.key), $ = (e) => /* @__PURE__ */ x("h3", {
|
|
185
|
+
className: "px-3 pt-2 pb-1 text-[10px] font-semibold uppercase tracking-wide text-text-muted",
|
|
186
|
+
children: e
|
|
187
|
+
}), re = U ? U.workspace.length === 0 && U.device.length === 0 && !W : T.length === 0;
|
|
188
|
+
return /* @__PURE__ */ S("div", {
|
|
25
189
|
ref: a("assistant-open-history"),
|
|
26
190
|
tabIndex: -1,
|
|
27
191
|
role: "region",
|
|
28
|
-
"aria-label":
|
|
192
|
+
"aria-label": C("conversations.title", "History"),
|
|
29
193
|
className: "absolute inset-0 z-10 flex flex-col bg-bg-surface outline-none animate-in slide-in-from-left-2 fade-in duration-200",
|
|
30
194
|
"data-testid": "conversation-list",
|
|
31
|
-
children: [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
className: "
|
|
53
|
-
|
|
195
|
+
children: [
|
|
196
|
+
/* @__PURE__ */ S("div", {
|
|
197
|
+
className: "flex items-center justify-between px-4 py-3 border-b border-border-default bg-bg-elevated",
|
|
198
|
+
children: [/* @__PURE__ */ x("span", {
|
|
199
|
+
className: "text-[13px] font-semibold text-text-primary",
|
|
200
|
+
children: C("conversations.title", "History")
|
|
201
|
+
}), /* @__PURE__ */ S("div", {
|
|
202
|
+
className: "flex items-center gap-0.5",
|
|
203
|
+
children: [/* @__PURE__ */ x("button", {
|
|
204
|
+
type: "button",
|
|
205
|
+
onClick: G,
|
|
206
|
+
className: "p-1.5 rounded-lg text-text-secondary hover:bg-bg-sunken transition-colors",
|
|
207
|
+
"aria-label": C("conversations.new", "New conversation"),
|
|
208
|
+
"data-testid": "new-conversation",
|
|
209
|
+
children: /* @__PURE__ */ x(v, { className: "size-4" })
|
|
210
|
+
}), /* @__PURE__ */ S("button", {
|
|
211
|
+
type: "button",
|
|
212
|
+
onClick: () => j(!1),
|
|
213
|
+
className: "flex items-center gap-1 px-2 py-1.5 rounded-lg text-text-secondary hover:bg-bg-sunken transition-colors",
|
|
214
|
+
"aria-label": C("conversations.collapse", "Collapse history"),
|
|
215
|
+
"data-testid": "collapse-conversation-list",
|
|
216
|
+
children: [/* @__PURE__ */ x(g, { className: "size-4" }), /* @__PURE__ */ x("span", {
|
|
217
|
+
className: "text-[11px] font-medium",
|
|
218
|
+
children: C("conversations.collapseLabel", "Collapse")
|
|
219
|
+
})]
|
|
54
220
|
})]
|
|
55
221
|
})]
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
children: r ? /* @__PURE__ */ h("div", {
|
|
87
|
-
className: "flex items-center gap-1",
|
|
88
|
-
children: [/* @__PURE__ */ m("input", {
|
|
89
|
-
"aria-label": g("conversations.renameLabel", "Conversation title"),
|
|
90
|
-
value: k,
|
|
91
|
-
onChange: (e) => A(e.target.value),
|
|
92
|
-
onKeyDown: (e) => {
|
|
93
|
-
e.key === "Enter" && P(), e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), O(null));
|
|
94
|
-
},
|
|
95
|
-
className: "flex-1 text-xs bg-bg-sunken border border-border-default rounded px-2 py-1 text-text-primary focus:outline-none focus:border-action-primary-bg",
|
|
96
|
-
onClick: (e) => e.stopPropagation()
|
|
97
|
-
}), /* @__PURE__ */ m("button", {
|
|
222
|
+
}),
|
|
223
|
+
I && B ? /* @__PURE__ */ x(o, {}) : null,
|
|
224
|
+
/* @__PURE__ */ x("div", {
|
|
225
|
+
className: "scrollbar-slim flex-1 overflow-y-auto",
|
|
226
|
+
children: re ? /* @__PURE__ */ S("div", {
|
|
227
|
+
className: "flex flex-col items-center justify-center h-full text-center px-4",
|
|
228
|
+
children: [
|
|
229
|
+
/* @__PURE__ */ x(h, { className: "size-6 text-text-muted mb-2" }),
|
|
230
|
+
/* @__PURE__ */ x("p", {
|
|
231
|
+
className: "text-xs text-text-muted",
|
|
232
|
+
children: C("conversations.empty", "No conversations yet")
|
|
233
|
+
}),
|
|
234
|
+
/* @__PURE__ */ x("button", {
|
|
235
|
+
type: "button",
|
|
236
|
+
onClick: G,
|
|
237
|
+
className: "mt-2 text-xs text-action-primary-bg hover:underline",
|
|
238
|
+
children: C("conversations.startNew", "Start a new conversation")
|
|
239
|
+
})
|
|
240
|
+
]
|
|
241
|
+
}) : U ? /* @__PURE__ */ S("div", {
|
|
242
|
+
className: "py-1",
|
|
243
|
+
children: [U.workspace.length > 0 || W ? /* @__PURE__ */ S("section", {
|
|
244
|
+
"data-testid": "history-group-workspace",
|
|
245
|
+
children: [
|
|
246
|
+
$(C("history.groupWorkspace", "This workspace")),
|
|
247
|
+
U.workspace.map((e) => e.conversation ? X(e.conversation, {
|
|
248
|
+
title: e.title || Q,
|
|
249
|
+
badges: Z(e)
|
|
250
|
+
}) : ne(e)),
|
|
251
|
+
W ? /* @__PURE__ */ x("button", {
|
|
98
252
|
type: "button",
|
|
99
|
-
onClick: (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}), /* @__PURE__ */ h("div", {
|
|
113
|
-
className: "hidden group-hover:flex group-focus-within:flex items-center gap-0.5 ml-1",
|
|
114
|
-
children: [/* @__PURE__ */ m("button", {
|
|
115
|
-
type: "button",
|
|
116
|
-
onClick: (t) => {
|
|
117
|
-
t.stopPropagation(), N(e.id, e.title);
|
|
118
|
-
},
|
|
119
|
-
className: "p-0.5 hover:bg-bg-sunken rounded",
|
|
120
|
-
"aria-label": g("conversations.rename", "Rename conversation"),
|
|
121
|
-
children: /* @__PURE__ */ m(u, { className: "size-3 text-text-muted" })
|
|
122
|
-
}), /* @__PURE__ */ m("button", {
|
|
123
|
-
type: "button",
|
|
124
|
-
onClick: (t) => F(t, e.id),
|
|
125
|
-
className: "p-0.5 hover:bg-bg-sunken rounded",
|
|
126
|
-
"aria-label": g("conversations.delete", "Delete conversation"),
|
|
127
|
-
"data-testid": "delete-conversation",
|
|
128
|
-
children: /* @__PURE__ */ m(f, { className: "size-3 text-status-error-text" })
|
|
129
|
-
})]
|
|
130
|
-
})]
|
|
131
|
-
}),
|
|
132
|
-
/* @__PURE__ */ h("div", {
|
|
133
|
-
className: "flex items-center gap-1.5 mt-0.5",
|
|
134
|
-
children: [
|
|
135
|
-
/* @__PURE__ */ m("span", {
|
|
136
|
-
className: "text-[10px] text-text-muted px-1 py-0.5 bg-bg-sunken rounded",
|
|
137
|
-
children: a?.label ?? e.mode
|
|
138
|
-
}),
|
|
139
|
-
/* @__PURE__ */ h("span", {
|
|
140
|
-
className: "text-[10px] text-text-muted",
|
|
141
|
-
children: [o.length, " msgs"]
|
|
142
|
-
}),
|
|
143
|
-
d && d.status !== "idle" && /* @__PURE__ */ m("span", {
|
|
144
|
-
className: "text-[10px] text-action-primary-bg px-1 py-0.5 bg-bg-sunken rounded",
|
|
145
|
-
children: d.status
|
|
146
|
-
})
|
|
147
|
-
]
|
|
148
|
-
}),
|
|
149
|
-
v && /* @__PURE__ */ m("p", {
|
|
150
|
-
className: "text-[10px] text-text-muted truncate mt-0.5",
|
|
151
|
-
children: v
|
|
152
|
-
}),
|
|
153
|
-
l && /* @__PURE__ */ m("p", {
|
|
154
|
-
className: "text-[10px] text-text-muted truncate mt-0.5",
|
|
155
|
-
children: g("conversationList.voiceOnly", "Spoken conversation")
|
|
156
|
-
})
|
|
157
|
-
] })
|
|
158
|
-
}, e.id);
|
|
253
|
+
onClick: () => u.loadOlderHeaders(),
|
|
254
|
+
className: "mx-3 my-1 text-xs text-action-primary-bg hover:underline",
|
|
255
|
+
"data-testid": "history-show-older",
|
|
256
|
+
children: C("history.showOlder", "Show older conversations")
|
|
257
|
+
}) : null
|
|
258
|
+
]
|
|
259
|
+
}) : null, U.device.length > 0 ? /* @__PURE__ */ S("section", {
|
|
260
|
+
"data-testid": "history-group-device",
|
|
261
|
+
children: [$(C("history.groupDevice", "On this device")), U.device.map((e) => X(e))]
|
|
262
|
+
}) : null]
|
|
263
|
+
}) : /* @__PURE__ */ x("div", {
|
|
264
|
+
className: "py-1",
|
|
265
|
+
children: T.map((e) => X(e))
|
|
159
266
|
})
|
|
160
267
|
})
|
|
161
|
-
|
|
268
|
+
]
|
|
162
269
|
});
|
|
163
270
|
};
|
|
164
271
|
//#endregion
|
|
165
|
-
export {
|
|
272
|
+
export { C as AssistantConversationList };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The open conversation's messages: loading, or the load failed. `compact` is
|
|
4
|
+
* the line above the composer, for a conversation that already shows messages;
|
|
5
|
+
* otherwise it fills the empty thread.
|
|
6
|
+
*/
|
|
7
|
+
export declare const AssistantHistoryLoadState: FC<{
|
|
8
|
+
state: "loading" | "failed";
|
|
9
|
+
onRetry: () => void;
|
|
10
|
+
compact?: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
/** Older messages of this conversation exist on the server than are shown. */
|
|
13
|
+
export declare const AssistantHistoryShowEarlier: FC<{
|
|
14
|
+
onShowEarlier: () => void;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* A conversation saved before server history. It can be read and deleted,
|
|
19
|
+
* never continued — the composer below it is disabled — so the one action
|
|
20
|
+
* offered is a new conversation.
|
|
21
|
+
*/
|
|
22
|
+
export declare const AssistantHistoryReadOnlyBanner: FC<{
|
|
23
|
+
onStartNew: () => void;
|
|
24
|
+
}>;
|
|
25
|
+
/** The conversation open here was deleted on another device (or in another tab). */
|
|
26
|
+
export declare const AssistantHistoryDeletedNotice: FC<{
|
|
27
|
+
onDismiss: () => void;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* A delete made here is not saved on this device yet: the browser refused the
|
|
31
|
+
* write (its storage is full) and the server has not confirmed the delete. A
|
|
32
|
+
* reload now would bring the conversation back, so this stays until either
|
|
33
|
+
* happens — it is not dismissible, because it is not over until then.
|
|
34
|
+
*/
|
|
35
|
+
export declare const AssistantHistoryUnsavedDeleteNotice: FC;
|
|
36
|
+
//# sourceMappingURL=AssistantHistoryNotices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssistantHistoryNotices.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantHistoryNotices.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAKhC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC;IACzC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAkCA,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,2BAA2B,EAAE,EAAE,CAAC;IAC3C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAcA,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,EAAE,EAAE,CAAC;IAAE,UAAU,EAAE,MAAM,IAAI,CAAA;CAAE,CA4BzE,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,6BAA6B,EAAE,EAAE,CAAC;IAAE,SAAS,EAAE,MAAM,IAAI,CAAA;CAAE,CA4BvE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,EAAE,EAiBjD,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { useAssistantTr as e } from "../i18n.js";
|
|
2
|
+
import { AlertTriangle as t, History as n, Loader2 as r, Lock as i, Trash2 as a, X as o } from "lucide-react";
|
|
3
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
4
|
+
//#region src/shared/assistant/ui/AssistantHistoryNotices.tsx
|
|
5
|
+
var l = ({ state: t, onRetry: n, compact: i = !1 }) => {
|
|
6
|
+
let a = e(), o = i ? "mx-3 mb-2 flex items-center justify-center gap-2 text-xs" : "flex flex-1 flex-col items-center justify-center gap-2 px-4 text-center text-xs";
|
|
7
|
+
return t === "loading" ? /* @__PURE__ */ c("div", {
|
|
8
|
+
role: "status",
|
|
9
|
+
className: `${o} text-text-muted`,
|
|
10
|
+
"data-testid": "assistant-history-loading",
|
|
11
|
+
children: [/* @__PURE__ */ s(r, {
|
|
12
|
+
className: "size-4 motion-safe:animate-spin",
|
|
13
|
+
"aria-hidden": "true"
|
|
14
|
+
}), /* @__PURE__ */ s("span", { children: a("history.loading", "Loading conversation…") })]
|
|
15
|
+
}) : /* @__PURE__ */ c("div", {
|
|
16
|
+
role: "alert",
|
|
17
|
+
className: `${o} text-text-secondary`,
|
|
18
|
+
"data-testid": "assistant-history-load-failed",
|
|
19
|
+
children: [/* @__PURE__ */ s("span", { children: a("history.loadFailed", "Couldn't load this conversation.") }), /* @__PURE__ */ s("button", {
|
|
20
|
+
type: "button",
|
|
21
|
+
onClick: n,
|
|
22
|
+
className: "rounded-md px-2 py-1 font-medium text-action-primary-bg transition-colors hover:bg-bg-elevated focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
|
|
23
|
+
"data-testid": "assistant-history-retry-load",
|
|
24
|
+
children: a("history.tryAgain", "Try again")
|
|
25
|
+
})]
|
|
26
|
+
});
|
|
27
|
+
}, u = ({ onShowEarlier: t, disabled: r = !1 }) => {
|
|
28
|
+
let i = e();
|
|
29
|
+
return /* @__PURE__ */ c("button", {
|
|
30
|
+
type: "button",
|
|
31
|
+
onClick: t,
|
|
32
|
+
disabled: r,
|
|
33
|
+
className: "mx-auto mt-2 flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium text-action-primary-bg transition-colors hover:bg-bg-elevated focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong disabled:opacity-50",
|
|
34
|
+
"data-testid": "assistant-history-show-earlier",
|
|
35
|
+
children: [/* @__PURE__ */ s(n, {
|
|
36
|
+
className: "size-3.5",
|
|
37
|
+
"aria-hidden": "true"
|
|
38
|
+
}), i("history.showEarlier", "Show earlier messages")]
|
|
39
|
+
});
|
|
40
|
+
}, d = ({ onStartNew: t }) => {
|
|
41
|
+
let n = e();
|
|
42
|
+
return /* @__PURE__ */ c("div", {
|
|
43
|
+
className: "mx-3 mb-2 flex items-start gap-2 rounded-lg border border-border-default bg-bg-sunken px-3 py-2 text-xs text-text-secondary",
|
|
44
|
+
"data-testid": "assistant-history-read-only",
|
|
45
|
+
children: [/* @__PURE__ */ s(i, {
|
|
46
|
+
className: "mt-0.5 size-3.5 flex-shrink-0",
|
|
47
|
+
"aria-hidden": "true"
|
|
48
|
+
}), /* @__PURE__ */ c("div", {
|
|
49
|
+
className: "min-w-0 flex-1",
|
|
50
|
+
children: [/* @__PURE__ */ s("p", { children: n("history.legacyReadOnly", "This conversation was saved by an earlier version of the assistant. You can read it, but it can't be continued.") }), /* @__PURE__ */ s("button", {
|
|
51
|
+
type: "button",
|
|
52
|
+
onClick: t,
|
|
53
|
+
className: "mt-1 font-medium text-action-primary-bg hover:underline focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
|
|
54
|
+
"data-testid": "assistant-history-start-new",
|
|
55
|
+
children: n("conversations.startNew", "Start a new conversation")
|
|
56
|
+
})]
|
|
57
|
+
})]
|
|
58
|
+
});
|
|
59
|
+
}, f = ({ onDismiss: t }) => {
|
|
60
|
+
let n = e();
|
|
61
|
+
return /* @__PURE__ */ c("div", {
|
|
62
|
+
role: "status",
|
|
63
|
+
className: "flex items-center gap-2 border-b border-border-subtle bg-bg-sunken/60 px-3 py-2 text-xs text-text-secondary",
|
|
64
|
+
"data-testid": "assistant-history-deleted-elsewhere",
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ s(a, {
|
|
67
|
+
className: "size-3.5 flex-shrink-0",
|
|
68
|
+
"aria-hidden": "true"
|
|
69
|
+
}),
|
|
70
|
+
/* @__PURE__ */ s("span", {
|
|
71
|
+
className: "min-w-0 flex-1",
|
|
72
|
+
children: n("history.deletedElsewhere", "The conversation you had open was deleted on another device.")
|
|
73
|
+
}),
|
|
74
|
+
/* @__PURE__ */ s("button", {
|
|
75
|
+
type: "button",
|
|
76
|
+
onClick: t,
|
|
77
|
+
className: "flex-shrink-0 rounded-md p-1 transition-colors hover:bg-bg-elevated focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong",
|
|
78
|
+
"aria-label": n("history.dismiss", "Dismiss"),
|
|
79
|
+
"data-testid": "assistant-history-dismiss-deleted",
|
|
80
|
+
children: /* @__PURE__ */ s(o, {
|
|
81
|
+
className: "size-3.5",
|
|
82
|
+
"aria-hidden": "true"
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
]
|
|
86
|
+
});
|
|
87
|
+
}, p = () => {
|
|
88
|
+
let n = e();
|
|
89
|
+
return /* @__PURE__ */ c("div", {
|
|
90
|
+
role: "alert",
|
|
91
|
+
className: "flex items-start gap-2 border-b border-border-subtle bg-bg-sunken/60 px-3 py-2 text-xs text-text-secondary",
|
|
92
|
+
"data-testid": "assistant-history-delete-not-saved",
|
|
93
|
+
children: [/* @__PURE__ */ s(t, {
|
|
94
|
+
className: "mt-0.5 size-3.5 flex-shrink-0",
|
|
95
|
+
"aria-hidden": "true"
|
|
96
|
+
}), /* @__PURE__ */ s("span", {
|
|
97
|
+
className: "min-w-0 flex-1",
|
|
98
|
+
children: n("history.deleteNotSaved", "This device's storage is full, so that delete isn't saved here yet. Keep this page open until it reaches the server.")
|
|
99
|
+
})]
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
//#endregion
|
|
103
|
+
export { f as AssistantHistoryDeletedNotice, l as AssistantHistoryLoadState, d as AssistantHistoryReadOnlyBanner, u as AssistantHistoryShowEarlier, p as AssistantHistoryUnsavedDeleteNotice };
|
|
@@ -87,6 +87,10 @@ export interface AssistantOverlayProps {
|
|
|
87
87
|
* is closed (BOFF-7367). A `renderPanel` wrapper that hands its panel the
|
|
88
88
|
* same controller should pass it here too; one it passes only to its panel is
|
|
89
89
|
* bridged by that panel, for that panel's lifetime.
|
|
90
|
+
*
|
|
91
|
+
* ★★ `serverHistory` likewise (BOFF-7335): held on HERE, so the history a
|
|
92
|
+
* closed panel's turns and deletes queued keeps going out, and a reopened
|
|
93
|
+
* panel finds the list already current.
|
|
90
94
|
*/
|
|
91
95
|
panelProps?: Omit<AIAssistantPanelProps, keyof AssistantOverlayPanelProps>;
|
|
92
96
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantOverlay.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"AssistantOverlay.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK1C,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAmBL,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,oBAAoB,CAAC;CAC5B;AAID,uEAAuE;AACvE,wBAAgB,yBAAyB,IAAI,4BAA4B,GAAG,IAAI,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AA6BD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GACnD,IAAI,CAaN;AAID,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KACtD,CAAC;IACF,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,SAAS,EACT,KAAK,EACL,QAAQ,GACT,EAAE,6BAA6B,2CAkE/B;AAED,mDAAmD;AACnD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,0BAA0B,CAAC,CAAC;IAC3E;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;IAC/D;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kDAI5D"}
|