@assistant-ui/react 0.0.3 → 0.0.5
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/index.d.mts +46 -55
- package/dist/index.d.ts +46 -55
- package/dist/index.js +423 -395
- package/dist/index.mjs +430 -398
- package/package.json +4 -8
package/dist/index.mjs
CHANGED
@@ -25,92 +25,22 @@ var ThreadRoot = forwardRef(
|
|
25
25
|
}
|
26
26
|
);
|
27
27
|
|
28
|
-
// src/utils/context/
|
29
|
-
import {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
// src/utils/context/shallow.ts
|
38
|
-
function shallow(objA, objB) {
|
39
|
-
if (Object.is(objA, objB)) {
|
40
|
-
return true;
|
41
|
-
}
|
42
|
-
if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
|
43
|
-
return false;
|
44
|
-
}
|
45
|
-
const keysA = Object.keys(objA);
|
46
|
-
if (keysA.length !== Object.keys(objB).length) {
|
47
|
-
return false;
|
48
|
-
}
|
49
|
-
for (const keyA of keysA) {
|
50
|
-
if (!Object.prototype.hasOwnProperty.call(objB, keyA) || !Object.is(objA[keyA], objB[keyA])) {
|
51
|
-
return false;
|
52
|
-
}
|
53
|
-
}
|
54
|
-
return true;
|
55
|
-
}
|
56
|
-
|
57
|
-
// src/utils/context/createStoreContext.tsx
|
58
|
-
var createStoreContext = (providerName) => {
|
59
|
-
const context = createContext(null);
|
60
|
-
const StoreProvider = ({ children, ...rest }) => {
|
61
|
-
const unstableContext = rest;
|
62
|
-
const [store] = useState(() => {
|
63
|
-
let state = unstableContext;
|
64
|
-
const listeners = /* @__PURE__ */ new Set();
|
65
|
-
return {
|
66
|
-
subscribe: (cb) => {
|
67
|
-
listeners.add(cb);
|
68
|
-
return () => listeners.delete(cb);
|
69
|
-
},
|
70
|
-
emit: () => {
|
71
|
-
for (const listener of listeners) {
|
72
|
-
listener();
|
73
|
-
}
|
74
|
-
},
|
75
|
-
snapshot: () => {
|
76
|
-
return state;
|
77
|
-
},
|
78
|
-
setState: (value) => {
|
79
|
-
state = value;
|
80
|
-
store.emit();
|
81
|
-
}
|
82
|
-
};
|
83
|
-
});
|
84
|
-
useMemo(
|
85
|
-
() => store.setState(unstableContext),
|
86
|
-
Object.values(unstableContext)
|
87
|
-
);
|
88
|
-
return /* @__PURE__ */ React.createElement(context.Provider, { value: store }, children);
|
89
|
-
};
|
90
|
-
const useStoreContext = (consumerName, selector) => {
|
91
|
-
const store = useContext(context);
|
92
|
-
if (!store)
|
93
|
-
throw new Error(
|
94
|
-
`${consumerName} can only be used inside ${providerName}.`
|
95
|
-
);
|
96
|
-
return useSyncExternalStoreWithSelector(
|
97
|
-
store.subscribe,
|
98
|
-
store.snapshot,
|
99
|
-
store.snapshot,
|
100
|
-
selector,
|
101
|
-
shallow
|
28
|
+
// src/utils/context/AssistantContext.ts
|
29
|
+
import { createContext, useContext } from "react";
|
30
|
+
var AssistantContext = createContext(null);
|
31
|
+
var useAssistantContext = () => {
|
32
|
+
const context = useContext(AssistantContext);
|
33
|
+
if (!context)
|
34
|
+
throw new Error(
|
35
|
+
"useAssistantContext must be used within a AssistantProvider"
|
102
36
|
);
|
103
|
-
|
104
|
-
return [StoreProvider, useStoreContext];
|
37
|
+
return context;
|
105
38
|
};
|
106
39
|
|
107
|
-
// src/utils/context/ThreadContext.ts
|
108
|
-
var [ThreadContextProvider, useThreadContext] = createStoreContext("Thread.Provider");
|
109
|
-
|
110
40
|
// src/primitives/thread/ThreadIf.tsx
|
111
41
|
var useThreadIf = (props) => {
|
112
|
-
|
113
|
-
|
42
|
+
const { useThread } = useAssistantContext();
|
43
|
+
return useThread((thread) => {
|
114
44
|
if (props.empty === true && thread.messages.length !== 0)
|
115
45
|
return false;
|
116
46
|
if (props.empty === false && thread.messages.length === 0)
|
@@ -133,7 +63,7 @@ var ThreadEmpty = ({ children }) => {
|
|
133
63
|
};
|
134
64
|
|
135
65
|
// src/primitives/thread/ThreadViewport.tsx
|
136
|
-
import { forwardRef as forwardRef2, useRef as useRef2, useState
|
66
|
+
import { forwardRef as forwardRef2, useRef as useRef2, useState } from "react";
|
137
67
|
import {
|
138
68
|
Primitive as Primitive2
|
139
69
|
} from "@radix-ui/react-primitive";
|
@@ -185,7 +115,7 @@ var useOnResizeContent = (ref, callback) => {
|
|
185
115
|
var ThreadViewport = forwardRef2(({ onScroll, children, ...rest }, forwardedRef) => {
|
186
116
|
const divRef = useRef2(null);
|
187
117
|
const ref = useComposedRefs(forwardedRef, divRef);
|
188
|
-
const [isAtBottom, setIsAtBottom] =
|
118
|
+
const [isAtBottom, setIsAtBottom] = useState(true);
|
189
119
|
useOnResizeContent(divRef, () => {
|
190
120
|
const div = divRef.current;
|
191
121
|
if (!div || !isAtBottom)
|
@@ -211,7 +141,7 @@ var ThreadViewport = forwardRef2(({ onScroll, children, ...rest }, forwardedRef)
|
|
211
141
|
});
|
212
142
|
|
213
143
|
// src/utils/hooks/useBranches.tsx
|
214
|
-
import { useCallback, useMemo
|
144
|
+
import { useCallback, useMemo, useRef as useRef3 } from "react";
|
215
145
|
var ROOT_ID = "__ROOT_ID__";
|
216
146
|
var UPCOMING_MESSAGE_ID = "__UPCOMING_MESSAGE_ID__";
|
217
147
|
var updateBranchData = (data, messages) => {
|
@@ -319,80 +249,154 @@ var useChatWithBranches = (chat) => {
|
|
319
249
|
},
|
320
250
|
[chat.messages, chat.setMessages, chat.append]
|
321
251
|
);
|
322
|
-
return
|
252
|
+
return useMemo(
|
323
253
|
() => ({
|
324
|
-
...chat,
|
325
254
|
getBranchState,
|
326
255
|
switchToBranch,
|
327
256
|
editAt,
|
328
257
|
reloadAt
|
329
258
|
}),
|
330
|
-
[
|
259
|
+
[getBranchState, switchToBranch, editAt, reloadAt]
|
331
260
|
);
|
332
261
|
};
|
262
|
+
var hasUpcomingMessage = (thread) => {
|
263
|
+
return thread.isLoading && thread.messages[thread.messages.length - 1]?.role !== "assistant";
|
264
|
+
};
|
265
|
+
|
266
|
+
// src/utils/context/ComposerState.ts
|
267
|
+
import { useContext as useContext3 } from "react";
|
268
|
+
|
269
|
+
// src/utils/context/MessageContext.ts
|
270
|
+
import { createContext as createContext2, useContext as useContext2 } from "react";
|
271
|
+
var MessageContext = createContext2(null);
|
272
|
+
var useMessageContext = () => {
|
273
|
+
const context = useContext2(MessageContext);
|
274
|
+
if (!context)
|
275
|
+
throw new Error("useMessageContext must be used within a MessageProvider");
|
276
|
+
return context;
|
277
|
+
};
|
278
|
+
|
279
|
+
// src/utils/context/ComposerState.ts
|
280
|
+
var useComposerContext = () => {
|
281
|
+
const { useComposer: useAssisstantComposer } = useAssistantContext();
|
282
|
+
const { useComposer: useMessageComposer } = useContext3(MessageContext) ?? {};
|
283
|
+
return { useComposer: useMessageComposer ?? useAssisstantComposer };
|
284
|
+
};
|
285
|
+
|
286
|
+
// src/primitives/composer/ComposerIf.tsx
|
287
|
+
var useComposerIf = (props) => {
|
288
|
+
const { useComposer } = useComposerContext();
|
289
|
+
return useComposer((composer) => {
|
290
|
+
if (props.editing === true && !composer.isEditing)
|
291
|
+
return false;
|
292
|
+
if (props.editing === false && composer.isEditing)
|
293
|
+
return false;
|
294
|
+
return true;
|
295
|
+
});
|
296
|
+
};
|
297
|
+
var ComposerIf = ({ children, ...query }) => {
|
298
|
+
const result = useComposerIf(query);
|
299
|
+
return result ? children : null;
|
300
|
+
};
|
333
301
|
|
334
302
|
// src/primitives/message/index.ts
|
335
303
|
var message_exports = {};
|
336
304
|
__export(message_exports, {
|
337
305
|
Content: () => MessageContent,
|
338
|
-
EditableContent: () => MessageEditableContent,
|
339
306
|
If: () => MessageIf,
|
340
307
|
Provider: () => MessageProvider,
|
341
308
|
Root: () => MessageRoot
|
342
309
|
});
|
343
310
|
|
344
311
|
// src/primitives/message/MessageProvider.tsx
|
345
|
-
import { useMemo as
|
346
|
-
|
347
|
-
|
348
|
-
var
|
349
|
-
|
350
|
-
|
312
|
+
import { useMemo as useMemo2, useState as useState2 } from "react";
|
313
|
+
import { create } from "zustand";
|
314
|
+
import { useShallow } from "zustand/react/shallow";
|
315
|
+
var getIsLast = (thread, message) => {
|
316
|
+
const hasUpcoming = hasUpcomingMessage(thread);
|
317
|
+
return hasUpcoming ? message.id === UPCOMING_MESSAGE_ID : thread.messages[thread.messages.length - 1]?.id === message.id;
|
318
|
+
};
|
319
|
+
var useMessageContext2 = () => {
|
320
|
+
const { useBranchObserver } = useAssistantContext();
|
321
|
+
const [context] = useState2(() => {
|
322
|
+
const useMessage = create(() => ({
|
323
|
+
message: null,
|
324
|
+
isLast: false,
|
325
|
+
isCopied: false,
|
326
|
+
isHovering: false,
|
327
|
+
setIsCopied: () => {
|
328
|
+
},
|
329
|
+
setIsHovering: () => {
|
330
|
+
},
|
331
|
+
branchState: {
|
332
|
+
branchId: 0,
|
333
|
+
branchCount: 0
|
334
|
+
}
|
335
|
+
}));
|
336
|
+
const useComposer = create((set, get) => ({
|
337
|
+
isEditing: false,
|
338
|
+
canCancel: true,
|
339
|
+
edit: () => set({
|
340
|
+
isEditing: true,
|
341
|
+
value: useMessage.getState().message.content
|
342
|
+
}),
|
343
|
+
cancel: () => set({ isEditing: false }),
|
344
|
+
send: () => {
|
345
|
+
const message = useMessage.getState().message;
|
346
|
+
useBranchObserver.getState().editAt(message, {
|
347
|
+
...message,
|
348
|
+
id: void 0,
|
349
|
+
// remove id to create a new message
|
350
|
+
content: get().value
|
351
|
+
});
|
352
|
+
set({ isEditing: false });
|
353
|
+
},
|
354
|
+
value: "",
|
355
|
+
setValue: (value) => set({ value })
|
356
|
+
}));
|
357
|
+
return { useMessage, useComposer };
|
358
|
+
});
|
359
|
+
return context;
|
360
|
+
};
|
351
361
|
var MessageProvider = ({
|
352
362
|
message,
|
353
363
|
children
|
354
364
|
}) => {
|
355
|
-
const
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
const [editState, setEditState] = useState3({
|
360
|
-
isEditing: false
|
361
|
-
});
|
362
|
-
const [isCopied, setIsCopied] = useState3(false);
|
363
|
-
const [isHovering, setIsHovering] = useState3(false);
|
364
|
-
const branchState = useMemo3(
|
365
|
-
() => getBranchState(message),
|
366
|
-
[getBranchState, message]
|
367
|
-
);
|
368
|
-
return /* @__PURE__ */ React.createElement(
|
369
|
-
MessageContextProvider,
|
370
|
-
{
|
371
|
-
message,
|
372
|
-
editState,
|
373
|
-
setEditState,
|
374
|
-
branchState,
|
375
|
-
isCopied,
|
376
|
-
setIsCopied,
|
377
|
-
isHovering,
|
378
|
-
setIsHovering
|
379
|
-
},
|
380
|
-
children
|
365
|
+
const { useThread, useBranchObserver } = useAssistantContext();
|
366
|
+
const context = useMessageContext2();
|
367
|
+
const branchState = useBranchObserver(
|
368
|
+
useShallow((b) => b.getBranchState(message))
|
381
369
|
);
|
370
|
+
const isLast = useThread((thread) => getIsLast(thread, message));
|
371
|
+
const [isCopied, setIsCopied] = useState2(false);
|
372
|
+
const [isHovering, setIsHovering] = useState2(false);
|
373
|
+
useMemo2(() => {
|
374
|
+
context.useMessage.setState(
|
375
|
+
{
|
376
|
+
message,
|
377
|
+
isLast,
|
378
|
+
isCopied,
|
379
|
+
isHovering,
|
380
|
+
setIsCopied,
|
381
|
+
setIsHovering,
|
382
|
+
branchState
|
383
|
+
},
|
384
|
+
true
|
385
|
+
);
|
386
|
+
}, [context, message, isLast, isCopied, isHovering, branchState]);
|
387
|
+
return /* @__PURE__ */ React.createElement(MessageContext.Provider, { value: context }, children);
|
382
388
|
};
|
383
389
|
|
384
390
|
// src/primitives/message/MessageRoot.tsx
|
385
|
-
import {
|
391
|
+
import { composeEventHandlers as composeEventHandlers2 } from "@radix-ui/primitive";
|
386
392
|
import {
|
387
393
|
Primitive as Primitive3
|
388
394
|
} from "@radix-ui/react-primitive";
|
389
|
-
import {
|
395
|
+
import { forwardRef as forwardRef3 } from "react";
|
390
396
|
var MessageRoot = forwardRef3(
|
391
397
|
({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
|
392
|
-
const
|
393
|
-
|
394
|
-
(s) => s.setIsHovering
|
395
|
-
);
|
398
|
+
const { useMessage } = useMessageContext();
|
399
|
+
const setIsHovering = useMessage((s) => s.setIsHovering);
|
396
400
|
const handleMouseEnter = () => {
|
397
401
|
setIsHovering(true);
|
398
402
|
};
|
@@ -413,22 +417,22 @@ var MessageRoot = forwardRef3(
|
|
413
417
|
|
414
418
|
// src/primitives/message/MessageIf.tsx
|
415
419
|
var useMessageIf = (props) => {
|
416
|
-
const
|
417
|
-
return
|
418
|
-
|
419
|
-
|
420
|
-
|
420
|
+
const { useMessage } = useMessageContext();
|
421
|
+
return useMessage(
|
422
|
+
({
|
423
|
+
message,
|
424
|
+
isLast,
|
425
|
+
isCopied,
|
426
|
+
isHovering,
|
427
|
+
branchState: { branchCount }
|
428
|
+
}) => {
|
421
429
|
if (props.hasBranches === true && branchCount < 2)
|
422
430
|
return false;
|
423
431
|
if (props.user && message.role !== "user")
|
424
432
|
return false;
|
425
433
|
if (props.assistant && message.role !== "assistant")
|
426
434
|
return false;
|
427
|
-
if (props.
|
428
|
-
return false;
|
429
|
-
if (props.editing === false && isEditing)
|
430
|
-
return false;
|
431
|
-
if (props.unstable_hoveringOrLast === true && !isHovering && thread.messages[thread.messages.length - 1]?.id !== message.id)
|
435
|
+
if (props.lastOrHover === true && !isHovering && !isLast)
|
432
436
|
return false;
|
433
437
|
if (props.copied === true && !isCopied)
|
434
438
|
return false;
|
@@ -445,60 +449,32 @@ var MessageIf = ({ children, ...query }) => {
|
|
445
449
|
|
446
450
|
// src/primitives/message/MessageContent.tsx
|
447
451
|
var MessageContent = () => {
|
448
|
-
const
|
449
|
-
|
450
|
-
(s) => s.message.content
|
451
|
-
);
|
452
|
+
const { useMessage } = useMessageContext();
|
453
|
+
const content = useMessage((s) => s.message.content);
|
452
454
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, content);
|
453
455
|
};
|
454
456
|
|
455
|
-
// src/primitives/message/MessageEditableContent.tsx
|
456
|
-
import { forwardRef as forwardRef4 } from "react";
|
457
|
-
import { composeEventHandlers as composeEventHandlers3 } from "@radix-ui/primitive";
|
458
|
-
import TextareaAutosize from "react-textarea-autosize";
|
459
|
-
var MessageEditableContent = forwardRef4(({ onChange, value, ...rest }, forwardedRef) => {
|
460
|
-
const [editState, setEditState] = useMessageContext(
|
461
|
-
"Message.EditableContent",
|
462
|
-
(s) => [s.editState, s.setEditState]
|
463
|
-
);
|
464
|
-
const handleChange = (e) => {
|
465
|
-
setEditState({ isEditing: true, value: e.target.value });
|
466
|
-
};
|
467
|
-
if (!editState.isEditing)
|
468
|
-
throw new Error(
|
469
|
-
"Message.EditableContent may only be rendered when edit mode is enabled. Consider wrapping the component in <Message.If editing>."
|
470
|
-
);
|
471
|
-
return /* @__PURE__ */ React.createElement(
|
472
|
-
TextareaAutosize,
|
473
|
-
{
|
474
|
-
...rest,
|
475
|
-
ref: forwardedRef,
|
476
|
-
onChange: composeEventHandlers3(onChange, handleChange),
|
477
|
-
value: editState.value || value
|
478
|
-
}
|
479
|
-
);
|
480
|
-
});
|
481
|
-
|
482
457
|
// src/primitives/thread/ThreadMessages.tsx
|
483
458
|
var getComponents = (components) => {
|
484
459
|
return {
|
485
|
-
|
460
|
+
EditComposer: components.EditComposer ?? components.UserMessage ?? components.Message,
|
486
461
|
UserMessage: components.UserMessage ?? components.Message,
|
487
462
|
AssistantMessage: components.AssistantMessage ?? components.Message
|
488
463
|
};
|
489
464
|
};
|
490
465
|
var ThreadMessages = ({ components }) => {
|
491
|
-
const
|
492
|
-
const
|
493
|
-
const
|
466
|
+
const { useThread } = useAssistantContext();
|
467
|
+
const thread = useThread();
|
468
|
+
const messages = thread.messages;
|
469
|
+
const { UserMessage, EditComposer, AssistantMessage } = getComponents(components);
|
494
470
|
if (messages.length === 0)
|
495
471
|
return null;
|
496
472
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message, idx) => {
|
497
473
|
return (
|
498
474
|
// 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(
|
475
|
+
/* @__PURE__ */ React.createElement(MessageProvider, { key: idx, message }, /* @__PURE__ */ React.createElement(MessageIf, { user: true }, /* @__PURE__ */ React.createElement(ComposerIf, { editing: false }, /* @__PURE__ */ React.createElement(UserMessage, null)), /* @__PURE__ */ React.createElement(ComposerIf, { editing: true }, /* @__PURE__ */ React.createElement(EditComposer, null))), /* @__PURE__ */ React.createElement(MessageIf, { assistant: true }, /* @__PURE__ */ React.createElement(AssistantMessage, null)))
|
500
476
|
);
|
501
|
-
}),
|
477
|
+
}), hasUpcomingMessage(thread) && /* @__PURE__ */ React.createElement(
|
502
478
|
MessageProvider,
|
503
479
|
{
|
504
480
|
message: {
|
@@ -514,22 +490,29 @@ var ThreadMessages = ({ components }) => {
|
|
514
490
|
// src/primitives/composer/index.ts
|
515
491
|
var composer_exports = {};
|
516
492
|
__export(composer_exports, {
|
493
|
+
Cancel: () => ComposerCancel,
|
494
|
+
If: () => ComposerIf,
|
517
495
|
Input: () => ComposerInput,
|
518
496
|
Root: () => ComposerRoot,
|
519
|
-
Send: () => ComposerSend
|
520
|
-
Stop: () => ComposerStop
|
497
|
+
Send: () => ComposerSend
|
521
498
|
});
|
522
499
|
|
523
500
|
// src/primitives/composer/ComposerRoot.tsx
|
524
|
-
import {
|
501
|
+
import { composeEventHandlers as composeEventHandlers3 } from "@radix-ui/primitive";
|
502
|
+
import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
|
525
503
|
import {
|
526
504
|
Primitive as Primitive4
|
527
505
|
} from "@radix-ui/react-primitive";
|
528
|
-
import {
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
506
|
+
import {
|
507
|
+
createContext as createContext3,
|
508
|
+
forwardRef as forwardRef4,
|
509
|
+
useContext as useContext4,
|
510
|
+
useMemo as useMemo3,
|
511
|
+
useRef as useRef4
|
512
|
+
} from "react";
|
513
|
+
var ComposerFormContext = createContext3(null);
|
514
|
+
var useComposerFormContext = () => {
|
515
|
+
const context = useContext4(ComposerFormContext);
|
533
516
|
if (!context) {
|
534
517
|
throw new Error(
|
535
518
|
"Composer compound components cannot be rendered outside the Composer component"
|
@@ -537,15 +520,12 @@ var useComposerContext = () => {
|
|
537
520
|
}
|
538
521
|
return context;
|
539
522
|
};
|
540
|
-
var ComposerRoot =
|
523
|
+
var ComposerRoot = forwardRef4(
|
541
524
|
({ onSubmit, ...rest }, forwardedRef) => {
|
542
|
-
const
|
543
|
-
"Composer.Root",
|
544
|
-
(s) => s.chat.handleSubmit
|
545
|
-
);
|
525
|
+
const { useComposer } = useComposerContext();
|
546
526
|
const formRef = useRef4(null);
|
547
527
|
const ref = useComposedRefs2(forwardedRef, formRef);
|
548
|
-
const composerContextValue =
|
528
|
+
const composerContextValue = useMemo3(
|
549
529
|
() => ({
|
550
530
|
submit: () => formRef.current?.dispatchEvent(
|
551
531
|
new Event("submit", { cancelable: true, bubbles: true })
|
@@ -553,108 +533,115 @@ var ComposerRoot = forwardRef5(
|
|
553
533
|
}),
|
554
534
|
[]
|
555
535
|
);
|
556
|
-
|
536
|
+
const handleSubmit = (e) => {
|
537
|
+
const composerState = useComposer.getState();
|
538
|
+
if (!composerState.isEditing)
|
539
|
+
return;
|
540
|
+
e.preventDefault();
|
541
|
+
composerState.send();
|
542
|
+
};
|
543
|
+
return /* @__PURE__ */ React.createElement(ComposerFormContext.Provider, { value: composerContextValue }, /* @__PURE__ */ React.createElement(
|
557
544
|
Primitive4.form,
|
558
545
|
{
|
559
546
|
...rest,
|
560
547
|
ref,
|
561
|
-
onSubmit:
|
548
|
+
onSubmit: composeEventHandlers3(onSubmit, handleSubmit)
|
562
549
|
}
|
563
550
|
));
|
564
551
|
}
|
565
552
|
);
|
566
553
|
|
567
554
|
// src/primitives/composer/ComposerInput.tsx
|
568
|
-
import {
|
555
|
+
import { composeEventHandlers as composeEventHandlers4 } from "@radix-ui/primitive";
|
569
556
|
import { Slot } from "@radix-ui/react-slot";
|
570
|
-
import {
|
571
|
-
import
|
572
|
-
var ComposerInput =
|
573
|
-
const
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
);
|
581
|
-
const Component = asChild ? Slot :
|
582
|
-
const
|
557
|
+
import { forwardRef as forwardRef5 } from "react";
|
558
|
+
import TextareaAutosize from "react-textarea-autosize";
|
559
|
+
var ComposerInput = forwardRef5(({ asChild, disabled, onChange, onKeyDown, ...rest }, forwardedRef) => {
|
560
|
+
const { useThread } = useAssistantContext();
|
561
|
+
const isLoading = useThread((t) => t.isLoading);
|
562
|
+
const { useComposer } = useComposerContext();
|
563
|
+
const value = useComposer((c) => {
|
564
|
+
if (!c.isEditing)
|
565
|
+
return "";
|
566
|
+
return c.value;
|
567
|
+
});
|
568
|
+
const Component = asChild ? Slot : TextareaAutosize;
|
569
|
+
const composerForm = useComposerFormContext();
|
583
570
|
const handleKeyPress = (e) => {
|
584
|
-
if (
|
571
|
+
if (disabled)
|
572
|
+
return;
|
573
|
+
if (e.key === "Escape") {
|
574
|
+
useComposer.getState().cancel();
|
575
|
+
}
|
576
|
+
if (isLoading)
|
585
577
|
return;
|
586
578
|
if (e.key === "Enter" && e.shiftKey === false) {
|
587
579
|
e.preventDefault();
|
588
|
-
|
580
|
+
composerForm.submit();
|
589
581
|
}
|
590
582
|
};
|
591
583
|
return /* @__PURE__ */ React.createElement(
|
592
584
|
Component,
|
593
585
|
{
|
594
|
-
value
|
586
|
+
value,
|
595
587
|
...rest,
|
596
588
|
ref: forwardedRef,
|
597
|
-
|
598
|
-
|
589
|
+
disabled,
|
590
|
+
onChange: composeEventHandlers4(onChange, (e) => {
|
591
|
+
const composerState = useComposer.getState();
|
592
|
+
if (!composerState.isEditing)
|
593
|
+
return;
|
594
|
+
return composerState.setValue(e.target.value);
|
595
|
+
}),
|
596
|
+
onKeyDown: composeEventHandlers4(onKeyDown, handleKeyPress)
|
599
597
|
}
|
600
598
|
);
|
601
599
|
});
|
602
600
|
|
603
601
|
// src/primitives/composer/ComposerSend.tsx
|
604
|
-
import { forwardRef as forwardRef7 } from "react";
|
605
602
|
import {
|
606
603
|
Primitive as Primitive5
|
607
604
|
} from "@radix-ui/react-primitive";
|
608
|
-
|
605
|
+
import { forwardRef as forwardRef6 } from "react";
|
606
|
+
var ComposerSend = forwardRef6(
|
609
607
|
({ disabled, ...rest }, ref) => {
|
610
|
-
const
|
608
|
+
const { useComposer } = useComposerContext();
|
609
|
+
const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);
|
611
610
|
return /* @__PURE__ */ React.createElement(
|
612
611
|
Primitive5.button,
|
613
612
|
{
|
614
613
|
type: "submit",
|
615
614
|
...rest,
|
616
615
|
ref,
|
617
|
-
disabled: disabled ||
|
616
|
+
disabled: disabled || !hasValue
|
618
617
|
}
|
619
618
|
);
|
620
619
|
}
|
621
620
|
);
|
622
621
|
|
623
|
-
// src/
|
624
|
-
import {
|
622
|
+
// src/primitives/composer/ComposerCancel.tsx
|
623
|
+
import { composeEventHandlers as composeEventHandlers5 } from "@radix-ui/primitive";
|
625
624
|
import {
|
626
625
|
Primitive as Primitive6
|
627
626
|
} from "@radix-ui/react-primitive";
|
628
|
-
import {
|
629
|
-
var
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
627
|
+
import { forwardRef as forwardRef7 } from "react";
|
628
|
+
var ComposerCancel = forwardRef7(({ disabled, onClick, ...rest }, ref) => {
|
629
|
+
const { useComposer } = useComposerContext();
|
630
|
+
const hasValue = useComposer((c) => c.canCancel);
|
631
|
+
const handleClose = () => {
|
632
|
+
useComposer.getState().cancel();
|
633
|
+
};
|
634
|
+
return /* @__PURE__ */ React.createElement(
|
635
|
+
Primitive6.button,
|
636
|
+
{
|
637
|
+
type: "button",
|
638
|
+
...rest,
|
639
|
+
ref,
|
640
|
+
onClick: composeEventHandlers5(onClick, handleClose),
|
641
|
+
disabled: disabled || !hasValue
|
643
642
|
}
|
644
643
|
);
|
645
|
-
};
|
646
|
-
|
647
|
-
// src/primitives/composer/ComposerStop.tsx
|
648
|
-
var useComposerStop = () => {
|
649
|
-
const [isLoading, stop] = useThreadContext("Composer.Stop", (s) => [
|
650
|
-
s.chat.isLoading,
|
651
|
-
s.chat.stop
|
652
|
-
]);
|
653
|
-
if (!isLoading)
|
654
|
-
return null;
|
655
|
-
return stop;
|
656
|
-
};
|
657
|
-
var ComposerStop = createActionButton(useComposerStop);
|
644
|
+
});
|
658
645
|
|
659
646
|
// src/primitives/branchPicker/index.ts
|
660
647
|
var branchPicker_exports = {};
|
@@ -668,52 +655,66 @@ __export(branchPicker_exports, {
|
|
668
655
|
|
669
656
|
// src/actions/useGoToNextBranch.tsx
|
670
657
|
var useGoToNextBranch = () => {
|
671
|
-
const
|
672
|
-
|
673
|
-
|
658
|
+
const { useThread, useBranchObserver } = useAssistantContext();
|
659
|
+
const { useComposer, useMessage } = useMessageContext();
|
660
|
+
const isLoading = useThread((s) => s.isLoading);
|
661
|
+
const isEditing = useComposer((s) => s.isEditing);
|
662
|
+
const hasNext = useMessage(
|
663
|
+
({ branchState: { branchId, branchCount } }) => branchId + 1 < branchCount
|
674
664
|
);
|
675
|
-
|
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)
|
665
|
+
if (isLoading || isEditing || !hasNext)
|
686
666
|
return null;
|
687
|
-
const { message, branchId } = context;
|
688
667
|
return () => {
|
689
|
-
|
668
|
+
const {
|
669
|
+
message,
|
670
|
+
branchState: { branchId }
|
671
|
+
} = useMessage.getState();
|
672
|
+
useBranchObserver.getState().switchToBranch(message, branchId + 1);
|
690
673
|
};
|
691
674
|
};
|
692
675
|
|
676
|
+
// src/utils/createActionButton.tsx
|
677
|
+
import { forwardRef as forwardRef8 } from "react";
|
678
|
+
import {
|
679
|
+
Primitive as Primitive7
|
680
|
+
} from "@radix-ui/react-primitive";
|
681
|
+
import { composeEventHandlers as composeEventHandlers6 } from "@radix-ui/primitive";
|
682
|
+
var createActionButton = (useActionButton) => {
|
683
|
+
return forwardRef8(
|
684
|
+
(props, forwardedRef) => {
|
685
|
+
const onClick = useActionButton(props);
|
686
|
+
return /* @__PURE__ */ React.createElement(
|
687
|
+
Primitive7.button,
|
688
|
+
{
|
689
|
+
type: "button",
|
690
|
+
disabled: !onClick,
|
691
|
+
...props,
|
692
|
+
ref: forwardedRef,
|
693
|
+
onClick: composeEventHandlers6(props.onClick, onClick ?? void 0)
|
694
|
+
}
|
695
|
+
);
|
696
|
+
}
|
697
|
+
);
|
698
|
+
};
|
699
|
+
|
693
700
|
// src/primitives/branchPicker/BranchPickerNext.tsx
|
694
701
|
var BranchPickerNext = createActionButton(useGoToNextBranch);
|
695
702
|
|
696
703
|
// src/actions/useGoToPreviousBranch.tsx
|
697
704
|
var useGoToPreviousBranch = () => {
|
698
|
-
const
|
699
|
-
|
700
|
-
|
701
|
-
);
|
702
|
-
const
|
703
|
-
|
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)
|
705
|
+
const { useThread, useBranchObserver } = useAssistantContext();
|
706
|
+
const { useComposer, useMessage } = useMessageContext();
|
707
|
+
const isLoading = useThread((s) => s.isLoading);
|
708
|
+
const isEditing = useComposer((s) => s.isEditing);
|
709
|
+
const hasNext = useMessage(({ branchState: { branchId } }) => branchId > 0);
|
710
|
+
if (isLoading || isEditing || !hasNext)
|
713
711
|
return null;
|
714
|
-
const { message, branchId } = context;
|
715
712
|
return () => {
|
716
|
-
|
713
|
+
const {
|
714
|
+
message,
|
715
|
+
branchState: { branchId }
|
716
|
+
} = useMessage.getState();
|
717
|
+
useBranchObserver.getState().switchToBranch(message, branchId - 1);
|
717
718
|
};
|
718
719
|
};
|
719
720
|
|
@@ -722,29 +723,25 @@ var BranchPickerPrevious = createActionButton(useGoToPreviousBranch);
|
|
722
723
|
|
723
724
|
// src/primitives/branchPicker/BranchPickerCount.tsx
|
724
725
|
var BranchPickerCount = () => {
|
725
|
-
const
|
726
|
-
|
727
|
-
(s) => s.branchState.branchCount
|
728
|
-
);
|
726
|
+
const { useMessage } = useMessageContext();
|
727
|
+
const branchCount = useMessage((s) => s.branchState.branchCount);
|
729
728
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, branchCount);
|
730
729
|
};
|
731
730
|
|
732
731
|
// src/primitives/branchPicker/BranchPickerNumber.tsx
|
733
732
|
var BranchPickerNumber = () => {
|
734
|
-
const
|
735
|
-
|
736
|
-
(s) => s.branchState.branchId
|
737
|
-
);
|
733
|
+
const { useMessage } = useMessageContext();
|
734
|
+
const branchId = useMessage((s) => s.branchState.branchId);
|
738
735
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, branchId + 1);
|
739
736
|
};
|
740
737
|
|
741
738
|
// src/primitives/branchPicker/BranchPickerRoot.tsx
|
742
739
|
import {
|
743
|
-
Primitive as
|
740
|
+
Primitive as Primitive8
|
744
741
|
} from "@radix-ui/react-primitive";
|
745
742
|
import { forwardRef as forwardRef9 } from "react";
|
746
743
|
var BranchPickerRoot = forwardRef9(({ hideWhenSingleBranch, ...rest }, ref) => {
|
747
|
-
return /* @__PURE__ */ React.createElement(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0 }, /* @__PURE__ */ React.createElement(
|
744
|
+
return /* @__PURE__ */ React.createElement(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0 }, /* @__PURE__ */ React.createElement(Primitive8.div, { ...rest, ref }));
|
748
745
|
});
|
749
746
|
|
750
747
|
// src/primitives/actionBar/index.ts
|
@@ -758,29 +755,48 @@ __export(actionBar_exports, {
|
|
758
755
|
|
759
756
|
// src/primitives/actionBar/ActionBarRoot.tsx
|
760
757
|
import {
|
761
|
-
Primitive as
|
758
|
+
Primitive as Primitive9
|
762
759
|
} from "@radix-ui/react-primitive";
|
763
760
|
import { forwardRef as forwardRef10 } from "react";
|
764
|
-
var ActionBarRoot = forwardRef10(({ ...rest }, ref) => {
|
765
|
-
|
761
|
+
var ActionBarRoot = forwardRef10(({ hideWhenBusy, autohide, autohideFloat, ...rest }, ref) => {
|
762
|
+
const { useThread } = useAssistantContext();
|
763
|
+
const { useMessage } = useMessageContext();
|
764
|
+
const hideAndfloatStatus = useMessage((m) => {
|
765
|
+
const autohideEnabled = autohide === "always" || autohide === "not-last" && !m.isLast;
|
766
|
+
if (!autohideEnabled)
|
767
|
+
return "normal" /* Normal */;
|
768
|
+
if (!m.isHovering)
|
769
|
+
return "hidden" /* Hidden */;
|
770
|
+
if (autohideFloat === "always" || autohideFloat === "single-branch" && m.branchState.branchCount <= 1)
|
771
|
+
return "floating" /* Floating */;
|
772
|
+
return "normal" /* Normal */;
|
773
|
+
});
|
774
|
+
const busy = useThread((t) => t.isLoading);
|
775
|
+
if (hideWhenBusy && busy)
|
776
|
+
return null;
|
777
|
+
if (hideAndfloatStatus === "hidden" /* Hidden */)
|
778
|
+
return null;
|
779
|
+
return /* @__PURE__ */ React.createElement(
|
780
|
+
Primitive9.div,
|
781
|
+
{
|
782
|
+
"data-floating": hideAndfloatStatus === "floating" /* Floating */,
|
783
|
+
...rest,
|
784
|
+
ref
|
785
|
+
}
|
786
|
+
);
|
766
787
|
});
|
767
788
|
|
768
789
|
// src/actions/useCopyMessage.tsx
|
769
790
|
var useCopyMessage = ({ copiedDuration = 3e3 }) => {
|
770
|
-
const
|
771
|
-
|
772
|
-
|
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)
|
791
|
+
const { useMessage, useComposer } = useMessageContext();
|
792
|
+
const isEditing = useComposer((s) => s.isEditing);
|
793
|
+
if (isEditing)
|
781
794
|
return null;
|
782
|
-
const { content, setIsCopied } = context;
|
783
795
|
return () => {
|
796
|
+
const {
|
797
|
+
message: { content },
|
798
|
+
setIsCopied
|
799
|
+
} = useMessage.getState();
|
784
800
|
navigator.clipboard.writeText(content);
|
785
801
|
setIsCopied(true);
|
786
802
|
setTimeout(() => setIsCopied(false), copiedDuration);
|
@@ -792,19 +808,15 @@ var ActionBarCopy = createActionButton(useCopyMessage);
|
|
792
808
|
|
793
809
|
// src/actions/useReloadMessage.tsx
|
794
810
|
var useReloadMessage = () => {
|
795
|
-
const
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
const message2 = s.message;
|
801
|
-
if (message2.role !== "assistant" || isLoading)
|
802
|
-
return null;
|
803
|
-
return message2;
|
804
|
-
});
|
805
|
-
if (!message)
|
811
|
+
const { useThread, useBranchObserver } = useAssistantContext();
|
812
|
+
const { useMessage } = useMessageContext();
|
813
|
+
const isLoading = useThread((s) => s.isLoading);
|
814
|
+
const isAssistant = useMessage((s) => s.message.role === "assistant");
|
815
|
+
if (isLoading || !isAssistant)
|
806
816
|
return null;
|
807
|
-
return () =>
|
817
|
+
return () => {
|
818
|
+
useBranchObserver.getState().reloadAt(useMessage.getState().message);
|
819
|
+
};
|
808
820
|
};
|
809
821
|
|
810
822
|
// src/primitives/actionBar/ActionBarReload.tsx
|
@@ -812,116 +824,136 @@ var ActionBarReload = createActionButton(useReloadMessage);
|
|
812
824
|
|
813
825
|
// src/actions/useBeginMessageEdit.tsx
|
814
826
|
var useBeginMessageEdit = () => {
|
815
|
-
const
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
setEditState: setEditState2
|
820
|
-
} = s;
|
821
|
-
if (isEditing)
|
822
|
-
return null;
|
823
|
-
return { content: content2, setEditState: setEditState2 };
|
824
|
-
});
|
825
|
-
if (!context)
|
827
|
+
const { useMessage, useComposer } = useMessageContext();
|
828
|
+
const isUser = useMessage((s) => s.message.role === "user");
|
829
|
+
const isEditing = useComposer((s) => s.isEditing);
|
830
|
+
if (!isUser || isEditing)
|
826
831
|
return null;
|
827
|
-
const { content, setEditState } = context;
|
828
832
|
return () => {
|
829
|
-
|
833
|
+
const { edit } = useComposer.getState();
|
834
|
+
edit();
|
830
835
|
};
|
831
836
|
};
|
832
837
|
|
833
838
|
// src/primitives/actionBar/ActionBarEdit.tsx
|
834
839
|
var ActionBarEdit = createActionButton(useBeginMessageEdit);
|
835
840
|
|
836
|
-
// src/
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
}
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
)
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
});
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
} = s;
|
888
|
-
if (!isEditing)
|
889
|
-
return null;
|
890
|
-
return { setEditState: setEditState2 };
|
841
|
+
// src/vercel/VercelAIAssistantProvider.tsx
|
842
|
+
import { useMemo as useMemo4, useState as useState3 } from "react";
|
843
|
+
import { create as create2 } from "zustand";
|
844
|
+
var useAIAssistantContext = () => {
|
845
|
+
const [context] = useState3(() => {
|
846
|
+
const useThread = create2()(() => ({
|
847
|
+
messages: [],
|
848
|
+
setMessages: () => {
|
849
|
+
},
|
850
|
+
isLoading: false,
|
851
|
+
reload: async () => {
|
852
|
+
},
|
853
|
+
append: async () => {
|
854
|
+
},
|
855
|
+
stop: () => {
|
856
|
+
}
|
857
|
+
}));
|
858
|
+
const useComposer = create2()(() => ({
|
859
|
+
isEditing: true,
|
860
|
+
canCancel: false,
|
861
|
+
value: "",
|
862
|
+
setValue: () => {
|
863
|
+
},
|
864
|
+
edit: () => {
|
865
|
+
throw new Error("Not implemented");
|
866
|
+
},
|
867
|
+
send: () => {
|
868
|
+
useThread.getState().append({
|
869
|
+
content: useComposer.getState().value,
|
870
|
+
role: "user",
|
871
|
+
createdAt: /* @__PURE__ */ new Date()
|
872
|
+
});
|
873
|
+
useComposer.getState().setValue("");
|
874
|
+
},
|
875
|
+
cancel: () => {
|
876
|
+
useThread.getState().stop();
|
877
|
+
}
|
878
|
+
}));
|
879
|
+
const useBranchObserver = create2()(() => ({
|
880
|
+
getBranchState: () => ({
|
881
|
+
branchId: 0,
|
882
|
+
branchCount: 0
|
883
|
+
}),
|
884
|
+
switchToBranch: () => {
|
885
|
+
},
|
886
|
+
editAt: async () => {
|
887
|
+
},
|
888
|
+
reloadAt: async () => {
|
889
|
+
}
|
890
|
+
}));
|
891
|
+
return { useThread, useComposer, useBranchObserver };
|
891
892
|
});
|
892
|
-
|
893
|
-
return null;
|
894
|
-
const { setEditState } = context;
|
895
|
-
return () => {
|
896
|
-
setEditState({ isEditing: false });
|
897
|
-
};
|
893
|
+
return context;
|
898
894
|
};
|
899
|
-
|
900
|
-
// src/primitives/editBar/EditBarCancel.tsx
|
901
|
-
var EditBarCancel = createActionButton(useCancelMessageEdit);
|
902
|
-
|
903
|
-
// src/vercel/VercelAIThreadProvider.tsx
|
904
|
-
var VercelAIThreadProvider = ({
|
895
|
+
var VercelAIAssistantProvider = ({
|
905
896
|
chat,
|
906
897
|
children
|
907
898
|
}) => {
|
899
|
+
const context = useAIAssistantContext();
|
900
|
+
useMemo4(() => {
|
901
|
+
context.useThread.setState(
|
902
|
+
{
|
903
|
+
messages: chat.messages,
|
904
|
+
setMessages: (value) => {
|
905
|
+
chat.setMessages(value);
|
906
|
+
},
|
907
|
+
isLoading: chat.isLoading,
|
908
|
+
reload: async () => {
|
909
|
+
await chat.reload();
|
910
|
+
},
|
911
|
+
append: async (message) => {
|
912
|
+
await chat.append(message);
|
913
|
+
},
|
914
|
+
stop: () => {
|
915
|
+
const lastMessage = chat.messages.at(-1);
|
916
|
+
chat.stop();
|
917
|
+
if (lastMessage?.role === "user") {
|
918
|
+
chat.setInput(lastMessage.content);
|
919
|
+
}
|
920
|
+
}
|
921
|
+
},
|
922
|
+
true
|
923
|
+
);
|
924
|
+
}, [context, chat]);
|
925
|
+
useMemo4(() => {
|
926
|
+
context.useComposer.setState({
|
927
|
+
canCancel: chat.isLoading,
|
928
|
+
value: chat.input,
|
929
|
+
setValue: chat.setInput
|
930
|
+
});
|
931
|
+
}, [context, chat.isLoading, chat.input, chat.setInput]);
|
908
932
|
const branches = useChatWithBranches(chat);
|
909
|
-
|
933
|
+
useMemo4(() => {
|
934
|
+
context.useBranchObserver.setState(
|
935
|
+
{
|
936
|
+
getBranchState: (message) => branches.getBranchState(message),
|
937
|
+
switchToBranch: (message, branchId) => branches.switchToBranch(message, branchId),
|
938
|
+
editAt: async (message, newMessage) => branches.editAt(message, newMessage),
|
939
|
+
reloadAt: async (message) => branches.reloadAt(message)
|
940
|
+
},
|
941
|
+
true
|
942
|
+
);
|
943
|
+
}, [context, branches]);
|
944
|
+
return /* @__PURE__ */ React.createElement(AssistantContext.Provider, { value: context }, children);
|
910
945
|
};
|
911
946
|
export {
|
912
947
|
actionBar_exports as ActionBarPrimitive,
|
913
948
|
branchPicker_exports as BranchPickerPrimitive,
|
914
949
|
composer_exports as ComposerPrimitive,
|
915
|
-
editBar_exports as EditBarPrimitive,
|
916
950
|
message_exports as MessagePrimitive,
|
917
951
|
thread_exports as ThreadPrimitive,
|
918
|
-
VercelAIThreadProvider,
|
952
|
+
VercelAIAssistantProvider as VercelAIThreadProvider,
|
919
953
|
useMessageContext as unstable_useMessageContext,
|
920
954
|
useBeginMessageEdit,
|
921
|
-
useCancelMessageEdit,
|
922
955
|
useCopyMessage,
|
923
956
|
useGoToNextBranch,
|
924
957
|
useGoToPreviousBranch,
|
925
|
-
useReloadMessage
|
926
|
-
useSaveMessageEdit
|
958
|
+
useReloadMessage
|
927
959
|
};
|