@assistant-ui/react 0.5.65 → 0.5.67

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.mjs CHANGED
@@ -16,10 +16,7 @@ import {
16
16
  } from "./chunk-BJPOCE4O.mjs";
17
17
 
18
18
  // src/context/providers/AssistantRuntimeProvider.tsx
19
- import { memo } from "react";
20
-
21
- // src/context/providers/AssistantProvider.tsx
22
- import { useEffect as useEffect2, useInsertionEffect, useRef, useState as useState2 } from "react";
19
+ import { memo, useEffect as useEffect2, useMemo as useMemo2, useState as useState2 } from "react";
23
20
 
24
21
  // src/context/react/AssistantContext.ts
25
22
  import { createContext } from "react";
@@ -122,8 +119,8 @@ var makeAssistantToolUIsStore = () => create((set) => {
122
119
  });
123
120
  });
124
121
 
125
- // src/context/providers/ThreadProvider.tsx
126
- import { useEffect, useState } from "react";
122
+ // src/context/providers/ThreadRuntimeProvider.tsx
123
+ import { useEffect, useMemo, useState } from "react";
127
124
 
128
125
  // src/context/react/ThreadContext.ts
129
126
  import { createContext as createContext2 } from "react";
@@ -148,7 +145,9 @@ var { useThread, useThreadStore } = createContextStoreHook(
148
145
  useThreadContext,
149
146
  "useThread"
150
147
  );
