@assistant-ui/react 0.5.66 → 0.5.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8; var _class9; var _class10; var _class11; var _class12; var _class13;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8; var _class9; var _class10; var _class11; var _class12; var _class13; var _class14; var _class15; var _class16; var _class17;
2
2
 
3
3
 
4
4
 
@@ -144,7 +144,9 @@ var { useThread, useThreadStore } = createContextStoreHook(
144
144
  useThreadContext,
145
145
  "useThread"
146
146
  );
147
- var { useThreadMessages, useThreadMessagesStore } = createContextStoreHook(useThreadContext, "useThreadMessages");
147
+ var messages = createContextStoreHook(useThreadContext, "useThreadMessages");
148
+ var useThreadMessages = messages.useThreadMessages;
149
+ var useThreadMessagesStore = messages.useThreadMessagesStore;
148
150
  var {
149
151
  useComposer: useThreadComposer,
150
152
  useComposerStore: useThreadComposerStore
@@ -154,56 +156,6 @@ var {
154
156
  useViewportStore: useThreadViewportStore
155
157
  } = createContextStoreHook(useThreadContext, "useViewport");
156
158
 
157
- // src/context/stores/ThreadComposer.ts
158
-
159
- var makeThreadComposerStore = (runtime) => {
160
- const focusListeners = /* @__PURE__ */ new Set();
161
- return _zustand.create.call(void 0, )((_, get) => {
162
- return {
163
- type: "thread",
164
- get value() {
165
- return get().text;
166
- },
167
- setValue(value) {
168
- get().setText(value);
169
- },
170
- ...runtime.getState(),
171
- canCancel: false,
172
- // "TODO",
173
- isEditing: true,
174
- addAttachment: (file) => {
175
- runtime.addAttachment(file);
176
- },
177
- removeAttachment: (attachmentId) => {
178
- runtime.removeAttachment(attachmentId);
179
- },
180
- reset: () => {
181
- runtime.reset();
182
- },
183
- setText: (text) => {
184
- runtime.setText(text);
185
- },
186
- send: () => {
187
- runtime.send();
188
- },
189
- cancel: () => {
190
- runtime.cancel();
191
- },
192
- focus: () => {
193
- for (const listener of focusListeners) {
194
- listener();
195
- }
196
- },
197
- onFocus: (listener) => {
198
- focusListeners.add(listener);
199
- return () => {
200
- focusListeners.delete(listener);
201
- };
202
- }
203
- };
204
- });
205
- };
206
-
207
159
  // src/context/stores/ThreadViewport.tsx
208
160
 
209
161
  var makeThreadViewportStore = () => {
@@ -258,9 +210,9 @@ var useThreadMessagesStore2 = (runtime) => {
258
210
  return store;
259
211
  };
260
212
  var useThreadComposerStore2 = (runtime) => {
261
- const [store] = _react.useState.call(void 0, () => makeThreadComposerStore(runtime));
213
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
262
214
  _react.useEffect.call(void 0, () => {
263
- const updateState = () => writableStore(store).setState(runtime.getState());
215
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
264
216
  updateState();
265
217
  return runtime.subscribe(updateState);
266
218
  }, [runtime, store]);
@@ -331,11 +283,47 @@ var useContentPartContext = createContextHook(
331
283
  ContentPartContext,
332
284
  "a component passed to <MessagePrimitive.Content components={...}>"
333
285
  );
286
+ function useContentPartRuntime(options) {
287
+ const context = useContentPartContext(options);
288
+ if (!context) return null;
289
+ return context.useContentPartRuntime();
290
+ }
334
291
  var { useContentPart, useContentPartStore } = createContextStoreHook(
335
292
  useContentPartContext,
336
293
  "useContentPart"
337
294
  );
338
295
 
296
+ // src/api/ContentPartRuntime.ts
297
+ var ContentPartRuntime = class {
298
+ constructor(contentBinding, messageApi, threadApi) {
299
+ this.contentBinding = contentBinding;
300
+ this.messageApi = messageApi;
301
+ this.threadApi = threadApi;
302
+ }
303
+ getState() {
304
+ return this.contentBinding.getState();
305
+ }
306
+ addToolResult(result) {
307
+ const message = this.messageApi.getState();
308
+ if (!message) throw new Error("Message is not available");
309
+ const state = this.contentBinding.getState();
310
+ if (!state) throw new Error("Content part is not available");
311
+ if (state.type !== "tool-call")
312
+ throw new Error("Tried to add tool result to non-tool content part");
313
+ const toolName = state.toolName;
314
+ const toolCallId = state.toolCallId;
315
+ this.threadApi.getState().addToolResult({
316
+ messageId: message.id,
317
+ toolName,
318
+ toolCallId,
319
+ result
320
+ });
321
+ }
322
+ subscribe(callback) {
323
+ return this.contentBinding.subscribe(callback);
324
+ }
325
+ };
326
+
339
327
  // src/context/providers/TextContentPartProvider.tsx
340
328
 
341
329
  var COMPLETE_STATUS = {
@@ -346,18 +334,22 @@ var RUNNING_STATUS = {
346
334
  };
347
335
  var TextContentPartProvider = ({ children, text, isRunning }) => {
348
336
  const [context] = _react.useState.call(void 0, () => {
337
+ const useContentPartRuntime2 = _zustand.create.call(void 0,
338
+ // TODO
339
+ () => new ContentPartRuntime(null, null, null)
340
+ );
349
341
  const useContentPart2 = _zustand.create.call(void 0, () => ({
350
342
  status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,
351
- part: { type: "text", text }
343
+ part: { type: "text", text },
344
+ type: "text",
345
+ text
352
346
  }));
353
- return {
354
- useContentPart: useContentPart2
355
- };
347
+ return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
356
348
  });
357
349
  _react.useEffect.call(void 0, () => {
358
350
  const state = context.useContentPart.getState();
359
- const textUpdated = state.part.text !== text;
360
- const targetTextPart = textUpdated ? { type: "text", text } : state.part;
351
+ const textUpdated = state.text !== text;
352
+ const targetTextPart = textUpdated ? { type: "text", text } : state;
361
353
  const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;
362
354
  const statusUpdated = state.status !== targetStatus;
363
355
  if (!textUpdated && !statusUpdated) return;
@@ -400,20 +392,25 @@ var { useEditComposer, useEditComposerStore } = createContextStoreHook(
400
392
  // src/context/react/ComposerContext.ts
401
393
 
402
394
  var useComposerContext = () => {
403
- const { useComposer: useComposer2 } = useThreadContext();
395
+ const { useComposer: useThreadComposer2 } = useThreadContext();
404
396
  const { useEditComposer: useEditComposer2 } = _nullishCoalesce(useMessageContext({ optional: true }), () => ( {}));
405
397
  return _react.useMemo.call(void 0,
406
398
  () => ({
407
- useComposer: _nullishCoalesce(useEditComposer2, () => ( useComposer2)),
399
+ useComposer: _nullishCoalesce(useEditComposer2, () => ( useThreadComposer2)),
408
400
  type: useEditComposer2 ? "edit" : "new"
409
401
  }),
410
- [useEditComposer2, useComposer2]
402
+ [useEditComposer2, useThreadComposer2]
411
403
  );
412
404
  };
413
405
  var { useComposer, useComposerStore } = createContextStoreHook(
414
406
  useComposerContext,
415
407
  "useComposer"
416
408
  );
409
+ function useComposerRuntime(options) {
410
+ const messageRuntime = useMessageRuntime({ optional: true });
411
+ const threadRuntime = useThreadRuntime(options);
412
+ return messageRuntime ? messageRuntime.composer : _nullishCoalesce(_optionalChain([threadRuntime, 'optionalAccess', _5 => _5.composer]), () => ( null));
413
+ }
417
414
 
418
415
  // src/hooks/useAppendMessage.tsx
419
416
 
@@ -462,7 +459,7 @@ var useAssistantTool = (tool) => {
462
459
  const unsub2 = render ? toolUIsStore.getState().setToolUI(toolName, render) : void 0;
463
460
  return () => {
464
461
  unsub1();
465
- _optionalChain([unsub2, 'optionalCall', _5 => _5()]);
462
+ _optionalChain([unsub2, 'optionalCall', _6 => _6()]);
466
463
  };
467
464
  }, [assistantRuntime, toolUIsStore, tool]);
468
465
  };
@@ -579,12 +576,11 @@ var useActionBarCopy = ({
579
576
  // src/primitive-hooks/actionBar/useActionBarEdit.tsx
580
577
 
581
578
  var useActionBarEdit = () => {
582
- const editComposerStore = useEditComposerStore();
583
- const disabled = useEditComposer((c) => c.isEditing);
579
+ const composerRuntime = useComposerRuntime();
580
+ const disabled = useComposer((c) => c.isEditing);
584
581
  const callback = _react.useCallback.call(void 0, () => {
585
- const { edit } = editComposerStore.getState();
586
- edit();
587
- }, [editComposerStore]);
582
+ composerRuntime.beginEdit();
583
+ }, [composerRuntime]);
588
584
  if (disabled) return null;
589
585
  return callback;
590
586
  };
@@ -594,7 +590,7 @@ var useActionBarEdit = () => {
594
590
  var useActionBarReload = () => {
595
591
  const messageStore = useMessageStore();
596
592
  const threadStore = useThreadStore();
597
- const threadRuntime = useThreadRuntime();
593
+ const messageRuntime = useMessageRuntime();
598
594
  const threadComposerStore = useThreadComposerStore();
599
595
  const threadViewportStore = useThreadViewportStore();
600
596
  const disabled = useCombinedStore(
@@ -602,11 +598,10 @@ var useActionBarReload = () => {
602
598
  (t, m) => t.isRunning || t.isDisabled || m.role !== "assistant"
603
599
  );
604
600
  const callback = _react.useCallback.call(void 0, () => {
605
- const { parentId } = messageStore.getState();
606
- threadRuntime.startRun(parentId);
601
+ messageRuntime.reload();
607
602
  threadViewportStore.getState().scrollToBottom();
608
603
  threadComposerStore.getState().focus();
609
- }, [threadRuntime, threadComposerStore, threadViewportStore, messageStore]);
604
+ }, [messageRuntime, threadComposerStore, threadViewportStore]);
610
605
  if (disabled) return null;
611
606
  return callback;
612
607
  };
@@ -616,19 +611,18 @@ var useActionBarReload = () => {
616
611
  var useActionBarSpeak = () => {
617
612
  const messageStore = useMessageStore();
618
613
  const editComposerStore = useEditComposerStore();
619
- const threadRuntime = useThreadRuntime();
614
+ const messageRunime = useMessageRuntime();
620
615
  const messageUtilsStore = useMessageUtilsStore();
621
616
  const hasSpeakableContent = useCombinedStore(
622
617
  [messageStore, editComposerStore],
623
- ({ message }, c) => {
618
+ (message, c) => {
624
619
  return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
625
620
  }
626
621
  );
627
622
  const callback = _react.useCallback.call(void 0, async () => {
628
- const { message } = messageStore.getState();
629
- const utt = threadRuntime.speak(message.id);
623
+ const utt = messageRunime.speak();
630
624
  messageUtilsStore.getState().addUtterance(utt);
631
- }, [threadRuntime, messageStore, messageUtilsStore]);
625
+ }, [messageRunime, messageUtilsStore]);
632
626
  if (!hasSpeakableContent) return null;
633
627
  return callback;
634
628
  };
@@ -648,32 +642,28 @@ var useActionBarStopSpeaking = () => {
648
642
  // src/primitive-hooks/actionBar/useActionBarFeedbackPositive.tsx
649
643
 
650
644
  var useActionBarFeedbackPositive = () => {
651
- const threadRuntime = useThreadRuntime();
652
- const messageStore = useMessageStore();
645
+ const messageRuntime = useMessageRuntime();
653
646
  const messageUtilsStore = useMessageUtilsStore();
654
647
  const callback = _react.useCallback.call(void 0, () => {
655
- threadRuntime.submitFeedback({
656
- messageId: messageStore.getState().id,
648
+ messageRuntime.submitFeedback({
657
649
  type: "positive"
658
650
  });
659
651
  messageUtilsStore.getState().setSubmittedFeedback("positive");
660
- }, [messageStore, messageUtilsStore, threadRuntime]);
652
+ }, [messageUtilsStore, messageRuntime]);
661
653
  return callback;
662
654
  };
663
655
 
664
656
  // src/primitive-hooks/actionBar/useActionBarFeedbackNegative.tsx
665
657
 
666
658
  var useActionBarFeedbackNegative = () => {
667
- const threadRuntime = useThreadRuntime();
668
- const messageStore = useMessageStore();
659
+ const messageRuntime = useMessageRuntime();
669
660
  const messageUtilsStore = useMessageUtilsStore();
670
661
  const callback = _react.useCallback.call(void 0, () => {
671
- threadRuntime.submitFeedback({
672
- messageId: messageStore.getState().id,
662
+ messageRuntime.submitFeedback({
673
663
  type: "negative"
674
664
  });
675
665
  messageUtilsStore.getState().setSubmittedFeedback("negative");
676
- }, [messageStore, messageUtilsStore, threadRuntime]);
666
+ }, [messageUtilsStore, messageRuntime]);
677
667
  return callback;
678
668
  };
679
669
 
@@ -782,7 +772,7 @@ var useComposerAddAttachment = () => {
782
772
  input.accept = attachmentAccept;
783
773
  }
784
774
  input.onchange = (e) => {
785
- const file = _optionalChain([e, 'access', _6 => _6.target, 'access', _7 => _7.files, 'optionalAccess', _8 => _8[0]]);
775
+ const file = _optionalChain([e, 'access', _7 => _7.target, 'access', _8 => _8.files, 'optionalAccess', _9 => _9[0]]);
786
776
  if (!file) return;
787
777
  addAttachment(file);
788
778
  };
@@ -795,7 +785,7 @@ var useComposerAddAttachment = () => {
795
785
  // src/primitive-hooks/contentPart/useContentPartDisplay.tsx
796
786
  var useContentPartDisplay = () => {
797
787
  const display = useContentPart((c) => {
798
- if (c.part.type !== "ui")
788
+ if (c.type !== "ui")
799
789
  throw new Error(
800
790
  "This component can only be used inside ui content parts."
801
791
  );
@@ -807,7 +797,7 @@ var useContentPartDisplay = () => {
807
797
  // src/primitive-hooks/contentPart/useContentPartImage.tsx
808
798
  var useContentPartImage = () => {
809
799
  const image = useContentPart((c) => {
810
- if (c.part.type !== "image")
800
+ if (c.type !== "image")
811
801
  throw new Error(
812
802
  "ContentPartImage can only be used inside image content parts."
813
803
  );
@@ -819,7 +809,7 @@ var useContentPartImage = () => {
819
809
  // src/primitive-hooks/contentPart/useContentPartText.tsx
820
810
  var useContentPartText = () => {
821
811
  const text = useContentPart((c) => {
822
- if (c.part.type !== "text")
812
+ if (c.type !== "text")
823
813
  throw new Error(
824
814
  "ContentPartText can only be used inside text content parts."
825
815
  );
@@ -857,20 +847,15 @@ var useMessageIf = (props) => {
857
847
 
858
848
  // src/primitive-hooks/thread/useThreadIf.tsx
859
849
  var useThreadIf = (props) => {
860
- const threadStore = useThreadStore();
861
- const threadMessagesStore = useThreadMessagesStore();
862
- return useCombinedStore(
863
- [threadStore, threadMessagesStore],
864
- (thread, messages) => {
865
- if (props.empty === true && messages.length !== 0) return false;
866
- if (props.empty === false && messages.length === 0) return false;
867
- if (props.running === true && !thread.isRunning) return false;
868
- if (props.running === false && thread.isRunning) return false;
869
- if (props.disabled === true && thread.isDisabled) return false;
870
- if (props.disabled === false && thread.isDisabled) return false;
871
- return true;
872
- }
873
- );
850
+ return useThread((thread) => {
851
+ if (props.empty === true && thread.messages.length !== 0) return false;
852
+ if (props.empty === false && thread.messages.length === 0) return false;
853
+ if (props.running === true && !thread.isRunning) return false;
854
+ if (props.running === false && thread.isRunning) return false;
855
+ if (props.disabled === true && thread.isDisabled) return false;
856
+ if (props.disabled === false && thread.isDisabled) return false;
857
+ return true;
858
+ });
874
859
  };
875
860
 
876
861
  // src/primitive-hooks/thread/useThreadEmpty.tsx
@@ -993,7 +978,7 @@ var ActionBarPrimitiveCopy = _react.forwardRef.call(void 0, ({ copiedDuration, o
993
978
  ref: forwardedRef,
994
979
  disabled: disabled || !callback,
995
980
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
996
- _optionalChain([callback, 'optionalCall', _9 => _9()]);
981
+ _optionalChain([callback, 'optionalCall', _10 => _10()]);
997
982
  })
998
983
  }
999
984
  );
@@ -1025,7 +1010,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
1025
1010
  ref: forwardedRef,
1026
1011
  disabled: primitiveProps.disabled || !callback,
1027
1012
  onClick: _primitive.composeEventHandlers.call(void 0, primitiveProps.onClick, () => {
1028
- _optionalChain([callback, 'optionalCall', _10 => _10()]);
1013
+ _optionalChain([callback, 'optionalCall', _11 => _11()]);
1029
1014
  })
1030
1015
  }
1031
1016
  );
@@ -1074,7 +1059,7 @@ var ActionBarPrimitiveStopSpeaking = _react.forwardRef.call(void 0, (props, ref)
1074
1059
  ...props,
1075
1060
  ref,
1076
1061
  onClick: _primitive.composeEventHandlers.call(void 0, props.onClick, () => {
1077
- _optionalChain([callback, 'optionalCall', _11 => _11()]);
1062
+ _optionalChain([callback, 'optionalCall', _12 => _12()]);
1078
1063
  })
1079
1064
  }
1080
1065
  );
@@ -1100,7 +1085,7 @@ var ActionBarPrimitiveFeedbackPositive = _react.forwardRef.call(void 0, ({ onCli
1100
1085
  ref: forwardedRef,
1101
1086
  disabled: disabled || !callback,
1102
1087
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
1103
- _optionalChain([callback, 'optionalCall', _12 => _12()]);
1088
+ _optionalChain([callback, 'optionalCall', _13 => _13()]);
1104
1089
  })
1105
1090
  }
1106
1091
  );
@@ -1126,7 +1111,7 @@ var ActionBarPrimitiveFeedbackNegative = _react.forwardRef.call(void 0, ({ onCli
1126
1111
  ref: forwardedRef,
1127
1112
  disabled: disabled || !callback,
1128
1113
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
1129
- _optionalChain([callback, 'optionalCall', _13 => _13()]);
1114
+ _optionalChain([callback, 'optionalCall', _14 => _14()]);
1130
1115
  })
1131
1116
  }
1132
1117
  );
@@ -1381,74 +1366,35 @@ MessagePrimitiveIf.displayName = "MessagePrimitive.If";
1381
1366
  // src/primitives/message/MessageContent.tsx
1382
1367
 
1383
1368
 
1384
- // src/context/providers/ContentPartProvider.tsx
1369
+ // src/context/providers/ContentPartRuntimeProvider.tsx
1385
1370
 
1386
1371
 
1387
1372
 
1388
- var COMPLETE_STATUS2 = {
1389
- type: "complete"
1390
- };
1391
- var toContentPartStatus = (message, partIndex, part) => {
1392
- if (message.role !== "assistant") return COMPLETE_STATUS2;
1393
- const isLastPart = partIndex === Math.max(0, message.content.length - 1);
1394
- if (part.type !== "tool-call") {
1395
- if ("reason" in message.status && message.status.reason === "tool-calls" && isLastPart)
1396
- throw new Error(
1397
- "Encountered unexpected requires-action status. This is likely an internal bug in assistant-ui."
1398
- );
1399
- return isLastPart ? message.status : COMPLETE_STATUS2;
1400
- }
1401
- if (!!part.result) {
1402
- return COMPLETE_STATUS2;
1403
- }
1404
- return message.status;
1405
- };
1406
- var EMPTY_CONTENT = Object.freeze({ type: "text", text: "" });
1407
- var getContentPartState = ({ message }, useContentPart2, partIndex) => {
1408
- let part = message.content[partIndex];
1409
- if (!part) {
1410
- if (message.content.length === 0 && partIndex === 0) {
1411
- part = EMPTY_CONTENT;
1412
- } else {
1413
- return null;
1414
- }
1415
- } else if (message.content.length === 1 && part.type === "text" && part.text.length === 0) {
1416
- part = EMPTY_CONTENT;
1417
- }
1418
- const status = toContentPartStatus(message, partIndex, part);
1419
- const currentState = _optionalChain([useContentPart2, 'optionalAccess', _14 => _14.getState, 'call', _15 => _15()]);
1420
- if (currentState && currentState.part === part && currentState.status === status)
1421
- return null;
1422
- return Object.freeze({ part, status });
1373
+ var useContentPartRuntimeStore = (runtime) => {
1374
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime));
1375
+ _react.useEffect.call(void 0, () => {
1376
+ writableStore(store).setState(runtime, true);
1377
+ }, [runtime, store]);
1378
+ return store;
1423
1379
  };
1424
- var useContentPartContext2 = (partIndex) => {
1425
- const messageStore = useMessageStore();
1426
- const [context] = _react.useState.call(void 0, () => {
1427
- const useContentPart2 = _zustand.create.call(void 0,
1428
- () => getContentPartState(messageStore.getState(), void 0, partIndex)
1429
- );
1430
- return { useContentPart: useContentPart2 };
1431
- });
1380
+ var useContentPartStore2 = (runtime) => {
1381
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
1432
1382
  _react.useEffect.call(void 0, () => {
1433
- const syncContentPart = (message) => {
1434
- const newState = getContentPartState(
1435
- message,
1436
- context.useContentPart,
1437
- partIndex
1438
- );
1439
- if (!newState) return;
1440
- writableStore(context.useContentPart).setState(newState, true);
1441
- };
1442
- syncContentPart(messageStore.getState());
1443
- return messageStore.subscribe(syncContentPart);
1444
- }, [context, messageStore, partIndex]);
1445
- return context;
1383
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
1384
+ updateState();
1385
+ return runtime.subscribe(updateState);
1386
+ }, [runtime, store]);
1387
+ return store;
1446
1388
  };
1447
- var ContentPartProvider = ({
1448
- partIndex,
1389
+ var ContentPartRuntimeProvider = ({
1390
+ runtime,
1449
1391
  children
1450
1392
  }) => {
1451
- const context = useContentPartContext2(partIndex);
1393
+ const useContentPartRuntime2 = useContentPartRuntimeStore(runtime);
1394
+ const useContentPart2 = useContentPartStore2(runtime);
1395
+ const [context] = _react.useState.call(void 0, () => {
1396
+ return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
1397
+ });
1452
1398
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartContext.Provider, { value: context, children });
1453
1399
  };
1454
1400
 
@@ -1493,7 +1439,7 @@ var withSmoothContextProvider = (Component) => {
1493
1439
  };
1494
1440
  function useSmoothContext(options) {
1495
1441
  const context = _react.useContext.call(void 0, SmoothContext);
1496
- if (!_optionalChain([options, 'optionalAccess', _16 => _16.optional]) && !context)
1442
+ if (!_optionalChain([options, 'optionalAccess', _15 => _15.optional]) && !context)
1497
1443
  throw new Error(
1498
1444
  "This component must be used within a SmoothContextProvider."
1499
1445
  );
@@ -1553,9 +1499,7 @@ var SMOOTH_STATUS = Object.freeze({
1553
1499
  type: "running"
1554
1500
  });
1555
1501
  var useSmooth = (state, smooth = false) => {
1556
- const {
1557
- part: { text }
1558
- } = state;
1502
+ const { text } = state;
1559
1503
  const id = useMessage({
1560
1504
  optional: true,
1561
1505
  selector: (m) => m.id
@@ -1567,17 +1511,17 @@ var useSmooth = (state, smooth = false) => {
1567
1511
  setDisplayedText(text2);
1568
1512
  if (smoothStatusStore) {
1569
1513
  writableStore(smoothStatusStore).setState(
1570
- text2 !== state.part.text ? SMOOTH_STATUS : state.status
1514
+ text2 !== state.text ? SMOOTH_STATUS : state.status
1571
1515
  );
1572
1516
  }
1573
1517
  });
1574
1518
  _react.useEffect.call(void 0, () => {
1575
1519
  if (smoothStatusStore) {
1576
1520
  writableStore(smoothStatusStore).setState(
1577
- text !== state.part.text ? SMOOTH_STATUS : state.status
1521
+ text !== state.text ? SMOOTH_STATUS : state.status
1578
1522
  );
1579
1523
  }
1580
- }, [smoothStatusStore, text, displayedText, state.status, state.part.text]);
1524
+ }, [smoothStatusStore, text, displayedText, state.status, state.text]);
1581
1525
  const [animatorRef] = _react.useState.call(void 0,
1582
1526
  new TextStreamAnimator(text, setText)
1583
1527
  );
@@ -1604,6 +1548,8 @@ var useSmooth = (state, smooth = false) => {
1604
1548
  }, [animatorRef]);
1605
1549
  return _react.useMemo.call(void 0,
1606
1550
  () => smooth ? {
1551
+ type: "text",
1552
+ text: displayedText,
1607
1553
  part: { type: "text", text: displayedText },
1608
1554
  status: text === displayedText ? state.status : SMOOTH_STATUS
1609
1555
  } : state,
@@ -1614,10 +1560,7 @@ var useSmooth = (state, smooth = false) => {
1614
1560
  // src/primitives/contentPart/ContentPartText.tsx
1615
1561
 
1616
1562
  var ContentPartPrimitiveText = _react.forwardRef.call(void 0, ({ smooth = true, component: Component = "span", ...rest }, forwardedRef) => {
1617
- const {
1618
- part: { text },
1619
- status
1620
- } = useSmooth(useContentPartText(), smooth);
1563
+ const { text, status } = useSmooth(useContentPartText(), smooth);
1621
1564
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, { "data-status": status.type, ...rest, ref: forwardedRef, children: text });
1622
1565
  });
1623
1566
  ContentPartPrimitiveText.displayName = "ContentPartPrimitive.Text";
@@ -1627,18 +1570,14 @@ ContentPartPrimitiveText.displayName = "ContentPartPrimitive.Text";
1627
1570
 
1628
1571
 
1629
1572
  var ContentPartPrimitiveImage = _react.forwardRef.call(void 0, (props, forwardedRef) => {
1630
- const {
1631
- part: { image }
1632
- } = useContentPartImage();
1573
+ const { image } = useContentPartImage();
1633
1574
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactprimitive.Primitive.img, { src: image, ...props, ref: forwardedRef });
1634
1575
  });
1635
1576
  ContentPartPrimitiveImage.displayName = "ContentPartPrimitive.Image";
1636
1577
 
1637
1578
  // src/primitives/contentPart/ContentPartDisplay.tsx
1638
1579
  var ContentPartPrimitiveDisplay = () => {
1639
- const {
1640
- part: { display }
1641
- } = useContentPartDisplay();
1580
+ const { display } = useContentPartDisplay();
1642
1581
  return _nullishCoalesce(display, () => ( null));
1643
1582
  };
1644
1583
  ContentPartPrimitiveDisplay.displayName = "ContentPartPrimitive.Display";
@@ -1650,143 +1589,511 @@ var ContentPartPrimitiveInProgress = ({ children }) => {
1650
1589
  };
1651
1590
  ContentPartPrimitiveInProgress.displayName = "ContentPartPrimitive.InProgress";
1652
1591
 
1653
- // src/primitives/message/MessageContent.tsx
1654
-
1655
- var ToolUIDisplay = ({
1656
- UI,
1657
- ...props
1658
- }) => {
1659
- const Render = _nullishCoalesce(useToolUIs((s) => s.getToolUI(props.part.toolName)), () => ( UI));
1660
- if (!Render) return null;
1661
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Render, { ...props });
1592
+ // src/api/ComposerRuntime.ts
1593
+ var METHOD_NOT_SUPPORTED = () => {
1594
+ throw new Error("Composer is not available");
1662
1595
  };
1663
- var defaultComponents = {
1664
- Text: () => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { style: { whiteSpace: "pre-line" }, children: [
1665
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveText, {}),
1666
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveInProgress, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { style: { fontFamily: "revert" }, children: " \u25CF" }) })
1667
- ] }),
1668
- Image: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveImage, {}),
1669
- UI: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveDisplay, {})
1596
+ var EMPTY_ARRAY = Object.freeze([]);
1597
+ var getThreadComposerState = (type, runtime, beginEdit, focus, onFocus) => {
1598
+ return Object.freeze({
1599
+ type,
1600
+ isEditing: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _16 => _16.isEditing]), () => ( false)),
1601
+ canCancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _17 => _17.canCancel]), () => ( false)),
1602
+ isEmpty: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _18 => _18.isEmpty]), () => ( true)),
1603
+ text: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _19 => _19.text]), () => ( "")),
1604
+ attachments: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _20 => _20.attachments]), () => ( EMPTY_ARRAY)),
1605
+ attachmentAccept: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _21 => _21.attachmentAccept]), () => ( "*")),
1606
+ value: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _22 => _22.text]), () => ( "")),
1607
+ setValue: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _23 => _23.setText, 'access', _24 => _24.bind, 'call', _25 => _25(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1608
+ setText: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _26 => _26.setText, 'access', _27 => _27.bind, 'call', _28 => _28(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1609
+ edit: beginEdit,
1610
+ send: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _29 => _29.send, 'access', _30 => _30.bind, 'call', _31 => _31(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1611
+ cancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _32 => _32.cancel, 'access', _33 => _33.bind, 'call', _34 => _34(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1612
+ focus: _nullishCoalesce(focus, () => ( METHOD_NOT_SUPPORTED)),
1613
+ onFocus: _nullishCoalesce(onFocus, () => ( METHOD_NOT_SUPPORTED)),
1614
+ reset: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _35 => _35.reset, 'access', _36 => _36.bind, 'call', _37 => _37(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1615
+ addAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _38 => _38.addAttachment, 'access', _39 => _39.bind, 'call', _40 => _40(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1616
+ removeAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _41 => _41.removeAttachment, 'access', _42 => _42.bind, 'call', _43 => _43(runtime)]), () => ( METHOD_NOT_SUPPORTED))
1617
+ });
1670
1618
  };
