@assistant-ui/react 0.5.65 → 0.5.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -17,9 +17,6 @@ var _chunkPZ5AY32Cjs = require('./chunk-PZ5AY32C.js');
17
17
  // src/context/providers/AssistantRuntimeProvider.tsx
18
18
  var _react = require('react');
19
19
 
20
- // src/context/providers/AssistantProvider.tsx
21
-
22
-
23
20
  // src/context/react/AssistantContext.ts
24
21
 
25
22
 
@@ -121,7 +118,7 @@ var makeAssistantToolUIsStore = () => _zustand.create.call(void 0, (set) => {
121
118
  });
122
119
  });
123
120
 
124
- // src/context/providers/ThreadProvider.tsx
121
+ // src/context/providers/ThreadRuntimeProvider.tsx
125
122
 
126
123
 
127
124
  // src/context/react/ThreadContext.ts
@@ -159,10 +156,9 @@ var {
159
156
 
160
157
  // src/context/stores/ThreadComposer.ts
161
158
 
162
- var makeThreadComposerStore = (useThreadRuntime2) => {
159
+ var makeThreadComposerStore = (runtime) => {
163
160
  const focusListeners = /* @__PURE__ */ new Set();
164
161
  return _zustand.create.call(void 0, )((_, get) => {
165
- const runtime = useThreadRuntime2.getState();
166
162
  return {
167
163
  type: "thread",
168
164
  get value() {
@@ -171,30 +167,27 @@ var makeThreadComposerStore = (useThreadRuntime2) => {
171
167
  setValue(value) {
172
168
  get().setText(value);
173
169
  },
174
- attachmentAccept: runtime.composer.attachmentAccept,
175
- attachments: runtime.composer.attachments,
170
+ ...runtime.getState(),
171
+ canCancel: false,
172
+ // "TODO",
173
+ isEditing: true,
176
174
  addAttachment: (file) => {
177
- useThreadRuntime2.getState().composer.addAttachment(file);
175
+ runtime.addAttachment(file);
178
176
  },
179
177
  removeAttachment: (attachmentId) => {
180
- useThreadRuntime2.getState().composer.removeAttachment(attachmentId);
178
+ runtime.removeAttachment(attachmentId);
181
179
  },
182
180
  reset: () => {
183
- useThreadRuntime2.getState().composer.reset();
181
+ runtime.reset();
184
182
  },
185
- text: runtime.composer.text,
186
183
  setText: (text) => {
187
- useThreadRuntime2.getState().composer.setText(text);
184
+ runtime.setText(text);
188
185
  },
189
- canCancel: runtime.capabilities.cancel,
190
- isEditing: true,
191
- isEmpty: runtime.composer.isEmpty,
192
186
  send: () => {
193
- const runtime2 = useThreadRuntime2.getState();
194
- runtime2.composer.send();
187
+ runtime.send();
195
188
  },
196
189
  cancel: () => {
197
- useThreadRuntime2.getState().cancelRun();
190
+ runtime.cancel();
198
191
  },
199
192
  focus: () => {
200
193
  for (const listener of focusListeners) {
@@ -211,22 +204,6 @@ var makeThreadComposerStore = (useThreadRuntime2) => {
211
204
  });
212
205
  };
213
206
 
214
- // src/context/stores/Thread.ts
215
-
216
- var getThreadStateFromRuntime = (runtime) => {
217
- const lastMessage = runtime.messages.at(-1);
218
- return Object.freeze({
219
- threadId: runtime.threadId,
220
- capabilities: runtime.capabilities,
221
- isDisabled: runtime.isDisabled,
222
- isRunning: _optionalChain([lastMessage, 'optionalAccess', _5 => _5.role]) !== "assistant" ? false : lastMessage.status.type === "running"
223
- });
224
- };
225
- var makeThreadStore = (runtimeRef) => {
226
- const runtime = runtimeRef.getState();
227
- return _zustand.create.call(void 0, () => getThreadStateFromRuntime(runtime));
228
- };
229
-
230
207
  // src/context/stores/ThreadViewport.tsx
231
208
 
232
209
  var makeThreadViewportStore = () => {
@@ -247,85 +224,65 @@ var makeThreadViewportStore = () => {
247
224
  }));
248
225
  };
249
226
 
250
- // src/context/stores/ThreadMessages.ts
251
-
252
- var makeThreadMessagesStore = (runtimeRef) => {
253
- return _zustand.create.call(void 0, () => runtimeRef.getState().messages);
254
- };
255
-
256
227
  // src/context/ReadonlyStore.ts
257
228
  var writableStore = (store) => {
258
229
  return store;
259
230
  };
260
231
 
261
- // src/context/providers/ThreadProvider.tsx
232
+ // src/context/providers/ThreadRuntimeProvider.tsx
262
233
 
263
234
  var _jsxruntime = require('react/jsx-runtime');
264
- var ThreadProvider = ({
265
- children,
266
- provider: thread
267
- }) => {
268
- const [context] = _react.useState.call(void 0, () => {
269
- const useThreadRuntime2 = _zustand.create.call(void 0, () => thread);
270
- const useThread2 = makeThreadStore(useThreadRuntime2);
271
- const useThreadMessages2 = makeThreadMessagesStore(useThreadRuntime2);
235
+ var useThreadRuntimeStore2 = (runtime) => {
236
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime));
237
+ _react.useEffect.call(void 0, () => {
238
+ writableStore(store).setState(runtime, true);
239
+ }, [runtime, store]);
240
+ return store;
241
+ };
242
+ var useThreadStore2 = (runtime) => {
243
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
244
+ _react.useEffect.call(void 0, () => {
245
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
246
+ updateState();
247
+ return runtime.subscribe(updateState);
248
+ }, [runtime, store]);
249
+ return store;
250
+ };
251
+ var useThreadMessagesStore2 = (runtime) => {
252
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.messages));
253
+ _react.useEffect.call(void 0, () => {
254
+ const updateState = () => writableStore(store).setState(runtime.messages, true);
255
+ updateState();
256
+ return runtime.subscribe(updateState);
257
+ }, [runtime, store]);
258
+ return store;
259
+ };
260
+ var useThreadComposerStore2 = (runtime) => {
261
+ const [store] = _react.useState.call(void 0, () => makeThreadComposerStore(runtime));
262
+ _react.useEffect.call(void 0, () => {
263
+ const updateState = () => writableStore(store).setState(runtime.getState());
264
+ updateState();
265
+ return runtime.subscribe(updateState);
266
+ }, [runtime, store]);
267
+ return store;
268
+ };
269
+ var ThreadRuntimeProvider = ({ children, runtime }) => {
270
+ const useThreadRuntime2 = useThreadRuntimeStore2(runtime);
271
+ const useThread2 = useThreadStore2(runtime);
272
+ const useThreadMessages2 = useThreadMessagesStore2(runtime);
273
+ const useThreadComposer2 = useThreadComposerStore2(runtime.composer);
274
+ const context = _react.useMemo.call(void 0, () => {
272
275
  const useViewport = makeThreadViewportStore();
273
- const useComposer2 = makeThreadComposerStore(useThreadRuntime2);
274
276
  return {
275
277
  useThread: useThread2,
276
278
  useThreadRuntime: useThreadRuntime2,
277
279
  useThreadMessages: useThreadMessages2,
278
280
  useThreadActions: useThreadRuntime2,
279
- useComposer: useComposer2,
281
+ useComposer: useThreadComposer2,
280
282
  useViewport
281
283
  };
282
- });
283
- _react.useEffect.call(void 0, () => {
284
- const onThreadUpdate = () => {
285
- const oldState = context.useThread.getState();
286
- const state = getThreadStateFromRuntime(thread);
287
- if (oldState.threadId !== state.threadId || oldState.isDisabled !== state.isDisabled || oldState.isRunning !== state.isRunning || oldState.capabilities !== state.capabilities) {
288
- writableStore(context.useThread).setState(state, true);
289
- }
290
- if (thread.messages !== context.useThreadMessages.getState()) {
291
- writableStore(context.useThreadMessages).setState(
292
- thread.messages,
293
- true
294
- );
295
- }
296
- const composerState = context.useComposer.getState();
297
- if (state.capabilities.cancel !== composerState.canCancel) {
298
- writableStore(context.useComposer).setState({
299
- canCancel: state.capabilities.cancel
300
- });
301
- }
302
- };
303
- onThreadUpdate();
304
- return thread.subscribe(onThreadUpdate);
305
- }, [thread, context]);
306
- _react.useEffect.call(void 0, () => {
307
- const onComposerUpdate = () => {
308
- const composer = thread.composer;
309
- const composerState = context.useComposer.getState();
310
- if (composer.isEmpty !== composerState.isEmpty || composer.text !== composerState.text || composer.attachmentAccept !== composerState.attachmentAccept || composer.attachments !== composerState.attachments) {
311
- writableStore(context.useComposer).setState({
312
- isEmpty: composer.isEmpty,
313
- text: composer.text,
314
- attachmentAccept: composer.attachmentAccept,
315
- attachments: composer.attachments
316
- });
317
- }
318
- };
319
- onComposerUpdate();
320
- return thread.composer.subscribe(onComposerUpdate);
321
- }, [thread, context]);
322
- _react.useEffect.call(void 0,
323
- () => thread.subscribe(() => {
324
- writableStore(context.useThreadRuntime).setState(thread, true);
325
- }),
326
- [thread, context]
327
- );
328
- const Synchronizer = context.useThreadRuntime(
284
+ }, [useThread2, useThreadRuntime2, useThreadMessages2, useThreadComposer2]);
285
+ const Synchronizer = context.useThread(
329
286
  (t) => t.unstable_synchronizer
330
287
  );
331
288
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ThreadContext.Provider, { value: context, children: [
@@ -334,34 +291,30 @@ var ThreadProvider = ({
334
291
  ] });
335
292
  };
336
293
 
337
- // src/context/providers/AssistantProvider.tsx
294
+ // src/context/providers/AssistantRuntimeProvider.tsx
338
295
 
339
296
 
340
- var AssistantProvider = ({ children, runtime }) => {
341
- const runtimeRef = _react.useRef.call(void 0, runtime);
342
- _react.useInsertionEffect.call(void 0, () => {
343
- runtimeRef.current = runtime;
344
- });
345
- const [context] = _react.useState.call(void 0, () => {
346
- const useAssistantRuntime2 = _zustand.create.call(void 0, () => runtime);
347
- const useToolUIs2 = makeAssistantToolUIsStore();
297
+ var useAssistantRuntimeStore2 = (runtime) => {
298
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime));
299
+ _react.useEffect.call(void 0, () => {
300
+ writableStore(store).setState(runtime, true);
301
+ }, [runtime, store]);
302
+ return store;
303
+ };
304
+ var useAssistantToolUIsStore = () => {
305
+ return _react.useMemo.call(void 0, () => makeAssistantToolUIsStore(), []);
306
+ };
307
+ var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
308
+ const useAssistantRuntime2 = useAssistantRuntimeStore2(runtime);
309
+ const useToolUIs2 = useAssistantToolUIsStore();
310
+ const context = _react.useMemo.call(void 0, () => {
348
311
  return {
349
312
  useToolUIs: useToolUIs2,
350
313
  useAssistantRuntime: useAssistantRuntime2,
351
314
  useAssistantActions: useAssistantRuntime2
352
315
  };
353
- });
354
- _react.useEffect.call(void 0,
355
- () => writableStore(context.useAssistantRuntime).setState(runtime, true),
356
- [runtime, context]
357
- );
358
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantContext.Provider, { value: context, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadProvider, { provider: runtime.thread, children }) });
359
- };
360
-
361
- // src/context/providers/AssistantRuntimeProvider.tsx
362
-
363
- var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
364
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantProvider, { runtime, children });
316
+ }, [useAssistantRuntime2, useToolUIs2]);
317
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantContext.Provider, { value: context, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadRuntimeProvider, { runtime: runtime.thread, children }) });
365
318
  };
366
319
  var AssistantRuntimeProvider = _react.memo.call(void 0, AssistantRuntimeProviderImpl);
367
320
 
@@ -426,6 +379,11 @@ var useMessageContext = createContextHook(
426
379
  MessageContext,
427
380
  "a component passed to <ThreadPrimitive.Messages components={...} />"
428
381
  );
382
+ function useMessageRuntime(options) {
383
+ const context = useMessageContext(options);
384
+ if (!context) return null;
385
+ return context.useMessageRuntime();
386
+ }
429
387
  var { useMessage, useMessageStore } = createContextStoreHook(
430
388
  useMessageContext,
431
389
  "useMessage"
@@ -459,40 +417,17 @@ var { useComposer, useComposerStore } = createContextStoreHook(
459
417
 
460
418
  // src/hooks/useAppendMessage.tsx
461
419
 
462
- var toAppendMessage = (useThreadMessages2, message) => {
463
- if (typeof message === "string") {
464
- return {
465
- parentId: _nullishCoalesce(_optionalChain([useThreadMessages2, 'access', _6 => _6.getState, 'call', _7 => _7(), 'access', _8 => _8.at, 'call', _9 => _9(-1), 'optionalAccess', _10 => _10.id]), () => ( null)),
466
- role: "user",
467
- content: [{ type: "text", text: message }],
468
- attachments: []
469
- };
470
- }
471
- return {
472
- parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([useThreadMessages2, 'access', _11 => _11.getState, 'call', _12 => _12(), 'access', _13 => _13.at, 'call', _14 => _14(-1), 'optionalAccess', _15 => _15.id]))), () => ( null)),
473
- role: _nullishCoalesce(message.role, () => ( "user")),
474
- content: message.content,
475
- attachments: _nullishCoalesce(message.attachments, () => ( []))
476
- };
477
- };
478
420
  var useAppendMessage = () => {
479
- const threadMessagesStore = useThreadMessagesStore();
480
421
  const threadRuntime = useThreadRuntime();
481
422
  const threadViewportStore = useThreadViewportStore();
482
423
  const threadComposerStore = useThreadComposerStore();
483
424
  const append = _react.useCallback.call(void 0,
484
425
  (message) => {
485
- const appendMessage = toAppendMessage(threadMessagesStore, message);
486
- threadRuntime.append(appendMessage);
426
+ threadRuntime.append(message);
487
427
  threadViewportStore.getState().scrollToBottom();
488
428
  threadComposerStore.getState().focus();
489
429
  },
490
- [
491
- threadMessagesStore,
492
- threadRuntime,
493
- threadViewportStore,
494
- threadComposerStore
495
- ]
430
+ [threadRuntime, threadViewportStore, threadComposerStore]
496
431
  );
497
432
  return append;
498
433
  };