151
- var { useThreadMessages, useThreadMessagesStore } = createContextStoreHook(useThreadContext, "useThreadMessages");
148
+ var messages = createContextStoreHook(useThreadContext, "useThreadMessages");
149
+ var useThreadMessages = messages.useThreadMessages;
150
+ var useThreadMessagesStore = messages.useThreadMessagesStore;
152
151
  var {
153
152
  useComposer: useThreadComposer,
154
153
  useComposerStore: useThreadComposerStore
@@ -158,81 +157,11 @@ var {
158
157
  useViewportStore: useThreadViewportStore
159
158
  } = createContextStoreHook(useThreadContext, "useViewport");
160
159
 
161
- // src/context/stores/ThreadComposer.ts
162
- import { create as create2 } from "zustand";
163
- var makeThreadComposerStore = (useThreadRuntime2) => {
164
- const focusListeners = /* @__PURE__ */ new Set();
165
- return create2()((_, get) => {
166
- const runtime = useThreadRuntime2.getState();
167
- return {
168
- type: "thread",
169
- get value() {
170
- return get().text;
171
- },
172
- setValue(value) {
173
- get().setText(value);
174
- },
175
- attachmentAccept: runtime.composer.attachmentAccept,
176
- attachments: runtime.composer.attachments,
177
- addAttachment: (file) => {
178
- useThreadRuntime2.getState().composer.addAttachment(file);
179
- },
180
- removeAttachment: (attachmentId) => {
181
- useThreadRuntime2.getState().composer.removeAttachment(attachmentId);
182
- },
183
- reset: () => {
184
- useThreadRuntime2.getState().composer.reset();
185
- },
186
- text: runtime.composer.text,
187
- setText: (text) => {
188
- useThreadRuntime2.getState().composer.setText(text);
189
- },
190
- canCancel: runtime.capabilities.cancel,
191
- isEditing: true,
192
- isEmpty: runtime.composer.isEmpty,
193
- send: () => {
194
- const runtime2 = useThreadRuntime2.getState();
195
- runtime2.composer.send();
196
- },
197
- cancel: () => {
198
- useThreadRuntime2.getState().cancelRun();
199
- },
200
- focus: () => {
201
- for (const listener of focusListeners) {
202
- listener();
203
- }
204
- },
205
- onFocus: (listener) => {
206
- focusListeners.add(listener);
207
- return () => {
208
- focusListeners.delete(listener);
209
- };
210
- }
211
- };
212
- });
213
- };
214
-
215
- // src/context/stores/Thread.ts
216
- import { create as create3 } from "zustand";
217
- var getThreadStateFromRuntime = (runtime) => {
218
- const lastMessage = runtime.messages.at(-1);
219
- return Object.freeze({
220
- threadId: runtime.threadId,
221
- capabilities: runtime.capabilities,
222
- isDisabled: runtime.isDisabled,
223
- isRunning: lastMessage?.role !== "assistant" ? false : lastMessage.status.type === "running"
224
- });
225
- };
226
- var makeThreadStore = (runtimeRef) => {
227
- const runtime = runtimeRef.getState();
228
- return create3(() => getThreadStateFromRuntime(runtime));
229
- };
230
-
231
160
  // src/context/stores/ThreadViewport.tsx
232
- import { create as create4 } from "zustand";
161
+ import { create as create2 } from "zustand";
233
162
  var makeThreadViewportStore = () => {
234
163
  const scrollToBottomListeners = /* @__PURE__ */ new Set();
235
- return create4(() => ({
164
+ return create2(() => ({
236
165
  isAtBottom: true,
237
166
  scrollToBottom: () => {
238
167
  for (const listener of scrollToBottomListeners) {
@@ -248,85 +177,65 @@ var makeThreadViewportStore = () => {
248
177
  }));
249
178
  };
250
179
 
251
- // src/context/stores/ThreadMessages.ts
252
- import { create as create5 } from "zustand";
253
- var makeThreadMessagesStore = (runtimeRef) => {
254
- return create5(() => runtimeRef.getState().messages);
255
- };
256
-
257
180
  // src/context/ReadonlyStore.ts
258
181
  var writableStore = (store) => {
259
182
  return store;
260
183
  };
261
184
 
262
- // src/context/providers/ThreadProvider.tsx
263
- import { create as create6 } from "zustand";
185
+ // src/context/providers/ThreadRuntimeProvider.tsx
186
+ import { create as create3 } from "zustand";
264
187
  import { jsx, jsxs } from "react/jsx-runtime";
265
- var ThreadProvider = ({
266
- children,
267
- provider: thread
268
- }) => {
269
- const [context] = useState(() => {
270
- const useThreadRuntime2 = create6(() => thread);
271
- const useThread2 = makeThreadStore(useThreadRuntime2);
272
- const useThreadMessages2 = makeThreadMessagesStore(useThreadRuntime2);
188
+ var useThreadRuntimeStore2 = (runtime) => {
189
+ const [store] = useState(() => create3(() => runtime));
190
+ useEffect(() => {
191
+ writableStore(store).setState(runtime, true);
192
+ }, [runtime, store]);
193
+ return store;
194
+ };
195
+ var useThreadStore2 = (runtime) => {
196
+ const [store] = useState(() => create3(() => runtime.getState()));
197
+ useEffect(() => {
198
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
199
+ updateState();
200
+ return runtime.subscribe(updateState);
201
+ }, [runtime, store]);
202
+ return store;
203
+ };
204
+ var useThreadMessagesStore2 = (runtime) => {
205
+ const [store] = useState(() => create3(() => runtime.messages));
206
+ useEffect(() => {
207
+ const updateState = () => writableStore(store).setState(runtime.messages, true);
208
+ updateState();
209
+ return runtime.subscribe(updateState);
210
+ }, [runtime, store]);
211
+ return store;
212
+ };
213
+ var useThreadComposerStore2 = (runtime) => {
214
+ const [store] = useState(() => create3(() => runtime.getState()));
215
+ useEffect(() => {
216
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
217
+ updateState();
218
+ return runtime.subscribe(updateState);
219
+ }, [runtime, store]);
220
+ return store;
221
+ };
222
+ var ThreadRuntimeProvider = ({ children, runtime }) => {
223
+ const useThreadRuntime2 = useThreadRuntimeStore2(runtime);
224
+ const useThread2 = useThreadStore2(runtime);
225
+ const useThreadMessages2 = useThreadMessagesStore2(runtime);
226
+ const useThreadComposer2 = useThreadComposerStore2(runtime.composer);
227
+ const context = useMemo(() => {
273
228
  const useViewport = makeThreadViewportStore();
274
- const useComposer2 = makeThreadComposerStore(useThreadRuntime2);
275
229
  return {
276
230
  useThread: useThread2,
277
231
  useThreadRuntime: useThreadRuntime2,
278
232
  useThreadMessages: useThreadMessages2,
279
233
  useThreadActions: useThreadRuntime2,
280
- useComposer: useComposer2,
234
+ useComposer: useThreadComposer2,
281
235
  useViewport
282
236
  };
283
- });
284
- useEffect(() => {
285
- const onThreadUpdate = () => {
286
- const oldState = context.useThread.getState();
287
- const state = getThreadStateFromRuntime(thread);
288
- if (oldState.threadId !== state.threadId || oldState.isDisabled !== state.isDisabled || oldState.isRunning !== state.isRunning || oldState.capabilities !== state.capabilities) {
289
- writableStore(context.useThread).setState(state, true);
290
- }
291
- if (thread.messages !== context.useThreadMessages.getState()) {
292
- writableStore(context.useThreadMessages).setState(
293
- thread.messages,
294
- true
295
- );
296
- }
297
- const composerState = context.useComposer.getState();
298
- if (state.capabilities.cancel !== composerState.canCancel) {
299
- writableStore(context.useComposer).setState({
300
- canCancel: state.capabilities.cancel
301
- });
302
- }
303
- };
304
- onThreadUpdate();
305
- return thread.subscribe(onThreadUpdate);
306
- }, [thread, context]);
307
- useEffect(() => {
308
- const onComposerUpdate = () => {
309
- const composer = thread.composer;
310
- const composerState = context.useComposer.getState();
311
- if (composer.isEmpty !== composerState.isEmpty || composer.text !== composerState.text || composer.attachmentAccept !== composerState.attachmentAccept || composer.attachments !== composerState.attachments) {
312
- writableStore(context.useComposer).setState({
313
- isEmpty: composer.isEmpty,
314
- text: composer.text,
315
- attachmentAccept: composer.attachmentAccept,
316
- attachments: composer.attachments
317
- });
318
- }
319
- };
320
- onComposerUpdate();
321
- return thread.composer.subscribe(onComposerUpdate);
322
- }, [thread, context]);
323
- useEffect(
324
- () => thread.subscribe(() => {
325
- writableStore(context.useThreadRuntime).setState(thread, true);
326
- }),
327
- [thread, context]
328
- );
329
- const Synchronizer = context.useThreadRuntime(
237
+ }, [useThread2, useThreadRuntime2, useThreadMessages2, useThreadComposer2]);
238
+ const Synchronizer = context.useThread(
330
239
  (t) => t.unstable_synchronizer
331
240
  );
332
241
  return /* @__PURE__ */ jsxs(ThreadContext.Provider, { value: context, children: [
@@ -335,40 +244,36 @@ var ThreadProvider = ({
335
244
  ] });
336
245
  };
337
246
 
338
- // src/context/providers/AssistantProvider.tsx
339
- import { create as create7 } from "zustand";
247
+ // src/context/providers/AssistantRuntimeProvider.tsx
248
+ import { create as create4 } from "zustand";
340
249
  import { jsx as jsx2 } from "react/jsx-runtime";
341
- var AssistantProvider = ({ children, runtime }) => {
342
- const runtimeRef = useRef(runtime);
343
- useInsertionEffect(() => {
344
- runtimeRef.current = runtime;
345
- });
346
- const [context] = useState2(() => {
347
- const useAssistantRuntime2 = create7(() => runtime);
348
- const useToolUIs2 = makeAssistantToolUIsStore();
250
+ var useAssistantRuntimeStore2 = (runtime) => {
251
+ const [store] = useState2(() => create4(() => runtime));
252
+ useEffect2(() => {
253
+ writableStore(store).setState(runtime, true);
254
+ }, [runtime, store]);
255
+ return store;
256
+ };
257
+ var useAssistantToolUIsStore = () => {
258
+ return useMemo2(() => makeAssistantToolUIsStore(), []);
259
+ };
260
+ var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
261
+ const useAssistantRuntime2 = useAssistantRuntimeStore2(runtime);
262
+ const useToolUIs2 = useAssistantToolUIsStore();
263
+ const context = useMemo2(() => {
349
264
  return {
350
265
  useToolUIs: useToolUIs2,
351
266
  useAssistantRuntime: useAssistantRuntime2,
352
267
  useAssistantActions: useAssistantRuntime2
353
268
  };
354
- });
355
- useEffect2(
356
- () => writableStore(context.useAssistantRuntime).setState(runtime, true),
357
- [runtime, context]
358
- );
359
- return /* @__PURE__ */ jsx2(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ jsx2(ThreadProvider, { provider: runtime.thread, children }) });
360
- };
361
-
362
- // src/context/providers/AssistantRuntimeProvider.tsx
363
- import { jsx as jsx3 } from "react/jsx-runtime";
364
- var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
365
- return /* @__PURE__ */ jsx3(AssistantProvider, { runtime, children });
269
+ }, [useAssistantRuntime2, useToolUIs2]);
270
+ return /* @__PURE__ */ jsx2(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ jsx2(ThreadRuntimeProvider, { runtime: runtime.thread, children }) });
366
271
  };
367
272
  var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
368
273
 
369
274
  // src/context/providers/TextContentPartProvider.tsx
370
275
  import { useEffect as useEffect3, useState as useState3 } from "react";
371
- import { create as create8 } from "zustand";
276
+ import { create as create5 } from "zustand";
372
277
 
373
278
  // src/context/react/ContentPartContext.ts
374
279
  import { createContext as createContext3 } from "react";
@@ -379,13 +284,49 @@ var useContentPartContext = createContextHook(
379
284
  ContentPartContext,
380
285
  "a component passed to <MessagePrimitive.Content components={...}>"
381
286
  );
287
+ function useContentPartRuntime(options) {
288
+ const context = useContentPartContext(options);
289
+ if (!context) return null;
290
+ return context.useContentPartRuntime();
291
+ }
382
292
  var { useContentPart, useContentPartStore } = createContextStoreHook(
383
293
  useContentPartContext,
384
294
  "useContentPart"
385
295
  );
386
296
 
297
+ // src/api/ContentPartRuntime.ts
298
+ var ContentPartRuntime = class {
299
+ constructor(contentBinding, messageApi, threadApi) {
300
+ this.contentBinding = contentBinding;
301
+ this.messageApi = messageApi;
302
+ this.threadApi = threadApi;
303
+ }
304
+ getState() {
305
+ return this.contentBinding.getState();
306
+ }
307
+ addToolResult(result) {
308
+ const message = this.messageApi.getState();
309
+ if (!message) throw new Error("Message is not available");
310
+ const state = this.contentBinding.getState();
311
+ if (!state) throw new Error("Content part is not available");
312
+ if (state.type !== "tool-call")
313
+ throw new Error("Tried to add tool result to non-tool content part");
314
+ const toolName = state.toolName;
315
+ const toolCallId = state.toolCallId;
316
+ this.threadApi.getState().addToolResult({
317
+ messageId: message.id,
318
+ toolName,
319
+ toolCallId,
320
+ result
321
+ });
322
+ }
323
+ subscribe(callback) {
324
+ return this.contentBinding.subscribe(callback);
325
+ }
326
+ };
327
+
387
328
  // src/context/providers/TextContentPartProvider.tsx
388
- import { jsx as jsx4 } from "react/jsx-runtime";
329
+ import { jsx as jsx3 } from "react/jsx-runtime";
389
330
  var COMPLETE_STATUS = {
390
331
  type: "complete"
391
332
  };
@@ -394,18 +335,22 @@ var RUNNING_STATUS = {
394
335
  };
395
336
  var TextContentPartProvider = ({ children, text, isRunning }) => {
396
337
  const [context] = useState3(() => {
397
- const useContentPart2 = create8(() => ({
338
+ const useContentPartRuntime2 = create5(
339
+ // TODO
340
+ () => new ContentPartRuntime(null, null, null)
341
+ );
342
+ const useContentPart2 = create5(() => ({
398
343
  status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,
399
- part: { type: "text", text }
344
+ part: { type: "text", text },
345
+ type: "text",
346
+ text
400
347
  }));
401
- return {
402
- useContentPart: useContentPart2
403
- };
348
+ return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
404
349
  });
405
350
  useEffect3(() => {
406
351
  const state = context.useContentPart.getState();
407
- const textUpdated = state.part.text !== text;
408
- const targetTextPart = textUpdated ? { type: "text", text } : state.part;
352
+ const textUpdated = state.text !== text;
353
+ const targetTextPart = textUpdated ? { type: "text", text } : state;
409
354
  const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;
410
355
  const statusUpdated = state.status !== targetStatus;
411
356
  if (!textUpdated && !statusUpdated) return;
@@ -417,7 +362,7 @@ var TextContentPartProvider = ({ children, text, isRunning }) => {
417
362
  true
418
363
  );
419
364
  }, [context, isRunning, text]);
420
- return /* @__PURE__ */ jsx4(ContentPartContext.Provider, { value: context, children });
365
+ return /* @__PURE__ */ jsx3(ContentPartContext.Provider, { value: context, children });
421
366
  };
422
367
 
423
368
  // src/context/react/MessageContext.ts
@@ -427,6 +372,11 @@ var useMessageContext = createContextHook(
427
372
  MessageContext,
428
373
  "a component passed to <ThreadPrimitive.Messages components={...} />"
429
374
  );
375
+ function useMessageRuntime(options) {
376
+ const context = useMessageContext(options);
377
+ if (!context) return null;
378
+ return context.useMessageRuntime();
379
+ }
430
380
  var { useMessage, useMessageStore } = createContextStoreHook(
431
381
  useMessageContext,
432
382
  "useMessage"
@@ -441,59 +391,41 @@ var { useEditComposer, useEditComposerStore } = createContextStoreHook(
441
391
  );
442
392
 
443
393
  // src/context/react/ComposerContext.ts
444
- import { useMemo } from "react";
394
+ import { useMemo as useMemo3 } from "react";
445
395
  var useComposerContext = () => {
446
- const { useComposer: useComposer2 } = useThreadContext();
396
+ const { useComposer: useThreadComposer2 } = useThreadContext();
447
397
  const { useEditComposer: useEditComposer2 } = useMessageContext({ optional: true }) ?? {};
448
- return useMemo(
398
+ return useMemo3(
449
399
  () => ({
450
- useComposer: useEditComposer2 ?? useComposer2,
400
+ useComposer: useEditComposer2 ?? useThreadComposer2,
451
401
  type: useEditComposer2 ? "edit" : "new"
452
402
  }),
453
- [useEditComposer2, useComposer2]
403
+ [useEditComposer2, useThreadComposer2]
454
404
  );
455
405
  };
456
406
  var { useComposer, useComposerStore } = createContextStoreHook(
457
407
  useComposerContext,
458
408
  "useComposer"
459
409
  );
410
+ function useComposerRuntime(options) {
411
+ const messageRuntime = useMessageRuntime({ optional: true });
412
+ const threadRuntime = useThreadRuntime(options);
413
+ return messageRuntime ? messageRuntime.composer : threadRuntime?.composer ?? null;
414
+ }
460
415
 
461
416
  // src/hooks/useAppendMessage.tsx
462
417
  import { useCallback } from "react";
463
- var toAppendMessage = (useThreadMessages2, message) => {
464
- if (typeof message === "string") {
465
- return {
466
- parentId: useThreadMessages2.getState().at(-1)?.id ?? null,
467
- role: "user",
468
- content: [{ type: "text", text: message }],
469
- attachments: []
470
- };
471
- }
472
- return {
473
- parentId: message.parentId ?? useThreadMessages2.getState().at(-1)?.id ?? null,
474
- role: message.role ?? "user",
475
- content: message.content,
476
- attachments: message.attachments ?? []
477
- };
478
- };
479
418
  var useAppendMessage = () => {
480
- const threadMessagesStore = useThreadMessagesStore();
481
419
  const threadRuntime = useThreadRuntime();
482
420
  const threadViewportStore = useThreadViewportStore();
483
421
  const threadComposerStore = useThreadComposerStore();
484
422
  const append = useCallback(
485
423
  (message) => {
486
- const appendMessage = toAppendMessage(threadMessagesStore, message);
487
- threadRuntime.append(appendMessage);
424
+ threadRuntime.append(message);
488
425
  threadViewportStore.getState().scrollToBottom();
489
426
  threadComposerStore.getState().focus();
490
427
  },
491
- [
492
- threadMessagesStore,
493
- threadRuntime,
494
- threadViewportStore,
495
- threadComposerStore
496
- ]
428
+ [threadRuntime, threadViewportStore, threadComposerStore]
497
429
  );
498
430
  return append;
499
431
  };
@@ -582,7 +514,7 @@ var useAssistantInstructions = (instruction) => {
582
514
  import { useCallback as useCallback3 } from "react";
583
515
 
584
516
  // src/utils/combined/useCombinedStore.ts
585
- import { useMemo as useMemo2 } from "react";
517
+ import { useMemo as useMemo4 } from "react";
586
518
 
587
519
  // src/utils/combined/createCombinedStore.ts
588
520
  import { useSyncExternalStore } from "react";
@@ -603,7 +535,7 @@ var createCombinedStore = (stores) => {
603
535
 
604
536
  // src/utils/combined/useCombinedStore.ts
605
537
  var useCombinedStore = (stores, selector) => {
606
- const useCombined = useMemo2(() => createCombinedStore(stores), stores);
538
+ const useCombined = useMemo4(() => createCombinedStore(stores), stores);
607
539
  return useCombined(selector);
608
540
  };
609
541
 
@@ -624,12 +556,12 @@ var useActionBarCopy = ({
624
556
  const editComposerStore = useEditComposerStore();
625
557
  const hasCopyableContent = useCombinedStore(
626
558
  [messageStore, editComposerStore],
627
- ({ message }, c) => {
559
+ (message, c) => {
628
560
  return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
629
561
  }
630
562
  );
631
563
  const callback = useCallback3(() => {
632
- const { message } = messageStore.getState();
564
+ const message = messageStore.getState();
633
565
  const { setIsCopied } = messageUtilsStore.getState();
634
566
  const { isEditing, text: composerValue } = editComposerStore.getState();
635
567
  const valueToCopy = isEditing ? composerValue : getThreadMessageText(message);
@@ -645,12 +577,11 @@ var useActionBarCopy = ({
645
577
  // src/primitive-hooks/actionBar/useActionBarEdit.tsx
646
578
  import { useCallback as useCallback4 } from "react";
647
579
  var useActionBarEdit = () => {
648
- const editComposerStore = useEditComposerStore();
649
- const disabled = useEditComposer((c) => c.isEditing);
580
+ const composerRuntime = useComposerRuntime();
581
+ const disabled = useComposer((c) => c.isEditing);
650
582
  const callback = useCallback4(() => {
651
- const { edit } = editComposerStore.getState();
652
- edit();
653
- }, [editComposerStore]);
583
+ composerRuntime.beginEdit();
584
+ }, [composerRuntime]);
654
585
  if (disabled) return null;
655
586
  return callback;
656
587
  };
@@ -660,19 +591,18 @@ import { useCallback as useCallback5 } from "react";
660
591
  var useActionBarReload = () => {
661
592
  const messageStore = useMessageStore();
662
593
  const threadStore = useThreadStore();
663
- const threadRuntime = useThreadRuntime();
594
+ const messageRuntime = useMessageRuntime();
664
595
  const threadComposerStore = useThreadComposerStore();
665
596
  const threadViewportStore = useThreadViewportStore();
666
597
  const disabled = useCombinedStore(
667
598
  [threadStore, messageStore],
668
- (t, m) => t.isRunning || t.isDisabled || m.message.role !== "assistant"
599
+ (t, m) => t.isRunning || t.isDisabled || m.role !== "assistant"
669
600
  );
670
601
  const callback = useCallback5(() => {
671
- const { parentId } = messageStore.getState();
672
- threadRuntime.startRun(parentId);
602
+ messageRuntime.reload();
673
603
  threadViewportStore.getState().scrollToBottom();
674
604
  threadComposerStore.getState().focus();
675
- }, [threadRuntime, threadComposerStore, threadViewportStore, messageStore]);
605
+ }, [messageRuntime, threadComposerStore, threadViewportStore]);
676
606
  if (disabled) return null;
677
607
  return callback;
678
608
  };
@@ -682,19 +612,18 @@ import { useCallback as useCallback6 } from "react";
682
612
  var useActionBarSpeak = () => {
683
613
  const messageStore = useMessageStore();
684
614
  const editComposerStore = useEditComposerStore();
685
- const threadRuntime = useThreadRuntime();
615
+ const messageRunime = useMessageRuntime();
686
616
  const messageUtilsStore = useMessageUtilsStore();
687
617
  const hasSpeakableContent = useCombinedStore(
688
618
  [messageStore, editComposerStore],
689
- ({ message }, c) => {
619
+ (message, c) => {
690
620
  return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
691
621
  }
692
622
  );
693
623
  const callback = useCallback6(async () => {
694
- const { message } = messageStore.getState();
695
- const utt = threadRuntime.speak(message.id);
624
+ const utt = messageRunime.speak();
696
625
  messageUtilsStore.getState().addUtterance(utt);
697
- }, [threadRuntime, messageStore, messageUtilsStore]);
626
+ }, [messageRunime, messageUtilsStore]);
698
627
  if (!hasSpeakableContent) return null;
699
628
  return callback;
700
629
  };
@@ -714,79 +643,73 @@ var useActionBarStopSpeaking = () => {
714
643
  // src/primitive-hooks/actionBar/useActionBarFeedbackPositive.tsx
715
644
  import { useCallback as useCallback8 } from "react";
716
645
  var useActionBarFeedbackPositive = () => {
717
- const threadRuntime = useThreadRuntime();
718
- const messageStore = useMessageStore();
646
+ const messageRuntime = useMessageRuntime();
719
647
  const messageUtilsStore = useMessageUtilsStore();
720
648
  const callback = useCallback8(() => {
721
- threadRuntime.submitFeedback({
722
- messageId: messageStore.getState().message.id,
649
+ messageRuntime.submitFeedback({
723
650
  type: "positive"
724
651
  });
725
652
  messageUtilsStore.getState().setSubmittedFeedback("positive");
726
- }, [messageStore, messageUtilsStore, threadRuntime]);
653
+ }, [messageUtilsStore, messageRuntime]);
727
654
  return callback;
728
655
  };
729
656
 
730
657
  // src/primitive-hooks/actionBar/useActionBarFeedbackNegative.tsx
731
658
  import { useCallback as useCallback9 } from "react";
732
659
  var useActionBarFeedbackNegative = () => {
733
- const threadRuntime = useThreadRuntime();
734
- const messageStore = useMessageStore();
660
+ const messageRuntime = useMessageRuntime();
735
661
  const messageUtilsStore = useMessageUtilsStore();
736
662
  const callback = useCallback9(() => {
737
- threadRuntime.submitFeedback({
738
- messageId: messageStore.getState().message.id,
663
+ messageRuntime.submitFeedback({
739
664
  type: "negative"
740
665
  });
741
666
  messageUtilsStore.getState().setSubmittedFeedback("negative");
742
- }, [messageStore, messageUtilsStore, threadRuntime]);
667
+ }, [messageUtilsStore, messageRuntime]);
743
668
  return callback;
744
669
  };
745
670
 
746
671
  // src/primitive-hooks/branchPicker/useBranchPickerCount.tsx
747
672
  var useBranchPickerCount = () => {
748
- const branchCount = useMessage((s) => s.branches.length);
673
+ const branchCount = useMessage((s) => s.branchCount);
749
674
  return branchCount;
750
675
  };
751
676
 
752
677
  // src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
753
678
  import { useCallback as useCallback10 } from "react";
754
679
  var useBranchPickerNext = () => {
680
+ const messageRuntime = useMessageRuntime();
755
681
  const messageStore = useMessageStore();
756
682
  const editComposerStore = useEditComposerStore();
757
- const threadRuntime = useThreadRuntime();
758
683
  const disabled = useCombinedStore(
759
684
  [messageStore, editComposerStore],
760
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
685
+ (m, c) => c.isEditing || m.branchNumber >= m.branchCount
761
686
  );
762
687
  const callback = useCallback10(() => {
763
- const { message, branches } = messageStore.getState();
764
- threadRuntime.switchToBranch(branches[branches.indexOf(message.id) + 1]);
765
- }, [threadRuntime, messageStore]);
688
+ messageRuntime.switchToBranch({ position: "next" });
689
+ }, [messageRuntime]);
766
690
  if (disabled) return null;
767
691
  return callback;
768
692
  };
769
693
 
770
694
  // src/primitive-hooks/branchPicker/useBranchPickerNumber.tsx
771
695
  var useBranchPickerNumber = () => {
772
- const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
773
- return branchIdx + 1;
696
+ const branchNumber = useMessage((s) => s.branchNumber);
697
+ return branchNumber;
774
698
  };
775
699
 
776
700
  // src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
777
701
  import { useCallback as useCallback11 } from "react";
778
702
  var useBranchPickerPrevious = () => {
703
+ const messageRuntime = useMessageRuntime();
779
704
  const messageStore = useMessageStore();
780
705
  const editComposerStore = useEditComposerStore();
781
- const threadRuntime = useThreadRuntime();
782
706
  const disabled = useCombinedStore(
783
707
  [messageStore, editComposerStore],
784
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
708
+ (m, c) => c.isEditing || m.branchNumber <= 1
785
709
  );
786
710
  const callback = useCallback11(() => {
787
- const { message, branches } = messageStore.getState();
788
- threadRuntime.switchToBranch(branches[branches.indexOf(message.id) - 1]);
789
- }, [threadRuntime, messageStore]);
711
+ messageRuntime.switchToBranch({ position: "previous" });
712
+ }, [messageRuntime]);
790
713
  if (disabled) return null;
791
714
  return callback;
792
715
  };
@@ -863,7 +786,7 @@ var useComposerAddAttachment = () => {
863
786
  // src/primitive-hooks/contentPart/useContentPartDisplay.tsx
864
787
  var useContentPartDisplay = () => {
865
788
  const display = useContentPart((c) => {
866
- if (c.part.type !== "ui")
789
+ if (c.type !== "ui")
867
790
  throw new Error(
868
791
  "This component can only be used inside ui content parts."
869
792
  );
@@ -875,7 +798,7 @@ var useContentPartDisplay = () => {
875
798
  // src/primitive-hooks/contentPart/useContentPartImage.tsx
876
799
  var useContentPartImage = () => {
877
800
  const image = useContentPart((c) => {
878
- if (c.part.type !== "image")
801
+ if (c.type !== "image")
879
802
  throw new Error(
880
803
  "ContentPartImage can only be used inside image content parts."
881
804
  );
@@ -887,7 +810,7 @@ var useContentPartImage = () => {
887
810
  // src/primitive-hooks/contentPart/useContentPartText.tsx
888
811
  var useContentPartText = () => {
889
812
  const text = useContentPart((c) => {
890
- if (c.part.type !== "text")
813
+ if (c.type !== "text")
891
814
  throw new Error(
892
815
  "ContentPartText can only be used inside text content parts."
893
816
  );
@@ -902,19 +825,19 @@ var useMessageIf = (props) => {
902
825
  const messageUtilsStore = useMessageUtilsStore();
903
826
  return useCombinedStore(
904
827
  [messageStore, messageUtilsStore],
905
- ({ message, branches, isLast }, { isCopied, isHovering, isSpeaking, submittedFeedback }) => {
906
- if (props.hasBranches === true && branches.length < 2) return false;
907
- if (props.user && message.role !== "user") return false;
908
- if (props.assistant && message.role !== "assistant") return false;
909
- if (props.system && message.role !== "system") return false;
828
+ ({ role, attachments, branchCount, isLast }, { isCopied, isHovering, isSpeaking, submittedFeedback }) => {
829
+ if (props.hasBranches === true && branchCount < 2) return false;
830
+ if (props.user && role !== "user") return false;
831
+ if (props.assistant && role !== "assistant") return false;
832
+ if (props.system && role !== "system") return false;
910
833
  if (props.lastOrHover === true && !isHovering && !isLast) return false;
911
834
  if (props.copied === true && !isCopied) return false;
912
835
  if (props.copied === false && isCopied) return false;
913
836
  if (props.speaking === true && !isSpeaking) return false;
914
837
  if (props.speaking === false && isSpeaking) return false;
915
- if (props.hasAttachments === true && (message.role !== "user" || !message.attachments.length))
838
+ if (props.hasAttachments === true && (role !== "user" || !attachments.length))
916
839
  return false;
917
- if (props.hasAttachments === false && message.role === "user" && !!message.attachments.length)
840
+ if (props.hasAttachments === false && role === "user" && !!attachments.length)
918
841
  return false;
919
842
  if (props.submittedFeedback !== void 0 && submittedFeedback !== props.submittedFeedback)
920
843
  return false;
@@ -925,20 +848,15 @@ var useMessageIf = (props) => {
925
848
 
926
849
  // src/primitive-hooks/thread/useThreadIf.tsx
927
850
  var useThreadIf = (props) => {
928
- const threadStore = useThreadStore();
929
- const threadMessagesStore = useThreadMessagesStore();
930
- return useCombinedStore(
931
- [threadStore, threadMessagesStore],
932
- (thread, messages) => {
933
- if (props.empty === true && messages.length !== 0) return false;
934
- if (props.empty === false && messages.length === 0) return false;
935
- if (props.running === true && !thread.isRunning) return false;
936
- if (props.running === false && thread.isRunning) return false;
937
- if (props.disabled === true && thread.isDisabled) return false;
938
- if (props.disabled === false && thread.isDisabled) return false;
939
- return true;
940
- }
941
- );
851
+ return useThread((thread) => {
852
+ if (props.empty === true && thread.messages.length !== 0) return false;
853
+ if (props.empty === false && thread.messages.length === 0) return false;
854
+ if (props.running === true && !thread.isRunning) return false;
855
+ if (props.running === false && thread.isRunning) return false;
856
+ if (props.disabled === true && thread.isDisabled) return false;
857
+ if (props.disabled === false && thread.isDisabled) return false;
858
+ return true;
859
+ });
942
860
  };
943
861
 
944
862
  // src/primitive-hooks/thread/useThreadEmpty.tsx
@@ -1025,7 +943,7 @@ var useActionBarFloatStatus = ({
1025
943
  };
1026
944
 
1027
945
  // src/primitives/actionBar/ActionBarRoot.tsx
1028
- import { jsx as jsx5 } from "react/jsx-runtime";
946
+ import { jsx as jsx4 } from "react/jsx-runtime";
1029
947
  var ActionBarPrimitiveRoot = forwardRef(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
1030
948
  const hideAndfloatStatus = useActionBarFloatStatus({
1031
949
  hideWhenRunning,
@@ -1033,7 +951,7 @@ var ActionBarPrimitiveRoot = forwardRef(({ hideWhenRunning, autohide, autohideFl
1033
951
  autohideFloat
1034
952
  });
1035
953
  if (hideAndfloatStatus === "hidden" /* Hidden */) return null;
1036
- return /* @__PURE__ */ jsx5(
954
+ return /* @__PURE__ */ jsx4(
1037
955
  Primitive.div,
1038
956
  {
1039
957
  ...hideAndfloatStatus === "floating" /* Floating */ ? { "data-floating": "true" } : null,
@@ -1048,11 +966,11 @@ ActionBarPrimitiveRoot.displayName = "ActionBarPrimitive.Root";
1048
966
  import { forwardRef as forwardRef2 } from "react";
1049
967
  import { composeEventHandlers } from "@radix-ui/primitive";
1050
968
  import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
1051
- import { jsx as jsx6 } from "react/jsx-runtime";
969
+ import { jsx as jsx5 } from "react/jsx-runtime";
1052
970
  var ActionBarPrimitiveCopy = forwardRef2(({ copiedDuration, onClick, disabled, ...props }, forwardedRef) => {
1053
971
  const isCopied = useMessageUtils((u) => u.isCopied);
1054
972
  const callback = useActionBarCopy({ copiedDuration });
1055
- return /* @__PURE__ */ jsx6(
973
+ return /* @__PURE__ */ jsx5(
1056
974
  Primitive2.button,
1057
975
  {
1058
976
  type: "button",
@@ -1072,7 +990,7 @@ ActionBarPrimitiveCopy.displayName = "ActionBarPrimitive.Copy";
1072
990
  import { forwardRef as forwardRef3 } from "react";
1073
991
  import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
1074
992
  import { composeEventHandlers as composeEventHandlers2 } from "@radix-ui/primitive";
1075
- import { jsx as jsx7 } from "react/jsx-runtime";
993
+ import { jsx as jsx6 } from "react/jsx-runtime";
1076
994
  var createActionButton = (displayName, useActionButton, forwardProps = []) => {
1077
995
  const ActionButton = forwardRef3((props, forwardedRef) => {
1078
996
  const forwardedProps = {};
@@ -1085,7 +1003,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
1085
1003
  }
1086
1004
  });
1087
1005
  const callback = useActionButton(forwardedProps);
1088
- return /* @__PURE__ */ jsx7(
1006
+ return /* @__PURE__ */ jsx6(
1089
1007
  Primitive3.button,
1090
1008
  {
1091
1009
  type: "button",
@@ -1125,7 +1043,7 @@ import { forwardRef as forwardRef4 } from "react";
1125
1043
  import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
1126
1044
  import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
1127
1045
  import { composeEventHandlers as composeEventHandlers3 } from "@radix-ui/primitive";
1128
- import { jsx as jsx8 } from "react/jsx-runtime";
1046
+ import { jsx as jsx7 } from "react/jsx-runtime";
1129
1047
  var ActionBarPrimitiveStopSpeaking = forwardRef4((props, ref) => {
1130
1048
  const callback = useActionBarStopSpeaking();
1131
1049
  useEscapeKeydown((e) => {
@@ -1134,7 +1052,7 @@ var ActionBarPrimitiveStopSpeaking = forwardRef4((props, ref) => {
1134
1052
  callback();
1135
1053
  }
1136
1054
  });
1137
- return /* @__PURE__ */ jsx8(
1055
+ return /* @__PURE__ */ jsx7(
1138
1056
  Primitive4.button,
1139
1057
  {
1140
1058
  type: "button",
@@ -1153,13 +1071,13 @@ ActionBarPrimitiveStopSpeaking.displayName = "ActionBarPrimitive.StopSpeaking";
1153
1071
  import { forwardRef as forwardRef5 } from "react";
1154
1072
  import { composeEventHandlers as composeEventHandlers4 } from "@radix-ui/primitive";
1155
1073
  import { Primitive as Primitive5 } from "@radix-ui/react-primitive";
1156
- import { jsx as jsx9 } from "react/jsx-runtime";
1074
+ import { jsx as jsx8 } from "react/jsx-runtime";
1157
1075
  var ActionBarPrimitiveFeedbackPositive = forwardRef5(({ onClick, disabled, ...props }, forwardedRef) => {
1158
1076
  const isSubmitted = useMessageUtils(
1159
1077
  (u) => u.submittedFeedback === "positive"
1160
1078
  );
1161
1079
  const callback = useActionBarFeedbackPositive();
1162
- return /* @__PURE__ */ jsx9(
1080
+ return /* @__PURE__ */ jsx8(
1163
1081
  Primitive5.button,
1164
1082
  {
1165
1083
  type: "button",
@@ -1179,13 +1097,13 @@ ActionBarPrimitiveFeedbackPositive.displayName = "ActionBarPrimitive.FeedbackPos
1179
1097
  import { forwardRef as forwardRef6 } from "react";
1180
1098
  import { composeEventHandlers as composeEventHandlers5 } from "@radix-ui/primitive";
1181
1099
  import { Primitive as Primitive6 } from "@radix-ui/react-primitive";
1182
- import { jsx as jsx10 } from "react/jsx-runtime";
1100
+ import { jsx as jsx9 } from "react/jsx-runtime";
1183
1101
  var ActionBarPrimitiveFeedbackNegative = forwardRef6(({ onClick, disabled, ...props }, forwardedRef) => {
1184
1102
  const isSubmitted = useMessageUtils(
1185
1103
  (u) => u.submittedFeedback === "negative"
1186
1104
  );
1187
1105
  const callback = useActionBarFeedbackNegative();
1188
- return /* @__PURE__ */ jsx10(
1106
+ return /* @__PURE__ */ jsx9(
1189
1107
  Primitive6.button,
1190
1108
  {
1191
1109
  type: "button",
@@ -1233,7 +1151,7 @@ import * as PopoverPrimitive from "@radix-ui/react-popover";
1233
1151
  var usePopoverScope = PopoverPrimitive.createPopoverScope();
1234
1152
 
1235
1153
  // src/primitives/assistantModal/AssistantModalRoot.tsx
1236
- import { jsx as jsx11 } from "react/jsx-runtime";
1154
+ import { jsx as jsx10 } from "react/jsx-runtime";
1237
1155
  var useAssistantModalOpenState = (defaultOpen = false) => {
1238
1156
  const state = useState4(defaultOpen);
1239
1157
  const [, setOpen] = state;
@@ -1251,7 +1169,7 @@ var AssistantModalPrimitiveRoot = ({
1251
1169
  }) => {
1252
1170
  const scope = usePopoverScope(__scopeAssistantModal);
1253
1171
  const [modalOpen, setOpen] = useAssistantModalOpenState(defaultOpen);
1254
- return /* @__PURE__ */ jsx11(
1172
+ return /* @__PURE__ */ jsx10(
1255
1173
  PopoverPrimitive2.Root,
1256
1174
  {
1257
1175
  ...scope,
@@ -1266,14 +1184,14 @@ AssistantModalPrimitiveRoot.displayName = "AssistantModalPrimitive.Root";
1266
1184
  // src/primitives/assistantModal/AssistantModalTrigger.tsx
1267
1185
  import { forwardRef as forwardRef7 } from "react";
1268
1186
  import * as PopoverPrimitive3 from "@radix-ui/react-popover";
1269
- import { jsx as jsx12 } from "react/jsx-runtime";
1187
+ import { jsx as jsx11 } from "react/jsx-runtime";
1270
1188
  var AssistantModalPrimitiveTrigger = forwardRef7(
1271
1189
  ({
1272
1190
  __scopeAssistantModal,
1273
1191
  ...rest
1274
1192
  }, ref) => {
1275
1193
  const scope = usePopoverScope(__scopeAssistantModal);
1276
- return /* @__PURE__ */ jsx12(PopoverPrimitive3.Trigger, { ...scope, ...rest, ref });
1194
+ return /* @__PURE__ */ jsx11(PopoverPrimitive3.Trigger, { ...scope, ...rest, ref });
1277
1195
  }
1278
1196
  );
1279
1197
  AssistantModalPrimitiveTrigger.displayName = "AssistantModalPrimitive.Trigger";
@@ -1282,7 +1200,7 @@ AssistantModalPrimitiveTrigger.displayName = "AssistantModalPrimitive.Trigger";
1282
1200
  import { forwardRef as forwardRef8 } from "react";
1283
1201
  import * as PopoverPrimitive4 from "@radix-ui/react-popover";
1284
1202
  import { composeEventHandlers as composeEventHandlers7 } from "@radix-ui/primitive";
1285
- import { jsx as jsx13 } from "react/jsx-runtime";
1203
+ import { jsx as jsx12 } from "react/jsx-runtime";
1286
1204
  var AssistantModalPrimitiveContent = forwardRef8(
1287
1205
  ({
1288
1206
  __scopeAssistantModal,
@@ -1293,7 +1211,7 @@ var AssistantModalPrimitiveContent = forwardRef8(
1293
1211
  ...props
1294
1212
  }, forwardedRef) => {
1295
1213
  const scope = usePopoverScope(__scopeAssistantModal);
1296
- return /* @__PURE__ */ jsx13(PopoverPrimitive4.Portal, { ...scope, children: /* @__PURE__ */ jsx13(
1214
+ return /* @__PURE__ */ jsx12(PopoverPrimitive4.Portal, { ...scope, children: /* @__PURE__ */ jsx12(
1297
1215
  PopoverPrimitive4.Content,
1298
1216
  {
1299
1217
  ...scope,
@@ -1314,14 +1232,14 @@ AssistantModalPrimitiveContent.displayName = "AssistantModalPrimitive.Content";
1314
1232
  // src/primitives/assistantModal/AssistantModalAnchor.tsx
1315
1233
  import { forwardRef as forwardRef9 } from "react";
1316
1234
  import * as PopoverPrimitive5 from "@radix-ui/react-popover";
1317
- import { jsx as jsx14 } from "react/jsx-runtime";
1235
+ import { jsx as jsx13 } from "react/jsx-runtime";
1318
1236
  var AssistantModalPrimitiveAnchor = forwardRef9(
1319
1237
  ({
1320
1238
  __scopeAssistantModal,
1321
1239
  ...rest
1322
1240
  }, ref) => {
1323
1241
  const scope = usePopoverScope(__scopeAssistantModal);
1324
- return /* @__PURE__ */ jsx14(PopoverPrimitive5.Anchor, { ...scope, ...rest, ref });
1242
+ return /* @__PURE__ */ jsx13(PopoverPrimitive5.Anchor, { ...scope, ...rest, ref });
1325
1243
  }
1326
1244
  );
1327
1245
  AssistantModalPrimitiveAnchor.displayName = "AssistantModalPrimitive.Anchor";
@@ -1349,18 +1267,18 @@ var BranchPickerPrevious = createActionButton(
1349
1267
  );
1350
1268
 
1351
1269
  // src/primitives/branchPicker/BranchPickerCount.tsx
1352
- import { Fragment, jsx as jsx15 } from "react/jsx-runtime";
1270
+ import { Fragment, jsx as jsx14 } from "react/jsx-runtime";
1353
1271
  var BranchPickerPrimitiveCount = () => {
1354
1272
  const branchCount = useBranchPickerCount();
1355
- return /* @__PURE__ */ jsx15(Fragment, { children: branchCount });
1273
+ return /* @__PURE__ */ jsx14(Fragment, { children: branchCount });
1356
1274
  };
1357
1275
  BranchPickerPrimitiveCount.displayName = "BranchPickerPrimitive.Count";
1358
1276
 
1359
1277
  // src/primitives/branchPicker/BranchPickerNumber.tsx
1360
- import { Fragment as Fragment2, jsx as jsx16 } from "react/jsx-runtime";
1278
+ import { Fragment as Fragment2, jsx as jsx15 } from "react/jsx-runtime";
1361
1279
  var BranchPickerPrimitiveNumber = () => {
1362
1280
  const branchNumber = useBranchPickerNumber();
1363
- return /* @__PURE__ */ jsx16(Fragment2, { children: branchNumber });
1281
+ return /* @__PURE__ */ jsx15(Fragment2, { children: branchNumber });
1364
1282
  };
1365
1283
  BranchPickerPrimitiveNumber.displayName = "BranchPickerPrimitive.Number";
1366
1284
 
@@ -1386,9 +1304,9 @@ import {
1386
1304
  } from "react";
1387
1305
 
1388
1306
  // src/utils/hooks/useManagedRef.ts
1389
- import { useCallback as useCallback17, useRef as useRef2 } from "react";
1307
+ import { useCallback as useCallback17, useRef } from "react";
1390
1308
  var useManagedRef = (callback) => {
1391
- const cleanupRef = useRef2();
1309
+ const cleanupRef = useRef();
1392
1310
  const ref = useCallback17(
1393
1311
  (el) => {
1394
1312
  if (cleanupRef.current) {
@@ -1405,7 +1323,7 @@ var useManagedRef = (callback) => {
1405
1323
 
1406
1324
  // src/primitives/message/MessageRoot.tsx
1407
1325
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
1408
- import { jsx as jsx17 } from "react/jsx-runtime";
1326
+ import { jsx as jsx16 } from "react/jsx-runtime";
1409
1327
  var useIsHoveringRef = () => {
1410
1328
  const messageUtilsStore = useMessageUtilsStore();
1411
1329
  const callbackRef = useCallback18(
@@ -1432,7 +1350,7 @@ var useIsHoveringRef = () => {
1432
1350
  var MessagePrimitiveRoot = forwardRef10((props, forwardRef33) => {
1433
1351
  const isHoveringRef = useIsHoveringRef();
1434
1352
  const ref = useComposedRefs(forwardRef33, isHoveringRef);
1435
- return /* @__PURE__ */ jsx17(Primitive7.div, { ...props, ref });
1353
+ return /* @__PURE__ */ jsx16(Primitive7.div, { ...props, ref });
1436
1354
  });
1437
1355
  MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
1438
1356
 
@@ -1447,77 +1365,38 @@ var MessagePrimitiveIf = ({
1447
1365
  MessagePrimitiveIf.displayName = "MessagePrimitive.If";
1448
1366
 
1449
1367
  // src/primitives/message/MessageContent.tsx
1450
- import { memo as memo2 } from "react";
1368
+ import { memo as memo2, useMemo as useMemo6 } from "react";
1451
1369
 
1452
- // src/context/providers/ContentPartProvider.tsx
1370
+ // src/context/providers/ContentPartRuntimeProvider.tsx
1453
1371
  import { useEffect as useEffect8, useState as useState5 } from "react";
1454
- import { create as create9 } from "zustand";
1455
- import { jsx as jsx18 } from "react/jsx-runtime";
1456
- var COMPLETE_STATUS2 = {
1457
- type: "complete"
1458
- };
1459
- var toContentPartStatus = (message, partIndex, part) => {
1460
- if (message.role !== "assistant") return COMPLETE_STATUS2;
1461
- const isLastPart = partIndex === Math.max(0, message.content.length - 1);
1462
- if (part.type !== "tool-call") {
1463
- if ("reason" in message.status && message.status.reason === "tool-calls" && isLastPart)
1464
- throw new Error(
1465
- "Encountered unexpected requires-action status. This is likely an internal bug in assistant-ui."
1466
- );
1467
- return isLastPart ? message.status : COMPLETE_STATUS2;
1468
- }
1469
- if (!!part.result) {
1470
- return COMPLETE_STATUS2;
1471
- }
1472
- return message.status;
1473
- };
1474
- var EMPTY_CONTENT = Object.freeze({ type: "text", text: "" });
1475
- var getContentPartState = ({ message }, useContentPart2, partIndex) => {
1476
- let part = message.content[partIndex];
1477
- if (!part) {
1478
- if (message.content.length === 0 && partIndex === 0) {
1479
- part = EMPTY_CONTENT;
1480
- } else {
1481
- return null;
1482
- }
1483
- } else if (message.content.length === 1 && part.type === "text" && part.text.length === 0) {
1484
- part = EMPTY_CONTENT;
1485
- }
1486
- const status = toContentPartStatus(message, partIndex, part);
1487
- const currentState = useContentPart2?.getState();
1488
- if (currentState && currentState.part === part && currentState.status === status)
1489
- return null;
1490
- return Object.freeze({ part, status });
1372
+ import { create as create6 } from "zustand";
1373
+ import { jsx as jsx17 } from "react/jsx-runtime";
1374
+ var useContentPartRuntimeStore = (runtime) => {
1375
+ const [store] = useState5(() => create6(() => runtime));
1376
+ useEffect8(() => {
1377
+ writableStore(store).setState(runtime, true);
1378
+ }, [runtime, store]);
1379
+ return store;
1491
1380
  };
1492
- var useContentPartContext2 = (partIndex) => {
1493
- const messageStore = useMessageStore();
1494
- const [context] = useState5(() => {
1495
- const useContentPart2 = create9(
1496
- () => getContentPartState(messageStore.getState(), void 0, partIndex)
1497
- );
1498
- return { useContentPart: useContentPart2 };
1499
- });
1381
+ var useContentPartStore2 = (runtime) => {
1382
+ const [store] = useState5(() => create6(() => runtime.getState()));
1500
1383
  useEffect8(() => {
1501
- const syncContentPart = (message) => {
1502
- const newState = getContentPartState(
1503
- message,
1504
- context.useContentPart,
1505
- partIndex
1506
- );
1507
- if (!newState) return;
1508
- writableStore(context.useContentPart).setState(newState, true);
1509
- };
1510
- syncContentPart(messageStore.getState());
1511
- return messageStore.subscribe(syncContentPart);
1512
- }, [context, messageStore, partIndex]);
1513
- return context;
1384
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
1385
+ updateState();
1386
+ return runtime.subscribe(updateState);
1387
+ }, [runtime, store]);
1388
+ return store;
1514
1389
  };
1515
- var ContentPartProvider = ({
1516
- partIndex,
1390
+ var ContentPartRuntimeProvider = ({
1391
+ runtime,
1517
1392
  children
1518
1393
  }) => {
1519
- const context = useContentPartContext2(partIndex);
1520
- return /* @__PURE__ */ jsx18(ContentPartContext.Provider, { value: context, children });
1394
+ const useContentPartRuntime2 = useContentPartRuntimeStore(runtime);
1395
+ const useContentPart2 = useContentPartStore2(runtime);
1396
+ const [context] = useState5(() => {
1397
+ return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
1398
+ });
1399
+ return /* @__PURE__ */ jsx17(ContentPartContext.Provider, { value: context, children });
1521
1400
  };
1522
1401
 
1523
1402
  // src/primitives/contentPart/ContentPartText.tsx
@@ -1526,7 +1405,7 @@ import {
1526
1405
  } from "react";
1527
1406
 
1528
1407
  // src/utils/smooth/useSmooth.tsx
1529
- import { useEffect as useEffect9, useMemo as useMemo3, useRef as useRef3, useState as useState7 } from "react";
1408
+ import { useEffect as useEffect9, useMemo as useMemo5, useRef as useRef2, useState as useState7 } from "react";
1530
1409
  import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
1531
1410
 
1532
1411
  // src/utils/smooth/SmoothContext.tsx
@@ -1536,11 +1415,11 @@ import {
1536
1415
  useContext as useContext2,
1537
1416
  useState as useState6
1538
1417
  } from "react";
1539
- import { create as create10 } from "zustand";
1540
- import { jsx as jsx19 } from "react/jsx-runtime";
1418
+ import { create as create7 } from "zustand";
1419
+ import { jsx as jsx18 } from "react/jsx-runtime";
1541
1420
  var SmoothContext = createContext5(null);
1542
1421
  var makeSmoothContext = (initialState) => {
1543
- const useSmoothStatus2 = create10(() => initialState);
1422
+ const useSmoothStatus2 = create7(() => initialState);
1544
1423
  return { useSmoothStatus: useSmoothStatus2 };
1545
1424
  };
1546
1425
  var SmoothContextProvider = ({ children }) => {
@@ -1550,11 +1429,11 @@ var SmoothContextProvider = ({ children }) => {
1550
1429
  () => makeSmoothContext(contentPartStore.getState().status)
1551
1430
  );
1552
1431
  if (outer) return children;
1553
- return /* @__PURE__ */ jsx19(SmoothContext.Provider, { value: context, children });
1432
+ return /* @__PURE__ */ jsx18(SmoothContext.Provider, { value: context, children });
1554
1433
  };
1555
1434
  var withSmoothContextProvider = (Component) => {
1556
1435
  const Wrapped = forwardRef11((props, ref) => {
1557
- return /* @__PURE__ */ jsx19(SmoothContextProvider, { children: /* @__PURE__ */ jsx19(Component, { ...props, ref }) });
1436
+ return /* @__PURE__ */ jsx18(SmoothContextProvider, { children: /* @__PURE__ */ jsx18(Component, { ...props, ref }) });
1558
1437
  });
1559
1438
  Wrapped.displayName = Component.displayName;
1560
1439
  return Wrapped;
@@ -1621,31 +1500,29 @@ var SMOOTH_STATUS = Object.freeze({
1621
1500
  type: "running"
1622
1501
  });
1623
1502
  var useSmooth = (state, smooth = false) => {
1624
- const {
1625
- part: { text }
1626
- } = state;
1503
+ const { text } = state;
1627
1504
  const id = useMessage({
1628
1505
  optional: true,
1629
- selector: (m) => m.message.id
1506
+ selector: (m) => m.id
1630
1507
  });
1631
- const idRef = useRef3(id);
1508
+ const idRef = useRef2(id);
1632
1509
  const [displayedText, setDisplayedText] = useState7(text);
1633
1510
  const smoothStatusStore = useSmoothStatusStore({ optional: true });
1634
1511
  const setText = useCallbackRef2((text2) => {
1635
1512
  setDisplayedText(text2);
1636
1513
  if (smoothStatusStore) {
1637
1514
  writableStore(smoothStatusStore).setState(
1638
- text2 !== state.part.text ? SMOOTH_STATUS : state.status
1515
+ text2 !== state.text ? SMOOTH_STATUS : state.status
1639
1516
  );
1640
1517
  }
1641
1518
  });
1642
1519
  useEffect9(() => {
1643
1520
  if (smoothStatusStore) {
1644
1521
  writableStore(smoothStatusStore).setState(
1645
- text !== state.part.text ? SMOOTH_STATUS : state.status
1522
+ text !== state.text ? SMOOTH_STATUS : state.status
1646
1523
  );
1647
1524
  }
1648
- }, [smoothStatusStore, text, displayedText, state.status, state.part.text]);
1525
+ }, [smoothStatusStore, text, displayedText, state.status, state.text]);
1649
1526
  const [animatorRef] = useState7(
1650
1527
  new TextStreamAnimator(text, setText)
1651
1528
  );
@@ -1670,8 +1547,10 @@ var useSmooth = (state, smooth = false) => {
1670
1547
  animatorRef.stop();
1671
1548
  };
1672
1549
  }, [animatorRef]);
1673
- return useMemo3(
1550
+ return useMemo5(
1674
1551
  () => smooth ? {
1552
+ type: "text",
1553
+ text: displayedText,
1675
1554
  part: { type: "text", text: displayedText },
1676
1555
  status: text === displayedText ? state.status : SMOOTH_STATUS
1677
1556
  } : state,
@@ -1680,33 +1559,26 @@ var useSmooth = (state, smooth = false) => {
1680
1559
  };
1681
1560
 
1682
1561
  // src/primitives/contentPart/ContentPartText.tsx
1683
- import { jsx as jsx20 } from "react/jsx-runtime";
1562
+ import { jsx as jsx19 } from "react/jsx-runtime";
1684
1563
  var ContentPartPrimitiveText = forwardRef12(({ smooth = true, component: Component = "span", ...rest }, forwardedRef) => {
1685
- const {
1686
- part: { text },
1687
- status
1688
- } = useSmooth(useContentPartText(), smooth);
1689
- return /* @__PURE__ */ jsx20(Component, { "data-status": status.type, ...rest, ref: forwardedRef, children: text });
1564
+ const { text, status } = useSmooth(useContentPartText(), smooth);
1565
+ return /* @__PURE__ */ jsx19(Component, { "data-status": status.type, ...rest, ref: forwardedRef, children: text });
1690
1566
  });
1691
1567
  ContentPartPrimitiveText.displayName = "ContentPartPrimitive.Text";
1692
1568
 
1693
1569
  // src/primitives/contentPart/ContentPartImage.tsx
1694
1570
  import { Primitive as Primitive8 } from "@radix-ui/react-primitive";
1695
1571
  import { forwardRef as forwardRef13 } from "react";
1696
- import { jsx as jsx21 } from "react/jsx-runtime";
1572
+ import { jsx as jsx20 } from "react/jsx-runtime";
1697
1573
  var ContentPartPrimitiveImage = forwardRef13((props, forwardedRef) => {
1698
- const {
1699
- part: { image }
1700
- } = useContentPartImage();
1701
- return /* @__PURE__ */ jsx21(Primitive8.img, { src: image, ...props, ref: forwardedRef });
1574
+ const { image } = useContentPartImage();
1575
+ return /* @__PURE__ */ jsx20(Primitive8.img, { src: image, ...props, ref: forwardedRef });
1702
1576
  });
1703
1577
  ContentPartPrimitiveImage.displayName = "ContentPartPrimitive.Image";
1704
1578
 
1705
1579
  // src/primitives/contentPart/ContentPartDisplay.tsx
1706
1580
  var ContentPartPrimitiveDisplay = () => {
1707
- const {
1708
- part: { display }
1709
- } = useContentPartDisplay();
1581
+ const { display } = useContentPartDisplay();
1710
1582
  return display ?? null;
1711
1583
  };
1712
1584
  ContentPartPrimitiveDisplay.displayName = "ContentPartPrimitive.Display";
@@ -1718,28 +1590,399 @@ var ContentPartPrimitiveInProgress = ({ children }) => {
1718
1590
  };
1719
1591
  ContentPartPrimitiveInProgress.displayName = "ContentPartPrimitive.InProgress";
1720
1592
 
1721
- // src/primitives/message/MessageContent.tsx
1722
- import { jsx as jsx22, jsxs as jsxs2 } from "react/jsx-runtime";
1723
- var ToolUIDisplay = ({
1724
- UI,
1725
- ...props
1726
- }) => {
1727
- const Render = useToolUIs((s) => s.getToolUI(props.part.toolName)) ?? UI;
1728
- if (!Render) return null;
1729
- return /* @__PURE__ */ jsx22(Render, { ...props });
1593
+ // src/api/ComposerRuntime.ts
1594
+ var METHOD_NOT_SUPPORTED = () => {
1595
+ throw new Error("Composer is not available");
1730
1596
  };
1731
- var defaultComponents = {
1732
- Text: () => /* @__PURE__ */ jsxs2("p", { style: { whiteSpace: "pre-line" }, children: [
1733
- /* @__PURE__ */ jsx22(ContentPartPrimitiveText, {}),
1734
- /* @__PURE__ */ jsx22(ContentPartPrimitiveInProgress, { children: /* @__PURE__ */ jsx22("span", { style: { fontFamily: "revert" }, children: " \u25CF" }) })
1735
- ] }),
1736
- Image: () => /* @__PURE__ */ jsx22(ContentPartPrimitiveImage, {}),
1737
- UI: () => /* @__PURE__ */ jsx22(ContentPartPrimitiveDisplay, {})
1597
+ var EMPTY_ARRAY = Object.freeze([]);
1598
+ var getThreadComposerState = (type, runtime, beginEdit, focus, onFocus) => {
1599
+ return Object.freeze({
1600
+ type,
1601
+ isEditing: runtime?.isEditing ?? false,
1602
+ canCancel: runtime?.canCancel ?? false,
1603
+ isEmpty: runtime?.isEmpty ?? true,
1604
+ text: runtime?.text ?? "",
1605
+ attachments: runtime?.attachments ?? EMPTY_ARRAY,
1606
+ attachmentAccept: runtime?.attachmentAccept ?? "*",
1607
+ value: runtime?.text ?? "",
1608
+ setValue: runtime?.setText.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1609
+ setText: runtime?.setText.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1610
+ edit: beginEdit,
1611
+ send: runtime?.send.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1612
+ cancel: runtime?.cancel.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1613
+ focus: focus ?? METHOD_NOT_SUPPORTED,
1614
+ onFocus: onFocus ?? METHOD_NOT_SUPPORTED,
1615
+ reset: runtime?.reset.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1616
+ addAttachment: runtime?.addAttachment.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1617
+ removeAttachment: runtime?.removeAttachment.bind(runtime) ?? METHOD_NOT_SUPPORTED
1618
+ });
1738
1619
  };
1739
- var MessageContentPartComponent = ({
1740
- components: {
1741
- Text: Text2 = defaultComponents.Text,
1742
- Empty,
1620
+ var ComposerRuntime = class {
1621
+ constructor(_core, _beginEdit) {
1622
+ this._core = _core;
1623
+ this._beginEdit = _beginEdit;
1624
+ }
1625
+ get type() {
1626
+ return this._beginEdit ? "edit" : "thread";
1627
+ }
1628
+ /**
1629
+ * @deprecated Use `getState().isEditing` instead. This will be removed in 0.6.0.
1630
+ */
1631
+ get isEditing() {
1632
+ return this.getState().isEditing;
1633
+ }
1634
+ /**
1635
+ * @deprecated Use `getState().isEmpty` instead. This will be removed in 0.6.0.
1636
+ */
1637
+ get isEmpty() {
1638
+ return this.getState().isEmpty;
1639
+ }
1640
+ /**
1641
+ * @deprecated Use `getState().canCancel` instead. This will be removed in 0.6.0.
1642
+ */
1643
+ get canCancel() {
1644
+ return this.getState().canCancel;
1645
+ }
1646
+ /**
1647
+ * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
1648
+ */
1649
+ get text() {
1650
+ return this.getState().text;
1651
+ }
1652
+ /**
1653
+ * @deprecated Use `getState().attachmentAccept` instead. This will be removed in 0.6.0.
1654
+ */
1655
+ get attachmentAccept() {
1656
+ return this.getState().attachmentAccept;
1657
+ }
1658
+ // TODO should this instead return getAttachmentByIndex([idx]) instead?
1659
+ /**
1660
+ * @deprecated Use `getState().attachments` instead. This will be removed in 0.6.0.
1661
+ */
1662
+ get attachments() {
1663
+ return this.getState().attachments;
1664
+ }
1665
+ /**
1666
+ * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
1667
+ */
1668
+ get value() {
1669
+ return this.text;
1670
+ }
1671
+ getState() {
1672
+ return getThreadComposerState(
1673
+ this.type,
1674
+ this._core.getState(),
1675
+ this._beginEdit?.bind(this) ?? METHOD_NOT_SUPPORTED,
1676
+ this.focus.bind(this),
1677
+ this.onFocus.bind(this)
1678
+ );
1679
+ }
1680
+ setText(text) {
1681
+ const core = this._core.getState();
1682
+ if (!core) throw new Error("Composer is not available");
1683
+ core.setText(text);
1684
+ }
1685
+ setValue(text) {
1686
+ this.setText(text);
1687
+ }
1688
+ addAttachment(file) {
1689
+ const core = this._core.getState();
1690
+ if (!core) throw new Error("Composer is not available");
1691
+ return core.addAttachment(file);
1692
+ }
1693
+ // /**
1694
+ // * @deprecated Use `getAttachmentById(id).removeAttachment` instead. This will be removed in 0.6.0.
1695
+ // */
1696
+ removeAttachment(attachmentId) {
1697
+ const core = this._core.getState();
1698
+ if (!core) throw new Error("Composer is not available");
1699
+ return core.removeAttachment(attachmentId);
1700
+ }
1701
+ /**
1702
+ * @deprecated This method will be removed in 0.6.0. Submit feedback if you need this functionality.
1703
+ */
1704
+ reset() {
1705
+ const core = this._core.getState();
1706
+ if (!core) throw new Error("Composer is not available");
1707
+ core.reset();
1708
+ }
1709
+ send() {
1710
+ const core = this._core.getState();
1711
+ if (!core) throw new Error("Composer is not available");
1712
+ core.send();
1713
+ }
1714
+ cancel() {
1715
+ const core = this._core.getState();
1716
+ if (!core) throw new Error("Composer is not available");
1717
+ core.cancel();
1718
+ }
1719
+ beginEdit() {
1720
+ this._beginEdit?.();
1721
+ }
1722
+ /**
1723
+ * @deprecated Use `beginEdit()` instead. This will be removed in 0.6.0.
1724
+ */
1725
+ edit() {
1726
+ this.beginEdit();
1727
+ }
1728
+ subscribe(callback) {
1729
+ return this._core.subscribe(callback);
1730
+ }
1731
+ _focusListeners = /* @__PURE__ */ new Set();
1732
+ focus() {
1733
+ this._focusListeners.forEach((callback) => callback());
1734
+ }
1735
+ onFocus(callback) {
1736
+ this._focusListeners.add(callback);
1737
+ return () => this._focusListeners.delete(callback);
1738
+ }
1739
+ };
1740
+
1741
+ // src/api/subscribable/BaseSubject.ts
1742
+ var BaseSubject = class {
1743
+ _subscriptions = /* @__PURE__ */ new Set();
1744
+ _connection;
1745
+ get isConnected() {
1746
+ return !!this._connection;
1747
+ }
1748
+ notifySubscribers() {
1749
+ for (const callback of this._subscriptions) callback();
1750
+ }
1751
+ _updateConnection() {
1752
+ if (this._subscriptions.size > 0) {
1753
+ if (this._connection) return;
1754
+ this._connection = this._connect();
1755
+ } else {
1756
+ this._connection?.();
1757
+ this._connection = void 0;
1758
+ }
1759
+ }
1760
+ subscribe(callback) {
1761
+ this._subscriptions.add(callback);
1762
+ this._updateConnection();
1763
+ return () => {
1764
+ this._subscriptions.delete(callback);
1765
+ this._updateConnection();
1766
+ };
1767
+ }
1768
+ };
1769
+
1770
+ // src/api/subscribable/NestedSubscriptionSubject.ts
1771
+ var NestedSubscriptionSubject = class extends BaseSubject {
1772
+ constructor(binding) {
1773
+ super();
1774
+ this.binding = binding;
1775
+ }
1776
+ getState() {
1777
+ return this.binding.getState();
1778
+ }
1779
+ _connect() {
1780
+ const callback = () => {
1781
+ this.notifySubscribers();
1782
+ };
1783
+ let lastState = this.binding.getState();
1784
+ let innerUnsubscribe = lastState?.subscribe(callback);
1785
+ const onRuntimeUpdate = () => {
1786
+ const newState = this.binding.getState();
1787
+ if (newState === lastState) return;
1788
+ lastState = newState;
1789
+ innerUnsubscribe?.();
1790
+ innerUnsubscribe = this.binding.getState()?.subscribe(callback);
1791
+ callback();
1792
+ };
1793
+ const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
1794
+ return () => {
1795
+ outerUnsubscribe?.();
1796
+ innerUnsubscribe?.();
1797
+ };
1798
+ }
1799
+ };
1800
+
1801
+ // src/api/subscribable/shallowEqual.ts
1802
+ function shallowEqual(objA, objB) {
1803
+ if (objA === void 0 && objB === void 0) return true;
1804
+ if (objA === void 0) return false;
1805
+ if (objB === void 0) return false;
1806
+ for (const key of Object.keys(objA)) {
1807
+ const valueA = objA[key];
1808
+ const valueB = objB[key];
1809
+ if (!Object.is(valueA, valueB)) return false;
1810
+ }
1811
+ return true;
1812
+ }
1813
+
1814
+ // src/api/subscribable/ShallowMemoizeSubject.ts
1815
+ var ShallowMemoizeSubject = class extends BaseSubject {
1816
+ constructor(binding) {
1817
+ super();
1818
+ this.binding = binding;
1819
+ const state = binding.getState();
1820
+ if (state === void 0)
1821
+ throw new Error("Entry not available in the store");
1822
+ this._previousState = state;
1823
+ }
1824
+ _previousState;
1825
+ getState = () => {
1826
+ if (!this.isConnected) this._syncState();
1827
+ return this._previousState;
1828
+ };
1829
+ _syncState() {
1830
+ const state = this.binding.getState();
1831
+ if (state === void 0) return false;
1832
+ if (shallowEqual(state, this._previousState)) return false;
1833
+ this._previousState = state;
1834
+ return true;
1835
+ }
1836
+ _connect() {
1837
+ const callback = () => {
1838
+ if (this._syncState()) {
1839
+ this.notifySubscribers();
1840
+ }
1841
+ };
1842
+ return this.binding.subscribe(callback);
1843
+ }
1844
+ };
1845
+
1846
+ // src/api/MessageRuntime.ts
1847
+ var COMPLETE_STATUS2 = {
1848
+ type: "complete"
1849
+ };
1850
+ var toContentPartStatus = (message, partIndex, part) => {
1851
+ if (message.role !== "assistant") return COMPLETE_STATUS2;
1852
+ const isLastPart = partIndex === Math.max(0, message.content.length - 1);
1853
+ if (part.type !== "tool-call") {
1854
+ if ("reason" in message.status && message.status.reason === "tool-calls" && isLastPart)
1855
+ throw new Error(
1856
+ "Encountered unexpected requires-action status. This is likely an internal bug in assistant-ui."
1857
+ );
1858
+ return isLastPart ? message.status : COMPLETE_STATUS2;
1859
+ }
1860
+ if (!!part.result) {
1861
+ return COMPLETE_STATUS2;
1862
+ }
1863
+ return message.status;
1864
+ };
1865
+ var EMPTY_CONTENT = Object.freeze({ type: "text", text: "" });
1866
+ var getContentPartState = (message, partIndex) => {
1867
+ let part = message.content[partIndex];
1868
+ if (!part) {
1869
+ if (message.content.length === 0 && partIndex === 0) {
1870
+ part = EMPTY_CONTENT;
1871
+ } else {
1872
+ return void 0;
1873
+ }
1874
+ } else if (message.content.length === 1 && part.type === "text" && part.text.length === 0) {
1875
+ part = EMPTY_CONTENT;
1876
+ }
1877
+ const status = toContentPartStatus(message, partIndex, part);
1878
+ return Object.freeze({ ...part, part, status });
1879
+ };
1880
+ var MessageRuntime = class {
1881
+ constructor(_core, _threadBinding) {
1882
+ this._core = _core;
1883
+ this._threadBinding = _threadBinding;
1884
+ }
1885
+ composer = new ComposerRuntime(
1886
+ new NestedSubscriptionSubject({
1887
+ getState: () => this._threadBinding.getState().getEditComposer(this._core.getState().id),
1888
+ subscribe: (callback) => this._threadBinding.subscribe(callback)
1889
+ }),
1890
+ () => this._threadBinding.getState().beginEdit(this._core.getState().id)
1891
+ );
1892
+ getState() {
1893
+ return this._core.getState();
1894
+ }
1895
+ // TODO improve type
1896
+ unstable_edit(message) {
1897
+ const state = this._core.getState();
1898
+ if (!state) throw new Error("Message is not available");
1899
+ this._threadBinding.getState().append({
1900
+ ...message,
1901
+ parentId: state.parentId
1902
+ });
1903
+ }
1904
+ reload() {
1905
+ const state = this._core.getState();
1906
+ if (!state) throw new Error("Message is not available");
1907
+ if (state.role !== "assistant")
1908
+ throw new Error("Can only reload assistant messages");
1909
+ this._threadBinding.getState().startRun(state.parentId);
1910
+ }
1911
+ speak() {
1912
+ const state = this._core.getState();
1913
+ if (!state) throw new Error("Message is not available");
1914
+ return this._threadBinding.getState().speak(state.id);
1915
+ }
1916
+ submitFeedback({ type }) {
1917
+ const state = this._core.getState();
1918
+ if (!state) throw new Error("Message is not available");
1919
+ this._threadBinding.getState().submitFeedback({
1920
+ messageId: state.id,
1921
+ type
1922
+ });
1923
+ }
1924
+ switchToBranch({
1925
+ position,
1926
+ branchId
1927
+ }) {
1928
+ const state = this._core.getState();
1929
+ if (!state) throw new Error("Message is not available");
1930
+ if (branchId && position) {
1931
+ throw new Error("May not specify both branchId and position");
1932
+ } else if (!branchId && !position) {
1933
+ throw new Error("Must specify either branchId or position");
1934
+ }
1935
+ const thread = this._threadBinding.getState();
1936
+ const branches = thread.getBranches(state.id);
1937
+ let targetBranch = branchId;
1938
+ if (position === "previous") {
1939
+ targetBranch = branches[state.branchNumber - 2];
1940
+ } else if (position === "next") {
1941
+ targetBranch = branches[state.branchNumber];
1942
+ }
1943
+ if (!targetBranch) throw new Error("Branch not found");
1944
+ this._threadBinding.getState().switchToBranch(targetBranch);
1945
+ }
1946
+ subscribe(callback) {
1947
+ return this._core.subscribe(callback);
1948
+ }
1949
+ unstable_getContentPartByIndex(idx) {
1950
+ if (idx < 0) throw new Error("Message index must be >= 0");
1951
+ return new ContentPartRuntime(
1952
+ new ShallowMemoizeSubject({
1953
+ getState: () => {
1954
+ return getContentPartState(this.getState(), idx);
1955
+ },
1956
+ subscribe: (callback) => this._core.subscribe(callback)
1957
+ }),
1958
+ this._core,
1959
+ this._threadBinding
1960
+ );
1961
+ }
1962
+ };
1963
+
1964
+ // src/primitives/message/MessageContent.tsx
1965
+ import { jsx as jsx21, jsxs as jsxs2 } from "react/jsx-runtime";
1966
+ var ToolUIDisplay = ({
1967
+ UI,
1968
+ ...props
1969
+ }) => {
1970
+ const Render = useToolUIs((s) => s.getToolUI(props.toolName)) ?? UI;
1971
+ if (!Render) return null;
1972
+ return /* @__PURE__ */ jsx21(Render, { ...props });
1973
+ };
1974
+ var defaultComponents = {
1975
+ Text: () => /* @__PURE__ */ jsxs2("p", { style: { whiteSpace: "pre-line" }, children: [
1976
+ /* @__PURE__ */ jsx21(ContentPartPrimitiveText, {}),
1977
+ /* @__PURE__ */ jsx21(ContentPartPrimitiveInProgress, { children: /* @__PURE__ */ jsx21("span", { style: { fontFamily: "revert" }, children: " \u25CF" }) })
1978
+ ] }),
1979
+ Image: () => /* @__PURE__ */ jsx21(ContentPartPrimitiveImage, {}),
1980
+ UI: () => /* @__PURE__ */ jsx21(ContentPartPrimitiveDisplay, {})
1981
+ };
1982
+ var MessageContentPartComponent = ({
1983
+ components: {
1984
+ Text: Text2 = defaultComponents.Text,
1985
+ Empty,
1743
1986
  Image: Image2 = defaultComponents.Image,
1744
1987
  UI = defaultComponents.UI,
1745
1988
  tools: { by_name = {}, Fallback: Fallback2 = void 0 } = {}
@@ -1747,41 +1990,33 @@ var MessageContentPartComponent = ({
1747
1990
  }) => {
1748
1991
  const messageStore = useMessageStore();
1749
1992
  const threadRuntime = useThreadRuntime();
1750
- const { part, status } = useContentPart();
1993
+ const part = useContentPart();
1751
1994
  const type = part.type;
1752
1995
  switch (type) {
1753
1996
  case "text":
1754
- if (status.type === "requires-action")
1997
+ if (part.status.type === "requires-action")
1755
1998
  throw new Error("Encountered unexpected requires-action status");
1756
- if (part === EMPTY_CONTENT && !!Empty) {
1757
- return /* @__PURE__ */ jsx22(Empty, { status });
1999
+ if (part.part === EMPTY_CONTENT && !!Empty) {
2000
+ return /* @__PURE__ */ jsx21(Empty, { status: part.status });
1758
2001
  }
1759
- return /* @__PURE__ */ jsx22(Text2, { part, status });
2002
+ return /* @__PURE__ */ jsx21(Text2, { ...part, part });
1760
2003
  case "image":
1761
- if (status.type === "requires-action")
2004
+ if (part.status.type === "requires-action")
1762
2005
  throw new Error("Encountered unexpected requires-action status");
1763
- return /* @__PURE__ */ jsx22(Image2, { part, status });
2006
+ return /* @__PURE__ */ jsx21(Image2, { ...part, part });
1764
2007
  case "ui":
1765
- if (status.type === "requires-action")
2008
+ if (part.status.type === "requires-action")
1766
2009
  throw new Error("Encountered unexpected requires-action status");
1767
- return /* @__PURE__ */ jsx22(UI, { part, status });
2010
+ return /* @__PURE__ */ jsx21(UI, { ...part, part });
1768
2011
  case "tool-call": {
1769
2012
  const Tool = by_name[part.toolName] || Fallback2;
1770
2013
  const addResult = (result) => threadRuntime.addToolResult({
1771
- messageId: messageStore.getState().message.id,
2014
+ messageId: messageStore.getState().id,
1772
2015
  toolName: part.toolName,
1773
2016
  toolCallId: part.toolCallId,
1774
2017
  result
1775
2018
  });
1776
- return /* @__PURE__ */ jsx22(
1777
- ToolUIDisplay,
1778
- {
1779
- UI: Tool,
1780
- part,
1781
- status,
1782
- addResult
1783
- }
1784
- );
2019
+ return /* @__PURE__ */ jsx21(ToolUIDisplay, { ...part, part, UI: Tool, addResult });
1785
2020
  }
1786
2021
  default:
1787
2022
  const unhandledType = type;
@@ -1792,7 +2027,12 @@ var MessageContentPartImpl = ({
1792
2027
  partIndex,
1793
2028
  components
1794
2029
  }) => {
1795
- return /* @__PURE__ */ jsx22(ContentPartProvider, { partIndex, children: /* @__PURE__ */ jsx22(MessageContentPartComponent, { components }) });
2030
+ const messageRuntime = useMessageRuntime();
2031
+ const runtime = useMemo6(
2032
+ () => messageRuntime.unstable_getContentPartByIndex(partIndex),
2033
+ [messageRuntime, partIndex]
2034
+ );
2035
+ return /* @__PURE__ */ jsx21(ContentPartRuntimeProvider, { runtime, children: /* @__PURE__ */ jsx21(MessageContentPartComponent, { components }) });
1796
2036
  };
1797
2037
  var MessageContentPart = memo2(
1798
2038
  MessageContentPartImpl,
@@ -1801,8 +2041,8 @@ var MessageContentPart = memo2(
1801
2041
  var MessagePrimitiveContent = ({
1802
2042
  components
1803
2043
  }) => {
1804
- const contentLength = useMessage((s) => s.message.content.length) || 1;
1805
- return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ jsx22(MessageContentPart, { partIndex: index, components }, index));
2044
+ const contentLength = useMessage((s) => s.content.length) || 1;
2045
+ return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ jsx21(MessageContentPart, { partIndex: index, components }, index));
1806
2046
  };
1807
2047
  MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
1808
2048
 
@@ -1861,9 +2101,9 @@ var {
1861
2101
 
1862
2102
  // src/context/providers/MessageAttachmentProvider.tsx
1863
2103
  import { useEffect as useEffect10, useState as useState8 } from "react";
1864
- import { create as create11 } from "zustand";
1865
- import { jsx as jsx23 } from "react/jsx-runtime";
1866
- var getAttachment = ({ message }, useAttachment2, partIndex) => {
2104
+ import { create as create8 } from "zustand";
2105
+ import { jsx as jsx22 } from "react/jsx-runtime";
2106
+ var getAttachment = (message, useAttachment2, partIndex) => {
1867
2107
  if (message.role !== "user") return null;
1868
2108
  const attachments = message.attachments;
1869
2109
  const attachment = attachments[partIndex];
@@ -1876,7 +2116,7 @@ var useMessageAttachmentContext2 = (partIndex) => {
1876
2116
  const messageStore = useMessageStore();
1877
2117
  const [context] = useState8(
1878
2118
  () => {
1879
- const useAttachment2 = create11(
2119
+ const useAttachment2 = create8(
1880
2120
  () => getAttachment(messageStore.getState(), void 0, partIndex)
1881
2121
  );
1882
2122
  return { type: "message", useAttachment: useAttachment2 };
@@ -1902,11 +2142,11 @@ var MessageAttachmentProvider = ({
1902
2142
  children
1903
2143
  }) => {
1904
2144
  const context = useMessageAttachmentContext2(partIndex);
1905
- return /* @__PURE__ */ jsx23(AttachmentContext.Provider, { value: context, children });
2145
+ return /* @__PURE__ */ jsx22(AttachmentContext.Provider, { value: context, children });
1906
2146
  };
1907
2147
 
1908
2148
  // src/primitives/message/MessageAttachments.tsx
1909
- import { jsx as jsx24 } from "react/jsx-runtime";
2149
+ import { jsx as jsx23 } from "react/jsx-runtime";
1910
2150
  var getComponent = (components, attachment) => {
1911
2151
  const type = attachment.type;
1912
2152
  switch (type) {
@@ -1926,10 +2166,10 @@ var AttachmentComponent = ({ components }) => {
1926
2166
  (a) => getComponent(components, a.attachment)
1927
2167
  );
1928
2168
  if (!Component) return null;
1929
- return /* @__PURE__ */ jsx24(Component, {});
2169
+ return /* @__PURE__ */ jsx23(Component, {});
1930
2170
  };
1931
2171
  var MessageAttachmentImpl = ({ components, attachmentIndex }) => {
1932
- return /* @__PURE__ */ jsx24(MessageAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ jsx24(AttachmentComponent, { components }) });
2172
+ return /* @__PURE__ */ jsx23(MessageAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ jsx23(AttachmentComponent, { components }) });
1933
2173
  };
1934
2174
  var MessageAttachment = memo3(
1935
2175
  MessageAttachmentImpl,
@@ -1940,7 +2180,7 @@ var MessagePrimitiveAttachments = ({ components }) => {
1940
2180
  if (message.role !== "user") return 0;
1941
2181
  return message.attachments.length;
1942
2182
  });
1943
- return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ jsx24(
2183
+ return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ jsx23(
1944
2184
  MessageAttachment,
1945
2185
  {
1946
2186
  attachmentIndex: index,
@@ -1952,9 +2192,9 @@ var MessagePrimitiveAttachments = ({ components }) => {
1952
2192
  MessagePrimitiveAttachments.displayName = "MessagePrimitive.Attachments";
1953
2193
 
1954
2194
  // src/primitives/branchPicker/BranchPickerRoot.tsx
1955
- import { jsx as jsx25 } from "react/jsx-runtime";
2195
+ import { jsx as jsx24 } from "react/jsx-runtime";
1956
2196
  var BranchPickerPrimitiveRoot = forwardRef14(({ hideWhenSingleBranch, ...rest }, ref) => {
1957
- return /* @__PURE__ */ jsx25(MessagePrimitiveIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ jsx25(Primitive9.div, { ...rest, ref }) });
2197
+ return /* @__PURE__ */ jsx24(MessagePrimitiveIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ jsx24(Primitive9.div, { ...rest, ref }) });
1958
2198
  });
1959
2199
  BranchPickerPrimitiveRoot.displayName = "BranchPickerPrimitive.Root";
1960
2200
 
@@ -1976,7 +2216,7 @@ import { Primitive as Primitive10 } from "@radix-ui/react-primitive";
1976
2216
  import {
1977
2217
  forwardRef as forwardRef15
1978
2218
  } from "react";
1979
- import { jsx as jsx26 } from "react/jsx-runtime";
2219
+ import { jsx as jsx25 } from "react/jsx-runtime";
1980
2220
  var ComposerPrimitiveRoot = forwardRef15(({ onSubmit, ...rest }, forwardedRef) => {
1981
2221
  const send = useComposerSend();
1982
2222
  const handleSubmit = (e) => {
@@ -1984,7 +2224,7 @@ var ComposerPrimitiveRoot = forwardRef15(({ onSubmit, ...rest }, forwardedRef) =
1984
2224
  if (!send) return;
1985
2225
  send();
1986
2226
  };
1987
- return /* @__PURE__ */ jsx26(
2227
+ return /* @__PURE__ */ jsx25(
1988
2228
  Primitive10.form,
1989
2229
  {
1990
2230
  ...rest,
@@ -2003,11 +2243,11 @@ import {
2003
2243
  forwardRef as forwardRef16,
2004
2244
  useCallback as useCallback19,
2005
2245
  useEffect as useEffect11,
2006
- useRef as useRef4
2246
+ useRef as useRef3
2007
2247
  } from "react";
2008
2248
  import TextareaAutosize from "react-textarea-autosize";
2009
2249
  import { useEscapeKeydown as useEscapeKeydown2 } from "@radix-ui/react-use-escape-keydown";
2010
- import { jsx as jsx27 } from "react/jsx-runtime";
2250
+ import { jsx as jsx26 } from "react/jsx-runtime";
2011
2251
  var ComposerPrimitiveInput = forwardRef16(
2012
2252
  ({
2013
2253
  autoFocus = false,
@@ -2027,7 +2267,7 @@ var ComposerPrimitiveInput = forwardRef16(
2027
2267
  });
2028
2268
  const Component = asChild ? Slot : TextareaAutosize;
2029
2269
  const isDisabled = useThread((t) => t.isDisabled) ?? disabledProp ?? false;
2030
- const textareaRef = useRef4(null);
2270
+ const textareaRef = useRef3(null);
2031
2271
  const ref = useComposedRefs2(forwardedRef, textareaRef);
2032
2272
  useEscapeKeydown2((e) => {
2033
2273
  if (!cancelOnEscape) return;
@@ -2064,7 +2304,7 @@ var ComposerPrimitiveInput = forwardRef16(
2064
2304
  focus();
2065
2305
  }
2066
2306
  });
2067
- return /* @__PURE__ */ jsx27(
2307
+ return /* @__PURE__ */ jsx26(
2068
2308
  Component,
2069
2309
  {
2070
2310
  name: "input",
@@ -2107,8 +2347,8 @@ import { memo as memo4 } from "react";
2107
2347
 
2108
2348
  // src/context/providers/ComposerAttachmentProvider.tsx
2109
2349
  import { useEffect as useEffect12, useState as useState9 } from "react";
2110
- import { create as create12 } from "zustand";
2111
- import { jsx as jsx28 } from "react/jsx-runtime";
2350
+ import { create as create9 } from "zustand";
2351
+ import { jsx as jsx27 } from "react/jsx-runtime";
2112
2352
  var getAttachment2 = ({ attachments }, useAttachment2, partIndex) => {
2113
2353
  const attachment = attachments[partIndex];
2114
2354
  if (!attachment) return null;
@@ -2120,7 +2360,7 @@ var useComposerAttachmentContext2 = (partIndex) => {
2120
2360
  const threadComposerStore = useThreadComposerStore();
2121
2361
  const [context] = useState9(
2122
2362
  () => {
2123
- const useAttachment2 = create12(
2363
+ const useAttachment2 = create9(
2124
2364
  () => getAttachment2(threadComposerStore.getState(), void 0, partIndex)
2125
2365
  );
2126
2366
  return { type: "composer", useAttachment: useAttachment2 };
@@ -2143,11 +2383,11 @@ var useComposerAttachmentContext2 = (partIndex) => {
2143
2383
  };
2144
2384
  var ComposerAttachmentProvider = ({ attachmentIndex: partIndex, children }) => {
2145
2385
  const context = useComposerAttachmentContext2(partIndex);
2146
- return /* @__PURE__ */ jsx28(AttachmentContext.Provider, { value: context, children });
2386
+ return /* @__PURE__ */ jsx27(AttachmentContext.Provider, { value: context, children });
2147
2387
  };
2148
2388
 
2149
2389
  // src/primitives/composer/ComposerAttachments.tsx
2150
- import { jsx as jsx29 } from "react/jsx-runtime";
2390
+ import { jsx as jsx28 } from "react/jsx-runtime";
2151
2391
  var getComponent2 = (components, attachment) => {
2152
2392
  const type = attachment.type;
2153
2393
  switch (type) {
@@ -2167,10 +2407,10 @@ var AttachmentComponent2 = ({ components }) => {
2167
2407
  (a) => getComponent2(components, a.attachment)
2168
2408
  );
2169
2409
  if (!Component) return null;
2170
- return /* @__PURE__ */ jsx29(Component, {});
2410
+ return /* @__PURE__ */ jsx28(Component, {});
2171
2411
  };
2172
2412
  var ComposerAttachmentImpl = ({ components, attachmentIndex }) => {
2173
- return /* @__PURE__ */ jsx29(ComposerAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ jsx29(AttachmentComponent2, { components }) });
2413
+ return /* @__PURE__ */ jsx28(ComposerAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ jsx28(AttachmentComponent2, { components }) });
2174
2414
  };
2175
2415
  var ComposerAttachment = memo4(
2176
2416
  ComposerAttachmentImpl,
@@ -2178,7 +2418,7 @@ var ComposerAttachment = memo4(
2178
2418
  );
2179
2419
  var ComposerPrimitiveAttachments = ({ components }) => {
2180
2420
  const attachmentsCount = useThreadComposer((s) => s.attachments.length);
2181
- return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ jsx29(
2421
+ return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ jsx28(
2182
2422
  ComposerAttachment,
2183
2423
  {
2184
2424
  attachmentIndex: index,
@@ -2223,9 +2463,9 @@ __export(thread_exports, {
2223
2463
  // src/primitives/thread/ThreadRoot.tsx
2224
2464
  import { Primitive as Primitive11 } from "@radix-ui/react-primitive";
2225
2465
  import { forwardRef as forwardRef17 } from "react";
2226
- import { jsx as jsx30 } from "react/jsx-runtime";
2466
+ import { jsx as jsx29 } from "react/jsx-runtime";
2227
2467
  var ThreadPrimitiveRoot = forwardRef17((props, ref) => {
2228
- return /* @__PURE__ */ jsx30(Primitive11.div, { ...props, ref });
2468
+ return /* @__PURE__ */ jsx29(Primitive11.div, { ...props, ref });
2229
2469
  });
2230
2470
  ThreadPrimitiveRoot.displayName = "ThreadPrimitive.Root";
2231
2471
 
@@ -2255,7 +2495,7 @@ import { forwardRef as forwardRef18 } from "react";
2255
2495
 
2256
2496
  // src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
2257
2497
  import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
2258
- import { useRef as useRef5 } from "react";
2498
+ import { useRef as useRef4 } from "react";
2259
2499
 
2260
2500
  // src/utils/hooks/useOnResizeContent.tsx
2261
2501
  import { useCallbackRef as useCallbackRef3 } from "@radix-ui/react-use-callback-ref";
@@ -2314,10 +2554,10 @@ var useOnScrollToBottom = (callback) => {
2314
2554
  var useThreadViewportAutoScroll = ({
2315
2555
  autoScroll = true
2316
2556
  }) => {
2317
- const divRef = useRef5(null);
2557
+ const divRef = useRef4(null);
2318
2558
  const threadViewportStore = useThreadViewportStore();
2319
- const lastScrollTop = useRef5(0);
2320
- const isScrollingToBottomRef = useRef5(false);
2559
+ const lastScrollTop = useRef4(0);
2560
+ const isScrollingToBottomRef = useRef4(false);
2321
2561
  const scrollToBottom = (behavior) => {
2322
2562
  const div = divRef.current;
2323
2563
  if (!div || !autoScroll) return;
@@ -2362,65 +2602,26 @@ var useThreadViewportAutoScroll = ({
2362
2602
  };
2363
2603
 
2364
2604
  // src/primitives/thread/ThreadViewport.tsx
2365
- import { jsx as jsx31 } from "react/jsx-runtime";
2605
+ import { jsx as jsx30 } from "react/jsx-runtime";
2366
2606
  var ThreadPrimitiveViewport = forwardRef18(({ autoScroll, children, ...rest }, forwardedRef) => {
2367
2607
  const autoScrollRef = useThreadViewportAutoScroll({
2368
2608
  autoScroll
2369
2609
  });
2370
2610
  const ref = useComposedRefs4(forwardedRef, autoScrollRef);
2371
- return /* @__PURE__ */ jsx31(Primitive12.div, { ...rest, ref, children });
2611
+ return /* @__PURE__ */ jsx30(Primitive12.div, { ...rest, ref, children });
2372
2612
  });
2373
2613
  ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
2374
2614
 
2375
2615
  // src/primitives/thread/ThreadMessages.tsx
2376
- import { memo as memo5 } from "react";
2616
+ import { memo as memo5, useMemo as useMemo7 } from "react";
2377
2617
 
2378
- // src/context/providers/MessageProvider.tsx
2618
+ // src/context/providers/MessageRuntimeProvider.tsx
2379
2619
  import { useEffect as useEffect14, useState as useState10 } from "react";
2380
- import { create as create15 } from "zustand";
2381
-
2382
- // src/context/stores/EditComposer.ts
2383
- import { create as create13 } from "zustand";
2384
- var makeEditComposerStore = ({
2385
- onEdit,
2386
- onSend
2387
- }) => create13()((set, get) => ({
2388
- type: "edit",
2389
- get value() {
2390
- return get().text;
2391
- },
2392
- setValue(value) {
2393
- get().setText(value);
2394
- },
2395
- text: "",
2396
- setText: (text) => {
2397
- set({ text, isEmpty: text.trim().length === 0 });
2398
- },
2399
- canCancel: false,
2400
- isEditing: false,
2401
- isEmpty: true,
2402
- edit: () => {
2403
- const text = onEdit();
2404
- set({
2405
- isEditing: true,
2406
- canCancel: true,
2407
- isEmpty: text.trim().length === 0,
2408
- text
2409
- });
2410
- },
2411
- send: () => {
2412
- const text = get().text;
2413
- set({ isEditing: false, canCancel: false });
2414
- onSend(text);
2415
- },
2416
- cancel: () => {
2417
- set({ isEditing: false, canCancel: false });
2418
- }
2419
- }));
2620
+ import { create as create11 } from "zustand";
2420
2621
 
2421
2622
  // src/context/stores/MessageUtils.ts
2422
- import { create as create14 } from "zustand";
2423
- var makeMessageUtilsStore = () => create14((set) => {
2623
+ import { create as create10 } from "zustand";
2624
+ var makeMessageUtilsStore = () => create10((set) => {
2424
2625
  let utterance = null;
2425
2626
  return {
2426
2627
  isCopied: false,
@@ -2449,89 +2650,54 @@ var makeMessageUtilsStore = () => create14((set) => {
2449
2650
  };
2450
2651
  });
2451
2652
 
2452
- // src/context/providers/MessageProvider.tsx
2453
- import { jsx as jsx32 } from "react/jsx-runtime";
2454
- var getIsLast = (messages, message) => {
2455
- return messages[messages.length - 1]?.id === message.id;
2456
- };
2457
- var getMessageState = (messages, getBranches, useMessage2, messageIndex) => {
2458
- const parentId = messages[messageIndex - 1]?.id ?? null;
2459
- const message = messages[messageIndex];
2460
- if (!message) return null;
2461
- const isLast = getIsLast(messages, message);
2462
- const branches = getBranches(message.id);
2463
- const currentState = useMessage2?.getState();
2464
- if (currentState && currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
2465
- return null;
2466
- return Object.freeze({
2467
- message,
2468
- parentId,
2469
- branches,
2470
- isLast
2471
- });
2653
+ // src/context/providers/MessageRuntimeProvider.tsx
2654
+ import { jsx as jsx31 } from "react/jsx-runtime";
2655
+ var useMessageRuntimeStore = (runtime) => {
2656
+ const [store] = useState10(() => create11(() => runtime));
2657
+ useEffect14(() => {
2658
+ writableStore(store).setState(runtime, true);
2659
+ }, [runtime, store]);
2660
+ return store;
2472
2661
  };
2473
- var useMessageContext2 = (messageIndex) => {
2474
- const threadMessagesStore = useThreadMessagesStore();
2475
- const threadRuntime = useThreadRuntime();
2476
- const [context] = useState10(() => {
2477
- const useMessage2 = create15(
2478
- () => getMessageState(
2479
- threadMessagesStore.getState(),
2480
- threadRuntime.getBranches.bind(threadRuntime),
2481
- void 0,
2482
- messageIndex
2483
- )
2484
- );
2485
- const useMessageUtils2 = makeMessageUtilsStore();
2486
- const useEditComposer2 = makeEditComposerStore({
2487
- onEdit: () => {
2488
- const message = useMessage2.getState().message;
2489
- const text = getThreadMessageText(message);
2490
- return text;
2491
- },
2492
- onSend: (text) => {
2493
- const { message, parentId } = useMessage2.getState();
2494
- const previousText = getThreadMessageText(message);
2495
- if (previousText === text) return;
2496
- const nonTextParts = message.content.filter(
2497
- (part) => part.type !== "text" && part.type !== "ui"
2498
- );
2499
- threadRuntime.append({
2500
- parentId,
2501
- role: message.role,
2502
- content: [{ type: "text", text }, ...nonTextParts],
2503
- attachments: message.attachments
2504
- });
2505
- }
2506
- });
2507
- return { useMessage: useMessage2, useMessageUtils: useMessageUtils2, useEditComposer: useEditComposer2 };
2508
- });
2662
+ var useMessageStore2 = (runtime) => {
2663
+ const [store] = useState10(() => create11(() => runtime.getState()));
2509
2664
  useEffect14(() => {
2510
- const syncMessage = (thread) => {
2511
- const newState = getMessageState(
2512
- thread,
2513
- threadRuntime.getBranches.bind(threadRuntime),
2514
- context.useMessage,
2515
- messageIndex
2516
- );
2517
- if (!newState) return;
2518
- writableStore(context.useMessage).setState(newState, true);
2519
- };
2520
- syncMessage(threadMessagesStore.getState());
2521
- return threadMessagesStore.subscribe(syncMessage);
2522
- }, [threadMessagesStore, threadRuntime, context, messageIndex]);
2523
- return context;
2665
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
2666
+ updateState();
2667
+ return runtime.subscribe(updateState);
2668
+ }, [runtime, store]);
2669
+ return store;
2524
2670
  };
2525
- var MessageProvider = ({
2526
- messageIndex,
2671
+ var useMessageUtilsStore2 = () => {
2672
+ const [store] = useState10(() => makeMessageUtilsStore());
2673
+ return store;
2674
+ };
2675
+ var useEditComposerStore2 = (useMessageRuntime2) => {
2676
+ const runtime = useMessageRuntime2.getState().composer;
2677
+ const [store] = useState10(() => create11(() => runtime.getState()));
2678
+ useEffect14(() => {
2679
+ const updateState = () => writableStore(store).setState(runtime.getState());
2680
+ updateState();
2681
+ return runtime.subscribe(updateState);
2682
+ }, [runtime, store]);
2683
+ return store;
2684
+ };
2685
+ var MessageRuntimeProvider = ({
2686
+ runtime,
2527
2687
  children
2528
2688
  }) => {
2529
- const context = useMessageContext2(messageIndex);
2530
- return /* @__PURE__ */ jsx32(MessageContext.Provider, { value: context, children });
2689
+ const useMessageRuntime2 = useMessageRuntimeStore(runtime);
2690
+ const useMessage2 = useMessageStore2(runtime);
2691
+ const useMessageUtils2 = useMessageUtilsStore2();
2692
+ const useEditComposer2 = useEditComposerStore2(useMessageRuntime2);
2693
+ const [context] = useState10(() => {
2694
+ return { useMessageRuntime: useMessageRuntime2, useMessage: useMessage2, useMessageUtils: useMessageUtils2, useEditComposer: useEditComposer2 };
2695
+ });
2696
+ return /* @__PURE__ */ jsx31(MessageContext.Provider, { value: context, children });
2531
2697
  };
2532
2698
 
2533
2699
  // src/primitives/thread/ThreadMessages.tsx
2534
- import { jsx as jsx33 } from "react/jsx-runtime";
2700
+ import { jsx as jsx32 } from "react/jsx-runtime";
2535
2701
  var isComponentsSame = (prev, next) => {
2536
2702
  return prev.Message === next.Message && prev.EditComposer === next.EditComposer && prev.UserEditComposer === next.UserEditComposer && prev.AssistantEditComposer === next.AssistantEditComposer && prev.SystemEditComposer === next.SystemEditComposer && prev.UserMessage === next.UserMessage && prev.AssistantMessage === next.AssistantMessage && prev.SystemMessage === next.SystemMessage;
2537
2703
  };
@@ -2564,16 +2730,21 @@ var getComponent3 = (components, role, isEditing) => {
2564
2730
  var ThreadMessageComponent = ({
2565
2731
  components
2566
2732
  }) => {
2567
- const role = useMessage((m) => m.message.role);
2733
+ const role = useMessage((m) => m.role);
2568
2734
  const isEditing = useEditComposer((c) => c.isEditing);
2569
2735
  const Component = getComponent3(components, role, isEditing);
2570
- return /* @__PURE__ */ jsx33(Component, {});
2736
+ return /* @__PURE__ */ jsx32(Component, {});
2571
2737
  };
2572
2738
  var ThreadMessageImpl = ({
2573
2739
  messageIndex,
2574
2740
  components
2575
2741
  }) => {
2576
- return /* @__PURE__ */ jsx33(MessageProvider, { messageIndex, children: /* @__PURE__ */ jsx33(ThreadMessageComponent, { components }) });
2742
+ const threadRuntime = useThreadRuntime();
2743
+ const runtime = useMemo7(
2744
+ () => threadRuntime.unstable_getMesssageByIndex(messageIndex),
2745
+ [threadRuntime, messageIndex]
2746
+ );
2747
+ return /* @__PURE__ */ jsx32(MessageRuntimeProvider, { runtime, children: /* @__PURE__ */ jsx32(ThreadMessageComponent, { components }) });
2577
2748
  };
2578
2749
  var ThreadMessage = memo5(
2579
2750
  ThreadMessageImpl,
@@ -2582,9 +2753,9 @@ var ThreadMessage = memo5(
2582
2753
  var ThreadPrimitiveMessagesImpl = ({
2583
2754
  components
2584
2755
  }) => {
2585
- const messagesLength = useThreadMessages((t) => t.length);
2756
+ const messagesLength = useThread((t) => t.messages.length);
2586
2757
  if (messagesLength === 0) return null;
2587
- return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ jsx33(ThreadMessage, { messageIndex: index, components }, index));
2758
+ return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ jsx32(ThreadMessage, { messageIndex: index, components }, index));
2588
2759
  };
2589
2760
  ThreadPrimitiveMessagesImpl.displayName = "ThreadPrimitive.Messages";
2590
2761
  var ThreadPrimitiveMessages = memo5(
@@ -2626,7 +2797,7 @@ var subscribeToMainThread = (runtime, callback) => {
2626
2797
  };
2627
2798
 
2628
2799
  // src/runtimes/local/useLocalRuntime.tsx
2629
- import { useInsertionEffect as useInsertionEffect2, useMemo as useMemo4, useState as useState12 } from "react";
2800
+ import { useInsertionEffect, useMemo as useMemo8, useState as useState12 } from "react";
2630
2801
 
2631
2802
  // src/runtimes/core/BaseAssistantRuntimeCore.tsx
2632
2803
  var BaseAssistantRuntimeCore = class {
@@ -2656,7 +2827,7 @@ var internal_exports = {};
2656
2827
  __export(internal_exports, {
2657
2828
  AssistantRuntime: () => AssistantRuntime,
2658
2829
  BaseAssistantRuntimeCore: () => BaseAssistantRuntimeCore,
2659
- BaseThreadRuntimeComposerCore: () => BaseThreadComposerRuntimeCore,
2830
+ DefaultThreadComposerRuntimeCore: () => DefaultThreadComposerRuntimeCore,
2660
2831
  MessageRepository: () => MessageRepository,
2661
2832
  ProxyConfigProvider: () => ProxyConfigProvider,
2662
2833
  ThreadRuntime: () => ThreadRuntime,
@@ -2667,45 +2838,20 @@ __export(internal_exports, {
2667
2838
  withSmoothContextProvider: () => withSmoothContextProvider
2668
2839
  });
2669
2840
 
2670
- // src/runtimes/utils/BaseThreadComposerRuntimeCore.tsx
2671
- var BaseThreadComposerRuntimeCore = class {
2672
- constructor(runtime) {
2673
- this.runtime = runtime;
2674
- }
2675
- _attachmentAdapter;
2841
+ // src/runtimes/composer/BaseComposerRuntimeCore.tsx
2842
+ var BaseComposerRuntimeCore = class {
2843
+ isEditing = true;
2676
2844
  attachmentAccept = "*";
2677
- get isEmpty() {
2678
- return !this.text.trim() && !this.attachments.length;
2679
- }
2680
- setAttachmentAdapter(adapter) {
2681
- this._attachmentAdapter = adapter;
2682
- const accept = adapter?.accept ?? "*";
2683
- if (this.attachmentAccept !== accept) {
2684
- this.attachmentAccept = accept;
2685
- return true;
2686
- }
2687
- return false;
2688
- }
2689
2845
  _attachments = [];
2846
+ set attachments(value) {
2847
+ this._attachments = value;
2848
+ this.notifySubscribers();
2849
+ }
2690
2850
  get attachments() {
2691
2851
  return this._attachments;
2692
2852
  }
2693
- async addAttachment(file) {
2694
- if (!this._attachmentAdapter)
2695
- throw new Error("Attachments are not supported");
2696
- const attachment = await this._attachmentAdapter.add({ file });
2697
- this._attachments = [...this._attachments, attachment];
2698
- this.notifySubscribers();
2699
- }
2700
- async removeAttachment(attachmentId) {
2701
- if (!this._attachmentAdapter)
2702
- throw new Error("Attachments are not supported");
2703
- const index = this._attachments.findIndex((a) => a.id === attachmentId);
2704
- if (index === -1) throw new Error("Attachment not found");
2705
- const attachment = this._attachments[index];
2706
- await this._attachmentAdapter.remove(attachment);
2707
- this._attachments = this._attachments.toSpliced(index, 1);
2708
- this.notifySubscribers();
2853
+ get isEmpty() {
2854
+ return !this.text.trim() && !this.attachments.length;
2709
2855
  }
2710
2856
  _text = "";
2711
2857
  get text() {
@@ -2726,13 +2872,39 @@ var BaseThreadComposerRuntimeCore = class {
2726
2872
  async (a) => await this._attachmentAdapter.send(a)
2727
2873
  )
2728
2874
  ) : [];
2729
- this.runtime.append({
2730
- parentId: this.runtime.messages.at(-1)?.id ?? null,
2875
+ const message = {
2731
2876
  role: "user",
2732
2877
  content: this.text ? [{ type: "text", text: this.text }] : [],
2733
2878
  attachments
2734
- });
2879
+ };
2735
2880
  this.reset();
2881
+ this.handleSend(message);
2882
+ }
2883
+ _attachmentAdapter;
2884
+ setAttachmentAdapter(adapter) {
2885
+ this._attachmentAdapter = adapter;
2886
+ const accept = adapter?.accept ?? "*";
2887
+ if (this.attachmentAccept !== accept) {
2888
+ this.attachmentAccept = accept;
2889
+ this.notifySubscribers();
2890
+ }
2891
+ }
2892
+ async addAttachment(file) {
2893
+ if (!this._attachmentAdapter)
2894
+ throw new Error("Attachments are not supported");
2895
+ const attachment = await this._attachmentAdapter.add({ file });
2896
+ this._attachments = [...this._attachments, attachment];
2897
+ this.notifySubscribers();
2898
+ }
2899
+ async removeAttachment(attachmentId) {
2900
+ if (!this._attachmentAdapter)
2901
+ throw new Error("Attachments are not supported");
2902
+ const index = this._attachments.findIndex((a) => a.id === attachmentId);
2903
+ if (index === -1) throw new Error("Attachment not found");
2904
+ const attachment = this._attachments[index];
2905
+ await this._attachmentAdapter.remove(attachment);
2906
+ this._attachments = this._attachments.toSpliced(index, 1);
2907
+ this.notifySubscribers();
2736
2908
  }
2737
2909
  _subscriptions = /* @__PURE__ */ new Set();
2738
2910
  notifySubscribers() {
@@ -2744,6 +2916,36 @@ var BaseThreadComposerRuntimeCore = class {
2744
2916
  }
2745
2917
  };
2746
2918
 
2919
+ // src/runtimes/composer/DefaultThreadComposerRuntimeCore.tsx
2920
+ var DefaultThreadComposerRuntimeCore = class extends BaseComposerRuntimeCore {
2921
+ constructor(runtime) {
2922
+ super();
2923
+ this.runtime = runtime;
2924
+ this.connect();
2925
+ }
2926
+ _canCancel = false;
2927
+ get canCancel() {
2928
+ return this._canCancel;
2929
+ }
2930
+ connect() {
2931
+ return this.runtime.subscribe(() => {
2932
+ if (this.canCancel !== this.runtime.capabilities.cancel) {
2933
+ this._canCancel = this.runtime.capabilities.cancel;
2934
+ this.notifySubscribers();
2935
+ }
2936
+ });
2937
+ }
2938
+ async handleSend(message) {
2939
+ this.runtime.append({
2940
+ ...message,
2941
+ parentId: this.runtime.messages.at(-1)?.id ?? null
2942
+ });
2943
+ }
2944
+ async cancel() {
2945
+ this.runtime.cancelRun();
2946
+ }
2947
+ };
2948
+
2747
2949
  // src/utils/ProxyConfigProvider.ts
2748
2950
  var ProxyConfigProvider = class {
2749
2951
  _providers = /* @__PURE__ */ new Set();
@@ -2869,11 +3071,11 @@ var MessageRepository = class {
2869
3071
  }
2870
3072
  }
2871
3073
  getMessages() {
2872
- const messages = new Array(this.head?.level ?? 0);
3074
+ const messages2 = new Array(this.head?.level ?? 0);
2873
3075
  for (let current = this.head; current; current = current.prev) {
2874
- messages[current.level] = current.current;
3076
+ messages2[current.level] = current.current;
2875
3077
  }
2876
- return messages;
3078
+ return messages2;
2877
3079
  }
2878
3080
  addOrUpdateMessage(parentId, message) {
2879
3081
  const existingItem = this.messages.get(message.id);
@@ -2999,11 +3201,11 @@ var MessageRepository = class {
2999
3201
  messages: exportItems
3000
3202
  };
3001
3203
  }
3002
- import({ headId, messages }) {
3003
- for (const { message, parentId } of messages) {
3204
+ import({ headId, messages: messages2 }) {
3205
+ for (const { message, parentId } of messages2) {
3004
3206
  this.addOrUpdateMessage(parentId, message);
3005
3207
  }
3006
- this.resetHead(headId ?? messages.at(-1)?.message.id ?? null);
3208
+ this.resetHead(headId ?? messages2.at(-1)?.message.id ?? null);
3007
3209
  }
3008
3210
  };
3009
3211
 
@@ -3018,7 +3220,7 @@ import {
3018
3220
  forwardRef as forwardRef19
3019
3221
  } from "react";
3020
3222
  import classNames from "classnames";
3021
- import { jsx as jsx34 } from "react/jsx-runtime";
3223
+ import { jsx as jsx33 } from "react/jsx-runtime";
3022
3224
  var withDefaultProps = ({
3023
3225
  className,
3024
3226
  ...defaultProps
@@ -3034,7 +3236,7 @@ var withDefaults = (Component, defaultProps) => {
3034
3236
  const WithDefaults = forwardRef19(
3035
3237
  (props, ref) => {
3036
3238
  const ComponentAsAny = Component;
3037
- return /* @__PURE__ */ jsx34(ComponentAsAny, { ...getProps(props), ref });
3239
+ return /* @__PURE__ */ jsx33(ComponentAsAny, { ...getProps(props), ref });
3038
3240
  }
3039
3241
  );
3040
3242
  WithDefaults.displayName = "withDefaults(" + (typeof Component === "string" ? Component : Component.displayName) + ")";
@@ -3042,9 +3244,9 @@ var withDefaults = (Component, defaultProps) => {
3042
3244
  };
3043
3245
 
3044
3246
  // src/ui/base/tooltip.tsx
3045
- import { jsx as jsx35 } from "react/jsx-runtime";
3247
+ import { jsx as jsx34 } from "react/jsx-runtime";
3046
3248
  var Tooltip = (props) => {
3047
- return /* @__PURE__ */ jsx35(TooltipPrimitive.Provider, { children: /* @__PURE__ */ jsx35(TooltipPrimitive.Root, { ...props }) });
3249
+ return /* @__PURE__ */ jsx34(TooltipPrimitive.Provider, { children: /* @__PURE__ */ jsx34(TooltipPrimitive.Root, { ...props }) });
3048
3250
  };
3049
3251
  Tooltip.displayName = "Tooltip";
3050
3252
  var TooltipTrigger = TooltipPrimitive.Trigger;
@@ -3058,7 +3260,7 @@ TooltipContent.displayName = "TooltipContent";
3058
3260
  import { cva } from "class-variance-authority";
3059
3261
  import { Primitive as Primitive13 } from "@radix-ui/react-primitive";
3060
3262
  import { forwardRef as forwardRef20 } from "react";
3061
- import { jsx as jsx36 } from "react/jsx-runtime";
3263
+ import { jsx as jsx35 } from "react/jsx-runtime";
3062
3264
  var buttonVariants = cva("aui-button", {
3063
3265
  variants: {
3064
3266
  variant: {
@@ -3078,7 +3280,7 @@ var buttonVariants = cva("aui-button", {
3078
3280
  });
3079
3281
  var Button = forwardRef20(
3080
3282
  ({ className, variant, size, ...props }, ref) => {
3081
- return /* @__PURE__ */ jsx36(
3283
+ return /* @__PURE__ */ jsx35(
3082
3284
  Primitive13.button,
3083
3285
  {
3084
3286
  className: buttonVariants({ variant, size, className }),
@@ -3091,78 +3293,18 @@ var Button = forwardRef20(
3091
3293
  Button.displayName = "Button";
3092
3294
 
3093
3295
  // src/ui/base/tooltip-icon-button.tsx
3094
- import { jsx as jsx37, jsxs as jsxs3 } from "react/jsx-runtime";
3296
+ import { jsx as jsx36, jsxs as jsxs3 } from "react/jsx-runtime";
3095
3297
  var TooltipIconButton = forwardRef21(({ children, tooltip, side = "bottom", ...rest }, ref) => {
3096
3298
  return /* @__PURE__ */ jsxs3(Tooltip, { children: [
3097
- /* @__PURE__ */ jsx37(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs3(Button, { variant: "ghost", size: "icon", ...rest, ref, children: [
3299
+ /* @__PURE__ */ jsx36(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs3(Button, { variant: "ghost", size: "icon", ...rest, ref, children: [
3098
3300
  children,
3099
- /* @__PURE__ */ jsx37("span", { className: "aui-sr-only", children: tooltip })
3301
+ /* @__PURE__ */ jsx36("span", { className: "aui-sr-only", children: tooltip })
3100
3302
  ] }) }),
3101
- /* @__PURE__ */ jsx37(TooltipContent, { side, children: tooltip })
3303
+ /* @__PURE__ */ jsx36(TooltipContent, { side, children: tooltip })
3102
3304
  ] });
3103
3305
  });
3104
3306
  TooltipIconButton.displayName = "TooltipIconButton";
3105
3307
 
3106
- // src/api/subscribable/BaseSubject.ts
3107
- var BaseSubject = class {
3108
- _subscriptions = /* @__PURE__ */ new Set();
3109
- _connection;
3110
- get isConnected() {
3111
- return !!this._connection;
3112
- }
3113
- notifySubscribers() {
3114
- for (const callback of this._subscriptions) callback();
3115
- }
3116
- _updateConnection() {
3117
- if (this._subscriptions.size > 0) {
3118
- if (this._connection) return;
3119
- this._connection = this._connect();
3120
- } else {
3121
- this._connection?.();
3122
- this._connection = void 0;
3123
- }
3124
- }
3125
- subscribe(callback) {
3126
- this._subscriptions.add(callback);
3127
- this._updateConnection();
3128
- return () => {
3129
- this._subscriptions.delete(callback);
3130
- this._updateConnection();
3131
- };
3132
- }
3133
- };
3134
-
3135
- // src/api/subscribable/NestedSubscriptionSubject.ts
3136
- var NestedSubscriptionSubject = class extends BaseSubject {
3137
- constructor(binding) {
3138
- super();
3139
- this.binding = binding;
3140
- }
3141
- getState() {
3142
- return this.binding.getState();
3143
- }
3144
- _connect() {
3145
- const callback = () => {
3146
- this.notifySubscribers();
3147
- };
3148
- let lastState = this.binding.getState();
3149
- let innerUnsubscribe = lastState.subscribe(callback);
3150
- const onRuntimeUpdate = () => {
3151
- const newState = this.binding.getState();
3152
- if (newState === lastState) return;
3153
- lastState = newState;
3154
- innerUnsubscribe?.();
3155
- innerUnsubscribe = this.binding.getState().subscribe(callback);
3156
- callback();
3157
- };
3158
- const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
3159
- return () => {
3160
- outerUnsubscribe?.();
3161
- innerUnsubscribe();
3162
- };
3163
- }
3164
- };
3165
-
3166
3308
  // src/api/AssistantRuntime.ts
3167
3309
  var AssistantRuntime = class {
3168
3310
  constructor(_core, CustomThreadRuntime) {
@@ -3179,63 +3321,22 @@ var AssistantRuntime = class {
3179
3321
  return this._core.switchToNewThread();
3180
3322
  }
3181
3323
  switchToThread(threadId) {
3182
- return this._core.switchToThread(threadId);
3183
- }
3184
- registerModelConfigProvider(provider) {
3185
- return this._core.registerModelConfigProvider(provider);
3186
- }
3187
- // TODO events for thread switching
3188
- /**
3189
- * @deprecated Thread is now static and never gets updated. This will be removed in 0.6.0.
3190
- */
3191
- subscribe(callback) {
3192
- return this._core.subscribe(callback);
3193
- }
3194
- };
3195
-
3196
- // src/api/ContentPartRuntime.ts
3197
- var ContentPartRuntime = class {
3198
- constructor(contentBinding, messageApi, threadApi) {
3199
- this.contentBinding = contentBinding;
3200
- this.messageApi = messageApi;
3201
- this.threadApi = threadApi;
3202
- }
3203
- getState() {
3204
- return this.contentBinding.getState();
3205
- }
3206
- addToolResult(result) {
3207
- const message = this.messageApi.getState();
3208
- if (!message) throw new Error("Message is not available");
3209
- const state = this.contentBinding.getState();
3210
- if (!state) throw new Error("Content part is not available");
3211
- if (state.part.type !== "tool-call")
3212
- throw new Error("Tried to add tool result to non-tool content part");
3213
- const toolName = state.part.toolName;
3214
- const toolCallId = state.part.toolCallId;
3215
- this.threadApi.getState().addToolResult({
3216
- messageId: message.message.id,
3217
- toolName,
3218
- toolCallId,
3219
- result
3220
- });
3324
+ return this._core.switchToThread(threadId);
3221
3325
  }
3222
- };
3223
-
3224
- // src/api/subscribable/shallowEqual.ts
3225
- function shallowEqual(objA, objB) {
3226
- if (objA === void 0 && objB === void 0) return true;
3227
- if (objA === void 0) return false;
3228
- if (objB === void 0) return false;
3229
- for (const key of Object.keys(objA)) {
3230
- const valueA = objA[key];
3231
- const valueB = objB[key];
3232
- if (!Object.is(valueA, valueB)) return false;
3326
+ registerModelConfigProvider(provider) {
3327
+ return this._core.registerModelConfigProvider(provider);
3233
3328
  }
3234
- return true;
3235
- }
3329
+ // TODO events for thread switching
3330
+ /**
3331
+ * @deprecated Thread is now static and never gets updated. This will be removed in 0.6.0.
3332
+ */
3333
+ subscribe(callback) {
3334
+ return this._core.subscribe(callback);
3335
+ }
3336
+ };
3236
3337
 
3237
- // src/api/subscribable/ShallowMemoizeSubject.ts
3238
- var ShallowMemoizeSubject = class extends BaseSubject {
3338
+ // src/api/subscribable/LazyMemoizeSubject.ts
3339
+ var LazyMemoizeSubject = class extends BaseSubject {
3239
3340
  constructor(binding) {
3240
3341
  super();
3241
3342
  this.binding = binding;
@@ -3244,261 +3345,59 @@ var ShallowMemoizeSubject = class extends BaseSubject {
3244
3345
  throw new Error("Entry not available in the store");
3245
3346
  this._previousState = state;
3246
3347
  }
3348
+ _previousStateDirty = true;
3247
3349
  _previousState;
3248
3350
  getState = () => {
3249
- if (!this.isConnected) this._syncState();
3351
+ if (!this.isConnected || this._previousStateDirty) {
3352
+ const newState = this.binding.getState();
3353
+ if (newState !== void 0) {
3354
+ this._previousState = newState;
3355
+ }
3356
+ this._previousStateDirty = false;
3357
+ }
3250
3358
  return this._previousState;
3251
3359
  };
3252
- _syncState() {
3253
- const state = this.binding.getState();
3254
- if (state === void 0) return false;
3255
- if (shallowEqual(state, this._previousState)) return false;
3256
- this._previousState = state;
3257
- return true;
3258
- }
3259
3360
  _connect() {
3260
3361
  const callback = () => {
3261
- if (this._syncState()) {
3262
- this.notifySubscribers();
3263
- }
3362
+ this._previousStateDirty = true;
3363
+ this.notifySubscribers();
3264
3364
  };
3265
3365
  return this.binding.subscribe(callback);
3266
3366
  }
3267
3367
  };
3268
3368
 
3269
- // src/api/MessageRuntime.ts
3270
- var MessageState = class {
3271
- constructor(snapshot) {
3272
- this.snapshot = snapshot;
3273
- }
3274
- /**
3275
- * @deprecated Replace `.message.content` with `.content` etc. This will be removed in 0.6.0.
3276
- */
3277
- get message() {
3278
- return this.snapshot.message;
3279
- }
3280
- get id() {
3281
- return this.snapshot.message.id;
3282
- }
3283
- get createdAt() {
3284
- return this.snapshot.message.createdAt;
3285
- }
3286
- get role() {
3287
- return this.snapshot.message.role;
3288
- }
3289
- get content() {
3290
- return this.snapshot.message.content;
3291
- }
3292
- get attachments() {
3293
- return this.snapshot.message.attachments;
3294
- }
3295
- get metadata() {
3296
- return this.snapshot.message.metadata;
3297
- }
3298
- get status() {
3299
- return this.snapshot.message.status;
3300
- }
3301
- get parentId() {
3302
- return this.snapshot.parentId;
3303
- }
3304
- get isLast() {
3305
- return this.snapshot.isLast;
3306
- }
3307
- get branches() {
3308
- return this.snapshot.branches;
3309
- }
3310
- get branchNumber() {
3311
- return this.snapshot.branchNumber;
3312
- }
3313
- get branchCount() {
3314
- return this.snapshot.branchCount;
3315
- }
3316
- };
3317
- var MessageRuntime = class {
3318
- constructor(_core, _threadBinding) {
3319
- this._core = _core;
3320
- this._threadBinding = _threadBinding;
3321
- }
3322
- getState() {
3323
- return new MessageState(this._core.getState());
3324
- }
3325
- // TODO improve type
3326
- edit(message) {
3327
- const state = this._core.getState();
3328
- if (!state) throw new Error("Message is not available");
3329
- this._threadBinding.getState().append({
3330
- ...message,
3331
- parentId: state.parentId
3332
- });
3333
- }
3334
- reload() {
3335
- const state = this._core.getState();
3336
- if (!state) throw new Error("Message is not available");
3337
- this._threadBinding.getState().startRun(state.parentId);
3338
- }
3339
- speak() {
3340
- const state = this._core.getState();
3341
- if (!state) throw new Error("Message is not available");
3342
- this._threadBinding.getState().speak(state.message.id);
3343
- }
3344
- submitFeedback({ type }) {
3345
- const state = this._core.getState();
3346
- if (!state) throw new Error("Message is not available");
3347
- this._threadBinding.getState().submitFeedback({
3348
- messageId: state.message.id,
3349
- type
3350
- });
3351
- }
3352
- switchToBranch({
3353
- position,
3354
- branchId
3355
- }) {
3356
- const state = this._core.getState();
3357
- if (!state) throw new Error("Message is not available");
3358
- if (branchId && position) {
3359
- throw new Error("May not specify both branchId and position");
3360
- } else if (!branchId && !position) {
3361
- throw new Error("Must specify either branchId or position");
3362
- }
3363
- const thread = this._threadBinding.getState();
3364
- const branches = thread.getBranches(state.message.id);
3365
- let targetBranch = branchId;
3366
- if (position === "previous") {
3367
- targetBranch = branches[state.branchNumber - 2];
3368
- } else if (position === "next") {
3369
- targetBranch = branches[state.branchNumber];
3370
- }
3371
- if (!targetBranch) throw new Error("Branch not found");
3372
- this._threadBinding.getState().switchToBranch(targetBranch);
3373
- }
3374
- subscribe(callback) {
3375
- return this._core.subscribe(callback);
3376
- }
3377
- getContentPartByIdx(idx) {
3378
- if (idx < 0) throw new Error("Message index must be >= 0");
3379
- return new ContentPartRuntime(
3380
- new ShallowMemoizeSubject({
3381
- getState: () => {
3382
- const state = this.getState();
3383
- if (!state) return void 0;
3384
- const message = state.message;
3385
- const part = message.content[idx];
3386
- if (!part) return void 0;
3387
- return {
3388
- part,
3389
- status: toContentPartStatus(message, idx, part)
3390
- };
3391
- },
3392
- subscribe: (callback) => this._core.subscribe(callback)
3393
- }),
3394
- this._core,
3395
- this._threadBinding
3396
- );
3397
- }
3398
- };
3399
-
3400
- // src/api/ThreadComposerRuntime.ts
3401
- var ComposerState = class {
3402
- constructor(_composerBinding) {
3403
- this._composerBinding = _composerBinding;
3404
- }
3405
- get isEmpty() {
3406
- return this._composerBinding.getState().isEmpty;
3407
- }
3408
- get text() {
3409
- return this._composerBinding.getState().text;
3410
- }
3411
- get attachmentAccept() {
3412
- return this._composerBinding.getState().attachmentAccept;
3413
- }
3414
- get attachments() {
3415
- return this._composerBinding.getState().attachments;
3416
- }
3417
- };
3418
- var ThreadComposerRuntime = class {
3419
- constructor(_core) {
3420
- this._core = _core;
3421
- this._state = new ComposerState(_core);
3422
- }
3423
- /**
3424
- * @deprecated Use `getState().isEmpty` instead. This will be removed in 0.6.0.
3425
- */
3426
- get isEmpty() {
3427
- return this._core.getState().isEmpty;
3428
- }
3429
- /**
3430
- * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
3431
- */
3432
- get text() {
3433
- return this._core.getState().text;
3434
- }
3435
- /**
3436
- * @deprecated Use `getState().attachmentAccept` instead. This will be removed in 0.6.0.
3437
- */
3438
- get attachmentAccept() {
3439
- return this._core.getState().attachmentAccept;
3440
- }
3441
- // TODO should this instead return getAttachmentByIndex([idx]) instead?
3442
- /**
3443
- * @deprecated Use `getState().attachments` instead. This will be removed in 0.6.0.
3444
- */
3445
- get attachments() {
3446
- return this._core.getState().attachments;
3447
- }
3448
- _state;
3449
- getState() {
3450
- return this._state;
3451
- }
3452
- setText(text) {
3453
- this._core.getState().setText(text);
3454
- }
3455
- addAttachment(file) {
3456
- return this._core.getState().addAttachment(file);
3457
- }
3458
- // /**
3459
- // * @deprecated Use `getAttachmentById(id).removeAttachment` instead. This will be removed in 0.6.0.
3460
- // */
3461
- removeAttachment(attachmentId) {
3462
- return this._core.getState().removeAttachment(attachmentId);
3463
- }
3464
- /**
3465
- * @deprecated This method will be removed in 0.6.0. Submit feedback if you need this functionality.
3466
- */
3467
- reset() {
3468
- this._core.getState().reset();
3469
- }
3470
- send() {
3471
- this._core.getState().send();
3472
- }
3473
- subscribe(callback) {
3474
- return this._core.subscribe(callback);
3475
- }
3476
- };
3477
-
3478
3369
  // src/api/ThreadRuntime.ts
3479
- var ThreadState = class {
3480
- constructor(_core) {
3481
- this._core = _core;
3482
- }
3483
- get threadId() {
3484
- return this._core.threadId;
3485
- }
3486
- get isDisabled() {
3487
- return this._core.isDisabled;
3488
- }
3489
- get isRunning() {
3490
- const messages = this._core.messages;
3491
- const lastMessage = messages[messages.length - 1];
3492
- return lastMessage?.role !== "assistant" ? false : lastMessage.status.type === "running";
3370
+ var toAppendMessage = (messages2, message) => {
3371
+ if (typeof message === "string") {
3372
+ return {
3373
+ parentId: messages2.at(-1)?.id ?? null,
3374
+ role: "user",
3375
+ content: [{ type: "text", text: message }],
3376
+ attachments: []
3377
+ };
3493
3378
  }
3494
- get capabilities() {
3495
- return this._core.capabilities;
3379
+ if (message.role && message.parentId && message.attachments) {
3380
+ return message;
3496
3381
  }
3382
+ return {
3383
+ parentId: message.parentId ?? messages2.at(-1)?.id ?? null,
3384
+ role: message.role ?? "user",
3385
+ content: message.content,
3386
+ attachments: message.attachments ?? []
3387
+ };
3388
+ };
3389
+ var getThreadState = (runtime) => {
3390
+ const lastMessage = runtime.messages.at(-1);
3391
+ return Object.freeze({
3392
+ threadId: runtime.threadId,
3393
+ capabilities: runtime.capabilities,
3394
+ isDisabled: runtime.isDisabled,
3395
+ isRunning: lastMessage?.role !== "assistant" ? false : lastMessage.status.type === "running",
3396
+ messages: runtime.messages,
3397
+ unstable_synchronizer: runtime.unstable_synchronizer
3398
+ });
3497
3399
  };
3498
3400
  var ThreadRuntime = class {
3499
- constructor(_threadBinding) {
3500
- this._threadBinding = _threadBinding;
3501
- }
3502
3401
  // public path = "assistant.threads[main]"; // TODO
3503
3402
  /**
3504
3403
  * @deprecated Use `getState().threadId` instead. This will be removed in 0.6.0.
@@ -3524,24 +3423,40 @@ var ThreadRuntime = class {
3524
3423
  get capabilities() {
3525
3424
  return this.getState().capabilities;
3526
3425
  }
3527
- // TODO this should instead return getMessageByIndex([idx])
3426
+ /**
3427
+ * @deprecated Use `getState().messages` instead. This will be removed in 0.6.0.
3428
+ */
3528
3429
  get messages() {
3529
3430
  return this._threadBinding.getState().messages;
3530
3431
  }
3531
3432
  unstable_getCore() {
3532
3433
  return this._threadBinding.getState();
3533
3434
  }
3534
- composer = new ThreadComposerRuntime(
3435
+ _threadBinding;
3436
+ constructor(threadBinding) {
3437
+ const stateBinding = new LazyMemoizeSubject({
3438
+ getState: () => getThreadState(threadBinding.getState()),
3439
+ subscribe: (callback) => threadBinding.subscribe(callback)
3440
+ });
3441
+ this._threadBinding = {
3442
+ getState: () => threadBinding.getState(),
3443
+ getStateState: () => stateBinding.getState(),
3444
+ subscribe: (callback) => threadBinding.subscribe(callback)
3445
+ };
3446
+ }
3447
+ composer = new ComposerRuntime(
3535
3448
  new NestedSubscriptionSubject({
3536
3449
  getState: () => this._threadBinding.getState().composer,
3537
3450
  subscribe: (callback) => this._threadBinding.subscribe(callback)
3538
3451
  })
3539
3452
  );
3540
3453
  getState() {
3541
- return new ThreadState(this._threadBinding.getState());
3454
+ return this._threadBinding.getStateState();
3542
3455
  }
3543
3456
  append(message) {
3544
- this._threadBinding.getState().append(message);
3457
+ this._threadBinding.getState().append(
3458
+ toAppendMessage(this._threadBinding.getState().messages, message)
3459
+ );
3545
3460
  }
3546
3461
  subscribe(callback) {
3547
3462
  return this._threadBinding.subscribe(callback);
@@ -3585,6 +3500,18 @@ var ThreadRuntime = class {
3585
3500
  submitFeedback(options) {
3586
3501
  return this._threadBinding.getState().submitFeedback(options);
3587
3502
  }
3503
+ /**
3504
+ * @deprecated This is a temporary API. This will be removed in 0.6.0.
3505
+ */
3506
+ getEditComposer(messageId) {
3507
+ return this._threadBinding.getState().getEditComposer(messageId);
3508
+ }
3509
+ /**
3510
+ * @deprecated This is a temporary API. This will be removed in 0.6.0.
3511
+ */
3512
+ beginEdit(messageId) {
3513
+ return this._threadBinding.getState().beginEdit(messageId);
3514
+ }
3588
3515
  export() {
3589
3516
  return this._threadBinding.getState().export();
3590
3517
  }
@@ -3596,14 +3523,15 @@ var ThreadRuntime = class {
3596
3523
  return new MessageRuntime(
3597
3524
  new ShallowMemoizeSubject({
3598
3525
  getState: () => {
3599
- const messages = this.messages;
3600
- const message = messages[idx];
3526
+ const messages2 = this.messages;
3527
+ const message = messages2[idx];
3601
3528
  if (!message) return void 0;
3602
3529
  const branches = this._threadBinding.getState().getBranches(message.id);
3603
3530
  return {
3531
+ ...message,
3604
3532
  message,
3605
- isLast: idx === messages.length - 1,
3606
- parentId: messages[idx - 1]?.id ?? null,
3533
+ isLast: idx === messages2.length - 1,
3534
+ parentId: messages2[idx - 1]?.id ?? null,
3607
3535
  branches,
3608
3536
  branchNumber: branches.indexOf(message.id) + 1,
3609
3537
  branchCount: branches.length
@@ -3618,12 +3546,12 @@ var ThreadRuntime = class {
3618
3546
 
3619
3547
  // src/runtimes/edge/converters/fromLanguageModelMessages.ts
3620
3548
  var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3621
- const messages = [];
3549
+ const messages2 = [];
3622
3550
  for (const lmMessage of lm) {
3623
3551
  const role = lmMessage.role;
3624
3552
  switch (role) {
3625
3553
  case "system": {
3626
- messages.push({
3554
+ messages2.push({
3627
3555
  role: "system",
3628
3556
  content: [
3629
3557
  {
@@ -3635,7 +3563,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3635
3563
  break;
3636
3564
  }
3637
3565
  case "user": {
3638
- messages.push({
3566
+ messages2.push({
3639
3567
  role: "user",
3640
3568
  content: lmMessage.content.map((part) => {
3641
3569
  const type = part.type;
@@ -3678,20 +3606,20 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3678
3606
  return part;
3679
3607
  });
3680
3608
  if (mergeRoundtrips) {
3681
- const previousMessage = messages[messages.length - 1];
3609
+ const previousMessage = messages2[messages2.length - 1];
3682
3610
  if (previousMessage?.role === "assistant") {
3683
3611
  previousMessage.content.push(...newContent);
3684
3612
  break;
3685
3613
  }
3686
3614
  }
3687
- messages.push({
3615
+ messages2.push({
3688
3616
  role: "assistant",
3689
3617
  content: newContent
3690
3618
  });
3691
3619
  break;
3692
3620
  }
3693
3621
  case "tool": {
3694
- const previousMessage = messages[messages.length - 1];
3622
+ const previousMessage = messages2[messages2.length - 1];
3695
3623
  if (previousMessage?.role !== "assistant")
3696
3624
  throw new Error(
3697
3625
  "A tool message must be preceded by an assistant message."
@@ -3717,7 +3645,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3717
3645
  }
3718
3646
  }
3719
3647
  }
3720
- return messages;
3648
+ return messages2;
3721
3649
  };
3722
3650
 
3723
3651
  // src/runtimes/edge/converters/fromLanguageModelTools.ts
@@ -3875,7 +3803,7 @@ var EdgeChatAdapter = class {
3875
3803
  constructor(options) {
3876
3804
  this.options = options;
3877
3805
  }
3878
- async *run({ messages, abortSignal, config }) {
3806
+ async *run({ messages: messages2, abortSignal, config }) {
3879
3807
  const headers = new Headers(this.options.headers);
3880
3808
  headers.set("Content-Type", "application/json");
3881
3809
  const result = await fetch(this.options.api, {
@@ -3884,7 +3812,7 @@ var EdgeChatAdapter = class {
3884
3812
  credentials: this.options.credentials ?? "same-origin",
3885
3813
  body: JSON.stringify({
3886
3814
  system: config.system,
3887
- messages: toCoreMessages(messages),
3815
+ messages: toCoreMessages(messages2),
3888
3816
  tools: config.tools ? toLanguageModelTools(config.tools) : [],
3889
3817
  ...config.callSettings,
3890
3818
  ...config.config,
@@ -3923,6 +3851,43 @@ var useEdgeRuntime = ({
3923
3851
  // src/runtimes/local/shouldContinue.tsx
3924
3852
  var shouldContinue = (result) => result.status?.type === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
3925
3853
 
3854
+ // src/runtimes/composer/DefaultEditComposerRuntimeCore.tsx
3855
+ var DefaultEditComposerRuntimeCore = class extends BaseComposerRuntimeCore {
3856
+ constructor(runtime, endEditCallback, { parentId, message }) {
3857
+ super();
3858
+ this.runtime = runtime;
3859
+ this.endEditCallback = endEditCallback;
3860
+ this._parentId = parentId;
3861
+ this._previousText = getThreadMessageText(message);
3862
+ this.setText(this._previousText);
3863
+ this._nonTextParts = message.content.filter(
3864
+ (part) => part.type !== "text" && part.type !== "ui"
3865
+ );
3866
+ }
3867
+ get canCancel() {
3868
+ return true;
3869
+ }
3870
+ _nonTextParts;
3871
+ _previousText;
3872
+ _parentId;
3873
+ async handleSend(message) {
3874
+ const text = getThreadMessageText(message);
3875
+ if (text !== this._previousText) {
3876
+ this.runtime.append({
3877
+ ...message,
3878
+ content: [...message.content, ...this._nonTextParts],
3879
+ parentId: this._parentId
3880
+ });
3881
+ }
3882
+ this.endEditCallback();
3883
+ this.notifySubscribers();
3884
+ }
3885
+ async cancel() {
3886
+ this.endEditCallback();
3887
+ this.notifySubscribers();
3888
+ }
3889
+ };
3890
+
3926
3891
  // src/runtimes/local/LocalThreadRuntimeCore.tsx
3927
3892
  var LocalThreadRuntimeCore = class {
3928
3893
  constructor(configProvider, adapter, { initialMessages, ...options }) {
@@ -3932,8 +3897,8 @@ var LocalThreadRuntimeCore = class {
3932
3897
  this.options = options;
3933
3898
  if (initialMessages) {
3934
3899
  let parentId = null;
3935
- const messages = fromCoreMessages(initialMessages);
3936
- for (const message of messages) {
3900
+ const messages2 = fromCoreMessages(initialMessages);
3901
+ for (const message of messages2) {
3937
3902
  this.repository.addOrUpdateMessage(parentId, message);
3938
3903
  parentId = message.id;
3939
3904
  }
@@ -3957,7 +3922,7 @@ var LocalThreadRuntimeCore = class {
3957
3922
  get messages() {
3958
3923
  return this.repository.getMessages();
3959
3924
  }
3960
- composer = new BaseThreadComposerRuntimeCore(this);
3925
+ composer = new DefaultThreadComposerRuntimeCore(this);
3961
3926
  getModelConfig() {
3962
3927
  return this.configProvider.getModelConfig();
3963
3928
  }
@@ -3986,6 +3951,23 @@ var LocalThreadRuntimeCore = class {
3986
3951
  }
3987
3952
  if (hasUpdates) this.notifySubscribers();
3988
3953
  }
3954
+ _editComposers = /* @__PURE__ */ new Map();
3955
+ getEditComposer(messageId) {
3956
+ return this._editComposers.get(messageId);
3957
+ }
3958
+ beginEdit(messageId) {
3959
+ if (this._editComposers.has(messageId))
3960
+ throw new Error("Edit already in progress");
3961
+ this._editComposers.set(
3962
+ messageId,
3963
+ new DefaultEditComposerRuntimeCore(
3964
+ this,
3965
+ () => this._editComposers.delete(messageId),
3966
+ this.repository.getMessage(messageId)
3967
+ )
3968
+ );
3969
+ this.notifySubscribers();
3970
+ }
3989
3971
  getBranches(messageId) {
3990
3972
  return this.repository.getBranches(messageId);
3991
3973
  }
@@ -4020,7 +4002,7 @@ var LocalThreadRuntimeCore = class {
4020
4002
  } while (shouldContinue(message));
4021
4003
  }
4022
4004
  async performRoundtrip(parentId, message) {
4023
- const messages = this.repository.getMessages();
4005
+ const messages2 = this.repository.getMessages();
4024
4006
  this.abortController?.abort();
4025
4007
  this.abortController = new AbortController();
4026
4008
  const initialContent = message.content;
@@ -4075,7 +4057,7 @@ var LocalThreadRuntimeCore = class {
4075
4057
  }
4076
4058
  try {
4077
4059
  const promiseOrGenerator = this.adapter.run({
4078
- messages,
4060
+ messages: messages2,
4079
4061
  abortSignal: this.abortController.signal,
4080
4062
  config: this.configProvider.getModelConfig(),
4081
4063
  onUpdate: updateMessage
@@ -4217,10 +4199,10 @@ var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
4217
4199
  } = {}) {
4218
4200
  this.switchToThread(null);
4219
4201
  if (!initialMessages) return;
4220
- const messages = fromCoreMessages(initialMessages);
4202
+ const messages2 = fromCoreMessages(initialMessages);
4221
4203
  this.thread.import({
4222
- messages: messages.map((m, idx) => ({
4223
- parentId: messages[idx - 1]?.id ?? null,
4204
+ messages: messages2.map((m, idx) => ({
4205
+ parentId: messages2[idx - 1]?.id ?? null,
4224
4206
  message: m
4225
4207
  }))
4226
4208
  });
@@ -4239,15 +4221,15 @@ var LocalRuntime = class extends AssistantRuntime {
4239
4221
  };
4240
4222
  var useLocalRuntime = (adapter, options = {}) => {
4241
4223
  const [runtime] = useState12(() => new LocalRuntimeCore(adapter, options));
4242
- useInsertionEffect2(() => {
4224
+ useInsertionEffect(() => {
4243
4225
  runtime.thread.adapter = adapter;
4244
4226
  runtime.thread.options = options;
4245
4227
  });
4246
- return useMemo4(() => new LocalRuntime(runtime), [runtime]);
4228
+ return useMemo8(() => new LocalRuntime(runtime), [runtime]);
4247
4229
  };
4248
4230
 
4249
4231
  // src/runtimes/external-store/useExternalStoreRuntime.tsx
4250
- import { useEffect as useEffect15, useMemo as useMemo5, useState as useState13 } from "react";
4232
+ import { useEffect as useEffect15, useMemo as useMemo9, useState as useState13 } from "react";
4251
4233
 
4252
4234
  // src/runtimes/external-store/getExternalStoreMessage.tsx
4253
4235
  var symbolInnerMessage = Symbol("innerMessage");
@@ -4258,8 +4240,8 @@ var getExternalStoreMessage = (message) => {
4258
4240
  // src/runtimes/external-store/ThreadMessageConverter.ts
4259
4241
  var ThreadMessageConverter = class {
4260
4242
  cache = /* @__PURE__ */ new WeakMap();
4261
- convertMessages(messages, converter) {
4262
- return messages.map((m, idx) => {
4243
+ convertMessages(messages2, converter) {
4244
+ return messages2.map((m, idx) => {
4263
4245
  const cached = this.cache.get(m);
4264
4246
  const newMessage = converter(cached, m, idx);
4265
4247
  this.cache.set(m, newMessage);
@@ -4352,8 +4334,8 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
4352
4334
  };
4353
4335
 
4354
4336
  // src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx
4355
- var hasUpcomingMessage = (isRunning, messages) => {
4356
- return isRunning && messages[messages.length - 1]?.role !== "assistant";
4337
+ var hasUpcomingMessage = (isRunning, messages2) => {
4338
+ return isRunning && messages2[messages2.length - 1]?.role !== "assistant";
4357
4339
  };
4358
4340
  var ExternalStoreThreadRuntimeCore = class {
4359
4341
  constructor(configProvider, store) {
@@ -4381,7 +4363,24 @@ var ExternalStoreThreadRuntimeCore = class {
4381
4363
  isDisabled;
4382
4364
  converter = new ThreadMessageConverter();
4383
4365
  _store;
4384
- composer = new BaseThreadComposerRuntimeCore(this);
4366
+ composer = new DefaultThreadComposerRuntimeCore(this);
4367
+ _editComposers = /* @__PURE__ */ new Map();
4368
+ getEditComposer(messageId) {
4369
+ return this._editComposers.get(messageId);
4370
+ }
4371
+ beginEdit(messageId) {
4372
+ if (this._editComposers.has(messageId))
4373
+ throw new Error("Edit already in progress");
4374
+ this._editComposers.set(
4375
+ messageId,
4376
+ new DefaultEditComposerRuntimeCore(
4377
+ this,
4378
+ () => this._editComposers.delete(messageId),
4379
+ this.repository.getMessage(messageId)
4380
+ )
4381
+ );
4382
+ this.notifySubscribers();
4383
+ }
4385
4384
  get store() {
4386
4385
  return this._store;
4387
4386
  }
@@ -4412,7 +4411,7 @@ var ExternalStoreThreadRuntimeCore = class {
4412
4411
  return;
4413
4412
  }
4414
4413
  }
4415
- const messages = !store.convertMessage ? store.messages : this.converter.convertMessages(store.messages, (cache, m, idx) => {
4414
+ const messages2 = !store.convertMessage ? store.messages : this.converter.convertMessages(store.messages, (cache, m, idx) => {
4416
4415
  if (!store.convertMessage) return m;
4417
4416
  const isLast = idx === store.messages.length - 1;
4418
4417
  const autoStatus = getAutoStatus(isLast, isRunning);
@@ -4426,18 +4425,18 @@ var ExternalStoreThreadRuntimeCore = class {
4426
4425
  newMessage[symbolInnerMessage] = m;
4427
4426
  return newMessage;
4428
4427
  });
4429
- for (let i = 0; i < messages.length; i++) {
4430
- const message = messages[i];
4431
- const parent = messages[i - 1];
4428
+ for (let i = 0; i < messages2.length; i++) {
4429
+ const message = messages2[i];
4430
+ const parent = messages2[i - 1];
4432
4431
  this.repository.addOrUpdateMessage(parent?.id ?? null, message);
4433
4432
  }
4434
4433
  if (this.assistantOptimisticId) {
4435
4434
  this.repository.deleteMessage(this.assistantOptimisticId);
4436
4435
  this.assistantOptimisticId = null;
4437
4436
  }
4438
- if (hasUpcomingMessage(isRunning, messages)) {
4437
+ if (hasUpcomingMessage(isRunning, messages2)) {
4439
4438
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
4440
- messages.at(-1)?.id ?? null,
4439
+ messages2.at(-1)?.id ?? null,
4441
4440
  {
4442
4441
  role: "assistant",
4443
4442
  content: []
@@ -4445,7 +4444,7 @@ var ExternalStoreThreadRuntimeCore = class {
4445
4444
  );
4446
4445
  }
4447
4446
  this.repository.resetHead(
4448
- this.assistantOptimisticId ?? messages.at(-1)?.id ?? null
4447
+ this.assistantOptimisticId ?? messages2.at(-1)?.id ?? null
4449
4448
  );
4450
4449
  this.messages = this.repository.getMessages();
4451
4450
  this.notifySubscribers();
@@ -4487,19 +4486,19 @@ var ExternalStoreThreadRuntimeCore = class {
4487
4486
  this.repository.deleteMessage(this.assistantOptimisticId);
4488
4487
  this.assistantOptimisticId = null;
4489
4488
  }
4490
- let messages = this.repository.getMessages();
4491
- const previousMessage = messages[messages.length - 1];
4492
- if (previousMessage?.role === "user" && previousMessage.id === messages.at(-1)?.id) {
4489
+ let messages2 = this.repository.getMessages();
4490
+ const previousMessage = messages2[messages2.length - 1];
4491
+ if (previousMessage?.role === "user" && previousMessage.id === messages2.at(-1)?.id) {
4493
4492
  this.repository.deleteMessage(previousMessage.id);
4494
4493
  if (!this.composer.text.trim()) {
4495
4494
  this.composer.setText(getThreadMessageText(previousMessage));
4496
4495
  }
4497
- messages = this.repository.getMessages();
4496
+ messages2 = this.repository.getMessages();
4498
4497
  } else {
4499
4498
  this.notifySubscribers();
4500
4499
  }
4501
4500
  setTimeout(() => {
4502
- this.updateMessages(messages);
4501
+ this.updateMessages(messages2);
4503
4502
  }, 0);
4504
4503
  }
4505
4504
  addToolResult(options) {
@@ -4523,9 +4522,9 @@ var ExternalStoreThreadRuntimeCore = class {
4523
4522
  this._subscriptions.add(callback);
4524
4523
  return () => this._subscriptions.delete(callback);
4525
4524
  }
4526
- updateMessages = (messages) => {
4525
+ updateMessages = (messages2) => {
4527
4526
  this._store.setMessages?.(
4528
- messages.flatMap(getExternalStoreMessage).filter((m) => m != null)
4527
+ messages2.flatMap(getExternalStoreMessage).filter((m) => m != null)
4529
4528
  );
4530
4529
  };
4531
4530
  import(repository) {
@@ -4587,17 +4586,17 @@ var useExternalStoreRuntime = (store) => {
4587
4586
  useEffect15(() => {
4588
4587
  runtime.thread.store = store;
4589
4588
  });
4590
- return useMemo5(() => new AssistantRuntime(runtime, ThreadRuntime), [runtime]);
4589
+ return useMemo9(() => new AssistantRuntime(runtime, ThreadRuntime), [runtime]);
4591
4590
  };
4592
4591
 
4593
4592
  // src/runtimes/external-store/external-message-converter.tsx
4594
- import { useMemo as useMemo6 } from "react";
4595
- var joinExternalMessages = (messages) => {
4593
+ import { useMemo as useMemo10 } from "react";
4594
+ var joinExternalMessages = (messages2) => {
4596
4595
  const assistantMessage = {
4597
4596
  role: "assistant",
4598
4597
  content: []
4599
4598
  };
4600
- for (const output of messages) {
4599
+ for (const output of messages2) {
4601
4600
  if (output.role === "tool") {
4602
4601
  const toolCallIdx = assistantMessage.content.findIndex(
4603
4602
  (c) => c.type === "tool-call" && c.toolCallId === output.toolCallId
@@ -4620,19 +4619,18 @@ var joinExternalMessages = (messages) => {
4620
4619
  );
4621
4620
  }
4622
4621
  } else {
4623
- const content = output.content;
4624
4622
  const role = output.role;
4625
4623
  switch (role) {
4626
4624
  case "system":
4627
4625
  case "user":
4628
- return { role, content };
4626
+ return output;
4629
4627
  case "assistant":
4630
4628
  if (assistantMessage.content.length === 0) {
4631
4629
  assistantMessage.id = output.id;
4632
4630
  assistantMessage.createdAt ??= output.createdAt;
4633
4631
  assistantMessage.status ??= output.status;
4634
4632
  }
4635
- assistantMessage.content.push(...content);
4633
+ assistantMessage.content.push(...output.content);
4636
4634
  break;
4637
4635
  default: {
4638
4636
  const unsupportedRole = role;
@@ -4675,10 +4673,10 @@ var chunkExternalMessages = (callbackResults) => {
4675
4673
  };
4676
4674
  var useExternalMessageConverter = ({
4677
4675
  callback,
4678
- messages,
4676
+ messages: messages2,
4679
4677
  isRunning
4680
4678
  }) => {
4681
- const state = useMemo6(
4679
+ const state = useMemo10(
4682
4680
  () => ({
4683
4681
  callback,
4684
4682
  callbackCache: /* @__PURE__ */ new WeakMap(),
@@ -4687,9 +4685,9 @@ var useExternalMessageConverter = ({
4687
4685
  }),
4688
4686
  [callback]
4689
4687
  );
4690
- return useMemo6(() => {
4688
+ return useMemo10(() => {
4691
4689
  const callbackResults = [];
4692
- for (const message of messages) {
4690
+ for (const message of messages2) {
4693
4691
  let result = state.callbackCache.get(message);
4694
4692
  if (!result) {
4695
4693
  const output = state.callback(message);
@@ -4727,7 +4725,7 @@ var useExternalMessageConverter = ({
4727
4725
  return newMessage;
4728
4726
  }
4729
4727
  );
4730
- }, [state, messages, isRunning]);
4728
+ }, [state, messages2, isRunning]);
4731
4729
  };
4732
4730
  var shallowArrayEqual = (a, b) => {
4733
4731
  if (a.length !== b.length) return false;
@@ -4745,13 +4743,13 @@ var DangerousInBrowserAdapter = class {
4745
4743
  constructor(options) {
4746
4744
  this.options = options;
4747
4745
  }
4748
- async *run({ messages, abortSignal, config }) {
4746
+ async *run({ messages: messages2, abortSignal, config }) {
4749
4747
  const res = await getEdgeRuntimeStream({
4750
4748
  options: this.options,
4751
4749
  abortSignal,
4752
4750
  requestData: {
4753
4751
  system: config.system,
4754
- messages: toCoreMessages(messages),
4752
+ messages: toCoreMessages(messages2),
4755
4753
  tools: config.tools ? toLanguageModelTools(config.tools) : [],
4756
4754
  ...config.callSettings,
4757
4755
  ...config.config
@@ -4955,7 +4953,7 @@ import {
4955
4953
  createContext as createContext7,
4956
4954
  useContext as useContext4
4957
4955
  } from "react";
4958
- import { Fragment as Fragment3, jsx as jsx38 } from "react/jsx-runtime";
4956
+ import { Fragment as Fragment3, jsx as jsx37 } from "react/jsx-runtime";
4959
4957
  var ThreadConfigContext = createContext7({});
4960
4958
  var useThreadConfig = () => {
4961
4959
  return useContext4(ThreadConfigContext);
@@ -4965,14 +4963,14 @@ var ThreadConfigProvider = ({
4965
4963
  config
4966
4964
  }) => {
4967
4965
  const hasAssistant = !!useAssistantRuntime({ optional: true });
4968
- const configProvider = config && Object.keys(config ?? {}).length > 0 ? /* @__PURE__ */ jsx38(ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ jsx38(Fragment3, { children });
4966
+ const configProvider = config && Object.keys(config ?? {}).length > 0 ? /* @__PURE__ */ jsx37(ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ jsx37(Fragment3, { children });
4969
4967
  if (!config?.runtime) return configProvider;
4970
4968
  if (hasAssistant) {
4971
4969
  throw new Error(
4972
4970
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
4973
4971
  );
4974
4972
  }
4975
- return /* @__PURE__ */ jsx38(AssistantRuntimeProvider, { runtime: config.runtime, children: configProvider });
4973
+ return /* @__PURE__ */ jsx37(AssistantRuntimeProvider, { runtime: config.runtime, children: configProvider });
4976
4974
  };
4977
4975
  ThreadConfigProvider.displayName = "ThreadConfigProvider";
4978
4976
 
@@ -4987,7 +4985,7 @@ import {
4987
4985
  ThumbsDownIcon,
4988
4986
  ThumbsUpIcon
4989
4987
  } from "lucide-react";
4990
- import { Fragment as Fragment4, jsx as jsx39, jsxs as jsxs4 } from "react/jsx-runtime";
4988
+ import { Fragment as Fragment4, jsx as jsx38, jsxs as jsxs4 } from "react/jsx-runtime";
4991
4989
  var useAllowCopy = (ensureCapability = false) => {
4992
4990
  const { assistantMessage: { allowCopy = true } = {} } = useThreadConfig();
4993
4991
  const copySupported = useThread((t) => t.capabilities.unstable_copy);
@@ -5028,11 +5026,11 @@ var AssistantActionBar = () => {
5028
5026
  autohide: "not-last",
5029
5027
  autohideFloat: "single-branch",
5030
5028
  children: [
5031
- allowSpeak && /* @__PURE__ */ jsx39(AssistantActionBarSpeechControl, {}),
5032
- allowCopy && /* @__PURE__ */ jsx39(AssistantActionBarCopy, {}),
5033
- allowReload && /* @__PURE__ */ jsx39(AssistantActionBarReload, {}),
5034
- allowFeedbackPositive && /* @__PURE__ */ jsx39(AssistantActionBarFeedbackPositive, {}),
5035
- allowFeedbackNegative && /* @__PURE__ */ jsx39(AssistantActionBarFeedbackNegative, {})
5029
+ allowSpeak && /* @__PURE__ */ jsx38(AssistantActionBarSpeechControl, {}),
5030
+ allowCopy && /* @__PURE__ */ jsx38(AssistantActionBarCopy, {}),
5031
+ allowReload && /* @__PURE__ */ jsx38(AssistantActionBarReload, {}),
5032
+ allowFeedbackPositive && /* @__PURE__ */ jsx38(AssistantActionBarFeedbackPositive, {}),
5033
+ allowFeedbackNegative && /* @__PURE__ */ jsx38(AssistantActionBarFeedbackNegative, {})
5036
5034
  ]
5037
5035
  }
5038
5036
  );
@@ -5048,16 +5046,16 @@ var AssistantActionBarCopy = forwardRef22((props, ref) => {
5048
5046
  assistantMessage: { copy: { tooltip = "Copy" } = {} } = {}
5049
5047
  } = {}
5050
5048
  } = useThreadConfig();
5051
- return /* @__PURE__ */ jsx39(actionBar_exports.Copy, { asChild: true, children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsxs4(Fragment4, { children: [
5052
- /* @__PURE__ */ jsx39(message_exports.If, { copied: true, children: /* @__PURE__ */ jsx39(CheckIcon, {}) }),
5053
- /* @__PURE__ */ jsx39(message_exports.If, { copied: false, children: /* @__PURE__ */ jsx39(CopyIcon, {}) })
5049
+ return /* @__PURE__ */ jsx38(actionBar_exports.Copy, { asChild: true, children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsxs4(Fragment4, { children: [
5050
+ /* @__PURE__ */ jsx38(message_exports.If, { copied: true, children: /* @__PURE__ */ jsx38(CheckIcon, {}) }),
5051
+ /* @__PURE__ */ jsx38(message_exports.If, { copied: false, children: /* @__PURE__ */ jsx38(CopyIcon, {}) })
5054
5052
  ] }) }) });
5055
5053
  });
5056
5054
  AssistantActionBarCopy.displayName = "AssistantActionBarCopy";
5057
5055
  var AssistantActionBarSpeechControl = () => {
5058
5056
  return /* @__PURE__ */ jsxs4(Fragment4, { children: [
5059
- /* @__PURE__ */ jsx39(message_exports.If, { speaking: false, children: /* @__PURE__ */ jsx39(AssistantActionBarSpeak, {}) }),
5060
- /* @__PURE__ */ jsx39(message_exports.If, { speaking: true, children: /* @__PURE__ */ jsx39(AssistantActionBarStopSpeaking, {}) })
5057
+ /* @__PURE__ */ jsx38(message_exports.If, { speaking: false, children: /* @__PURE__ */ jsx38(AssistantActionBarSpeak, {}) }),
5058
+ /* @__PURE__ */ jsx38(message_exports.If, { speaking: true, children: /* @__PURE__ */ jsx38(AssistantActionBarStopSpeaking, {}) })
5061
5059
  ] });
5062
5060
  };
5063
5061
  var AssistantActionBarSpeak = forwardRef22((props, ref) => {
@@ -5067,7 +5065,7 @@ var AssistantActionBarSpeak = forwardRef22((props, ref) => {
5067
5065
  } = {}
5068
5066
  } = useThreadConfig();
5069
5067
  const allowSpeak = useAllowSpeak();
5070
- return /* @__PURE__ */ jsx39(actionBar_exports.Speak, { disabled: !allowSpeak, asChild: true, children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx39(AudioLinesIcon, {}) }) });
5068
+ return /* @__PURE__ */ jsx38(actionBar_exports.Speak, { disabled: !allowSpeak, asChild: true, children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx38(AudioLinesIcon, {}) }) });
5071
5069
  });
5072
5070
  AssistantActionBarSpeak.displayName = "AssistantActionBarSpeak";
5073
5071
  var AssistantActionBarStopSpeaking = forwardRef22((props, ref) => {
@@ -5079,7 +5077,7 @@ var AssistantActionBarStopSpeaking = forwardRef22((props, ref) => {
5079
5077
  } = {}
5080
5078
  } = useThreadConfig();
5081
5079
  const allowSpeak = useAllowSpeak();
5082
- return /* @__PURE__ */ jsx39(actionBar_exports.StopSpeaking, { disabled: !allowSpeak, asChild: true, children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip: stopTooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx39(StopCircleIcon, {}) }) });
5080
+ return /* @__PURE__ */ jsx38(actionBar_exports.StopSpeaking, { disabled: !allowSpeak, asChild: true, children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip: stopTooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx38(StopCircleIcon, {}) }) });
5083
5081
  });
5084
5082
  AssistantActionBarStopSpeaking.displayName = "AssistantActionBarStopSpeaking";
5085
5083
  var AssistantActionBarReload = forwardRef22((props, ref) => {
@@ -5089,7 +5087,7 @@ var AssistantActionBarReload = forwardRef22((props, ref) => {
5089
5087
  } = {}
5090
5088
  } = useThreadConfig();
5091
5089
  const allowReload = useAllowReload();
5092
- return /* @__PURE__ */ jsx39(actionBar_exports.Reload, { disabled: !allowReload, asChild: true, children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx39(RefreshCwIcon, {}) }) });
5090
+ return /* @__PURE__ */ jsx38(actionBar_exports.Reload, { disabled: !allowReload, asChild: true, children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx38(RefreshCwIcon, {}) }) });
5093
5091
  });
5094
5092
  AssistantActionBarReload.displayName = "AssistantActionBarReload";
5095
5093
  var AssistantActionBarFeedbackPositive = forwardRef22((props, ref) => {
@@ -5101,13 +5099,13 @@ var AssistantActionBarFeedbackPositive = forwardRef22((props, ref) => {
5101
5099
  } = {}
5102
5100
  } = useThreadConfig();
5103
5101
  const allowFeedbackPositive = useAllowFeedbackPositive();
5104
- return /* @__PURE__ */ jsx39(
5102
+ return /* @__PURE__ */ jsx38(
5105
5103
  actionBar_exports.FeedbackPositive,
5106
5104
  {
5107
5105
  disabled: !allowFeedbackPositive,
5108
5106
  className: "aui-assistant-action-bar-feedback-positive",
5109
5107
  asChild: true,
5110
- children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx39(ThumbsUpIcon, {}) })
5108
+ children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx38(ThumbsUpIcon, {}) })
5111
5109
  }
5112
5110
  );
5113
5111
  });
@@ -5121,13 +5119,13 @@ var AssistantActionBarFeedbackNegative = forwardRef22((props, ref) => {
5121
5119
  } = {}
5122
5120
  } = useThreadConfig();
5123
5121
  const allowFeedbackNegative = useAllowFeedbackNegative();
5124
- return /* @__PURE__ */ jsx39(
5122
+ return /* @__PURE__ */ jsx38(
5125
5123
  actionBar_exports.FeedbackNegative,
5126
5124
  {
5127
5125
  disabled: !allowFeedbackNegative,
5128
5126
  className: "aui-assistant-action-bar-feedback-negative",
5129
5127
  asChild: true,
5130
- children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx39(ThumbsDownIcon, {}) })
5128
+ children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx38(ThumbsDownIcon, {}) })
5131
5129
  }
5132
5130
  );
5133
5131
  });
@@ -5148,12 +5146,12 @@ var assistant_action_bar_default = Object.assign(
5148
5146
  );
5149
5147
 
5150
5148
  // src/ui/assistant-message.tsx
5151
- import { forwardRef as forwardRef24, useMemo as useMemo7 } from "react";
5149
+ import { forwardRef as forwardRef24, useMemo as useMemo11 } from "react";
5152
5150
 
5153
5151
  // src/ui/branch-picker.tsx
5154
5152
  import { forwardRef as forwardRef23 } from "react";
5155
5153
  import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
5156
- import { jsx as jsx40, jsxs as jsxs5 } from "react/jsx-runtime";
5154
+ import { jsx as jsx39, jsxs as jsxs5 } from "react/jsx-runtime";
5157
5155
  var useAllowBranchPicker = (ensureCapability = false) => {
5158
5156
  const { branchPicker: { allowBranchPicker = true } = {} } = useThreadConfig();
5159
5157
  const branchPickerSupported = useThread((t) => t.capabilities.edit);
@@ -5163,9 +5161,9 @@ var BranchPicker = () => {
5163
5161
  const allowBranchPicker = useAllowBranchPicker();
5164
5162
  if (!allowBranchPicker) return null;
5165
5163
  return /* @__PURE__ */ jsxs5(BranchPickerRoot, { hideWhenSingleBranch: true, children: [
5166
- /* @__PURE__ */ jsx40(BranchPickerPrevious2, {}),
5167
- /* @__PURE__ */ jsx40(BranchPickerState, {}),
5168
- /* @__PURE__ */ jsx40(BranchPickerNext, {})
5164
+ /* @__PURE__ */ jsx39(BranchPickerPrevious2, {}),
5165
+ /* @__PURE__ */ jsx39(BranchPickerState, {}),
5166
+ /* @__PURE__ */ jsx39(BranchPickerNext, {})
5169
5167
  ] });
5170
5168
  };
5171
5169
  BranchPicker.displayName = "BranchPicker";
@@ -5180,7 +5178,7 @@ var BranchPickerPrevious2 = forwardRef23((props, ref) => {
5180
5178
  } = {}
5181
5179
  } = useThreadConfig();
5182
5180
  const allowBranchPicker = useAllowBranchPicker();
5183
- return /* @__PURE__ */ jsx40(branchPicker_exports.Previous, { disabled: !allowBranchPicker, asChild: true, children: /* @__PURE__ */ jsx40(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx40(ChevronLeftIcon, {}) }) });
5181
+ return /* @__PURE__ */ jsx39(branchPicker_exports.Previous, { disabled: !allowBranchPicker, asChild: true, children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx39(ChevronLeftIcon, {}) }) });
5184
5182
  });
5185
5183
  BranchPickerPrevious2.displayName = "BranchPickerPrevious";
5186
5184
  var BranchPickerStateWrapper = withDefaults("span", {
@@ -5188,9 +5186,9 @@ var BranchPickerStateWrapper = withDefaults("span", {
5188
5186
  });
5189
5187
  var BranchPickerState = forwardRef23((props, ref) => {
5190
5188
  return /* @__PURE__ */ jsxs5(BranchPickerStateWrapper, { ...props, ref, children: [
5191
- /* @__PURE__ */ jsx40(branchPicker_exports.Number, {}),
5189
+ /* @__PURE__ */ jsx39(branchPicker_exports.Number, {}),
5192
5190
  " / ",
5193
- /* @__PURE__ */ jsx40(branchPicker_exports.Count, {})
5191
+ /* @__PURE__ */ jsx39(branchPicker_exports.Count, {})
5194
5192
  ] });
5195
5193
  });
5196
5194
  BranchPickerState.displayName = "BranchPickerState";
@@ -5199,7 +5197,7 @@ var BranchPickerNext = forwardRef23((props, ref) => {
5199
5197
  strings: { branchPicker: { next: { tooltip = "Next" } = {} } = {} } = {}
5200
5198
  } = useThreadConfig();
5201
5199
  const allowBranchPicker = useAllowBranchPicker();
5202
- return /* @__PURE__ */ jsx40(branchPicker_exports.Next, { disabled: !allowBranchPicker, asChild: true, children: /* @__PURE__ */ jsx40(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx40(ChevronRightIcon, {}) }) });
5200
+ return /* @__PURE__ */ jsx39(branchPicker_exports.Next, { disabled: !allowBranchPicker, asChild: true, children: /* @__PURE__ */ jsx39(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx39(ChevronRightIcon, {}) }) });
5203
5201
  });
5204
5202
  BranchPickerNext.displayName = "BranchPickerNext";
5205
5203
  var exports2 = {
@@ -5211,12 +5209,12 @@ var branch_picker_default = Object.assign(BranchPicker, exports2);
5211
5209
 
5212
5210
  // src/ui/base/avatar.tsx
5213
5211
  import * as AvatarPrimitive from "@radix-ui/react-avatar";
5214
- import { jsx as jsx41, jsxs as jsxs6 } from "react/jsx-runtime";
5212
+ import { jsx as jsx40, jsxs as jsxs6 } from "react/jsx-runtime";
5215
5213
  var Avatar = ({ src, alt, fallback }) => {
5216
5214
  if (src == null && fallback == null) return null;
5217
5215
  return /* @__PURE__ */ jsxs6(AvatarRoot, { children: [
5218
- src != null && /* @__PURE__ */ jsx41(AvatarImage, { src, alt }),
5219
- fallback != null && /* @__PURE__ */ jsx41(AvatarFallback, { children: fallback })
5216
+ src != null && /* @__PURE__ */ jsx40(AvatarImage, { src, alt }),
5217
+ fallback != null && /* @__PURE__ */ jsx40(AvatarFallback, { children: fallback })
5220
5218
  ] });
5221
5219
  };
5222
5220
  Avatar.displayName = "Avatar";
@@ -5235,10 +5233,10 @@ AvatarFallback.displayName = "AvatarFallback";
5235
5233
 
5236
5234
  // src/ui/content-part.tsx
5237
5235
  import classNames2 from "classnames";
5238
- import { jsx as jsx42 } from "react/jsx-runtime";
5236
+ import { jsx as jsx41 } from "react/jsx-runtime";
5239
5237
  var Text = () => {
5240
5238
  const status = useSmoothStatus();
5241
- return /* @__PURE__ */ jsx42(
5239
+ return /* @__PURE__ */ jsx41(
5242
5240
  contentPart_exports.Text,
5243
5241
  {
5244
5242
  className: classNames2(
@@ -5253,19 +5251,19 @@ var exports3 = { Text: withSmoothContextProvider(Text) };
5253
5251
  var content_part_default = exports3;
5254
5252
 
5255
5253
  // src/ui/assistant-message.tsx
5256
- import { jsx as jsx43, jsxs as jsxs7 } from "react/jsx-runtime";
5254
+ import { jsx as jsx42, jsxs as jsxs7 } from "react/jsx-runtime";
5257
5255
  var AssistantMessage = () => {
5258
5256
  return /* @__PURE__ */ jsxs7(AssistantMessageRoot, { children: [
5259
- /* @__PURE__ */ jsx43(AssistantMessageAvatar, {}),
5260
- /* @__PURE__ */ jsx43(AssistantMessageContent, {}),
5261
- /* @__PURE__ */ jsx43(branch_picker_default, {}),
5262
- /* @__PURE__ */ jsx43(assistant_action_bar_default, {})
5257
+ /* @__PURE__ */ jsx42(AssistantMessageAvatar, {}),
5258
+ /* @__PURE__ */ jsx42(AssistantMessageContent, {}),
5259
+ /* @__PURE__ */ jsx42(branch_picker_default, {}),
5260
+ /* @__PURE__ */ jsx42(assistant_action_bar_default, {})
5263
5261
  ] });
5264
5262
  };
5265
5263
  AssistantMessage.displayName = "AssistantMessage";
5266
5264
  var AssistantMessageAvatar = () => {
5267
5265
  const { assistantAvatar: avatar = { fallback: "A" } } = useThreadConfig();
5268
- return /* @__PURE__ */ jsx43(Avatar, { ...avatar });
5266
+ return /* @__PURE__ */ jsx42(Avatar, { ...avatar });
5269
5267
  };
5270
5268
  var AssistantMessageRoot = withDefaults(message_exports.Root, {
5271
5269
  className: "aui-assistant-message-root"
@@ -5276,7 +5274,7 @@ var AssistantMessageContentWrapper = withDefaults("div", {
5276
5274
  });
5277
5275
  var AssistantMessageContent = forwardRef24(({ components: componentsProp, ...rest }, ref) => {
5278
5276
  const { tools, assistantMessage: { components = {} } = {} } = useThreadConfig();
5279
- const toolsComponents = useMemo7(
5277
+ const toolsComponents = useMemo11(
5280
5278
  () => ({
5281
5279
  by_name: !tools ? void 0 : Object.fromEntries(
5282
5280
  tools.map((t) => [
@@ -5289,7 +5287,7 @@ var AssistantMessageContent = forwardRef24(({ components: componentsProp, ...res
5289
5287
  // eslint-disable-next-line react-hooks/exhaustive-deps
5290
5288
  [...tools ?? [], components.ToolFallback]
5291
5289
  );
5292
- return /* @__PURE__ */ jsx43(AssistantMessageContentWrapper, { ...rest, ref, children: /* @__PURE__ */ jsx43(
5290
+ return /* @__PURE__ */ jsx42(AssistantMessageContentWrapper, { ...rest, ref, children: /* @__PURE__ */ jsx42(
5293
5291
  message_exports.Content,
5294
5292
  {
5295
5293
  components: {
@@ -5324,9 +5322,9 @@ import { forwardRef as forwardRef26 } from "react";
5324
5322
  import { PaperclipIcon, SendHorizontalIcon } from "lucide-react";
5325
5323
 
5326
5324
  // src/ui/base/CircleStopIcon.tsx
5327
- import { jsx as jsx44 } from "react/jsx-runtime";
5325
+ import { jsx as jsx43 } from "react/jsx-runtime";
5328
5326
  var CircleStopIcon = () => {
5329
- return /* @__PURE__ */ jsx44(
5327
+ return /* @__PURE__ */ jsx43(
5330
5328
  "svg",
5331
5329
  {
5332
5330
  xmlns: "http://www.w3.org/2000/svg",
@@ -5334,7 +5332,7 @@ var CircleStopIcon = () => {
5334
5332
  fill: "currentColor",
5335
5333
  width: "16",
5336
5334
  height: "16",
5337
- children: /* @__PURE__ */ jsx44("rect", { width: "10", height: "10", x: "3", y: "3", rx: "2" })
5335
+ children: /* @__PURE__ */ jsx43("rect", { width: "10", height: "10", x: "3", y: "3", rx: "2" })
5338
5336
  }
5339
5337
  );
5340
5338
  };
@@ -5343,7 +5341,7 @@ CircleStopIcon.displayName = "CircleStopIcon";
5343
5341
  // src/ui/composer-attachment.tsx
5344
5342
  import { forwardRef as forwardRef25 } from "react";
5345
5343
  import { CircleXIcon } from "lucide-react";
5346
- import { jsx as jsx45, jsxs as jsxs8 } from "react/jsx-runtime";
5344
+ import { jsx as jsx44, jsxs as jsxs8 } from "react/jsx-runtime";
5347
5345
  var ComposerAttachmentRoot = withDefaults("div", {
5348
5346
  className: "aui-composer-attachment-root"
5349
5347
  });
@@ -5353,7 +5351,7 @@ var ComposerAttachment2 = () => {
5353
5351
  return /* @__PURE__ */ jsxs8(ComposerAttachmentRoot, { children: [
5354
5352
  ".",
5355
5353
  attachment.name.split(".").pop(),
5356
- /* @__PURE__ */ jsx45(ComposerAttachmentRemove, {})
5354
+ /* @__PURE__ */ jsx44(ComposerAttachmentRemove, {})
5357
5355
  ] });
5358
5356
  };
5359
5357
  ComposerAttachment2.displayName = "ComposerAttachment";
@@ -5368,7 +5366,7 @@ var ComposerAttachmentRemove = forwardRef25((props, ref) => {
5368
5366
  const handleRemoveAttachment = () => {
5369
5367
  composerStore.getState().removeAttachment(attachmentStore.getState().attachment.id);
5370
5368
  };
5371
- return /* @__PURE__ */ jsx45(
5369
+ return /* @__PURE__ */ jsx44(
5372
5370
  TooltipIconButton,
5373
5371
  {
5374
5372
  tooltip,
@@ -5377,7 +5375,7 @@ var ComposerAttachmentRemove = forwardRef25((props, ref) => {
5377
5375
  ...props,
5378
5376
  onClick: handleRemoveAttachment,
5379
5377
  ref,
5380
- children: props.children ?? /* @__PURE__ */ jsx45(CircleXIcon, {})
5378
+ children: props.children ?? /* @__PURE__ */ jsx44(CircleXIcon, {})
5381
5379
  }
5382
5380
  );
5383
5381
  });
@@ -5392,7 +5390,7 @@ var composer_attachment_default = Object.assign(
5392
5390
  );
5393
5391
 
5394
5392
  // src/ui/composer.tsx
5395
- import { Fragment as Fragment5, jsx as jsx46, jsxs as jsxs9 } from "react/jsx-runtime";
5393
+ import { Fragment as Fragment5, jsx as jsx45, jsxs as jsxs9 } from "react/jsx-runtime";
5396
5394
  var useAllowAttachments = (ensureCapability = false) => {
5397
5395
  const { composer: { allowAttachments = true } = {} } = useThreadConfig();
5398
5396
  const attachmentsSupported = useThread((t) => t.capabilities.attachments);
@@ -5401,10 +5399,10 @@ var useAllowAttachments = (ensureCapability = false) => {
5401
5399
  var Composer = () => {
5402
5400
  const allowAttachments = useAllowAttachments(true);
5403
5401
  return /* @__PURE__ */ jsxs9(ComposerRoot, { children: [
5404
- allowAttachments && /* @__PURE__ */ jsx46(ComposerAttachments, {}),
5405
- allowAttachments && /* @__PURE__ */ jsx46(ComposerAddAttachment, {}),
5406
- /* @__PURE__ */ jsx46(ComposerInput, { autoFocus: true }),
5407
- /* @__PURE__ */ jsx46(ComposerAction, {})
5402
+ allowAttachments && /* @__PURE__ */ jsx45(ComposerAttachments, {}),
5403
+ allowAttachments && /* @__PURE__ */ jsx45(ComposerAddAttachment, {}),
5404
+ /* @__PURE__ */ jsx45(ComposerInput, { autoFocus: true }),
5405
+ /* @__PURE__ */ jsx45(ComposerAction, {})
5408
5406
  ] });
5409
5407
  };
5410
5408
  Composer.displayName = "Composer";
@@ -5424,7 +5422,7 @@ var ComposerInput = forwardRef26(
5424
5422
  composer: { input: { placeholder = "Write a message..." } = {} } = {}
5425
5423
  } = {}
5426
5424
  } = useThreadConfig();
5427
- return /* @__PURE__ */ jsx46(ComposerInputStyled, { placeholder, ...props, ref });
5425
+ return /* @__PURE__ */ jsx45(ComposerInputStyled, { placeholder, ...props, ref });
5428
5426
  }
5429
5427
  );
5430
5428
  ComposerInput.displayName = "ComposerInput";
@@ -5432,7 +5430,7 @@ var ComposerAttachmentsContainer = withDefaults("div", {
5432
5430
  className: "aui-composer-attachments"
5433
5431
  });
5434
5432
  var ComposerAttachments = ({ components }) => {
5435
- return /* @__PURE__ */ jsx46(ComposerAttachmentsContainer, { children: /* @__PURE__ */ jsx46(
5433
+ return /* @__PURE__ */ jsx45(ComposerAttachmentsContainer, { children: /* @__PURE__ */ jsx45(
5436
5434
  composer_exports.Attachments,
5437
5435
  {
5438
5436
  components: {
@@ -5453,14 +5451,14 @@ var ComposerAddAttachment = forwardRef26((props, ref) => {
5453
5451
  } = {}
5454
5452
  } = useThreadConfig();
5455
5453
  const allowAttachments = useAllowAttachments();
5456
- return /* @__PURE__ */ jsx46(composer_exports.AddAttachment, { disabled: !allowAttachments, asChild: true, children: /* @__PURE__ */ jsx46(
5454
+ return /* @__PURE__ */ jsx45(composer_exports.AddAttachment, { disabled: !allowAttachments, asChild: true, children: /* @__PURE__ */ jsx45(
5457
5455
  ComposerAttachButton,
5458
5456
  {
5459
5457
  tooltip,
5460
5458
  variant: "ghost",
5461
5459
  ...props,
5462
5460
  ref,
5463
- children: props.children ?? /* @__PURE__ */ jsx46(PaperclipIcon, {})
5461
+ children: props.children ?? /* @__PURE__ */ jsx45(PaperclipIcon, {})
5464
5462
  }
5465
5463
  ) });
5466
5464
  });
@@ -5471,10 +5469,10 @@ var useAllowCancel = () => {
5471
5469
  };
5472
5470
  var ComposerAction = () => {
5473
5471
  const allowCancel = useAllowCancel();
5474
- if (!allowCancel) return /* @__PURE__ */ jsx46(ComposerSend, {});
5472
+ if (!allowCancel) return /* @__PURE__ */ jsx45(ComposerSend, {});
5475
5473
  return /* @__PURE__ */ jsxs9(Fragment5, { children: [
5476
- /* @__PURE__ */ jsx46(thread_exports.If, { running: false, children: /* @__PURE__ */ jsx46(ComposerSend, {}) }),
5477
- /* @__PURE__ */ jsx46(thread_exports.If, { running: true, children: /* @__PURE__ */ jsx46(ComposerCancel, {}) })
5474
+ /* @__PURE__ */ jsx45(thread_exports.If, { running: false, children: /* @__PURE__ */ jsx45(ComposerSend, {}) }),
5475
+ /* @__PURE__ */ jsx45(thread_exports.If, { running: true, children: /* @__PURE__ */ jsx45(ComposerCancel, {}) })
5478
5476
  ] });
5479
5477
  };
5480
5478
  ComposerAction.displayName = "ComposerAction";
@@ -5486,7 +5484,7 @@ var ComposerSend = forwardRef26((props, ref) => {
5486
5484
  const {
5487
5485
  strings: { composer: { send: { tooltip = "Send" } = {} } = {} } = {}
5488
5486
  } = useThreadConfig();
5489
- return /* @__PURE__ */ jsx46(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx46(ComposerSendButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx46(SendHorizontalIcon, {}) }) });
5487
+ return /* @__PURE__ */ jsx45(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx45(ComposerSendButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx45(SendHorizontalIcon, {}) }) });
5490
5488
  });
5491
5489
  ComposerSend.displayName = "ComposerSend";
5492
5490
  var ComposerCancelButton = withDefaults(TooltipIconButton, {
@@ -5497,7 +5495,7 @@ var ComposerCancel = forwardRef26((props, ref) => {
5497
5495
  const {
5498
5496
  strings: { composer: { cancel: { tooltip = "Cancel" } = {} } = {} } = {}
5499
5497
  } = useThreadConfig();
5500
- return /* @__PURE__ */ jsx46(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx46(ComposerCancelButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx46(CircleStopIcon, {}) }) });
5498
+ return /* @__PURE__ */ jsx45(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx45(ComposerCancelButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx45(CircleStopIcon, {}) }) });
5501
5499
  });
5502
5500
  ComposerCancel.displayName = "ComposerCancel";
5503
5501
  var exports6 = {
@@ -5513,14 +5511,14 @@ var composer_default = Object.assign(Composer, exports6);
5513
5511
 
5514
5512
  // src/ui/thread-welcome.tsx
5515
5513
  import { forwardRef as forwardRef27 } from "react";
5516
- import { jsx as jsx47, jsxs as jsxs10 } from "react/jsx-runtime";
5514
+ import { jsx as jsx46, jsxs as jsxs10 } from "react/jsx-runtime";
5517
5515
  var ThreadWelcome = () => {
5518
5516
  return /* @__PURE__ */ jsxs10(ThreadWelcomeRoot, { children: [
5519
5517
  /* @__PURE__ */ jsxs10(ThreadWelcomeCenter, { children: [
5520
- /* @__PURE__ */ jsx47(ThreadWelcomeAvatar, {}),
5521
- /* @__PURE__ */ jsx47(ThreadWelcomeMessage, {})
5518
+ /* @__PURE__ */ jsx46(ThreadWelcomeAvatar, {}),
5519
+ /* @__PURE__ */ jsx46(ThreadWelcomeMessage, {})
5522
5520
  ] }),
5523
- /* @__PURE__ */ jsx47(ThreadWelcomeSuggestions, {})
5521
+ /* @__PURE__ */ jsx46(ThreadWelcomeSuggestions, {})
5524
5522
  ] });
5525
5523
  };
5526
5524
  ThreadWelcome.displayName = "ThreadWelcome";
@@ -5532,20 +5530,20 @@ var ThreadWelcomeCenter = withDefaults("div", {
5532
5530
  });
5533
5531
  var ThreadWelcomeRoot = forwardRef27(
5534
5532
  (props, ref) => {
5535
- return /* @__PURE__ */ jsx47(thread_exports.Empty, { children: /* @__PURE__ */ jsx47(ThreadWelcomeRootStyled, { ...props, ref }) });
5533
+ return /* @__PURE__ */ jsx46(thread_exports.Empty, { children: /* @__PURE__ */ jsx46(ThreadWelcomeRootStyled, { ...props, ref }) });
5536
5534
  }
5537
5535
  );
5538
5536
  ThreadWelcomeRoot.displayName = "ThreadWelcomeRoot";
5539
5537
  var ThreadWelcomeAvatar = () => {
5540
5538
  const { assistantAvatar: avatar = { fallback: "A" } } = useThreadConfig();
5541
- return /* @__PURE__ */ jsx47(Avatar, { ...avatar });
5539
+ return /* @__PURE__ */ jsx46(Avatar, { ...avatar });
5542
5540
  };
5543
5541
  var ThreadWelcomeMessageStyled = withDefaults("p", {
5544
5542
  className: "aui-thread-welcome-message"
5545
5543
  });
5546
5544
  var ThreadWelcomeMessage = forwardRef27(({ message: messageProp, ...rest }, ref) => {
5547
5545
  const { welcome: { message = "How can I help you today?" } = {} } = useThreadConfig();
5548
- return /* @__PURE__ */ jsx47(ThreadWelcomeMessageStyled, { ...rest, ref, children: messageProp ?? message });
5546
+ return /* @__PURE__ */ jsx46(ThreadWelcomeMessageStyled, { ...rest, ref, children: messageProp ?? message });
5549
5547
  });
5550
5548
  ThreadWelcomeMessage.displayName = "ThreadWelcomeMessage";
5551
5549
  var ThreadWelcomeSuggestionContainer = withDefaults("div", {
@@ -5557,21 +5555,21 @@ var ThreadWelcomeSuggestionStyled = withDefaults(thread_exports.Suggestion, {
5557
5555
  var ThreadWelcomeSuggestion = ({
5558
5556
  suggestion: { text, prompt }
5559
5557
  }) => {
5560
- return /* @__PURE__ */ jsx47(
5558
+ return /* @__PURE__ */ jsx46(
5561
5559
  ThreadWelcomeSuggestionStyled,
5562
5560
  {
5563
5561
  prompt,
5564
5562
  method: "replace",
5565
5563
  autoSend: true,
5566
- children: /* @__PURE__ */ jsx47("span", { className: "aui-thread-welcome-suggestion-text", children: text ?? prompt })
5564
+ children: /* @__PURE__ */ jsx46("span", { className: "aui-thread-welcome-suggestion-text", children: text ?? prompt })
5567
5565
  }
5568
5566
  );
5569
5567
  };
5570
5568
  var ThreadWelcomeSuggestions = () => {
5571
5569
  const { welcome: { suggestions } = {} } = useThreadConfig();
5572
- return /* @__PURE__ */ jsx47(ThreadWelcomeSuggestionContainer, { children: suggestions?.map((suggestion, idx) => {
5570
+ return /* @__PURE__ */ jsx46(ThreadWelcomeSuggestionContainer, { children: suggestions?.map((suggestion, idx) => {
5573
5571
  const key = `${suggestion.prompt}-${idx}`;
5574
- return /* @__PURE__ */ jsx47(ThreadWelcomeSuggestion, { suggestion }, key);
5572
+ return /* @__PURE__ */ jsx46(ThreadWelcomeSuggestion, { suggestion }, key);
5575
5573
  }) });
5576
5574
  };
5577
5575
  ThreadWelcomeSuggestions.displayName = "ThreadWelcomeSuggestions";
@@ -5591,7 +5589,7 @@ import { forwardRef as forwardRef29 } from "react";
5591
5589
  // src/ui/user-action-bar.tsx
5592
5590
  import { forwardRef as forwardRef28 } from "react";
5593
5591
  import { PencilIcon } from "lucide-react";
5594
- import { jsx as jsx48 } from "react/jsx-runtime";
5592
+ import { jsx as jsx47 } from "react/jsx-runtime";
5595
5593
  var useAllowEdit = (ensureCapability = false) => {
5596
5594
  const { userMessage: { allowEdit = true } = {} } = useThreadConfig();
5597
5595
  const editSupported = useThread((t) => t.capabilities.edit);
@@ -5600,7 +5598,7 @@ var useAllowEdit = (ensureCapability = false) => {
5600
5598
  var UserActionBar = () => {
5601
5599
  const allowEdit = useAllowEdit(true);
5602
5600
  if (!allowEdit) return null;
5603
- return /* @__PURE__ */ jsx48(UserActionBarRoot, { hideWhenRunning: true, autohide: "not-last", children: /* @__PURE__ */ jsx48(UserActionBarEdit, {}) });
5601
+ return /* @__PURE__ */ jsx47(UserActionBarRoot, { hideWhenRunning: true, autohide: "not-last", children: /* @__PURE__ */ jsx47(UserActionBarEdit, {}) });
5604
5602
  };
5605
5603
  UserActionBar.displayName = "UserActionBar";
5606
5604
  var UserActionBarRoot = withDefaults(actionBar_exports.Root, {
@@ -5612,7 +5610,7 @@ var UserActionBarEdit = forwardRef28((props, ref) => {
5612
5610
  strings: { userMessage: { edit: { tooltip = "Edit" } = {} } = {} } = {}
5613
5611
  } = useThreadConfig();
5614
5612
  const allowEdit = useAllowEdit();
5615
- return /* @__PURE__ */ jsx48(actionBar_exports.Edit, { disabled: !allowEdit, asChild: true, children: /* @__PURE__ */ jsx48(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx48(PencilIcon, {}) }) });
5613
+ return /* @__PURE__ */ jsx47(actionBar_exports.Edit, { disabled: !allowEdit, asChild: true, children: /* @__PURE__ */ jsx47(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx47(PencilIcon, {}) }) });
5616
5614
  });
5617
5615
  UserActionBarEdit.displayName = "UserActionBarEdit";
5618
5616
  var exports8 = {
@@ -5644,13 +5642,13 @@ var user_message_attachment_default = Object.assign(
5644
5642
  );
5645
5643
 
5646
5644
  // src/ui/user-message.tsx
5647
- import { jsx as jsx49, jsxs as jsxs12 } from "react/jsx-runtime";
5645
+ import { jsx as jsx48, jsxs as jsxs12 } from "react/jsx-runtime";
5648
5646
  var UserMessage = () => {
5649
5647
  return /* @__PURE__ */ jsxs12(UserMessageRoot, { children: [
5650
- /* @__PURE__ */ jsx49(UserMessageAttachments, {}),
5651
- /* @__PURE__ */ jsx49(user_action_bar_default, {}),
5652
- /* @__PURE__ */ jsx49(UserMessageContent, {}),
5653
- /* @__PURE__ */ jsx49(branch_picker_default, {})
5648
+ /* @__PURE__ */ jsx48(UserMessageAttachments, {}),
5649
+ /* @__PURE__ */ jsx48(user_action_bar_default, {}),
5650
+ /* @__PURE__ */ jsx48(UserMessageContent, {}),
5651
+ /* @__PURE__ */ jsx48(branch_picker_default, {})
5654
5652
  ] });
5655
5653
  };
5656
5654
  UserMessage.displayName = "UserMessage";
@@ -5663,7 +5661,7 @@ var UserMessageContentWrapper = withDefaults("div", {
5663
5661
  });
5664
5662
  var UserMessageContent = forwardRef29(
5665
5663
  ({ components, ...props }, ref) => {
5666
- return /* @__PURE__ */ jsx49(UserMessageContentWrapper, { ...props, ref, children: /* @__PURE__ */ jsx49(
5664
+ return /* @__PURE__ */ jsx48(UserMessageContentWrapper, { ...props, ref, children: /* @__PURE__ */ jsx48(
5667
5665
  message_exports.Content,
5668
5666
  {
5669
5667
  components: {
@@ -5681,7 +5679,7 @@ var UserMessageAttachmentsContainer = withDefaults("div", {
5681
5679
  var UserMessageAttachments = ({
5682
5680
  components
5683
5681
  }) => {
5684
- return /* @__PURE__ */ jsx49(message_exports.If, { hasAttachments: true, children: /* @__PURE__ */ jsx49(UserMessageAttachmentsContainer, { children: /* @__PURE__ */ jsx49(
5682
+ return /* @__PURE__ */ jsx48(message_exports.If, { hasAttachments: true, children: /* @__PURE__ */ jsx48(UserMessageAttachmentsContainer, { children: /* @__PURE__ */ jsx48(
5685
5683
  message_exports.Attachments,
5686
5684
  {
5687
5685
  components: {
@@ -5700,13 +5698,13 @@ var user_message_default = Object.assign(UserMessage, exports10);
5700
5698
 
5701
5699
  // src/ui/edit-composer.tsx
5702
5700
  import { forwardRef as forwardRef30 } from "react";
5703
- import { jsx as jsx50, jsxs as jsxs13 } from "react/jsx-runtime";
5701
+ import { jsx as jsx49, jsxs as jsxs13 } from "react/jsx-runtime";
5704
5702
  var EditComposer = () => {
5705
5703
  return /* @__PURE__ */ jsxs13(EditComposerRoot, { children: [
5706
- /* @__PURE__ */ jsx50(EditComposerInput, {}),
5704
+ /* @__PURE__ */ jsx49(EditComposerInput, {}),
5707
5705
  /* @__PURE__ */ jsxs13(EditComposerFooter, { children: [
5708
- /* @__PURE__ */ jsx50(EditComposerCancel, {}),
5709
- /* @__PURE__ */ jsx50(EditComposerSend, {})
5706
+ /* @__PURE__ */ jsx49(EditComposerCancel, {}),
5707
+ /* @__PURE__ */ jsx49(EditComposerSend, {})
5710
5708
  ] })
5711
5709
  ] });
5712
5710
  };
@@ -5730,7 +5728,7 @@ var EditComposerCancel = forwardRef30(
5730
5728
  editComposer: { cancel: { label = "Cancel" } = {} } = {}
5731
5729
  } = {}
5732
5730
  } = useThreadConfig();
5733
- return /* @__PURE__ */ jsx50(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx50(Button, { variant: "ghost", ...props, ref, children: props.children ?? label }) });
5731
+ return /* @__PURE__ */ jsx49(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx49(Button, { variant: "ghost", ...props, ref, children: props.children ?? label }) });
5734
5732
  }
5735
5733
  );
5736
5734
  EditComposerCancel.displayName = "EditComposerCancel";
@@ -5739,7 +5737,7 @@ var EditComposerSend = forwardRef30(
5739
5737
  const {
5740
5738
  strings: { editComposer: { send: { label = "Send" } = {} } = {} } = {}
5741
5739
  } = useThreadConfig();
5742
- return /* @__PURE__ */ jsx50(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx50(Button, { ...props, ref, children: props.children ?? label }) });
5740
+ return /* @__PURE__ */ jsx49(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx49(Button, { ...props, ref, children: props.children ?? label }) });
5743
5741
  }
5744
5742
  );
5745
5743
  EditComposerSend.displayName = "EditComposerSend";
@@ -5753,14 +5751,14 @@ var exports11 = {
5753
5751
  var edit_composer_default = Object.assign(EditComposer, exports11);
5754
5752
 
5755
5753
  // src/ui/thread.tsx
5756
- import { jsx as jsx51, jsxs as jsxs14 } from "react/jsx-runtime";
5754
+ import { jsx as jsx50, jsxs as jsxs14 } from "react/jsx-runtime";
5757
5755
  var Thread = (config) => {
5758
- return /* @__PURE__ */ jsx51(ThreadRoot, { config, children: /* @__PURE__ */ jsxs14(ThreadViewport, { children: [
5759
- /* @__PURE__ */ jsx51(thread_welcome_default, {}),
5760
- /* @__PURE__ */ jsx51(ThreadMessages, {}),
5756
+ return /* @__PURE__ */ jsx50(ThreadRoot, { config, children: /* @__PURE__ */ jsxs14(ThreadViewport, { children: [
5757
+ /* @__PURE__ */ jsx50(thread_welcome_default, {}),
5758
+ /* @__PURE__ */ jsx50(ThreadMessages, {}),
5761
5759
  /* @__PURE__ */ jsxs14(ThreadViewportFooter, { children: [
5762
- /* @__PURE__ */ jsx51(ThreadScrollToBottom, {}),
5763
- /* @__PURE__ */ jsx51(composer_default, {})
5760
+ /* @__PURE__ */ jsx50(ThreadScrollToBottom, {}),
5761
+ /* @__PURE__ */ jsx50(composer_default, {})
5764
5762
  ] })
5765
5763
  ] }) });
5766
5764
  };
@@ -5769,7 +5767,7 @@ var ThreadRootStyled = withDefaults(thread_exports.Root, {
5769
5767
  });
5770
5768
  var ThreadRoot = forwardRef31(
5771
5769
  ({ config, ...props }, ref) => {
5772
- return /* @__PURE__ */ jsx51(ThreadConfigProvider, { config, children: /* @__PURE__ */ jsx51(ThreadRootStyled, { ...props, ref }) });
5770
+ return /* @__PURE__ */ jsx50(ThreadConfigProvider, { config, children: /* @__PURE__ */ jsx50(ThreadRootStyled, { ...props, ref }) });
5773
5771
  }
5774
5772
  );
5775
5773
  ThreadRoot.displayName = "ThreadRoot";
@@ -5783,7 +5781,7 @@ var ThreadViewportFooter = withDefaults("div", {
5783
5781
  ThreadViewportFooter.displayName = "ThreadViewportFooter";
5784
5782
  var SystemMessage = () => null;
5785
5783
  var ThreadMessages = ({ components, ...rest }) => {
5786
- return /* @__PURE__ */ jsx51(
5784
+ return /* @__PURE__ */ jsx50(
5787
5785
  thread_exports.Messages,
5788
5786
  {
5789
5787
  components: {
@@ -5807,7 +5805,7 @@ var ThreadScrollToBottom = forwardRef31((props, ref) => {
5807
5805
  thread: { scrollToBottom: { tooltip = "Scroll to bottom" } = {} } = {}
5808
5806
  } = {}
5809
5807
  } = useThreadConfig();
5810
- return /* @__PURE__ */ jsx51(thread_exports.ScrollToBottom, { asChild: true, children: /* @__PURE__ */ jsx51(ThreadScrollToBottomIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx51(ArrowDownIcon, {}) }) });
5808
+ return /* @__PURE__ */ jsx50(thread_exports.ScrollToBottom, { asChild: true, children: /* @__PURE__ */ jsx50(ThreadScrollToBottomIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx50(ArrowDownIcon, {}) }) });
5811
5809
  });
5812
5810
  ThreadScrollToBottom.displayName = "ThreadScrollToBottom";
5813
5811
  var exports12 = {
@@ -5820,20 +5818,20 @@ var exports12 = {
5820
5818
  var thread_default = Object.assign(Thread, exports12);
5821
5819
 
5822
5820
  // src/ui/assistant-modal.tsx
5823
- import { Fragment as Fragment6, jsx as jsx52, jsxs as jsxs15 } from "react/jsx-runtime";
5821
+ import { Fragment as Fragment6, jsx as jsx51, jsxs as jsxs15 } from "react/jsx-runtime";
5824
5822
  var AssistantModal = (config) => {
5825
5823
  return /* @__PURE__ */ jsxs15(AssistantModalRoot, { config, children: [
5826
- /* @__PURE__ */ jsx52(AssistantModalTrigger, {}),
5827
- /* @__PURE__ */ jsx52(AssistantModalContent, { children: /* @__PURE__ */ jsx52(thread_default, {}) })
5824
+ /* @__PURE__ */ jsx51(AssistantModalTrigger, {}),
5825
+ /* @__PURE__ */ jsx51(AssistantModalContent, { children: /* @__PURE__ */ jsx51(thread_default, {}) })
5828
5826
  ] });
5829
5827
  };
5830
5828
  AssistantModal.displayName = "AssistantModal";
5831
5829
  var AssistantModalRoot = ({ config, ...props }) => {
5832
- return /* @__PURE__ */ jsx52(ThreadConfigProvider, { config, children: /* @__PURE__ */ jsx52(assistantModal_exports.Root, { ...props }) });
5830
+ return /* @__PURE__ */ jsx51(ThreadConfigProvider, { config, children: /* @__PURE__ */ jsx51(assistantModal_exports.Root, { ...props }) });
5833
5831
  };
5834
5832
  AssistantModalRoot.displayName = "AssistantModalRoot";
5835
5833
  var AssistantModalTrigger = forwardRef32((props, ref) => {
5836
- return /* @__PURE__ */ jsx52(AssistantModalAnchor, { children: /* @__PURE__ */ jsx52(assistantModal_exports.Trigger, { asChild: true, children: /* @__PURE__ */ jsx52(AssistantModalButton, { ...props, ref }) }) });
5834
+ return /* @__PURE__ */ jsx51(AssistantModalAnchor, { children: /* @__PURE__ */ jsx51(assistantModal_exports.Trigger, { asChild: true, children: /* @__PURE__ */ jsx51(AssistantModalButton, { ...props, ref }) }) });
5837
5835
  });
5838
5836
  AssistantModalTrigger.displayName = "AssistantModalTrigger";
5839
5837
  var AssistantModalAnchor = withDefaults(assistantModal_exports.Anchor, {
@@ -5858,7 +5856,7 @@ var AssistantModalButton = forwardRef32(({ "data-state": state, ...rest }, ref)
5858
5856
  } = {}
5859
5857
  } = useThreadConfig();
5860
5858
  const tooltip = state === "open" ? openTooltip : closedTooltip;
5861
- return /* @__PURE__ */ jsx52(
5859
+ return /* @__PURE__ */ jsx51(
5862
5860
  ModalButtonStyled,
5863
5861
  {
5864
5862
  side: "left",
@@ -5867,14 +5865,14 @@ var AssistantModalButton = forwardRef32(({ "data-state": state, ...rest }, ref)
5867
5865
  ...rest,
5868
5866
  ref,
5869
5867
  children: rest.children ?? /* @__PURE__ */ jsxs15(Fragment6, { children: [
5870
- /* @__PURE__ */ jsx52(
5868
+ /* @__PURE__ */ jsx51(
5871
5869
  BotIcon,
5872
5870
  {
5873
5871
  "data-state": state,
5874
5872
  className: "aui-modal-button-closed-icon"
5875
5873
  }
5876
5874
  ),
5877
- /* @__PURE__ */ jsx52(
5875
+ /* @__PURE__ */ jsx51(
5878
5876
  ChevronDownIcon,
5879
5877
  {
5880
5878
  "data-state": state,
@@ -5967,12 +5965,14 @@ export {
5967
5965
  useComposerCancel,
5968
5966
  useComposerContext,
5969
5967
  useComposerIf,
5968
+ useComposerRuntime,
5970
5969
  useComposerSend,
5971
5970
  useComposerStore,
5972
5971
  useContentPart,
5973
5972
  useContentPartContext,
5974
5973
  useContentPartDisplay,
5975
5974
  useContentPartImage,
5975
+ useContentPartRuntime,
5976
5976
  useContentPartStore,
5977
5977
  useContentPartText,
5978
5978
  useDangerousInBrowserRuntime,
@@ -5985,6 +5985,7 @@ export {
5985
5985
  useMessage,
5986
5986
  useMessageContext,
5987
5987
  useMessageIf,
5988
+ useMessageRuntime,
5988
5989
  useMessageStore,
5989
5990
  useMessageUtils,
5990
5991
  useMessageUtilsStore,