1671
- var MessageContentPartComponent = ({
1672
- components: {
1673
- Text: Text2 = defaultComponents.Text,
1674
- Empty,
1675
- Image: Image2 = defaultComponents.Image,
1676
- UI = defaultComponents.UI,
1677
- tools: { by_name = {}, Fallback: Fallback2 = void 0 } = {}
1678
- } = {}
1679
- }) => {
1680
- const messageStore = useMessageStore();
1681
- const threadRuntime = useThreadRuntime();
1682
- const { part, status } = useContentPart();
1683
- const type = part.type;
1684
- switch (type) {
1685
- case "text":
1686
- if (status.type === "requires-action")
1687
- throw new Error("Encountered unexpected requires-action status");
1688
- if (part === EMPTY_CONTENT && !!Empty) {
1689
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Empty, { status });
1690
- }
1691
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Text2, { part, status });
1692
- case "image":
1693
- if (status.type === "requires-action")
1694
- throw new Error("Encountered unexpected requires-action status");
1695
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Image2, { part, status });
1696
- case "ui":
1697
- if (status.type === "requires-action")
1698
- throw new Error("Encountered unexpected requires-action status");
1699
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UI, { part, status });
1700
- case "tool-call": {
1701
- const Tool = by_name[part.toolName] || Fallback2;
1702
- const addResult = (result) => threadRuntime.addToolResult({
1703
- messageId: messageStore.getState().id,
1704
- toolName: part.toolName,
1705
- toolCallId: part.toolCallId,
1706
- result
1707
- });
1708
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1709
- ToolUIDisplay,
1710
- {
1711
- UI: Tool,
1712
- part,
1713
- status,
1714
- addResult
1715
- }
1716
- );
1717
- }
1718
- default:
1719
- const unhandledType = type;
1720
- throw new Error(`Unknown content part type: ${unhandledType}`);
1619
+ var ComposerRuntime = (_class2 = class {
1620
+ constructor(_core, _beginEdit) {;_class2.prototype.__init5.call(this);
1621
+ this._core = _core;
1622
+ this._beginEdit = _beginEdit;
1721
1623
  }
1722
- };
1723
- var MessageContentPartImpl = ({
1724
- partIndex,
1725
- components
1726
- }) => {
1727
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartProvider, { partIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPartComponent, { components }) });
1728
- };
1729
- var MessageContentPart = _react.memo.call(void 0,
1730
- MessageContentPartImpl,
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])
1732
- );
1733
- var MessagePrimitiveContent = ({
1734
- components
1735
- }) => {
1736
- const contentLength = useMessage((s) => s.content.length) || 1;
1737
- return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPart, { partIndex: index, components }, index));
1738
- };
1739
- MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
1740
-
1741
- // src/primitives/message/MessageInProgress.tsx
1742
- var MessagePrimitiveInProgress = () => {
1743
- return null;
1744
- };
1745
- MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
1746
-
1747
- // src/primitives/message/MessageAttachments.tsx
1748
-
1749
-
1750
- // src/context/react/AttachmentContext.ts
1751
-
1752
- var AttachmentContext = _react.createContext.call(void 0,
1753
- null
1754
- );
1755
- function useAttachmentContext(options) {
1756
- const context = _react.useContext.call(void 0, AttachmentContext);
1757
- if (!_optionalChain([options, 'optionalAccess', _33 => _33.optional]) && !context)
1758
- throw new Error(
1759
- "This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component."
1760
- );
1761
- return context;
1762
- }
1763
- function useComposerAttachmentContext(options) {
1764
- const context = useAttachmentContext(options);
1765
- if (!context) return null;
1766
- if (context.type !== "composer")
1767
- throw new Error(
1768
- "This component must be used within a ComposerPrimitive.Attachments component."
1769
- );
1770
- return context;
1771
- }
1772
- function useMessageAttachmentContext(options) {
1773
- const context = useAttachmentContext(options);
1774
- if (!context) return null;
1775
- if (context.type !== "message")
1776
- throw new Error(
1777
- "This component must be used within a MessagePrimitive.Attachments component."
1778
- );
1779
- return context;
1780
- }
1781
- var { useAttachment, useAttachmentStore } = createContextStoreHook(
1782
- useAttachmentContext,
1783
- "useAttachment"
1784
- );
1785
- var {
1786
- useAttachment: useComposerAttachment,
1787
- useAttachmentStore: useComposerAttachmentStore
1788
- } = createContextStoreHook(useComposerAttachmentContext, "useAttachment");
1789
- var {
1624
+ get type() {
1625
+ return this._beginEdit ? "edit" : "thread";
1626
+ }
1627
+ /**
1628
+ * @deprecated Use `getState().isEditing` instead. This will be removed in 0.6.0.
1629
+ */
1630
+ get isEditing() {
1631
+ return this.getState().isEditing;
1632
+ }
1633
+ /**
1634
+ * @deprecated Use `getState().isEmpty` instead. This will be removed in 0.6.0.
1635
+ */
1636
+ get isEmpty() {
1637
+ return this.getState().isEmpty;
1638
+ }
1639
+ /**
1640
+ * @deprecated Use `getState().canCancel` instead. This will be removed in 0.6.0.
1641
+ */
1642
+ get canCancel() {
1643
+ return this.getState().canCancel;
1644
+ }
1645
+ /**
1646
+ * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
1647
+ */
1648
+ get text() {
1649
+ return this.getState().text;
1650
+ }
1651
+ /**
1652
+ * @deprecated Use `getState().attachmentAccept` instead. This will be removed in 0.6.0.
1653
+ */
1654
+ get attachmentAccept() {
1655
+ return this.getState().attachmentAccept;
1656
+ }
1657
+ // TODO should this instead return getAttachmentByIndex([idx]) instead?
1658
+ /**
1659
+ * @deprecated Use `getState().attachments` instead. This will be removed in 0.6.0.
1660
+ */
1661
+ get attachments() {
1662
+ return this.getState().attachments;
1663
+ }
1664
+ /**
1665
+ * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
1666
+ */
1667
+ get value() {
1668
+ return this.text;
1669
+ }
1670
+ getState() {
1671
+ return getThreadComposerState(
1672
+ this.type,
1673
+ this._core.getState(),
1674
+ _nullishCoalesce(_optionalChain([this, 'access', _44 => _44._beginEdit, 'optionalAccess', _45 => _45.bind, 'call', _46 => _46(this)]), () => ( METHOD_NOT_SUPPORTED)),
1675
+ this.focus.bind(this),
1676
+ this.onFocus.bind(this)
1677
+ );
1678
+ }
1679
+ setText(text) {
1680
+ const core = this._core.getState();
1681
+ if (!core) throw new Error("Composer is not available");
1682
+ core.setText(text);
1683
+ }
1684
+ setValue(text) {
1685
+ this.setText(text);
1686
+ }
1687
+ addAttachment(file) {
1688
+ const core = this._core.getState();
1689
+ if (!core) throw new Error("Composer is not available");
1690
+ return core.addAttachment(file);
1691
+ }
1692
+ // /**
1693
+ // * @deprecated Use `getAttachmentById(id).removeAttachment` instead. This will be removed in 0.6.0.
1694
+ // */
1695
+ removeAttachment(attachmentId) {
1696
+ const core = this._core.getState();
1697
+ if (!core) throw new Error("Composer is not available");
1698
+ return core.removeAttachment(attachmentId);
1699
+ }
1700
+ /**
1701
+ * @deprecated This method will be removed in 0.6.0. Submit feedback if you need this functionality.
1702
+ */
1703
+ reset() {
1704
+ const core = this._core.getState();
1705
+ if (!core) throw new Error("Composer is not available");
1706
+ core.reset();
1707
+ }
1708
+ send() {
1709
+ const core = this._core.getState();
1710
+ if (!core) throw new Error("Composer is not available");
1711
+ core.send();
1712
+ }
1713
+ cancel() {
1714
+ const core = this._core.getState();
1715
+ if (!core) throw new Error("Composer is not available");
1716
+ core.cancel();
1717
+ }
1718
+ beginEdit() {
1719
+ _optionalChain([this, 'access', _47 => _47._beginEdit, 'optionalCall', _48 => _48()]);
1720
+ }
1721
+ /**
1722
+ * @deprecated Use `beginEdit()` instead. This will be removed in 0.6.0.
1723
+ */
1724
+ edit() {
1725
+ this.beginEdit();
1726
+ }
1727
+ subscribe(callback) {
1728
+ return this._core.subscribe(callback);
1729
+ }
1730
+ __init5() {this._focusListeners = /* @__PURE__ */ new Set()}
1731
+ focus() {
1732
+ this._focusListeners.forEach((callback) => callback());
1733
+ }
1734
+ onFocus(callback) {
1735
+ this._focusListeners.add(callback);
1736
+ return () => this._focusListeners.delete(callback);
1737
+ }
1738
+ }, _class2);
1739
+
1740
+ // src/api/subscribable/BaseSubject.ts
1741
+ var BaseSubject = (_class3 = class {constructor() { _class3.prototype.__init6.call(this); }
1742
+ __init6() {this._subscriptions = /* @__PURE__ */ new Set()}
1743
+
1744
+ get isConnected() {
1745
+ return !!this._connection;
1746
+ }
1747
+ notifySubscribers() {
1748
+ for (const callback of this._subscriptions) callback();
1749
+ }
1750
+ _updateConnection() {
1751
+ if (this._subscriptions.size > 0) {
1752
+ if (this._connection) return;
1753
+ this._connection = this._connect();
1754
+ } else {
1755
+ _optionalChain([this, 'access', _49 => _49._connection, 'optionalCall', _50 => _50()]);
1756
+ this._connection = void 0;
1757
+ }
1758
+ }
1759
+ subscribe(callback) {
1760
+ this._subscriptions.add(callback);
1761
+ this._updateConnection();
1762
+ return () => {
1763
+ this._subscriptions.delete(callback);
1764
+ this._updateConnection();
1765
+ };
1766
+ }
1767
+ }, _class3);
1768
+
1769
+ // src/api/subscribable/NestedSubscriptionSubject.ts
1770
+ var NestedSubscriptionSubject = class extends BaseSubject {
1771
+ constructor(binding) {
1772
+ super();
1773
+ this.binding = binding;
1774
+ }
1775
+ getState() {
1776
+ return this.binding.getState();
1777
+ }
1778
+ _connect() {
1779
+ const callback = () => {
1780
+ this.notifySubscribers();
1781
+ };
1782
+ let lastState = this.binding.getState();
1783
+ let innerUnsubscribe = _optionalChain([lastState, 'optionalAccess', _51 => _51.subscribe, 'call', _52 => _52(callback)]);
1784
+ const onRuntimeUpdate = () => {
1785
+ const newState = this.binding.getState();
1786
+ if (newState === lastState) return;
1787
+ lastState = newState;
1788
+ _optionalChain([innerUnsubscribe, 'optionalCall', _53 => _53()]);
1789
+ innerUnsubscribe = _optionalChain([this, 'access', _54 => _54.binding, 'access', _55 => _55.getState, 'call', _56 => _56(), 'optionalAccess', _57 => _57.subscribe, 'call', _58 => _58(callback)]);
1790
+ callback();
1791
+ };
1792
+ const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
1793
+ return () => {
1794
+ _optionalChain([outerUnsubscribe, 'optionalCall', _59 => _59()]);
1795
+ _optionalChain([innerUnsubscribe, 'optionalCall', _60 => _60()]);
1796
+ };
1797
+ }
1798
+ };
1799
+
1800
+ // src/api/subscribable/shallowEqual.ts
1801
+ function shallowEqual(objA, objB) {
1802
+ if (objA === void 0 && objB === void 0) return true;
1803
+ if (objA === void 0) return false;
1804
+ if (objB === void 0) return false;
1805
+ for (const key of Object.keys(objA)) {
1806
+ const valueA = objA[key];
1807
+ const valueB = objB[key];
1808
+ if (!Object.is(valueA, valueB)) return false;
1809
+ }
1810
+ return true;
1811
+ }
1812
+
1813
+ // src/api/subscribable/ShallowMemoizeSubject.ts
1814
+ var ShallowMemoizeSubject = (_class4 = class extends BaseSubject {
1815
+ constructor(binding) {
1816
+ super();_class4.prototype.__init7.call(this);;
1817
+ this.binding = binding;
1818
+ const state = binding.getState();
1819
+ if (state === void 0)
1820
+ throw new Error("Entry not available in the store");
1821
+ this._previousState = state;
1822
+ }
1823
+
1824
+ __init7() {this.getState = () => {
1825
+ if (!this.isConnected) this._syncState();
1826
+ return this._previousState;
1827
+ }}
1828
+ _syncState() {
1829
+ const state = this.binding.getState();
1830
+ if (state === void 0) return false;
1831
+ if (shallowEqual(state, this._previousState)) return false;
1832
+ this._previousState = state;
1833
+ return true;
1834
+ }
1835
+ _connect() {
1836
+ const callback = () => {
1837
+ if (this._syncState()) {
1838
+ this.notifySubscribers();
1839
+ }
1840
+ };
1841
+ return this.binding.subscribe(callback);
1842
+ }
1843
+ }, _class4);
1844
+
1845
+ // src/api/MessageRuntime.ts
1846
+ var COMPLETE_STATUS2 = {
1847
+ type: "complete"
1848
+ };
1849
+ var toContentPartStatus = (message, partIndex, part) => {
1850
+ if (message.role !== "assistant") return COMPLETE_STATUS2;
1851
+ const isLastPart = partIndex === Math.max(0, message.content.length - 1);
1852
+ if (part.type !== "tool-call") {
1853
+ if ("reason" in message.status && message.status.reason === "tool-calls" && isLastPart)
1854
+ throw new Error(
1855
+ "Encountered unexpected requires-action status. This is likely an internal bug in assistant-ui."
1856
+ );
1857
+ return isLastPart ? message.status : COMPLETE_STATUS2;
1858
+ }
1859
+ if (!!part.result) {
1860
+ return COMPLETE_STATUS2;
1861
+ }
1862
+ return message.status;
1863
+ };
1864
+ var EMPTY_CONTENT = Object.freeze({ type: "text", text: "" });
1865
+ var getContentPartState = (message, partIndex) => {
1866
+ let part = message.content[partIndex];
1867
+ if (!part) {
1868
+ if (message.content.length === 0 && partIndex === 0) {
1869
+ part = EMPTY_CONTENT;
1870
+ } else {
1871
+ return void 0;
1872
+ }
1873
+ } else if (message.content.length === 1 && part.type === "text" && part.text.length === 0) {
1874
+ part = EMPTY_CONTENT;
1875
+ }
1876
+ const status = toContentPartStatus(message, partIndex, part);
1877
+ return Object.freeze({ ...part, part, status });
1878
+ };
1879
+ var MessageRuntime = (_class5 = class {
1880
+ constructor(_core, _threadBinding) {;_class5.prototype.__init8.call(this);
1881
+ this._core = _core;
1882
+ this._threadBinding = _threadBinding;
1883
+ }
1884
+ __init8() {this.composer = new ComposerRuntime(
1885
+ new NestedSubscriptionSubject({
1886
+ getState: () => this._threadBinding.getState().getEditComposer(this._core.getState().id),
1887
+ subscribe: (callback) => this._threadBinding.subscribe(callback)
1888
+ }),
1889
+ () => this._threadBinding.getState().beginEdit(this._core.getState().id)
1890
+ )}
1891
+ getState() {
1892
+ return this._core.getState();
1893
+ }
1894
+ // TODO improve type
1895
+ unstable_edit(message) {
1896
+ const state = this._core.getState();
1897
+ if (!state) throw new Error("Message is not available");
1898
+ this._threadBinding.getState().append({
1899
+ ...message,
1900
+ parentId: state.parentId
1901
+ });
1902
+ }
1903
+ reload() {
1904
+ const state = this._core.getState();
1905
+ if (!state) throw new Error("Message is not available");
1906
+ if (state.role !== "assistant")
1907
+ throw new Error("Can only reload assistant messages");
1908
+ this._threadBinding.getState().startRun(state.parentId);
1909
+ }
1910
+ speak() {
1911
+ const state = this._core.getState();
1912
+ if (!state) throw new Error("Message is not available");
1913
+ return this._threadBinding.getState().speak(state.id);
1914
+ }
1915
+ submitFeedback({ type }) {
1916
+ const state = this._core.getState();
1917
+ if (!state) throw new Error("Message is not available");
1918
+ this._threadBinding.getState().submitFeedback({
1919
+ messageId: state.id,
1920
+ type
1921
+ });
1922
+ }
1923
+ switchToBranch({
1924
+ position,
1925
+ branchId
1926
+ }) {
1927
+ const state = this._core.getState();
1928
+ if (!state) throw new Error("Message is not available");
1929
+ if (branchId && position) {
1930
+ throw new Error("May not specify both branchId and position");
1931
+ } else if (!branchId && !position) {
1932
+ throw new Error("Must specify either branchId or position");
1933
+ }
1934
+ const thread = this._threadBinding.getState();
1935
+ const branches = thread.getBranches(state.id);
1936
+ let targetBranch = branchId;
1937
+ if (position === "previous") {
1938
+ targetBranch = branches[state.branchNumber - 2];
1939
+ } else if (position === "next") {
1940
+ targetBranch = branches[state.branchNumber];
1941
+ }
1942
+ if (!targetBranch) throw new Error("Branch not found");
1943
+ this._threadBinding.getState().switchToBranch(targetBranch);
1944
+ }
1945
+ subscribe(callback) {
1946
+ return this._core.subscribe(callback);
1947
+ }
1948
+ unstable_getContentPartByIndex(idx) {
1949
+ if (idx < 0) throw new Error("Message index must be >= 0");
1950
+ return new ContentPartRuntime(
1951
+ new ShallowMemoizeSubject({
1952
+ getState: () => {
1953
+ return getContentPartState(this.getState(), idx);
1954
+ },
1955
+ subscribe: (callback) => this._core.subscribe(callback)
1956
+ }),
1957
+ this._core,
1958
+ this._threadBinding
1959
+ );
1960
+ }
1961
+ }, _class5);
1962
+
1963
+ // src/primitives/message/MessageContent.tsx
1964
+
1965
+ var ToolUIDisplay = ({
1966
+ UI,
1967
+ ...props
1968
+ }) => {
1969
+ const Render = _nullishCoalesce(useToolUIs((s) => s.getToolUI(props.toolName)), () => ( UI));
1970
+ if (!Render) return null;
1971
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Render, { ...props });
1972
+ };
1973
+ var defaultComponents = {
1974
+ Text: () => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { style: { whiteSpace: "pre-line" }, children: [
1975
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveText, {}),
1976
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveInProgress, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { style: { fontFamily: "revert" }, children: " \u25CF" }) })
1977
+ ] }),
1978
+ Image: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveImage, {}),
1979
+ UI: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveDisplay, {})
1980
+ };
1981
+ var MessageContentPartComponent = ({
1982
+ components: {
1983
+ Text: Text2 = defaultComponents.Text,
1984
+ Empty,
1985
+ Image: Image2 = defaultComponents.Image,
1986
+ UI = defaultComponents.UI,
1987
+ tools: { by_name = {}, Fallback: Fallback2 = void 0 } = {}
1988
+ } = {}
1989
+ }) => {
1990
+ const messageStore = useMessageStore();
1991
+ const threadRuntime = useThreadRuntime();
1992
+ const part = useContentPart();
1993
+ const type = part.type;
1994
+ switch (type) {
1995
+ case "text":
1996
+ if (part.status.type === "requires-action")
1997
+ throw new Error("Encountered unexpected requires-action status");
1998
+ if (part.part === EMPTY_CONTENT && !!Empty) {
1999
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Empty, { status: part.status });
2000
+ }
2001
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Text2, { ...part, part });
2002
+ case "image":
2003
+ if (part.status.type === "requires-action")
2004
+ throw new Error("Encountered unexpected requires-action status");
2005
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Image2, { ...part, part });
2006
+ case "ui":
2007
+ if (part.status.type === "requires-action")
2008
+ throw new Error("Encountered unexpected requires-action status");
2009
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UI, { ...part, part });
2010
+ case "tool-call": {
2011
+ const Tool = by_name[part.toolName] || Fallback2;
2012
+ const addResult = (result) => threadRuntime.addToolResult({
2013
+ messageId: messageStore.getState().id,
2014
+ toolName: part.toolName,
2015
+ toolCallId: part.toolCallId,
2016
+ result
2017
+ });
2018
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ToolUIDisplay, { ...part, part, UI: Tool, addResult });
2019
+ }
2020
+ default:
2021
+ const unhandledType = type;
2022
+ throw new Error(`Unknown content part type: ${unhandledType}`);
2023
+ }
2024
+ };
2025
+ var MessageContentPartImpl = ({
2026
+ partIndex,
2027
+ components
2028
+ }) => {
2029
+ const messageRuntime = useMessageRuntime();
2030
+ const runtime = _react.useMemo.call(void 0,
2031
+ () => messageRuntime.unstable_getContentPartByIndex(partIndex),
2032
+ [messageRuntime, partIndex]
2033
+ );
2034
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartRuntimeProvider, { runtime, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPartComponent, { components }) });
2035
+ };
2036
+ var MessageContentPart = _react.memo.call(void 0,
2037
+ MessageContentPartImpl,
2038
+ (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _61 => _61.components, 'optionalAccess', _62 => _62.Text]) === _optionalChain([next, 'access', _63 => _63.components, 'optionalAccess', _64 => _64.Text]) && _optionalChain([prev, 'access', _65 => _65.components, 'optionalAccess', _66 => _66.Image]) === _optionalChain([next, 'access', _67 => _67.components, 'optionalAccess', _68 => _68.Image]) && _optionalChain([prev, 'access', _69 => _69.components, 'optionalAccess', _70 => _70.UI]) === _optionalChain([next, 'access', _71 => _71.components, 'optionalAccess', _72 => _72.UI]) && _optionalChain([prev, 'access', _73 => _73.components, 'optionalAccess', _74 => _74.tools]) === _optionalChain([next, 'access', _75 => _75.components, 'optionalAccess', _76 => _76.tools])
2039
+ );
2040
+ var MessagePrimitiveContent = ({
2041
+ components
2042
+ }) => {
2043
+ const contentLength = useMessage((s) => s.content.length) || 1;
2044
+ return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPart, { partIndex: index, components }, index));
2045
+ };
2046
+ MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
2047
+
2048
+ // src/primitives/message/MessageInProgress.tsx
2049
+ var MessagePrimitiveInProgress = () => {
2050
+ return null;
2051
+ };
2052
+ MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
2053
+
2054
+ // src/primitives/message/MessageAttachments.tsx
2055
+
2056
+
2057
+ // src/context/react/AttachmentContext.ts
2058
+
2059
+ var AttachmentContext = _react.createContext.call(void 0,
2060
+ null
2061
+ );
2062
+ function useAttachmentContext(options) {
2063
+ const context = _react.useContext.call(void 0, AttachmentContext);
2064
+ if (!_optionalChain([options, 'optionalAccess', _77 => _77.optional]) && !context)
2065
+ throw new Error(
2066
+ "This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component."
2067
+ );
2068
+ return context;
2069
+ }
2070
+ function useComposerAttachmentContext(options) {
2071
+ const context = useAttachmentContext(options);
2072
+ if (!context) return null;
2073
+ if (context.type !== "composer")
2074
+ throw new Error(
2075
+ "This component must be used within a ComposerPrimitive.Attachments component."
2076
+ );
2077
+ return context;
2078
+ }
2079
+ function useMessageAttachmentContext(options) {
2080
+ const context = useAttachmentContext(options);
2081
+ if (!context) return null;
2082
+ if (context.type !== "message")
2083
+ throw new Error(
2084
+ "This component must be used within a MessagePrimitive.Attachments component."
2085
+ );
2086
+ return context;
2087
+ }
2088
+ var { useAttachment, useAttachmentStore } = createContextStoreHook(
2089
+ useAttachmentContext,
2090
+ "useAttachment"
2091
+ );
2092
+ var {
2093
+ useAttachment: useComposerAttachment,
2094
+ useAttachmentStore: useComposerAttachmentStore
2095
+ } = createContextStoreHook(useComposerAttachmentContext, "useAttachment");
2096
+ var {
1790
2097
  useAttachment: useMessageAttachment,
1791
2098
  useAttachmentStore: useMessageAttachmentStore
1792
2099
  } = createContextStoreHook(useMessageAttachmentContext, "useAttachment");