@@ -527,7 +462,7 @@ var useAssistantTool = (tool) => {
527
462
  const unsub2 = render ? toolUIsStore.getState().setToolUI(toolName, render) : void 0;
528
463
  return () => {
529
464
  unsub1();
530
- _optionalChain([unsub2, 'optionalCall', _16 => _16()]);
465
+ _optionalChain([unsub2, 'optionalCall', _5 => _5()]);
531
466
  };
532
467
  }, [assistantRuntime, toolUIsStore, tool]);
533
468
  };
@@ -623,12 +558,12 @@ var useActionBarCopy = ({
623
558
  const editComposerStore = useEditComposerStore();
624
559
  const hasCopyableContent = useCombinedStore(
625
560
  [messageStore, editComposerStore],
626
- ({ message }, c) => {
561
+ (message, c) => {
627
562
  return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
628
563
  }
629
564
  );
630
565
  const callback = _react.useCallback.call(void 0, () => {
631
- const { message } = messageStore.getState();
566
+ const message = messageStore.getState();
632
567
  const { setIsCopied } = messageUtilsStore.getState();
633
568
  const { isEditing, text: composerValue } = editComposerStore.getState();
634
569
  const valueToCopy = isEditing ? composerValue : getThreadMessageText(message);
@@ -664,7 +599,7 @@ var useActionBarReload = () => {
664
599
  const threadViewportStore = useThreadViewportStore();
665
600
  const disabled = useCombinedStore(
666
601
  [threadStore, messageStore],
667
- (t, m) => t.isRunning || t.isDisabled || m.message.role !== "assistant"
602
+ (t, m) => t.isRunning || t.isDisabled || m.role !== "assistant"
668
603
  );
669
604
  const callback = _react.useCallback.call(void 0, () => {
670
605
  const { parentId } = messageStore.getState();
@@ -718,7 +653,7 @@ var useActionBarFeedbackPositive = () => {
718
653
  const messageUtilsStore = useMessageUtilsStore();
719
654
  const callback = _react.useCallback.call(void 0, () => {
720
655
  threadRuntime.submitFeedback({
721
- messageId: messageStore.getState().message.id,
656
+ messageId: messageStore.getState().id,
722
657
  type: "positive"
723
658
  });
724
659
  messageUtilsStore.getState().setSubmittedFeedback("positive");
@@ -734,7 +669,7 @@ var useActionBarFeedbackNegative = () => {
734
669
  const messageUtilsStore = useMessageUtilsStore();
735
670
  const callback = _react.useCallback.call(void 0, () => {
736
671
  threadRuntime.submitFeedback({
737
- messageId: messageStore.getState().message.id,
672
+ messageId: messageStore.getState().id,
738
673
  type: "negative"
739
674
  });
740
675
  messageUtilsStore.getState().setSubmittedFeedback("negative");
@@ -744,48 +679,46 @@ var useActionBarFeedbackNegative = () => {
744
679
 
745
680
  // src/primitive-hooks/branchPicker/useBranchPickerCount.tsx
746
681
  var useBranchPickerCount = () => {
747
- const branchCount = useMessage((s) => s.branches.length);
682
+ const branchCount = useMessage((s) => s.branchCount);
748
683
  return branchCount;
749
684
  };
750
685
 
751
686
  // src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
752
687
 
753
688
  var useBranchPickerNext = () => {
689
+ const messageRuntime = useMessageRuntime();
754
690
  const messageStore = useMessageStore();
755
691
  const editComposerStore = useEditComposerStore();
756
- const threadRuntime = useThreadRuntime();
757
692
  const disabled = useCombinedStore(
758
693
  [messageStore, editComposerStore],
759
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
694
+ (m, c) => c.isEditing || m.branchNumber >= m.branchCount
760
695
  );
761
696
  const callback = _react.useCallback.call(void 0, () => {
762
- const { message, branches } = messageStore.getState();
763
- threadRuntime.switchToBranch(branches[branches.indexOf(message.id) + 1]);
764
- }, [threadRuntime, messageStore]);
697
+ messageRuntime.switchToBranch({ position: "next" });
698
+ }, [messageRuntime]);
765
699
  if (disabled) return null;
766
700
  return callback;
767
701
  };
768
702
 
769
703
  // src/primitive-hooks/branchPicker/useBranchPickerNumber.tsx
770
704
  var useBranchPickerNumber = () => {
771
- const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
772
- return branchIdx + 1;
705
+ const branchNumber = useMessage((s) => s.branchNumber);
706
+ return branchNumber;
773
707
  };
774
708
 
775
709
  // src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
776
710
 
777
711
  var useBranchPickerPrevious = () => {
712
+ const messageRuntime = useMessageRuntime();
778
713
  const messageStore = useMessageStore();
779
714
  const editComposerStore = useEditComposerStore();
780
- const threadRuntime = useThreadRuntime();
781
715
  const disabled = useCombinedStore(
782
716
  [messageStore, editComposerStore],
783
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
717
+ (m, c) => c.isEditing || m.branchNumber <= 1
784
718
  );
785
719
  const callback = _react.useCallback.call(void 0, () => {
786
- const { message, branches } = messageStore.getState();
787
- threadRuntime.switchToBranch(branches[branches.indexOf(message.id) - 1]);
788
- }, [threadRuntime, messageStore]);
720
+ messageRuntime.switchToBranch({ position: "previous" });
721
+ }, [messageRuntime]);
789
722
  if (disabled) return null;
790
723
  return callback;
791
724
  };
@@ -849,7 +782,7 @@ var useComposerAddAttachment = () => {
849
782
  input.accept = attachmentAccept;
850
783
  }
851
784
  input.onchange = (e) => {
852
- const file = _optionalChain([e, 'access', _17 => _17.target, 'access', _18 => _18.files, 'optionalAccess', _19 => _19[0]]);
785
+ const file = _optionalChain([e, 'access', _6 => _6.target, 'access', _7 => _7.files, 'optionalAccess', _8 => _8[0]]);
853
786
  if (!file) return;
854
787
  addAttachment(file);
855
788
  };
@@ -901,19 +834,19 @@ var useMessageIf = (props) => {
901
834
  const messageUtilsStore = useMessageUtilsStore();
902
835
  return useCombinedStore(
903
836
  [messageStore, messageUtilsStore],
904
- ({ message, branches, isLast }, { isCopied, isHovering, isSpeaking, submittedFeedback }) => {
905
- if (props.hasBranches === true && branches.length < 2) return false;
906
- if (props.user && message.role !== "user") return false;
907
- if (props.assistant && message.role !== "assistant") return false;
908
- if (props.system && message.role !== "system") return false;
837
+ ({ role, attachments, branchCount, isLast }, { isCopied, isHovering, isSpeaking, submittedFeedback }) => {
838
+ if (props.hasBranches === true && branchCount < 2) return false;
839
+ if (props.user && role !== "user") return false;
840
+ if (props.assistant && role !== "assistant") return false;
841
+ if (props.system && role !== "system") return false;
909
842
  if (props.lastOrHover === true && !isHovering && !isLast) return false;
910
843
  if (props.copied === true && !isCopied) return false;
911
844
  if (props.copied === false && isCopied) return false;
912
845
  if (props.speaking === true && !isSpeaking) return false;
913
846
  if (props.speaking === false && isSpeaking) return false;
914
- if (props.hasAttachments === true && (message.role !== "user" || !message.attachments.length))
847
+ if (props.hasAttachments === true && (role !== "user" || !attachments.length))
915
848
  return false;
916
- if (props.hasAttachments === false && message.role === "user" && !!message.attachments.length)
849
+ if (props.hasAttachments === false && role === "user" && !!attachments.length)
917
850
  return false;
918
851
  if (props.submittedFeedback !== void 0 && submittedFeedback !== props.submittedFeedback)
919
852
  return false;
@@ -1060,7 +993,7 @@ var ActionBarPrimitiveCopy = _react.forwardRef.call(void 0, ({ copiedDuration, o
1060
993
  ref: forwardedRef,
1061
994
  disabled: disabled || !callback,
1062
995
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
1063
- _optionalChain([callback, 'optionalCall', _20 => _20()]);
996
+ _optionalChain([callback, 'optionalCall', _9 => _9()]);
1064
997
  })
1065
998
  }
1066
999
  );
@@ -1092,7 +1025,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
1092
1025
  ref: forwardedRef,
1093
1026
  disabled: primitiveProps.disabled || !callback,
1094
1027
  onClick: _primitive.composeEventHandlers.call(void 0, primitiveProps.onClick, () => {
1095
- _optionalChain([callback, 'optionalCall', _21 => _21()]);
1028
+ _optionalChain([callback, 'optionalCall', _10 => _10()]);
1096
1029
  })
1097
1030
  }
1098
1031
  );
@@ -1141,7 +1074,7 @@ var ActionBarPrimitiveStopSpeaking = _react.forwardRef.call(void 0, (props, ref)
1141
1074
  ...props,
1142
1075
  ref,
1143
1076
  onClick: _primitive.composeEventHandlers.call(void 0, props.onClick, () => {
1144
- _optionalChain([callback, 'optionalCall', _22 => _22()]);
1077
+ _optionalChain([callback, 'optionalCall', _11 => _11()]);
1145
1078
  })
1146
1079
  }
1147
1080
  );
@@ -1167,7 +1100,7 @@ var ActionBarPrimitiveFeedbackPositive = _react.forwardRef.call(void 0, ({ onCli
1167
1100
  ref: forwardedRef,
1168
1101
  disabled: disabled || !callback,
1169
1102
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
1170
- _optionalChain([callback, 'optionalCall', _23 => _23()]);
1103
+ _optionalChain([callback, 'optionalCall', _12 => _12()]);
1171
1104
  })
1172
1105
  }
1173
1106
  );
@@ -1193,7 +1126,7 @@ var ActionBarPrimitiveFeedbackNegative = _react.forwardRef.call(void 0, ({ onCli
1193
1126
  ref: forwardedRef,
1194
1127
  disabled: disabled || !callback,
1195
1128
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
1196
- _optionalChain([callback, 'optionalCall', _24 => _24()]);
1129
+ _optionalChain([callback, 'optionalCall', _13 => _13()]);
1197
1130
  })
1198
1131
  }
1199
1132
  );
@@ -1483,7 +1416,7 @@ var getContentPartState = ({ message }, useContentPart2, partIndex) => {
1483
1416
  part = EMPTY_CONTENT;
1484
1417
  }
1485
1418
  const status = toContentPartStatus(message, partIndex, part);
1486
- const currentState = _optionalChain([useContentPart2, 'optionalAccess', _25 => _25.getState, 'call', _26 => _26()]);
1419
+ const currentState = _optionalChain([useContentPart2, 'optionalAccess', _14 => _14.getState, 'call', _15 => _15()]);
1487
1420
  if (currentState && currentState.part === part && currentState.status === status)
1488
1421
  return null;
1489
1422
  return Object.freeze({ part, status });
@@ -1560,7 +1493,7 @@ var withSmoothContextProvider = (Component) => {
1560
1493
  };
1561
1494
  function useSmoothContext(options) {
1562
1495
  const context = _react.useContext.call(void 0, SmoothContext);
1563
- if (!_optionalChain([options, 'optionalAccess', _27 => _27.optional]) && !context)
1496
+ if (!_optionalChain([options, 'optionalAccess', _16 => _16.optional]) && !context)
1564
1497
  throw new Error(
1565
1498
  "This component must be used within a SmoothContextProvider."
1566
1499
  );
@@ -1625,7 +1558,7 @@ var useSmooth = (state, smooth = false) => {
1625
1558
  } = state;
1626
1559
  const id = useMessage({
1627
1560
  optional: true,
1628
- selector: (m) => m.message.id
1561
+ selector: (m) => m.id
1629
1562
  });
1630
1563
  const idRef = _react.useRef.call(void 0, id);
1631
1564
  const [displayedText, setDisplayedText] = _react.useState.call(void 0, text);
@@ -1767,7 +1700,7 @@ var MessageContentPartComponent = ({
1767
1700
  case "tool-call": {
1768
1701
  const Tool = by_name[part.toolName] || Fallback2;
1769
1702
  const addResult = (result) => threadRuntime.addToolResult({
1770
- messageId: messageStore.getState().message.id,
1703
+ messageId: messageStore.getState().id,
1771
1704
  toolName: part.toolName,
1772
1705
  toolCallId: part.toolCallId,
1773
1706
  result
@@ -1795,12 +1728,12 @@ var MessageContentPartImpl = ({
1795
1728
  };
1796
1729
  var MessageContentPart = _react.memo.call(void 0,
1797
1730
  MessageContentPartImpl,
1798
- (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _28 => _28.components, 'optionalAccess', _29 => _29.Text]) === _optionalChain([next, 'access', _30 => _30.components, 'optionalAccess', _31 => _31.Text]) && _optionalChain([prev, 'access', _32 => _32.components, 'optionalAccess', _33 => _33.Image]) === _optionalChain([next, 'access', _34 => _34.components, 'optionalAccess', _35 => _35.Image]) && _optionalChain([prev, 'access', _36 => _36.components, 'optionalAccess', _37 => _37.UI]) === _optionalChain([next, 'access', _38 => _38.components, 'optionalAccess', _39 => _39.UI]) && _optionalChain([prev, 'access', _40 => _40.components, 'optionalAccess', _41 => _41.tools]) === _optionalChain([next, 'access', _42 => _42.components, 'optionalAccess', _43 => _43.tools])
1731
+ (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _17 => _17.components, 'optionalAccess', _18 => _18.Text]) === _optionalChain([next, 'access', _19 => _19.components, 'optionalAccess', _20 => _20.Text]) && _optionalChain([prev, 'access', _21 => _21.components, 'optionalAccess', _22 => _22.Image]) === _optionalChain([next, 'access', _23 => _23.components, 'optionalAccess', _24 => _24.Image]) && _optionalChain([prev, 'access', _25 => _25.components, 'optionalAccess', _26 => _26.UI]) === _optionalChain([next, 'access', _27 => _27.components, 'optionalAccess', _28 => _28.UI]) && _optionalChain([prev, 'access', _29 => _29.components, 'optionalAccess', _30 => _30.tools]) === _optionalChain([next, 'access', _31 => _31.components, 'optionalAccess', _32 => _32.tools])
1799
1732
  );
1800
1733
  var MessagePrimitiveContent = ({
1801
1734
  components
1802
1735
  }) => {
1803
- const contentLength = useMessage((s) => s.message.content.length) || 1;
1736
+ const contentLength = useMessage((s) => s.content.length) || 1;
1804
1737
  return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPart, { partIndex: index, components }, index));
1805
1738
  };
1806
1739
  MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
@@ -1821,7 +1754,7 @@ var AttachmentContext = _react.createContext.call(void 0,
1821
1754
  );
1822
1755
  function useAttachmentContext(options) {
1823
1756
  const context = _react.useContext.call(void 0, AttachmentContext);
1824
- if (!_optionalChain([options, 'optionalAccess', _44 => _44.optional]) && !context)
1757
+ if (!_optionalChain([options, 'optionalAccess', _33 => _33.optional]) && !context)
1825
1758
  throw new Error(
1826
1759
  "This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component."
1827
1760
  );
@@ -1862,12 +1795,12 @@ var {
1862
1795
 
1863
1796
 
1864
1797
 
1865
- var getAttachment = ({ message }, useAttachment2, partIndex) => {
1798
+ var getAttachment = (message, useAttachment2, partIndex) => {
1866
1799
  if (message.role !== "user") return null;
1867
1800
  const attachments = message.attachments;
1868
1801
  const attachment = attachments[partIndex];
1869
1802
  if (!attachment) return null;
1870
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _45 => _45.getState, 'call', _46 => _46()]);
1803
+ const currentState = _optionalChain([useAttachment2, 'optionalAccess', _34 => _34.getState, 'call', _35 => _35()]);
1871
1804
  if (currentState && currentState.attachment === attachment) return null;
1872
1805
  return Object.freeze({ attachment });
1873
1806
  };
@@ -1910,11 +1843,11 @@ var getComponent = (components, attachment) => {
1910
1843
  const type = attachment.type;
1911
1844
  switch (type) {
1912
1845
  case "image":
1913
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _47 => _47.Image]), () => ( _optionalChain([components, 'optionalAccess', _48 => _48.Attachment])));
1846
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _36 => _36.Image]), () => ( _optionalChain([components, 'optionalAccess', _37 => _37.Attachment])));
1914
1847
  case "document":
1915
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _49 => _49.Document]), () => ( _optionalChain([components, 'optionalAccess', _50 => _50.Attachment])));
1848
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _38 => _38.Document]), () => ( _optionalChain([components, 'optionalAccess', _39 => _39.Attachment])));
1916
1849
  case "file":
1917
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _51 => _51.File]), () => ( _optionalChain([components, 'optionalAccess', _52 => _52.Attachment])));
1850
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _40 => _40.File]), () => ( _optionalChain([components, 'optionalAccess', _41 => _41.Attachment])));
1918
1851
  default:
