@assistant-ui/react 0.5.66 → 0.5.68

Sign up to get free protection for your applications and to get access to all the features.
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]);
@@ -282,13 +234,7 @@ var ThreadRuntimeProvider = ({ children, runtime }) => {
282
234
  useViewport
283
235
  };
284
236
  }, [useThread2, useThreadRuntime2, useThreadMessages2, useThreadComposer2]);
285
- const Synchronizer = context.useThread(
286
- (t) => t.unstable_synchronizer
287
- );
288
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ThreadContext.Provider, { value: context, children: [
289
- Synchronizer && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Synchronizer, {}),
290
- children
291
- ] });
237
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadContext.Provider, { value: context, children });
292
238
  };
293
239
 
294
240
  // src/context/providers/AssistantRuntimeProvider.tsx
@@ -331,11 +277,47 @@ var useContentPartContext = createContextHook(
331
277
  ContentPartContext,
332
278
  "a component passed to <MessagePrimitive.Content components={...}>"
333
279
  );
280
+ function useContentPartRuntime(options) {
281
+ const context = useContentPartContext(options);
282
+ if (!context) return null;
283
+ return context.useContentPartRuntime();
284
+ }
334
285
  var { useContentPart, useContentPartStore } = createContextStoreHook(
335
286
  useContentPartContext,
336
287
  "useContentPart"
337
288
  );
338
289
 
290
+ // src/api/ContentPartRuntime.ts
291
+ var ContentPartRuntime = class {
292
+ constructor(contentBinding, messageApi, threadApi) {
293
+ this.contentBinding = contentBinding;
294
+ this.messageApi = messageApi;
295
+ this.threadApi = threadApi;
296
+ }
297
+ getState() {
298
+ return this.contentBinding.getState();
299
+ }
300
+ addToolResult(result) {
301
+ const message = this.messageApi.getState();
302
+ if (!message) throw new Error("Message is not available");
303
+ const state = this.contentBinding.getState();
304
+ if (!state) throw new Error("Content part is not available");
305
+ if (state.type !== "tool-call")
306
+ throw new Error("Tried to add tool result to non-tool content part");
307
+ const toolName = state.toolName;
308
+ const toolCallId = state.toolCallId;
309
+ this.threadApi.getState().addToolResult({
310
+ messageId: message.id,
311
+ toolName,
312
+ toolCallId,
313
+ result
314
+ });
315
+ }
316
+ subscribe(callback) {
317
+ return this.contentBinding.subscribe(callback);
318
+ }
319
+ };
320
+
339
321
  // src/context/providers/TextContentPartProvider.tsx
340
322
 
