@talk2view/sdk 0.16.2 → 0.17.0
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/assistant-ui/index.d.ts +13 -2
- package/dist/assistant-ui/index.d.ts.map +1 -1
- package/dist/assistant-ui/index.js +15 -12
- package/dist/assistant-ui/index.js.map +1 -1
- package/dist/chat/chat.d.ts.map +1 -1
- package/dist/chat/chat.js +8 -3
- package/dist/chat/chat.js.map +1 -1
- package/dist/chat/lib/conversation-store.d.ts +105 -0
- package/dist/chat/lib/conversation-store.d.ts.map +1 -0
- package/dist/chat/lib/conversation-store.js +278 -0
- package/dist/chat/lib/conversation-store.js.map +1 -0
- package/dist/chat/lib/use-conversations.d.ts +13 -0
- package/dist/chat/lib/use-conversations.d.ts.map +1 -0
- package/dist/chat/lib/use-conversations.js +365 -0
- package/dist/chat/lib/use-conversations.js.map +1 -0
- package/dist/chat/provider.d.ts.map +1 -1
- package/dist/chat/provider.js +6 -0
- package/dist/chat/provider.js.map +1 -1
- package/dist/chat/ui/avatar.d.ts +7 -8
- package/dist/chat/ui/avatar.d.ts.map +1 -1
- package/dist/chat/ui/avatar.js +30 -18
- package/dist/chat/ui/avatar.js.map +1 -1
- package/dist/chat/ui/button.d.ts +5 -2
- package/dist/chat/ui/button.d.ts.map +1 -1
- package/dist/chat/ui/button.js +10 -3
- package/dist/chat/ui/button.js.map +1 -1
- package/dist/chat/ui/collapsible.d.ts +4 -4
- package/dist/chat/ui/collapsible.d.ts.map +1 -1
- package/dist/chat/ui/collapsible.js +18 -9
- package/dist/chat/ui/collapsible.js.map +1 -1
- package/dist/chat/ui/dialog.d.ts +11 -11
- package/dist/chat/ui/dialog.d.ts.map +1 -1
- package/dist/chat/ui/dialog.js +49 -28
- package/dist/chat/ui/dialog.js.map +1 -1
- package/dist/chat/ui/input.d.ts +1 -1
- package/dist/chat/ui/input.d.ts.map +1 -1
- package/dist/chat/ui/input.js +10 -3
- package/dist/chat/ui/input.js.map +1 -1
- package/dist/chat/ui/skeleton.d.ts +2 -1
- package/dist/chat/ui/skeleton.d.ts.map +1 -1
- package/dist/chat/ui/skeleton.js +10 -3
- package/dist/chat/ui/skeleton.js.map +1 -1
- package/dist/chat/ui/textarea.d.ts +1 -1
- package/dist/chat/ui/textarea.d.ts.map +1 -1
- package/dist/chat/ui/textarea.js +10 -3
- package/dist/chat/ui/textarea.js.map +1 -1
- package/dist/chat/ui/tooltip.d.ts +3 -2
- package/dist/chat/ui/tooltip.d.ts.map +1 -1
- package/dist/chat/ui/tooltip.js +25 -8
- package/dist/chat/ui/tooltip.js.map +1 -1
- package/dist/chat/vendor/thread-list.aui.d.ts +3 -3
- package/dist/chat/vendor/thread-list.aui.d.ts.map +1 -1
- package/dist/chat/vendor/thread-list.aui.js +7 -7
- package/dist/chat/vendor/thread-list.aui.js.map +1 -1
- package/dist/chat-css.js +1 -1
- package/dist/chat.css +1 -1
- package/dist/chat.isolated.css +3 -0
- package/dist/chat.raw.css +3 -0
- package/dist/index.d.ts +56 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -6
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-conversations.d.ts","sourceRoot":"","sources":["../../../src/chat/lib/use-conversations.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAA2B,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAyDhD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAChC,8BAA8B,CAwPhC"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* The chat's list of conversations: what "New chat" starts, what the Chats view
|
|
4
|
+
* shows, and what survives a reload.
|
|
5
|
+
*
|
|
6
|
+
* It owns the list and hands assistant-ui a thread-list adapter for it. The
|
|
7
|
+
* runtime stays dumb: it passes the adapter through and knows nothing about
|
|
8
|
+
* storage. {@link conversation-store} is the storage half.
|
|
9
|
+
*
|
|
10
|
+
* ## What happens when
|
|
11
|
+
*
|
|
12
|
+
* - **New chat** — the conversation on screen is kept where it is and an empty
|
|
13
|
+
* one takes its place. Clicking it again on an empty chat does nothing, so
|
|
14
|
+
* the list does not fill up with blanks.
|
|
15
|
+
* - **Switching** — the client is handed the stored transcript and the engine
|
|
16
|
+
* session is detached, not deleted: the visitor may switch back, and the turn
|
|
17
|
+
* it is running may not be finished. The next message opens a new session and
|
|
18
|
+
* replays the transcript into it.
|
|
19
|
+
* - **Signing in or out** — the list follows the end-user. Whoever is there now
|
|
20
|
+
* sees their own conversations and an empty chat, never the last person's.
|
|
21
|
+
* The one exception is a visitor who started typing before anything
|
|
22
|
+
* authenticated: their conversation moves across with them when the guest
|
|
23
|
+
* session appears, because it was theirs all along.
|
|
24
|
+
* - **A guest becoming an account** — nothing moves. Converting keeps the same
|
|
25
|
+
* user id, so the conversations are already in the right bucket.
|
|
26
|
+
*/
|
|
27
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
28
|
+
import { UNTITLED, identityKey, readConversations, titleFrom, writeConversations, } from './conversation-store.js';
|
|
29
|
+
/**
|
|
30
|
+
* Written this long after the last change, so a reply is stored once when it
|
|
31
|
+
* lands and not once per token.
|
|
32
|
+
*/
|
|
33
|
+
const WRITE_DELAY_MS = 500;
|
|
34
|
+
/**
|
|
35
|
+
* …but never delayed longer than this. A reply that streams for a minute is
|
|
36
|
+
* checkpointed as it goes, so a reload in the middle of one keeps what arrived.
|
|
37
|
+
*/
|
|
38
|
+
const WRITE_MAX_DELAY_MS = 5_000;
|
|
39
|
+
const EMPTY = { messages: [], history: [], threadId: null };
|
|
40
|
+
/**
|
|
41
|
+
* The thread-list adapter for `adapters.threadList`.
|
|
42
|
+
*
|
|
43
|
+
* With `enabled` false there is no list and nothing is stored, but New chat
|
|
44
|
+
* still works: it clears the conversation the way it always did, deleting the
|
|
45
|
+
* engine session too, because with no list there is no way back to it.
|
|
46
|
+
*/
|
|
47
|
+
export function useConversations(client, { enabled }) {
|
|
48
|
+
const partnerKey = client.config.partnerKey;
|
|
49
|
+
// A mutable store plus a counter to re-render on: the snapshot of the
|
|
50
|
+
// conversation on screen changes on every streamed token, and the list only
|
|
51
|
+
// changes when a conversation is added, renamed, deleted or gains a message.
|
|
52
|
+
// Keeping them apart is what stops a reply repainting the list 60 times.
|
|
53
|
+
const store = useRef(null);
|
|
54
|
+
const [, setListVersion] = useState(0);
|
|
55
|
+
const publish = useCallback(() => setListVersion((n) => n + 1), []);
|
|
56
|
+
// Once, on the first render. Deliberately not in an effect: `start` may put a
|
|
57
|
+
// stored conversation back into the client, and the runtime reads the client's
|
|
58
|
+
// messages as its own initial state on this same render. Restoring later would
|
|
59
|
+
// paint the welcome screen first and replace it a frame afterwards. Nothing is
|
|
60
|
+
// subscribed to the client yet at this point — this hook is called before the
|
|
61
|
+
// runtime's — so the change this publishes reaches no other component.
|
|
62
|
+
if (store.current === null) {
|
|
63
|
+
store.current = start(client, partnerKey, enabled);
|
|
64
|
+
}
|
|
65
|
+
// ── Persistence ──────────────────────────────────────────────────────────
|
|
66
|
+
const timer = useRef(null);
|
|
67
|
+
const oldestPending = useRef(0);
|
|
68
|
+
const flush = useCallback(() => {
|
|
69
|
+
if (timer.current !== null) {
|
|
70
|
+
clearTimeout(timer.current);
|
|
71
|
+
timer.current = null;
|
|
72
|
+
}
|
|
73
|
+
oldestPending.current = 0;
|
|
74
|
+
const s = store.current;
|
|
75
|
+
if (!enabled)
|
|
76
|
+
return;
|
|
77
|
+
writeConversations(partnerKey, s.identity, s.conversations, s.currentId);
|
|
78
|
+
}, [enabled, partnerKey]);
|
|
79
|
+
const schedule = useCallback(() => {
|
|
80
|
+
if (!enabled)
|
|
81
|
+
return;
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
if (oldestPending.current === 0)
|
|
84
|
+
oldestPending.current = now;
|
|
85
|
+
if (timer.current !== null)
|
|
86
|
+
clearTimeout(timer.current);
|
|
87
|
+
const wait = Math.min(WRITE_DELAY_MS, Math.max(0, oldestPending.current + WRITE_MAX_DELAY_MS - now));
|
|
88
|
+
timer.current = setTimeout(flush, wait);
|
|
89
|
+
}, [enabled, flush]);
|
|
90
|
+
// Closing the tab, or a phone putting the page to sleep, does not wait for a
|
|
91
|
+
// debounce. `pagehide` is the one that fires on the bfcache path too.
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const onHide = () => {
|
|
94
|
+
if (timer.current !== null)
|
|
95
|
+
flush();
|
|
96
|
+
};
|
|
97
|
+
const onVisibility = () => {
|
|
98
|
+
if (document.visibilityState === 'hidden')
|
|
99
|
+
onHide();
|
|
100
|
+
};
|
|
101
|
+
window.addEventListener('pagehide', onHide);
|
|
102
|
+
document.addEventListener('visibilitychange', onVisibility);
|
|
103
|
+
return () => {
|
|
104
|
+
window.removeEventListener('pagehide', onHide);
|
|
105
|
+
document.removeEventListener('visibilitychange', onVisibility);
|
|
106
|
+
// An unmount mid-debounce would otherwise drop the last change.
|
|
107
|
+
if (timer.current !== null)
|
|
108
|
+
flush();
|
|
109
|
+
};
|
|
110
|
+
}, [flush]);
|
|
111
|
+
// ── Keeping the conversation on screen up to date ────────────────────────
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (!enabled)
|
|
114
|
+
return;
|
|
115
|
+
const sync = () => {
|
|
116
|
+
const s = store.current;
|
|
117
|
+
const current = s.conversations.find((c) => c.id === s.currentId);
|
|
118
|
+
if (!current)
|
|
119
|
+
return;
|
|
120
|
+
const snapshot = client.exportConversation();
|
|
121
|
+
current.snapshot = snapshot;
|
|
122
|
+
// Title and date move when the transcript gains a message, not when the
|
|
123
|
+
// reply in it grows by a token.
|
|
124
|
+
if (snapshot.messages.length !== s.seen) {
|
|
125
|
+
s.seen = snapshot.messages.length;
|
|
126
|
+
current.updatedAt = Date.now();
|
|
127
|
+
if (current.title === null)
|
|
128
|
+
current.title = titleFrom(firstUser(snapshot.messages));
|
|
129
|
+
reorder(s);
|
|
130
|
+
publish();
|
|
131
|
+
}
|
|
132
|
+
schedule();
|
|
133
|
+
};
|
|
134
|
+
const offs = [
|
|
135
|
+
client.on('messagesChange', sync),
|
|
136
|
+
// The last thing a turn does is record itself in the history the next
|
|
137
|
+
// message replays, and it does that after its final message change — so a
|
|
138
|
+
// snapshot taken on messages alone is one assistant turn short of being
|
|
139
|
+
// able to carry the conversation on. The loading flag drops after it.
|
|
140
|
+
client.on('loadingChange', (loading) => {
|
|
141
|
+
if (!loading)
|
|
142
|
+
sync();
|
|
143
|
+
}),
|
|
144
|
+
];
|
|
145
|
+
return () => offs.forEach((off) => off());
|
|
146
|
+
}, [client, enabled, publish, schedule]);
|
|
147
|
+
// ── Identity ─────────────────────────────────────────────────────────────
|
|
148
|
+
useEffect(() => {
|
|
149
|
+
if (!enabled)
|
|
150
|
+
return;
|
|
151
|
+
return client.auth.onAuthStateChange((user) => {
|
|
152
|
+
const s = store.current;
|
|
153
|
+
const next = identityKey(user?.id);
|
|
154
|
+
if (next === s.identity)
|
|
155
|
+
return;
|
|
156
|
+
// The conversation on screen follows the end-user across exactly one
|
|
157
|
+
// step: out of a guest session, or out of no session at all, into the
|
|
158
|
+
// account they have just signed in to. That is the same person carrying
|
|
159
|
+
// on — the visitor who typed before anything authenticated, and the guest
|
|
160
|
+
// who signed up because the demo ran out.
|
|
161
|
+
//
|
|
162
|
+
// It has to be a conversation they started here, in this page's life: one
|
|
163
|
+
// read back out of a guest bucket may be the last visitor's, and it must
|
|
164
|
+
// not walk into somebody else's account. And it never crosses from one
|
|
165
|
+
// account to another, where the two are simply different people.
|
|
166
|
+
const carried = s.guest && s.fresh.has(s.currentId)
|
|
167
|
+
? s.conversations.find((c) => c.id === s.currentId)
|
|
168
|
+
: undefined;
|
|
169
|
+
// What the previous identity keeps, written before we let go of it. A
|
|
170
|
+
// conversation that moves is taken out of it rather than left in both.
|
|
171
|
+
const left = carried ? s.conversations.filter((c) => c.id !== carried.id) : s.conversations;
|
|
172
|
+
if (timer.current !== null)
|
|
173
|
+
clearTimeout(timer.current);
|
|
174
|
+
timer.current = null;
|
|
175
|
+
oldestPending.current = 0;
|
|
176
|
+
writeConversations(partnerKey, s.identity, left, null);
|
|
177
|
+
s.identity = next;
|
|
178
|
+
s.guest = isGuest(client, next);
|
|
179
|
+
s.conversations = readConversations(partnerKey, next);
|
|
180
|
+
if (carried) {
|
|
181
|
+
s.conversations.unshift(carried);
|
|
182
|
+
reorder(s);
|
|
183
|
+
s.seen = client.messages.length;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// Somebody else is in front of the chat now. They get their own list and
|
|
187
|
+
// an empty conversation; the last person's goes off the screen.
|
|
188
|
+
blank(s);
|
|
189
|
+
client.restoreConversation(EMPTY);
|
|
190
|
+
}
|
|
191
|
+
publish();
|
|
192
|
+
flush();
|
|
193
|
+
});
|
|
194
|
+
}, [client, enabled, flush, partnerKey, publish]);
|
|
195
|
+
// ── The adapter ──────────────────────────────────────────────────────────
|
|
196
|
+
const s = store.current;
|
|
197
|
+
const threads = useMemo(() => s.conversations
|
|
198
|
+
// An empty conversation is not one yet. Leaving it out is what keeps
|
|
199
|
+
// the Chats button off until there is something behind it, and stops
|
|
200
|
+
// the list opening on a single row saying "New chat".
|
|
201
|
+
.filter((c) => c.snapshot.messages.length > 0)
|
|
202
|
+
.map((c) => ({
|
|
203
|
+
id: c.id,
|
|
204
|
+
status: 'regular',
|
|
205
|
+
// Never left to assistant-ui's own fallback, so one word decides
|
|
206
|
+
// what an untitled conversation is called.
|
|
207
|
+
title: c.title ?? UNTITLED,
|
|
208
|
+
lastMessageAt: new Date(c.updatedAt),
|
|
209
|
+
})),
|
|
210
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
211
|
+
[s.conversations]);
|
|
212
|
+
const onSwitchToNewThread = useCallback(() => {
|
|
213
|
+
if (!enabled) {
|
|
214
|
+
// No list, so no way back: end the session rather than leave it behind.
|
|
215
|
+
client.clearMessages();
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const s = store.current;
|
|
219
|
+
const current = s.conversations.find((c) => c.id === s.currentId);
|
|
220
|
+
// Already on an empty chat. Pressing New again should not stack up blanks.
|
|
221
|
+
if (current && current.snapshot.messages.length === 0)
|
|
222
|
+
return;
|
|
223
|
+
blank(s);
|
|
224
|
+
client.restoreConversation(EMPTY);
|
|
225
|
+
s.seen = 0;
|
|
226
|
+
publish();
|
|
227
|
+
flush();
|
|
228
|
+
}, [client, enabled, flush, publish]);
|
|
229
|
+
const onSwitchToThread = useCallback((id) => {
|
|
230
|
+
const s = store.current;
|
|
231
|
+
const target = s.conversations.find((c) => c.id === id);
|
|
232
|
+
if (!target || id === s.currentId)
|
|
233
|
+
return;
|
|
234
|
+
s.currentId = id;
|
|
235
|
+
s.seen = target.snapshot.messages.length;
|
|
236
|
+
client.restoreConversation(target.snapshot);
|
|
237
|
+
publish();
|
|
238
|
+
flush();
|
|
239
|
+
}, [client, flush, publish]);
|
|
240
|
+
const onRename = useCallback((id, title) => {
|
|
241
|
+
const s = store.current;
|
|
242
|
+
const target = s.conversations.find((c) => c.id === id);
|
|
243
|
+
if (!target)
|
|
244
|
+
return;
|
|
245
|
+
// Renaming does not count as activity: the conversation keeps its place
|
|
246
|
+
// in the list instead of jumping to the top of it.
|
|
247
|
+
target.title = title.trim() || null;
|
|
248
|
+
// A new array, or the adapter would hand assistant-ui the one it already
|
|
249
|
+
// has and the new name would never reach the screen.
|
|
250
|
+
reorder(s);
|
|
251
|
+
publish();
|
|
252
|
+
flush();
|
|
253
|
+
}, [flush, publish]);
|
|
254
|
+
const onDelete = useCallback((id) => {
|
|
255
|
+
const s = store.current;
|
|
256
|
+
s.conversations = s.conversations.filter((c) => c.id !== id);
|
|
257
|
+
if (id === s.currentId) {
|
|
258
|
+
blank(s);
|
|
259
|
+
client.restoreConversation(EMPTY);
|
|
260
|
+
s.seen = 0;
|
|
261
|
+
}
|
|
262
|
+
publish();
|
|
263
|
+
flush();
|
|
264
|
+
}, [client, flush, publish]);
|
|
265
|
+
return useMemo(() => enabled
|
|
266
|
+
? {
|
|
267
|
+
threadId: s.currentId,
|
|
268
|
+
threads,
|
|
269
|
+
onSwitchToNewThread,
|
|
270
|
+
onSwitchToThread,
|
|
271
|
+
onRename,
|
|
272
|
+
onDelete,
|
|
273
|
+
}
|
|
274
|
+
: { onSwitchToNewThread }, [enabled, s.currentId, threads, onSwitchToNewThread, onSwitchToThread, onRename, onDelete]);
|
|
275
|
+
}
|
|
276
|
+
// ── The store ──────────────────────────────────────────────────────────────
|
|
277
|
+
/**
|
|
278
|
+
* The list as it stands when the chat mounts.
|
|
279
|
+
*
|
|
280
|
+
* A client handed to the chat may already be holding a conversation — a partner
|
|
281
|
+
* sharing one client with the rest of their app, or a chat that unmounted and
|
|
282
|
+
* came back. That transcript is adopted rather than thrown away: into the
|
|
283
|
+
* stored conversation it came from where the last message identifies one, and
|
|
284
|
+
* into a new conversation where it does not.
|
|
285
|
+
*/
|
|
286
|
+
function start(client, partnerKey, enabled) {
|
|
287
|
+
const identity = identityKey(client.auth.getUser?.()?.id);
|
|
288
|
+
const conversations = enabled ? readConversations(partnerKey, identity) : [];
|
|
289
|
+
const messages = client.messages;
|
|
290
|
+
const store = {
|
|
291
|
+
identity,
|
|
292
|
+
conversations,
|
|
293
|
+
currentId: '',
|
|
294
|
+
seen: 0,
|
|
295
|
+
fresh: new Set(),
|
|
296
|
+
guest: isGuest(client, identity),
|
|
297
|
+
};
|
|
298
|
+
if (messages.length > 0) {
|
|
299
|
+
// A transcript already in the client is one somebody is in the middle of,
|
|
300
|
+
// so it counts as started here however it got there.
|
|
301
|
+
const lastId = messages[messages.length - 1].id;
|
|
302
|
+
const known = conversations.find((c) => c.snapshot.messages[c.snapshot.messages.length - 1]?.id === lastId);
|
|
303
|
+
const conversation = known ??
|
|
304
|
+
{
|
|
305
|
+
id: newId(),
|
|
306
|
+
title: titleFrom(firstUser(messages)),
|
|
307
|
+
createdAt: Date.now(),
|
|
308
|
+
updatedAt: Date.now(),
|
|
309
|
+
snapshot: client.exportConversation(),
|
|
310
|
+
};
|
|
311
|
+
if (known)
|
|
312
|
+
known.snapshot = client.exportConversation();
|
|
313
|
+
else
|
|
314
|
+
conversations.unshift(conversation);
|
|
315
|
+
store.currentId = conversation.id;
|
|
316
|
+
store.seen = messages.length;
|
|
317
|
+
store.fresh.add(conversation.id);
|
|
318
|
+
return store;
|
|
319
|
+
}
|
|
320
|
+
// Nothing on screen: pick up where this device left off. The transcript is
|
|
321
|
+
// put back locally — the engine is not asked for anything and does not need
|
|
322
|
+
// to remember it. Not marked as started here: it may be an earlier visitor's.
|
|
323
|
+
const newest = conversations[0];
|
|
324
|
+
if (newest) {
|
|
325
|
+
client.restoreConversation(newest.snapshot);
|
|
326
|
+
store.currentId = newest.id;
|
|
327
|
+
store.seen = newest.snapshot.messages.length;
|
|
328
|
+
return store;
|
|
329
|
+
}
|
|
330
|
+
blank(store);
|
|
331
|
+
return store;
|
|
332
|
+
}
|
|
333
|
+
/** Put a fresh, empty conversation at the top of the list and make it the current one. */
|
|
334
|
+
function blank(store) {
|
|
335
|
+
const conversation = {
|
|
336
|
+
id: newId(),
|
|
337
|
+
title: null,
|
|
338
|
+
createdAt: Date.now(),
|
|
339
|
+
updatedAt: Date.now(),
|
|
340
|
+
snapshot: { messages: [], history: [], threadId: null },
|
|
341
|
+
};
|
|
342
|
+
store.conversations = [conversation, ...store.conversations];
|
|
343
|
+
store.currentId = conversation.id;
|
|
344
|
+
store.seen = 0;
|
|
345
|
+
store.fresh.add(conversation.id);
|
|
346
|
+
}
|
|
347
|
+
/** Newest first, and a new array so the adapter's `threads` is seen to have changed. */
|
|
348
|
+
function reorder(store) {
|
|
349
|
+
store.conversations = [...store.conversations].sort((a, b) => b.updatedAt - a.updatedAt);
|
|
350
|
+
}
|
|
351
|
+
function firstUser(messages) {
|
|
352
|
+
return messages.find((m) => m.role === 'user');
|
|
353
|
+
}
|
|
354
|
+
/** Whether there is no account behind this identity: a guest, or nobody yet. */
|
|
355
|
+
function isGuest(client, identity) {
|
|
356
|
+
return identity === identityKey(null) || client.auth.isAnonymous?.() === true;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* `crypto.randomUUID` needs a secure context, which a partner's staging page on
|
|
360
|
+
* plain http is not. The id only has to be unique inside one browser's storage.
|
|
361
|
+
*/
|
|
362
|
+
function newId() {
|
|
363
|
+
return `c_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=use-conversations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-conversations.js","sourceRoot":"","sources":["../../../src/chat/lib/use-conversations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/chat/provider.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI1F,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/chat/provider.tsx"],"names":[],"mappings":"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"}
|
package/dist/chat/provider.js
CHANGED
|
@@ -17,6 +17,7 @@ import { assertOneAssistantUi } from './lib/guard.js';
|
|
|
17
17
|
import { useGuestLimits } from './auth-gate.js';
|
|
18
18
|
import { PortalHostContext, useCreatePortalHost } from './lib/portal-host.js';
|
|
19
19
|
import { createDictationPhaseStore } from './lib/dictation-phase.js';
|
|
20
|
+
import { useConversations } from './lib/use-conversations.js';
|
|
20
21
|
/** `dark` as a whole word, so `darkroom-theme` is not dark mode. */
|
|
21
22
|
export function hasDarkClass(className) {
|
|
22
23
|
return !!className && /(^|\s)dark(\s|$)/.test(className);
|
|
@@ -92,12 +93,17 @@ export function ChatProvider({ children, ...props }) {
|
|
|
92
93
|
}, [client]);
|
|
93
94
|
const dictation = useMemo(() => createDictationPhaseStore(), []);
|
|
94
95
|
const { preferences } = useUserPreferences();
|
|
96
|
+
// Before the runtime, and it has to stay there: this may put the conversation
|
|
97
|
+
// this device left off on back into the client, and the runtime reads the
|
|
98
|
+
// client's messages as its own initial state on the same render.
|
|
99
|
+
const threadList = useConversations(client, { enabled: features.threadList });
|
|
95
100
|
const runtime = useTalk2ViewRuntimeForClient(client, {
|
|
96
101
|
systemPrompt,
|
|
97
102
|
tools,
|
|
98
103
|
// The end-user's choice from Settings; empty means the partner's default.
|
|
99
104
|
model: preferences.model || undefined,
|
|
100
105
|
attachments: features.attachments,
|
|
106
|
+
threadList,
|
|
101
107
|
dictation: features.dictation && {
|
|
102
108
|
model: preferences.sttModel || undefined,
|
|
103
109
|
language: preferences.sttLanguage || undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/chat/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;;;;GAOG;AACH,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAoB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAA4B,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/chat/provider.tsx"],"names":[],"mappings":"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"}
|
package/dist/chat/ui/avatar.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
|
|
3
|
-
declare function Avatar({ className, size, ...props }: AvatarPrimitive.Root.Props & {
|
|
2
|
+
declare const Avatar: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/avatar").AvatarRootProps & {
|
|
4
3
|
size?: "default" | "sm" | "lg";
|
|
5
|
-
}
|
|
6
|
-
declare
|
|
7
|
-
declare
|
|
8
|
-
declare
|
|
9
|
-
declare
|
|
10
|
-
declare
|
|
4
|
+
}, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
5
|
+
declare const AvatarImage: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/avatar").AvatarImageProps, "ref"> & React.RefAttributes<HTMLImageElement>>;
|
|
6
|
+
declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/avatar").AvatarFallbackProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
7
|
+
declare const AvatarBadge: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
8
|
+
declare const AvatarGroup: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
9
|
+
declare const AvatarGroupCount: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
11
10
|
export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge, };
|
|
12
11
|
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/chat/ui/avatar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/chat/ui/avatar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,QAAA,MAAM,MAAM;WAGD,SAAS,GAAG,IAAI,GAAG,IAAI;iDAehC,CAAA;AAGF,QAAA,MAAM,WAAW,wIAef,CAAA;AAGF,QAAA,MAAM,cAAc,0IAelB,CAAA;AAGF,QAAA,MAAM,WAAW,sKAkBf,CAAA;AAGF,QAAA,MAAM,WAAW,mKAef,CAAA;AAGF,QAAA,MAAM,gBAAgB,mKAepB,CAAA;AAGF,OAAO,EACL,MAAM,EACN,WAAW,EACX,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,GACZ,CAAA"}
|
package/dist/chat/ui/avatar.js
CHANGED
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
// Every component in this directory is wrapped in `forwardRef`. React 19 lets a
|
|
4
|
+
// plain function component read `ref` out of its props; React 18 — which this
|
|
5
|
+
// package still supports — strips it, warns, and the ref reaches nothing. Base
|
|
6
|
+
// UI hands refs to whatever it renders, so a plain function here loses them
|
|
7
|
+
// silently. See tests/chat/ui-refs.test.tsx.
|
|
8
|
+
import * as React from "react";
|
|
3
9
|
import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar";
|
|
4
10
|
import { cn } from "../lib/cn.js";
|
|
5
|
-
function Avatar({ className, size = "default", ...props }) {
|
|
6
|
-
return (_jsx(AvatarPrimitive.Root, { "data-slot": "avatar", "data-size": size, className: cn("group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten", className), ...props }));
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
function
|
|
18
|
-
return (_jsx("
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
11
|
+
const Avatar = React.forwardRef(function Avatar({ className, size = "default", ...props }, ref) {
|
|
12
|
+
return (_jsx(AvatarPrimitive.Root, { ref: ref, "data-slot": "avatar", "data-size": size, className: cn("group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten", className), ...props }));
|
|
13
|
+
});
|
|
14
|
+
Avatar.displayName = "Avatar";
|
|
15
|
+
const AvatarImage = React.forwardRef(function AvatarImage({ className, ...props }, ref) {
|
|
16
|
+
return (_jsx(AvatarPrimitive.Image, { ref: ref, "data-slot": "avatar-image", className: cn("aspect-square size-full rounded-full object-cover", className), ...props }));
|
|
17
|
+
});
|
|
18
|
+
AvatarImage.displayName = "AvatarImage";
|
|
19
|
+
const AvatarFallback = React.forwardRef(function AvatarFallback({ className, ...props }, ref) {
|
|
20
|
+
return (_jsx(AvatarPrimitive.Fallback, { ref: ref, "data-slot": "avatar-fallback", className: cn("flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs", className), ...props }));
|
|
21
|
+
});
|
|
22
|
+
AvatarFallback.displayName = "AvatarFallback";
|
|
23
|
+
const AvatarBadge = React.forwardRef(function AvatarBadge({ className, ...props }, ref) {
|
|
24
|
+
return (_jsx("span", { ref: ref, "data-slot": "avatar-badge", className: cn("absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none", "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden", "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", className), ...props }));
|
|
25
|
+
});
|
|
26
|
+
AvatarBadge.displayName = "AvatarBadge";
|
|
27
|
+
const AvatarGroup = React.forwardRef(function AvatarGroup({ className, ...props }, ref) {
|
|
28
|
+
return (_jsx("div", { ref: ref, "data-slot": "avatar-group", className: cn("group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background", className), ...props }));
|
|
29
|
+
});
|
|
30
|
+
AvatarGroup.displayName = "AvatarGroup";
|
|
31
|
+
const AvatarGroupCount = React.forwardRef(function AvatarGroupCount({ className, ...props }, ref) {
|
|
32
|
+
return (_jsx("div", { ref: ref, "data-slot": "avatar-group-count", className: cn("relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className), ...props }));
|
|
33
|
+
});
|
|
34
|
+
AvatarGroupCount.displayName = "AvatarGroupCount";
|
|
23
35
|
export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge, };
|
|
24
36
|
//# sourceMappingURL=avatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/chat/ui/avatar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/chat/ui/avatar.tsx"],"names":[],"mappings":"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"}
|
package/dist/chat/ui/button.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from "react";
|
|
2
2
|
import { type VariantProps } from "class-variance-authority";
|
|
3
3
|
declare const buttonVariants: (props?: ({
|
|
4
4
|
variant?: "default" | "link" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
|
|
5
5
|
size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
6
6
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
-
declare
|
|
7
|
+
declare const Button: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/button").ButtonProps & VariantProps<(props?: ({
|
|
8
|
+
variant?: "default" | "link" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
|
|
9
|
+
size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
10
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
8
11
|
export { Button, buttonVariants };
|
|
9
12
|
//# sourceMappingURL=button.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/chat/ui/button.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/chat/ui/button.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,cAAc;;;8EAmCnB,CAAA;AAED,QAAA,MAAM,MAAM;;;iIAeV,CAAA;AAGF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}
|
package/dist/chat/ui/button.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// Every component in this directory is wrapped in `forwardRef`. React 19 lets a
|
|
3
|
+
// plain function component read `ref` out of its props; React 18 — which this
|
|
4
|
+
// package still supports — strips it, warns, and the ref reaches nothing. Base
|
|
5
|
+
// UI hands refs to whatever it renders, so a plain function here loses them
|
|
6
|
+
// silently. See tests/chat/ui-refs.test.tsx.
|
|
7
|
+
import * as React from "react";
|
|
2
8
|
import { Button as ButtonPrimitive } from "@base-ui/react/button";
|
|
3
9
|
import { cva } from "class-variance-authority";
|
|
4
10
|
import { cn } from "../lib/cn.js";
|
|
@@ -28,8 +34,9 @@ const buttonVariants = cva("group/button inline-flex shrink-0 items-center justi
|
|
|
28
34
|
size: "default",
|
|
29
35
|
},
|
|
30
36
|
});
|
|
31
|
-
function Button({ className, variant = "default", size = "default", ...props }) {
|
|
32
|
-
return (_jsx(ButtonPrimitive, { "data-slot": "button", className: cn(buttonVariants({ variant, size, className })), ...props }));
|
|
33
|
-
}
|
|
37
|
+
const Button = React.forwardRef(function Button({ className, variant = "default", size = "default", ...props }, ref) {
|
|
38
|
+
return (_jsx(ButtonPrimitive, { ref: ref, "data-slot": "button", className: cn(buttonVariants({ variant, size, className })), ...props }));
|
|
39
|
+
});
|
|
40
|
+
Button.displayName = "Button";
|
|
34
41
|
export { Button, buttonVariants };
|
|
35
42
|
//# sourceMappingURL=button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/chat/ui/button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,MAAM,cAAc,GAAG,GAAG,CACxB,4lBAA4lB,EAC5lB;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,4DAA4D;YACrE,OAAO,EACL,iLAAiL;YACnL,SAAS,EACP,iIAAiI;YACnI,KAAK,EACH,kHAAkH;YACpH,WAAW,EACT,6NAA6N;YAC/N,IAAI,EAAE,iDAAiD;SACxD;QACD,IAAI,EAAE;YACJ,OAAO,EACL,sFAAsF;YACxF,EAAE,EAAE,+MAA+M;YACnN,EAAE,EAAE,yNAAyN;YAC7N,EAAE,EAAE,sFAAsF;YAC1F,IAAI,EAAE,QAAQ;YACd,SAAS,EACP,yHAAyH;YAC3H,SAAS,EACP,oFAAoF;YACtF,SAAS,EAAE,QAAQ;SACpB;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;KAChB;CACF,CACF,CAAA;AAED,
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/chat/ui/button.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,6CAA6C;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,MAAM,cAAc,GAAG,GAAG,CACxB,4lBAA4lB,EAC5lB;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,4DAA4D;YACrE,OAAO,EACL,iLAAiL;YACnL,SAAS,EACP,iIAAiI;YACnI,KAAK,EACH,kHAAkH;YACpH,WAAW,EACT,6NAA6N;YAC/N,IAAI,EAAE,iDAAiD;SACxD;QACD,IAAI,EAAE;YACJ,OAAO,EACL,sFAAsF;YACxF,EAAE,EAAE,+MAA+M;YACnN,EAAE,EAAE,yNAAyN;YAC7N,EAAE,EAAE,sFAAsF;YAC1F,IAAI,EAAE,QAAQ;YACd,SAAS,EACP,yHAAyH;YAC3H,SAAS,EACP,oFAAoF;YACtF,SAAS,EAAE,QAAQ;SACpB;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;KAChB;CACF,CACF,CAAA;AAED,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAG7B,SAAS,MAAM,CACf,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,KAAK,EAAE,EAC9D,GAAG;IAEH,OAAO,CACL,KAAC,eAAe,IACd,GAAG,EAAE,GAAG,eACE,QAAQ,EAClB,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,KACvD,KAAK,GACT,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AACF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAA;AAE7B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}
|