1919
1852
  const _exhaustiveCheck = type;
1920
1853
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
@@ -1932,7 +1865,7 @@ var MessageAttachmentImpl = ({ components, attachmentIndex }) => {
1932
1865
  };
1933
1866
  var MessageAttachment = _react.memo.call(void 0,
1934
1867
  MessageAttachmentImpl,
1935
- (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _53 => _53.components, 'optionalAccess', _54 => _54.Image]) === _optionalChain([next, 'access', _55 => _55.components, 'optionalAccess', _56 => _56.Image]) && _optionalChain([prev, 'access', _57 => _57.components, 'optionalAccess', _58 => _58.Document]) === _optionalChain([next, 'access', _59 => _59.components, 'optionalAccess', _60 => _60.Document]) && _optionalChain([prev, 'access', _61 => _61.components, 'optionalAccess', _62 => _62.File]) === _optionalChain([next, 'access', _63 => _63.components, 'optionalAccess', _64 => _64.File]) && _optionalChain([prev, 'access', _65 => _65.components, 'optionalAccess', _66 => _66.Attachment]) === _optionalChain([next, 'access', _67 => _67.components, 'optionalAccess', _68 => _68.Attachment])
1868
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _42 => _42.components, 'optionalAccess', _43 => _43.Image]) === _optionalChain([next, 'access', _44 => _44.components, 'optionalAccess', _45 => _45.Image]) && _optionalChain([prev, 'access', _46 => _46.components, 'optionalAccess', _47 => _47.Document]) === _optionalChain([next, 'access', _48 => _48.components, 'optionalAccess', _49 => _49.Document]) && _optionalChain([prev, 'access', _50 => _50.components, 'optionalAccess', _51 => _51.File]) === _optionalChain([next, 'access', _52 => _52.components, 'optionalAccess', _53 => _53.File]) && _optionalChain([prev, 'access', _54 => _54.components, 'optionalAccess', _55 => _55.Attachment]) === _optionalChain([next, 'access', _56 => _56.components, 'optionalAccess', _57 => _57.Attachment])
1936
1869
  );
1937
1870
  var MessagePrimitiveAttachments = ({ components }) => {
1938
1871
  const attachmentsCount = useMessage(({ message }) => {
@@ -2043,7 +1976,7 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
2043
1976
  const { isRunning } = threadStore.getState();
2044
1977
  if (!isRunning) {
2045
1978
  e.preventDefault();
2046
- _optionalChain([textareaRef, 'access', _69 => _69.current, 'optionalAccess', _70 => _70.closest, 'call', _71 => _71("form"), 'optionalAccess', _72 => _72.requestSubmit, 'call', _73 => _73()]);
1979
+ _optionalChain([textareaRef, 'access', _58 => _58.current, 'optionalAccess', _59 => _59.closest, 'call', _60 => _60("form"), 'optionalAccess', _61 => _61.requestSubmit, 'call', _62 => _62()]);
2047
1980
  }
2048
1981
  }
2049
1982
  };
@@ -2111,7 +2044,7 @@ var ComposerPrimitiveAddAttachment = createActionButton(
2111
2044
  var getAttachment2 = ({ attachments }, useAttachment2, partIndex) => {
2112
2045
  const attachment = attachments[partIndex];
2113
2046
  if (!attachment) return null;
2114
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _74 => _74.getState, 'call', _75 => _75()]);
2047
+ const currentState = _optionalChain([useAttachment2, 'optionalAccess', _63 => _63.getState, 'call', _64 => _64()]);
2115
2048
  if (currentState && currentState.attachment === attachment) return null;
2116
2049
  return Object.freeze({ attachment });
2117
2050
  };
@@ -2151,11 +2084,11 @@ var getComponent2 = (components, attachment) => {
2151
2084
  const type = attachment.type;
2152
2085
  switch (type) {
2153
2086
  case "image":
2154
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _76 => _76.Image]), () => ( _optionalChain([components, 'optionalAccess', _77 => _77.Attachment])));
2087
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _65 => _65.Image]), () => ( _optionalChain([components, 'optionalAccess', _66 => _66.Attachment])));
2155
2088
  case "document":
2156
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _78 => _78.Document]), () => ( _optionalChain([components, 'optionalAccess', _79 => _79.Attachment])));
2089
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _67 => _67.Document]), () => ( _optionalChain([components, 'optionalAccess', _68 => _68.Attachment])));
2157
2090
  case "file":
2158
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _80 => _80.File]), () => ( _optionalChain([components, 'optionalAccess', _81 => _81.Attachment])));
2091
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _69 => _69.File]), () => ( _optionalChain([components, 'optionalAccess', _70 => _70.Attachment])));
2159
2092
  default:
2160
2093
  const _exhaustiveCheck = type;
2161
2094
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
@@ -2173,7 +2106,7 @@ var ComposerAttachmentImpl = ({ components, attachmentIndex }) => {
2173
2106
  };
2174
2107
  var ComposerAttachment = _react.memo.call(void 0,
2175
2108
  ComposerAttachmentImpl,
2176
- (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _82 => _82.components, 'optionalAccess', _83 => _83.Image]) === _optionalChain([next, 'access', _84 => _84.components, 'optionalAccess', _85 => _85.Image]) && _optionalChain([prev, 'access', _86 => _86.components, 'optionalAccess', _87 => _87.Document]) === _optionalChain([next, 'access', _88 => _88.components, 'optionalAccess', _89 => _89.Document]) && _optionalChain([prev, 'access', _90 => _90.components, 'optionalAccess', _91 => _91.File]) === _optionalChain([next, 'access', _92 => _92.components, 'optionalAccess', _93 => _93.File]) && _optionalChain([prev, 'access', _94 => _94.components, 'optionalAccess', _95 => _95.Attachment]) === _optionalChain([next, 'access', _96 => _96.components, 'optionalAccess', _97 => _97.Attachment])
2109
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _71 => _71.components, 'optionalAccess', _72 => _72.Image]) === _optionalChain([next, 'access', _73 => _73.components, 'optionalAccess', _74 => _74.Image]) && _optionalChain([prev, 'access', _75 => _75.components, 'optionalAccess', _76 => _76.Document]) === _optionalChain([next, 'access', _77 => _77.components, 'optionalAccess', _78 => _78.Document]) && _optionalChain([prev, 'access', _79 => _79.components, 'optionalAccess', _80 => _80.File]) === _optionalChain([next, 'access', _81 => _81.components, 'optionalAccess', _82 => _82.File]) && _optionalChain([prev, 'access', _83 => _83.components, 'optionalAccess', _84 => _84.Attachment]) === _optionalChain([next, 'access', _85 => _85.components, 'optionalAccess', _86 => _86.Attachment])
2177
2110
  );
2178
2111
  var ComposerPrimitiveAttachments = ({ components }) => {
2179
2112
  const attachmentsCount = useThreadComposer((s) => s.attachments.length);
@@ -2374,7 +2307,7 @@ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
2374
2307
  // src/primitives/thread/ThreadMessages.tsx
2375
2308
 
2376
2309
 
2377
- // src/context/providers/MessageProvider.tsx
2310
+ // src/context/providers/MessageRuntimeProvider.tsx
2378
2311
 
2379
2312
 
2380
2313
 
@@ -2432,7 +2365,7 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
2432
2365
  },
2433
2366
  isSpeaking: false,
2434
2367
  stopSpeaking: () => {
2435
- _optionalChain([utterance, 'optionalAccess', _98 => _98.cancel, 'call', _99 => _99()]);
2368
+ _optionalChain([utterance, 'optionalAccess', _87 => _87.cancel, 'call', _88 => _88()]);
2436
2369
  },
2437
2370
  addUtterance: (utt) => {
2438
2371
  utterance = utt;
@@ -2448,84 +2381,65 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
2448
2381
  };
2449
2382
  });
2450
2383
 
2451
- // src/context/providers/MessageProvider.tsx
2384
+ // src/context/providers/MessageRuntimeProvider.tsx
2452
2385
 
2453
- var getIsLast = (messages, message) => {
2454
- return _optionalChain([messages, 'access', _100 => _100[messages.length - 1], 'optionalAccess', _101 => _101.id]) === message.id;
2386
+ var useMessageRuntimeStore = (runtime) => {
2387
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime));
2388
+ _react.useEffect.call(void 0, () => {
2389
+ writableStore(store).setState(runtime, true);
2390
+ }, [runtime, store]);
2391
+ return store;
2455
2392
  };