@@ -1800,7 +2107,7 @@ var getAttachment = (message, useAttachment2, partIndex) => {
1800
2107
  const attachments = message.attachments;
1801
2108
  const attachment = attachments[partIndex];
1802
2109
  if (!attachment) return null;
1803
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _34 => _34.getState, 'call', _35 => _35()]);
2110
+ const currentState = _optionalChain([useAttachment2, 'optionalAccess', _78 => _78.getState, 'call', _79 => _79()]);
1804
2111
  if (currentState && currentState.attachment === attachment) return null;
1805
2112
  return Object.freeze({ attachment });
1806
2113
  };
@@ -1843,11 +2150,11 @@ var getComponent = (components, attachment) => {
1843
2150
  const type = attachment.type;
1844
2151
  switch (type) {
1845
2152
  case "image":
1846
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _36 => _36.Image]), () => ( _optionalChain([components, 'optionalAccess', _37 => _37.Attachment])));
2153
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _80 => _80.Image]), () => ( _optionalChain([components, 'optionalAccess', _81 => _81.Attachment])));
1847
2154
  case "document":
1848
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _38 => _38.Document]), () => ( _optionalChain([components, 'optionalAccess', _39 => _39.Attachment])));
2155
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _82 => _82.Document]), () => ( _optionalChain([components, 'optionalAccess', _83 => _83.Attachment])));
1849
2156
  case "file":