341
323
  var COMPLETE_STATUS = {
@@ -346,18 +328,22 @@ var RUNNING_STATUS = {
346
328
  };
347
329
  var TextContentPartProvider = ({ children, text, isRunning }) => {
348
330
  const [context] = _react.useState.call(void 0, () => {
331
+ const useContentPartRuntime2 = _zustand.create.call(void 0,
332
+ // TODO
333
+ () => new ContentPartRuntime(null, null, null)
334
+ );
349
335
  const useContentPart2 = _zustand.create.call(void 0, () => ({
350
336
  status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,
351
- part: { type: "text", text }
337
+ part: { type: "text", text },
338
+ type: "text",
339
+ text
352
340
  }));
353
- return {
354
- useContentPart: useContentPart2
355
- };
341
+ return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
356
342
  });
357
343
  _react.useEffect.call(void 0, () => {
358
344
  const state = context.useContentPart.getState();
359
- const textUpdated = state.part.text !== text;
360
- const targetTextPart = textUpdated ? { type: "text", text } : state.part;
345
+ const textUpdated = state.text !== text;
346
+ const targetTextPart = textUpdated ? { type: "text", text } : state;
361
347
  const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;
362
348
  const statusUpdated = state.status !== targetStatus;
363
349
  if (!textUpdated && !statusUpdated) return;
@@ -400,20 +386,25 @@ var { useEditComposer, useEditComposerStore } = createContextStoreHook(
400
386
  // src/context/react/ComposerContext.ts
401
387
 
402
388
  var useComposerContext = () => {
403
- const { useComposer: useComposer2 } = useThreadContext();
389
+ const { useComposer: useThreadComposer2 } = useThreadContext();
404
390
  const { useEditComposer: useEditComposer2 } = _nullishCoalesce(useMessageContext({ optional: true }), () => ( {}));
405
391
  return _react.useMemo.call(void 0,
406
392
  () => ({
407
- useComposer: _nullishCoalesce(useEditComposer2, () => ( useComposer2)),
393
+ useComposer: _nullishCoalesce(useEditComposer2, () => ( useThreadComposer2)),
408
394
  type: useEditComposer2 ? "edit" : "new"
409
395
  }),
410
- [useEditComposer2, useComposer2]
396
+ [useEditComposer2, useThreadComposer2]
411
397
  );
412
398
  };
413
399
  var { useComposer, useComposerStore } = createContextStoreHook(
414
400
  useComposerContext,
415
401
  "useComposer"
416
402
  );
403
+ function useComposerRuntime(options) {
404
+ const messageRuntime = useMessageRuntime({ optional: true });
405
+ const threadRuntime = useThreadRuntime(options);
406
+ return messageRuntime ? messageRuntime.composer : _nullishCoalesce(_optionalChain([threadRuntime, 'optionalAccess', _5 => _5.composer]), () => ( null));
407
+ }
417
408
 
418
409
  // src/hooks/useAppendMessage.tsx
419
410
 
@@ -462,7 +453,7 @@ var useAssistantTool = (tool) => {
462
453
  const unsub2 = render ? toolUIsStore.getState().setToolUI(toolName, render) : void 0;
463
454
  return () => {
464
455
  unsub1();
465
- _optionalChain([unsub2, 'optionalCall', _5 => _5()]);
456
+ _optionalChain([unsub2, 'optionalCall', _6 => _6()]);
466
457
  };
467
458
  }, [assistantRuntime, toolUIsStore, tool]);
468
459
  };
@@ -579,12 +570,11 @@ var useActionBarCopy = ({
579
570
  // src/primitive-hooks/actionBar/useActionBarEdit.tsx
580
571
 
581
572
  var useActionBarEdit = () => {
582
- const editComposerStore = useEditComposerStore();
573
+ const messageRuntime = useMessageRuntime();
583
574
  const disabled = useEditComposer((c) => c.isEditing);
584
575
  const callback = _react.useCallback.call(void 0, () => {
585
- const { edit } = editComposerStore.getState();
586
- edit();
587
- }, [editComposerStore]);
576
+ messageRuntime.composer.beginEdit();
577
+ }, [messageRuntime]);
588
578
  if (disabled) return null;
589
579
  return callback;
590
580
  };
@@ -594,7 +584,7 @@ var useActionBarEdit = () => {
594
584
  var useActionBarReload = () => {
595
585
  const messageStore = useMessageStore();
596
586
  const threadStore = useThreadStore();
597
- const threadRuntime = useThreadRuntime();
587
+ const messageRuntime = useMessageRuntime();
598
588
  const threadComposerStore = useThreadComposerStore();
599
589
  const threadViewportStore = useThreadViewportStore();
600
590
  const disabled = useCombinedStore(
@@ -602,11 +592,10 @@ var useActionBarReload = () => {
602
592
  (t, m) => t.isRunning || t.isDisabled || m.role !== "assistant"
603
593
  );
604
594
  const callback = _react.useCallback.call(void 0, () => {
605
- const { parentId } = messageStore.getState();
606
- threadRuntime.startRun(parentId);
595
+ messageRuntime.reload();
607
596
  threadViewportStore.getState().scrollToBottom();
608
597
  threadComposerStore.getState().focus();
609
- }, [threadRuntime, threadComposerStore, threadViewportStore, messageStore]);
598
+ }, [messageRuntime, threadComposerStore, threadViewportStore]);
610
599
  if (disabled) return null;
611
600
  return callback;
612
601
  };
@@ -616,19 +605,18 @@ var useActionBarReload = () => {
616
605
  var useActionBarSpeak = () => {
617
606
  const messageStore = useMessageStore();
618
607
  const editComposerStore = useEditComposerStore();
619
- const threadRuntime = useThreadRuntime();
608
+ const messageRunime = useMessageRuntime();
620
609
  const messageUtilsStore = useMessageUtilsStore();
621
610
  const hasSpeakableContent = useCombinedStore(
622
611
  [messageStore, editComposerStore],
623
- ({ message }, c) => {
612
+ (message, c) => {
624
613
  return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
625
614
  }
626
615
  );
627
616
  const callback = _react.useCallback.call(void 0, async () => {
628
- const { message } = messageStore.getState();
629
- const utt = threadRuntime.speak(message.id);
617
+ const utt = messageRunime.speak();
630
618
  messageUtilsStore.getState().addUtterance(utt);
631
- }, [threadRuntime, messageStore, messageUtilsStore]);
619
+ }, [messageRunime, messageUtilsStore]);
632
620
  if (!hasSpeakableContent) return null;
633
621
  return callback;
634
622
  };
@@ -648,32 +636,28 @@ var useActionBarStopSpeaking = () => {
648
636
  // src/primitive-hooks/actionBar/useActionBarFeedbackPositive.tsx
649
637
 
650
638
  var useActionBarFeedbackPositive = () => {
651
- const threadRuntime = useThreadRuntime();
652
- const messageStore = useMessageStore();
639
+ const messageRuntime = useMessageRuntime();
653
640
  const messageUtilsStore = useMessageUtilsStore();
654
641
  const callback = _react.useCallback.call(void 0, () => {
655
- threadRuntime.submitFeedback({
656
- messageId: messageStore.getState().id,
642
+ messageRuntime.submitFeedback({
657
643
  type: "positive"
658
644
  });
659
645
  messageUtilsStore.getState().setSubmittedFeedback("positive");
660
- }, [messageStore, messageUtilsStore, threadRuntime]);
646
+ }, [messageUtilsStore, messageRuntime]);
661
647
  return callback;
662
648
  };
663
649
 
664
650
  // src/primitive-hooks/actionBar/useActionBarFeedbackNegative.tsx
665
651
 
666
652
  var useActionBarFeedbackNegative = () => {
667
- const threadRuntime = useThreadRuntime();
668
- const messageStore = useMessageStore();
653
+ const messageRuntime = useMessageRuntime();
669
654
  const messageUtilsStore = useMessageUtilsStore();
670
655
  const callback = _react.useCallback.call(void 0, () => {
671
- threadRuntime.submitFeedback({
672
- messageId: messageStore.getState().id,
656
+ messageRuntime.submitFeedback({
673
657
  type: "negative"
674
658
  });
675
659
  messageUtilsStore.getState().setSubmittedFeedback("negative");
676
- }, [messageStore, messageUtilsStore, threadRuntime]);
660
+ }, [messageUtilsStore, messageRuntime]);
677
661
  return callback;
678
662
  };
679
663
 
@@ -782,7 +766,7 @@ var useComposerAddAttachment = () => {
782
766
  input.accept = attachmentAccept;
783
767
  }
784
768
  input.onchange = (e) => {
785
- const file = _optionalChain([e, 'access', _6 => _6.target, 'access', _7 => _7.files, 'optionalAccess', _8 => _8[0]]);
769
+ const file = _optionalChain([e, 'access', _7 => _7.target, 'access', _8 => _8.files, 'optionalAccess', _9 => _9[0]]);
786
770
  if (!file) return;
787
771
  addAttachment(file);
788
772
  };
@@ -795,7 +779,7 @@ var useComposerAddAttachment = () => {
795
779
  // src/primitive-hooks/contentPart/useContentPartDisplay.tsx
796
780
  var useContentPartDisplay = () => {
797
781
  const display = useContentPart((c) => {
798
- if (c.part.type !== "ui")
782
+ if (c.type !== "ui")
799
783
  throw new Error(
800
784
  "This component can only be used inside ui content parts."
801
785
  );
@@ -807,7 +791,7 @@ var useContentPartDisplay = () => {
807
791
  // src/primitive-hooks/contentPart/useContentPartImage.tsx
808
792
  var useContentPartImage = () => {
809
793
  const image = useContentPart((c) => {
810
- if (c.part.type !== "image")
794
+ if (c.type !== "image")
811
795
  throw new Error(
812
796
  "ContentPartImage can only be used inside image content parts."
813
797
  );
@@ -819,7 +803,7 @@ var useContentPartImage = () => {
819
803
  // src/primitive-hooks/contentPart/useContentPartText.tsx
820
804
  var useContentPartText = () => {
821
805
  const text = useContentPart((c) => {
822
- if (c.part.type !== "text")
806
+ if (c.type !== "text")
823
807
  throw new Error(
824
808
  "ContentPartText can only be used inside text content parts."
825
809
  );
@@ -857,20 +841,15 @@ var useMessageIf = (props) => {
857
841
 
858
842
  // src/primitive-hooks/thread/useThreadIf.tsx
859
843
  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
- );
844
+ return useThread((thread) => {
845
+ if (props.empty === true && thread.messages.length !== 0) return false;
846
+ if (props.empty === false && thread.messages.length === 0) return false;
847
+ if (props.running === true && !thread.isRunning) return false;
848
+ if (props.running === false && thread.isRunning) return false;
849
+ if (props.disabled === true && thread.isDisabled) return false;
850
+ if (props.disabled === false && thread.isDisabled) return false;
851
+ return true;
852
+ });
874
853
  };
875
854
 
876
855
  // src/primitive-hooks/thread/useThreadEmpty.tsx
@@ -993,7 +972,7 @@ var ActionBarPrimitiveCopy = _react.forwardRef.call(void 0, ({ copiedDuration, o
993
972
  ref: forwardedRef,
994
973
  disabled: disabled || !callback,
995
974
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
996
- _optionalChain([callback, 'optionalCall', _9 => _9()]);
975
+ _optionalChain([callback, 'optionalCall', _10 => _10()]);
997
976
  })
998
977
  }
999
978
  );
@@ -1025,7 +1004,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
1025
1004
  ref: forwardedRef,
1026
1005
  disabled: primitiveProps.disabled || !callback,
1027
1006
  onClick: _primitive.composeEventHandlers.call(void 0, primitiveProps.onClick, () => {
1028
- _optionalChain([callback, 'optionalCall', _10 => _10()]);
1007
+ _optionalChain([callback, 'optionalCall', _11 => _11()]);
1029
1008
  })
1030
1009
  }
1031
1010
  );
@@ -1074,7 +1053,7 @@ var ActionBarPrimitiveStopSpeaking = _react.forwardRef.call(void 0, (props, ref)
1074
1053
  ...props,
1075
1054
  ref,
1076
1055
  onClick: _primitive.composeEventHandlers.call(void 0, props.onClick, () => {
1077
- _optionalChain([callback, 'optionalCall', _11 => _11()]);
1056
+ _optionalChain([callback, 'optionalCall', _12 => _12()]);
1078
1057
  })
1079
1058
  }
1080
1059
  );
@@ -1100,7 +1079,7 @@ var ActionBarPrimitiveFeedbackPositive = _react.forwardRef.call(void 0, ({ onCli
1100
1079
  ref: forwardedRef,
1101
1080
  disabled: disabled || !callback,
1102
1081
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
1103
- _optionalChain([callback, 'optionalCall', _12 => _12()]);
1082
+ _optionalChain([callback, 'optionalCall', _13 => _13()]);
1104
1083
  })
1105
1084
  }
1106
1085
  );
@@ -1126,7 +1105,7 @@ var ActionBarPrimitiveFeedbackNegative = _react.forwardRef.call(void 0, ({ onCli
1126
1105
  ref: forwardedRef,
1127
1106
  disabled: disabled || !callback,
1128
1107
  onClick: _primitive.composeEventHandlers.call(void 0, onClick, () => {
1129
- _optionalChain([callback, 'optionalCall', _13 => _13()]);
1108
+ _optionalChain([callback, 'optionalCall', _14 => _14()]);
1130
1109
  })
1131
1110
  }
1132
1111
  );
@@ -1381,74 +1360,35 @@ MessagePrimitiveIf.displayName = "MessagePrimitive.If";
1381
1360
  // src/primitives/message/MessageContent.tsx
1382
1361
 
1383
1362
 
1384
- // src/context/providers/ContentPartProvider.tsx
1363
+ // src/context/providers/ContentPartRuntimeProvider.tsx
1385
1364
 
1386
1365
 
1387
1366
 
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 });
1367
+ var useContentPartRuntimeStore = (runtime) => {
1368
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime));
1369
+ _react.useEffect.call(void 0, () => {
1370
+ writableStore(store).setState(runtime, true);
1371
+ }, [runtime, store]);
1372
+ return store;
1423
1373
  };
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
- });
1374
+ var useContentPartStore2 = (runtime) => {
1375
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
1432
1376
  _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;
1377
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
1378
+ updateState();
1379
+ return runtime.subscribe(updateState);
1380
+ }, [runtime, store]);
1381
+ return store;
1446
1382
  };
1447
- var ContentPartProvider = ({
1448
- partIndex,
1383
+ var ContentPartRuntimeProvider = ({
1384
+ runtime,
1449
1385
  children
1450
1386
  }) => {
1451
- const context = useContentPartContext2(partIndex);
1387
+ const useContentPartRuntime2 = useContentPartRuntimeStore(runtime);
1388
+ const useContentPart2 = useContentPartStore2(runtime);
1389
+ const [context] = _react.useState.call(void 0, () => {
1390
+ return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
1391
+ });
1452
1392
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartContext.Provider, { value: context, children });
1453
1393
  };
1454
1394
 
@@ -1493,7 +1433,7 @@ var withSmoothContextProvider = (Component) => {
1493
1433
  };
1494
1434
  function useSmoothContext(options) {
1495
1435
  const context = _react.useContext.call(void 0, SmoothContext);
1496
- if (!_optionalChain([options, 'optionalAccess', _16 => _16.optional]) && !context)
1436
+ if (!_optionalChain([options, 'optionalAccess', _15 => _15.optional]) && !context)
1497
1437
  throw new Error(
1498
1438
  "This component must be used within a SmoothContextProvider."
1499
1439
  );
@@ -1553,9 +1493,7 @@ var SMOOTH_STATUS = Object.freeze({
1553
1493
  type: "running"
1554
1494
  });
1555
1495
  var useSmooth = (state, smooth = false) => {
1556
- const {
1557
- part: { text }
1558
- } = state;
1496
+ const { text } = state;
1559
1497
  const id = useMessage({
1560
1498
  optional: true,
1561
1499
  selector: (m) => m.id
@@ -1567,17 +1505,17 @@ var useSmooth = (state, smooth = false) => {
1567
1505
  setDisplayedText(text2);
1568
1506
  if (smoothStatusStore) {
1569
1507
  writableStore(smoothStatusStore).setState(
1570
- text2 !== state.part.text ? SMOOTH_STATUS : state.status
1508
+ text2 !== state.text ? SMOOTH_STATUS : state.status
1571
1509
  );
1572
1510
  }
1573
1511
  });
1574
1512
  _react.useEffect.call(void 0, () => {
1575
1513
  if (smoothStatusStore) {
1576
1514
  writableStore(smoothStatusStore).setState(
1577
- text !== state.part.text ? SMOOTH_STATUS : state.status
1515
+ text !== state.text ? SMOOTH_STATUS : state.status
1578
1516
  );
1579
1517
  }
1580
- }, [smoothStatusStore, text, displayedText, state.status, state.part.text]);
1518
+ }, [smoothStatusStore, text, displayedText, state.status, state.text]);
1581
1519
  const [animatorRef] = _react.useState.call(void 0,
1582
1520
  new TextStreamAnimator(text, setText)
1583
1521
  );
@@ -1604,6 +1542,8 @@ var useSmooth = (state, smooth = false) => {
1604
1542
  }, [animatorRef]);
1605
1543
  return _react.useMemo.call(void 0,
1606
1544
  () => smooth ? {
1545
+ type: "text",
1546
+ text: displayedText,
1607
1547
  part: { type: "text", text: displayedText },
1608
1548
  status: text === displayedText ? state.status : SMOOTH_STATUS
1609
1549
  } : state,
@@ -1614,10 +1554,7 @@ var useSmooth = (state, smooth = false) => {
1614
1554
  // src/primitives/contentPart/ContentPartText.tsx
1615
1555
 
1616
1556
  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);
1557
+ const { text, status } = useSmooth(useContentPartText(), smooth);
1621
1558
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, { "data-status": status.type, ...rest, ref: forwardedRef, children: text });
1622
1559
  });
1623
1560
  ContentPartPrimitiveText.displayName = "ContentPartPrimitive.Text";
@@ -1627,18 +1564,14 @@ ContentPartPrimitiveText.displayName = "ContentPartPrimitive.Text";
1627
1564
 
1628
1565
 
1629
1566
  var ContentPartPrimitiveImage = _react.forwardRef.call(void 0, (props, forwardedRef) => {
1630
- const {
1631
- part: { image }
1632
- } = useContentPartImage();
1567
+ const { image } = useContentPartImage();
1633
1568
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactprimitive.Primitive.img, { src: image, ...props, ref: forwardedRef });
1634
1569
  });
1635
1570
  ContentPartPrimitiveImage.displayName = "ContentPartPrimitive.Image";
1636
1571
 
1637
1572
  // src/primitives/contentPart/ContentPartDisplay.tsx
1638
1573
  var ContentPartPrimitiveDisplay = () => {
1639
- const {
1640
- part: { display }
1641
- } = useContentPartDisplay();
1574
+ const { display } = useContentPartDisplay();
1642
1575
  return _nullishCoalesce(display, () => ( null));
1643
1576
  };
1644
1577
  ContentPartPrimitiveDisplay.displayName = "ContentPartPrimitive.Display";
@@ -1650,190 +1583,747 @@ var ContentPartPrimitiveInProgress = ({ children }) => {
1650
1583
  };
1651
1584
  ContentPartPrimitiveInProgress.displayName = "ContentPartPrimitive.InProgress";
1652
1585
 
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 });
1662
- };
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, {})
1586
+ // src/api/AttachmentRuntime.ts
1587
+ var AttachmentRuntime = class {
1588
+ constructor(_core) {
1589
+ this._core = _core;
1590
+ }
1591
+ getState() {
1592
+ return this._core.getState();
1593
+ }
1594
+ subscribe(callback) {
1595
+ return this._core.subscribe(callback);
1596
+ }
1670
1597
  };
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}`);
1598
+ var ComposerAttachmentRuntime = class extends AttachmentRuntime {
1599
+ constructor(core, _composerApi) {
1600
+ super(core);
1601
+ this._composerApi = _composerApi;
1602
+ }
1603
+ remove() {
1604
+ const core = this._composerApi.getState();
1605
+ if (!core) throw new Error("Composer is not available");
1606
+ return core.removeAttachment(this.getState().id);
1721
1607
  }
1722
1608
  };
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 }) });
1609
+ var ThreadComposerAttachmentRuntime = class extends ComposerAttachmentRuntime {
1610
+ get source() {
1611
+ return "thread-composer";
1612
+ }
1728
1613
  };
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));
1614
+ var EditComposerAttachmentRuntime = class extends ComposerAttachmentRuntime {
1615
+ get source() {
1616
+ return "edit-composer";
1617
+ }
1738
1618
  };
1739
- MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
1740
-
1741
- // src/primitives/message/MessageInProgress.tsx
1742
- var MessagePrimitiveInProgress = () => {
1743
- return null;
1619
+ var MessageAttachmentRuntime = class extends AttachmentRuntime {
1620
+ get source() {
1621
+ return "message";
1622
+ }
1623
+ constructor(core) {
1624
+ super(core);
1625
+ }
1626
+ remove() {
1627
+ throw new Error("Message attachments cannot be removed");
1628
+ }
1744
1629
  };
1745
- MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
1746
-
1747
- // src/primitives/message/MessageAttachments.tsx
1748
1630
 
1631
+ // src/api/subscribable/BaseSubject.ts
1632
+ var BaseSubject = (_class2 = class {constructor() { _class2.prototype.__init5.call(this); }
1633
+ __init5() {this._subscriptions = /* @__PURE__ */ new Set()}
1634
+
1635
+ get isConnected() {
1636
+ return !!this._connection;
1637
+ }
1638
+ notifySubscribers() {
1639
+ for (const callback of this._subscriptions) callback();
1640
+ }
1641
+ _updateConnection() {
1642
+ if (this._subscriptions.size > 0) {
1643
+ if (this._connection) return;
1644
+ this._connection = this._connect();
1645
+ } else {
1646
+ _optionalChain([this, 'access', _16 => _16._connection, 'optionalCall', _17 => _17()]);
1647
+ this._connection = void 0;
1648
+ }
1649
+ }
1650
+ subscribe(callback) {
1651
+ this._subscriptions.add(callback);
1652
+ this._updateConnection();
1653
+ return () => {
1654
+ this._subscriptions.delete(callback);
1655
+ this._updateConnection();
1656
+ };
1657
+ }
1658
+ }, _class2);
1749
1659
 
1750
- // src/context/react/AttachmentContext.ts
1660
+ // src/api/subscribable/SKIP_UPDATE.ts
1661
+ var SKIP_UPDATE = Symbol("skip-update");
1751
1662
 
1752
- var AttachmentContext = _react.createContext.call(void 0,
1753
- null
1754
- );
1663
+ // src/api/subscribable/LazyMemoizeSubject.ts
1664
+ var LazyMemoizeSubject = (_class3 = class extends BaseSubject {
1665
+ constructor(binding) {
1666
+ super();_class3.prototype.__init6.call(this);_class3.prototype.__init7.call(this);;
1667
+ this.binding = binding;
1668
+ }
1669
+ __init6() {this._previousStateDirty = true}
1670
+
1671
+ __init7() {this.getState = () => {
1672
+ if (!this.isConnected || this._previousStateDirty) {
1673
+ const newState = this.binding.getState();
1674
+ if (newState !== SKIP_UPDATE) {
1675
+ this._previousState = newState;
1676
+ }
1677
+ this._previousStateDirty = false;
1678
+ }
1679
+ if (this._previousState === void 0)
1680
+ throw new Error("Entry not available in the store");
1681
+ return this._previousState;
1682
+ }}
1683
+ _connect() {
1684
+ const callback = () => {
1685
+ this._previousStateDirty = true;
1686
+ this.notifySubscribers();
1687
+ };
1688
+ return this.binding.subscribe(callback);
1689
+ }
1690
+ }, _class3);
1691
+
1692
+ // src/api/subscribable/shallowEqual.ts
1693
+ function shallowEqual(objA, objB) {
1694
+ if (objA === void 0 && objB === void 0) return true;
1695
+ if (objA === void 0) return false;
1696
+ if (objB === void 0) return false;
1697
+ for (const key of Object.keys(objA)) {
1698
+ const valueA = objA[key];
1699
+ const valueB = objB[key];
1700
+ if (!Object.is(valueA, valueB)) return false;
1701
+ }
1702
+ return true;
1703
+ }
1704
+
1705
+ // src/api/subscribable/ShallowMemoizeSubject.ts
1706
+ var ShallowMemoizeSubject = (_class4 = class extends BaseSubject {
1707
+ constructor(binding) {
1708
+ super();_class4.prototype.__init8.call(this);;
1709
+ this.binding = binding;
1710
+ const state = binding.getState();
1711
+ if (state === SKIP_UPDATE)
1712
+ throw new Error("Entry not available in the store");
1713
+ this._previousState = state;
1714
+ }
1715
+
1716
+ __init8() {this.getState = () => {
1717
+ if (!this.isConnected) this._syncState();
1718
+ return this._previousState;
1719
+ }}
1720
+ _syncState() {
1721
+ const state = this.binding.getState();
1722
+ if (state === SKIP_UPDATE) return false;
1723
+ if (shallowEqual(state, this._previousState)) return false;
1724
+ this._previousState = state;
1725
+ return true;
1726
+ }
1727
+ _connect() {
1728
+ const callback = () => {
1729
+ if (this._syncState()) {
1730
+ this.notifySubscribers();
1731
+ }
1732
+ };
1733
+ return this.binding.subscribe(callback);
1734
+ }
1735
+ }, _class4);
1736
+
1737
+ // src/api/ComposerRuntime.ts
1738
+ var METHOD_NOT_SUPPORTED = () => {
1739
+ throw new Error("Composer is not available");
1740
+ };
1741
+ var EMPTY_ARRAY = Object.freeze([]);
1742
+ var getThreadComposerState = (runtime, focus, onFocus) => {
1743
+ return Object.freeze({
1744
+ type: "thread",
1745
+ isEditing: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _18 => _18.isEditing]), () => ( false)),
1746
+ canCancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _19 => _19.canCancel]), () => ( false)),
1747
+ isEmpty: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _20 => _20.isEmpty]), () => ( true)),
1748
+ text: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _21 => _21.text]), () => ( "")),
1749
+ attachments: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _22 => _22.attachments]), () => ( EMPTY_ARRAY)),
1750
+ attachmentAccept: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _23 => _23.attachmentAccept]), () => ( "*")),
1751
+ value: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _24 => _24.text]), () => ( "")),
1752
+ setValue: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _25 => _25.setText, 'access', _26 => _26.bind, 'call', _27 => _27(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1753
+ setText: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _28 => _28.setText, 'access', _29 => _29.bind, 'call', _30 => _30(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1754
+ // edit: beginEdit,
1755
+ send: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _31 => _31.send, 'access', _32 => _32.bind, 'call', _33 => _33(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1756
+ cancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _34 => _34.cancel, 'access', _35 => _35.bind, 'call', _36 => _36(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1757
+ focus,
1758
+ onFocus,
1759
+ reset: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _37 => _37.reset, 'access', _38 => _38.bind, 'call', _39 => _39(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1760
+ addAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _40 => _40.addAttachment, 'access', _41 => _41.bind, 'call', _42 => _42(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1761
+ removeAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _43 => _43.removeAttachment, 'access', _44 => _44.bind, 'call', _45 => _45(runtime)]), () => ( METHOD_NOT_SUPPORTED))
1762
+ });
1763
+ };
1764
+ var getEditComposerState = (runtime, beginEdit) => {
1765
+ return Object.freeze({
1766
+ type: "edit",
1767
+ isEditing: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _46 => _46.isEditing]), () => ( false)),
1768
+ canCancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _47 => _47.canCancel]), () => ( false)),
1769
+ isEmpty: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _48 => _48.isEmpty]), () => ( true)),
1770
+ text: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _49 => _49.text]), () => ( "")),
1771
+ attachments: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _50 => _50.attachments]), () => ( EMPTY_ARRAY)),
1772
+ attachmentAccept: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _51 => _51.attachmentAccept]), () => ( "*")),
1773
+ value: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _52 => _52.text]), () => ( "")),
1774
+ setValue: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _53 => _53.setText, 'access', _54 => _54.bind, 'call', _55 => _55(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1775
+ setText: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _56 => _56.setText, 'access', _57 => _57.bind, 'call', _58 => _58(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1776
+ edit: beginEdit,
1777
+ send: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _59 => _59.send, 'access', _60 => _60.bind, 'call', _61 => _61(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1778
+ cancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _62 => _62.cancel, 'access', _63 => _63.bind, 'call', _64 => _64(runtime)]), () => ( METHOD_NOT_SUPPORTED))
1779
+ });
1780
+ };
1781
+ var ComposerRuntime = class {
1782
+ constructor(_core) {
1783
+ this._core = _core;
1784
+ }
1785
+ /**
1786
+ * @deprecated Use `getState().isEditing` instead. This will be removed in 0.6.0.
1787
+ */
1788
+ get isEditing() {
1789
+ return this.getState().isEditing;
1790
+ }
1791
+ /**
1792
+ * @deprecated Use `getState().isEmpty` instead. This will be removed in 0.6.0.
1793
+ */
1794
+ get isEmpty() {
1795
+ return this.getState().isEmpty;
1796
+ }
1797
+ /**
1798
+ * @deprecated Use `getState().canCancel` instead. This will be removed in 0.6.0.
1799
+ */
1800
+ get canCancel() {
1801
+ return this.getState().canCancel;
1802
+ }
1803
+ /**
1804
+ * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
1805
+ */
1806
+ get text() {
1807
+ return this.getState().text;
1808
+ }
1809
+ /**
1810
+ * @deprecated Use `getState().attachmentAccept` instead. This will be removed in 0.6.0.
1811
+ */
1812
+ get attachmentAccept() {
1813
+ return this.getState().attachmentAccept;
1814
+ }
1815
+ /**
1816
+ * @deprecated Use `getState().attachments` instead. This will be removed in 0.6.0.
1817
+ */
1818
+ get attachments() {
1819
+ return this.getState().attachments;
1820
+ }
1821
+ /**
1822
+ * @deprecated Use `getState().text` instead. This will be removed in 0.6.0.
1823
+ */
1824
+ get value() {
1825
+ return this.text;
1826
+ }
1827
+ setText(text) {
1828
+ const core = this._core.getState();
1829
+ if (!core) throw new Error("Composer is not available");
1830
+ core.setText(text);
1831
+ }
1832
+ setValue(text) {
1833
+ this.setText(text);
1834
+ }
1835
+ addAttachment(file) {
1836
+ const core = this._core.getState();
1837
+ if (!core) throw new Error("Composer is not available");
1838
+ return core.addAttachment(file);
1839
+ }
1840
+ // /**
1841
+ // * @deprecated Use `getAttachmentById(id).removeAttachment` instead. This will be removed in 0.6.0.
1842
+ // */
1843
+ removeAttachment(attachmentId) {
1844
+ const core = this._core.getState();
1845
+ if (!core) throw new Error("Composer is not available");
1846
+ return core.removeAttachment(attachmentId);
1847
+ }
1848
+ /**
1849
+ * @deprecated This method will be removed in 0.6.0. Submit feedback if you need this functionality.
1850
+ */
1851
+ reset() {
1852
+ const core = this._core.getState();
1853
+ if (!core) throw new Error("Composer is not available");
1854
+ core.reset();
1855
+ }
1856
+ send() {
1857
+ const core = this._core.getState();
1858
+ if (!core) throw new Error("Composer is not available");
1859
+ core.send();
1860
+ }
1861
+ cancel() {
1862
+ const core = this._core.getState();
1863
+ if (!core) throw new Error("Composer is not available");
1864
+ core.cancel();
1865
+ }
1866
+ subscribe(callback) {
1867
+ return this._core.subscribe(callback);
1868
+ }
1869
+ };
1870
+ var ThreadComposerRuntime = (_class5 = class extends ComposerRuntime {
1871
+ get type() {
1872
+ return "thread";
1873
+ }
1874
+
1875
+ constructor(core) {
1876
+ const stateBinding = new LazyMemoizeSubject({
1877
+ getState: () => getThreadComposerState(
1878
+ core.getState(),
1879
+ this.focus.bind(this),
1880
+ this.onFocus.bind(this)
1881
+ ),
1882
+ subscribe: (callback) => core.subscribe(callback)
1883
+ });
1884
+ super({
1885
+ getState: () => core.getState(),
1886
+ subscribe: (callback) => stateBinding.subscribe(callback)
1887
+ });_class5.prototype.__init9.call(this);;
1888
+ this._getState = stateBinding.getState.bind(stateBinding);
1889
+ }
1890
+ get attachments() {
1891
+ return _nullishCoalesce(_optionalChain([this, 'access', _65 => _65.getState, 'call', _66 => _66(), 'optionalAccess', _67 => _67.attachments]), () => ( EMPTY_ARRAY));
1892
+ }
1893
+ getState() {
1894
+ return this._getState();
1895
+ }
1896
+ // TODO replace with events
1897
+ __init9() {this._focusListeners = /* @__PURE__ */ new Set()}
1898
+ focus() {
1899
+ this._focusListeners.forEach((callback) => callback());
1900
+ }
1901
+ onFocus(callback) {
1902
+ this._focusListeners.add(callback);
1903
+ return () => this._focusListeners.delete(callback);
1904
+ }
1905
+ unstable_getAttachmentByIndex(idx) {
1906
+ return new ThreadComposerAttachmentRuntime(
1907
+ new ShallowMemoizeSubject({
1908
+ getState: () => {
1909
+ const attachments = this.getState().attachments;
1910
+ const attachment = attachments[idx];
1911
+ if (!attachment) return SKIP_UPDATE;
1912
+ return {
1913
+ ...attachment,
1914
+ attachment,
1915
+ source: "thread-composer"
1916
+ };
1917
+ },
1918
+ subscribe: (callback) => this._core.subscribe(callback)
1919
+ }),
1920
+ this._core
1921
+ );
1922
+ }
1923
+ }, _class5);
1924
+ var EditComposerRuntime = class extends ComposerRuntime {
1925
+ constructor(core, _beginEdit) {
1926
+ const stateBinding = new LazyMemoizeSubject({
1927
+ getState: () => getEditComposerState(core.getState(), this._beginEdit),
1928
+ subscribe: (callback) => core.subscribe(callback)
1929
+ });
1930
+ super({
1931
+ getState: () => core.getState(),
1932
+ subscribe: (callback) => stateBinding.subscribe(callback)
1933
+ });
1934
+ this._beginEdit = _beginEdit;
1935
+ this._getState = stateBinding.getState.bind(stateBinding);
1936
+ }
1937
+ get type() {
1938
+ return "edit";
1939
+ }
1940
+
1941
+ getState() {
1942
+ return this._getState();
1943
+ }
1944
+ beginEdit() {
1945
+ this._beginEdit();
1946
+ }
1947
+ /**
1948
+ * @deprecated Use `beginEdit()` instead. This will be removed in 0.6.0.
1949
+ */
1950
+ edit() {
1951
+ this.beginEdit();
1952
+ }
1953
+ unstable_getAttachmentByIndex(idx) {
1954
+ return new EditComposerAttachmentRuntime(
1955
+ new ShallowMemoizeSubject({
1956
+ getState: () => {
1957
+ const attachments = this.getState().attachments;
1958
+ const attachment = attachments[idx];
1959
+ if (!attachment) return SKIP_UPDATE;
1960
+ return {
1961
+ ...attachment,
1962
+ attachment,
1963
+ source: "edit-composer"
1964
+ };
1965
+ },
1966
+ subscribe: (callback) => this._core.subscribe(callback)
1967
+ }),
1968
+ this._core
1969
+ );
1970
+ }
1971
+ };
1972
+
1973
+ // src/api/subscribable/NestedSubscriptionSubject.ts
1974
+ var NestedSubscriptionSubject = class extends BaseSubject {
1975
+ constructor(binding) {
1976
+ super();
1977
+ this.binding = binding;
1978
+ }
1979
+ getState() {
1980
+ return this.binding.getState();
1981
+ }
1982
+ _connect() {
1983
+ const callback = () => {
1984
+ this.notifySubscribers();
1985
+ };
1986
+ let lastState = this.binding.getState();
1987
+ let innerUnsubscribe = _optionalChain([lastState, 'optionalAccess', _68 => _68.subscribe, 'call', _69 => _69(callback)]);
1988
+ const onRuntimeUpdate = () => {
1989
+ const newState = this.binding.getState();
1990
+ if (newState === lastState) return;
1991
+ lastState = newState;
1992
+ _optionalChain([innerUnsubscribe, 'optionalCall', _70 => _70()]);
1993
+ innerUnsubscribe = _optionalChain([this, 'access', _71 => _71.binding, 'access', _72 => _72.getState, 'call', _73 => _73(), 'optionalAccess', _74 => _74.subscribe, 'call', _75 => _75(callback)]);
1994
+ callback();
1995
+ };
1996
+ const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
1997
+ return () => {
1998
+ _optionalChain([outerUnsubscribe, 'optionalCall', _76 => _76()]);
1999
+ _optionalChain([innerUnsubscribe, 'optionalCall', _77 => _77()]);
2000
+ };
2001
+ }
2002
+ };
2003
+
2004
+ // src/api/MessageRuntime.ts
2005
+ var COMPLETE_STATUS2 = {
2006
+ type: "complete"
2007
+ };
2008
+ var toContentPartStatus = (message, partIndex, part) => {
2009
+ if (message.role !== "assistant") return COMPLETE_STATUS2;
2010
+ const isLastPart = partIndex === Math.max(0, message.content.length - 1);
2011
+ if (part.type !== "tool-call") {
2012
+ if ("reason" in message.status && message.status.reason === "tool-calls" && isLastPart)
2013
+ throw new Error(
2014
+ "Encountered unexpected requires-action status. This is likely an internal bug in assistant-ui."
2015
+ );
2016
+ return isLastPart ? message.status : COMPLETE_STATUS2;
2017
+ }
2018
+ if (!!part.result) {
2019
+ return COMPLETE_STATUS2;
2020
+ }
2021
+ return message.status;
2022
+ };
2023
+ var EMPTY_CONTENT = Object.freeze({ type: "text", text: "" });
2024
+ var getContentPartState = (message, partIndex) => {
2025
+ let part = message.content[partIndex];
2026
+ if (!part) {
2027
+ if (message.content.length === 0 && partIndex === 0) {
2028
+ part = EMPTY_CONTENT;
2029
+ } else {
2030
+ return SKIP_UPDATE;
2031
+ }
2032
+ } else if (message.content.length === 1 && part.type === "text" && part.text.length === 0) {
2033
+ part = EMPTY_CONTENT;
2034
+ }
2035
+ const status = toContentPartStatus(message, partIndex, part);
2036
+ return Object.freeze({ ...part, part, status });
2037
+ };
2038
+ var MessageRuntime = (_class6 = class {
2039
+ constructor(_core, _threadBinding) {;_class6.prototype.__init10.call(this);
2040
+ this._core = _core;
2041
+ this._threadBinding = _threadBinding;
2042
+ }
2043
+ __init10() {this.composer = new EditComposerRuntime(
2044
+ new NestedSubscriptionSubject({
2045
+ getState: () => this._threadBinding.getState().getEditComposer(this._core.getState().id),
2046
+ subscribe: (callback) => this._threadBinding.subscribe(callback)
2047
+ }),
2048
+ () => this._threadBinding.getState().beginEdit(this._core.getState().id)
2049
+ )}
2050
+ getState() {
2051
+ return this._core.getState();
2052
+ }
2053
+ // TODO improve type
2054
+ unstable_edit(message) {
2055
+ const state = this._core.getState();
2056
+ if (!state) throw new Error("Message is not available");
2057
+ this._threadBinding.getState().append({
2058
+ ...message,
2059
+ parentId: state.parentId
2060
+ });
2061
+ }
2062
+ reload() {
2063
+ const state = this._core.getState();
2064
+ if (!state) throw new Error("Message is not available");
2065
+ if (state.role !== "assistant")
2066
+ throw new Error("Can only reload assistant messages");
2067
+ this._threadBinding.getState().startRun(state.parentId);
2068
+ }
2069
+ speak() {
2070
+ const state = this._core.getState();
2071
+ if (!state) throw new Error("Message is not available");
2072
+ return this._threadBinding.getState().speak(state.id);
2073
+ }
2074
+ submitFeedback({ type }) {
2075
+ const state = this._core.getState();
2076
+ if (!state) throw new Error("Message is not available");
2077
+ this._threadBinding.getState().submitFeedback({
2078
+ messageId: state.id,
2079
+ type
2080
+ });
2081
+ }
2082
+ switchToBranch({
2083
+ position,
2084
+ branchId
2085
+ }) {
2086
+ const state = this._core.getState();
2087
+ if (!state) throw new Error("Message is not available");
2088
+ if (branchId && position) {
2089
+ throw new Error("May not specify both branchId and position");
2090
+ } else if (!branchId && !position) {
2091
+ throw new Error("Must specify either branchId or position");
2092
+ }
2093
+ const thread = this._threadBinding.getState();
2094
+ const branches = thread.getBranches(state.id);
2095
+ let targetBranch = branchId;
2096
+ if (position === "previous") {
2097
+ targetBranch = branches[state.branchNumber - 2];
2098
+ } else if (position === "next") {
2099
+ targetBranch = branches[state.branchNumber];
2100
+ }
2101
+ if (!targetBranch) throw new Error("Branch not found");
2102
+ this._threadBinding.getState().switchToBranch(targetBranch);
2103
+ }
2104
+ subscribe(callback) {
2105
+ return this._core.subscribe(callback);
2106
+ }
2107
+ unstable_getContentPartByIndex(idx) {
2108
+ if (idx < 0) throw new Error("Message index must be >= 0");
2109
+ return new ContentPartRuntime(
2110
+ new ShallowMemoizeSubject({
2111
+ getState: () => {
2112
+ return getContentPartState(this.getState(), idx);
2113
+ },
2114
+ subscribe: (callback) => this._core.subscribe(callback)
2115
+ }),
2116
+ this._core,
2117
+ this._threadBinding
2118
+ );
2119
+ }
2120
+ unstable_getAttachmentByIndex(idx) {
2121
+ return new MessageAttachmentRuntime(
2122
+ new ShallowMemoizeSubject({
2123
+ getState: () => {
2124
+ const attachments = this.getState().attachments;
2125
+ const attachment = _optionalChain([attachments, 'optionalAccess', _78 => _78[idx]]);
2126
+ if (!attachment) return SKIP_UPDATE;
2127
+ return {
2128
+ ...attachment,
2129
+ attachment,
2130
+ source: "message"
2131
+ };
2132
+ },
2133
+ subscribe: (callback) => this._core.subscribe(callback)
2134
+ })
2135
+ );
2136
+ }
2137
+ }, _class6);
2138
+
2139
+ // src/primitives/message/MessageContent.tsx
2140
+
2141
+ var ToolUIDisplay = ({
2142
+ UI,
2143
+ ...props
2144
+ }) => {
2145
+ const Render = _nullishCoalesce(useToolUIs((s) => s.getToolUI(props.toolName)), () => ( UI));
2146
+ if (!Render) return null;
2147
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Render, { ...props });
2148
+ };
2149
+ var defaultComponents = {
2150
+ Text: () => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { style: { whiteSpace: "pre-line" }, children: [
2151
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveText, {}),
2152
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveInProgress, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { style: { fontFamily: "revert" }, children: " \u25CF" }) })
2153
+ ] }),
2154
+ Image: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveImage, {}),
2155
+ UI: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveDisplay, {})
2156
+ };
2157
+ var MessageContentPartComponent = ({
2158
+ components: {
2159
+ Text: Text2 = defaultComponents.Text,
2160
+ Empty,
2161
+ Image: Image2 = defaultComponents.Image,
2162
+ UI = defaultComponents.UI,
2163
+ tools: { by_name = {}, Fallback: Fallback2 = void 0 } = {}
2164
+ } = {}
2165
+ }) => {
2166
+ const messageStore = useMessageStore();
2167
+ const threadRuntime = useThreadRuntime();
2168
+ const part = useContentPart();
2169
+ const type = part.type;
2170
+ switch (type) {
2171
+ case "text":
2172
+ if (part.status.type === "requires-action")
2173
+ throw new Error("Encountered unexpected requires-action status");
2174
+ if (part.part === EMPTY_CONTENT && !!Empty) {
2175
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Empty, { status: part.status });
2176
+ }
2177
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Text2, { ...part, part });
2178
+ case "image":
2179
+ if (part.status.type === "requires-action")
2180
+ throw new Error("Encountered unexpected requires-action status");
2181
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Image2, { ...part, part });
2182
+ case "ui":
2183
+ if (part.status.type === "requires-action")
2184
+ throw new Error("Encountered unexpected requires-action status");
2185
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UI, { ...part, part });
2186
+ case "tool-call": {
2187
+ const Tool = by_name[part.toolName] || Fallback2;
2188
+ const addResult = (result) => threadRuntime.addToolResult({
2189
+ messageId: messageStore.getState().id,
2190
+ toolName: part.toolName,
2191
+ toolCallId: part.toolCallId,
2192
+ result
2193
+ });
2194
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ToolUIDisplay, { ...part, part, UI: Tool, addResult });
2195
+ }
2196
+ default:
2197
+ const unhandledType = type;
2198
+ throw new Error(`Unknown content part type: ${unhandledType}`);
2199
+ }
2200
+ };
2201
+ var MessageContentPartImpl = ({
2202
+ partIndex,
2203
+ components
2204
+ }) => {
2205
+ const messageRuntime = useMessageRuntime();
2206
+ const runtime = _react.useMemo.call(void 0,
2207
+ () => messageRuntime.unstable_getContentPartByIndex(partIndex),
2208
+ [messageRuntime, partIndex]
2209
+ );
2210
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartRuntimeProvider, { runtime, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPartComponent, { components }) });
2211
+ };
2212
+ var MessageContentPart = _react.memo.call(void 0,
2213
+ MessageContentPartImpl,
2214
+ (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _79 => _79.components, 'optionalAccess', _80 => _80.Text]) === _optionalChain([next, 'access', _81 => _81.components, 'optionalAccess', _82 => _82.Text]) && _optionalChain([prev, 'access', _83 => _83.components, 'optionalAccess', _84 => _84.Image]) === _optionalChain([next, 'access', _85 => _85.components, 'optionalAccess', _86 => _86.Image]) && _optionalChain([prev, 'access', _87 => _87.components, 'optionalAccess', _88 => _88.UI]) === _optionalChain([next, 'access', _89 => _89.components, 'optionalAccess', _90 => _90.UI]) && _optionalChain([prev, 'access', _91 => _91.components, 'optionalAccess', _92 => _92.tools]) === _optionalChain([next, 'access', _93 => _93.components, 'optionalAccess', _94 => _94.tools])
2215
+ );
2216
+ var MessagePrimitiveContent = ({
2217
+ components
2218
+ }) => {
2219
+ const contentLength = useMessage((s) => s.content.length) || 1;
2220
+ return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPart, { partIndex: index, components }, index));
2221
+ };
2222
+ MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
2223
+
2224
+ // src/primitives/message/MessageInProgress.tsx
2225
+ var MessagePrimitiveInProgress = () => {
2226
+ return null;
2227
+ };
2228
+ MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
2229
+
2230
+ // src/primitives/message/MessageAttachments.tsx
2231
+
2232
+
2233
+ // src/context/react/AttachmentContext.ts
2234
+
2235
+ var AttachmentContext = _react.createContext.call(void 0,
2236
+ null
2237
+ );
1755
2238
  function useAttachmentContext(options) {
1756
2239
  const context = _react.useContext.call(void 0, AttachmentContext);
1757
- if (!_optionalChain([options, 'optionalAccess', _33 => _33.optional]) && !context)
2240
+ if (!_optionalChain([options, 'optionalAccess', _95 => _95.optional]) && !context)
1758
2241
  throw new Error(
1759
2242
  "This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component."
1760
2243
  );
1761
2244
  return context;
1762
2245
  }
1763
- function useComposerAttachmentContext(options) {
2246
+ function useThreadComposerAttachmentContext(options) {
2247
+ const context = useAttachmentContext(options);
2248
+ if (!context) return null;
2249
+ if (context.source !== "thread-composer")
2250
+ throw new Error(
2251
+ "This component must be used within a thread's ComposerPrimitive.Attachments component."
2252
+ );
2253
+ return context;
2254
+ }
2255
+ function useEditComposerAttachmentContext(options) {
1764
2256
  const context = useAttachmentContext(options);
1765
2257
  if (!context) return null;
1766
- if (context.type !== "composer")
2258
+ if (context.source !== "edit-composer")
1767
2259
  throw new Error(
1768
- "This component must be used within a ComposerPrimitive.Attachments component."
2260
+ "This component must be used within a messages's ComposerPrimitive.Attachments component."
1769
2261
  );
1770
2262
  return context;
1771
2263
  }
1772
2264
  function useMessageAttachmentContext(options) {
1773
2265
  const context = useAttachmentContext(options);
1774
2266
  if (!context) return null;
1775
- if (context.type !== "message")
2267
+ if (context.source !== "message")
1776
2268
  throw new Error(
1777
2269
  "This component must be used within a MessagePrimitive.Attachments component."
1778
2270
  );
1779
2271
  return context;
1780
2272
  }
1781
- var { useAttachment, useAttachmentStore } = createContextStoreHook(
2273
+ function useAttachmentRuntime(options) {
2274
+ const attachmentRuntime = useAttachmentContext(options);
2275
+ if (!attachmentRuntime) return null;
2276
+ return attachmentRuntime.useAttachmentRuntime();
2277
+ }
2278
+ var { useAttachment } = createContextStoreHook(
1782
2279
  useAttachmentContext,
1783
2280
  "useAttachment"
1784
2281
  );
1785
- var {
1786
- useAttachment: useComposerAttachment,
1787
- useAttachmentStore: useComposerAttachmentStore
1788
- } = createContextStoreHook(useComposerAttachmentContext, "useAttachment");
1789
- var {
1790
- useAttachment: useMessageAttachment,
1791
- useAttachmentStore: useMessageAttachmentStore
1792
- } = createContextStoreHook(useMessageAttachmentContext, "useAttachment");
2282
+ var { useAttachment: useThreadComposerAttachment } = createContextStoreHook(useThreadComposerAttachmentContext, "useAttachment");
2283
+ var { useAttachment: useEditComposerAttachment } = createContextStoreHook(useEditComposerAttachmentContext, "useAttachment");
2284
+ var { useAttachment: useMessageAttachment } = createContextStoreHook(
2285
+ useMessageAttachmentContext,
2286
+ "useAttachment"
2287
+ );
2288
+
2289
+ // src/context/providers/AttachmentRuntimeProvider.tsx
1793
2290
 
1794
- // src/context/providers/MessageAttachmentProvider.tsx
1795
2291
 
1796
2292
 
1797
2293
 
1798
- var getAttachment = (message, useAttachment2, partIndex) => {
1799
- if (message.role !== "user") return null;
1800
- const attachments = message.attachments;
1801
- const attachment = attachments[partIndex];
1802
- if (!attachment) return null;
1803
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _34 => _34.getState, 'call', _35 => _35()]);
1804
- if (currentState && currentState.attachment === attachment) return null;
1805
- return Object.freeze({ attachment });
2294
+
2295
+
2296
+
2297
+ var useAttachmentRuntimeStore = (runtime) => {
2298
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime));
2299
+ _react.useEffect.call(void 0, () => {
2300
+ writableStore(store).setState(runtime, true);
2301
+ }, [runtime, store]);
2302
+ return store;
1806
2303
  };
1807
- var useMessageAttachmentContext2 = (partIndex) => {
1808
- const messageStore = useMessageStore();
1809
- const [context] = _react.useState.call(void 0,
1810
- () => {
1811
- const useAttachment2 = _zustand.create.call(void 0,
1812
- () => getAttachment(messageStore.getState(), void 0, partIndex)
1813
- );
1814
- return { type: "message", useAttachment: useAttachment2 };
1815
- }
1816
- );
2304
+ var useAttachmentStore = (runtime) => {
2305
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
1817
2306
  _react.useEffect.call(void 0, () => {
1818
- const syncAttachment = (messageState) => {
1819
- const newState = getAttachment(
1820
- messageState,
1821
- context.useAttachment,
1822
- partIndex
1823
- );
1824
- if (!newState) return;
1825
- writableStore(context.useAttachment).setState(newState, true);
1826
- };
1827
- syncAttachment(messageStore.getState());
1828
- return messageStore.subscribe(syncAttachment);
1829
- }, [context, messageStore, partIndex]);
1830
- return context;
2307
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
2308
+ updateState();
2309
+ return runtime.subscribe(updateState);
2310
+ }, [runtime, store]);
2311
+ return store;
1831
2312
  };
1832
- var MessageAttachmentProvider = ({
1833
- attachmentIndex: partIndex,
2313
+ var AttachmentRuntimeProvider = ({
2314
+ runtime,
1834
2315
  children
1835
2316
  }) => {
1836
- const context = useMessageAttachmentContext2(partIndex);
2317
+ const useAttachmentRuntime2 = useAttachmentRuntimeStore(runtime);
2318
+ const useAttachment2 = useAttachmentStore(runtime);
2319
+ const source = useAttachment2((s) => s.source);
2320
+ const context = _react.useMemo.call(void 0, () => {
2321
+ return {
2322
+ source,
2323
+ useAttachmentRuntime: useAttachmentRuntime2,
2324
+ useAttachment: useAttachment2
2325
+ };
2326
+ }, [useAttachmentRuntime2, useAttachment2]);
1837
2327
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentContext.Provider, { value: context, children });
1838
2328
  };
1839
2329
 
@@ -1843,11 +2333,11 @@ var getComponent = (components, attachment) => {
1843
2333
  const type = attachment.type;
1844
2334
  switch (type) {
1845
2335
  case "image":
1846
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _36 => _36.Image]), () => ( _optionalChain([components, 'optionalAccess', _37 => _37.Attachment])));
2336
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _96 => _96.Image]), () => ( _optionalChain([components, 'optionalAccess', _97 => _97.Attachment])));
1847
2337
  case "document":
1848
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _38 => _38.Document]), () => ( _optionalChain([components, 'optionalAccess', _39 => _39.Attachment])));
2338
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _98 => _98.Document]), () => ( _optionalChain([components, 'optionalAccess', _99 => _99.Attachment])));
1849
2339
  case "file":
1850
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _40 => _40.File]), () => ( _optionalChain([components, 'optionalAccess', _41 => _41.Attachment])));
2340
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _100 => _100.File]), () => ( _optionalChain([components, 'optionalAccess', _101 => _101.Attachment])));
1851
2341
  default:
1852
2342
  const _exhaustiveCheck = type;
1853
2343
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
@@ -1861,11 +2351,16 @@ var AttachmentComponent = ({ components }) => {
1861
2351
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, {});
1862
2352
  };
1863
2353
  var MessageAttachmentImpl = ({ components, attachmentIndex }) => {
1864
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent, { components }) });
2354
+ const messageRuntime = useMessageRuntime();
2355
+ const runtime = _react.useMemo.call(void 0,
2356
+ () => messageRuntime.unstable_getAttachmentByIndex(attachmentIndex),
2357
+ [messageRuntime, attachmentIndex]
2358
+ );
2359
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentRuntimeProvider, { runtime, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent, { components }) });
1865
2360
  };
1866
2361
  var MessageAttachment = _react.memo.call(void 0,
1867
2362
  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])
2363
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _102 => _102.components, 'optionalAccess', _103 => _103.Image]) === _optionalChain([next, 'access', _104 => _104.components, 'optionalAccess', _105 => _105.Image]) && _optionalChain([prev, 'access', _106 => _106.components, 'optionalAccess', _107 => _107.Document]) === _optionalChain([next, 'access', _108 => _108.components, 'optionalAccess', _109 => _109.Document]) && _optionalChain([prev, 'access', _110 => _110.components, 'optionalAccess', _111 => _111.File]) === _optionalChain([next, 'access', _112 => _112.components, 'optionalAccess', _113 => _113.File]) && _optionalChain([prev, 'access', _114 => _114.components, 'optionalAccess', _115 => _115.Attachment]) === _optionalChain([next, 'access', _116 => _116.components, 'optionalAccess', _117 => _117.Attachment])
1869
2364
  );
1870
2365
  var MessagePrimitiveAttachments = ({ components }) => {
1871
2366
  const attachmentsCount = useMessage(({ message }) => {
@@ -1976,7 +2471,7 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
1976
2471
  const { isRunning } = threadStore.getState();
1977
2472
  if (!isRunning) {
1978
2473
  e.preventDefault();
1979
- _optionalChain([textareaRef, 'access', _58 => _58.current, 'optionalAccess', _59 => _59.closest, 'call', _60 => _60("form"), 'optionalAccess', _61 => _61.requestSubmit, 'call', _62 => _62()]);
2474
+ _optionalChain([textareaRef, 'access', _118 => _118.current, 'optionalAccess', _119 => _119.closest, 'call', _120 => _120("form"), 'optionalAccess', _121 => _121.requestSubmit, 'call', _122 => _122()]);
1980
2475
  }
1981
2476
  }
1982
2477
  };
@@ -2037,79 +2532,41 @@ var ComposerPrimitiveAddAttachment = createActionButton(
2037
2532
  // src/primitives/composer/ComposerAttachments.tsx
2038
2533
 
2039
2534
 
2040
- // src/context/providers/ComposerAttachmentProvider.tsx
2041
-
2042
-
2043
-
2044
- var getAttachment2 = ({ attachments }, useAttachment2, partIndex) => {
2045
- const attachment = attachments[partIndex];
2046
- if (!attachment) return null;
2047
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _63 => _63.getState, 'call', _64 => _64()]);
2048
- if (currentState && currentState.attachment === attachment) return null;
2049
- return Object.freeze({ attachment });
2050
- };
2051
- var useComposerAttachmentContext2 = (partIndex) => {
2052
- const threadComposerStore = useThreadComposerStore();
2053
- const [context] = _react.useState.call(void 0,
2054
- () => {
2055
- const useAttachment2 = _zustand.create.call(void 0,
2056
- () => getAttachment2(threadComposerStore.getState(), void 0, partIndex)
2057
- );
2058
- return { type: "composer", useAttachment: useAttachment2 };
2059
- }
2060
- );
2061
- _react.useEffect.call(void 0, () => {
2062
- const syncAttachment = (composer) => {
2063
- const newState = getAttachment2(
2064
- composer,
2065
- context.useAttachment,
2066
- partIndex
2067
- );
2068
- if (!newState) return;
2069
- writableStore(context.useAttachment).setState(newState, true);
2070
- };
2071
- syncAttachment(threadComposerStore.getState());
2072
- return threadComposerStore.subscribe(syncAttachment);
2073
- }, [context, threadComposerStore, partIndex]);
2074
- return context;
2075
- };
2076
- var ComposerAttachmentProvider = ({ attachmentIndex: partIndex, children }) => {
2077
- const context = useComposerAttachmentContext2(partIndex);
2078
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentContext.Provider, { value: context, children });
2079
- };
2080
-
2081
- // src/primitives/composer/ComposerAttachments.tsx
2082
-
2083
2535
  var getComponent2 = (components, attachment) => {
2084
2536
  const type = attachment.type;
2085
2537
  switch (type) {
2086
2538
  case "image":
2087
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _65 => _65.Image]), () => ( _optionalChain([components, 'optionalAccess', _66 => _66.Attachment])));
2539
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _123 => _123.Image]), () => ( _optionalChain([components, 'optionalAccess', _124 => _124.Attachment])));
2088
2540
  case "document":
2089
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _67 => _67.Document]), () => ( _optionalChain([components, 'optionalAccess', _68 => _68.Attachment])));
2541
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _125 => _125.Document]), () => ( _optionalChain([components, 'optionalAccess', _126 => _126.Attachment])));
2090
2542
  case "file":
2091
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _69 => _69.File]), () => ( _optionalChain([components, 'optionalAccess', _70 => _70.Attachment])));
2543
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _127 => _127.File]), () => ( _optionalChain([components, 'optionalAccess', _128 => _128.Attachment])));
2092
2544
  default:
2093
2545
  const _exhaustiveCheck = type;
2094
2546
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
2095
2547
  }
2096
2548
  };
2097
2549
  var AttachmentComponent2 = ({ components }) => {
2098
- const Component = useComposerAttachment(
2099
- (a) => getComponent2(components, a.attachment)
2550
+ const Component = useThreadComposerAttachment(
2551
+ (a) => getComponent2(components, a)
2100
2552
  );
2101
2553
  if (!Component) return null;
2102
2554
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, {});
2103
2555
  };
2104
2556
  var ComposerAttachmentImpl = ({ components, attachmentIndex }) => {
2105
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent2, { components }) });
2557
+ const composerRuntime = useComposerRuntime();
2558
+ const runtime = _react.useMemo.call(void 0,
2559
+ () => composerRuntime.unstable_getAttachmentByIndex(attachmentIndex),
2560
+ [composerRuntime, attachmentIndex]
2561
+ );
2562
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentRuntimeProvider, { runtime, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent2, { components }) });
2106
2563
  };
2107
2564
  var ComposerAttachment = _react.memo.call(void 0,
2108
2565
  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])
2566
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _129 => _129.components, 'optionalAccess', _130 => _130.Image]) === _optionalChain([next, 'access', _131 => _131.components, 'optionalAccess', _132 => _132.Image]) && _optionalChain([prev, 'access', _133 => _133.components, 'optionalAccess', _134 => _134.Document]) === _optionalChain([next, 'access', _135 => _135.components, 'optionalAccess', _136 => _136.Document]) && _optionalChain([prev, 'access', _137 => _137.components, 'optionalAccess', _138 => _138.File]) === _optionalChain([next, 'access', _139 => _139.components, 'optionalAccess', _140 => _140.File]) && _optionalChain([prev, 'access', _141 => _141.components, 'optionalAccess', _142 => _142.Attachment]) === _optionalChain([next, 'access', _143 => _143.components, 'optionalAccess', _144 => _144.Attachment])
2110
2567
  );
2111
2568
  var ComposerPrimitiveAttachments = ({ components }) => {
2112
- const attachmentsCount = useThreadComposer((s) => s.attachments.length);
2569
+ const attachmentsCount = useComposer((s) => s.attachments.length);
2113
2570
  return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2114
2571
  ComposerAttachment,
2115
2572
  {
@@ -2311,45 +2768,6 @@ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
2311
2768
 
2312
2769
 
2313
2770
 
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
2771
  // src/context/stores/MessageUtils.ts
2354
2772
 
2355
2773
  var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
@@ -2365,7 +2783,7 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
2365
2783
  },
2366
2784
  isSpeaking: false,
2367
2785
  stopSpeaking: () => {
2368
- _optionalChain([utterance, 'optionalAccess', _87 => _87.cancel, 'call', _88 => _88()]);
2786
+ _optionalChain([utterance, 'optionalAccess', _145 => _145.cancel, 'call', _146 => _146()]);
2369
2787
  },
2370
2788
  addUtterance: (utt) => {
2371
2789
  utterance = utt;
@@ -2404,29 +2822,13 @@ var useMessageUtilsStore2 = () => {
2404
2822
  return store;
2405
2823
  };
2406
2824
  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
- );
2825
+ const runtime = useMessageRuntime2.getState().composer;
2826
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
2827
+ _react.useEffect.call(void 0, () => {
2828
+ const updateState = () => writableStore(store).setState(runtime.getState());
2829
+ updateState();
2830
+ return runtime.subscribe(updateState);
2831
+ }, [runtime, store]);
2430
2832
  return store;
2431
2833
  };
2432
2834
  var MessageRuntimeProvider = ({
@@ -2500,7 +2902,7 @@ var ThreadMessage = _react.memo.call(void 0,
2500
2902
  var ThreadPrimitiveMessagesImpl = ({
2501
2903
  components
2502
2904
  }) => {
2503
- const messagesLength = useThreadMessages((t) => t.length);
2905
+ const messagesLength = useThread((t) => t.messages.length);
2504
2906
  if (messagesLength === 0) return null;
2505
2907
  return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadMessage, { messageIndex: index, components }, index));
2506
2908
  };
@@ -2528,7 +2930,7 @@ var subscribeToMainThread = (runtime, callback) => {
2528
2930
  let first = true;
2529
2931
  let cleanup;
2530
2932
  const inner = () => {
2531
- _optionalChain([cleanup, 'optionalCall', _89 => _89()]);
2933
+ _optionalChain([cleanup, 'optionalCall', _147 => _147()]);
2532
2934
  cleanup = runtime.thread.subscribe(callback);
2533
2935
  if (!first) {
2534
2936
  callback();
@@ -2539,7 +2941,7 @@ var subscribeToMainThread = (runtime, callback) => {
2539
2941
  inner();
2540
2942
  return () => {
2541
2943
  unsubscribe();
2542
- _optionalChain([cleanup, 'optionalCall', _90 => _90()]);
2944
+ _optionalChain([cleanup, 'optionalCall', _148 => _148()]);
2543
2945
  };
2544
2946
  };
2545
2947
 
@@ -2547,8 +2949,8 @@ var subscribeToMainThread = (runtime, callback) => {
2547
2949
 
2548
2950
 
2549
2951
  // src/runtimes/core/BaseAssistantRuntimeCore.tsx
2550
- var BaseAssistantRuntimeCore = (_class2 = class {
2551
- constructor(_thread) {;_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);
2952
+ var BaseAssistantRuntimeCore = (_class7 = class {
2953
+ constructor(_thread) {;_class7.prototype.__init11.call(this);_class7.prototype.__init12.call(this);
2552
2954
  this._thread = _thread;
2553
2955
  this._thread = _thread;
2554
2956
  }
@@ -2559,22 +2961,22 @@ var BaseAssistantRuntimeCore = (_class2 = class {
2559
2961
  this._thread = thread;
2560
2962
  this.subscriptionHandler();
2561
2963
  }
2562
- __init5() {this._subscriptions = /* @__PURE__ */ new Set()}
2964
+ __init11() {this._subscriptions = /* @__PURE__ */ new Set()}
2563
2965
  subscribe(callback) {
2564
2966
  this._subscriptions.add(callback);
2565
2967
  return () => this._subscriptions.delete(callback);
2566
2968
  }
2567
- __init6() {this.subscriptionHandler = () => {
2969
+ __init12() {this.subscriptionHandler = () => {
2568
2970
  for (const callback of this._subscriptions) callback();
2569
2971
  }}
2570
- }, _class2);
2972
+ }, _class7);
2571
2973
 
2572
2974
  // src/internal.ts
2573
2975
  var internal_exports = {};
2574
2976
  _chunkPZ5AY32Cjs.__export.call(void 0, internal_exports, {
2575
2977
  AssistantRuntime: () => AssistantRuntime,
2576
2978
  BaseAssistantRuntimeCore: () => BaseAssistantRuntimeCore,
2577
- BaseThreadComposerRuntimeCore: () => BaseThreadComposerRuntimeCore,
2979
+ DefaultThreadComposerRuntimeCore: () => DefaultThreadComposerRuntimeCore,
2578
2980
  MessageRepository: () => MessageRepository,
2579
2981
  ProxyConfigProvider: () => ProxyConfigProvider,
2580
2982
  ThreadRuntime: () => ThreadRuntime,
@@ -2585,46 +2987,70 @@ _chunkPZ5AY32Cjs.__export.call(void 0, internal_exports, {
2585
2987
  withSmoothContextProvider: () => withSmoothContextProvider
2586
2988
  });
2587
2989
 
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();
2990
+ // src/runtimes/composer/BaseComposerRuntimeCore.tsx
2991
+ var isAttachmentComplete = (a) => a.status.type === "complete";
2992
+ var BaseComposerRuntimeCore = (_class8 = class {constructor() { _class8.prototype.__init13.call(this);_class8.prototype.__init14.call(this);_class8.prototype.__init15.call(this);_class8.prototype.__init16.call(this);_class8.prototype.__init17.call(this); }
2993
+ __init13() {this.isEditing = true}
2994
+ __init14() {this.attachmentAccept = "*"}
2995
+ __init15() {this._attachments = []}
2996
+ set attachments(value) {
2997
+ this._attachments = value;
2998
+ this.notifySubscribers();
2999
+ }
3000
+ get attachments() {
3001
+ return this._attachments;
2593
3002
  }
2594
-
2595
- __init7() {this.attachmentAccept = "*"}
2596
3003
  get isEmpty() {
2597
3004
  return !this.text.trim() && !this.attachments.length;
2598
3005
  }
2599
- __init8() {this._canCancel = false}
2600
- get canCancel() {
2601
- return this._canCancel;
3006
+ __init16() {this._text = ""}
3007
+ get text() {
3008
+ return this._text;
2602
3009
  }
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
- });
3010
+ setText(value) {
3011
+ this._text = value;
3012
+ this.notifySubscribers();
3013
+ }
3014
+ reset() {
3015
+ this._text = "";
3016
+ this._attachments = [];
3017
+ this.notifySubscribers();
2610
3018
  }
3019
+ async send() {
3020
+ const attachments = this._attachmentAdapter ? await Promise.all(
3021
+ this.attachments.map(async (a) => {
3022
+ if (isAttachmentComplete(a)) return a;
3023
+ const result = await this._attachmentAdapter.send(a);
3024
+ if (_optionalChain([result, 'access', _149 => _149.status, 'optionalAccess', _150 => _150.type]) !== "complete") {
3025
+ result.status = { type: "complete" };
3026
+ }
3027
+ return result;
3028
+ })
3029
+ ) : [];
3030
+ const message = {
3031
+ role: "user",
3032
+ content: this.text ? [{ type: "text", text: this.text }] : [],
3033
+ attachments
3034
+ };
3035
+ this.reset();
3036
+ this.handleSend(message);
3037
+ }
3038
+
2611
3039
  setAttachmentAdapter(adapter) {
2612
3040
  this._attachmentAdapter = adapter;
2613
- const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _91 => _91.accept]), () => ( "*"));
3041
+ const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _151 => _151.accept]), () => ( "*"));
2614
3042
  if (this.attachmentAccept !== accept) {
2615
3043
  this.attachmentAccept = accept;
2616
- return true;
3044
+ this.notifySubscribers();
2617
3045
  }
2618
- return false;
2619
- }
2620
- __init9() {this._attachments = []}
2621
- get attachments() {
2622
- return this._attachments;
2623
3046
  }
2624
3047
  async addAttachment(file) {
2625
3048
  if (!this._attachmentAdapter)
2626
3049
  throw new Error("Attachments are not supported");
2627
3050
  const attachment = await this._attachmentAdapter.add({ file });
3051
+ if (attachment.status === void 0) {
3052
+ attachment.status = { type: "requires-action", reason: "composer-send" };
3053
+ }
2628
3054
  this._attachments = [...this._attachments, attachment];
2629
3055
  this.notifySubscribers();
2630
3056
  }
@@ -2638,49 +3064,52 @@ var BaseThreadComposerRuntimeCore = (_class3 = class {
2638
3064
  this._attachments = this._attachments.toSpliced(index, 1);
2639
3065
  this.notifySubscribers();
2640
3066
  }
2641
- __init10() {this._text = ""}
2642
- get text() {
2643
- return this._text;
3067
+ __init17() {this._subscriptions = /* @__PURE__ */ new Set()}
3068
+ notifySubscribers() {
3069
+ for (const callback of this._subscriptions) callback();
2644
3070
  }
2645
- setText(value) {
2646
- this._text = value;
2647
- this.notifySubscribers();
3071
+ subscribe(callback) {
3072
+ this._subscriptions.add(callback);
3073
+ return () => this._subscriptions.delete(callback);
2648
3074
  }
2649
- reset() {
2650
- this._text = "";
2651
- this._attachments = [];
2652
- this.notifySubscribers();
3075
+ }, _class8);
3076
+
3077
+ // src/runtimes/composer/DefaultThreadComposerRuntimeCore.tsx
3078
+ var DefaultThreadComposerRuntimeCore = (_class9 = class extends BaseComposerRuntimeCore {
3079
+ constructor(runtime) {
3080
+ super();_class9.prototype.__init18.call(this);;
3081
+ this.runtime = runtime;
3082
+ this.connect();
2653
3083
  }
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
- ) : [];
3084
+ __init18() {this._canCancel = false}
3085
+ get canCancel() {
3086
+ return this._canCancel;
3087
+ }
3088
+ get attachments() {
3089
+ return super.attachments;
3090
+ }
3091
+ connect() {
3092
+ return this.runtime.subscribe(() => {
3093
+ if (this.canCancel !== this.runtime.capabilities.cancel) {
3094
+ this._canCancel = this.runtime.capabilities.cancel;
3095
+ this.notifySubscribers();
3096
+ }
3097
+ });
3098
+ }
3099
+ async handleSend(message) {
2660
3100
  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
3101
+ ...message,
3102
+ parentId: _nullishCoalesce(_optionalChain([this, 'access', _152 => _152.runtime, 'access', _153 => _153.messages, 'access', _154 => _154.at, 'call', _155 => _155(-1), 'optionalAccess', _156 => _156.id]), () => ( null))
2665
3103
  });
2666
- this.reset();
2667
3104
  }
2668
3105
  async cancel() {
2669
3106
  this.runtime.cancelRun();
2670
3107
  }
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);
3108
+ }, _class9);
2680
3109
 
2681
3110
  // src/utils/ProxyConfigProvider.ts
2682
- var ProxyConfigProvider = (_class4 = class {constructor() { _class4.prototype.__init12.call(this); }
2683
- __init12() {this._providers = /* @__PURE__ */ new Set()}
3111
+ var ProxyConfigProvider = (_class10 = class {constructor() { _class10.prototype.__init19.call(this); }
3112
+ __init19() {this._providers = /* @__PURE__ */ new Set()}
2684
3113
  getModelConfig() {
2685
3114
  return _chunk5KIEXJRKjs.mergeModelConfigs.call(void 0, this._providers);
2686
3115
  }
@@ -2690,7 +3119,7 @@ var ProxyConfigProvider = (_class4 = class {constructor() { _class4.prototype.__
2690
3119
  this._providers.delete(provider);
2691
3120
  };
2692
3121
  }
2693
- }, _class4);
3122
+ }, _class10);
2694
3123
 
2695
3124
  // src/utils/idUtils.tsx
2696
3125
  var _nonsecure = require('nanoid/non-secure');
@@ -2757,11 +3186,11 @@ var findHead = (message) => {
2757
3186
  if ("current" in message) return message;
2758
3187
  return null;
2759
3188
  };
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()}
3189
+ var MessageRepository = (_class11 = class {constructor() { _class11.prototype.__init20.call(this);_class11.prototype.__init21.call(this);_class11.prototype.__init22.call(this); }
3190
+ __init20() {this.messages = /* @__PURE__ */ new Map()}
2762
3191
  // message_id -> item
2763
- __init14() {this.head = null}
2764
- __init15() {this.root = {
3192
+ __init21() {this.head = null}
3193
+ __init22() {this.root = {
2765
3194
  children: [],
2766
3195
  next: null
2767
3196
  }}
@@ -2803,11 +3232,11 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2803
3232
  }
2804
3233
  }
2805
3234
  getMessages() {
2806
- const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _97 => _97.head, 'optionalAccess', _98 => _98.level]), () => ( 0)));
3235
+ const messages2 = new Array(_nullishCoalesce(_optionalChain([this, 'access', _157 => _157.head, 'optionalAccess', _158 => _158.level]), () => ( 0)));
2807
3236
  for (let current = this.head; current; current = current.prev) {
2808
- messages[current.level] = current.current;
3237
+ messages2[current.level] = current.current;
2809
3238
  }
2810
- return messages;
3239
+ return messages2;
2811
3240
  }
2812
3241
  addOrUpdateMessage(parentId, message) {
2813
3242
  const existingItem = this.messages.get(message.id);
@@ -2841,7 +3270,7 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2841
3270
  "MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui."
2842
3271
  );
2843
3272
  return {
2844
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _99 => _99.prev, 'optionalAccess', _100 => _100.current, 'access', _101 => _101.id]), () => ( null)),
3273
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _159 => _159.prev, 'optionalAccess', _160 => _160.current, 'access', _161 => _161.id]), () => ( null)),
2845
3274
  message: message.current
2846
3275
  };
2847
3276
  }
@@ -2925,21 +3354,21 @@ var MessageRepository = (_class5 = class {constructor() { _class5.prototype.__in
2925
3354
  for (const [, message] of this.messages) {
2926
3355
  exportItems.push({
2927
3356
  message: message.current,
2928
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _102 => _102.prev, 'optionalAccess', _103 => _103.current, 'access', _104 => _104.id]), () => ( null))
3357
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _162 => _162.prev, 'optionalAccess', _163 => _163.current, 'access', _164 => _164.id]), () => ( null))
2929
3358
  });
2930
3359
  }
2931
3360
  return {
2932
- headId: _nullishCoalesce(_optionalChain([this, 'access', _105 => _105.head, 'optionalAccess', _106 => _106.current, 'access', _107 => _107.id]), () => ( null)),
3361
+ headId: _nullishCoalesce(_optionalChain([this, 'access', _165 => _165.head, 'optionalAccess', _166 => _166.current, 'access', _167 => _167.id]), () => ( null)),
2933
3362
  messages: exportItems
2934
3363
  };
2935
3364
  }
2936
- import({ headId, messages }) {
2937
- for (const { message, parentId } of messages) {
3365
+ import({ headId, messages: messages2 }) {
3366
+ for (const { message, parentId } of messages2) {
2938
3367
  this.addOrUpdateMessage(parentId, message);
2939
3368
  }
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)));
3369
+ this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages2, 'access', _168 => _168.at, 'call', _169 => _169(-1), 'optionalAccess', _170 => _170.message, 'access', _171 => _171.id]))), () => ( null)));
2941
3370
  }
2942
- }, _class5);
3371
+ }, _class11);
2943
3372
 
2944
3373
  // src/ui/base/tooltip-icon-button.tsx
2945
3374
 
@@ -3032,70 +3461,10 @@ var TooltipIconButton = _react.forwardRef.call(void 0, ({ children, tooltip, sid
3032
3461
  children,
3033
3462
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "aui-sr-only", children: tooltip })
3034
3463
  ] }) }),
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
- };
3097
- }
3098
- };
3464
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipContent, { side, children: tooltip })
3465
+ ] });
3466
+ });
3467
+ TooltipIconButton.displayName = "TooltipIconButton";
3099
3468
 
3100
3469
  // src/api/AssistantRuntime.ts
3101
3470
  var AssistantRuntime = class {
@@ -3127,245 +3496,11 @@ var AssistantRuntime = class {
3127
3496
  }
3128
3497
  };
3129
3498
 
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 {
3173
- constructor(binding) {
3174
- super();_class7.prototype.__init17.call(this);;
3175
- this.binding = binding;
3176
- const state = binding.getState();
3177
- if (state === void 0)
3178
- throw new Error("Entry not available in the store");
3179
- this._previousState = state;
3180
- }
3181
-
3182
- __init17() {this.getState = () => {
3183
- if (!this.isConnected) this._syncState();
3184
- return this._previousState;
3185
- }}
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
- _connect() {
3194
- const callback = () => {
3195
- if (this._syncState()) {
3196
- this.notifySubscribers();
3197
- }
3198
- };
3199
- return this.binding.subscribe(callback);
3200
- }
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
- };
3363
-
3364
3499
  // src/api/ThreadRuntime.ts
3365
- var toAppendMessage = (messages, message) => {
3500
+ var toAppendMessage = (messages2, message) => {
3366
3501
  if (typeof message === "string") {
3367
3502
  return {
3368
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _116 => _116.at, 'call', _117 => _117(-1), 'optionalAccess', _118 => _118.id]), () => ( null)),
3503
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _172 => _172.at, 'call', _173 => _173(-1), 'optionalAccess', _174 => _174.id]), () => ( null)),
3369
3504
  role: "user",
3370
3505
  content: [{ type: "text", text: message }],
3371
3506
  attachments: []
@@ -3375,7 +3510,7 @@ var toAppendMessage = (messages, message) => {
3375
3510
  return message;
3376
3511
  }
3377
3512
  return {
3378
- parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([messages, 'access', _119 => _119.at, 'call', _120 => _120(-1), 'optionalAccess', _121 => _121.id]))), () => ( null)),
3513
+ parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([messages2, 'access', _175 => _175.at, 'call', _176 => _176(-1), 'optionalAccess', _177 => _177.id]))), () => ( null)),
3379
3514
  role: _nullishCoalesce(message.role, () => ( "user")),
3380
3515
  content: message.content,
3381
3516
  attachments: _nullishCoalesce(message.attachments, () => ( []))
@@ -3387,14 +3522,11 @@ var getThreadState = (runtime) => {
3387
3522
  threadId: runtime.threadId,
3388
3523
  capabilities: runtime.capabilities,
3389
3524
  isDisabled: runtime.isDisabled,
3390
- isRunning: _optionalChain([lastMessage, 'optionalAccess', _122 => _122.role]) !== "assistant" ? false : lastMessage.status.type === "running",
3391
- unstable_synchronizer: runtime.unstable_synchronizer
3525
+ isRunning: _optionalChain([lastMessage, 'optionalAccess', _178 => _178.role]) !== "assistant" ? false : lastMessage.status.type === "running",
3526
+ messages: runtime.messages
3392
3527
  });
3393
3528
  };
3394
- var ThreadRuntime = (_class8 = class {
3395
- constructor(_threadBinding) {;_class8.prototype.__init18.call(this);
3396
- this._threadBinding = _threadBinding;
3397
- }
3529
+ var ThreadRuntime = (_class12 = class {
3398
3530
  // public path = "assistant.threads[main]"; // TODO
3399
3531
  /**
3400
3532
  * @deprecated Use `getState().threadId` instead. This will be removed in 0.6.0.
@@ -3420,21 +3552,35 @@ var ThreadRuntime = (_class8 = class {
3420
3552
  get capabilities() {
3421
3553
  return this.getState().capabilities;
3422
3554
  }
3423
- // TODO this should instead return getMessageByIndex([idx])
3555
+ /**
3556
+ * @deprecated Use `getState().messages` instead. This will be removed in 0.6.0.
3557
+ */
3424
3558
  get messages() {
3425
3559
  return this._threadBinding.getState().messages;
3426
3560
  }
3427
3561
  unstable_getCore() {
3428
3562
  return this._threadBinding.getState();
3429
3563
  }
3430
- __init18() {this.composer = new ThreadComposerRuntime(
3564
+
3565
+ constructor(threadBinding) {;_class12.prototype.__init23.call(this);
3566
+ const stateBinding = new LazyMemoizeSubject({
3567
+ getState: () => getThreadState(threadBinding.getState()),
3568
+ subscribe: (callback) => threadBinding.subscribe(callback)
3569
+ });
3570
+ this._threadBinding = {
3571
+ getState: () => threadBinding.getState(),
3572
+ getStateState: () => stateBinding.getState(),
3573
+ subscribe: (callback) => threadBinding.subscribe(callback)
3574
+ };
3575
+ }
3576
+ __init23() {this.composer = new ThreadComposerRuntime(
3431
3577
  new NestedSubscriptionSubject({
3432
3578
  getState: () => this._threadBinding.getState().composer,
3433
3579
  subscribe: (callback) => this._threadBinding.subscribe(callback)
3434
3580
  })
3435
3581
  )}
3436
3582
  getState() {
3437
- return getThreadState(this._threadBinding.getState());
3583
+ return this._threadBinding.getStateState();
3438
3584
  }
3439
3585
  append(message) {
3440
3586
  this._threadBinding.getState().append(
@@ -3483,6 +3629,18 @@ var ThreadRuntime = (_class8 = class {
3483
3629
  submitFeedback(options) {
3484
3630
  return this._threadBinding.getState().submitFeedback(options);
3485
3631
  }
3632
+ /**
3633
+ * @deprecated Use `getMesssageById(id).unstable_getMessageByIndex(idx).composer` instead. This will be removed in 0.6.0.
3634
+ */
3635
+ getEditComposer(messageId) {
3636
+ return this._threadBinding.getState().getEditComposer(messageId);
3637
+ }
3638
+ /**
3639
+ * @deprecated Use `getMesssageById(id).unstable_getMessageByIndex(idx).composer.beginEdit()` instead. This will be removed in 0.6.0.
3640
+ */
3641
+ beginEdit(messageId) {
3642
+ return this._threadBinding.getState().beginEdit(messageId);
3643
+ }
3486
3644
  export() {
3487
3645
  return this._threadBinding.getState().export();
3488
3646
  }
@@ -3494,15 +3652,15 @@ var ThreadRuntime = (_class8 = class {
3494
3652
  return new MessageRuntime(
3495
3653
  new ShallowMemoizeSubject({
3496
3654
  getState: () => {
3497
- const messages = this.messages;
3498
- const message = messages[idx];
3499
- if (!message) return void 0;
3655
+ const messages2 = this.getState().messages;
3656
+ const message = messages2[idx];
3657
+ if (!message) return SKIP_UPDATE;
3500
3658
  const branches = this._threadBinding.getState().getBranches(message.id);
3501
3659
  return {
3502
3660
  ...message,
3503
3661
  message,
3504
- isLast: idx === messages.length - 1,
3505
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _123 => _123[idx - 1], 'optionalAccess', _124 => _124.id]), () => ( null)),
3662
+ isLast: idx === messages2.length - 1,
3663
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _179 => _179[idx - 1], 'optionalAccess', _180 => _180.id]), () => ( null)),
3506
3664
  branches,
3507
3665
  branchNumber: branches.indexOf(message.id) + 1,
3508
3666
  branchCount: branches.length
@@ -3513,16 +3671,16 @@ var ThreadRuntime = (_class8 = class {
3513
3671
  this._threadBinding
3514
3672
  );
3515
3673
  }
3516
- }, _class8);
3674
+ }, _class12);
3517
3675
 
3518
3676
  // src/runtimes/edge/converters/fromLanguageModelMessages.ts
3519
3677
  var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3520
- const messages = [];
3678
+ const messages2 = [];
3521
3679
  for (const lmMessage of lm) {
3522
3680
  const role = lmMessage.role;
3523
3681
  switch (role) {
3524
3682
  case "system": {
3525
- messages.push({
3683
+ messages2.push({
3526
3684
  role: "system",
3527
3685
  content: [
3528
3686
  {
@@ -3534,7 +3692,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3534
3692
  break;
3535
3693
  }
3536
3694
  case "user": {
3537
- messages.push({
3695
+ messages2.push({
3538
3696
  role: "user",
3539
3697
  content: lmMessage.content.map((part) => {
3540
3698
  const type = part.type;
@@ -3554,6 +3712,9 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3554
3712
  }
3555
3713
  throw new Error("Only images with URL data are supported");
3556
3714
  }
3715
+ case "file": {
3716
+ throw new Error("File content parts are not supported");
3717
+ }
3557
3718
  default: {
3558
3719
  const unhandledType = type;
3559
3720
  throw new Error(`Unknown content part type: ${unhandledType}`);
@@ -3577,21 +3738,21 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3577
3738
  return part;
3578
3739
  });
3579
3740
  if (mergeRoundtrips) {
3580
- const previousMessage = messages[messages.length - 1];
3581
- if (_optionalChain([previousMessage, 'optionalAccess', _125 => _125.role]) === "assistant") {
3741
+ const previousMessage = messages2[messages2.length - 1];
3742
+ if (_optionalChain([previousMessage, 'optionalAccess', _181 => _181.role]) === "assistant") {
3582
3743
  previousMessage.content.push(...newContent);
3583
3744
  break;
3584
3745
  }
3585
3746
  }
3586
- messages.push({
3747
+ messages2.push({
3587
3748
  role: "assistant",
3588
3749
  content: newContent
3589
3750
  });
3590
3751
  break;
3591
3752
  }
3592
3753
  case "tool": {
3593
- const previousMessage = messages[messages.length - 1];
3594
- if (_optionalChain([previousMessage, 'optionalAccess', _126 => _126.role]) !== "assistant")
3754
+ const previousMessage = messages2[messages2.length - 1];
3755
+ if (_optionalChain([previousMessage, 'optionalAccess', _182 => _182.role]) !== "assistant")
3595
3756
  throw new Error(
3596
3757
  "A tool message must be preceded by an assistant message."
3597
3758
  );
@@ -3616,7 +3777,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3616
3777
  }
3617
3778
  }
3618
3779
  }
3619
- return messages;
3780
+ return messages2;
3620
3781
  };
3621
3782
 
3622
3783
  // src/runtimes/edge/converters/fromLanguageModelTools.ts
@@ -3774,7 +3935,7 @@ var EdgeChatAdapter = class {
3774
3935
  constructor(options) {
3775
3936
  this.options = options;
3776
3937
  }
3777
- async *run({ messages, abortSignal, config }) {
3938
+ async *run({ messages: messages2, abortSignal, config }) {
3778
3939
  const headers = new Headers(this.options.headers);
3779
3940
  headers.set("Content-Type", "application/json");
3780
3941
  const result = await fetch(this.options.api, {
@@ -3783,7 +3944,7 @@ var EdgeChatAdapter = class {
3783
3944
  credentials: _nullishCoalesce(this.options.credentials, () => ( "same-origin")),
3784
3945
  body: JSON.stringify({
3785
3946
  system: config.system,
3786
- messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages),
3947
+ messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages2),
3787
3948
  tools: config.tools ? _chunk5KIEXJRKjs.toLanguageModelTools.call(void 0, config.tools) : [],
3788
3949
  ...config.callSettings,
3789
3950
  ...config.config,
@@ -3820,28 +3981,65 @@ var useEdgeRuntime = ({
3820
3981
  };
3821
3982
 
3822
3983
  // 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);
3984
+ var shouldContinue = (result) => _optionalChain([result, 'access', _183 => _183.status, 'optionalAccess', _184 => _184.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
3985
+
3986
+ // src/runtimes/composer/DefaultEditComposerRuntimeCore.tsx
3987
+ var DefaultEditComposerRuntimeCore = class extends BaseComposerRuntimeCore {
3988
+ constructor(runtime, endEditCallback, { parentId, message }) {
3989
+ super();
3990
+ this.runtime = runtime;
3991
+ this.endEditCallback = endEditCallback;
3992
+ this._parentId = parentId;
3993
+ this._previousText = getThreadMessageText(message);
3994
+ this.setText(this._previousText);
3995
+ this._nonTextParts = message.content.filter(
3996
+ (part) => part.type !== "text" && part.type !== "ui"
3997
+ );
3998
+ }
3999
+ get canCancel() {
4000
+ return true;
4001
+ }
4002
+
4003
+
4004
+
4005
+ async handleSend(message) {
4006
+ const text = getThreadMessageText(message);
4007
+ if (text !== this._previousText) {
4008
+ this.runtime.append({
4009
+ ...message,
4010
+ content: [...message.content, ...this._nonTextParts],
4011
+ parentId: this._parentId
4012
+ });
4013
+ }
4014
+ this.endEditCallback();
4015
+ this.notifySubscribers();
4016
+ }
4017
+ async cancel() {
4018
+ this.endEditCallback();
4019
+ this.notifySubscribers();
4020
+ }
4021
+ };
3824
4022
 
3825
4023
  // 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);
4024
+ var LocalThreadRuntimeCore = (_class13 = class {
4025
+ 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
4026
  this.configProvider = configProvider;
3829
4027
  this.adapter = adapter;
3830
4028
  this.threadId = generateId();
3831
4029
  this.options = options;
3832
4030
  if (initialMessages) {
3833
4031
  let parentId = null;
3834
- const messages = fromCoreMessages(initialMessages);
3835
- for (const message of messages) {
4032
+ const messages2 = fromCoreMessages(initialMessages);
4033
+ for (const message of messages2) {
3836
4034
  this.repository.addOrUpdateMessage(parentId, message);
3837
4035
  parentId = message.id;
3838
4036
  }
3839
4037
  }
3840
4038
  }
3841
- __init19() {this._subscriptions = /* @__PURE__ */ new Set()}
3842
- __init20() {this.abortController = null}
3843
- __init21() {this.repository = new MessageRepository()}
3844
- __init22() {this.capabilities = {
4039
+ __init24() {this._subscriptions = /* @__PURE__ */ new Set()}
4040
+ __init25() {this.abortController = null}
4041
+ __init26() {this.repository = new MessageRepository()}
4042
+ __init27() {this.capabilities = {
3845
4043
  switchToBranch: true,
3846
4044
  edit: true,
3847
4045
  reload: true,
@@ -3852,11 +4050,11 @@ var LocalThreadRuntimeCore = (_class9 = class {
3852
4050
  feedback: false
3853
4051
  }}
3854
4052
 
3855
- __init23() {this.isDisabled = false}
4053
+ __init28() {this.isDisabled = false}
3856
4054
  get messages() {
3857
4055
  return this.repository.getMessages();
3858
4056
  }
3859
- __init24() {this.composer = new BaseThreadComposerRuntimeCore(this)}
4057
+ __init29() {this.composer = new DefaultThreadComposerRuntimeCore(this)}
3860
4058
  getModelConfig() {
3861
4059
  return this.configProvider.getModelConfig();
3862
4060
  }
@@ -3867,24 +4065,41 @@ var LocalThreadRuntimeCore = (_class9 = class {
3867
4065
  set options({ initialMessages, ...options }) {
3868
4066
  this._options = options;
3869
4067
  let hasUpdates = false;
3870
- const canSpeak = _optionalChain([options, 'access', _129 => _129.adapters, 'optionalAccess', _130 => _130.speech]) !== void 0;
4068
+ const canSpeak = _optionalChain([options, 'access', _185 => _185.adapters, 'optionalAccess', _186 => _186.speech]) !== void 0;
3871
4069
  if (this.capabilities.speak !== canSpeak) {
3872
4070
  this.capabilities.speak = canSpeak;
3873
4071
  hasUpdates = true;
3874
4072
  }
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;
4073
+ this.composer.setAttachmentAdapter(_optionalChain([options, 'access', _187 => _187.adapters, 'optionalAccess', _188 => _188.attachments]));
4074
+ const canAttach = _optionalChain([options, 'access', _189 => _189.adapters, 'optionalAccess', _190 => _190.attachments]) !== void 0;
3877
4075
  if (this.capabilities.attachments !== canAttach) {
3878
4076
  this.capabilities.attachments = canAttach;
3879
4077
  hasUpdates = true;
3880
4078
  }
3881
- const canFeedback = _optionalChain([options, 'access', _135 => _135.adapters, 'optionalAccess', _136 => _136.feedback]) !== void 0;
4079
+ const canFeedback = _optionalChain([options, 'access', _191 => _191.adapters, 'optionalAccess', _192 => _192.feedback]) !== void 0;
3882
4080
  if (this.capabilities.feedback !== canFeedback) {
3883
4081
  this.capabilities.feedback = canFeedback;
3884
4082
  hasUpdates = true;
3885
4083
  }
3886
4084
  if (hasUpdates) this.notifySubscribers();
3887
4085
  }
4086
+ __init30() {this._editComposers = /* @__PURE__ */ new Map()}
4087
+ getEditComposer(messageId) {
4088
+ return this._editComposers.get(messageId);
4089
+ }
4090
+ beginEdit(messageId) {
4091
+ if (this._editComposers.has(messageId))
4092
+ throw new Error("Edit already in progress");
4093
+ this._editComposers.set(
4094
+ messageId,
4095
+ new DefaultEditComposerRuntimeCore(
4096
+ this,
4097
+ () => this._editComposers.delete(messageId),
4098
+ this.repository.getMessage(messageId)
4099
+ )
4100
+ );
4101
+ this.notifySubscribers();
4102
+ }
3888
4103
  getBranches(messageId) {
3889
4104
  return this.repository.getBranches(messageId);
3890
4105
  }
@@ -3919,19 +4134,19 @@ var LocalThreadRuntimeCore = (_class9 = class {
3919
4134
  } while (shouldContinue(message));
3920
4135
  }
3921
4136
  async performRoundtrip(parentId, message) {
3922
- const messages = this.repository.getMessages();
3923
- _optionalChain([this, 'access', _137 => _137.abortController, 'optionalAccess', _138 => _138.abort, 'call', _139 => _139()]);
4137
+ const messages2 = this.repository.getMessages();
4138
+ _optionalChain([this, 'access', _193 => _193.abortController, 'optionalAccess', _194 => _194.abort, 'call', _195 => _195()]);
3924
4139
  this.abortController = new AbortController();
3925
4140
  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]);
4141
+ const initialRoundtrips = _optionalChain([message, 'access', _196 => _196.metadata, 'optionalAccess', _197 => _197.roundtrips]);
4142
+ const initalCustom = _optionalChain([message, 'access', _198 => _198.metadata, 'optionalAccess', _199 => _199.custom]);
3928
4143
  const updateMessage = (m) => {
3929
4144
  message = {
3930
4145
  ...message,
3931
4146
  ...m.content ? { content: [...initialContent, ..._nullishCoalesce(m.content, () => ( []))] } : void 0,
3932
4147
  status: _nullishCoalesce(m.status, () => ( message.status)),
3933
4148
  // TODO deprecated, remove in v0.6
3934
- ..._optionalChain([m, 'access', _144 => _144.metadata, 'optionalAccess', _145 => _145.roundtrips]) ? {
4149
+ ..._optionalChain([m, 'access', _200 => _200.metadata, 'optionalAccess', _201 => _201.roundtrips]) ? {
3935
4150
  roundtrips: [
3936
4151
  ..._nullishCoalesce(initialRoundtrips, () => ( [])),
3937
4152
  ...m.metadata.roundtrips
@@ -3946,7 +4161,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
3946
4161
  ...m.metadata.roundtrips
3947
4162
  ]
3948
4163
  } : void 0,
3949
- ..._optionalChain([m, 'access', _146 => _146.metadata, 'optionalAccess', _147 => _147.custom]) ? {
4164
+ ..._optionalChain([m, 'access', _202 => _202.metadata, 'optionalAccess', _203 => _203.custom]) ? {
3950
4165
  custom: { ..._nullishCoalesce(initalCustom, () => ( {})), ...m.metadata.custom }
3951
4166
  } : void 0
3952
4167
  }
@@ -3956,7 +4171,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
3956
4171
  this.notifySubscribers();
3957
4172
  };
3958
4173
  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));
4174
+ const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _204 => _204.metadata, 'optionalAccess', _205 => _205.roundtrips, 'optionalAccess', _206 => _206.length]), () => ( 0));
3960
4175
  if (toolRoundtrips > maxToolRoundtrips) {
3961
4176
  updateMessage({
3962
4177
  status: {
@@ -3974,7 +4189,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
3974
4189
  }
3975
4190
  try {
3976
4191
  const promiseOrGenerator = this.adapter.run({
3977
- messages,
4192
+ messages: messages2,
3978
4193
  abortSignal: this.abortController.signal,
3979
4194
  config: this.configProvider.getModelConfig(),
3980
4195
  onUpdate: updateMessage
@@ -4055,7 +4270,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4055
4270
  // TODO lift utterance state to thread runtime
4056
4271
 
4057
4272
  speak(messageId) {
4058
- const adapter = _optionalChain([this, 'access', _151 => _151.options, 'access', _152 => _152.adapters, 'optionalAccess', _153 => _153.speech]);
4273
+ const adapter = _optionalChain([this, 'access', _207 => _207.options, 'access', _208 => _208.adapters, 'optionalAccess', _209 => _209.speech]);
4059
4274
  if (!adapter) throw new Error("Speech adapter not configured");
4060
4275
  const { message } = this.repository.getMessage(messageId);
4061
4276
  if (this._utterance) {
@@ -4072,7 +4287,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4072
4287
  return this._utterance;
4073
4288
  }
4074
4289
  submitFeedback({ messageId, type }) {
4075
- const adapter = _optionalChain([this, 'access', _154 => _154.options, 'access', _155 => _155.adapters, 'optionalAccess', _156 => _156.feedback]);
4290
+ const adapter = _optionalChain([this, 'access', _210 => _210.options, 'access', _211 => _211.adapters, 'optionalAccess', _212 => _212.feedback]);
4076
4291
  if (!adapter) throw new Error("Feedback adapter not configured");
4077
4292
  const { message } = this.repository.getMessage(messageId);
4078
4293
  adapter.submit({ message, type });
@@ -4084,7 +4299,7 @@ var LocalThreadRuntimeCore = (_class9 = class {
4084
4299
  this.repository.import(data);
4085
4300
  this.notifySubscribers();
4086
4301
  }
4087
- }, _class9);
4302
+ }, _class13);
4088
4303
 
4089
4304
  // src/runtimes/local/LocalRuntimeCore.tsx
4090
4305
  var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
@@ -4116,10 +4331,10 @@ var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
4116
4331
  } = {}) {
4117
4332
  this.switchToThread(null);
4118
4333
  if (!initialMessages) return;
4119
- const messages = fromCoreMessages(initialMessages);
4334
+ const messages2 = fromCoreMessages(initialMessages);
4120
4335
  this.thread.import({
4121
- messages: messages.map((m, idx) => ({
4122
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _157 => _157[idx - 1], 'optionalAccess', _158 => _158.id]), () => ( null)),
4336
+ messages: messages2.map((m, idx) => ({
4337
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _213 => _213[idx - 1], 'optionalAccess', _214 => _214.id]), () => ( null)),
4123
4338
  message: m
4124
4339
  }))
4125
4340
  });
@@ -4155,17 +4370,17 @@ var getExternalStoreMessage = (message) => {
4155
4370
  };
4156
4371
 
4157
4372
  // 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) => {
4373
+ var ThreadMessageConverter = (_class14 = class {constructor() { _class14.prototype.__init31.call(this); }
4374
+ __init31() {this.cache = /* @__PURE__ */ new WeakMap()}
4375
+ convertMessages(messages2, converter) {
4376
+ return messages2.map((m, idx) => {
4162
4377
  const cached = this.cache.get(m);
4163
4378
  const newMessage = converter(cached, m, idx);
4164
4379
  this.cache.set(m, newMessage);
4165
4380
  return newMessage;
4166
4381
  });
4167
4382
  }
4168
- }, _class10);
4383
+ }, _class14);
4169
4384
 
4170
4385
  // src/runtimes/external-store/auto-status.tsx
4171
4386
  var AUTO_STATUS_RUNNING = Object.freeze({ type: "running" });
@@ -4251,18 +4466,18 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
4251
4466
  };
4252
4467
 
4253
4468
  // 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";
4469
+ var hasUpcomingMessage = (isRunning, messages2) => {
4470
+ return isRunning && _optionalChain([messages2, 'access', _215 => _215[messages2.length - 1], 'optionalAccess', _216 => _216.role]) !== "assistant";
4256
4471
  };
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);
4472
+ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4473
+ 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
4474
  this.configProvider = configProvider;
4260
4475
  this.store = store;
4261
4476
  }
4262
- __init26() {this._subscriptions = /* @__PURE__ */ new Set()}
4263
- __init27() {this.repository = new MessageRepository()}
4264
- __init28() {this.assistantOptimisticId = null}
4265
- __init29() {this._capabilities = {
4477
+ __init32() {this._subscriptions = /* @__PURE__ */ new Set()}
4478
+ __init33() {this.repository = new MessageRepository()}
4479
+ __init34() {this.assistantOptimisticId = null}
4480
+ __init35() {this._capabilities = {
4266
4481
  switchToBranch: false,
4267
4482
  edit: false,
4268
4483
  reload: false,
@@ -4278,9 +4493,26 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4278
4493
 
4279
4494
 
4280
4495
 
4281
- __init30() {this.converter = new ThreadMessageConverter()}
4496
+ __init36() {this.converter = new ThreadMessageConverter()}
4282
4497
 
4283
- __init31() {this.composer = new BaseThreadComposerRuntimeCore(this)}
4498
+ __init37() {this.composer = new DefaultThreadComposerRuntimeCore(this)}
4499
+ __init38() {this._editComposers = /* @__PURE__ */ new Map()}
4500
+ getEditComposer(messageId) {
4501
+ return this._editComposers.get(messageId);
4502
+ }
4503
+ beginEdit(messageId) {
4504
+ if (this._editComposers.has(messageId))
4505
+ throw new Error("Edit already in progress");
4506
+ this._editComposers.set(
4507
+ messageId,
4508
+ new DefaultEditComposerRuntimeCore(
4509
+ this,
4510
+ () => this._editComposers.delete(messageId),
4511
+ this.repository.getMessage(messageId)
4512
+ )
4513
+ );
4514
+ this.notifySubscribers();
4515
+ }
4284
4516
  get store() {
4285
4517
  return this._store;
4286
4518
  }
@@ -4297,12 +4529,12 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4297
4529
  reload: this._store.onReload !== void 0,
4298
4530
  cancel: this._store.onCancel !== void 0,
4299
4531
  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,
4532
+ unstable_copy: _optionalChain([this, 'access', _220 => _220._store, 'access', _221 => _221.unstable_capabilities, 'optionalAccess', _222 => _222.copy]) !== false,
4301
4533
  // 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])
4534
+ attachments: !!_optionalChain([this, 'access', _223 => _223.store, 'access', _224 => _224.adapters, 'optionalAccess', _225 => _225.attachments]),
4535
+ feedback: !!_optionalChain([this, 'access', _226 => _226.store, 'access', _227 => _227.adapters, 'optionalAccess', _228 => _228.feedback])
4304
4536
  };
4305
- this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _173 => _173._store, 'access', _174 => _174.adapters, 'optionalAccess', _175 => _175.attachments]));
4537
+ this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _229 => _229._store, 'access', _230 => _230.adapters, 'optionalAccess', _231 => _231.attachments]));
4306
4538
  if (oldStore) {
4307
4539
  if (oldStore.convertMessage !== store.convertMessage) {
4308
4540
  this.converter = new ThreadMessageConverter();
@@ -4311,7 +4543,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4311
4543
  return;
4312
4544
  }
4313
4545
  }
4314
- const messages = !store.convertMessage ? store.messages : this.converter.convertMessages(store.messages, (cache, m, idx) => {
4546
+ const messages2 = !store.convertMessage ? store.messages : this.converter.convertMessages(store.messages, (cache, m, idx) => {
4315
4547
  if (!store.convertMessage) return m;
4316
4548
  const isLast = idx === store.messages.length - 1;
4317
4549
  const autoStatus = getAutoStatus(isLast, isRunning);
@@ -4325,18 +4557,18 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4325
4557
  newMessage[symbolInnerMessage] = m;
4326
4558
  return newMessage;
4327
4559
  });
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);
4560
+ for (let i = 0; i < messages2.length; i++) {
4561
+ const message = messages2[i];
4562
+ const parent = messages2[i - 1];
4563
+ this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _232 => _232.id]), () => ( null)), message);
4332
4564
  }
4333
4565
  if (this.assistantOptimisticId) {
4334
4566
  this.repository.deleteMessage(this.assistantOptimisticId);
4335
4567
  this.assistantOptimisticId = null;
4336
4568
  }
4337
- if (hasUpcomingMessage(isRunning, messages)) {
4569
+ if (hasUpcomingMessage(isRunning, messages2)) {
4338
4570
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
4339
- _nullishCoalesce(_optionalChain([messages, 'access', _177 => _177.at, 'call', _178 => _178(-1), 'optionalAccess', _179 => _179.id]), () => ( null)),
4571
+ _nullishCoalesce(_optionalChain([messages2, 'access', _233 => _233.at, 'call', _234 => _234(-1), 'optionalAccess', _235 => _235.id]), () => ( null)),
4340
4572
  {
4341
4573
  role: "assistant",
4342
4574
  content: []
@@ -4344,7 +4576,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4344
4576
  );
4345
4577
  }
4346
4578
  this.repository.resetHead(
4347
- _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _180 => _180.at, 'call', _181 => _181(-1), 'optionalAccess', _182 => _182.id]))), () => ( null))
4579
+ _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages2, 'access', _236 => _236.at, 'call', _237 => _237(-1), 'optionalAccess', _238 => _238.id]))), () => ( null))
4348
4580
  );
4349
4581
  this.messages = this.repository.getMessages();
4350
4582
  this.notifySubscribers();
@@ -4365,7 +4597,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4365
4597
  this.updateMessages(this.repository.getMessages());
4366
4598
  }
4367
4599
  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)))) {
4600
+ if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _239 => _239.messages, 'access', _240 => _240.at, 'call', _241 => _241(-1), 'optionalAccess', _242 => _242.id]), () => ( null)))) {
4369
4601
  if (!this._store.onEdit)
4370
4602
  throw new Error("Runtime does not support editing messages.");
4371
4603
  await this._store.onEdit(message);
@@ -4386,19 +4618,19 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4386
4618
  this.repository.deleteMessage(this.assistantOptimisticId);
4387
4619
  this.assistantOptimisticId = null;
4388
4620
  }
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])) {
4621
+ let messages2 = this.repository.getMessages();
4622
+ const previousMessage = messages2[messages2.length - 1];
4623
+ if (_optionalChain([previousMessage, 'optionalAccess', _243 => _243.role]) === "user" && previousMessage.id === _optionalChain([messages2, 'access', _244 => _244.at, 'call', _245 => _245(-1), 'optionalAccess', _246 => _246.id])) {
4392
4624
  this.repository.deleteMessage(previousMessage.id);
4393
4625
  if (!this.composer.text.trim()) {
4394
4626
  this.composer.setText(getThreadMessageText(previousMessage));
4395
4627
  }
4396
- messages = this.repository.getMessages();
4628
+ messages2 = this.repository.getMessages();
4397
4629
  } else {
4398
4630
  this.notifySubscribers();
4399
4631
  }
4400
4632
  setTimeout(() => {
4401
- this.updateMessages(messages);
4633
+ this.updateMessages(messages2);
4402
4634
  }, 0);
4403
4635
  }
4404
4636
  addToolResult(options) {
@@ -4413,7 +4645,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4413
4645
  return this._store.onSpeak(message);
4414
4646
  }
4415
4647
  submitFeedback({ messageId, type }) {
4416
- const adapter = _optionalChain([this, 'access', _191 => _191._store, 'access', _192 => _192.adapters, 'optionalAccess', _193 => _193.feedback]);
4648
+ const adapter = _optionalChain([this, 'access', _247 => _247._store, 'access', _248 => _248.adapters, 'optionalAccess', _249 => _249.feedback]);
4417
4649
  if (!adapter) throw new Error("Feedback adapter not configured");
4418
4650
  const { message } = this.repository.getMessage(messageId);
4419
4651
  adapter.submit({ message, type });
@@ -4422,9 +4654,9 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4422
4654
  this._subscriptions.add(callback);
4423
4655
  return () => this._subscriptions.delete(callback);
4424
4656
  }
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)
4657
+ __init39() {this.updateMessages = (messages2) => {
4658
+ _optionalChain([this, 'access', _250 => _250._store, 'access', _251 => _251.setMessages, 'optionalCall', _252 => _252(
4659
+ messages2.flatMap(getExternalStoreMessage).filter((m) => m != null)
4428
4660
  )]);
4429
4661
  }}
4430
4662
  import(repository) {
@@ -4433,7 +4665,7 @@ var ExternalStoreThreadRuntimeCore = (_class11 = class {
4433
4665
  export() {
4434
4666
  return this.repository.export();
4435
4667
  }
4436
- }, _class11);
4668
+ }, _class15);
4437
4669
 
4438
4670
  // src/runtimes/external-store/ExternalStoreRuntimeCore.tsx
4439
4671
  var ExternalStoreRuntimeCore = class extends BaseAssistantRuntimeCore {
@@ -4491,12 +4723,12 @@ var useExternalStoreRuntime = (store) => {
4491
4723
 
4492
4724
  // src/runtimes/external-store/external-message-converter.tsx
4493
4725
 
4494
- var joinExternalMessages = (messages) => {
4726
+ var joinExternalMessages = (messages2) => {
4495
4727
  const assistantMessage = {
4496
4728
  role: "assistant",
4497
4729
  content: []
4498
4730
  };
4499
- for (const output of messages) {
4731
+ for (const output of messages2) {
4500
4732
  if (output.role === "tool") {
4501
4733
  const toolCallIdx = assistantMessage.content.findIndex(
4502
4734
  (c) => c.type === "tool-call" && c.toolCallId === output.toolCallId
@@ -4573,7 +4805,7 @@ var chunkExternalMessages = (callbackResults) => {
4573
4805
  };
4574
4806
  var useExternalMessageConverter = ({
4575
4807
  callback,
4576
- messages,
4808
+ messages: messages2,
4577
4809
  isRunning
4578
4810
  }) => {
4579
4811
  const state = _react.useMemo.call(void 0,
@@ -4587,7 +4819,7 @@ var useExternalMessageConverter = ({
4587
4819
  );
4588
4820
  return _react.useMemo.call(void 0, () => {
4589
4821
  const callbackResults = [];
4590
- for (const message of messages) {
4822
+ for (const message of messages2) {
4591
4823
  let result = state.callbackCache.get(message);
4592
4824
  if (!result) {
4593
4825
  const output = state.callback(message);
@@ -4625,7 +4857,7 @@ var useExternalMessageConverter = ({
4625
4857
  return newMessage;
4626
4858
  }
4627
4859
  );
4628
- }, [state, messages, isRunning]);
4860
+ }, [state, messages2, isRunning]);
4629
4861
  };
4630
4862
  var shallowArrayEqual = (a, b) => {
4631
4863
  if (a.length !== b.length) return false;
@@ -4643,13 +4875,13 @@ var DangerousInBrowserAdapter = class {
4643
4875
  constructor(options) {
4644
4876
  this.options = options;
4645
4877
  }
4646
- async *run({ messages, abortSignal, config }) {
4878
+ async *run({ messages: messages2, abortSignal, config }) {
4647
4879
  const res = await _chunk5KIEXJRKjs.getEdgeRuntimeStream.call(void 0, {
4648
4880
  options: this.options,
4649
4881
  abortSignal,
4650
4882
  requestData: {
4651
4883
  system: config.system,
4652
- messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages),
4884
+ messages: _chunk5KIEXJRKjs.toCoreMessages.call(void 0, messages2),
4653
4885
  tools: config.tools ? _chunk5KIEXJRKjs.toLanguageModelTools.call(void 0, config.tools) : [],
4654
4886
  ...config.callSettings,
4655
4887
  ...config.config
@@ -4713,19 +4945,22 @@ var WebSpeechSynthesisAdapter = class {
4713
4945
  };
4714
4946
 
4715
4947
  // src/runtimes/attachment/SimpleImageAttachmentAdapter.ts
4716
- var SimpleImageAttachmentAdapter = (_class12 = class {constructor() { _class12.prototype.__init33.call(this); }
4717
- __init33() {this.accept = "image/*"}
4948
+ var SimpleImageAttachmentAdapter = (_class16 = class {constructor() { _class16.prototype.__init40.call(this); }
4949
+ __init40() {this.accept = "image/*"}
4718
4950
  async add(state) {
4719
4951
  return {
4720
4952
  id: state.file.name,
4721
4953
  type: "image",
4722
4954
  name: state.file.name,
4723
- file: state.file
4955
+ contentType: state.file.type,
4956
+ file: state.file,
4957
+ status: { type: "requires-action", reason: "composer-send" }
4724
4958
  };
4725
4959
  }
4726
4960
  async send(attachment) {
4727
4961
  return {
4728
4962
  ...attachment,
4963
+ status: { type: "complete" },
4729
4964
  content: [
4730
4965
  {
4731
4966
  type: "image",
@@ -4736,7 +4971,7 @@ var SimpleImageAttachmentAdapter = (_class12 = class {constructor() { _class12.p
4736
4971
  }
4737
4972
  async remove() {
4738
4973
  }
4739
- }, _class12);
4974
+ }, _class16);
4740
4975
  var getFileDataURL = (file) => new Promise((resolve, reject) => {
4741
4976
  const reader = new FileReader();
4742
4977
  reader.onload = () => resolve(reader.result);
@@ -4745,19 +4980,22 @@ var getFileDataURL = (file) => new Promise((resolve, reject) => {
4745
4980
  });
4746
4981
 
4747
4982
  // 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"}
4983
+ var SimpleTextAttachmentAdapter = (_class17 = class {constructor() { _class17.prototype.__init41.call(this); }
4984
+ __init41() {this.accept = "text/plain,text/html,text/markdown,text/csv,text/xml,text/json,text/css"}
4750
4985
  async add(state) {
4751
4986
  return {
4752
4987
  id: state.file.name,
4753
4988
  type: "document",
4754
4989
  name: state.file.name,
4755
- file: state.file
4990
+ contentType: state.file.type,
4991
+ file: state.file,
4992
+ status: { type: "requires-action", reason: "composer-send" }
4756
4993
  };
4757
4994
  }
4758
4995
  async send(attachment) {
4759
4996
  return {
4760
4997
  ...attachment,
4998
+ status: { type: "complete" },
4761
4999
  content: [
4762
5000
  {
4763
5001
  type: "text",
@@ -4770,7 +5008,7 @@ ${await getFileText(attachment.file)}
4770
5008
  }
4771
5009
  async remove() {
4772
5010
  }
4773
- }, _class13);
5011
+ }, _class17);
4774
5012
  var getFileText = (file) => new Promise((resolve, reject) => {
4775
5013
  const reader = new FileReader();
4776
5014
  reader.onload = () => resolve(reader.result);
@@ -4840,7 +5078,14 @@ var CompositeAttachmentAdapter = class {
4840
5078
  async remove(attachment) {
4841
5079
  const adapters = this._adapters.slice();
4842
5080
  for (const adapter of adapters) {
4843
- if (fileMatchesAccept(attachment.file, adapter.accept)) {
5081
+ if (fileMatchesAccept(
5082
+ {
5083
+ name: attachment.name,
5084
+ type: _nullishCoalesce(attachment.contentType, () => ( "unknown/unknown"))
5085
+ // TODO remove after 0.6.0
5086
+ },
5087
+ adapter.accept
5088
+ )) {
4844
5089
  return adapter.remove(attachment);
4845
5090
  }
4846
5091
  }
@@ -4864,7 +5109,7 @@ var ThreadConfigProvider = ({
4864
5109
  }) => {
4865
5110
  const hasAssistant = !!useAssistantRuntime({ optional: true });
4866
5111
  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;
5112
+ if (!_optionalChain([config, 'optionalAccess', _253 => _253.runtime])) return configProvider;
4868
5113
  if (hasAssistant) {
4869
5114
  throw new Error(
4870
5115
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -5058,7 +5303,7 @@ var useAllowBranchPicker = (ensureCapability = false) => {
5058
5303
  return allowBranchPicker && (!ensureCapability || branchPickerSupported);
5059
5304
  };
5060
5305
  var BranchPicker = () => {
5061
- const allowBranchPicker = useAllowBranchPicker();
5306
+ const allowBranchPicker = useAllowBranchPicker(true);
5062
5307
  if (!allowBranchPicker) return null;
5063
5308
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, BranchPickerRoot, { hideWhenSingleBranch: true, children: [
5064
5309
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BranchPickerPrevious2, {}),
@@ -5192,7 +5437,7 @@ var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: comp
5192
5437
  {
5193
5438
  components: {
5194
5439
  ...componentsProp,
5195
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _198 => _198.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5440
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _254 => _254.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5196
5441
  tools: toolsComponents
5197
5442
  }
5198
5443
  }
@@ -5247,7 +5492,7 @@ var ComposerAttachmentRoot = withDefaults("div", {
5247
5492
  });
5248
5493
  ComposerAttachmentRoot.displayName = "ComposerAttachmentRoot";
5249
5494
  var ComposerAttachment2 = () => {
5250
- const attachment = useComposerAttachment((a) => a.attachment);
5495
+ const attachment = useThreadComposerAttachment((a) => a.attachment);
5251
5496
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ComposerAttachmentRoot, { children: [
5252
5497
  ".",
5253
5498
  attachment.name.split(".").pop(),
@@ -5261,10 +5506,9 @@ var ComposerAttachmentRemove = _react.forwardRef.call(void 0, (props, ref) => {
5261
5506
  composer: { removeAttachment: { tooltip = "Remove file" } = {} } = {}
5262
5507
  } = {}
5263
5508
  } = useThreadConfig();
5264
- const composerStore = useThreadComposerStore();
5265
- const attachmentStore = useAttachmentStore();
5509
+ const attachmentRuntime = useAttachmentRuntime();
5266
5510
  const handleRemoveAttachment = () => {
5267
- composerStore.getState().removeAttachment(attachmentStore.getState().attachment.id);
5511
+ attachmentRuntime.remove();
5268
5512
  };
5269
5513
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
5270
5514
  TooltipIconButton,
@@ -5335,7 +5579,7 @@ var ComposerAttachments = ({ components }) => {
5335
5579
  {
5336
5580
  components: {
5337
5581
  ...components,
5338
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _199 => _199.Attachment]), () => ( composer_attachment_default))
5582
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _255 => _255.Attachment]), () => ( composer_attachment_default))
5339
5583
  }
5340
5584
  }
5341
5585
  ) });
@@ -5467,7 +5711,7 @@ var ThreadWelcomeSuggestion = ({
5467
5711
  };
5468
5712
  var ThreadWelcomeSuggestions = () => {
5469
5713
  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) => {
5714
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _256 => _256.map, 'call', _257 => _257((suggestion, idx) => {
5471
5715
  const key = `${suggestion.prompt}-${idx}`;
5472
5716
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
5473
5717
  })]) });
@@ -5566,7 +5810,7 @@ var UserMessageContent = _react.forwardRef.call(void 0,
5566
5810
  {
5567
5811
  components: {
5568
5812
  ...components,
5569
- Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _202 => _202.Text]), () => ( content_part_default.Text))
5813
+ Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _258 => _258.Text]), () => ( content_part_default.Text))
5570
5814
  }
5571
5815
  }
5572
5816
  ) });
@@ -5584,7 +5828,7 @@ var UserMessageAttachments = ({
5584
5828
  {
5585
5829
  components: {
5586
5830
  ...components,
5587
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _203 => _203.Attachment]), () => ( user_message_attachment_default))
5831
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _259 => _259.Attachment]), () => ( user_message_attachment_default))
5588
5832
  }
5589
5833
  }
5590
5834
  ) }) });
@@ -5685,10 +5929,10 @@ var ThreadMessages = ({ components, ...rest }) => {
5685
5929
  thread_exports.Messages,
5686
5930
  {
5687
5931
  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))
5932
+ UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _260 => _260.UserMessage]), () => ( user_message_default)),
5933
+ EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _261 => _261.EditComposer]), () => ( edit_composer_default)),
5934
+ AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _262 => _262.AssistantMessage]), () => ( assistant_message_default)),
5935
+ SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _263 => _263.SystemMessage]), () => ( SystemMessage))
5692
5936
  },
5693
5937
  ...rest
5694
5938
  }
@@ -5908,5 +6152,7 @@ var assistant_modal_default = Object.assign(AssistantModal, exports13);
5908
6152
 
5909
6153
 
5910
6154
 
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;
6155
+
6156
+
6157
+ 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
6158
  //# sourceMappingURL=index.js.map