2456
- var getMessageState = (messages, getBranches, useMessage2, messageIndex) => {
2457
- const parentId = _nullishCoalesce(_optionalChain([messages, 'access', _102 => _102[messageIndex - 1], 'optionalAccess', _103 => _103.id]), () => ( null));
2458
- const message = messages[messageIndex];
2459
- if (!message) return null;
2460
- const isLast = getIsLast(messages, message);
2461
- const branches = getBranches(message.id);
2462
- const currentState = _optionalChain([useMessage2, 'optionalAccess', _104 => _104.getState, 'call', _105 => _105()]);
2463
- if (currentState && currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
2464
- return null;
2465
- return Object.freeze({
2466
- message,
2467
- parentId,
2468
- branches,
2469
- isLast
2470
- });
2393
+ var useMessageStore2 = (runtime) => {
2394
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
2395
+ _react.useEffect.call(void 0, () => {
2396
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
2397
+ updateState();
2398
+ return runtime.subscribe(updateState);
2399
+ }, [runtime, store]);
2400
+ return store;
2471
2401
  };
2472
- var useMessageContext2 = (messageIndex) => {
2473
- const threadMessagesStore = useThreadMessagesStore();
2474
- const threadRuntime = useThreadRuntime();
2475
- const [context] = _react.useState.call(void 0, () => {
2476
- const useMessage2 = _zustand.create.call(void 0,
2477
- () => getMessageState(
2478
- threadMessagesStore.getState(),
2479
- threadRuntime.getBranches.bind(threadRuntime),
2480
- void 0,
2481
- messageIndex
2482
- )
2483
- );
2484
- const useMessageUtils2 = makeMessageUtilsStore();
2485
- const useEditComposer2 = makeEditComposerStore({
2402
+ var useMessageUtilsStore2 = () => {
2403
+ const [store] = _react.useState.call(void 0, () => makeMessageUtilsStore());
2404
+ return store;
2405
+ };
2406
+ var useEditComposerStore2 = (useMessageRuntime2) => {
2407
+ const [store] = _react.useState.call(void 0,
2408
+ () => makeEditComposerStore({
2486
2409
  onEdit: () => {
2487
- const message = useMessage2.getState().message;
2488
- const text = getThreadMessageText(message);
2410
+ const text = getThreadMessageText(
2411
+ useMessageRuntime2.getState().getState()
2412
+ );
2489
2413
  return text;
2490
2414
  },
2491
2415
  onSend: (text) => {
2492
- const { message, parentId } = useMessage2.getState();
2416
+ const message = useMessageRuntime2.getState().getState();
2493
2417
  const previousText = getThreadMessageText(message);
2494
2418
  if (previousText === text) return;
2495
2419
  const nonTextParts = message.content.filter(
2496
2420
  (part) => part.type !== "text" && part.type !== "ui"
2497
2421
  );
2498
- threadRuntime.append({
2499
- parentId,
2422
+ useMessageRuntime2.getState().edit({
2500
2423
  role: message.role,
2501
2424
  content: [{ type: "text", text }, ...nonTextParts],
2502
- attachments: message.attachments
2425
+ attachments: _nullishCoalesce(message.attachments, () => ( []))
2503
2426
  });
2504
2427
  }
2505
- });
2506
- return { useMessage: useMessage2, useMessageUtils: useMessageUtils2, useEditComposer: useEditComposer2 };
2507
- });
2508
- _react.useEffect.call(void 0, () => {
2509
- const syncMessage = (thread) => {
2510
- const newState = getMessageState(
2511
- thread,
2512
- threadRuntime.getBranches.bind(threadRuntime),
2513
- context.useMessage,
2514
- messageIndex
2515
- );
2516
- if (!newState) return;
2517
- writableStore(context.useMessage).setState(newState, true);
2518
- };
2519
- syncMessage(threadMessagesStore.getState());
2520
- return threadMessagesStore.subscribe(syncMessage);
2521
- }, [threadMessagesStore, threadRuntime, context, messageIndex]);
2522
- return context;
2428
+ })
2429
+ );
2430
+ return store;
2523
2431
  };
2524
- var MessageProvider = ({
2525
- messageIndex,
2432
+ var MessageRuntimeProvider = ({
2433
+ runtime,
2526
2434
  children
2527
2435
  }) => {
2528
- const context = useMessageContext2(messageIndex);
2436
+ const useMessageRuntime2 = useMessageRuntimeStore(runtime);
2437
+ const useMessage2 = useMessageStore2(runtime);
2438
+ const useMessageUtils2 = useMessageUtilsStore2();
2439
+ const useEditComposer2 = useEditComposerStore2(useMessageRuntime2);
2440
+ const [context] = _react.useState.call(void 0, () => {
2441
+ return { useMessageRuntime: useMessageRuntime2, useMessage: useMessage2, useMessageUtils: useMessageUtils2, useEditComposer: useEditComposer2 };
2442
+ });
2529
2443
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContext.Provider, { value: context, children });
2530
2444
  };
2531
2445
 
@@ -2563,7 +2477,7 @@ var getComponent3 = (components, role, isEditing) => {
2563
2477
  var ThreadMessageComponent = ({
2564
2478
  components
2565
2479
  }) => {
2566
- const role = useMessage((m) => m.message.role);
2480
+ const role = useMessage((m) => m.role);
2567
2481
  const isEditing = useEditComposer((c) => c.isEditing);
2568
2482
  const Component = getComponent3(components, role, isEditing);
2569
2483
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, {});
@@ -2572,7 +2486,12 @@ var ThreadMessageImpl = ({
2572
2486
  messageIndex,
2573
2487
  components
2574
2488
  }) => {
2575
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageProvider, { messageIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadMessageComponent, { components }) });
2489
+ const threadRuntime = useThreadRuntime();
2490
+ const runtime = _react.useMemo.call(void 0,
2491
+ () => threadRuntime.unstable_getMesssageByIndex(messageIndex),
2492
+ [threadRuntime, messageIndex]
2493
+ );
2494
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageRuntimeProvider, { runtime, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadMessageComponent, { components }) });
2576
2495
  };
2577
2496
  var ThreadMessage = _react.memo.call(void 0,
2578
2497
  ThreadMessageImpl,
@@ -2609,7 +2528,7 @@ var subscribeToMainThread = (runtime, callback) => {
2609
2528
  let first = true;
2610
2529
  let cleanup;
2611
2530
  const inner = () => {
2612
- _optionalChain([cleanup, 'optionalCall', _106 => _106()]);
2531
+ _optionalChain([cleanup, 'optionalCall', _89 => _89()]);
2613
2532
  cleanup = runtime.thread.subscribe(callback);
2614
2533
  if (!first) {
2615
2534
  callback();
@@ -2620,7 +2539,7 @@ var subscribeToMainThread = (runtime, callback) => {
2620
2539
  inner();
2621
2540
  return () => {
2622
2541
  unsubscribe();
2623
- _optionalChain([cleanup, 'optionalCall', _107 => _107()]);
2542
+ _optionalChain([cleanup, 'optionalCall', _90 => _90()]);
2624
2543
  };
2625
2544
  };
2626
2545
 
@@ -2655,7 +2574,7 @@ var internal_exports = {};
2655
2574
  _chunkPZ5AY32Cjs.__export.call(void 0, internal_exports, {
2656
2575
  AssistantRuntime: () => AssistantRuntime,
2657
2576
  BaseAssistantRuntimeCore: () => BaseAssistantRuntimeCore,
2658
- BaseThreadRuntimeComposerCore: () => BaseThreadComposerRuntimeCore,
2577
+ BaseThreadComposerRuntimeCore: () => BaseThreadComposerRuntimeCore,
2659
2578
  MessageRepository: () => MessageRepository,
2660
2579
  ProxyConfigProvider: () => ProxyConfigProvider,
2661
2580
  ThreadRuntime: () => ThreadRuntime,
@@ -2668,24 +2587,37 @@ _chunkPZ5AY32Cjs.__export.call(void 0, internal_exports, {
2668
2587
 
2669
2588
  // src/runtimes/utils/BaseThreadComposerRuntimeCore.tsx
2670
2589
  var BaseThreadComposerRuntimeCore = (_class3 = class {
2671
- constructor(runtime) {;_class3.prototype.__init7.call(this);_class3.prototype.__init8.call(this);_class3.prototype.__init9.call(this);_class3.prototype.__init10.call(this);
2590
+ constructor(runtime) {;_class3.prototype.__init7.call(this);_class3.prototype.__init8.call(this);_class3.prototype.__init9.call(this);_class3.prototype.__init10.call(this);_class3.prototype.__init11.call(this);
2672
2591
  this.runtime = runtime;
2592
+ this.connect();
2673
2593
  }
2674
2594
 
2675
2595
  __init7() {this.attachmentAccept = "*"}
2676
2596
  get isEmpty() {
2677
2597
  return !this.text.trim() && !this.attachments.length;
2678
2598
  }
2599
+ __init8() {this._canCancel = false}
2600
+ get canCancel() {
2601
+ return this._canCancel;
2602
+ }
2603
+ connect() {
2604
+ return this.runtime.subscribe(() => {
2605
+ if (this.canCancel !== this.runtime.capabilities.cancel) {
2606
+ this._canCancel = this.runtime.capabilities.cancel;
2607
+ this.notifySubscribers();
2608
+ }
2609
+ });
2610
+ }
2679
2611
  setAttachmentAdapter(adapter) {
2680
2612
  this._attachmentAdapter = adapter;
2681
- const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _108 => _108.accept]), () => ( "*"));
2613
+ const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _91 => _91.accept]), () => ( "*"));
2682
2614
  if (this.attachmentAccept !== accept) {
2683
2615
  this.attachmentAccept = accept;
2684
2616
  return true;
2685
2617
  }
2686
2618
  return false;
2687
2619
  }
2688
- __init8() {this._attachments = []}
2620
+ __init9() {this._attachments = []}
2689
2621
  get attachments() {
2690
2622
  return this._attachments;
2691
2623
  }
@@ -2706,7 +2638,7 @@ var BaseThreadComposerRuntimeCore = (_class3 = class {
2706
2638
  this._attachments = this._attachments.toSpliced(index, 1);
2707
2639
  this.notifySubscribers();
2708
2640
  }
2709
- __init9() {this._text = ""}
2641
+ __init10() {this._text = ""}
2710
2642
  get text() {
2711
2643
  return this._text;
2712
2644
  }
@@ -2726,14 +2658,17 @@ var BaseThreadComposerRuntimeCore = (_class3 = class {
2726
2658
  )
2727
2659
  ) : [];
2728
2660
  this.runtime.append({
2729
- parentId: _nullishCoalesce(_optionalChain([this, 'access', _109 => _109.runtime, 'access', _110 => _110.messages, 'access', _111 => _111.at, 'call', _112 => _112(-1), 'optionalAccess', _113 => _113.id]), () => ( null)),
2661
+ parentId: _nullishCoalesce(_optionalChain([this, 'access', _92 => _92.runtime, 'access', _93 => _93.messages, 'access', _94 => _94.at, 'call', _95 => _95(-1), 'optionalAccess', _96 => _96.id]), () => ( null)),
2730
2662
  role: "user",
2731
2663
  content: this.text ? [{ type: "text", text: this.text }] : [],
2732
2664
  attachments
2733
2665
  });
2734
2666
  this.reset();
2735
2667
  }
2736
- __init10() {this._subscriptions = /* @__PURE__ */ new Set()}
2668
+ async cancel() {
2669
+ this.runtime.cancelRun();
2670
+ }
2671
+ __init11() {this._subscriptions = /* @__PURE__ */ new Set()}
2737
2672
  notifySubscribers() {
2738
2673
  for (const callback of this._subscriptions) callback();
2739
2674
  }
@@ -2744,8 +2679,8 @@ var BaseThreadComposerRuntimeCore = (_class3 = class {
2744
2679
  }, _class3);
2745
2680
 
2746
2681
  // src/utils/ProxyConfigProvider.ts
2747
- var ProxyConfigProvider = (_class4 = class {constructor() { _class4.prototype.__init11.call(this); }
2748
- __init11() {this._providers = /* @__PURE__ */ new Set()}
2682
+ var ProxyConfigProvider = (_class4 = class {constructor() { _class4.prototype.__init12.call(this); }
2683
+ __init12() {this._providers = /* @__PURE__ */ new Set()}
2749
2684
  getModelConfig() {
2750
2685
  return _chunk5KIEXJRKjs.mergeModelConfigs.call(void 0, this._providers);
2751
2686
  }
@@ -2822,11 +2757,11 @@ var findHead = (message) => {
2822
2757
  if ("current" in message) return message;
2823
2758
  return null;
2824
2759
  };
2825
- var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__init12.call(this);_class5.prototype.__init13.call(this);_class5.prototype.__init14.call(this); }
2826
- __init12() {this.messages = /* @__PURE__ */ new Map()}
2760
+ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__init13.call(this);_class5.prototype.__init14.call(this);_class5.prototype.__init15.call(this); }
2761
+ __init13() {this.messages = /* @__PURE__ */ new Map()}
2827
2762
  // message_id -> item
2828
- __init13() {this.head = null}
2829
- __init14() {this.root = {
2763
+ __init14() {this.head = null}
2764
+ __init15() {this.root = {
2830
2765
  children: [],
2831
2766
  next: null
2832
2767
  }}
@@ -2868,7 +2803,7 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2868
2803
  }
2869
2804
  }
2870
2805
  getMessages() {
2871
- const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _114 => _114.head, 'optionalAccess', _115 => _115.level]), () => ( 0)));
2806
+ const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _97 => _97.head, 'optionalAccess', _98 => _98.level]), () => ( 0)));
2872
2807
  for (let current = this.head; current; current = current.prev) {
2873
2808
  messages[current.level] = current.current;
2874
2809
  }
@@ -2906,7 +2841,7 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2906
2841
  "MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui."
2907
2842
  );
2908
2843
  return {
2909
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _116 => _116.prev, 'optionalAccess', _117 => _117.current, 'access', _118 => _118.id]), () => ( null)),
2844
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _99 => _99.prev, 'optionalAccess', _100 => _100.current, 'access', _101 => _101.id]), () => ( null)),
2910
2845
  message: message.current
2911
2846
  };
2912
2847
  }