1850
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _40 => _40.File]), () => ( _optionalChain([components, 'optionalAccess', _41 => _41.Attachment])));
2157
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _84 => _84.File]), () => ( _optionalChain([components, 'optionalAccess', _85 => _85.Attachment])));
1851
2158
  default:
1852
2159
  const _exhaustiveCheck = type;
1853
2160
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
@@ -1865,7 +2172,7 @@ var MessageAttachmentImpl = ({ components, attachmentIndex }) => {
1865
2172
  };
1866
2173
  var MessageAttachment = _react.memo.call(void 0,
1867
2174
  MessageAttachmentImpl,
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])
2175
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _86 => _86.components, 'optionalAccess', _87 => _87.Image]) === _optionalChain([next, 'access', _88 => _88.components, 'optionalAccess', _89 => _89.Image]) && _optionalChain([prev, 'access', _90 => _90.components, 'optionalAccess', _91 => _91.Document]) === _optionalChain([next, 'access', _92 => _92.components, 'optionalAccess', _93 => _93.Document]) && _optionalChain([prev, 'access', _94 => _94.components, 'optionalAccess', _95 => _95.File]) === _optionalChain([next, 'access', _96 => _96.components, 'optionalAccess', _97 => _97.File]) && _optionalChain([prev, 'access', _98 => _98.components, 'optionalAccess', _99 => _99.Attachment]) === _optionalChain([next, 'access', _100 => _100.components, 'optionalAccess', _101 => _101.Attachment])
1869
2176
  );
1870
2177
  var MessagePrimitiveAttachments = ({ components }) => {
1871
2178
  const attachmentsCount = useMessage(({ message }) => {
@@ -1976,7 +2283,7 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
1976
2283
  const { isRunning } = threadStore.getState();
1977
2284
  if (!isRunning) {
1978
2285
  e.preventDefault();
1979
- _optionalChain([textareaRef, 'access', _58 => _58.current, 'optionalAccess', _59 => _59.closest, 'call', _60 => _60("form"), 'optionalAccess', _61 => _61.requestSubmit, 'call', _62 => _62()]);
2286
+ _optionalChain([textareaRef, 'access', _102 => _102.current, 'optionalAccess', _103 => _103.closest, 'call', _104 => _104("form"), 'optionalAccess', _105 => _105.requestSubmit, 'call', _106 => _106()]);
1980
2287
  }
1981
2288
  }
1982
2289
  };
@@ -2044,7 +2351,7 @@ var ComposerPrimitiveAddAttachment = createActionButton(
2044
2351
  var getAttachment2 = ({ attachments }, useAttachment2, partIndex) => {
2045
2352
  const attachment = attachments[partIndex];
2046
2353
  if (!attachment) return null;
2047
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _63 => _63.getState, 'call', _64 => _64()]);
2354
+ const currentState = _optionalChain([useAttachment2, 'optionalAccess', _107 => _107.getState, 'call', _108 => _108()]);
2048
2355
  if (currentState && currentState.attachment === attachment) return null;
2049
2356
  return Object.freeze({ attachment });
2050
2357
  };
@@ -2084,11 +2391,11 @@ var getComponent2 = (components, attachment) => {
2084
2391
  const type = attachment.type;
2085
2392
  switch (type) {
2086
2393
  case "image":
2087
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _65 => _65.Image]), () => ( _optionalChain([components, 'optionalAccess', _66 => _66.Attachment])));
2394
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _109 => _109.Image]), () => ( _optionalChain([components, 'optionalAccess', _110 => _110.Attachment])));
2088
2395
  case "document":
2089
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _67 => _67.Document]), () => ( _optionalChain([components, 'optionalAccess', _68 => _68.Attachment])));
2396
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _111 => _111.Document]), () => ( _optionalChain([components, 'optionalAccess', _112 => _112.Attachment])));
2090
2397
  case "file":
2091
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _69 => _69.File]), () => ( _optionalChain([components, 'optionalAccess', _70 => _70.Attachment])));
2398
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _113 => _113.File]), () => ( _optionalChain([components, 'optionalAccess', _114 => _114.Attachment])));
2092
2399
  default:
2093
2400
  const _exhaustiveCheck = type;
2094
2401
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
@@ -2106,7 +2413,7 @@ var ComposerAttachmentImpl = ({ components, attachmentIndex }) => {
2106
2413
  };
2107
2414
  var ComposerAttachment = _react.memo.call(void 0,
2108
2415
  ComposerAttachmentImpl,
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])
2416
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _115 => _115.components, 'optionalAccess', _116 => _116.Image]) === _optionalChain([next, 'access', _117 => _117.components, 'optionalAccess', _118 => _118.Image]) && _optionalChain([prev, 'access', _119 => _119.components, 'optionalAccess', _120 => _120.Document]) === _optionalChain([next, 'access', _121 => _121.components, 'optionalAccess', _122 => _122.Document]) && _optionalChain([prev, 'access', _123 => _123.components, 'optionalAccess', _124 => _124.File]) === _optionalChain([next, 'access', _125 => _125.components, 'optionalAccess', _126 => _126.File]) && _optionalChain([prev, 'access', _127 => _127.components, 'optionalAccess', _128 => _128.Attachment]) === _optionalChain([next, 'access', _129 => _129.components, 'optionalAccess', _130 => _130.Attachment])
2110
2417
  );
2111
2418
  var ComposerPrimitiveAttachments = ({ components }) => {
2112
2419
  const attachmentsCount = useThreadComposer((s) => s.attachments.length);
@@ -2311,45 +2618,6 @@ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
2311
2618
 
2312
2619
 
2313
2620
 
2314
- // src/context/stores/EditComposer.ts
2315
-
2316
- var makeEditComposerStore = ({
2317
- onEdit,
2318
- onSend
2319
- }) => _zustand.create.call(void 0, )((set, get) => ({
2320
- type: "edit",
2321
- get value() {
2322
- return get().text;
2323
- },
2324
- setValue(value) {
2325
- get().setText(value);
2326
- },
2327
- text: "",
2328
- setText: (text) => {
2329
- set({ text, isEmpty: text.trim().length === 0 });
2330
- },
2331
- canCancel: false,
2332
- isEditing: false,
2333
- isEmpty: true,
2334
- edit: () => {
2335
- const text = onEdit();
2336
- set({
2337
- isEditing: true,
2338
- canCancel: true,
2339
- isEmpty: text.trim().length === 0,
2340
- text
2341
- });
2342
- },
2343
- send: () => {
2344
- const text = get().text;
2345
- set({ isEditing: false, canCancel: false });
2346
- onSend(text);
2347
- },
2348
- cancel: () => {
2349
- set({ isEditing: false, canCancel: false });
2350
- }
2351
- }));
2352
-
2353
2621
  // src/context/stores/MessageUtils.ts
2354
2622
 
2355
2623
  var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
@@ -2365,7 +2633,7 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
2365
2633
  },
2366
2634
  isSpeaking: false,
2367
2635
  stopSpeaking: () => {
2368
- _optionalChain([utterance, 'optionalAccess', _87 => _87.cancel, 'call', _88 => _88()]);
2636
+ _optionalChain([utterance, 'optionalAccess', _131 => _131.cancel, 'call', _132 => _132()]);
2369
2637
  },
