@assistant-ui/react 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,18 +17,34 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
21
31
  var src_exports = {};
22
32
  __export(src_exports, {
23
- ActionBar: () => actionBar_exports,
24
- BranchPicker: () => branchPicker_exports,
25
- Composer: () => composer_exports,
26
- EditBar: () => editBar_exports,
27
- Message: () => message_exports,
28
- Thread: () => thread_exports,
29
- unstable_useMessageContext: () => useMessageContext
33
+ ActionBarPrimitive: () => actionBar_exports,
34
+ BranchPickerPrimitive: () => branchPicker_exports,
35
+ ComposerPrimitive: () => composer_exports,
36
+ EditBarPrimitive: () => editBar_exports,
37
+ MessagePrimitive: () => message_exports,
38
+ ThreadPrimitive: () => thread_exports,
39
+ VercelAIThreadProvider: () => VercelAIThreadProvider,
40
+ unstable_useMessageContext: () => useMessageContext,
41
+ useBeginMessageEdit: () => useBeginMessageEdit,
42
+ useCancelMessageEdit: () => useCancelMessageEdit,
43
+ useCopyMessage: () => useCopyMessage,
44
+ useGoToNextBranch: () => useGoToNextBranch,
45
+ useGoToPreviousBranch: () => useGoToPreviousBranch,
46
+ useReloadMessage: () => useReloadMessage,
47
+ useSaveMessageEdit: () => useSaveMessageEdit
30
48
  });
31
49
  module.exports = __toCommonJS(src_exports);
32
50
 
@@ -36,131 +54,18 @@ __export(thread_exports, {
36
54
  Empty: () => ThreadEmpty,
37
55
  If: () => ThreadIf,
38
56
  Messages: () => ThreadMessages,
39
- Provider: () => ThreadProvider,
40
57
  Root: () => ThreadRoot,
41
58
  Viewport: () => ThreadViewport
42
59
  });
43
60
 
44
- // src/utils/hooks/useBranches.tsx
61
+ // src/primitives/thread/ThreadRoot.tsx
45
62
  var import_react = require("react");