@@ -2990,11 +2925,11 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2990
2925
  for (const [, message] of this.messages) {
2991
2926
  exportItems.push({
2992
2927
  message: message.current,
2993
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _119 => _119.prev, 'optionalAccess', _120 => _120.current, 'access', _121 => _121.id]), () => ( null))
2928
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _102 => _102.prev, 'optionalAccess', _103 => _103.current, 'access', _104 => _104.id]), () => ( null))
2994
2929
  });
2995
2930
  }
2996
2931
  return {
2997
- headId: _nullishCoalesce(_optionalChain([this, 'access', _122 => _122.head, 'optionalAccess', _123 => _123.current, 'access', _124 => _124.id]), () => ( null)),
2932
+ headId: _nullishCoalesce(_optionalChain([this, 'access', _105 => _105.head, 'optionalAccess', _106 => _106.current, 'access', _107 => _107.id]), () => ( null)),
2998
2933
  messages: exportItems
2999
2934
  };
3000
2935
  }
@@ -3002,7 +2937,7 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
3002
2937
  for (const { message, parentId } of messages) {
3003
2938
  this.addOrUpdateMessage(parentId, message);
3004
2939
  }
3005
- this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _125 => _125.at, 'call', _126 => _126(-1), 'optionalAccess', _127 => _127.message, 'access', _128 => _128.id]))), () => ( null)));
2940
+ this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _108 => _108.at, 'call', _109 => _109(-1), 'optionalAccess', _110 => _110.message, 'access', _111 => _111.id]))), () => ( null)));
3006
2941
  }
3007
2942
  }, _class5);
3008
2943
 