2370
2638
  addUtterance: (utt) => {
2371
2639
  utterance = utt;
@@ -2404,29 +2672,13 @@ var useMessageUtilsStore2 = () => {
2404
2672
  return store;
2405
2673
  };
2406
2674
  var useEditComposerStore2 = (useMessageRuntime2) => {
2407
- const [store] = _react.useState.call(void 0,
2408
- () => makeEditComposerStore({
2409
- onEdit: () => {
2410
- const text = getThreadMessageText(
2411
- useMessageRuntime2.getState().getState()
2412
- );
2413
- return text;
2414
- },
2415
- onSend: (text) => {
2416
- const message = useMessageRuntime2.getState().getState();
2417
- const previousText = getThreadMessageText(message);
2418
- if (previousText === text) return;
2419
- const nonTextParts = message.content.filter(
2420
- (part) => part.type !== "text" && part.type !== "ui"
2421
- );
2422
- useMessageRuntime2.getState().edit({
2423
- role: message.role,
2424
- content: [{ type: "text", text }, ...nonTextParts],
2425
- attachments: _nullishCoalesce(message.attachments, () => ( []))
2426
- });
2427
- }
2428
- })
2429
- );
2675
+ const runtime = useMessageRuntime2.getState().composer;
2676
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
2677
+ _react.useEffect.call(void 0, () => {
2678
+ const updateState = () => writableStore(store).setState(runtime.getState());
2679
+ updateState();
2680
+ return runtime.subscribe(updateState);
2681
+ }, [runtime, store]);
2430
2682
  return store;
2431
2683
  };
2432
2684
  var MessageRuntimeProvider = ({
@@ -2500,7 +2752,7 @@ var ThreadMessage = _react.memo.call(void 0,
2500
2752
  var ThreadPrimitiveMessagesImpl = ({
2501
2753
  components
2502
2754
  }) => {
2503
- const messagesLength = useThreadMessages((t) => t.length);
2755
+ const messagesLength = useThread((t) => t.messages.length);
2504
2756
  if (messagesLength === 0) return null;
2505
2757
  return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadMessage, { messageIndex: index, components }, index));
2506
2758
  };
@@ -2528,7 +2780,7 @@ var subscribeToMainThread = (runtime, callback) => {
2528
2780
  let first = true;
2529
2781
  let cleanup;
2530
2782
  const inner = () => {
2531
- _optionalChain([cleanup, 'optionalCall', _89 => _89()]);
2783
+ _optionalChain([cleanup, 'optionalCall', _133 => _133()]);
2532
2784
  cleanup = runtime.thread.subscribe(callback);
2533
2785
  if (!first) {
2534
2786
  callback();
@@ -2539,7 +2791,7 @@ var subscribeToMainThread = (runtime, callback) => {
2539
2791
  inner();
2540
2792
  return () => {
2541
2793
  unsubscribe();
2542
- _optionalChain([cleanup, 'optionalCall', _90 => _90()]);
2794
+ _optionalChain([cleanup, 'optionalCall', _134 => _134()]);
2543
2795
  };
2544
2796
  };
2545
2797
 
@@ -2547,8 +2799,8 @@ var subscribeToMainThread = (runtime, callback) => {
2547
2799
 
2548
2800
 
2549
2801
  // src/runtimes/core/BaseAssistantRuntimeCore.tsx
2550
- var BaseAssistantRuntimeCore = (_class2 = class {
2551
- constructor(_thread) {;_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);
2802
+ var BaseAssistantRuntimeCore = (_class6 = class {
2803
+ constructor(_thread) {;_class6.prototype.__init9.call(this);_class6.prototype.__init10.call(this);
2552
2804
  this._thread = _thread;
2553
2805
  this._thread = _thread;
2554
2806
  }
@@ -2559,22 +2811,22 @@ var BaseAssistantRuntimeCore = (_class2 = class {
2559
2811
  this._thread = thread;
2560
2812
  this.subscriptionHandler();
2561
2813
  }
2562
- __init5() {this._subscriptions = /* @__PURE__ */ new Set()}
2814
+ __init9() {this._subscriptions = /* @__PURE__ */ new Set()}
2563
2815
  subscribe(callback) {
2564
2816
  this._subscriptions.add(callback);
2565
2817
  return () => this._subscriptions.delete(callback);
2566
2818
  }
2567
- __init6() {this.subscriptionHandler = () => {
2819
+ __init10() {this.subscriptionHandler = () => {
2568
2820
  for (const callback of this._subscriptions) callback();
2569
2821
  }}
2570
- }, _class2);
2822
+ }, _class6);
2571
2823
 
2572
2824
  // src/internal.ts
2573
2825
  var internal_exports = {};
2574
2826
  _chunkPZ5AY32Cjs.__export.call(void 0, internal_exports, {
2575
2827
  AssistantRuntime: () => AssistantRuntime,
2576
2828
  BaseAssistantRuntimeCore: () => BaseAssistantRuntimeCore,
2577
- BaseThreadComposerRuntimeCore: () => BaseThreadComposerRuntimeCore,
2829
+ DefaultThreadComposerRuntimeCore: () => DefaultThreadComposerRuntimeCore,
2578
2830
  MessageRepository: () => MessageRepository,
2579
2831
  ProxyConfigProvider: () => ProxyConfigProvider,
2580
2832
  ThreadRuntime: () => ThreadRuntime,
@@ -2585,41 +2837,56 @@ _chunkPZ5AY32Cjs.__export.call(void 0, internal_exports, {
2585
2837
  withSmoothContextProvider: () => withSmoothContextProvider
2586
2838
  });
2587
2839
 
2588
- // src/runtimes/utils/BaseThreadComposerRuntimeCore.tsx
2589
- var BaseThreadComposerRuntimeCore = (_class3 = class {
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);
2591
- this.runtime = runtime;
2592
- this.connect();
2840
+ // src/runtimes/composer/BaseComposerRuntimeCore.tsx
2841
+ var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototype.__init11.call(this);_class7.prototype.__init12.call(this);_class7.prototype.__init13.call(this);_class7.prototype.__init14.call(this);_class7.prototype.__init15.call(this); }
2842
+ __init11() {this.isEditing = true}
2843
+ __init12() {this.attachmentAccept = "*"}
2844
+ __init13() {this._attachments = []}
2845
+ set attachments(value) {
2846
+ this._attachments = value;
2847
+ this.notifySubscribers();
2848
+ }
2849
+ get attachments() {
2850
+ return this._attachments;
2593
2851
  }
2594
-
2595
- __init7() {this.attachmentAccept = "*"}
2596
2852
  get isEmpty() {
2597
2853
  return !this.text.trim() && !this.attachments.length;
2598
2854
  }
2599
- __init8() {this._canCancel = false}
2600
- get canCancel() {
2601
- return this._canCancel;
2855
+ __init14() {this._text = ""}
2856
+ get text() {
2857
+ return this._text;
2602
2858
  }
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
- });
2859
+ setText(value) {
2860
+ this._text = value;
2861
+ this.notifySubscribers();
2862
+ }
2863
+ reset() {
2864
+ this._text = "";
2865
+ this._attachments = [];
2866
+ this.notifySubscribers();
2867
+ }
2868
+ async send() {
2869
+ const attachments = this._attachmentAdapter ? await Promise.all(
2870
+ this.attachments.map(
2871
+ async (a) => await this._attachmentAdapter.send(a)
2872
+ )
2873
+ ) : [];
2874
+ const message = {
2875
+ role: "user",
2876
+ content: this.text ? [{ type: "text", text: this.text }] : [],
2877
+ attachments
2878
+ };
2879
+ this.reset();
2880
+ this.handleSend(message);
2610
2881
  }
2882
+
2611
2883
  setAttachmentAdapter(adapter) {
2612
2884
  this._attachmentAdapter = adapter;
2613
- const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _91 => _91.accept]), () => ( "*"));
2885
+ const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _135 => _135.accept]), () => ( "*"));
2614
2886
  if (this.attachmentAccept !== accept) {
2615
2887
  this.attachmentAccept = accept;
2616
- return true;
2888
+ this.notifySubscribers();
2617
2889
  }
2618
- return false;
2619
- }
2620
- __init9() {this._attachments = []}
2621
- get attachments() {
2622
- return this._attachments;
2623
2890
  }
2624
2891
  async addAttachment(file) {
2625
2892
  if (!this._attachmentAdapter)
@@ -2638,49 +2905,49 @@ var BaseThreadComposerRuntimeCore = (_class3 = class {
2638
2905
  this._attachments = this._attachments.toSpliced(index, 1);
2639
2906
  this.notifySubscribers();
2640
2907
  }
2641
- __init10() {this._text = ""}
2642
- get text() {
2643
- return this._text;
2908
+ __init15() {this._subscriptions = /* @__PURE__ */ new Set()}
2909
+ notifySubscribers() {
2910
+ for (const callback of this._subscriptions) callback();
2644
2911
  }
2645
- setText(value) {
2646
- this._text = value;
2647
- this.notifySubscribers();
2912
+ subscribe(callback) {
2913
+ this._subscriptions.add(callback);
2914
+ return () => this._subscriptions.delete(callback);
2648
2915
  }
2649
- reset() {
2650
- this._text = "";
2651
- this._attachments = [];
2652
- this.notifySubscribers();
2916
+ }, _class7);
2917
+
2918
+ // src/runtimes/composer/DefaultThreadComposerRuntimeCore.tsx
2919
+ var DefaultThreadComposerRuntimeCore = (_class8 = class extends BaseComposerRuntimeCore {
2920
+ constructor(runtime) {
2921
+ super();_class8.prototype.__init16.call(this);;
2922
+ this.runtime = runtime;
2923
+ this.connect();
2653
2924
  }
2654
- async send() {
2655
- const attachments = this._attachmentAdapter ? await Promise.all(
2656
- this.attachments.map(
2657
- async (a) => await this._attachmentAdapter.send(a)
2658
- )
2659
- ) : [];
2925
+ __init16() {this._canCancel = false}
2926
+ get canCancel() {
2927
+ return this._canCancel;
2928
+ }
2929
+ connect() {
2930
+ return this.runtime.subscribe(() => {
2931
+ if (this.canCancel !== this.runtime.capabilities.cancel) {
2932
+ this._canCancel = this.runtime.capabilities.cancel;
2933
+ this.notifySubscribers();
2934
+ }
2935
+ });
2936
+ }
2937
+ async handleSend(message) {
2660
2938
  this.runtime.append({
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)),
2662
- role: "user",
2663
- content: this.text ? [{ type: "text", text: this.text }] : [],
2664
- attachments
2939
+ ...message,
2940
+ parentId: _nullishCoalesce(_optionalChain([this, 'access', _136 => _136.runtime, 'access', _137 => _137.messages, 'access', _138 => _138.at, 'call', _139 => _139(-1), 'optionalAccess', _140 => _140.id]), () => ( null))
2665
2941
  });
2666
- this.reset();
2667
2942
  }
2668
2943
  async cancel() {
2669
2944
  this.runtime.cancelRun();
2670
2945
  }
2671
- __init11() {this._subscriptions = /* @__PURE__ */ new Set()}
2672
- notifySubscribers() {
2673
- for (const callback of this._subscriptions) callback();
2674
- }
2675
- subscribe(callback) {
2676
- this._subscriptions.add(callback);
2677
- return () => this._subscriptions.delete(callback);
2678
- }
2679
- }, _class3);
2946
+ }, _class8);
2680
2947
 
2681
2948
  // src/utils/ProxyConfigProvider.ts
2682
- var ProxyConfigProvider = (_class4 = class {constructor() { _class4.prototype.__init12.call(this); }
2683
- __init12() {this._providers = /* @__PURE__ */ new Set()}
2949
+ var ProxyConfigProvider = (_class9 = class {constructor() { _class9.prototype.__init17.call(this); }
2950
+ __init17() {this._providers = /* @__PURE__ */ new Set()}
2684
2951
  getModelConfig() {
2685
2952
  return _chunk5KIEXJRKjs.mergeModelConfigs.call(void 0, this._providers);
2686
2953
  }
@@ -2690,7 +2957,7 @@ var ProxyConfigProvider = (_class4 = class {constructor() { _class4.prototype.__
2690
2957
  this._providers.delete(provider);
2691
2958
  };
2692
2959
  }
2693
- }, _class4);
2960
+ }, _class9);
2694
2961
 
2695
2962
  // src/utils/idUtils.tsx
2696
2963
  var _nonsecure = require('nanoid/non-secure');
@@ -2757,11 +3024,11 @@ var findHead = (message) => {
2757
3024
  if ("current" in message) return message;
2758
3025
  return null;
2759
3026
  };
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()}
3027
+ var MessageRepository = (_class10 = class {constructor() { _class10.prototype.__init18.call(this);_class10.prototype.__init19.call(this);_class10.prototype.__init20.call(this); }
3028
+ __init18() {this.messages = /* @__PURE__ */ new Map()}
2762
3029
  // message_id -> item
2763
- __init14() {this.head = null}
2764
- __init15() {this.root = {
3030
+ __init19() {this.head = null}
3031
+ __init20() {this.root = {
2765
3032
  children: [],
2766
3033
  next: null
2767
3034
  }}
@@ -2803,11 +3070,11 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2803
3070
  }
2804
3071
  }
2805
3072
  getMessages() {
2806
- const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _97 => _97.head, 'optionalAccess', _98 => _98.level]), () => ( 0)));
3073
+ const messages2 = new Array(_nullishCoalesce(_optionalChain([this, 'access', _141 => _141.head, 'optionalAccess', _142 => _142.level]), () => ( 0)));
2807
3074
  for (let current = this.head; current; current = current.prev) {
2808
- messages[current.level] = current.current;
3075
+ messages2[current.level] = current.current;
2809
3076
  }
2810
- return messages;
3077
+ return messages2;
2811
3078
  }
2812
3079
  addOrUpdateMessage(parentId, message) {
2813
3080
  const existingItem = this.messages.get(message.id);
@@ -2841,7 +3108,7 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2841
3108
  "MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui."
2842
3109
  );
2843
3110
  return {
2844
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _99 => _99.prev, 'optionalAccess', _100 => _100.current, 'access', _101 => _101.id]), () => ( null)),
3111
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _143 => _143.prev, 'optionalAccess', _144 => _144.current, 'access', _145 => _145.id]), () => ( null)),
2845
3112
  message: message.current
2846
3113
  };
2847
3114
  }
@@ -2925,21 +3192,21 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2925
3192
  for (const [, message] of this.messages) {
2926
3193
  exportItems.push({
2927
3194
  message: message.current,
2928
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _102 => _102.prev, 'optionalAccess', _103 => _103.current, 'access', _104 => _104.id]), () => ( null))
3195
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _146 => _146.prev, 'optionalAccess', _147 => _147.current, 'access', _148 => _148.id]), () => ( null))
2929
3196
  });
2930
3197
  }
2931
3198
  return {
2932
- headId: _nullishCoalesce(_optionalChain([this, 'access', _105 => _105.head, 'optionalAccess', _106 => _106.current, 'access', _107 => _107.id]), () => ( null)),
3199
+ headId: _nullishCoalesce(_optionalChain([this, 'access', _149 => _149.head, 'optionalAccess', _150 => _150.current, 'access', _151 => _151.id]), () => ( null)),
2933
3200
  messages: exportItems
2934
3201
  };
2935
3202
  }
2936
- import({ headId, messages }) {
2937
- for (const { message, parentId } of messages) {
3203
+ import({ headId, messages: messages2 }) {
3204
+ for (const { message, parentId } of messages2) {
2938
3205
  this.addOrUpdateMessage(parentId, message);
2939
3206
  }
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)));
3207
+ this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages2, 'access', _152 => _152.at, 'call', _153 => _153(-1), 'optionalAccess', _154 => _154.message, 'access', _155 => _155.id]))), () => ( null)));
2941
3208
  }
2942
- }, _class5);
3209
+ }, _class10);
2943
3210
 
2944
3211
  // src/ui/base/tooltip-icon-button.tsx
2945
3212
 
@@ -3017,85 +3284,25 @@ var Button = _react.forwardRef.call(void 0,
3017
3284
  {
3018
3285
  className: buttonVariants({ variant, size, className }),
3019
3286
  ...props,
3020
- ref
3021
- }
3022
- );
3023
- }
3024
- );
3025
- Button.displayName = "Button";
3026
-
3027
- // src/ui/base/tooltip-icon-button.tsx
3028
-
3029
- var TooltipIconButton = _react.forwardRef.call(void 0, ({ children, tooltip, side = "bottom", ...rest }, ref) => {
3030
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, Tooltip, { children: [
3031
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, Button, { variant: "ghost", size: "icon", ...rest, ref, children: [
3032
- children,
3033
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "aui-sr-only", children: tooltip })
3034
- ] }) }),
3035
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipContent, { side, children: tooltip })
3036
- ] });
3037
- });
3038
- TooltipIconButton.displayName = "TooltipIconButton";
3039
-
3040
- // src/api/subscribable/BaseSubject.ts
3041
- var BaseSubject = (_class6 = class {constructor() { _class6.prototype.__init16.call(this); }
3042
- __init16() {this._subscriptions = /* @__PURE__ */ new Set()}
3043
-
3044
- get isConnected() {
3045
- return !!this._connection;
3046
- }
3047
- notifySubscribers() {
3048
- for (const callback of this._subscriptions) callback();
3049
- }
3050
- _updateConnection() {
3051
- if (this._subscriptions.size > 0) {
3052
- if (this._connection) return;
3053
- this._connection = this._connect();
3054
- } else {
3055
- _optionalChain([this, 'access', _112 => _112._connection, 'optionalCall', _113 => _113()]);
3056
- this._connection = void 0;
3057
- }
3058
- }
3059
- subscribe(callback) {
3060
- this._subscriptions.add(callback);
3061
- this._updateConnection();
3062
- return () => {
3063
- this._subscriptions.delete(callback);
3064
- this._updateConnection();
3065
- };
3066
- }
3067
- }, _class6);
3068
-
3069
- // src/api/subscribable/NestedSubscriptionSubject.ts
3070
- var NestedSubscriptionSubject = class extends BaseSubject {
3071
- constructor(binding) {
3072
- super();
3073
- this.binding = binding;
3074
- }
3075
- getState() {
3076
- return this.binding.getState();
3077
- }
3078
- _connect() {
3079
- const callback = () => {
3080
- this.notifySubscribers();
3081
- };
3082
- let lastState = this.binding.getState();
3083
- let innerUnsubscribe = lastState.subscribe(callback);
3084
- const onRuntimeUpdate = () => {
3085
- const newState = this.binding.getState();
3086
- if (newState === lastState) return;
3087
- lastState = newState;
3088
- _optionalChain([innerUnsubscribe, 'optionalCall', _114 => _114()]);
3089
- innerUnsubscribe = this.binding.getState().subscribe(callback);
3090
- callback();
3091
- };
3092
- const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
3093
- return () => {
3094
- _optionalChain([outerUnsubscribe, 'optionalCall', _115 => _115()]);
3095
- innerUnsubscribe();
3096
- };
3287
+ ref
3288
+ }
3289
+ );
3097
3290
  }
3098
- };
3291
+ );
3292
+ Button.displayName = "Button";
3293
+
3294
+ // src/ui/base/tooltip-icon-button.tsx
3295
+
3296
+ var TooltipIconButton = _react.forwardRef.call(void 0, ({ children, tooltip, side = "bottom", ...rest }, ref) => {
3297
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, Tooltip, { children: [
3298
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, Button, { variant: "ghost", size: "icon", ...rest, ref, children: [
3299
+ children,
3300
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "aui-sr-only", children: tooltip })
3301
+ ] }) }),
3302
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipContent, { side, children: tooltip })
3303
+ ] });
3304
+ });
3305
+ TooltipIconButton.displayName = "TooltipIconButton";
3099
3306
 
3100
3307
  // src/api/AssistantRuntime.ts
3101
3308
  var AssistantRuntime = class {
@@ -3127,245 +3334,42 @@ var AssistantRuntime = class {
3127
3334
  }
3128
3335
  };
3129
3336
 
