@assistant-ui/react 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.d.mts +40 -13
- package/dist/index.d.ts +40 -13
- package/dist/index.js +367 -292
- package/dist/index.mjs +355 -280
- package/package.json +3 -2
package/dist/index.mjs
CHANGED
@@ -10,137 +10,26 @@ __export(thread_exports, {
|
|
10
10
|
Empty: () => ThreadEmpty,
|
11
11
|
If: () => ThreadIf,
|
12
12
|
Messages: () => ThreadMessages,
|
13
|
-
Provider: () => ThreadProvider,
|
14
13
|
Root: () => ThreadRoot,
|
15
14
|
Viewport: () => ThreadViewport
|
16
15
|
});
|
17
16
|
|
18
|
-
// src/
|
19
|
-
import {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
const parentId = messages[i - 1]?.id ?? ROOT_ID;
|
27
|
-
data.parentMap.set(childId, parentId);
|
28
|
-
let parentArray = data.branchMap.get(parentId);
|
29
|
-
if (!parentArray) {
|
30
|
-
data.branchMap.set(parentId, [childId]);
|
31
|
-
} else if (!parentArray.includes(childId)) {
|
32
|
-
parentArray.push(childId);
|
33
|
-
}
|
34
|
-
data.snapshots.set(childId, messages);
|
35
|
-
}
|
36
|
-
};
|
37
|
-
var getParentId = (data, messages, message) => {
|
38
|
-
if (message.id === UPCOMING_MESSAGE_ID) {
|
39
|
-
const parent = messages.at(-1);
|
40
|
-
if (!parent)
|
41
|
-
return ROOT_ID;
|
42
|
-
return parent.id;
|
17
|
+
// src/primitives/thread/ThreadRoot.tsx
|
18
|
+
import { forwardRef } from "react";
|
19
|
+
import {
|
20
|
+
Primitive
|
21
|
+
} from "@radix-ui/react-primitive";
|
22
|
+
var ThreadRoot = forwardRef(
|
23
|
+
(props, ref) => {
|
24
|
+
return /* @__PURE__ */ React.createElement(Primitive.div, { ...props, ref });
|
43
25
|
}
|
44
|
-
|
45
|
-
if (!parentId)
|
46
|
-
throw new Error("Unexpected: Message parent not found");
|
47
|
-
return parentId;
|
48
|
-
};
|
49
|
-
var getBranchStateImpl = (data, messages, message) => {
|
50
|
-
const parentId = getParentId(data, messages, message);
|
51
|
-
const branches = data.branchMap.get(parentId) ?? [];
|
52
|
-
const branchId = message.id === UPCOMING_MESSAGE_ID ? branches.length : branches.indexOf(message.id);
|
53
|
-
if (branchId === -1)
|
54
|
-
throw new Error("Unexpected: Message not found in parent children");
|
55
|
-
const upcomingOffset = message.id === UPCOMING_MESSAGE_ID ? 1 : 0;
|
56
|
-
return {
|
57
|
-
branchId,
|
58
|
-
branchCount: branches.length + upcomingOffset
|
59
|
-
};
|
60
|
-
};
|
61
|
-
var switchToBranchImpl = (data, messages, message, branchId) => {
|
62
|
-
const parentId = getParentId(data, messages, message);
|
63
|
-
const branches = data.branchMap.get(parentId);
|
64
|
-
if (!branches)
|
65
|
-
throw new Error("Unexpected: Parent children not found");
|
66
|
-
const newMessageId = branches[branchId];
|
67
|
-
if (!newMessageId)
|
68
|
-
throw new Error("Unexpected: Requested branch not found");
|
69
|
-
if (branchId < 0 || branchId >= branches.length)
|
70
|
-
throw new Error("Switch to branch called with a branch index out of range");
|
71
|
-
if (newMessageId === message.id)
|
72
|
-
return messages;
|
73
|
-
const snapshot = data.snapshots.get(newMessageId);
|
74
|
-
if (!snapshot)
|
75
|
-
throw new Error("Unexpected: Branch snapshot not found");
|
76
|
-
return snapshot;
|
77
|
-
};
|
78
|
-
var sliceMessagesUntil = (messages, message) => {
|
79
|
-
if (message.id === UPCOMING_MESSAGE_ID)
|
80
|
-
return messages;
|
81
|
-
const messageIdx = messages.findIndex((m) => m.id === message.id);
|
82
|
-
if (messageIdx === -1)
|
83
|
-
throw new Error("Unexpected: Message not found");
|
84
|
-
return messages.slice(0, messageIdx);
|
85
|
-
};
|
86
|
-
var useChatWithBranches = (chat) => {
|
87
|
-
const data = useRef({
|
88
|
-
parentMap: /* @__PURE__ */ new Map(),
|
89
|
-
branchMap: /* @__PURE__ */ new Map(),
|
90
|
-
snapshots: /* @__PURE__ */ new Map()
|
91
|
-
}).current;
|
92
|
-
updateBranchData(data, chat.messages);
|
93
|
-
const getBranchState = useCallback(
|
94
|
-
(message) => {
|
95
|
-
return getBranchStateImpl(data, chat.messages, message);
|
96
|
-
},
|
97
|
-
[chat.messages]
|
98
|
-
);
|
99
|
-
const switchToBranch = useCallback(
|
100
|
-
(message, branchId) => {
|
101
|
-
const newMessages = switchToBranchImpl(
|
102
|
-
data,
|
103
|
-
chat.messages,
|
104
|
-
message,
|
105
|
-
branchId
|
106
|
-
);
|
107
|
-
chat.setMessages(newMessages);
|
108
|
-
},
|
109
|
-
[chat.messages, chat.setMessages]
|
110
|
-
);
|
111
|
-
const reloadAt = useCallback(
|
112
|
-
async (message) => {
|
113
|
-
const newMessages = sliceMessagesUntil(chat.messages, message);
|
114
|
-
chat.setMessages(newMessages);
|
115
|
-
await chat.reload();
|
116
|
-
},
|
117
|
-
[chat.messages, chat.setMessages, chat.reload]
|
118
|
-
);
|
119
|
-
const editAt = useCallback(
|
120
|
-
async (message, newMessage) => {
|
121
|
-
const newMessages = sliceMessagesUntil(chat.messages, message);
|
122
|
-
chat.setMessages(newMessages);
|
123
|
-
await chat.append(newMessage);
|
124
|
-
},
|
125
|
-
[chat.messages, chat.setMessages, chat.append]
|
126
|
-
);
|
127
|
-
return useMemo(
|
128
|
-
() => ({
|
129
|
-
...chat,
|
130
|
-
getBranchState,
|
131
|
-
switchToBranch,
|
132
|
-
editAt,
|
133
|
-
reloadAt
|
134
|
-
}),
|
135
|
-
[chat, getBranchState, switchToBranch, editAt, reloadAt]
|
136
|
-
);
|
137
|
-
};
|
26
|
+
);
|
138
27
|
|
139
28
|
// src/utils/context/createStoreContext.tsx
|
140
29
|
import {
|
141
30
|
createContext,
|
142
31
|
useContext,
|
143
|
-
useMemo
|
32
|
+
useMemo,
|
144
33
|
useState
|
145
34
|
} from "react";
|
146
35
|
import { useSyncExternalStoreWithSelector } from "use-sync-external-store/with-selector";
|
@@ -179,7 +68,9 @@ var createStoreContext = (providerName) => {
|
|
179
68
|
return () => listeners.delete(cb);
|
180
69
|
},
|
181
70
|
emit: () => {
|
182
|
-
|
71
|
+
for (const listener of listeners) {
|
72
|
+
listener();
|
73
|
+
}
|
183
74
|
},
|
184
75
|
snapshot: () => {
|
185
76
|
return state;
|
@@ -190,7 +81,7 @@ var createStoreContext = (providerName) => {
|
|
190
81
|
}
|
191
82
|
};
|
192
83
|
});
|
193
|
-
|
84
|
+
useMemo(
|
194
85
|
() => store.setState(unstableContext),
|
195
86
|
Object.values(unstableContext)
|
196
87
|
);
|
@@ -216,21 +107,6 @@ var createStoreContext = (providerName) => {
|
|
216
107
|
// src/utils/context/ThreadContext.ts
|
217
108
|
var [ThreadContextProvider, useThreadContext] = createStoreContext("Thread.Provider");
|
218
109
|
|
219
|
-
// src/primitives/thread/ThreadProvider.tsx
|
220
|
-
var ThreadProvider = ({ chat, children }) => {
|
221
|
-
const branches = useChatWithBranches(chat);
|
222
|
-
return /* @__PURE__ */ React.createElement(ThreadContextProvider, { chat: branches }, children);
|
223
|
-
};
|
224
|
-
|
225
|
-
// src/primitives/thread/ThreadRoot.tsx
|
226
|
-
import { forwardRef } from "react";
|
227
|
-
import { Primitive } from "@radix-ui/react-primitive";
|
228
|
-
var ThreadRoot = forwardRef(
|
229
|
-
(props, ref) => {
|
230
|
-
return /* @__PURE__ */ React.createElement(Primitive.div, { ...props, ref });
|
231
|
-
}
|
232
|
-
);
|
233
|
-
|
234
110
|
// src/primitives/thread/ThreadIf.tsx
|
235
111
|
var useThreadIf = (props) => {
|
236
112
|
return useThreadContext("Thread.If", (s) => {
|
@@ -257,15 +133,17 @@ var ThreadEmpty = ({ children }) => {
|
|
257
133
|
};
|
258
134
|
|
259
135
|
// src/primitives/thread/ThreadViewport.tsx
|
260
|
-
import { forwardRef as forwardRef2, useRef as
|
261
|
-
import {
|
136
|
+
import { forwardRef as forwardRef2, useRef as useRef2, useState as useState2 } from "react";
|
137
|
+
import {
|
138
|
+
Primitive as Primitive2
|
139
|
+
} from "@radix-ui/react-primitive";
|
262
140
|
import { useComposedRefs } from "@radix-ui/react-compose-refs";
|
263
141
|
import { composeEventHandlers } from "@radix-ui/primitive";
|
264
142
|
|
265
143
|
// src/utils/hooks/useOnResizeContent.tsx
|
266
|
-
import { useLayoutEffect, useRef
|
144
|
+
import { useLayoutEffect, useRef } from "react";
|
267
145
|
var useOnResizeContent = (ref, callback) => {
|
268
|
-
const callbackRef =
|
146
|
+
const callbackRef = useRef(callback);
|
269
147
|
callbackRef.current = callback;
|
270
148
|
useLayoutEffect(() => {
|
271
149
|
const el = ref.current;
|
@@ -275,31 +153,37 @@ var useOnResizeContent = (ref, callback) => {
|
|
275
153
|
callbackRef.current();
|
276
154
|
});
|
277
155
|
const mutationObserver = new MutationObserver((mutations) => {
|
278
|
-
|
279
|
-
mutation.addedNodes
|
280
|
-
if (node instanceof
|
156
|
+
for (const mutation of mutations) {
|
157
|
+
for (const node of mutation.addedNodes) {
|
158
|
+
if (node instanceof Element) {
|
281
159
|
resizeObserver.observe(node);
|
282
160
|
}
|
283
|
-
}
|
284
|
-
mutation.removedNodes
|
285
|
-
if (node instanceof
|
161
|
+
}
|
162
|
+
for (const node of mutation.removedNodes) {
|
163
|
+
if (node instanceof Element) {
|
286
164
|
resizeObserver.unobserve(node);
|
287
165
|
}
|
288
|
-
}
|
289
|
-
}
|
166
|
+
}
|
167
|
+
}
|
290
168
|
callbackRef.current();
|
291
169
|
});
|
170
|
+
resizeObserver.observe(el);
|
292
171
|
mutationObserver.observe(el, { childList: true });
|
172
|
+
for (const child of el.children) {
|
173
|
+
resizeObserver.observe(child);
|
174
|
+
console.log("observing child", child);
|
175
|
+
}
|
293
176
|
return () => {
|
177
|
+
console.log("disconnecting");
|
294
178
|
resizeObserver.disconnect();
|
295
179
|
mutationObserver.disconnect();
|
296
180
|
};
|
297
|
-
}, []);
|
181
|
+
}, [ref.current]);
|
298
182
|
};
|
299
183
|
|
300
184
|
// src/primitives/thread/ThreadViewport.tsx
|
301
185
|
var ThreadViewport = forwardRef2(({ onScroll, children, ...rest }, forwardedRef) => {
|
302
|
-
const divRef =
|
186
|
+
const divRef = useRef2(null);
|
303
187
|
const ref = useComposedRefs(forwardedRef, divRef);
|
304
188
|
const [isAtBottom, setIsAtBottom] = useState2(true);
|
305
189
|
useOnResizeContent(divRef, () => {
|
@@ -312,8 +196,9 @@ var ThreadViewport = forwardRef2(({ onScroll, children, ...rest }, forwardedRef)
|
|
312
196
|
const div = divRef.current;
|
313
197
|
if (!div)
|
314
198
|
return;
|
315
|
-
setIsAtBottom(div.scrollHeight - div.scrollTop <= div.clientHeight);
|
199
|
+
setIsAtBottom(div.scrollHeight - div.scrollTop <= div.clientHeight + 50);
|
316
200
|
};
|
201
|
+
console.log(isAtBottom);
|
317
202
|
return /* @__PURE__ */ React.createElement(
|
318
203
|
Primitive2.div,
|
319
204
|
{
|
@@ -325,6 +210,127 @@ var ThreadViewport = forwardRef2(({ onScroll, children, ...rest }, forwardedRef)
|
|
325
210
|
);
|
326
211
|
});
|
327
212
|
|
213
|
+
// src/utils/hooks/useBranches.tsx
|
214
|
+
import { useCallback, useMemo as useMemo2, useRef as useRef3 } from "react";
|
215
|
+
var ROOT_ID = "__ROOT_ID__";
|
216
|
+
var UPCOMING_MESSAGE_ID = "__UPCOMING_MESSAGE_ID__";
|
217
|
+
var updateBranchData = (data, messages) => {
|
218
|
+
for (let i = 0; i < messages.length; i++) {
|
219
|
+
const child = messages[i];
|
220
|
+
const childId = child.id;
|
221
|
+
const parentId = messages[i - 1]?.id ?? ROOT_ID;
|
222
|
+
data.parentMap.set(childId, parentId);
|
223
|
+
const parentArray = data.branchMap.get(parentId);
|
224
|
+
if (!parentArray) {
|
225
|
+
data.branchMap.set(parentId, [childId]);
|
226
|
+
} else if (!parentArray.includes(childId)) {
|
227
|
+
parentArray.push(childId);
|
228
|
+
}
|
229
|
+
data.snapshots.set(childId, messages);
|
230
|
+
}
|
231
|
+
};
|
232
|
+
var getParentId = (data, messages, message) => {
|
233
|
+
if (message.id === UPCOMING_MESSAGE_ID) {
|
234
|
+
const parent = messages.at(-1);
|
235
|
+
if (!parent)
|
236
|
+
return ROOT_ID;
|
237
|
+
return parent.id;
|
238
|
+
}
|
239
|
+
const parentId = data.parentMap.get(message.id);
|
240
|
+
if (!parentId)
|
241
|
+
throw new Error("Unexpected: Message parent not found");
|
242
|
+
return parentId;
|
243
|
+
};
|
244
|
+
var getBranchStateImpl = (data, messages, message) => {
|
245
|
+
const parentId = getParentId(data, messages, message);
|
246
|
+
const branches = data.branchMap.get(parentId) ?? [];
|
247
|
+
const branchId = message.id === UPCOMING_MESSAGE_ID ? branches.length : branches.indexOf(message.id);
|
248
|
+
if (branchId === -1)
|
249
|
+
throw new Error("Unexpected: Message not found in parent children");
|
250
|
+
const upcomingOffset = message.id === UPCOMING_MESSAGE_ID ? 1 : 0;
|
251
|
+
return {
|
252
|
+
branchId,
|
253
|
+
branchCount: branches.length + upcomingOffset
|
254
|
+
};
|
255
|
+
};
|
256
|
+
var switchToBranchImpl = (data, messages, message, branchId) => {
|
257
|
+
const parentId = getParentId(data, messages, message);
|
258
|
+
const branches = data.branchMap.get(parentId);
|
259
|
+
if (!branches)
|
260
|
+
throw new Error("Unexpected: Parent children not found");
|
261
|
+
const newMessageId = branches[branchId];
|
262
|
+
if (!newMessageId)
|
263
|
+
throw new Error("Unexpected: Requested branch not found");
|
264
|
+
if (branchId < 0 || branchId >= branches.length)
|
265
|
+
throw new Error("Switch to branch called with a branch index out of range");
|
266
|
+
if (newMessageId === message.id)
|
267
|
+
return messages;
|
268
|
+
const snapshot = data.snapshots.get(newMessageId);
|
269
|
+
if (!snapshot)
|
270
|
+
throw new Error("Unexpected: Branch snapshot not found");
|
271
|
+
return snapshot;
|
272
|
+
};
|
273
|
+
var sliceMessagesUntil = (messages, message) => {
|
274
|
+
if (message.id === UPCOMING_MESSAGE_ID)
|
275
|
+
return messages;
|
276
|
+
const messageIdx = messages.findIndex((m) => m.id === message.id);
|
277
|
+
if (messageIdx === -1)
|
278
|
+
throw new Error("Unexpected: Message not found");
|
279
|
+
return messages.slice(0, messageIdx);
|
280
|
+
};
|
281
|
+
var useChatWithBranches = (chat) => {
|
282
|
+
const data = useRef3({
|
283
|
+
parentMap: /* @__PURE__ */ new Map(),
|
284
|
+
branchMap: /* @__PURE__ */ new Map(),
|
285
|
+
snapshots: /* @__PURE__ */ new Map()
|
286
|
+
}).current;
|
287
|
+
updateBranchData(data, chat.messages);
|
288
|
+
const getBranchState = useCallback(
|
289
|
+
(message) => {
|
290
|
+
return getBranchStateImpl(data, chat.messages, message);
|
291
|
+
},
|
292
|
+
[data, chat.messages]
|
293
|
+
);
|
294
|
+
const switchToBranch = useCallback(
|
295
|
+
(message, branchId) => {
|
296
|
+
const newMessages = switchToBranchImpl(
|
297
|
+
data,
|
298
|
+
chat.messages,
|
299
|
+
message,
|
300
|
+
branchId
|
301
|
+
);
|
302
|
+
chat.setMessages(newMessages);
|
303
|
+
},
|
304
|
+
[data, chat.messages, chat.setMessages]
|
305
|
+
);
|
306
|
+
const reloadAt = useCallback(
|
307
|
+
async (message) => {
|
308
|
+
const newMessages = sliceMessagesUntil(chat.messages, message);
|
309
|
+
chat.setMessages(newMessages);
|
310
|
+
await chat.reload();
|
311
|
+
},
|
312
|
+
[chat.messages, chat.setMessages, chat.reload]
|
313
|
+
);
|
314
|
+
const editAt = useCallback(
|
315
|
+
async (message, newMessage) => {
|
316
|
+
const newMessages = sliceMessagesUntil(chat.messages, message);
|
317
|
+
chat.setMessages(newMessages);
|
318
|
+
await chat.append(newMessage);
|
319
|
+
},
|
320
|
+
[chat.messages, chat.setMessages, chat.append]
|
321
|
+
);
|
322
|
+
return useMemo2(
|
323
|
+
() => ({
|
324
|
+
...chat,
|
325
|
+
getBranchState,
|
326
|
+
switchToBranch,
|
327
|
+
editAt,
|
328
|
+
reloadAt
|
329
|
+
}),
|
330
|
+
[chat, getBranchState, switchToBranch, editAt, reloadAt]
|
331
|
+
);
|
332
|
+
};
|
333
|
+
|
328
334
|
// src/primitives/message/index.ts
|
329
335
|
var message_exports = {};
|
330
336
|
__export(message_exports, {
|
@@ -377,7 +383,9 @@ var MessageProvider = ({
|
|
377
383
|
|
378
384
|
// src/primitives/message/MessageRoot.tsx
|
379
385
|
import { forwardRef as forwardRef3 } from "react";
|
380
|
-
import {
|
386
|
+
import {
|
387
|
+
Primitive as Primitive3
|
388
|
+
} from "@radix-ui/react-primitive";
|
381
389
|
import { composeEventHandlers as composeEventHandlers2 } from "@radix-ui/primitive";
|
382
390
|
var MessageRoot = forwardRef3(
|
383
391
|
({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
|
@@ -445,35 +453,10 @@ var MessageContent = () => {
|
|
445
453
|
};
|
446
454
|
|
447
455
|
// src/primitives/message/MessageEditableContent.tsx
|
448
|
-
import {
|
449
|
-
import { forwardRef as forwardRef4, useRef as useRef4 } from "react";
|
450
|
-
|
451
|
-
// src/utils/hooks/useAutosize.tsx
|
452
|
-
import { useLayoutEffect as useLayoutEffect2 } from "react";
|
453
|
-
var useAutosize = (ref) => {
|
454
|
-
const el = ref.current;
|
455
|
-
useLayoutEffect2(() => {
|
456
|
-
const el2 = ref.current;
|
457
|
-
if (!el2)
|
458
|
-
return;
|
459
|
-
const callback = () => {
|
460
|
-
el2.style.height = "0px";
|
461
|
-
el2.style.height = el2.scrollHeight + "px";
|
462
|
-
};
|
463
|
-
el2.addEventListener("input", callback);
|
464
|
-
callback();
|
465
|
-
return () => {
|
466
|
-
el2.removeEventListener("input", callback);
|
467
|
-
};
|
468
|
-
}, [ref, el]);
|
469
|
-
};
|
470
|
-
|
471
|
-
// src/primitives/message/MessageEditableContent.tsx
|
456
|
+
import { forwardRef as forwardRef4 } from "react";
|
472
457
|
import { composeEventHandlers as composeEventHandlers3 } from "@radix-ui/primitive";
|
458
|
+
import TextareaAutosize from "react-textarea-autosize";
|
473
459
|
var MessageEditableContent = forwardRef4(({ onChange, value, ...rest }, forwardedRef) => {
|
474
|
-
const textareaRef = useRef4(null);
|
475
|
-
const ref = useComposedRefs2(forwardedRef, textareaRef);
|
476
|
-
useAutosize(textareaRef);
|
477
460
|
const [editState, setEditState] = useMessageContext(
|
478
461
|
"Message.EditableContent",
|
479
462
|
(s) => [s.editState, s.setEditState]
|
@@ -486,10 +469,10 @@ var MessageEditableContent = forwardRef4(({ onChange, value, ...rest }, forwarde
|
|
486
469
|
"Message.EditableContent may only be rendered when edit mode is enabled. Consider wrapping the component in <Message.If editing>."
|
487
470
|
);
|
488
471
|
return /* @__PURE__ */ React.createElement(
|
489
|
-
|
472
|
+
TextareaAutosize,
|
490
473
|
{
|
491
474
|
...rest,
|
492
|
-
ref,
|
475
|
+
ref: forwardedRef,
|
493
476
|
onChange: composeEventHandlers3(onChange, handleChange),
|
494
477
|
value: editState.value || value
|
495
478
|
}
|
@@ -497,15 +480,24 @@ var MessageEditableContent = forwardRef4(({ onChange, value, ...rest }, forwarde
|
|
497
480
|
});
|
498
481
|
|
499
482
|
// src/primitives/thread/ThreadMessages.tsx
|
500
|
-
var
|
501
|
-
|
502
|
-
|
483
|
+
var getComponents = (components) => {
|
484
|
+
return {
|
485
|
+
EditingUserMessage: components.EditingUserMessage ?? components.UserMessage ?? components.Message,
|
486
|
+
UserMessage: components.UserMessage ?? components.Message,
|
487
|
+
AssistantMessage: components.AssistantMessage ?? components.Message
|
488
|
+
};
|
489
|
+
};
|
490
|
+
var ThreadMessages = ({ components }) => {
|
503
491
|
const chat = useThreadContext("Thread.Messages", (s) => s.chat);
|
504
492
|
const messages = chat.messages;
|
493
|
+
const { UserMessage, EditingUserMessage, AssistantMessage } = getComponents(components);
|
505
494
|
if (messages.length === 0)
|
506
495
|
return null;
|
507
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message,
|
508
|
-
return
|
496
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message, idx) => {
|
497
|
+
return (
|
498
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: fixes a11y issues with branch navigation
|
499
|
+
/* @__PURE__ */ React.createElement(MessageProvider, { key: idx, message }, /* @__PURE__ */ React.createElement(MessageIf, { user: true, editing: false }, /* @__PURE__ */ React.createElement(UserMessage, null)), /* @__PURE__ */ React.createElement(MessageIf, { user: true, editing: true }, /* @__PURE__ */ React.createElement(EditingUserMessage, null)), /* @__PURE__ */ React.createElement(MessageIf, { assistant: true }, /* @__PURE__ */ React.createElement(AssistantMessage, null)))
|
500
|
+
);
|
509
501
|
}), chat.isLoading && chat.messages[chat.messages.length - 1]?.role !== "assistant" && /* @__PURE__ */ React.createElement(
|
510
502
|
MessageProvider,
|
511
503
|
{
|
@@ -515,7 +507,7 @@ var ThreadMessages = ({
|
|
515
507
|
content: "..."
|
516
508
|
}
|
517
509
|
},
|
518
|
-
/* @__PURE__ */ React.createElement(
|
510
|
+
/* @__PURE__ */ React.createElement(AssistantMessage, null)
|
519
511
|
));
|
520
512
|
};
|
521
513
|
|
@@ -529,10 +521,12 @@ __export(composer_exports, {
|
|
529
521
|
});
|
530
522
|
|
531
523
|
// src/primitives/composer/ComposerRoot.tsx
|
532
|
-
import { createContext as createContext2, forwardRef as forwardRef5, useContext as useContext2, useMemo as useMemo4, useRef as
|
533
|
-
import {
|
524
|
+
import { createContext as createContext2, forwardRef as forwardRef5, useContext as useContext2, useMemo as useMemo4, useRef as useRef4 } from "react";
|
525
|
+
import {
|
526
|
+
Primitive as Primitive4
|
527
|
+
} from "@radix-ui/react-primitive";
|
534
528
|
import { composeEventHandlers as composeEventHandlers4 } from "@radix-ui/primitive";
|
535
|
-
import { useComposedRefs as
|
529
|
+
import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
|
536
530
|
var ComposerContext = createContext2(null);
|
537
531
|
var useComposerContext = () => {
|
538
532
|
const context = useContext2(ComposerContext);
|
@@ -549,8 +543,8 @@ var ComposerRoot = forwardRef5(
|
|
549
543
|
"Composer.Root",
|
550
544
|
(s) => s.chat.handleSubmit
|
551
545
|
);
|
552
|
-
const formRef =
|
553
|
-
const ref =
|
546
|
+
const formRef = useRef4(null);
|
547
|
+
const ref = useComposedRefs2(forwardedRef, formRef);
|
554
548
|
const composerContextValue = useMemo4(
|
555
549
|
() => ({
|
556
550
|
submit: () => formRef.current?.dispatchEvent(
|
@@ -571,10 +565,10 @@ var ComposerRoot = forwardRef5(
|
|
571
565
|
);
|
572
566
|
|
573
567
|
// src/primitives/composer/ComposerInput.tsx
|
574
|
-
import { forwardRef as forwardRef6
|
568
|
+
import { forwardRef as forwardRef6 } from "react";
|
575
569
|
import { Slot } from "@radix-ui/react-slot";
|
576
570
|
import { composeEventHandlers as composeEventHandlers5 } from "@radix-ui/primitive";
|
577
|
-
import
|
571
|
+
import TextareaAutosize2 from "react-textarea-autosize";
|
578
572
|
var ComposerInput = forwardRef6(({ asChild, onChange, onKeyDown, ...rest }, forwardedRef) => {
|
579
573
|
const chat = useThreadContext(
|
580
574
|
"Composer.Input",
|
@@ -584,15 +578,12 @@ var ComposerInput = forwardRef6(({ asChild, onChange, onKeyDown, ...rest }, forw
|
|
584
578
|
isLoading
|
585
579
|
})
|
586
580
|
);
|
587
|
-
const Component = asChild ? Slot :
|
588
|
-
const textareaRef = useRef6(null);
|
589
|
-
const ref = useComposedRefs4(forwardedRef, textareaRef);
|
590
|
-
useAutosize(textareaRef);
|
581
|
+
const Component = asChild ? Slot : TextareaAutosize2;
|
591
582
|
const composer = useComposerContext();
|
592
583
|
const handleKeyPress = (e) => {
|
593
584
|
if (chat.isLoading || rest.disabled)
|
594
585
|
return;
|
595
|
-
if (e.key === "Enter" && e.shiftKey
|
586
|
+
if (e.key === "Enter" && e.shiftKey === false) {
|
596
587
|
e.preventDefault();
|
597
588
|
composer.submit();
|
598
589
|
}
|
@@ -602,7 +593,7 @@ var ComposerInput = forwardRef6(({ asChild, onChange, onKeyDown, ...rest }, forw
|
|
602
593
|
{
|
603
594
|
value: chat.input,
|
604
595
|
...rest,
|
605
|
-
ref,
|
596
|
+
ref: forwardedRef,
|
606
597
|
onChange: composeEventHandlers5(onChange, chat.handleInputChange),
|
607
598
|
onKeyDown: composeEventHandlers5(onKeyDown, handleKeyPress)
|
608
599
|
}
|
@@ -611,7 +602,9 @@ var ComposerInput = forwardRef6(({ asChild, onChange, onKeyDown, ...rest }, forw
|
|
611
602
|
|
612
603
|
// src/primitives/composer/ComposerSend.tsx
|
613
604
|
import { forwardRef as forwardRef7 } from "react";
|
614
|
-
import {
|
605
|
+
import {
|
606
|
+
Primitive as Primitive5
|
607
|
+
} from "@radix-ui/react-primitive";
|
615
608
|
var ComposerSend = forwardRef7(
|
616
609
|
({ disabled, ...rest }, ref) => {
|
617
610
|
const input = useThreadContext("Composer.Send", (s) => s.chat.input);
|
@@ -629,7 +622,9 @@ var ComposerSend = forwardRef7(
|
|
629
622
|
|
630
623
|
// src/utils/createActionButton.tsx
|
631
624
|
import { forwardRef as forwardRef8 } from "react";
|
632
|
-
import {
|
625
|
+
import {
|
626
|
+
Primitive as Primitive6
|
627
|
+
} from "@radix-ui/react-primitive";
|
633
628
|
import { composeEventHandlers as composeEventHandlers6 } from "@radix-ui/primitive";
|
634
629
|
var createActionButton = (useActionButton) => {
|
635
630
|
return forwardRef8(
|
@@ -671,41 +666,59 @@ __export(branchPicker_exports, {
|
|
671
666
|
Root: () => BranchPickerRoot
|
672
667
|
});
|
673
668
|
|
674
|
-
// src/
|
675
|
-
var
|
669
|
+
// src/actions/useGoToNextBranch.tsx
|
670
|
+
var useGoToNextBranch = () => {
|
676
671
|
const switchToBranch = useThreadContext(
|
677
672
|
"BranchPicker.Next",
|
678
673
|
(s) => s.chat.switchToBranch
|
679
674
|
);
|
680
|
-
const
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
675
|
+
const context = useMessageContext("BranchPicker.Next", (s) => {
|
676
|
+
const {
|
677
|
+
message: message2,
|
678
|
+
editState: { isEditing },
|
679
|
+
branchState: { branchId: branchId2, branchCount }
|
680
|
+
} = s;
|
681
|
+
if (isEditing || branchCount <= 1 || branchId2 + 1 >= branchCount)
|
682
|
+
return null;
|
683
|
+
return { message: message2, branchId: branchId2 };
|
684
|
+
});
|
685
|
+
if (!context)
|
685
686
|
return null;
|
687
|
+
const { message, branchId } = context;
|
686
688
|
return () => {
|
687
689
|
switchToBranch(message, branchId + 1);
|
688
690
|
};
|
689
691
|
};
|
690
|
-
var BranchPickerNext = createActionButton(useBranchPickerNext);
|
691
692
|
|
692
|
-
// src/primitives/branchPicker/
|
693
|
-
var
|
693
|
+
// src/primitives/branchPicker/BranchPickerNext.tsx
|
694
|
+
var BranchPickerNext = createActionButton(useGoToNextBranch);
|
695
|
+
|
696
|
+
// src/actions/useGoToPreviousBranch.tsx
|
697
|
+
var useGoToPreviousBranch = () => {
|
694
698
|
const switchToBranch = useThreadContext(
|
695
699
|
"BranchPicker.Previous",
|
696
700
|
(s) => s.chat.switchToBranch
|
697
701
|
);
|
698
|
-
const
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
702
|
+
const context = useMessageContext("BranchPicker.Previous", (s) => {
|
703
|
+
const {
|
704
|
+
message: message2,
|
705
|
+
editState: { isEditing },
|
706
|
+
branchState: { branchId: branchId2, branchCount }
|
707
|
+
} = s;
|
708
|
+
if (isEditing || branchCount <= 1 || branchId2 <= 0)
|
709
|
+
return null;
|
710
|
+
return { message: message2, branchId: branchId2 };
|
711
|
+
});
|
712
|
+
if (!context)
|
703
713
|
return null;
|
714
|
+
const { message, branchId } = context;
|
704
715
|
return () => {
|
705
716
|
switchToBranch(message, branchId - 1);
|
706
717
|
};
|
707
718
|
};
|
708
|
-
|
719
|
+
|
720
|
+
// src/primitives/branchPicker/BranchPickerPrevious.tsx
|
721
|
+
var BranchPickerPrevious = createActionButton(useGoToPreviousBranch);
|
709
722
|
|
710
723
|
// src/primitives/branchPicker/BranchPickerCount.tsx
|
711
724
|
var BranchPickerCount = () => {
|
@@ -726,10 +739,12 @@ var BranchPickerNumber = () => {
|
|
726
739
|
};
|
727
740
|
|
728
741
|
// src/primitives/branchPicker/BranchPickerRoot.tsx
|
742
|
+
import {
|
743
|
+
Primitive as Primitive7
|
744
|
+
} from "@radix-ui/react-primitive";
|
729
745
|
import { forwardRef as forwardRef9 } from "react";
|
730
|
-
|
731
|
-
|
732
|
-
return /* @__PURE__ */ React.createElement(Primitive7.div, { ...rest, ref });
|
746
|
+
var BranchPickerRoot = forwardRef9(({ hideWhenSingleBranch, ...rest }, ref) => {
|
747
|
+
return /* @__PURE__ */ React.createElement(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0 }, /* @__PURE__ */ React.createElement(Primitive7.div, { ...rest, ref }));
|
733
748
|
});
|
734
749
|
|
735
750
|
// src/primitives/actionBar/index.ts
|
@@ -742,51 +757,81 @@ __export(actionBar_exports, {
|
|
742
757
|
});
|
743
758
|
|
744
759
|
// src/primitives/actionBar/ActionBarRoot.tsx
|
760
|
+
import {
|
761
|
+
Primitive as Primitive8
|
762
|
+
} from "@radix-ui/react-primitive";
|
745
763
|
import { forwardRef as forwardRef10 } from "react";
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
return /* @__PURE__ */ React.createElement(Primitive8.div, { ...rest, ref });
|
750
|
-
}
|
751
|
-
);
|
764
|
+
var ActionBarRoot = forwardRef10(({ ...rest }, ref) => {
|
765
|
+
return /* @__PURE__ */ React.createElement(Primitive8.div, { ...rest, ref });
|
766
|
+
});
|
752
767
|
|
753
|
-
// src/
|
754
|
-
var
|
755
|
-
const
|
756
|
-
|
757
|
-
|
758
|
-
|
768
|
+
// src/actions/useCopyMessage.tsx
|
769
|
+
var useCopyMessage = ({ copiedDuration = 3e3 }) => {
|
770
|
+
const context = useMessageContext("ActionBar.Copy", (s) => {
|
771
|
+
const {
|
772
|
+
editState: { isEditing },
|
773
|
+
message: { content: content2 },
|
774
|
+
setIsCopied: setIsCopied2
|
775
|
+
} = s;
|
776
|
+
if (isEditing)
|
777
|
+
return null;
|
778
|
+
return { content: content2, setIsCopied: setIsCopied2 };
|
779
|
+
});
|
780
|
+
if (!context)
|
781
|
+
return null;
|
782
|
+
const { content, setIsCopied } = context;
|
759
783
|
return () => {
|
760
|
-
navigator.clipboard.writeText(
|
784
|
+
navigator.clipboard.writeText(content);
|
761
785
|
setIsCopied(true);
|
762
786
|
setTimeout(() => setIsCopied(false), copiedDuration);
|
763
787
|
};
|
764
788
|
};
|
765
|
-
var ActionBarCopy = createActionButton(useActionBarCopy);
|
766
789
|
|
767
|
-
// src/primitives/actionBar/
|
768
|
-
var
|
769
|
-
|
770
|
-
|
771
|
-
|
790
|
+
// src/primitives/actionBar/ActionBarCopy.tsx
|
791
|
+
var ActionBarCopy = createActionButton(useCopyMessage);
|
792
|
+
|
793
|
+
// src/actions/useReloadMessage.tsx
|
794
|
+
var useReloadMessage = () => {
|
795
|
+
const [isLoading, reloadAt] = useThreadContext("ActionBar.Reload", (s) => [
|
796
|
+
s.chat.isLoading,
|
797
|
+
s.chat.reloadAt
|
798
|
+
]);
|
799
|
+
const message = useMessageContext("ActionBar.Reload", (s) => {
|
800
|
+
const message2 = s.message;
|
801
|
+
if (message2.role !== "assistant" || isLoading)
|
802
|
+
return null;
|
803
|
+
return message2;
|
804
|
+
});
|
805
|
+
if (!message)
|
772
806
|
return null;
|
773
|
-
return () =>
|
807
|
+
return () => reloadAt(message);
|
774
808
|
};
|
775
|
-
var ActionBarReload = createActionButton(useActionBarReload);
|
776
809
|
|
777
|
-
// src/primitives/actionBar/
|
778
|
-
var
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
)
|
783
|
-
|
810
|
+
// src/primitives/actionBar/ActionBarReload.tsx
|
811
|
+
var ActionBarReload = createActionButton(useReloadMessage);
|
812
|
+
|
813
|
+
// src/actions/useBeginMessageEdit.tsx
|
814
|
+
var useBeginMessageEdit = () => {
|
815
|
+
const context = useMessageContext("ActionBar.Edit", (s) => {
|
816
|
+
const {
|
817
|
+
message: { content: content2 },
|
818
|
+
editState: { isEditing },
|
819
|
+
setEditState: setEditState2
|
820
|
+
} = s;
|
821
|
+
if (isEditing)
|
822
|
+
return null;
|
823
|
+
return { content: content2, setEditState: setEditState2 };
|
824
|
+
});
|
825
|
+
if (!context)
|
784
826
|
return null;
|
827
|
+
const { content, setEditState } = context;
|
785
828
|
return () => {
|
786
|
-
setEditState({ isEditing: true, value:
|
829
|
+
setEditState({ isEditing: true, value: content });
|
787
830
|
};
|
788
831
|
};
|
789
|
-
|
832
|
+
|
833
|
+
// src/primitives/actionBar/ActionBarEdit.tsx
|
834
|
+
var ActionBarEdit = createActionButton(useBeginMessageEdit);
|
790
835
|
|
791
836
|
// src/primitives/editBar/index.ts
|
792
837
|
var editBar_exports = {};
|
@@ -797,56 +842,86 @@ __export(editBar_exports, {
|
|
797
842
|
});
|
798
843
|
|
799
844
|
// src/primitives/editBar/EditBarRoot.tsx
|
845
|
+
import {
|
846
|
+
Primitive as Primitive9
|
847
|
+
} from "@radix-ui/react-primitive";
|
800
848
|
import { forwardRef as forwardRef11 } from "react";
|
801
|
-
import { Primitive as Primitive9 } from "@radix-ui/react-primitive";
|
802
849
|
var EditBarRoot = forwardRef11(
|
803
850
|
({ ...rest }, ref) => {
|
804
851
|
return /* @__PURE__ */ React.createElement(Primitive9.div, { ...rest, ref });
|
805
852
|
}
|
806
853
|
);
|
807
854
|
|
808
|
-
// src/
|
809
|
-
var
|
855
|
+
// src/actions/useSaveMessageEdit.tsx
|
856
|
+
var useSaveMessageEdit = () => {
|
810
857
|
const chat = useThreadContext("EditBar.Save", (s) => s.chat);
|
811
|
-
const
|
812
|
-
|
813
|
-
(
|
814
|
-
|
815
|
-
|
858
|
+
const context = useMessageContext("EditBar.Save", (s) => {
|
859
|
+
const { message: message2, editState, setEditState: setEditState2 } = s;
|
860
|
+
if (!editState.isEditing)
|
861
|
+
return null;
|
862
|
+
return { message: message2, content: editState.value, setEditState: setEditState2 };
|
863
|
+
});
|
864
|
+
if (!context)
|
816
865
|
return null;
|
866
|
+
const { message, content, setEditState } = context;
|
817
867
|
return () => {
|
818
|
-
if (!editState.isEditing)
|
819
|
-
return;
|
820
868
|
chat.editAt(message, {
|
821
869
|
...message,
|
822
870
|
id: void 0,
|
823
871
|
// remove id to create a new message
|
824
|
-
content
|
872
|
+
content
|
825
873
|
});
|
826
874
|
setEditState({ isEditing: false });
|
827
875
|
};
|
828
876
|
};
|
829
|
-
var EditBarSave = createActionButton(useEditBarSave);
|
830
877
|
|
831
|
-
// src/primitives/editBar/
|
832
|
-
var
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
878
|
+
// src/primitives/editBar/EditBarSave.tsx
|
879
|
+
var EditBarSave = createActionButton(useSaveMessageEdit);
|
880
|
+
|
881
|
+
// src/actions/useCancelMessageEdit.tsx
|
882
|
+
var useCancelMessageEdit = () => {
|
883
|
+
const context = useMessageContext("EditBar.Cancel", (s) => {
|
884
|
+
const {
|
885
|
+
editState: { isEditing },
|
886
|
+
setEditState: setEditState2
|
887
|
+
} = s;
|
888
|
+
if (!isEditing)
|
889
|
+
return null;
|
890
|
+
return { setEditState: setEditState2 };
|
891
|
+
});
|
892
|
+
if (!context)
|
838
893
|
return null;
|
894
|
+
const { setEditState } = context;
|
839
895
|
return () => {
|
840
896
|
setEditState({ isEditing: false });
|
841
897
|
};
|
842
898
|
};
|
843
|
-
|
899
|
+
|
900
|
+
// src/primitives/editBar/EditBarCancel.tsx
|
901
|
+
var EditBarCancel = createActionButton(useCancelMessageEdit);
|
902
|
+
|
903
|
+
// src/vercel/VercelAIThreadProvider.tsx
|
904
|
+
var VercelAIThreadProvider = ({
|
905
|
+
chat,
|
906
|
+
children
|
907
|
+
}) => {
|
908
|
+
const branches = useChatWithBranches(chat);
|
909
|
+
return /* @__PURE__ */ React.createElement(ThreadContextProvider, { chat: branches }, children);
|
910
|
+
};
|
844
911
|
export {
|
845
|
-
actionBar_exports as
|
846
|
-
branchPicker_exports as
|
847
|
-
composer_exports as
|
848
|
-
editBar_exports as
|
849
|
-
message_exports as
|
850
|
-
thread_exports as
|
851
|
-
|
912
|
+
actionBar_exports as ActionBarPrimitive,
|
913
|
+
branchPicker_exports as BranchPickerPrimitive,
|
914
|
+
composer_exports as ComposerPrimitive,
|
915
|
+
editBar_exports as EditBarPrimitive,
|
916
|
+
message_exports as MessagePrimitive,
|
917
|
+
thread_exports as ThreadPrimitive,
|
918
|
+
VercelAIThreadProvider,
|
919
|
+
useMessageContext as unstable_useMessageContext,
|
920
|
+
useBeginMessageEdit,
|
921
|
+
useCancelMessageEdit,
|
922
|
+
useCopyMessage,
|
923
|
+
useGoToNextBranch,
|
924
|
+
useGoToPreviousBranch,
|
925
|
+
useReloadMessage,
|
926
|
+
useSaveMessageEdit
|
852
927
|
};
|