@@ -3103,8 +3038,8 @@ var TooltipIconButton = _react.forwardRef.call(void 0, ({ children, tooltip, sid
3103
3038
  TooltipIconButton.displayName = "TooltipIconButton";
3104
3039
 
3105
3040
  // src/api/subscribable/BaseSubject.ts
3106
- var BaseSubject = (_class6 = class {constructor() { _class6.prototype.__init15.call(this); }
3107
- __init15() {this._subscriptions = /* @__PURE__ */ new Set()}
3041
+ var BaseSubject = (_class6 = class {constructor() { _class6.prototype.__init16.call(this); }
3042
+ __init16() {this._subscriptions = /* @__PURE__ */ new Set()}
3108
3043
 
3109
3044
  get isConnected() {
3110
3045
  return !!this._connection;
@@ -3117,7 +3052,7 @@ var BaseSubject = (_class6 = class {constructor() { _class6.prototype.__init15.c
3117
3052
  if (this._connection) return;
3118
3053
  this._connection = this._connect();
3119
3054
  } else {
3120
- _optionalChain([this, 'access', _129 => _129._connection, 'optionalCall', _130 => _130()]);
3055
+ _optionalChain([this, 'access', _112 => _112._connection, 'optionalCall', _113 => _113()]);
3121
3056
  this._connection = void 0;
3122
3057
  }
3123
3058
  }
@@ -3150,13 +3085,13 @@ var NestedSubscriptionSubject = class extends BaseSubject {
3150
3085
  const newState = this.binding.getState();
3151
3086
  if (newState === lastState) return;
3152
3087
  lastState = newState;
3153
- _optionalChain([innerUnsubscribe, 'optionalCall', _131 => _131()]);
3088
+ _optionalChain([innerUnsubscribe, 'optionalCall', _114 => _114()]);
3154
3089
  innerUnsubscribe = this.binding.getState().subscribe(callback);
3155
3090
  callback();
3156
3091
  };
3157
3092
  const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
3158
3093
  return () => {
3159
- _optionalChain([outerUnsubscribe, 'optionalCall', _132 => _132()]);
3094
+ _optionalChain([outerUnsubscribe, 'optionalCall', _115 => _115()]);
3160
3095
  innerUnsubscribe();
3161
3096
  };
3162
3097
  }
@@ -3212,7 +3147,7 @@ var ContentPartRuntime = class {
3212
3147
  const toolName = state.part.toolName;
3213
3148
  const toolCallId = state.part.toolCallId;
3214
3149
  this.threadApi.getState().addToolResult({
3215
- messageId: message.message.id,
3150
+ messageId: message.id,
3216
3151
  toolName,
3217
3152
  toolCallId,
3218
3153
  result
@@ -3236,7 +3171,7 @@ function shallowEqual(objA, objB) {
3236
3171
  // src/api/subscribable/ShallowMemoizeSubject.ts
3237
3172
  var ShallowMemoizeSubject = (_class7 = class extends BaseSubject {
3238
3173
  constructor(binding) {
3239
- super();_class7.prototype.__init16.call(this);;
3174
+ super();_class7.prototype.__init17.call(this);;
3240
3175
  this.binding = binding;
3241
3176
  const state = binding.getState();
3242
3177
  if (state === void 0)
@@ -3244,7 +3179,7 @@ var ShallowMemoizeSubject = (_class7 = class extends BaseSubject {
3244
3179
  this._previousState = state;
3245
3180
  }
3246
3181
 
3247
- __init16() {this.getState = () => {
3182
+ __init17() {this.getState = () => {
3248
3183
  if (!this.isConnected) this._syncState();
3249
3184
  return this._previousState;
3250
3185
  }}
@@ -3266,60 +3201,13 @@ var ShallowMemoizeSubject = (_class7 = class extends BaseSubject {
3266
3201
  }, _class7);
3267
3202
 
3268
3203
  // src/api/MessageRuntime.ts
3269
- var MessageState = class {
3270
- constructor(snapshot) {
3271
- this.snapshot = snapshot;
3272
- }
3273
- /**
3274
- * @deprecated Replace `.message.content` with `.content` etc. This will be removed in 0.6.0.
3275
- */
3276
- get message() {
3277
- return this.snapshot.message;
3278
- }
3279
- get id() {
3280
- return this.snapshot.message.id;
3281
- }
3282
- get createdAt() {
3283
- return this.snapshot.message.createdAt;
3284
- }
3285
- get role() {
3286
- return this.snapshot.message.role;
3287
- }
3288
- get content() {
3289
- return this.snapshot.message.content;
3290
- }
3291
- get attachments() {
3292
- return this.snapshot.message.attachments;
3293
- }
3294
- get metadata() {
3295
- return this.snapshot.message.metadata;
3296
- }
3297
- get status() {
3298
- return this.snapshot.message.status;
3299
- }
3300
- get parentId() {
3301
- return this.snapshot.parentId;
3302
- }
3303
- get isLast() {
3304
- return this.snapshot.isLast;
3305
- }
3306
- get branches() {
3307
- return this.snapshot.branches;
3308
- }
3309
- get branchNumber() {
3310
- return this.snapshot.branchNumber;
3311
- }
3312
- get branchCount() {
3313
- return this.snapshot.branchCount;
3314
- }
3315
- };
3316
3204
  var MessageRuntime = class {
3317
3205
  constructor(_core, _threadBinding) {
3318
3206
  this._core = _core;
3319
3207
  this._threadBinding = _threadBinding;
3320
3208
  }
3321
3209
  getState() {
3322
- return new MessageState(this._core.getState());
3210
+ return this._core.getState();
3323
3211
  }
3324
3212
  // TODO improve type
3325
3213
  edit(message) {
@@ -3338,13 +3226,13 @@ var MessageRuntime = class {
3338
3226
  speak() {
3339
3227
  const state = this._core.getState();
3340
3228
  if (!state) throw new Error("Message is not available");
3341
- this._threadBinding.getState().speak(state.message.id);
3229
+ this._threadBinding.getState().speak(state.id);
3342
3230
  }
3343
3231
  submitFeedback({ type }) {
3344
3232
  const state = this._core.getState();
3345
3233
  if (!state) throw new Error("Message is not available");
3346
3234
  this._threadBinding.getState().submitFeedback({
3347
- messageId: state.message.id,
3235
+ messageId: state.id,
3348
3236
  type
3349
3237
  });
3350
3238
  }
@@ -3360,7 +3248,7 @@ var MessageRuntime = class {
3360
3248
  throw new Error("Must specify either branchId or position");
3361
3249
  }
3362
3250
  const thread = this._threadBinding.getState();
3363
- const branches = thread.getBranches(state.message.id);
3251
+ const branches = thread.getBranches(state.id);
3364
3252
  let targetBranch = branchId;
3365
3253
  if (position === "previous") {
3366
3254
  targetBranch = branches[state.branchNumber - 2];
@@ -3397,27 +3285,18 @@ var MessageRuntime = class {
3397
3285
  };
3398
3286
 
3399
3287
  // src/api/ThreadComposerRuntime.ts
3400
- var ComposerState = class {
3401
- constructor(_composerBinding) {
3402
- this._composerBinding = _composerBinding;
3403
- }
3404
- get isEmpty() {
3405
- return this._composerBinding.getState().isEmpty;
3406
- }
3407
- get text() {
3408
- return this._composerBinding.getState().text;
3409
- }
3410
- get attachmentAccept() {
3411
- return this._composerBinding.getState().attachmentAccept;
3412
- }
3413
- get attachments() {
3414
- return this._composerBinding.getState().attachments;
3415
- }
3288
+ var getThreadComposerState = (runtime) => {
3289
+ return Object.freeze({
3290
+ canCancel: runtime.canCancel,
3291
+ isEmpty: runtime.isEmpty,
3292
+ text: runtime.text,
3293
+ attachments: runtime.attachments,
3294
+ attachmentAccept: runtime.attachmentAccept
3295
+ });
3416
3296
  };
3417
3297
  var ThreadComposerRuntime = class {
3418
3298
  constructor(_core) {
3419
3299
  this._core = _core;
3420
- this._state = new ComposerState(_core);
3421
3300
  }
3422
3301
  /**
3423
3302
  * @deprecated Use `getState().isEmpty` instead. This will be removed in 0.6.0.
@@ -3425,6 +3304,12 @@ var ThreadComposerRuntime = class {
3425
3304
  get isEmpty() {
3426
3305
  return this._core.getState().isEmpty;
3427
3306
  }
3307
+ /**
3308
+ * @deprecated Use `getState().canCancel` instead. This will be removed in 0.6.0.
3309
+ */
3310
+ get canCancel() {
3311
+ return this._core.getState().canCancel;
3312
+ }
3428
3313
  /**
3429
3314
  * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
3430
3315
  */
@@ -3444,9 +3329,8 @@ var ThreadComposerRuntime = class {
3444
3329
  get attachments() {
3445
3330
  return this._core.getState().attachments;
3446
3331
  }
3447
-
3448
3332
  getState() {
3449
- return this._state;
3333
+ return getThreadComposerState(this._core.getState());
3450
3334
  }
3451
3335
  setText(text) {
3452
3336
  this._core.getState().setText(text);
@@ -3469,33 +3353,46 @@ var ThreadComposerRuntime = class {
3469
3353
  send() {
3470
3354
  this._core.getState().send();
3471
3355
  }
3356
+ cancel() {
3357
+ this._core.getState().cancel();
3358
+ }
3472
3359
  subscribe(callback) {
3473
3360
  return this._core.subscribe(callback);
3474
3361
  }
3475
3362
  };
3476
3363
 
3477
3364
  // src/api/ThreadRuntime.ts
3478
- var ThreadState = class {
3479
- constructor(_core) {
3480
- this._core = _core;
3481
- }
3482
- get threadId() {
3483
- return this._core.threadId;
3484
- }
3485
- get isDisabled() {
3486
- return this._core.isDisabled;
3487
- }
3488
- get isRunning() {
3489
- const messages = this._core.messages;
3490
- const lastMessage = messages[messages.length - 1];
3491
- return _optionalChain([lastMessage, 'optionalAccess', _133 => _133.role]) !== "assistant" ? false : lastMessage.status.type === "running";
3365
+ var toAppendMessage = (messages, message) => {
3366
+ if (typeof message === "string") {
3367
+ return {
3368
+ parentId: _nullishCoalesce(_optionalChain([messages, 'access', _116 => _116.at, 'call', _117 => _117(-1), 'optionalAccess', _118 => _118.id]), () => ( null)),
3369
+ role: "user",
3370
+ content: [{ type: "text", text: message }],
3371
+ attachments: []
3372
+ };
3492
3373
  }
3493
- get capabilities() {
3494
- return this._core.capabilities;
3374
+ if (message.role && message.parentId && message.attachments) {
3375
+ return message;
3495
3376
  }
3377
+ return {
3378
+ parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([messages, 'access', _119 => _119.at, 'call', _120 => _120(-1), 'optionalAccess', _121 => _121.id]))), () => ( null)),
3379
+ role: _nullishCoalesce(message.role, () => ( "user")),
3380
+ content: message.content,
3381
+ attachments: _nullishCoalesce(message.attachments, () => ( []))
3382
+ };
3383
+ };
3384
+ var getThreadState = (runtime) => {
3385
+ const lastMessage = runtime.messages.at(-1);
3386
+ return Object.freeze({
3387
+ threadId: runtime.threadId,
3388
+ capabilities: runtime.capabilities,
3389
+ isDisabled: runtime.isDisabled,
3390
+ isRunning: _optionalChain([lastMessage, 'optionalAccess', _122 => _122.role]) !== "assistant" ? false : lastMessage.status.type === "running",
3391
+ unstable_synchronizer: runtime.unstable_synchronizer
3392
+ });
3496
3393
  };
3497
3394
  var ThreadRuntime = (_class8 = class {
3498
- constructor(_threadBinding) {;_class8.prototype.__init17.call(this);
3395
+ constructor(_threadBinding) {;_class8.prototype.__init18.call(this);
3499
3396
  this._threadBinding = _threadBinding;
3500
3397
  }
3501
3398
  // public path = "assistant.threads[main]"; // TODO
@@ -3530,17 +3427,19 @@ var ThreadRuntime = (_class8 = class {
3530
3427
  unstable_getCore() {
3531
3428
  return this._threadBinding.getState();
3532
3429
  }
3533
- __init17() {this.composer = new ThreadComposerRuntime(
3430
+ __init18() {this.composer = new ThreadComposerRuntime(
3534
3431
  new NestedSubscriptionSubject({
3535
3432
  getState: () => this._threadBinding.getState().composer,
3536
3433
  subscribe: (callback) => this._threadBinding.subscribe(callback)
3537
3434
  })
3538
3435
  )}
3539
3436
  getState() {
3540
- return new ThreadState(this._threadBinding.getState());
3437
+ return getThreadState(this._threadBinding.getState());
3541
3438
  }
3542
3439
  append(message) {
3543
- this._threadBinding.getState().append(message);
3440
+ this._threadBinding.getState().append(
3441
+ toAppendMessage(this._threadBinding.getState().messages, message)
3442
+ );
3544
3443
  }
3545
3444
  subscribe(callback) {
3546
3445
  return this._threadBinding.subscribe(callback);
@@ -3600,9 +3499,10 @@ var ThreadRuntime = (_class8 = class {
3600
3499
  if (!message) return void 0;
3601
3500
  const branches = this._threadBinding.getState().getBranches(message.id);
3602
3501
  return {
3502
+ ...message,
3603
3503
  message,
3604
3504
  isLast: idx === messages.length - 1,
3605
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _134 => _134[idx - 1], 'optionalAccess', _135 => _135.id]), () => ( null)),
3505
+ parentId: _nullishCoalesce(_optionalChain([messages, 'access', _123 => _123[idx - 1], 'optionalAccess', _124 => _124.id]), () => ( null)),
3606
3506
  branches,
3607
3507
  branchNumber: branches.indexOf(message.id) + 1,
3608
3508
  branchCount: branches.length
@@ -3678,7 +3578,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3678
3578
  });
3679
3579
  if (mergeRoundtrips) {
3680
3580
  const previousMessage = messages[messages.length - 1];
3681
- if (_optionalChain([previousMessage, 'optionalAccess', _136 => _136.role]) === "assistant") {
3581
+ if (_optionalChain([previousMessage, 'optionalAccess', _125 => _125.role]) === "assistant") {
3682
3582
  previousMessage.content.push(...newContent);
3683
3583
  break;
3684
3584
  }
@@ -3691,7 +3591,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3691
3591
  }
3692
3592
  case "tool": {
3693
3593
  const previousMessage = messages[messages.length - 1];
3694
- if (_optionalChain([previousMessage, 'optionalAccess', _137 => _137.role]) !== "assistant")
3594
+ if (_optionalChain([previousMessage, 'optionalAccess', _126 => _126.role]) !== "assistant")
3695
3595
  throw new Error(
3696
3596
  "A tool message must be preceded by an assistant message."
3697
3597
  );
@@ -3920,11 +3820,11 @@ var useEdgeRuntime = ({
3920
3820
  };
3921
3821
 
3922
3822
  // src/runtimes/local/shouldContinue.tsx
3923
- var shouldContinue = (result) => _optionalChain([result, 'access', _138 => _138.status, 'optionalAccess', _139 => _139.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
3823
+ var shouldContinue = (result) => _optionalChain([result, 'access', _127 => _127.status, 'optionalAccess', _128 => _128.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
3924
3824
 
3925
3825
  // src/runtimes/local/LocalThreadRuntimeCore.tsx
3926
3826
  var LocalThreadRuntimeCore = (_class9 = class {
3927
- constructor(configProvider, adapter, { initialMessages, ...options }) {;_class9.prototype.__init18.call(this);_class9.prototype.__init19.call(this);_class9.prototype.__init20.call(this);_class9.prototype.__init21.call(this);_class9.prototype.__init22.call(this);_class9.prototype.__init23.call(this);
3827
+ constructor(configProvider, adapter, { initialMessages, ...options }) {;_class9.prototype.__init19.call(this);_class9.prototype.__init20.call(this);_class9.prototype.__init21.call(this);_class9.prototype.__init22.call(this);_class9.prototype.__init23.call(this);_class9.prototype.__init24.call(this);
3928
3828
  this.configProvider = configProvider;
3929
3829
  this.adapter = adapter;
3930
3830
  this.threadId = generateId();
@@ -3938,10 +3838,10 @@ var LocalThreadRuntimeCore = (_class9 = class {
3938
3838
  }
3939
3839
  }
3940
3840
  }
3941
- __init18() {this._subscriptions = /* @__PURE__ */ new Set()}
3942
- __init19() {this.abortController = null}
3943
- __init20() {this.repository = new MessageRepository()}
3944
- __init21() {this.capabilities = {
3841
+ __init19() {this._subscriptions = /* @__PURE__ */ new Set()}
3842
+ __init20() {this.abortController = null}
3843
+ __init21() {this.repository = new MessageRepository()}
3844
+ __init22() {this.capabilities = {
3945
3845
  switchToBranch: true,
3946
3846
  edit: true,
3947
3847
  reload: true,
@@ -3952,11 +3852,11 @@ var LocalThreadRuntimeCore = (_class9 = class {
3952
3852
  feedback: false
3953
3853
  }}
3954
3854
 
3955
- __init22() {this.isDisabled = false}
3855
+ __init23() {this.isDisabled = false}
3956
3856
  get messages() {
3957
3857
  return this.repository.getMessages();
3958
3858
  }
3959
- __init23() {this.composer = new BaseThreadComposerRuntimeCore(this)}
3859
+ __init24() {this.composer = new BaseThreadComposerRuntimeCore(this)}
3960
3860
  getModelConfig() {
3961
3861
  return this.configProvider.getModelConfig();
3962
3862
  }
@@ -3967,18 +3867,18 @@ var LocalThreadRuntimeCore = (_class9 = class {
3967
3867
  set options({ initialMessages, ...options }) {
3968
3868
  this._options = options;
3969
3869
  let hasUpdates = false;
3970
- const canSpeak = _optionalChain([options, 'access', _140 => _140.adapters, 'optionalAccess', _141 => _141.speech]) !== void 0;
3870
+ const canSpeak = _optionalChain([options, 'access', _129 => _129.adapters, 'optionalAccess', _130 => _130.speech]) !== void 0;
3971
3871
  if (this.capabilities.speak !== canSpeak) {
3972
3872
  this.capabilities.speak = canSpeak;
3973
3873
  hasUpdates = true;
3974
3874
  }
3975
- this.composer.setAttachmentAdapter(_optionalChain([options, 'access', _142 => _142.adapters, 'optionalAccess', _143 => _143.attachments]));
3976
- const canAttach = _optionalChain([options, 'access', _144 => _144.adapters, 'optionalAccess', _145 => _145.attachments]) !== void 0;
3875
+ this.composer.setAttachmentAdapter(_optionalChain([options, 'access', _131 => _131.adapters, 'optionalAccess', _132 => _132.attachments]));
3876
+ const canAttach = _optionalChain([options, 'access', _133 => _133.adapters, 'optionalAccess', _134 => _134.attachments]) !== void 0;
3977
3877
  if (this.capabilities.attachments !== canAttach) {
3978
3878
  this.capabilities.attachments = canAttach;
3979
3879
  hasUpdates = true;
3980
3880
  }
3981
- const canFeedback = _optionalChain([options, 'access', _146 => _146.adapters, 'optionalAccess', _147 => _147.feedback]) !== void 0;
3881
+ const canFeedback = _optionalChain([options, 'access', _135 => _135.adapters, 'optionalAccess', _136 => _136.feedback]) !== void 0;
3982
3882
  if (this.capabilities.feedback !== canFeedback) {
3983
3883
  this.capabilities.feedback = canFeedback;
3984
3884
  hasUpdates = true;
@@ -4020,18 +3920,18 @@ var LocalThreadRuntimeCore = (_class9 = class {
4020
3920
  }
4021
3921
  async performRoundtrip(parentId, message) {
4022
3922
  const messages = this.repository.getMessages();
4023
- _optionalChain([this, 'access', _148 => _148.abortController, 'optionalAccess', _149 => _149.abort, 'call', _150 => _150()]);
3923
+ _optionalChain([this, 'access', _137 => _137.abortController, 'optionalAccess', _138 => _138.abort, 'call', _139 => _139()]);
4024
3924
  this.abortController = new AbortController();
4025
3925
  const initialContent = message.content;
4026
- const initialRoundtrips = _optionalChain([message, 'access', _151 => _151.metadata, 'optionalAccess', _152 => _152.roundtrips]);
4027
- const initalCustom = _optionalChain([message, 'access', _153 => _153.metadata, 'optionalAccess', _154 => _154.custom]);
3926
+ const initialRoundtrips = _optionalChain([message, 'access', _140 => _140.metadata, 'optionalAccess', _141 => _141.roundtrips]);
3927
+ const initalCustom = _optionalChain([message, 'access', _142 => _142.metadata, 'optionalAccess', _143 => _143.custom]);
4028
3928
  const updateMessage = (m) => {
4029
3929
  message = {
4030
3930
  ...message,
4031
3931
  ...m.content ? { content: [...initialContent, ..._nullishCoalesce(m.content, () => ( []))] } : void 0,
4032
3932
  status: _nullishCoalesce(m.status, () => ( message.status)),
4033
3933
  // TODO deprecated, remove in v0.6
4034
- ..._optionalChain([m, 'access', _155 => _155.metadata, 'optionalAccess', _156 => _156.roundtrips]) ? {
3934
+ ..._optionalChain([m, 'access', _144 => _144.metadata, 'optionalAccess', _145 => _145.roundtrips]) ? {
4035
3935
  roundtrips: [
4036
3936
  ..._nullishCoalesce(initialRoundtrips, () => ( [])),
4037
3937
  ...m.metadata.roundtrips
@@ -4046,7 +3946,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4046
3946
  ...m.metadata.roundtrips
4047
3947
  ]
4048
3948
  } : void 0,
4049
- ..._optionalChain([m, 'access', _157 => _157.metadata, 'optionalAccess', _158 => _158.custom]) ? {
3949
+ ..._optionalChain([m, 'access', _146 => _146.metadata, 'optionalAccess', _147 => _147.custom]) ? {
4050
3950
  custom: { ..._nullishCoalesce(initalCustom, () => ( {})), ...m.metadata.custom }
4051
3951
  } : void 0
4052
3952
  }
@@ -4056,7 +3956,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4056
3956
  this.notifySubscribers();
4057
3957
  };
4058
3958
  const maxToolRoundtrips = _nullishCoalesce(this.options.maxToolRoundtrips, () => ( 1));
4059
- const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _159 => _159.metadata, 'optionalAccess', _160 => _160.roundtrips, 'optionalAccess', _161 => _161.length]), () => ( 0));
3959
+ const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _148 => _148.metadata, 'optionalAccess', _149 => _149.roundtrips, 'optionalAccess', _150 => _150.length]), () => ( 0));
4060
3960
  if (toolRoundtrips > maxToolRoundtrips) {
4061
3961
  updateMessage({
4062
3962
  status: {
@@ -4155,7 +4055,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4155
4055
  // TODO lift utterance state to thread runtime
4156
4056
 
4157
4057
  speak(messageId) {
4158
- const adapter = _optionalChain([this, 'access', _162 => _162.options, 'access', _163 => _163.adapters, 'optionalAccess', _164 => _164.speech]);
4058
+ const adapter = _optionalChain([this, 'access', _151 => _151.options, 'access', _152 => _152.adapters, 'optionalAccess', _153 => _153.speech]);
4159
4059
  if (!adapter) throw new Error("Speech adapter not configured");
4160
4060
  const { message } = this.repository.getMessage(messageId);
4161
4061
  if (this._utterance) {
@@ -4172,7 +4072,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4172
4072
  return this._utterance;
4173
4073
  }
4174
4074
  submitFeedback({ messageId, type }) {
4175
- const adapter = _optionalChain([this, 'access', _165 => _165.options, 'access', _166 => _166.adapters, 'optionalAccess', _167 => _167.feedback]);
4075
+ const adapter = _optionalChain([this, 'access', _154 => _154.options, 'access', _155 => _155.adapters, 'optionalAccess', _156 => _156.feedback]);
4176
4076
  if (!adapter) throw new Error("Feedback adapter not configured");
4177
4077
  const { message } = this.repository.getMessage(messageId);
4178
4078
  adapter.submit({ message, type });
@@ -4219,7 +4119,7 @@ var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
4219
4119
  const messages = fromCoreMessages(initialMessages);
4220
4120
  this.thread.import({
4221
4121
  messages: messages.map((m, idx) => ({
4222
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _168 => _168[idx - 1], 'optionalAccess', _169 => _169.id]), () => ( null)),
4122
+ parentId: _nullishCoalesce(_optionalChain([messages, 'access', _157 => _157[idx - 1], 'optionalAccess', _158 => _158.id]), () => ( null)),
4223
4123
  message: m
4224
4124
  }))
4225
4125
  });
@@ -4255,8 +4155,8 @@ var getExternalStoreMessage = (message) => {
4255
4155
  };
4256
4156
 
4257
4157
  // src/runtimes/external-store/ThreadMessageConverter.ts
4258
- var ThreadMessageConverter = (_class10 = class {constructor() { _class10.prototype.__init24.call(this); }
4259
- __init24() {this.cache = /* @__PURE__ */ new WeakMap()}
4158
+ var ThreadMessageConverter = (_class10 = class {constructor() { _class10.prototype.__init25.call(this); }
4159
+ __init25() {this.cache = /* @__PURE__ */ new WeakMap()}
4260
4160
  convertMessages(messages, converter) {
4261
4161
  return messages.map((m, idx) => {
4262
4162
  const cached = this.cache.get(m);
@@ -4352,17 +4252,17 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
4352
4252
 
4353
4253
  // src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx
4354
4254
  var hasUpcomingMessage = (isRunning, messages) => {
4355
- return isRunning && _optionalChain([messages, 'access', _170 => _170[messages.length - 1], 'optionalAccess', _171 => _171.role]) !== "assistant";
4255
+ return isRunning && _optionalChain([messages, 'access', _159 => _159[messages.length - 1], 'optionalAccess', _160 => _160.role]) !== "assistant";
4356
4256
  };
4357
4257
  var ExternalStoreThreadRuntimeCore = (_class11 = class {
4358
- constructor(configProvider, store) {;_class11.prototype.__init25.call(this);_class11.prototype.__init26.call(this);_class11.prototype.__init27.call(this);_class11.prototype.__init28.call(this);_class11.prototype.__init29.call(this);_class11.prototype.__init30.call(this);_class11.prototype.__init31.call(this);
4258
+ constructor(configProvider, store) {;_class11.prototype.__init26.call(this);_class11.prototype.__init27.call(this);_class11.prototype.__init28.call(this);_class11.prototype.__init29.call(this);_class11.prototype.__init30.call(this);_class11.prototype.__init31.call(this);_class11.prototype.__init32.call(this);
4359
4259
  this.configProvider = configProvider;
4360
4260
  this.store = store;
4361
4261
  }
4362
- __init25() {this._subscriptions = /* @__PURE__ */ new Set()}
4363
- __init26() {this.repository = new MessageRepository()}
4364
- __init27() {this.assistantOptimisticId = null}
4365
- __init28() {this._capabilities = {
4262
+ __init26() {this._subscriptions = /* @__PURE__ */ new Set()}
4263
+ __init27() {this.repository = new MessageRepository()}
4264
+ __init28() {this.assistantOptimisticId = null}
4265
+ __init29() {this._capabilities = {
4366
4266
  switchToBranch: false,
4367
4267
  edit: false,
4368
4268
  reload: false,
@@ -4378,9 +4278,9 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4378
4278
 
4379
4279
 
4380
4280
 
4381
- __init29() {this.converter = new ThreadMessageConverter()}
4281
+ __init30() {this.converter = new ThreadMessageConverter()}
4382
4282
 
4383
- __init30() {this.composer = new BaseThreadComposerRuntimeCore(this)}
4283
+ __init31() {this.composer = new BaseThreadComposerRuntimeCore(this)}
4384
4284
  get store() {
4385
4285
  return this._store;
4386
4286
  }
@@ -4397,12 +4297,12 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4397
4297
  reload: this._store.onReload !== void 0,
4398
4298
  cancel: this._store.onCancel !== void 0,
4399
4299
  speak: this._store.onSpeak !== void 0,
4400
- unstable_copy: _optionalChain([this, 'access', _175 => _175._store, 'access', _176 => _176.unstable_capabilities, 'optionalAccess', _177 => _177.copy]) !== false,
4300
+ unstable_copy: _optionalChain([this, 'access', _164 => _164._store, 'access', _165 => _165.unstable_capabilities, 'optionalAccess', _166 => _166.copy]) !== false,
4401
4301
  // default true
4402
- attachments: !!_optionalChain([this, 'access', _178 => _178.store, 'access', _179 => _179.adapters, 'optionalAccess', _180 => _180.attachments]),
4403
- feedback: !!_optionalChain([this, 'access', _181 => _181.store, 'access', _182 => _182.adapters, 'optionalAccess', _183 => _183.feedback])
4302
+ attachments: !!_optionalChain([this, 'access', _167 => _167.store, 'access', _168 => _168.adapters, 'optionalAccess', _169 => _169.attachments]),
4303
+ feedback: !!_optionalChain([this, 'access', _170 => _170.store, 'access', _171 => _171.adapters, 'optionalAccess', _172 => _172.feedback])
4404
4304
  };
4405
- this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _184 => _184._store, 'access', _185 => _185.adapters, 'optionalAccess', _186 => _186.attachments]));
4305
+ this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _173 => _173._store, 'access', _174 => _174.adapters, 'optionalAccess', _175 => _175.attachments]));
4406
4306
  if (oldStore) {
4407
4307
  if (oldStore.convertMessage !== store.convertMessage) {
4408
4308
  this.converter = new ThreadMessageConverter();
@@ -4428,7 +4328,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4428
4328
  for (let i = 0; i < messages.length; i++) {
4429
4329
  const message = messages[i];
4430
4330
  const parent = messages[i - 1];
4431
- this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _187 => _187.id]), () => ( null)), message);
4331
+ this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _176 => _176.id]), () => ( null)), message);
4432
4332
  }
4433
4333
  if (this.assistantOptimisticId) {
4434
4334
  this.repository.deleteMessage(this.assistantOptimisticId);
@@ -4436,7 +4336,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4436
4336
  }
4437
4337
  if (hasUpcomingMessage(isRunning, messages)) {
4438
4338
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
4439
- _nullishCoalesce(_optionalChain([messages, 'access', _188 => _188.at, 'call', _189 => _189(-1), 'optionalAccess', _190 => _190.id]), () => ( null)),
4339
+ _nullishCoalesce(_optionalChain([messages, 'access', _177 => _177.at, 'call', _178 => _178(-1), 'optionalAccess', _179 => _179.id]), () => ( null)),
4440
4340
  {
4441
4341
  role: "assistant",
4442
4342
  content: []
@@ -4444,7 +4344,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4444
4344
  );
4445
4345
  }
4446
4346
  this.repository.resetHead(
4447
- _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _191 => _191.at, 'call', _192 => _192(-1), 'optionalAccess', _193 => _193.id]))), () => ( null))
4347
+ _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _180 => _180.at, 'call', _181 => _181(-1), 'optionalAccess', _182 => _182.id]))), () => ( null))
4448
4348
  );
4449
4349
  this.messages = this.repository.getMessages();
4450
4350
  this.notifySubscribers();
@@ -4465,7 +4365,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4465
4365
  this.updateMessages(this.repository.getMessages());
4466
4366
  }
4467
4367
  async append(message) {
4468
- if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _194 => _194.messages, 'access', _195 => _195.at, 'call', _196 => _196(-1), 'optionalAccess', _197 => _197.id]), () => ( null)))) {
4368
+ if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _183 => _183.messages, 'access', _184 => _184.at, 'call', _185 => _185(-1), 'optionalAccess', _186 => _186.id]), () => ( null)))) {
4469
4369
  if (!this._store.onEdit)
4470
4370
  throw new Error("Runtime does not support editing messages.");
4471
4371
  await this._store.onEdit(message);
@@ -4488,7 +4388,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4488
4388
  }
4489
4389
  let messages = this.repository.getMessages();
4490
4390
  const previousMessage = messages[messages.length - 1];
4491
- if (_optionalChain([previousMessage, 'optionalAccess', _198 => _198.role]) === "user" && previousMessage.id === _optionalChain([messages, 'access', _199 => _199.at, 'call', _200 => _200(-1), 'optionalAccess', _201 => _201.id])) {
4391
+ if (_optionalChain([previousMessage, 'optionalAccess', _187 => _187.role]) === "user" && previousMessage.id === _optionalChain([messages, 'access', _188 => _188.at, 'call', _189 => _189(-1), 'optionalAccess', _190 => _190.id])) {
4492
4392
  this.repository.deleteMessage(previousMessage.id);
4493
4393
  if (!this.composer.text.trim()) {
4494
4394
  this.composer.setText(getThreadMessageText(previousMessage));
@@ -4513,7 +4413,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4513
4413
  return this._store.onSpeak(message);
4514
4414
  }
4515
4415
  submitFeedback({ messageId, type }) {
4516
- const adapter = _optionalChain([this, 'access', _202 => _202._store, 'access', _203 => _203.adapters, 'optionalAccess', _204 => _204.feedback]);
4416
+ const adapter = _optionalChain([this, 'access', _191 => _191._store, 'access', _192 => _192.adapters, 'optionalAccess', _193 => _193.feedback]);
4517
4417
  if (!adapter) throw new Error("Feedback adapter not configured");
4518
4418
  const { message } = this.repository.getMessage(messageId);
4519
4419
  adapter.submit({ message, type });
@@ -4522,8 +4422,8 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4522
4422
  this._subscriptions.add(callback);
4523
4423
  return () => this._subscriptions.delete(callback);
4524
4424
  }
4525
- __init31() {this.updateMessages = (messages) => {
4526
- _optionalChain([this, 'access', _205 => _205._store, 'access', _206 => _206.setMessages, 'optionalCall', _207 => _207(
4425
+ __init32() {this.updateMessages = (messages) => {
4426
+ _optionalChain([this, 'access', _194 => _194._store, 'access', _195 => _195.setMessages, 'optionalCall', _196 => _196(
4527
4427
  messages.flatMap(getExternalStoreMessage).filter((m) => m != null)
4528
4428
  )]);
4529
4429
  }}
@@ -4619,19 +4519,18 @@ var joinExternalMessages = (messages) => {
4619
4519
  );
4620
4520
  }
4621
4521
  } else {
4622
- const content = output.content;
4623
4522
  const role = output.role;
4624
4523
  switch (role) {
4625
4524
  case "system":
4626
4525
  case "user":
4627
- return { role, content };
4526
+ return output;
4628
4527
  case "assistant":
4629
4528
  if (assistantMessage.content.length === 0) {
4630
4529
  assistantMessage.id = output.id;
4631
4530
  assistantMessage.createdAt ??= output.createdAt;
4632
4531
  assistantMessage.status ??= output.status;
4633
4532
  }
4634
- assistantMessage.content.push(...content);
4533
+ assistantMessage.content.push(...output.content);
4635
4534
  break;
4636
4535
  default: {
4637
4536
  const unsupportedRole = role;
@@ -4814,8 +4713,8 @@ var WebSpeechSynthesisAdapter = class {
4814
4713
  };
4815
4714
 
4816
4715
  // src/runtimes/attachment/SimpleImageAttachmentAdapter.ts
4817
- var SimpleImageAttachmentAdapter = (_class12 = class {constructor() { _class12.prototype.__init32.call(this); }
4818
- __init32() {this.accept = "image/*"}
4716
+ var SimpleImageAttachmentAdapter = (_class12 = class {constructor() { _class12.prototype.__init33.call(this); }
4717
+ __init33() {this.accept = "image/*"}
4819
4718
  async add(state) {
4820
4719
  return {
4821
4720
  id: state.file.name,
@@ -4846,8 +4745,8 @@ var getFileDataURL = (file) => new Promise((resolve, reject) => {
4846
4745
  });
4847
4746
 
4848
4747
  // src/runtimes/attachment/SimpleTextAttachmentAdapter.ts
4849
- var SimpleTextAttachmentAdapter = (_class13 = class {constructor() { _class13.prototype.__init33.call(this); }
4850
- __init33() {this.accept = "text/plain,text/html,text/markdown,text/csv,text/xml,text/json,text/css"}
4748
+ var SimpleTextAttachmentAdapter = (_class13 = class {constructor() { _class13.prototype.__init34.call(this); }
4749
+ __init34() {this.accept = "text/plain,text/html,text/markdown,text/csv,text/xml,text/json,text/css"}
4851
4750
  async add(state) {
4852
4751
  return {
4853
4752
  id: state.file.name,
@@ -4965,7 +4864,7 @@ var ThreadConfigProvider = ({
4965
4864
  }) => {
4966
4865
  const hasAssistant = !!useAssistantRuntime({ optional: true });
4967
4866
  const configProvider = config && Object.keys(_nullishCoalesce(config, () => ( {}))).length > 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
4968
- if (!_optionalChain([config, 'optionalAccess', _208 => _208.runtime])) return configProvider;
4867
+ if (!_optionalChain([config, 'optionalAccess', _197 => _197.runtime])) return configProvider;
4969
4868
  if (hasAssistant) {
4970
4869
  throw new Error(
4971
4870
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -5293,7 +5192,7 @@ var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: comp
5293
5192
  {
5294
5193
  components: {
5295
5194
  ...componentsProp,
5296
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _209 => _209.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5195
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _198 => _198.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5297
5196
  tools: toolsComponents
5298
5197
  }
5299
5198
  }
@@ -5436,7 +5335,7 @@ var ComposerAttachments = ({ components }) => {
5436
5335
  {
5437
5336
  components: {
5438
5337
  ...components,
5439
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _210 => _210.Attachment]), () => ( composer_attachment_default))
5338
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _199 => _199.Attachment]), () => ( composer_attachment_default))
5440
5339
  }
5441
5340
  }
5442
5341
  ) });
@@ -5568,7 +5467,7 @@ var ThreadWelcomeSuggestion = ({
5568
5467
  };
5569
5468
  var ThreadWelcomeSuggestions = () => {
5570
5469
  const { welcome: { suggestions } = {} } = useThreadConfig();
5571
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _211 => _211.map, 'call', _212 => _212((suggestion, idx) => {
5470
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _200 => _200.map, 'call', _201 => _201((suggestion, idx) => {
5572
5471
  const key = `${suggestion.prompt}-${idx}`;
5573
5472
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
5574
5473
  })]) });
@@ -5667,7 +5566,7 @@ var UserMessageContent = _react.forwardRef.call(void 0,
5667
5566
  {
5668
5567
  components: {
5669
5568
  ...components,
5670
- Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _213 => _213.Text]), () => ( content_part_default.Text))
5569
+ Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _202 => _202.Text]), () => ( content_part_default.Text))
5671
5570
  }
5672
5571
  }
5673
5572
  ) });
@@ -5685,7 +5584,7 @@ var UserMessageAttachments = ({
5685
5584
  {
5686
5585
  components: {
5687
5586
  ...components,
5688
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _214 => _214.Attachment]), () => ( user_message_attachment_default))
5587
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _203 => _203.Attachment]), () => ( user_message_attachment_default))
5689
5588
  }
5690
5589
  }
5691
5590
  ) }) });
@@ -5786,10 +5685,10 @@ var ThreadMessages = ({ components, ...rest }) => {
5786
5685
  thread_exports.Messages,
5787
5686
  {
5788
5687
  components: {
5789
- UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _215 => _215.UserMessage]), () => ( user_message_default)),
5790
- EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _216 => _216.EditComposer]), () => ( edit_composer_default)),
5791
- AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _217 => _217.AssistantMessage]), () => ( assistant_message_default)),
5792
- SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _218 => _218.SystemMessage]), () => ( SystemMessage))
5688
+ UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _204 => _204.UserMessage]), () => ( user_message_default)),
5689
+ EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _205 => _205.EditComposer]), () => ( edit_composer_default)),
5690
+ AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _206 => _206.AssistantMessage]), () => ( assistant_message_default)),
5691
+ SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _207 => _207.SystemMessage]), () => ( SystemMessage))
5793
5692
  },
5794
5693
  ...rest
5795
5694
  }
@@ -6008,5 +5907,6 @@ var assistant_modal_default = Object.assign(AssistantModal, exports13);
6008
5907
 
6009
5908
 
6010
5909
 
6011
- exports.ActionBarPrimitive = actionBar_exports; exports.AssistantActionBar = assistant_action_bar_default; exports.AssistantMessage = assistant_message_default; exports.AssistantModal = assistant_modal_default; exports.AssistantModalPrimitive = assistantModal_exports; exports.AssistantRuntimeProvider = AssistantRuntimeProvider; exports.BranchPicker = branch_picker_default; exports.BranchPickerPrimitive = branchPicker_exports; exports.Composer = composer_default; exports.ComposerAttachment = composer_attachment_default; exports.ComposerPrimitive = composer_exports; exports.CompositeAttachmentAdapter = CompositeAttachmentAdapter; exports.ContentPart = content_part_default; exports.ContentPartPrimitive = contentPart_exports; exports.EdgeChatAdapter = EdgeChatAdapter; exports.EditComposer = edit_composer_default; exports.INTERNAL = internal_exports; exports.MessagePrimitive = message_exports; exports.SimpleImageAttachmentAdapter = SimpleImageAttachmentAdapter; exports.SimpleTextAttachmentAdapter = SimpleTextAttachmentAdapter; exports.TextContentPartProvider = TextContentPartProvider; exports.Thread = thread_default; exports.ThreadConfigProvider = ThreadConfigProvider; exports.ThreadPrimitive = thread_exports; exports.ThreadWelcome = thread_welcome_default; exports.UserActionBar = user_action_bar_default; exports.UserMessage = user_message_default; exports.UserMessageAttachment = user_message_attachment_default; exports.WebSpeechSynthesisAdapter = WebSpeechSynthesisAdapter; exports.fromCoreMessage = fromCoreMessage; exports.fromCoreMessages = fromCoreMessages; exports.fromLanguageModelMessages = fromLanguageModelMessages; exports.fromLanguageModelTools = fromLanguageModelTools; exports.getExternalStoreMessage = getExternalStoreMessage; exports.makeAssistantTool = makeAssistantTool; exports.makeAssistantToolUI = makeAssistantToolUI; exports.streamUtils = streamUtils; exports.subscribeToMainThread = subscribeToMainThread; exports.toCoreMessage = _chunk5KIEXJRKjs.toCoreMessage; exports.toCoreMessages = _chunk5KIEXJRKjs.toCoreMessages; exports.toLanguageModelMessages = _chunk5KIEXJRKjs.toLanguageModelMessages; exports.toLanguageModelTools = _chunk5KIEXJRKjs.toLanguageModelTools; exports.useActionBarCopy = useActionBarCopy; exports.useActionBarEdit = useActionBarEdit; exports.useActionBarFeedbackNegative = useActionBarFeedbackNegative; exports.useActionBarFeedbackPositive = useActionBarFeedbackPositive; exports.useActionBarReload = useActionBarReload; exports.useActionBarSpeak = useActionBarSpeak; exports.useActionBarStopSpeaking = useActionBarStopSpeaking; exports.useAppendMessage = useAppendMessage; exports.useAssistantActions = useAssistantActions; exports.useAssistantActionsStore = useAssistantActionsStore; exports.useAssistantContext = useAssistantContext; exports.useAssistantInstructions = useAssistantInstructions; exports.useAssistantRuntime = useAssistantRuntime; exports.useAssistantRuntimeStore = useAssistantRuntimeStore; exports.useAssistantTool = useAssistantTool; exports.useAssistantToolUI = useAssistantToolUI; exports.useBranchPickerCount = useBranchPickerCount; exports.useBranchPickerNext = useBranchPickerNext; exports.useBranchPickerNumber = useBranchPickerNumber; exports.useBranchPickerPrevious = useBranchPickerPrevious; exports.useComposer = useComposer; exports.useComposerAddAttachment = useComposerAddAttachment; exports.useComposerCancel = useComposerCancel; exports.useComposerContext = useComposerContext; exports.useComposerIf = useComposerIf; exports.useComposerSend = useComposerSend; exports.useComposerStore = useComposerStore; exports.useContentPart = useContentPart; exports.useContentPartContext = useContentPartContext; exports.useContentPartDisplay = useContentPartDisplay; exports.useContentPartImage = useContentPartImage; exports.useContentPartStore = useContentPartStore; exports.useContentPartText = useContentPartText; exports.useDangerousInBrowserRuntime = useDangerousInBrowserRuntime; exports.useEdgeRuntime = useEdgeRuntime; exports.useEditComposer = useEditComposer; exports.useEditComposerStore = useEditComposerStore; exports.useExternalMessageConverter = useExternalMessageConverter; exports.useExternalStoreRuntime = useExternalStoreRuntime; exports.useLocalRuntime = useLocalRuntime; exports.useMessage = useMessage; exports.useMessageContext = useMessageContext; exports.useMessageIf = useMessageIf; exports.useMessageStore = useMessageStore; exports.useMessageUtils = useMessageUtils; exports.useMessageUtilsStore = useMessageUtilsStore; exports.useSwitchToNewThread = useSwitchToNewThread; exports.useThread = useThread; exports.useThreadActions = useThreadActions; exports.useThreadActionsStore = useThreadActionsStore; exports.useThreadComposer = useThreadComposer; exports.useThreadComposerStore = useThreadComposerStore; exports.useThreadConfig = useThreadConfig; exports.useThreadContext = useThreadContext; exports.useThreadEmpty = useThreadEmpty; exports.useThreadIf = useThreadIf; exports.useThreadMessages = useThreadMessages; exports.useThreadMessagesStore = useThreadMessagesStore; exports.useThreadRuntime = useThreadRuntime; exports.useThreadRuntimeStore = useThreadRuntimeStore; exports.useThreadScrollToBottom = useThreadScrollToBottom; exports.useThreadStore = useThreadStore; exports.useThreadSuggestion = useThreadSuggestion; exports.useThreadViewport = useThreadViewport; exports.useThreadViewportStore = useThreadViewportStore; exports.useToolUIs = useToolUIs; exports.useToolUIsStore = useToolUIsStore;
5910
+
5911
+ exports.ActionBarPrimitive = actionBar_exports; exports.AssistantActionBar = assistant_action_bar_default; exports.AssistantMessage = assistant_message_default; exports.AssistantModal = assistant_modal_default; exports.AssistantModalPrimitive = assistantModal_exports; exports.AssistantRuntimeProvider = AssistantRuntimeProvider; exports.BranchPicker = branch_picker_default; exports.BranchPickerPrimitive = branchPicker_exports; exports.Composer = composer_default; exports.ComposerAttachment = composer_attachment_default; exports.ComposerPrimitive = composer_exports; exports.CompositeAttachmentAdapter = CompositeAttachmentAdapter; exports.ContentPart = content_part_default; exports.ContentPartPrimitive = contentPart_exports; exports.EdgeChatAdapter = EdgeChatAdapter; exports.EditComposer = edit_composer_default; exports.INTERNAL = internal_exports; exports.MessagePrimitive = message_exports; exports.SimpleImageAttachmentAdapter = SimpleImageAttachmentAdapter; exports.SimpleTextAttachmentAdapter = SimpleTextAttachmentAdapter; exports.TextContentPartProvider = TextContentPartProvider; exports.Thread = thread_default; exports.ThreadConfigProvider = ThreadConfigProvider; exports.ThreadPrimitive = thread_exports; exports.ThreadWelcome = thread_welcome_default; exports.UserActionBar = user_action_bar_default; exports.UserMessage = user_message_default; exports.UserMessageAttachment = user_message_attachment_default; exports.WebSpeechSynthesisAdapter = WebSpeechSynthesisAdapter; exports.fromCoreMessage = fromCoreMessage; exports.fromCoreMessages = fromCoreMessages; exports.fromLanguageModelMessages = fromLanguageModelMessages; exports.fromLanguageModelTools = fromLanguageModelTools; exports.getExternalStoreMessage = getExternalStoreMessage; exports.makeAssistantTool = makeAssistantTool; exports.makeAssistantToolUI = makeAssistantToolUI; exports.streamUtils = streamUtils; exports.subscribeToMainThread = subscribeToMainThread; exports.toCoreMessage = _chunk5KIEXJRKjs.toCoreMessage; exports.toCoreMessages = _chunk5KIEXJRKjs.toCoreMessages; exports.toLanguageModelMessages = _chunk5KIEXJRKjs.toLanguageModelMessages; exports.toLanguageModelTools = _chunk5KIEXJRKjs.toLanguageModelTools; exports.useActionBarCopy = useActionBarCopy; exports.useActionBarEdit = useActionBarEdit; exports.useActionBarFeedbackNegative = useActionBarFeedbackNegative; exports.useActionBarFeedbackPositive = useActionBarFeedbackPositive; exports.useActionBarReload = useActionBarReload; exports.useActionBarSpeak = useActionBarSpeak; exports.useActionBarStopSpeaking = useActionBarStopSpeaking; exports.useAppendMessage = useAppendMessage; exports.useAssistantActions = useAssistantActions; exports.useAssistantActionsStore = useAssistantActionsStore; exports.useAssistantContext = useAssistantContext; exports.useAssistantInstructions = useAssistantInstructions; exports.useAssistantRuntime = useAssistantRuntime; exports.useAssistantRuntimeStore = useAssistantRuntimeStore; exports.useAssistantTool = useAssistantTool; exports.useAssistantToolUI = useAssistantToolUI; exports.useBranchPickerCount = useBranchPickerCount; exports.useBranchPickerNext = useBranchPickerNext; exports.useBranchPickerNumber = useBranchPickerNumber; exports.useBranchPickerPrevious = useBranchPickerPrevious; exports.useComposer = useComposer; exports.useComposerAddAttachment = useComposerAddAttachment; exports.useComposerCancel = useComposerCancel; exports.useComposerContext = useComposerContext; exports.useComposerIf = useComposerIf; exports.useComposerSend = useComposerSend; exports.useComposerStore = useComposerStore; exports.useContentPart = useContentPart; exports.useContentPartContext = useContentPartContext; exports.useContentPartDisplay = useContentPartDisplay; exports.useContentPartImage = useContentPartImage; exports.useContentPartStore = useContentPartStore; exports.useContentPartText = useContentPartText; exports.useDangerousInBrowserRuntime = useDangerousInBrowserRuntime; exports.useEdgeRuntime = useEdgeRuntime; exports.useEditComposer = useEditComposer; exports.useEditComposerStore = useEditComposerStore; exports.useExternalMessageConverter = useExternalMessageConverter; exports.useExternalStoreRuntime = useExternalStoreRuntime; exports.useLocalRuntime = useLocalRuntime; exports.useMessage = useMessage; exports.useMessageContext = useMessageContext; exports.useMessageIf = useMessageIf; exports.useMessageRuntime = useMessageRuntime; exports.useMessageStore = useMessageStore; exports.useMessageUtils = useMessageUtils; exports.useMessageUtilsStore = useMessageUtilsStore; exports.useSwitchToNewThread = useSwitchToNewThread; exports.useThread = useThread; exports.useThreadActions = useThreadActions; exports.useThreadActionsStore = useThreadActionsStore; exports.useThreadComposer = useThreadComposer; exports.useThreadComposerStore = useThreadComposerStore; exports.useThreadConfig = useThreadConfig; exports.useThreadContext = useThreadContext; exports.useThreadEmpty = useThreadEmpty; exports.useThreadIf = useThreadIf; exports.useThreadMessages = useThreadMessages; exports.useThreadMessagesStore = useThreadMessagesStore; exports.useThreadRuntime = useThreadRuntime; exports.useThreadRuntimeStore = useThreadRuntimeStore; exports.useThreadScrollToBottom = useThreadScrollToBottom; exports.useThreadStore = useThreadStore; exports.useThreadSuggestion = useThreadSuggestion; exports.useThreadViewport = useThreadViewport; exports.useThreadViewportStore = useThreadViewportStore; exports.useToolUIs = useToolUIs; exports.useToolUIsStore = useToolUIsStore;
6012
5912
  //# sourceMappingURL=index.js.map