3130
- // src/api/ContentPartRuntime.ts
3131
- var ContentPartRuntime = class {
3132
- constructor(contentBinding, messageApi, threadApi) {
3133
- this.contentBinding = contentBinding;
3134
- this.messageApi = messageApi;
3135
- this.threadApi = threadApi;
3136
- }
3137
- getState() {
3138
- return this.contentBinding.getState();
3139
- }
3140
- addToolResult(result) {
3141
- const message = this.messageApi.getState();
3142
- if (!message) throw new Error("Message is not available");
3143
- const state = this.contentBinding.getState();
3144
- if (!state) throw new Error("Content part is not available");
3145
- if (state.part.type !== "tool-call")
3146
- throw new Error("Tried to add tool result to non-tool content part");
3147
- const toolName = state.part.toolName;
3148
- const toolCallId = state.part.toolCallId;
3149
- this.threadApi.getState().addToolResult({
3150
- messageId: message.id,
3151
- toolName,
3152
- toolCallId,
3153
- result
3154
- });
3155
- }
3156
- };
3157
-
3158
- // src/api/subscribable/shallowEqual.ts
3159
- function shallowEqual(objA, objB) {
3160
- if (objA === void 0 && objB === void 0) return true;
3161
- if (objA === void 0) return false;
3162
- if (objB === void 0) return false;
3163
- for (const key of Object.keys(objA)) {
3164
- const valueA = objA[key];
3165
- const valueB = objB[key];
3166
- if (!Object.is(valueA, valueB)) return false;
3167
- }
3168
- return true;
3169
- }
3170
-
3171
- // src/api/subscribable/ShallowMemoizeSubject.ts
3172
- var ShallowMemoizeSubject = (_class7 = class extends BaseSubject {
3337
+ // src/api/subscribable/LazyMemoizeSubject.ts
3338
+ var LazyMemoizeSubject = (_class11 = class extends BaseSubject {
3173
3339
  constructor(binding) {
3174
- super();_class7.prototype.__init17.call(this);;
3340
+ super();_class11.prototype.__init21.call(this);_class11.prototype.__init22.call(this);;
3175
3341
  this.binding = binding;
3176
3342
  const state = binding.getState();
3177
3343
  if (state === void 0)
3178
3344
  throw new Error("Entry not available in the store");
3179
3345
  this._previousState = state;
3180
3346
  }
3347
+ __init21() {this._previousStateDirty = true}
3181
3348
 
3182
- __init17() {this.getState = () => {
3183
- if (!this.isConnected) this._syncState();
3349
+ __init22() {this.getState = () => {
3350
+ if (!this.isConnected || this._previousStateDirty) {
3351
+ const newState = this.binding.getState();
3352
+ if (newState !== void 0) {
3353
+ this._previousState = newState;
3354
+ }
3355
+ this._previousStateDirty = false;
3356
+ }
3184
3357
  return this._previousState;
3185
3358
  }}
3186
- _syncState() {
3187
- const state = this.binding.getState();
3188
- if (state === void 0) return false;
3189
- if (shallowEqual(state, this._previousState)) return false;
3190
- this._previousState = state;
3191
- return true;
3192
- }
3193
3359
  _connect() {
3194
3360
  const callback = () => {
3195
- if (this._syncState()) {
3196
- this.notifySubscribers();
3197
- }
3361
+ this._previousStateDirty = true;
3362
+ this.notifySubscribers();
3198
3363
  };
3199
3364
  return this.binding.subscribe(callback);
3200
3365
  }
3201
- }, _class7);
3202
-
3203
- // src/api/MessageRuntime.ts
3204
- var MessageRuntime = class {
3205
- constructor(_core, _threadBinding) {
3206
- this._core = _core;
3207
- this._threadBinding = _threadBinding;
3208
- }
3209
- getState() {
3210
- return this._core.getState();
3211
- }
3212
- // TODO improve type
3213
- edit(message) {
3214
- const state = this._core.getState();
3215
- if (!state) throw new Error("Message is not available");
3216
- this._threadBinding.getState().append({
3217
- ...message,
3218
- parentId: state.parentId
3219
- });
3220
- }
3221
- reload() {
3222
- const state = this._core.getState();
3223
- if (!state) throw new Error("Message is not available");
3224
- this._threadBinding.getState().startRun(state.parentId);
3225
- }
3226
- speak() {
3227
- const state = this._core.getState();
3228
- if (!state) throw new Error("Message is not available");
3229
- this._threadBinding.getState().speak(state.id);
3230
- }
3231
- submitFeedback({ type }) {
3232
- const state = this._core.getState();
3233
- if (!state) throw new Error("Message is not available");
3234
- this._threadBinding.getState().submitFeedback({
3235
- messageId: state.id,
3236
- type
3237
- });
3238
- }
3239
- switchToBranch({
3240
- position,
3241
- branchId
3242
- }) {
3243
- const state = this._core.getState();
3244
- if (!state) throw new Error("Message is not available");
3245
- if (branchId && position) {
3246
- throw new Error("May not specify both branchId and position");
3247
- } else if (!branchId && !position) {
3248
- throw new Error("Must specify either branchId or position");
3249
- }
3250
- const thread = this._threadBinding.getState();
3251
- const branches = thread.getBranches(state.id);
3252
- let targetBranch = branchId;
3253
- if (position === "previous") {
3254
- targetBranch = branches[state.branchNumber - 2];
3255
- } else if (position === "next") {
3256
- targetBranch = branches[state.branchNumber];
3257
- }
3258
- if (!targetBranch) throw new Error("Branch not found");
3259
- this._threadBinding.getState().switchToBranch(targetBranch);
3260
- }
3261
- subscribe(callback) {
3262
- return this._core.subscribe(callback);
3263
- }
3264
- getContentPartByIdx(idx) {
3265
- if (idx < 0) throw new Error("Message index must be >= 0");
3266
- return new ContentPartRuntime(
3267
- new ShallowMemoizeSubject({
3268
- getState: () => {
3269
- const state = this.getState();
3270
- if (!state) return void 0;
3271
- const message = state.message;
3272
- const part = message.content[idx];
3273
- if (!part) return void 0;
3274
- return {
3275
- part,
3276
- status: toContentPartStatus(message, idx, part)
3277
- };
3278
- },
3279
- subscribe: (callback) => this._core.subscribe(callback)
3280
- }),
3281
- this._core,
3282
- this._threadBinding
3283
- );
3284
- }
3285
- };
3286
-
3287
- // src/api/ThreadComposerRuntime.ts
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
- });
3296
- };
3297
- var ThreadComposerRuntime = class {
3298
- constructor(_core) {
3299
- this._core = _core;
3300
- }
3301
- /**
3302
- * @deprecated Use `getState().isEmpty` instead. This will be removed in 0.6.0.
3303
- */
3304
- get isEmpty() {
3305
- return this._core.getState().isEmpty;
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
- }
3313
- /**
3314
- * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
3315
- */
3316
- get text() {
3317
- return this._core.getState().text;
3318
- }
3319
- /**
3320
- * @deprecated Use `getState().attachmentAccept` instead. This will be removed in 0.6.0.
3321
- */
3322
- get attachmentAccept() {
3323
- return this._core.getState().attachmentAccept;
3324
- }
3325
- // TODO should this instead return getAttachmentByIndex([idx]) instead?
3326
- /**
3327
- * @deprecated Use `getState().attachments` instead. This will be removed in 0.6.0.
3328
- */
3329
- get attachments() {
3330
- return this._core.getState().attachments;
3331
- }
3332
- getState() {
3333
- return getThreadComposerState(this._core.getState());
3334
- }
3335
- setText(text) {
3336
- this._core.getState().setText(text);
3337
- }
3338
- addAttachment(file) {
3339
- return this._core.getState().addAttachment(file);
3340
- }
3341
- // /**
3342
- // * @deprecated Use `getAttachmentById(id).removeAttachment` instead. This will be removed in 0.6.0.
3343
- // */
3344
- removeAttachment(attachmentId) {
3345
- return this._core.getState().removeAttachment(attachmentId);
3346
- }
3347
- /**
3348
- * @deprecated This method will be removed in 0.6.0. Submit feedback if you need this functionality.
3349
- */
3350
- reset() {
3351
- this._core.getState().reset();
3352
- }
3353
- send() {
3354
- this._core.getState().send();
3355
- }
3356
- cancel() {
3357
- this._core.getState().cancel();
3358
- }
3359
- subscribe(callback) {
3360
- return this._core.subscribe(callback);
3361
- }
3362
- };
3366
+ }, _class11);
3363
3367
 
3364
3368
  // src/api/ThreadRuntime.ts
3365
- var toAppendMessage = (messages, message) => {
3369
+ var toAppendMessage = (messages2, message) => {
3366
3370
  if (typeof message === "string") {
3367
3371
  return {
3368
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _116 => _116.at, 'call', _117 => _117(-1), 'optionalAccess', _118 => _118.id]), () => ( null)),
3372
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _156 => _156.at, 'call', _157 => _157(-1), 'optionalAccess', _158 => _158.id]), () => ( null)),
3369
3373
  role: "user",
3370
3374
  content: [{ type: "text", text: message }],
3371
3375
  attachments: []
@@ -3375,7 +3379,7 @@ var toAppendMessage = (messages, message) => {
3375
3379
  return message;
3376
3380
  }
3377
3381
  return {
3378
- parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([messages, 'access', _119 => _119.at, 'call', _120 => _120(-1), 'optionalAccess', _121 => _121.id]))), () => ( null)),
3382
+ parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([messages2, 'access', _159 => _159.at, 'call', _160 => _160(-1), 'optionalAccess', _161 => _161.id]))), () => ( null)),
3379
3383
  role: _nullishCoalesce(message.role, () => ( "user")),
3380
3384
  content: message.content,
3381
3385
  attachments: _nullishCoalesce(message.attachments, () => ( []))
@@ -3387,14 +3391,12 @@ var getThreadState = (runtime) => {
3387
3391
  threadId: runtime.threadId,
3388
3392
  capabilities: runtime.capabilities,
3389
3393
  isDisabled: runtime.isDisabled,
3390
- isRunning: _optionalChain([lastMessage, 'optionalAccess', _122 => _122.role]) !== "assistant" ? false : lastMessage.status.type === "running",
3394
+ isRunning: _optionalChain([lastMessage, 'optionalAccess', _162 => _162.role]) !== "assistant" ? false : lastMessage.status.type === "running",
3395
+ messages: runtime.messages,
3391
3396
  unstable_synchronizer: runtime.unstable_synchronizer
3392
3397
  });
3393
3398
  };