46
- var ROOT_ID = "__ROOT_ID__";
47
- var UPCOMING_MESSAGE_ID = "__UPCOMING_MESSAGE_ID__";
48
- var updateBranchData = (data, messages) => {
49
- for (let i = 0; i < messages.length; i++) {
50
- const child = messages[i];
51
- const childId = child.id;
52
- const parentId = messages[i - 1]?.id ?? ROOT_ID;
53
- data.parentMap.set(childId, parentId);
54
- let parentArray = data.branchMap.get(parentId);
55
- if (!parentArray) {
56
- data.branchMap.set(parentId, [childId]);
57
- } else if (!parentArray.includes(childId)) {
58
- parentArray.push(childId);
59
- }
60
- data.snapshots.set(childId, messages);
61
- }
62
- };
63
- var getParentId = (data, messages, message) => {
64
- if (message.id === UPCOMING_MESSAGE_ID) {
65
- const parent = messages.at(-1);
66
- if (!parent)
67
- return ROOT_ID;
68
- return parent.id;
63
+ var import_react_primitive = require("@radix-ui/react-primitive");
64
+ var ThreadRoot = (0, import_react.forwardRef)(
65
+ (props, ref) => {
66
+ return /* @__PURE__ */ React.createElement(import_react_primitive.Primitive.div, { ...props, ref });
69
67
  }
70
- const parentId = data.parentMap.get(message.id);
71
- if (!parentId)
72
- throw new Error("Unexpected: Message parent not found");
73
- return parentId;
74
- };
75
- var getBranchStateImpl = (data, messages, message) => {
76
- const parentId = getParentId(data, messages, message);
77
- const branches = data.branchMap.get(parentId) ?? [];
78
- const branchId = message.id === UPCOMING_MESSAGE_ID ? branches.length : branches.indexOf(message.id);
79
- if (branchId === -1)
80
- throw new Error("Unexpected: Message not found in parent children");
81
- const upcomingOffset = message.id === UPCOMING_MESSAGE_ID ? 1 : 0;
82
- return {
83
- branchId,
84
- branchCount: branches.length + upcomingOffset
85
- };
86
- };
87
- var switchToBranchImpl = (data, messages, message, branchId) => {
88
- const parentId = getParentId(data, messages, message);
89
- const branches = data.branchMap.get(parentId);
90
- if (!branches)
91
- throw new Error("Unexpected: Parent children not found");
92
- const newMessageId = branches[branchId];
93
- if (!newMessageId)
94
- throw new Error("Unexpected: Requested branch not found");
95
- if (branchId < 0 || branchId >= branches.length)
96
- throw new Error("Switch to branch called with a branch index out of range");
97
- if (newMessageId === message.id)
98
- return messages;
99
- const snapshot = data.snapshots.get(newMessageId);
100
- if (!snapshot)
101
- throw new Error("Unexpected: Branch snapshot not found");
102
- return snapshot;
103
- };
104
- var sliceMessagesUntil = (messages, message) => {
105
- if (message.id === UPCOMING_MESSAGE_ID)
106
- return messages;
107
- const messageIdx = messages.findIndex((m) => m.id === message.id);
108
- if (messageIdx === -1)
109
- throw new Error("Unexpected: Message not found");
110
- return messages.slice(0, messageIdx);
111
- };
112
- var useChatWithBranches = (chat) => {
113
- const data = (0, import_react.useRef)({
114
- parentMap: /* @__PURE__ */ new Map(),
115
- branchMap: /* @__PURE__ */ new Map(),
116
- snapshots: /* @__PURE__ */ new Map()
117
- }).current;
118
- updateBranchData(data, chat.messages);
119
- const getBranchState = (0, import_react.useCallback)(
120
- (message) => {
121
- return getBranchStateImpl(data, chat.messages, message);
122
- },
123
- [chat.messages]
124
- );
125
- const switchToBranch = (0, import_react.useCallback)(
126
- (message, branchId) => {
127
- const newMessages = switchToBranchImpl(
128
- data,
129
- chat.messages,
130
- message,
131
- branchId
132
- );
133
- chat.setMessages(newMessages);
134
- },
135
- [chat.messages, chat.setMessages]
136
- );
137
- const reloadAt = (0, import_react.useCallback)(
138
- async (message) => {
139
- const newMessages = sliceMessagesUntil(chat.messages, message);
140
- chat.setMessages(newMessages);
141
- await chat.reload();
142
- },
143
- [chat.messages, chat.setMessages, chat.reload]
144
- );
145
- const editAt = (0, import_react.useCallback)(
146
- async (message, newMessage) => {
147
- const newMessages = sliceMessagesUntil(chat.messages, message);
148
- chat.setMessages(newMessages);
149
- await chat.append(newMessage);
150
- },
151
- [chat.messages, chat.setMessages, chat.append]
152
- );
153
- return (0, import_react.useMemo)(
154
- () => ({
155
- ...chat,
156
- getBranchState,
157
- switchToBranch,
158
- editAt,
159
- reloadAt
160
- }),
161
- [chat, getBranchState, switchToBranch, editAt, reloadAt]
162
- );
163
- };
68
+ );
164
69
 
165
70
  // src/utils/context/createStoreContext.tsx
166
71
  var import_react2 = require("react");
@@ -200,7 +105,9 @@ var createStoreContext = (providerName) => {
200
105
  return () => listeners.delete(cb);
201
106
  },
202
107
  emit: () => {
203
- listeners.forEach((l) => l());
108
+ for (const listener of listeners) {
109
+ listener();
110
+ }
204
111
  },
205
112
  snapshot: () => {
206
113
  return state;
@@ -237,21 +144,6 @@ var createStoreContext = (providerName) => {
237
144
  // src/utils/context/ThreadContext.ts
238
145
  var [ThreadContextProvider, useThreadContext] = createStoreContext("Thread.Provider");
239
146
 
240
- // src/primitives/thread/ThreadProvider.tsx
241
- var ThreadProvider = ({ chat, children }) => {
242
- const branches = useChatWithBranches(chat);
243
- return /* @__PURE__ */ React.createElement(ThreadContextProvider, { chat: branches }, children);
244
- };
245
-
246
- // src/primitives/thread/ThreadRoot.tsx
247
- var import_react3 = require("react");
248
- var import_react_primitive = require("@radix-ui/react-primitive");
249
- var ThreadRoot = (0, import_react3.forwardRef)(
250
- (props, ref) => {
251
- return /* @__PURE__ */ React.createElement(import_react_primitive.Primitive.div, { ...props, ref });
252
- }
253
- );
254
-
255
147
  // src/primitives/thread/ThreadIf.tsx
256
148
  var useThreadIf = (props) => {
257
149
  return useThreadContext("Thread.If", (s) => {
@@ -278,51 +170,57 @@ var ThreadEmpty = ({ children }) => {
278
170
  };
279
171
 
280
172
  // src/primitives/thread/ThreadViewport.tsx
281
- var import_react5 = require("react");
173
+ var import_react4 = require("react");
282
174
  var import_react_primitive2 = require("@radix-ui/react-primitive");
283
175
  var import_react_compose_refs = require("@radix-ui/react-compose-refs");
284
176
  var import_primitive = require("@radix-ui/primitive");
285
177
 
286
178
  // src/utils/hooks/useOnResizeContent.tsx
287
- var import_react4 = require("react");
179
+ var import_react3 = require("react");
288
180
  var useOnResizeContent = (ref, callback) => {
289
- const callbackRef = (0, import_react4.useRef)(callback);
181
+ const callbackRef = (0, import_react3.useRef)(callback);
290
182
  callbackRef.current = callback;
291
- (0, import_react4.useLayoutEffect)(() => {
183
+ (0, import_react3.useLayoutEffect)(() => {
292
184
  const el = ref.current;
293
185
  if (!el)
294
186
  return;
295
187
  const resizeObserver = new ResizeObserver(() => {
296
188
  callbackRef.current();
189
+ console.log("resize observed");
297
190
  });
298
191
  const mutationObserver = new MutationObserver((mutations) => {
299
- mutations.forEach((mutation) => {
300
- mutation.addedNodes.forEach((node) => {
301
- if (node instanceof HTMLElement) {
192
+ for (const mutation of mutations) {
193
+ for (const node of mutation.addedNodes) {
194
+ if (node instanceof Element) {
302
195
  resizeObserver.observe(node);
303
196
  }
304
- });
305
- mutation.removedNodes.forEach((node) => {
306
- if (node instanceof HTMLElement) {
197
+ }
198
+ for (const node of mutation.removedNodes) {
199
+ if (node instanceof Element) {
307
200
  resizeObserver.unobserve(node);
308
201
  }
309
- });
310
- });
202
+ }
203
+ }
311
204
  callbackRef.current();
312
205
  });
313
206
  mutationObserver.observe(el, { childList: true });
207
+ for (const child of el.children) {
208
+ resizeObserver.observe(child);
209
+ console.log("observing child", child);
210
+ }
314
211
  return () => {
212
+ console.log("disconnecting");
315
213
  resizeObserver.disconnect();
316
214
  mutationObserver.disconnect();
317
215
  };
318
- }, []);
216
+ }, [ref.current]);
319
217
  };
320
218
 
321
219
  // src/primitives/thread/ThreadViewport.tsx
322
- var ThreadViewport = (0, import_react5.forwardRef)(({ onScroll, children, ...rest }, forwardedRef) => {
323
- const divRef = (0, import_react5.useRef)(null);
220
+ var ThreadViewport = (0, import_react4.forwardRef)(({ onScroll, children, ...rest }, forwardedRef) => {
221
+ const divRef = (0, import_react4.useRef)(null);
324
222
  const ref = (0, import_react_compose_refs.useComposedRefs)(forwardedRef, divRef);
325
- const [isAtBottom, setIsAtBottom] = (0, import_react5.useState)(true);
223
+ const [isAtBottom, setIsAtBottom] = (0, import_react4.useState)(true);
326
224
  useOnResizeContent(divRef, () => {
327
225
  const div = divRef.current;
328
226
  if (!div || !isAtBottom)
@@ -333,8 +231,9 @@ var ThreadViewport = (0, import_react5.forwardRef)(({ onScroll, children, ...res
333
231
  const div = divRef.current;
334
232
  if (!div)
335
233
  return;
336
- setIsAtBottom(div.scrollHeight - div.scrollTop <= div.clientHeight);
234
+ setIsAtBottom(div.scrollHeight - div.scrollTop <= div.clientHeight + 50);
337
235
  };
236
+ console.log(isAtBottom);
338
237
  return /* @__PURE__ */ React.createElement(
339
238
  import_react_primitive2.Primitive.div,
340
239
  {
@@ -346,6 +245,127 @@ var ThreadViewport = (0, import_react5.forwardRef)(({ onScroll, children, ...res
346
245
  );
347
246
  });
348
247
 
248
+ // src/utils/hooks/useBranches.tsx
249
+ var import_react5 = require("react");
250
+ var ROOT_ID = "__ROOT_ID__";
251
+ var UPCOMING_MESSAGE_ID = "__UPCOMING_MESSAGE_ID__";
252
+ var updateBranchData = (data, messages) => {
253
+ for (let i = 0; i < messages.length; i++) {
254
+ const child = messages[i];
255
+ const childId = child.id;
256
+ const parentId = messages[i - 1]?.id ?? ROOT_ID;
257
+ data.parentMap.set(childId, parentId);
258
+ const parentArray = data.branchMap.get(parentId);
259
+ if (!parentArray) {
260
+ data.branchMap.set(parentId, [childId]);
261
+ } else if (!parentArray.includes(childId)) {
262
+ parentArray.push(childId);
263
+ }
264
+ data.snapshots.set(childId, messages);
265
+ }
266
+ };
267
+ var getParentId = (data, messages, message) => {
268
+ if (message.id === UPCOMING_MESSAGE_ID) {
269
+ const parent = messages.at(-1);
270
+ if (!parent)
271
+ return ROOT_ID;
272
+ return parent.id;
273
+ }
274
+ const parentId = data.parentMap.get(message.id);
275
+ if (!parentId)
276
+ throw new Error("Unexpected: Message parent not found");
277
+ return parentId;
278
+ };
279
+ var getBranchStateImpl = (data, messages, message) => {
280
+ const parentId = getParentId(data, messages, message);
281
+ const branches = data.branchMap.get(parentId) ?? [];
282
+ const branchId = message.id === UPCOMING_MESSAGE_ID ? branches.length : branches.indexOf(message.id);
283
+ if (branchId === -1)
284
+ throw new Error("Unexpected: Message not found in parent children");
285
+ const upcomingOffset = message.id === UPCOMING_MESSAGE_ID ? 1 : 0;
286
+ return {
287
+ branchId,
288
+ branchCount: branches.length + upcomingOffset
289
+ };
290
+ };
291
+ var switchToBranchImpl = (data, messages, message, branchId) => {
292
+ const parentId = getParentId(data, messages, message);
293
+ const branches = data.branchMap.get(parentId);
294
+ if (!branches)
295
+ throw new Error("Unexpected: Parent children not found");
296
+ const newMessageId = branches[branchId];
297
+ if (!newMessageId)
298
+ throw new Error("Unexpected: Requested branch not found");
299
+ if (branchId < 0 || branchId >= branches.length)
300
+ throw new Error("Switch to branch called with a branch index out of range");
301
+ if (newMessageId === message.id)
302
+ return messages;
303
+ const snapshot = data.snapshots.get(newMessageId);
304
+ if (!snapshot)
305
+ throw new Error("Unexpected: Branch snapshot not found");
306
+ return snapshot;
307
+ };
308
+ var sliceMessagesUntil = (messages, message) => {
309
+ if (message.id === UPCOMING_MESSAGE_ID)
310
+ return messages;
311
+ const messageIdx = messages.findIndex((m) => m.id === message.id);
312
+ if (messageIdx === -1)
313
+ throw new Error("Unexpected: Message not found");
314
+ return messages.slice(0, messageIdx);
315
+ };
316
+ var useChatWithBranches = (chat) => {
317
+ const data = (0, import_react5.useRef)({
318
+ parentMap: /* @__PURE__ */ new Map(),
319
+ branchMap: /* @__PURE__ */ new Map(),
320
+ snapshots: /* @__PURE__ */ new Map()
321
+ }).current;
322
+ updateBranchData(data, chat.messages);
323
+ const getBranchState = (0, import_react5.useCallback)(
324
+ (message) => {
325
+ return getBranchStateImpl(data, chat.messages, message);
326
+ },
327
+ [data, chat.messages]
328
+ );
329
+ const switchToBranch = (0, import_react5.useCallback)(
330
+ (message, branchId) => {
331
+ const newMessages = switchToBranchImpl(
332
+ data,
333
+ chat.messages,
334
+ message,
335
+ branchId
336
+ );
337
+ chat.setMessages(newMessages);
338
+ },
339
+ [data, chat.messages, chat.setMessages]
340
+ );
341
+ const reloadAt = (0, import_react5.useCallback)(
342
+ async (message) => {
343
+ const newMessages = sliceMessagesUntil(chat.messages, message);
344
+ chat.setMessages(newMessages);
345
+ await chat.reload();
346
+ },
347
+ [chat.messages, chat.setMessages, chat.reload]
348
+ );
349
+ const editAt = (0, import_react5.useCallback)(
350
+ async (message, newMessage) => {
351
+ const newMessages = sliceMessagesUntil(chat.messages, message);
352
+ chat.setMessages(newMessages);
353
+ await chat.append(newMessage);
354
+ },
355
+ [chat.messages, chat.setMessages, chat.append]
356
+ );
357
+ return (0, import_react5.useMemo)(
358
+ () => ({
359
+ ...chat,
360
+ getBranchState,
361
+ switchToBranch,
362
+ editAt,
363
+ reloadAt
364
+ }),
365
+ [chat, getBranchState, switchToBranch, editAt, reloadAt]
366
+ );
367
+ };
368
+
349
369
  // src/primitives/message/index.ts
350
370
  var message_exports = {};
351
371
  __export(message_exports, {
@@ -466,35 +486,10 @@ var MessageContent = () => {
466
486
  };
467
487
 
468
488
  // src/primitives/message/MessageEditableContent.tsx
469
- var import_react_compose_refs2 = require("@radix-ui/react-compose-refs");
470
- var import_react9 = require("react");
471
-
472
- // src/utils/hooks/useAutosize.tsx
473
489
  var import_react8 = require("react");
474
- var useAutosize = (ref) => {
475
- const el = ref.current;
476
- (0, import_react8.useLayoutEffect)(() => {
477
- const el2 = ref.current;
478
- if (!el2)
479
- return;
480
- const callback = () => {
481
- el2.style.height = "0px";
482
- el2.style.height = el2.scrollHeight + "px";
483
- };
484
- el2.addEventListener("input", callback);
485
- callback();
486
- return () => {
487
- el2.removeEventListener("input", callback);
488
- };
489
- }, [ref, el]);
490
- };
491
-
492
- // src/primitives/message/MessageEditableContent.tsx
493
490
  var import_primitive3 = require("@radix-ui/primitive");
494
- var MessageEditableContent = (0, import_react9.forwardRef)(({ onChange, value, ...rest }, forwardedRef) => {
495
- const textareaRef = (0, import_react9.useRef)(null);
496
- const ref = (0, import_react_compose_refs2.useComposedRefs)(forwardedRef, textareaRef);
497
- useAutosize(textareaRef);
491
+ var import_react_textarea_autosize = __toESM(require("react-textarea-autosize"));
492
+ var MessageEditableContent = (0, import_react8.forwardRef)(({ onChange, value, ...rest }, forwardedRef) => {
498
493
  const [editState, setEditState] = useMessageContext(
499
494
  "Message.EditableContent",
500
495
  (s) => [s.editState, s.setEditState]
@@ -507,10 +502,10 @@ var MessageEditableContent = (0, import_react9.forwardRef)(({ onChange, value, .
507
502
  "Message.EditableContent may only be rendered when edit mode is enabled. Consider wrapping the component in <Message.If editing>."
508
503
  );
509
504
  return /* @__PURE__ */ React.createElement(
510
- "textarea",
505
+ import_react_textarea_autosize.default,
511
506
  {
512
507
  ...rest,
513
- ref,
508
+ ref: forwardedRef,
514
509
  onChange: (0, import_primitive3.composeEventHandlers)(onChange, handleChange),
515
510
  value: editState.value || value
516
511
  }
@@ -518,15 +513,23 @@ var MessageEditableContent = (0, import_react9.forwardRef)(({ onChange, value, .
518
513
  });
519
514
 
520
515
  // src/primitives/thread/ThreadMessages.tsx
521
- var ThreadMessages = ({
522
- components: { Message }
523
- }) => {
516
+ var getComponents = (components) => {
517
+ if ("Message" in components) {
518
+ return {
519
+ UserMessage: components.Message,
520
+ AssistantMessage: components.Message
521
+ };
522
+ }
523
+ return components;
524
+ };
525
+ var ThreadMessages = ({ components }) => {
524
526
  const chat = useThreadContext("Thread.Messages", (s) => s.chat);
525
527
  const messages = chat.messages;
528
+ const { UserMessage, AssistantMessage } = getComponents(components);
526
529
  if (messages.length === 0)
527
530
  return null;
528
- return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message, index) => {
529
- return /* @__PURE__ */ React.createElement(MessageProvider, { key: index, message }, /* @__PURE__ */ React.createElement(Message, null));
531
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, messages.map((message) => {
532
+ return /* @__PURE__ */ React.createElement(MessageProvider, { key: message.id, message }, message.role === "assistant" ? /* @__PURE__ */ React.createElement(AssistantMessage, null) : /* @__PURE__ */ React.createElement(UserMessage, null));
530
533
  }), chat.isLoading && chat.messages[chat.messages.length - 1]?.role !== "assistant" && /* @__PURE__ */ React.createElement(
531
534
  MessageProvider,
532
535
  {
@@ -536,7 +539,7 @@ var ThreadMessages = ({
536
539
  content: "..."
537
540
  }
538
541
  },
539
- /* @__PURE__ */ React.createElement(Message, null)
542
+ /* @__PURE__ */ React.createElement(AssistantMessage, null)
540
543
  ));
541
544
  };
542
545
 
@@ -550,13 +553,13 @@ __export(composer_exports, {
550
553
  });
551
554
 
552
555
  // src/primitives/composer/ComposerRoot.tsx
553
- var import_react10 = require("react");
556
+ var import_react9 = require("react");
554
557
  var import_react_primitive4 = require("@radix-ui/react-primitive");
555
558
  var import_primitive4 = require("@radix-ui/primitive");
556
- var import_react_compose_refs3 = require("@radix-ui/react-compose-refs");
557
- var ComposerContext = (0, import_react10.createContext)(null);
559
+ var import_react_compose_refs2 = require("@radix-ui/react-compose-refs");
560
+ var ComposerContext = (0, import_react9.createContext)(null);
558
561
  var useComposerContext = () => {
559
- const context = (0, import_react10.useContext)(ComposerContext);
562
+ const context = (0, import_react9.useContext)(ComposerContext);
560
563
  if (!context) {
561
564
  throw new Error(
562
565
  "Composer compound components cannot be rendered outside the Composer component"
@@ -564,15 +567,15 @@ var useComposerContext = () => {
564
567
  }
565
568
  return context;
566
569
  };
567
- var ComposerRoot = (0, import_react10.forwardRef)(
570
+ var ComposerRoot = (0, import_react9.forwardRef)(
568
571
  ({ onSubmit, ...rest }, forwardedRef) => {
569
572
  const handleSubmit = useThreadContext(
570
573
  "Composer.Root",
571
574
  (s) => s.chat.handleSubmit
572
575
  );
573
- const formRef = (0, import_react10.useRef)(null);
574
- const ref = (0, import_react_compose_refs3.useComposedRefs)(forwardedRef, formRef);
575
- const composerContextValue = (0, import_react10.useMemo)(
576
+ const formRef = (0, import_react9.useRef)(null);
577
+ const ref = (0, import_react_compose_refs2.useComposedRefs)(forwardedRef, formRef);
578
+ const composerContextValue = (0, import_react9.useMemo)(
576
579
  () => ({
577
580
  submit: () => formRef.current?.dispatchEvent(
578
581
  new Event("submit", { cancelable: true, bubbles: true })
@@ -592,11 +595,11 @@ var ComposerRoot = (0, import_react10.forwardRef)(
592
595
  );
593
596
 
594
597
  // src/primitives/composer/ComposerInput.tsx
595
- var import_react11 = require("react");
598
+ var import_react10 = require("react");
596
599
  var import_react_slot = require("@radix-ui/react-slot");
597
600
  var import_primitive5 = require("@radix-ui/primitive");
598
- var import_react_compose_refs4 = require("@radix-ui/react-compose-refs");
599
- var ComposerInput = (0, import_react11.forwardRef)(({ asChild, onChange, onKeyDown, ...rest }, forwardedRef) => {
601
+ var import_react_textarea_autosize2 = __toESM(require("react-textarea-autosize"));
602
+ var ComposerInput = (0, import_react10.forwardRef)(({ asChild, onChange, onKeyDown, ...rest }, forwardedRef) => {
600
603
  const chat = useThreadContext(
601
604
  "Composer.Input",
602
605
  ({ chat: { input, handleInputChange, isLoading } }) => ({
@@ -605,15 +608,12 @@ var ComposerInput = (0, import_react11.forwardRef)(({ asChild, onChange, onKeyDo
605
608
  isLoading
606
609
  })
607
610
  );
608
- const Component = asChild ? import_react_slot.Slot : "textarea";
609
- const textareaRef = (0, import_react11.useRef)(null);
610
- const ref = (0, import_react_compose_refs4.useComposedRefs)(forwardedRef, textareaRef);
611
- useAutosize(textareaRef);
611
+ const Component = asChild ? import_react_slot.Slot : import_react_textarea_autosize2.default;
612
612
  const composer = useComposerContext();
613
613
  const handleKeyPress = (e) => {
614
614
  if (chat.isLoading || rest.disabled)
615
615
  return;
616
- if (e.key === "Enter" && e.shiftKey == false) {
616
+ if (e.key === "Enter" && e.shiftKey === false) {
617
617
  e.preventDefault();
618
618
  composer.submit();
619
619
  }
@@ -623,7 +623,7 @@ var ComposerInput = (0, import_react11.forwardRef)(({ asChild, onChange, onKeyDo
623
623
  {
624
624
  value: chat.input,
625
625
  ...rest,
626
- ref,
626
+ ref: forwardedRef,
627
627
  onChange: (0, import_primitive5.composeEventHandlers)(onChange, chat.handleInputChange),
628
628
  onKeyDown: (0, import_primitive5.composeEventHandlers)(onKeyDown, handleKeyPress)
629
629
  }
@@ -631,9 +631,9 @@ var ComposerInput = (0, import_react11.forwardRef)(({ asChild, onChange, onKeyDo
631
631
  });
632
632
 
633
633
  // src/primitives/composer/ComposerSend.tsx
634
- var import_react12 = require("react");
634
+ var import_react11 = require("react");
635
635
  var import_react_primitive5 = require("@radix-ui/react-primitive");
636
- var ComposerSend = (0, import_react12.forwardRef)(
636
+ var ComposerSend = (0, import_react11.forwardRef)(
637
637
  ({ disabled, ...rest }, ref) => {
638
638
  const input = useThreadContext("Composer.Send", (s) => s.chat.input);
639
639
  return /* @__PURE__ */ React.createElement(
@@ -649,11 +649,11 @@ var ComposerSend = (0, import_react12.forwardRef)(
649
649
  );
650
650
 
651
651
  // src/utils/createActionButton.tsx
652
- var import_react13 = require("react");
652
+ var import_react12 = require("react");
653
653
  var import_react_primitive6 = require("@radix-ui/react-primitive");
654
654
  var import_primitive6 = require("@radix-ui/primitive");
655
655
  var createActionButton = (useActionButton) => {
656
- return (0, import_react13.forwardRef)(
656
+ return (0, import_react12.forwardRef)(
657
657
  (props, forwardedRef) => {
658
658
  const onClick = useActionButton(props);
659
659
  return /* @__PURE__ */ React.createElement(
@@ -692,8 +692,8 @@ __export(branchPicker_exports, {
692
692
  Root: () => BranchPickerRoot
693
693
  });
694
694
 
695
- // src/primitives/branchPicker/BranchPickerNext.tsx
696
- var useBranchPickerNext = () => {
695
+ // src/actions/useGoToNextBranch.tsx
696
+ var useGoToNextBranch = () => {
697
697
  const switchToBranch = useThreadContext(
698
698
  "BranchPicker.Next",
699
699
  (s) => s.chat.switchToBranch
@@ -708,10 +708,12 @@ var useBranchPickerNext = () => {
708
708
  switchToBranch(message, branchId + 1);
709
709
  };
710
710
  };
711
- var BranchPickerNext = createActionButton(useBranchPickerNext);
712
711
 
713
- // src/primitives/branchPicker/BranchPickerPrevious.tsx
714
- var useBranchPickerPrevious = () => {
712
+ // src/primitives/branchPicker/BranchPickerNext.tsx
713
+ var BranchPickerNext = createActionButton(useGoToNextBranch);
714
+
715
+ // src/actions/useGoToPreviousBranch.tsx
716
+ var useGoToPreviousBranch = () => {
715
717
  const switchToBranch = useThreadContext(
716
718
  "BranchPicker.Previous",
717
719
  (s) => s.chat.switchToBranch
@@ -726,7 +728,9 @@ var useBranchPickerPrevious = () => {
726
728
  switchToBranch(message, branchId - 1);
727
729
  };
728
730
  };
729
- var BranchPickerPrevious = createActionButton(useBranchPickerPrevious);
731
+
732
+ // src/primitives/branchPicker/BranchPickerPrevious.tsx
733
+ var BranchPickerPrevious = createActionButton(useGoToPreviousBranch);
730
734
 
731
735
  // src/primitives/branchPicker/BranchPickerCount.tsx
732
736
  var BranchPickerCount = () => {
@@ -747,10 +751,10 @@ var BranchPickerNumber = () => {
747
751
  };
748
752
 
749
753
  // src/primitives/branchPicker/BranchPickerRoot.tsx
750
- var import_react14 = require("react");
751
754
  var import_react_primitive7 = require("@radix-ui/react-primitive");
752
- var BranchPickerRoot = (0, import_react14.forwardRef)(({ ...rest }, ref) => {
753
- return /* @__PURE__ */ React.createElement(import_react_primitive7.Primitive.div, { ...rest, ref });
755
+ var import_react13 = require("react");
756
+ var BranchPickerRoot = (0, import_react13.forwardRef)(({ hideWhenSingleBranch, ...rest }, ref) => {
757
+ return /* @__PURE__ */ React.createElement(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0 }, /* @__PURE__ */ React.createElement(import_react_primitive7.Primitive.div, { ...rest, ref }));
754
758
  });
755
759
 
756
760
  // src/primitives/actionBar/index.ts
@@ -763,16 +767,14 @@ __export(actionBar_exports, {
763
767
  });
764
768
 
765
769
  // src/primitives/actionBar/ActionBarRoot.tsx
766
- var import_react15 = require("react");
767
770
  var import_react_primitive8 = require("@radix-ui/react-primitive");
768
- var ActionBarRoot = (0, import_react15.forwardRef)(
769
- ({ ...rest }, ref) => {
770
- return /* @__PURE__ */ React.createElement(import_react_primitive8.Primitive.div, { ...rest, ref });
771
- }
772
- );
771
+ var import_react14 = require("react");
772
+ var ActionBarRoot = (0, import_react14.forwardRef)(({ hideWhenEditing = false, ...rest }, ref) => {
773
+ return /* @__PURE__ */ React.createElement(MessageIf, { editing: hideWhenEditing ? false : void 0 }, /* @__PURE__ */ React.createElement(import_react_primitive8.Primitive.div, { ...rest, ref }));
774
+ });
773
775
 
774
- // src/primitives/actionBar/ActionBarCopy.tsx
775
- var useActionBarCopy = ({ copiedDuration = 3e3 }) => {
776
+ // src/actions/useCopyMessage.tsx
777
+ var useCopyMessage = ({ copiedDuration = 3e3 }) => {
776
778
  const [messageContent, setIsCopied] = useMessageContext(
777
779
  "ActionBar.Copy",
778
780
  (s) => [s.message.content, s.setIsCopied]
@@ -783,20 +785,27 @@ var useActionBarCopy = ({ copiedDuration = 3e3 }) => {
783
785
  setTimeout(() => setIsCopied(false), copiedDuration);
784
786
  };
785
787
  };
786
- var ActionBarCopy = createActionButton(useActionBarCopy);
787
788
 
788
- // src/primitives/actionBar/ActionBarReload.tsx
789
- var useActionBarReload = () => {
790
- const chat = useThreadContext("ActionBar.Reload", (s) => s.chat);
789
+ // src/primitives/actionBar/ActionBarCopy.tsx
790
+ var ActionBarCopy = createActionButton(useCopyMessage);
791
+
792
+ // src/actions/useReloadMessage.tsx
793
+ var useReloadMessage = () => {
794
+ const [isLoading, reloadAt] = useThreadContext("ActionBar.Reload", (s) => [
795
+ s.chat.isLoading,
796
+ s.chat.reloadAt
797
+ ]);
791
798
  const message = useMessageContext("ActionBar.Reload", (s) => s.message);
792
- if (message.role !== "assistant" || chat.isLoading)
799
+ if (message.role !== "assistant" || isLoading)
793
800
  return null;
794
- return () => chat.reloadAt(message);
801
+ return () => reloadAt(message);
795
802
  };
796
- var ActionBarReload = createActionButton(useActionBarReload);
797
803
 
798
- // src/primitives/actionBar/ActionBarEdit.tsx
799
- var useActionBarEdit = () => {
804
+ // src/primitives/actionBar/ActionBarReload.tsx
805
+ var ActionBarReload = createActionButton(useReloadMessage);
806
+
807
+ // src/actions/useBeginMessageEdit.tsx
808
+ var useBeginMessageEdit = () => {
800
809
  const [editState, messageContent, setEditState] = useMessageContext(
801
810
  "ActionBar.Edit",
802
811
  (s) => [s.editState, s.message.content, s.setEditState]
@@ -807,7 +816,9 @@ var useActionBarEdit = () => {
807
816
  setEditState({ isEditing: true, value: messageContent });
808
817
  };
809
818
  };
810
- var ActionBarEdit = createActionButton(useActionBarEdit);
819
+
820
+ // src/primitives/actionBar/ActionBarEdit.tsx
821
+ var ActionBarEdit = createActionButton(useBeginMessageEdit);
811
822
 
812
823
  // src/primitives/editBar/index.ts
813
824
  var editBar_exports = {};
@@ -818,16 +829,16 @@ __export(editBar_exports, {
818
829
  });
819
830
 
820
831
  // src/primitives/editBar/EditBarRoot.tsx
821
- var import_react16 = require("react");
822
832
  var import_react_primitive9 = require("@radix-ui/react-primitive");
823
- var EditBarRoot = (0, import_react16.forwardRef)(
824
- ({ ...rest }, ref) => {
825
- return /* @__PURE__ */ React.createElement(import_react_primitive9.Primitive.div, { ...rest, ref });
833
+ var import_react15 = require("react");
834
+ var EditBarRoot = (0, import_react15.forwardRef)(
835
+ ({ hideWhenNotEditing, ...rest }, ref) => {
836
+ return /* @__PURE__ */ React.createElement(MessageIf, { editing: hideWhenNotEditing ? true : void 0 }, /* @__PURE__ */ React.createElement(import_react_primitive9.Primitive.div, { ...rest, ref }));
826
837
  }
827
838
  );
828
839
 
829
- // src/primitives/editBar/EditBarSave.tsx
830
- var useEditBarSave = () => {
840
+ // src/actions/useSaveMessageEdit.tsx
841
+ var useSaveMessageEdit = () => {
831
842
  const chat = useThreadContext("EditBar.Save", (s) => s.chat);
832
843
  const [editState, message, setEditState] = useMessageContext(
833
844
  "EditBar.Save",
@@ -847,10 +858,12 @@ var useEditBarSave = () => {
847
858
  setEditState({ isEditing: false });
848
859
  };
849
860
  };
850
- var EditBarSave = createActionButton(useEditBarSave);
851
861
 
852
- // src/primitives/editBar/EditBarCancel.tsx
853
- var useEditBarCancel = () => {
862
+ // src/primitives/editBar/EditBarSave.tsx
863
+ var EditBarSave = createActionButton(useSaveMessageEdit);
864
+
865
+ // src/actions/useCancelMessageEdit.tsx
866
+ var useCancelMessageEdit = () => {
854
867
  const [isEditing, setEditState] = useMessageContext("EditBar.Cancel", (s) => [
855
868
  s.editState.isEditing,
856
869
  s.setEditState
@@ -861,14 +874,33 @@ var useEditBarCancel = () => {
861
874
  setEditState({ isEditing: false });
862
875
  };
863
876
  };
864
- var EditBarCancel = createActionButton(useEditBarCancel);
877
+
878
+ // src/primitives/editBar/EditBarCancel.tsx
879
+ var EditBarCancel = createActionButton(useCancelMessageEdit);
880
+
881
+ // src/vercel/VercelAIThreadProvider.tsx
882
+ var VercelAIThreadProvider = ({
883
+ chat,
884
+ children
885
+ }) => {
886
+ const branches = useChatWithBranches(chat);
887
+ return /* @__PURE__ */ React.createElement(ThreadContextProvider, { chat: branches }, children);
888
+ };
865
889
  // Annotate the CommonJS export names for ESM import in node:
866
890
  0 && (module.exports = {
867
- ActionBar,
868
- BranchPicker,
869
- Composer,
870
- EditBar,
871
- Message,
872
- Thread,
873
- unstable_useMessageContext
891
+ ActionBarPrimitive,
892
+ BranchPickerPrimitive,
893
+ ComposerPrimitive,
894
+ EditBarPrimitive,
895
+ MessagePrimitive,
896
+ ThreadPrimitive,
897
+ VercelAIThreadProvider,
898
+ unstable_useMessageContext,
899
+ useBeginMessageEdit,
900
+ useCancelMessageEdit,
901
+ useCopyMessage,
902
+ useGoToNextBranch,
903
+ useGoToPreviousBranch,
904
+ useReloadMessage,
905
+ useSaveMessageEdit
874
906
  });