3394
- var ThreadRuntime = (_class8 = class {
3395
- constructor(_threadBinding) {;_class8.prototype.__init18.call(this);
3396
- this._threadBinding = _threadBinding;
3397
- }
3399
+ var ThreadRuntime = (_class12 = class {
3398
3400
  // public path = "assistant.threads[main]"; // TODO
3399
3401
  /**
3400
3402
  * @deprecated Use `getState().threadId` instead. This will be removed in 0.6.0.
@@ -3420,21 +3422,35 @@ var ThreadRuntime = (_class8 = class {
3420
3422
  get capabilities() {
3421
3423
  return this.getState().capabilities;
3422
3424
  }
3423
- // TODO this should instead return getMessageByIndex([idx])
3425
+ /**
3426
+ * @deprecated Use `getState().messages` instead. This will be removed in 0.6.0.
3427
+ */
3424
3428
  get messages() {
3425
3429
  return this._threadBinding.getState().messages;
3426
3430
  }
3427
3431
  unstable_getCore() {
3428
3432
  return this._threadBinding.getState();
3429
3433
  }
3430
- __init18() {this.composer = new ThreadComposerRuntime(
3434
+
3435
+ constructor(threadBinding) {;_class12.prototype.__init23.call(this);
3436
+ const stateBinding = new LazyMemoizeSubject({
3437
+ getState: () => getThreadState(threadBinding.getState()),
3438
+ subscribe: (callback) => threadBinding.subscribe(callback)
3439
+ });
3440
+ this._threadBinding = {
3441
+ getState: () => threadBinding.getState(),
3442
+ getStateState: () => stateBinding.getState(),
3443
+ subscribe: (callback) => threadBinding.subscribe(callback)
3444
+ };
3445
+ }
3446
+ __init23() {this.composer = new ComposerRuntime(
3431
3447
  new NestedSubscriptionSubject({
3432
3448
  getState: () => this._threadBinding.getState().composer,
3433
3449
  subscribe: (callback) => this._threadBinding.subscribe(callback)
3434
3450
  })
3435
3451
  )}
3436
3452
  getState() {
3437
- return getThreadState(this._threadBinding.getState());
3453
+ return this._threadBinding.getStateState();
3438
3454
  }
3439
3455
  append(message) {
3440
3456
  this._threadBinding.getState().append(
@@ -3483,6 +3499,18 @@ var ThreadRuntime = (_class8 = class {
3483
3499
  submitFeedback(options) {
3484
3500
  return this._threadBinding.getState().submitFeedback(options);
3485
3501
  }
3502
+ /**
3503
+ * @deprecated This is a temporary API. This will be removed in 0.6.0.
3504
+ */
3505
+ getEditComposer(messageId) {
3506
+ return this._threadBinding.getState().getEditComposer(messageId);
3507
+ }
3508
+ /**
3509
+ * @deprecated This is a temporary API. This will be removed in 0.6.0.
3510
+ */
3511
+ beginEdit(messageId) {
3512
+ return this._threadBinding.getState().beginEdit(messageId);
3513
+ }
3486
3514
  export() {
3487
3515
  return this._threadBinding.getState().export();
3488
3516
  }
@@ -3494,15 +3522,15 @@ var ThreadRuntime = (_class8 = class {
3494
3522
  return new MessageRuntime(
3495
3523
  new ShallowMemoizeSubject({
3496
3524
  getState: () => {
3497
- const messages = this.messages;
3498
- const message = messages[idx];
3525
+ const messages2 = this.messages;
3526
+ const message = messages2[idx];
3499
3527
  if (!message) return void 0;
3500
3528
  const branches = this._threadBinding.getState().getBranches(message.id);
3501
3529
  return {
3502
3530
  ...message,
3503
3531
  message,
3504
- isLast: idx === messages.length - 1,
3505
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _123 => _123[idx - 1], 'optionalAccess', _124 => _124.id]), () => ( null)),
3532
+ isLast: idx === messages2.length - 1,
3533
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _163 => _163[idx - 1], 'optionalAccess', _164 => _164.id]), () => ( null)),
3506
3534
  branches,
3507
3535
  branchNumber: branches.indexOf(message.id) + 1,
3508
3536
  branchCount: branches.length
@@ -3513,16 +3541,16 @@ var ThreadRuntime = (_class8 = class {
3513
3541
  this._threadBinding
3514
3542
  );
3515
3543
  }
3516
- }, _class8);
3544
+ }, _class12);
3517
3545
 
3518
3546
  // src/runtimes/edge/converters/fromLanguageModelMessages.ts
3519
3547
  var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3520
- const messages = [];
3548
+ const messages2 = [];
3521
3549
  for (const lmMessage of lm) {
3522
3550
  const role = lmMessage.role;
3523
3551
  switch (role) {
3524
3552
  case "system": {
3525
- messages.push({
3553
+ messages2.push({
3526
3554
  role: "system",
3527
3555
  content: [
3528
3556
  {
@@ -3534,7 +3562,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3534
3562
  break;
3535
3563
  }
3536
3564
  case "user": {
3537
- messages.push({
3565
+ messages2.push({
3538
3566
  role: "user",
3539
3567
  content: lmMessage.content.map((part) => {
3540
3568
  const type = part.type;
@@ -3577,21 +3605,21 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3577
3605
  return part;
3578
3606
  });
3579
3607
  if (mergeRoundtrips) {
3580
- const previousMessage = messages[messages.length - 1];
3581
- if (_optionalChain([previousMessage, 'optionalAccess', _125 => _125.role]) === "assistant") {
3608
+ const previousMessage = messages2[messages2.length - 1];
3609
+ if (_optionalChain([previousMessage, 'optionalAccess', _165 => _165.role]) === "assistant") {
3582
3610
  previousMessage.content.push(...newContent);
3583
3611
  break;
3584
3612
  }
3585
3613
  }
3586
- messages.push({
3614
+ messages2.push({
3587
3615
  role: "assistant",
3588
3616
  content: newContent
3589
3617
  });
3590
3618
  break;
3591
3619
  }
3592
3620
  case "tool": {
3593
- const previousMessage = messages[messages.length - 1];
3594
- if (_optionalChain([previousMessage, 'optionalAccess', _126 => _126.role]) !== "assistant")
3621
+ const previousMessage = messages2[messages2.length - 1];
3622
+ if (_optionalChain([previousMessage, 'optionalAccess', _166 => _166.role]) !== "assistant")
3595
3623
  throw new Error(
3596
3624
  "A tool message must be preceded by an assistant message."
3597
3625
  );
@@ -3616,7 +3644,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3616
3644
  }
3617
3645
  }
3618
3646
  }
3619
- return messages;
3647
+ return messages2;
3620
3648
  };
3621
3649
 
3622
3650
  // src/runtimes/edge/converters/fromLanguageModelTools.ts
@@ -3774,7 +3802,7 @@ var EdgeChatAdapter = class {
3774
3802
  constructor(options) {
3775
3803
  this.options = options;
3776
3804
  }
3777
- async *run({ messages, abortSignal, config }) {
3805
+ async *run({ messages: messages2, abortSignal, config }) {
3778
3806
  const headers = new Headers(this.options.headers);
3779
3807
  headers.set("Content-Type", "application/json");
3780
3808
  const result = await fetch(this.options.api, {
@@ -3783,7 +3811,7 @@ var EdgeChatAdapter = class {
3783
3811
  credentials: _nullishCoalesce(this.options.credentials, () => ( "same-origin")),
3784
3812
  body: JSON.stringify({
3785
3813
  system: config.system,
3786
- messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages),
3814
+ messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages2),
3787
3815
  tools: config.tools ? _chunk5KIEXJRKjs.toLanguageModelTools.call(void 0, config.tools) : [],
3788
3816
  ...config.callSettings,
3789
3817
  ...config.config,
@@ -3820,28 +3848,65 @@ var useEdgeRuntime = ({
3820
3848
  };
3821
3849
 
3822
3850
  // src/runtimes/local/shouldContinue.tsx
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);
3851
+ var shouldContinue = (result) => _optionalChain([result, 'access', _167 => _167.status, 'optionalAccess', _168 => _168.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
3852
+
3853
+ // src/runtimes/composer/DefaultEditComposerRuntimeCore.tsx
3854
+ var DefaultEditComposerRuntimeCore = class extends BaseComposerRuntimeCore {
3855
+ constructor(runtime, endEditCallback, { parentId, message }) {
3856
+ super();
3857
+ this.runtime = runtime;
3858
+ this.endEditCallback = endEditCallback;
3859
+ this._parentId = parentId;
3860
+ this._previousText = getThreadMessageText(message);
3861
+ this.setText(this._previousText);
3862
+ this._nonTextParts = message.content.filter(
3863
+ (part) => part.type !== "text" && part.type !== "ui"
3864
+ );
3865
+ }
3866
+ get canCancel() {
3867
+ return true;
3868
+ }
3869
+
3870
+
3871
+
3872
+ async handleSend(message) {
3873
+ const text = getThreadMessageText(message);
3874
+ if (text !== this._previousText) {
3875
+ this.runtime.append({
3876
+ ...message,
3877
+ content: [...message.content, ...this._nonTextParts],
3878
+ parentId: this._parentId
3879
+ });
3880
+ }
3881
+ this.endEditCallback();
3882
+ this.notifySubscribers();
3883
+ }
3884
+ async cancel() {
3885
+ this.endEditCallback();
3886
+ this.notifySubscribers();
3887
+ }
3888
+ };
3824
3889
 
3825
3890
  // src/runtimes/local/LocalThreadRuntimeCore.tsx
3826
- var LocalThreadRuntimeCore = (_class9 = class {
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);
3891
+ var LocalThreadRuntimeCore = (_class13 = class {
3892
+ constructor(configProvider, adapter, { initialMessages, ...options }) {;_class13.prototype.__init24.call(this);_class13.prototype.__init25.call(this);_class13.prototype.__init26.call(this);_class13.prototype.__init27.call(this);_class13.prototype.__init28.call(this);_class13.prototype.__init29.call(this);_class13.prototype.__init30.call(this);
3828
3893
  this.configProvider = configProvider;
3829
3894
  this.adapter = adapter;
3830
3895
  this.threadId = generateId();
3831
3896
  this.options = options;
3832
3897
  if (initialMessages) {
3833
3898
  let parentId = null;
3834
- const messages = fromCoreMessages(initialMessages);
3835
- for (const message of messages) {
3899
+ const messages2 = fromCoreMessages(initialMessages);
3900
+ for (const message of messages2) {
3836
3901
  this.repository.addOrUpdateMessage(parentId, message);
3837
3902
  parentId = message.id;
3838
3903
  }
3839
3904
  }
3840
3905
  }
3841
- __init19() {this._subscriptions = /* @__PURE__ */ new Set()}
3842
- __init20() {this.abortController = null}
3843
- __init21() {this.repository = new MessageRepository()}
3844
- __init22() {this.capabilities = {
3906
+ __init24() {this._subscriptions = /* @__PURE__ */ new Set()}
3907
+ __init25() {this.abortController = null}
3908
+ __init26() {this.repository = new MessageRepository()}
3909
+ __init27() {this.capabilities = {
3845
3910
  switchToBranch: true,
3846
3911
  edit: true,
3847
3912
  reload: true,
@@ -3852,11 +3917,11 @@ var LocalThreadRuntimeCore = (_class9 = class {
3852
3917
  feedback: false
3853
3918
  }}
3854
3919
 
3855
- __init23() {this.isDisabled = false}
3920
+ __init28() {this.isDisabled = false}
3856
3921
  get messages() {
3857
3922
  return this.repository.getMessages();
3858
3923
  }
3859
- __init24() {this.composer = new BaseThreadComposerRuntimeCore(this)}
3924
+ __init29() {this.composer = new DefaultThreadComposerRuntimeCore(this)}
3860
3925
  getModelConfig() {
3861
3926
  return this.configProvider.getModelConfig();
3862
3927
  }
@@ -3867,24 +3932,41 @@ var LocalThreadRuntimeCore = (_class9 = class {
3867
3932
  set options({ initialMessages, ...options }) {
3868
3933
  this._options = options;
3869
3934
  let hasUpdates = false;
3870
- const canSpeak = _optionalChain([options, 'access', _129 => _129.adapters, 'optionalAccess', _130 => _130.speech]) !== void 0;
3935
+ const canSpeak = _optionalChain([options, 'access', _169 => _169.adapters, 'optionalAccess', _170 => _170.speech]) !== void 0;
3871
3936
  if (this.capabilities.speak !== canSpeak) {
3872
3937
  this.capabilities.speak = canSpeak;
3873
3938
  hasUpdates = true;
3874
3939
  }
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;
3940
+ this.composer.setAttachmentAdapter(_optionalChain([options, 'access', _171 => _171.adapters, 'optionalAccess', _172 => _172.attachments]));
3941
+ const canAttach = _optionalChain([options, 'access', _173 => _173.adapters, 'optionalAccess', _174 => _174.attachments]) !== void 0;
3877
3942
  if (this.capabilities.attachments !== canAttach) {
3878
3943
  this.capabilities.attachments = canAttach;
3879
3944
  hasUpdates = true;
3880
3945
  }
3881
- const canFeedback = _optionalChain([options, 'access', _135 => _135.adapters, 'optionalAccess', _136 => _136.feedback]) !== void 0;
3946
+ const canFeedback = _optionalChain([options, 'access', _175 => _175.adapters, 'optionalAccess', _176 => _176.feedback]) !== void 0;
3882
3947
  if (this.capabilities.feedback !== canFeedback) {
3883
3948
  this.capabilities.feedback = canFeedback;
3884
3949
  hasUpdates = true;
3885
3950
  }
3886
3951
  if (hasUpdates) this.notifySubscribers();
3887
3952
  }
3953
+ __init30() {this._editComposers = /* @__PURE__ */ new Map()}
3954
+ getEditComposer(messageId) {
3955
+ return this._editComposers.get(messageId);
3956
+ }
3957
+ beginEdit(messageId) {
3958
+ if (this._editComposers.has(messageId))
3959
+ throw new Error("Edit already in progress");
3960
+ this._editComposers.set(
3961
+ messageId,
3962
+ new DefaultEditComposerRuntimeCore(
3963
+ this,
3964
+ () => this._editComposers.delete(messageId),
3965
+ this.repository.getMessage(messageId)
3966
+ )
3967
+ );
3968
+ this.notifySubscribers();
3969
+ }
3888
3970
  getBranches(messageId) {
3889
3971
  return this.repository.getBranches(messageId);
3890
3972
  }
@@ -3919,19 +4001,19 @@ var LocalThreadRuntimeCore = (_class9 = class {
3919
4001
  } while (shouldContinue(message));
3920
4002
  }
3921
4003
  async performRoundtrip(parentId, message) {
3922
- const messages = this.repository.getMessages();
3923
- _optionalChain([this, 'access', _137 => _137.abortController, 'optionalAccess', _138 => _138.abort, 'call', _139 => _139()]);
4004
+ const messages2 = this.repository.getMessages();
4005
+ _optionalChain([this, 'access', _177 => _177.abortController, 'optionalAccess', _178 => _178.abort, 'call', _179 => _179()]);
3924
4006
  this.abortController = new AbortController();
3925
4007
  const initialContent = message.content;
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]);
4008
+ const initialRoundtrips = _optionalChain([message, 'access', _180 => _180.metadata, 'optionalAccess', _181 => _181.roundtrips]);
4009
+ const initalCustom = _optionalChain([message, 'access', _182 => _182.metadata, 'optionalAccess', _183 => _183.custom]);
3928
4010
  const updateMessage = (m) => {
3929
4011
  message = {
3930
4012
  ...message,
3931
4013
  ...m.content ? { content: [...initialContent, ..._nullishCoalesce(m.content, () => ( []))] } : void 0,
3932
4014
  status: _nullishCoalesce(m.status, () => ( message.status)),
3933
4015
  // TODO deprecated, remove in v0.6
3934
- ..._optionalChain([m, 'access', _144 => _144.metadata, 'optionalAccess', _145 => _145.roundtrips]) ? {
4016
+ ..._optionalChain([m, 'access', _184 => _184.metadata, 'optionalAccess', _185 => _185.roundtrips]) ? {
3935
4017
  roundtrips: [
3936
4018
  ..._nullishCoalesce(initialRoundtrips, () => ( [])),
3937
4019
  ...m.metadata.roundtrips
@@ -3946,7 +4028,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
3946
4028
  ...m.metadata.roundtrips
3947
4029
  ]
3948
4030
  } : void 0,
3949
- ..._optionalChain([m, 'access', _146 => _146.metadata, 'optionalAccess', _147 => _147.custom]) ? {
4031
+ ..._optionalChain([m, 'access', _186 => _186.metadata, 'optionalAccess', _187 => _187.custom]) ? {
3950
4032
  custom: { ..._nullishCoalesce(initalCustom, () => ( {})), ...m.metadata.custom }
3951
4033
  } : void 0
3952
4034
  }
@@ -3956,7 +4038,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
3956
4038
  this.notifySubscribers();
3957
4039
  };
3958
4040
  const maxToolRoundtrips = _nullishCoalesce(this.options.maxToolRoundtrips, () => ( 1));
3959
- const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _148 => _148.metadata, 'optionalAccess', _149 => _149.roundtrips, 'optionalAccess', _150 => _150.length]), () => ( 0));
4041
+ const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _188 => _188.metadata, 'optionalAccess', _189 => _189.roundtrips, 'optionalAccess', _190 => _190.length]), () => ( 0));
3960
4042
  if (toolRoundtrips > maxToolRoundtrips) {
3961
4043
  updateMessage({
3962
4044
  status: {
@@ -3974,7 +4056,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
3974
4056
  }
3975
4057
  try {
3976
4058
  const promiseOrGenerator = this.adapter.run({
3977
- messages,
4059
+ messages: messages2,
3978
4060
  abortSignal: this.abortController.signal,
3979
4061
  config: this.configProvider.getModelConfig(),
3980
4062
  onUpdate: updateMessage
@@ -4055,7 +4137,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4055
4137
  // TODO lift utterance state to thread runtime
4056
4138
 
4057
4139
  speak(messageId) {
4058
- const adapter = _optionalChain([this, 'access', _151 => _151.options, 'access', _152 => _152.adapters, 'optionalAccess', _153 => _153.speech]);
4140
+ const adapter = _optionalChain([this, 'access', _191 => _191.options, 'access', _192 => _192.adapters, 'optionalAccess', _193 => _193.speech]);
4059
4141
  if (!adapter) throw new Error("Speech adapter not configured");
4060
4142
  const { message } = this.repository.getMessage(messageId);
4061
4143
  if (this._utterance) {
@@ -4072,7 +4154,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4072
4154
  return this._utterance;
4073
4155
  }
4074
4156
  submitFeedback({ messageId, type }) {
4075
- const adapter = _optionalChain([this, 'access', _154 => _154.options, 'access', _155 => _155.adapters, 'optionalAccess', _156 => _156.feedback]);
4157
+ const adapter = _optionalChain([this, 'access', _194 => _194.options, 'access', _195 => _195.adapters, 'optionalAccess', _196 => _196.feedback]);
4076
4158
  if (!adapter) throw new Error("Feedback adapter not configured");
4077
4159
  const { message } = this.repository.getMessage(messageId);
4078
4160
  adapter.submit({ message, type });
@@ -4084,7 +4166,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4084
4166
  this.repository.import(data);
4085
4167
  this.notifySubscribers();
4086
4168
  }
4087
- }, _class9);
4169
+ }, _class13);
4088
4170
 
4089
4171
  // src/runtimes/local/LocalRuntimeCore.tsx
4090
4172
  var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
@@ -4116,10 +4198,10 @@ var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
4116
4198
  } = {}) {
4117
4199
  this.switchToThread(null);
4118
4200
  if (!initialMessages) return;
4119
- const messages = fromCoreMessages(initialMessages);
4201
+ const messages2 = fromCoreMessages(initialMessages);
4120
4202
  this.thread.import({
4121
- messages: messages.map((m, idx) => ({
4122
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _157 => _157[idx - 1], 'optionalAccess', _158 => _158.id]), () => ( null)),
4203
+ messages: messages2.map((m, idx) => ({
4204
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _197 => _197[idx - 1], 'optionalAccess', _198 => _198.id]), () => ( null)),
4123
4205
  message: m
4124
4206
  }))
4125
4207
  });
@@ -4155,17 +4237,17 @@ var getExternalStoreMessage = (message) => {
4155
4237
  };
4156
4238
 
4157
4239
  // src/runtimes/external-store/ThreadMessageConverter.ts
4158
- var ThreadMessageConverter = (_class10 = class {constructor() { _class10.prototype.__init25.call(this); }
4159
- __init25() {this.cache = /* @__PURE__ */ new WeakMap()}
4160
- convertMessages(messages, converter) {
4161
- return messages.map((m, idx) => {
4240
+ var ThreadMessageConverter = (_class14 = class {constructor() { _class14.prototype.__init31.call(this); }
4241
+ __init31() {this.cache = /* @__PURE__ */ new WeakMap()}
4242
+ convertMessages(messages2, converter) {
4243
+ return messages2.map((m, idx) => {
4162
4244
  const cached = this.cache.get(m);
4163
4245
  const newMessage = converter(cached, m, idx);
4164
4246
  this.cache.set(m, newMessage);
4165
4247
  return newMessage;
4166
4248
  });
4167
4249
  }
4168
- }, _class10);
4250
+ }, _class14);
4169
4251
 
4170
4252
  // src/runtimes/external-store/auto-status.tsx
4171
4253
  var AUTO_STATUS_RUNNING = Object.freeze({ type: "running" });
@@ -4251,18 +4333,18 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
4251
4333
  };
4252
4334
 
4253
4335
  // src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx
4254
- var hasUpcomingMessage = (isRunning, messages) => {
4255
- return isRunning && _optionalChain([messages, 'access', _159 => _159[messages.length - 1], 'optionalAccess', _160 => _160.role]) !== "assistant";
4336
+ var hasUpcomingMessage = (isRunning, messages2) => {
4337
+ return isRunning && _optionalChain([messages2, 'access', _199 => _199[messages2.length - 1], 'optionalAccess', _200 => _200.role]) !== "assistant";
4256
4338
  };
4257
- var ExternalStoreThreadRuntimeCore = (_class11 = class {
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);
4339
+ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4340
+ constructor(configProvider, store) {;_class15.prototype.__init32.call(this);_class15.prototype.__init33.call(this);_class15.prototype.__init34.call(this);_class15.prototype.__init35.call(this);_class15.prototype.__init36.call(this);_class15.prototype.__init37.call(this);_class15.prototype.__init38.call(this);_class15.prototype.__init39.call(this);
4259
4341
  this.configProvider = configProvider;
4260
4342
  this.store = store;
4261
4343
  }
4262
- __init26() {this._subscriptions = /* @__PURE__ */ new Set()}
4263
- __init27() {this.repository = new MessageRepository()}
4264
- __init28() {this.assistantOptimisticId = null}
4265
- __init29() {this._capabilities = {
4344
+ __init32() {this._subscriptions = /* @__PURE__ */ new Set()}
4345
+ __init33() {this.repository = new MessageRepository()}
4346
+ __init34() {this.assistantOptimisticId = null}
4347
+ __init35() {this._capabilities = {
4266
4348
  switchToBranch: false,
4267
4349
  edit: false,
4268
4350
  reload: false,
@@ -4278,9 +4360,26 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4278
4360
 
4279
4361
 
4280
4362
 
4281
- __init30() {this.converter = new ThreadMessageConverter()}
4363
+ __init36() {this.converter = new ThreadMessageConverter()}
4282
4364
 
4283
- __init31() {this.composer = new BaseThreadComposerRuntimeCore(this)}
4365
+ __init37() {this.composer = new DefaultThreadComposerRuntimeCore(this)}
4366
+ __init38() {this._editComposers = /* @__PURE__ */ new Map()}
4367
+ getEditComposer(messageId) {
4368
+ return this._editComposers.get(messageId);
4369
+ }
4370
+ beginEdit(messageId) {
4371
+ if (this._editComposers.has(messageId))
4372
+ throw new Error("Edit already in progress");
4373
+ this._editComposers.set(
4374
+ messageId,
4375
+ new DefaultEditComposerRuntimeCore(
4376
+ this,
4377
+ () => this._editComposers.delete(messageId),
4378
+ this.repository.getMessage(messageId)
4379
+ )
4380
+ );
4381
+ this.notifySubscribers();
4382
+ }
4284
4383
  get store() {
4285
4384
  return this._store;
4286
4385
  }
@@ -4297,12 +4396,12 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4297
4396
  reload: this._store.onReload !== void 0,
4298
4397
  cancel: this._store.onCancel !== void 0,
4299
4398
  speak: this._store.onSpeak !== void 0,
4300
- unstable_copy: _optionalChain([this, 'access', _164 => _164._store, 'access', _165 => _165.unstable_capabilities, 'optionalAccess', _166 => _166.copy]) !== false,
4399
+ unstable_copy: _optionalChain([this, 'access', _204 => _204._store, 'access', _205 => _205.unstable_capabilities, 'optionalAccess', _206 => _206.copy]) !== false,
4301
4400
  // default true
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])
4401
+ attachments: !!_optionalChain([this, 'access', _207 => _207.store, 'access', _208 => _208.adapters, 'optionalAccess', _209 => _209.attachments]),
4402
+ feedback: !!_optionalChain([this, 'access', _210 => _210.store, 'access', _211 => _211.adapters, 'optionalAccess', _212 => _212.feedback])
4304
4403
  };
4305
- this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _173 => _173._store, 'access', _174 => _174.adapters, 'optionalAccess', _175 => _175.attachments]));
4404
+ this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _213 => _213._store, 'access', _214 => _214.adapters, 'optionalAccess', _215 => _215.attachments]));
4306
4405
  if (oldStore) {
4307
4406
  if (oldStore.convertMessage !== store.convertMessage) {
4308
4407
  this.converter = new ThreadMessageConverter();
@@ -4311,7 +4410,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4311
4410
  return;
4312
4411
  }
4313
4412
  }
4314
- const messages = !store.convertMessage ? store.messages : this.converter.convertMessages(store.messages, (cache, m, idx) => {
4413
+ const messages2 = !store.convertMessage ? store.messages : this.converter.convertMessages(store.messages, (cache, m, idx) => {
4315
4414
  if (!store.convertMessage) return m;
4316
4415
  const isLast = idx === store.messages.length - 1;
4317
4416
  const autoStatus = getAutoStatus(isLast, isRunning);
@@ -4325,18 +4424,18 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4325
4424
  newMessage[symbolInnerMessage] = m;
4326
4425
  return newMessage;
4327
4426
  });
4328
- for (let i = 0; i < messages.length; i++) {
4329
- const message = messages[i];
4330
- const parent = messages[i - 1];
4331
- this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _176 => _176.id]), () => ( null)), message);
4427
+ for (let i = 0; i < messages2.length; i++) {
4428
+ const message = messages2[i];
4429
+ const parent = messages2[i - 1];
4430
+ this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _216 => _216.id]), () => ( null)), message);
4332
4431
  }
4333
4432
  if (this.assistantOptimisticId) {
4334
4433
  this.repository.deleteMessage(this.assistantOptimisticId);
4335
4434
  this.assistantOptimisticId = null;
4336
4435
  }
4337
- if (hasUpcomingMessage(isRunning, messages)) {
4436
+ if (hasUpcomingMessage(isRunning, messages2)) {
4338
4437
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
4339
- _nullishCoalesce(_optionalChain([messages, 'access', _177 => _177.at, 'call', _178 => _178(-1), 'optionalAccess', _179 => _179.id]), () => ( null)),
4438
+ _nullishCoalesce(_optionalChain([messages2, 'access', _217 => _217.at, 'call', _218 => _218(-1), 'optionalAccess', _219 => _219.id]), () => ( null)),
4340
4439
  {
4341
4440
  role: "assistant",
4342
4441
  content: []
@@ -4344,7 +4443,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4344
4443
  );
4345
4444
  }
4346
4445
  this.repository.resetHead(
4347
- _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _180 => _180.at, 'call', _181 => _181(-1), 'optionalAccess', _182 => _182.id]))), () => ( null))
4446
+ _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages2, 'access', _220 => _220.at, 'call', _221 => _221(-1), 'optionalAccess', _222 => _222.id]))), () => ( null))
4348
4447
  );
4349
4448
  this.messages = this.repository.getMessages();
4350
4449
  this.notifySubscribers();
@@ -4365,7 +4464,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4365
4464
  this.updateMessages(this.repository.getMessages());
4366
4465
  }
4367
4466
  async append(message) {
4368
- if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _183 => _183.messages, 'access', _184 => _184.at, 'call', _185 => _185(-1), 'optionalAccess', _186 => _186.id]), () => ( null)))) {
4467
+ if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _223 => _223.messages, 'access', _224 => _224.at, 'call', _225 => _225(-1), 'optionalAccess', _226 => _226.id]), () => ( null)))) {
4369
4468
  if (!this._store.onEdit)
4370
4469
  throw new Error("Runtime does not support editing messages.");
4371
4470
  await this._store.onEdit(message);
@@ -4386,19 +4485,19 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4386
4485
  this.repository.deleteMessage(this.assistantOptimisticId);
4387
4486
  this.assistantOptimisticId = null;
4388
4487
  }
4389
- let messages = this.repository.getMessages();
4390
- const previousMessage = messages[messages.length - 1];
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])) {
4488
+ let messages2 = this.repository.getMessages();
4489
+ const previousMessage = messages2[messages2.length - 1];
4490
+ if (_optionalChain([previousMessage, 'optionalAccess', _227 => _227.role]) === "user" && previousMessage.id === _optionalChain([messages2, 'access', _228 => _228.at, 'call', _229 => _229(-1), 'optionalAccess', _230 => _230.id])) {
4392
4491
  this.repository.deleteMessage(previousMessage.id);
4393
4492
  if (!this.composer.text.trim()) {
4394
4493
  this.composer.setText(getThreadMessageText(previousMessage));
4395
4494
  }
4396
- messages = this.repository.getMessages();
4495
+ messages2 = this.repository.getMessages();
4397
4496
  } else {
4398
4497
  this.notifySubscribers();
4399
4498
  }
4400
4499
  setTimeout(() => {
4401
- this.updateMessages(messages);
4500
+ this.updateMessages(messages2);
4402
4501
  }, 0);
4403
4502
  }
4404
4503
  addToolResult(options) {
@@ -4413,7 +4512,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4413
4512
  return this._store.onSpeak(message);
4414
4513
  }
4415
4514
  submitFeedback({ messageId, type }) {
4416
- const adapter = _optionalChain([this, 'access', _191 => _191._store, 'access', _192 => _192.adapters, 'optionalAccess', _193 => _193.feedback]);
4515
+ const adapter = _optionalChain([this, 'access', _231 => _231._store, 'access', _232 => _232.adapters, 'optionalAccess', _233 => _233.feedback]);
4417
4516
  if (!adapter) throw new Error("Feedback adapter not configured");
4418
4517
  const { message } = this.repository.getMessage(messageId);
4419
4518
  adapter.submit({ message, type });
@@ -4422,9 +4521,9 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4422
4521
  this._subscriptions.add(callback);
4423
4522
  return () => this._subscriptions.delete(callback);
4424
4523
  }
4425
- __init32() {this.updateMessages = (messages) => {
4426
- _optionalChain([this, 'access', _194 => _194._store, 'access', _195 => _195.setMessages, 'optionalCall', _196 => _196(
4427
- messages.flatMap(getExternalStoreMessage).filter((m) => m != null)
4524
+ __init39() {this.updateMessages = (messages2) => {
4525
+ _optionalChain([this, 'access', _234 => _234._store, 'access', _235 => _235.setMessages, 'optionalCall', _236 => _236(
4526
+ messages2.flatMap(getExternalStoreMessage).filter((m) => m != null)
4428
4527
  )]);
4429
4528
  }}
4430
4529
  import(repository) {
@@ -4433,7 +4532,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4433
4532
  export() {
4434
4533
  return this.repository.export();
4435
4534
  }
4436
- }, _class11);
4535
+ }, _class15);
4437
4536
 
4438
4537
  // src/runtimes/external-store/ExternalStoreRuntimeCore.tsx
4439
4538
  var ExternalStoreRuntimeCore = class extends BaseAssistantRuntimeCore {
@@ -4491,12 +4590,12 @@ var useExternalStoreRuntime = (store) => {
4491
4590
 
4492
4591
  // src/runtimes/external-store/external-message-converter.tsx
4493
4592
 
4494
- var joinExternalMessages = (messages) => {
4593
+ var joinExternalMessages = (messages2) => {
4495
4594
  const assistantMessage = {
4496
4595
  role: "assistant",
4497
4596
  content: []
4498
4597
  };
4499
- for (const output of messages) {
4598
+ for (const output of messages2) {
4500
4599
  if (output.role === "tool") {
4501
4600
  const toolCallIdx = assistantMessage.content.findIndex(
4502
4601
  (c) => c.type === "tool-call" && c.toolCallId === output.toolCallId
@@ -4573,7 +4672,7 @@ var chunkExternalMessages = (callbackResults) => {
4573
4672
  };
4574
4673
  var useExternalMessageConverter = ({
4575
4674
  callback,
4576
- messages,
4675
+ messages: messages2,
4577
4676
  isRunning
4578
4677
  }) => {
4579
4678
  const state = _react.useMemo.call(void 0,
@@ -4587,7 +4686,7 @@ var useExternalMessageConverter = ({
4587
4686
  );
4588
4687
  return _react.useMemo.call(void 0, () => {
4589
4688
  const callbackResults = [];
4590
- for (const message of messages) {
4689
+ for (const message of messages2) {
4591
4690
  let result = state.callbackCache.get(message);
4592
4691
  if (!result) {
4593
4692
  const output = state.callback(message);
@@ -4625,7 +4724,7 @@ var useExternalMessageConverter = ({
4625
4724
  return newMessage;
4626
4725
  }
4627
4726
  );
4628
- }, [state, messages, isRunning]);
4727
+ }, [state, messages2, isRunning]);
4629
4728
  };
4630
4729
  var shallowArrayEqual = (a, b) => {
4631
4730
  if (a.length !== b.length) return false;
@@ -4643,13 +4742,13 @@ var DangerousInBrowserAdapter = class {
4643
4742
  constructor(options) {
4644
4743
  this.options = options;
4645
4744
  }
4646
- async *run({ messages, abortSignal, config }) {
4745
+ async *run({ messages: messages2, abortSignal, config }) {
4647
4746
  const res = await _chunk5KIEXJRKjs.getEdgeRuntimeStream.call(void 0, {
4648
4747
  options: this.options,
4649
4748
  abortSignal,
4650
4749
  requestData: {
4651
4750
  system: config.system,
4652
- messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages),
4751
+ messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages2),
4653
4752
  tools: config.tools ? _chunk5KIEXJRKjs.toLanguageModelTools.call(void 0, config.tools) : [],
4654
4753
  ...config.callSettings,
4655
4754
  ...config.config
@@ -4713,8 +4812,8 @@ var WebSpeechSynthesisAdapter = class {
4713
4812
  };
4714
4813
 
4715
4814
  // src/runtimes/attachment/SimpleImageAttachmentAdapter.ts
4716
- var SimpleImageAttachmentAdapter = (_class12 = class {constructor() { _class12.prototype.__init33.call(this); }
4717
- __init33() {this.accept = "image/*"}
4815
+ var SimpleImageAttachmentAdapter = (_class16 = class {constructor() { _class16.prototype.__init40.call(this); }
4816
+ __init40() {this.accept = "image/*"}
4718
4817
  async add(state) {
4719
4818
  return {
4720
4819
  id: state.file.name,
@@ -4736,7 +4835,7 @@ var SimpleImageAttachmentAdapter = (_class12 = class {constructor() { _class12.p
4736
4835
  }
4737
4836
  async remove() {
4738
4837
  }
4739
- }, _class12);
4838
+ }, _class16);
4740
4839
  var getFileDataURL = (file) => new Promise((resolve, reject) => {
4741
4840
  const reader = new FileReader();
4742
4841
  reader.onload = () => resolve(reader.result);
@@ -4745,8 +4844,8 @@ var getFileDataURL = (file) => new Promise((resolve, reject) => {
4745
4844
  });
4746
4845
 
4747
4846
  // src/runtimes/attachment/SimpleTextAttachmentAdapter.ts
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"}
4847
+ var SimpleTextAttachmentAdapter = (_class17 = class {constructor() { _class17.prototype.__init41.call(this); }
4848
+ __init41() {this.accept = "text/plain,text/html,text/markdown,text/csv,text/xml,text/json,text/css"}
4750
4849
  async add(state) {
4751
4850
  return {
4752
4851
  id: state.file.name,
@@ -4770,7 +4869,7 @@ ${await getFileText(attachment.file)}
4770
4869
  }
4771
4870
  async remove() {
4772
4871
  }
4773
- }, _class13);
4872
+ }, _class17);
4774
4873
  var getFileText = (file) => new Promise((resolve, reject) => {
4775
4874
  const reader = new FileReader();
4776
4875
  reader.onload = () => resolve(reader.result);
@@ -4864,7 +4963,7 @@ var ThreadConfigProvider = ({
4864
4963
  }) => {
4865
4964
  const hasAssistant = !!useAssistantRuntime({ optional: true });
4866
4965
  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 });
4867
- if (!_optionalChain([config, 'optionalAccess', _197 => _197.runtime])) return configProvider;
4966
+ if (!_optionalChain([config, 'optionalAccess', _237 => _237.runtime])) return configProvider;
4868
4967
  if (hasAssistant) {
4869
4968
  throw new Error(
4870
4969
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -5192,7 +5291,7 @@ var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: comp
5192
5291
  {
5193
5292
  components: {
5194
5293
  ...componentsProp,
5195
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _198 => _198.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5294
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _238 => _238.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5196
5295
  tools: toolsComponents
5197
5296
  }
5198
5297
  }
@@ -5335,7 +5434,7 @@ var ComposerAttachments = ({ components }) => {
5335
5434
  {
5336
5435
  components: {
5337
5436
  ...components,
5338
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _199 => _199.Attachment]), () => ( composer_attachment_default))
5437
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _239 => _239.Attachment]), () => ( composer_attachment_default))
5339
5438
  }
5340
5439
  }
5341
5440
  ) });
@@ -5467,7 +5566,7 @@ var ThreadWelcomeSuggestion = ({
5467
5566
  };
5468
5567
  var ThreadWelcomeSuggestions = () => {
5469
5568
  const { welcome: { suggestions } = {} } = useThreadConfig();
5470
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _200 => _200.map, 'call', _201 => _201((suggestion, idx) => {
5569
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _240 => _240.map, 'call', _241 => _241((suggestion, idx) => {
5471
5570
  const key = `${suggestion.prompt}-${idx}`;
5472
5571
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
5473
5572
  })]) });
@@ -5566,7 +5665,7 @@ var UserMessageContent = _react.forwardRef.call(void 0,
5566
5665
  {
5567
5666
  components: {
5568
5667
  ...components,
5569
- Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _202 => _202.Text]), () => ( content_part_default.Text))
5668
+ Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _242 => _242.Text]), () => ( content_part_default.Text))
5570
5669
  }
5571
5670
  }
5572
5671
  ) });
@@ -5584,7 +5683,7 @@ var UserMessageAttachments = ({
5584
5683
  {
5585
5684
  components: {
5586
5685
  ...components,
5587
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _203 => _203.Attachment]), () => ( user_message_attachment_default))
5686
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _243 => _243.Attachment]), () => ( user_message_attachment_default))
5588
5687
  }
5589
5688
  }
5590
5689
  ) }) });
@@ -5685,10 +5784,10 @@ var ThreadMessages = ({ components, ...rest }) => {
5685
5784
  thread_exports.Messages,
5686
5785
  {
5687
5786
  components: {
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))
5787
+ UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _244 => _244.UserMessage]), () => ( user_message_default)),
5788
+ EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _245 => _245.EditComposer]), () => ( edit_composer_default)),
5789
+ AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _246 => _246.AssistantMessage]), () => ( assistant_message_default)),
5790
+ SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _247 => _247.SystemMessage]), () => ( SystemMessage))
5692
5791
  },
5693
5792
  ...rest
5694
5793
  }
@@ -5908,5 +6007,7 @@ var assistant_modal_default = Object.assign(AssistantModal, exports13);
5908
6007
 
5909
6008
 
5910
6009
 
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;
6010
+
6011
+
6012
+ 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.useComposerRuntime = useComposerRuntime; exports.useComposerSend = useComposerSend; exports.useComposerStore = useComposerStore; exports.useContentPart = useContentPart; exports.useContentPartContext = useContentPartContext; exports.useContentPartDisplay = useContentPartDisplay; exports.useContentPartImage = useContentPartImage; exports.useContentPartRuntime = useContentPartRuntime; 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;
5912
6013
  //# sourceMappingURL=index.js.map