@assistant-ui/react 0.5.45 → 0.5.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8;"use client";
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;"use client";
2
2
 
3
3
 
4
4
 
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- var _chunkBQ3MRWUVjs = require('./chunk-BQ3MRWUV.js');
13
+ var _chunkBNSCUYW7js = require('./chunk-BNSCUYW7.js');
14
14
 
15
15
 
16
16
  var _chunkDCHYNTHIjs = require('./chunk-DCHYNTHI.js');
@@ -42,7 +42,7 @@ var _zustand = require('zustand');
42
42
  var ProxyConfigProvider = (_class = class {constructor() { _class.prototype.__init.call(this); }
43
43
  __init() {this._providers = /* @__PURE__ */ new Set()}
44
44
  getModelConfig() {
45
- return _chunkBQ3MRWUVjs.mergeModelConfigs.call(void 0, this._providers);
45
+ return _chunkBNSCUYW7js.mergeModelConfigs.call(void 0, this._providers);
46
46
  }
47
47
  registerModelConfigProvider(provider) {
48
48
  this._providers.add(provider);
@@ -125,21 +125,26 @@ var makeComposerStore = (useThreadRuntime) => {
125
125
  setValue(value) {
126
126
  get().setText(value);
127
127
  },
128
+ attachments: runtime.composer.attachments,
129
+ addAttachment: (file) => {
130
+ useThreadRuntime.getState().composer.addAttachment(file);
131
+ },
132
+ removeAttachment: (attachmentId) => {
133
+ useThreadRuntime.getState().composer.removeAttachment(attachmentId);
134
+ },
135
+ reset: () => {
136
+ useThreadRuntime.getState().composer.reset();
137
+ },
128
138
  text: runtime.composer.text,
129
- setText: (value) => {
130
- useThreadRuntime.getState().composer.setText(value);
139
+ setText: (text) => {
140
+ useThreadRuntime.getState().composer.setText(text);
131
141
  },
132
142
  canCancel: runtime.capabilities.cancel,
133
143
  isEditing: true,
144
+ isEmpty: runtime.composer.isEmpty,
134
145
  send: () => {
135
146
  const runtime2 = useThreadRuntime.getState();
136
- const text = runtime2.composer.text;
137
- runtime2.composer.setText("");
138
- runtime2.append({
139
- parentId: _nullishCoalesce(_optionalChain([runtime2, 'access', _6 => _6.messages, 'access', _7 => _7.at, 'call', _8 => _8(-1), 'optionalAccess', _9 => _9.id]), () => ( null)),
140
- role: "user",
141
- content: [{ type: "text", text }]
142
- });
147
+ runtime2.composer.send();
143
148
  },
144
149
  cancel: () => {
145
150
  useThreadRuntime.getState().cancelRun();
@@ -167,7 +172,7 @@ var getThreadStateFromRuntime = (runtime) => {
167
172
  threadId: runtime.threadId,
168
173
  capabilities: runtime.capabilities,
169
174
  isDisabled: runtime.isDisabled,
170
- isRunning: _optionalChain([lastMessage, 'optionalAccess', _10 => _10.role]) !== "assistant" ? false : lastMessage.status.type === "running"
175
+ isRunning: _optionalChain([lastMessage, 'optionalAccess', _6 => _6.role]) !== "assistant" ? false : lastMessage.status.type === "running"
171
176
  });
172
177
  };
173
178
  var makeThreadStore = (runtimeRef) => {
@@ -228,7 +233,7 @@ var subscribeToMainThread = (runtime, callback) => {
228
233
  let first = true;
229
234
  let cleanup;
230
235
  const inner = () => {
231
- _optionalChain([cleanup, 'optionalCall', _11 => _11()]);
236
+ _optionalChain([cleanup, 'optionalCall', _7 => _7()]);
232
237
  cleanup = runtime.thread.subscribe(callback);
233
238
  if (!first) {
234
239
  callback();
@@ -239,7 +244,7 @@ var subscribeToMainThread = (runtime, callback) => {
239
244
  inner();
240
245
  return () => {
241
246
  unsubscribe();
242
- _optionalChain([cleanup, 'optionalCall', _12 => _12()]);
247
+ _optionalChain([cleanup, 'optionalCall', _8 => _8()]);
243
248
  };
244
249
  };
245
250
 
@@ -275,6 +280,7 @@ _chunkDCHYNTHIjs.__export.call(void 0, internal_exports, {
275
280
  BaseAssistantRuntime: () => BaseAssistantRuntime,
276
281
  MessageRepository: () => MessageRepository,
277
282
  ProxyConfigProvider: () => ProxyConfigProvider,
283
+ ThreadRuntimeComposer: () => ThreadRuntimeComposer,
278
284
  TooltipIconButton: () => TooltipIconButton,
279
285
  generateId: () => generateId,
280
286
  useSmooth: () => useSmooth,
@@ -282,6 +288,76 @@ _chunkDCHYNTHIjs.__export.call(void 0, internal_exports, {
282
288
  withSmoothContextProvider: () => withSmoothContextProvider
283
289
  });
284
290
 
291
+ // src/runtimes/utils/ThreadRuntimeComposer.tsx
292
+ var ThreadRuntimeComposer = (_class3 = class {
293
+ constructor(runtime, notifySubscribers) {;_class3.prototype.__init4.call(this);_class3.prototype.__init5.call(this);_class3.prototype.__init6.call(this);
294
+ this.runtime = runtime;
295
+ this.notifySubscribers = notifySubscribers;
296
+ }
297
+
298
+ __init4() {this.attachmentAccept = "*"}
299
+ get isEmpty() {
300
+ return !this.text.trim() && !this.attachments.length;
301
+ }
302
+ setAttachmentAdapter(adapter) {
303
+ this._attachmentAdapter = adapter;
304
+ const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _9 => _9.accept]), () => ( "*"));
305
+ if (this.attachmentAccept !== accept) {
306
+ this.attachmentAccept = accept;
307
+ return true;
308
+ }
309
+ return false;
310
+ }
311
+ __init5() {this._attachments = []}
312
+ get attachments() {
313
+ return this._attachments;
314
+ }
315
+ async addAttachment(file) {
316
+ if (!this._attachmentAdapter)
317
+ throw new Error("Attachments are not supported");
318
+ const attachment = await this._attachmentAdapter.add({ file });
319
+ this._attachments = [...this._attachments, attachment];
320
+ this.notifySubscribers();
321
+ }
322
+ async removeAttachment(attachmentId) {
323
+ if (!this._attachmentAdapter)
324
+ throw new Error("Attachments are not supported");
325
+ const index = this._attachments.findIndex((a) => a.id === attachmentId);
326
+ if (index === -1) throw new Error("Attachment not found");
327
+ const attachment = this._attachments[index];
328
+ await this._attachmentAdapter.remove(attachment);
329
+ this._attachments = this._attachments.toSpliced(index, 1);
330
+ this.notifySubscribers();
331
+ }
332
+ __init6() {this._text = ""}
333
+ get text() {
334
+ return this._text;
335
+ }
336
+ setText(value) {
337
+ this._text = value;
338
+ this.notifySubscribers();
339
+ }
340
+ reset() {
341
+ this._text = "";
342
+ this._attachments = [];
343
+ this.notifySubscribers();
344
+ }
345
+ async send() {
346
+ const attachments = this._attachmentAdapter ? await Promise.all(
347
+ this.attachments.map(
348
+ async (a) => await this._attachmentAdapter.send(a)
349
+ )
350
+ ) : [];
351
+ this.runtime.append({
352
+ parentId: _nullishCoalesce(_optionalChain([this, 'access', _10 => _10.runtime, 'access', _11 => _11.messages, 'access', _12 => _12.at, 'call', _13 => _13(-1), 'optionalAccess', _14 => _14.id]), () => ( null)),
353
+ role: "user",
354
+ content: this.text ? [{ type: "text", text: this.text }] : [],
355
+ attachments
356
+ });
357
+ this.reset();
358
+ }
359
+ }, _class3);
360
+
285
361
  // src/utils/idUtils.tsx
286
362
  var _nonsecure = require('nanoid/non-secure');
287
363
  var generateId = _nonsecure.customAlphabet.call(void 0,
@@ -324,7 +400,8 @@ var fromCoreMessage = (message, {
324
400
  return {
325
401
  ...commonProps,
326
402
  role,
327
- content: message.content
403
+ content: message.content,
404
+ attachments: []
328
405
  };
329
406
  case "system":
330
407
  return {
@@ -345,11 +422,11 @@ var findHead = (message) => {
345
422
  if ("current" in message) return message;
346
423
  return null;
347
424
  };
348
- var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__init4.call(this);_class3.prototype.__init5.call(this);_class3.prototype.__init6.call(this); }
349
- __init4() {this.messages = /* @__PURE__ */ new Map()}
425
+ var MessageRepository = (_class4 = class {constructor() { _class4.prototype.__init7.call(this);_class4.prototype.__init8.call(this);_class4.prototype.__init9.call(this); }
426
+ __init7() {this.messages = /* @__PURE__ */ new Map()}
350
427
  // message_id -> item
351
- __init5() {this.head = null}
352
- __init6() {this.root = {
428
+ __init8() {this.head = null}
429
+ __init9() {this.root = {
353
430
  children: [],
354
431
  next: null
355
432
  }}
@@ -391,7 +468,7 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
391
468
  }
392
469
  }
393
470
  getMessages() {
394
- const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _13 => _13.head, 'optionalAccess', _14 => _14.level]), () => ( 0)));
471
+ const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _15 => _15.head, 'optionalAccess', _16 => _16.level]), () => ( 0)));
395
472
  for (let current = this.head; current; current = current.prev) {
396
473
  messages[current.level] = current.current;
397
474
  }
@@ -429,7 +506,7 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
429
506
  "MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui."
430
507
  );
431
508
  return {
432
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _15 => _15.prev, 'optionalAccess', _16 => _16.current, 'access', _17 => _17.id]), () => ( null)),
509
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _17 => _17.prev, 'optionalAccess', _18 => _18.current, 'access', _19 => _19.id]), () => ( null)),
433
510
  message: message.current
434
511
  };
435
512
  }
@@ -513,11 +590,11 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
513
590
  for (const [, message] of this.messages) {
514
591
  exportItems.push({
515
592
  message: message.current,
516
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _18 => _18.prev, 'optionalAccess', _19 => _19.current, 'access', _20 => _20.id]), () => ( null))
593
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _20 => _20.prev, 'optionalAccess', _21 => _21.current, 'access', _22 => _22.id]), () => ( null))
517
594
  });
518
595
  }
519
596
  return {
520
- headId: _nullishCoalesce(_optionalChain([this, 'access', _21 => _21.head, 'optionalAccess', _22 => _22.current, 'access', _23 => _23.id]), () => ( null)),
597
+ headId: _nullishCoalesce(_optionalChain([this, 'access', _23 => _23.head, 'optionalAccess', _24 => _24.current, 'access', _25 => _25.id]), () => ( null)),
521
598
  messages: exportItems
522
599
  };
523
600
  }
@@ -525,9 +602,9 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
525
602
  for (const { message, parentId } of messages) {
526
603
  this.addOrUpdateMessage(parentId, message);
527
604
  }
528
- this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _24 => _24.at, 'call', _25 => _25(-1), 'optionalAccess', _26 => _26.message, 'access', _27 => _27.id]))), () => ( null)));
605
+ this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _26 => _26.at, 'call', _27 => _27(-1), 'optionalAccess', _28 => _28.message, 'access', _29 => _29.id]))), () => ( null)));
529
606
  }
530
- }, _class3);
607
+ }, _class4);
531
608
 
532
609
  // src/utils/smooth/useSmooth.tsx
533
610
 
@@ -564,7 +641,7 @@ var withSmoothContextProvider = (Component) => {
564
641
  };
565
642
  function useSmoothContext(options) {
566
643
  const context = _react.useContext.call(void 0, SmoothContext);
567
- if (!_optionalChain([options, 'optionalAccess', _28 => _28.optional]) && !context)
644
+ if (!_optionalChain([options, 'optionalAccess', _30 => _30.optional]) && !context)
568
645
  throw new Error(
569
646
  "This component must be used within a SmoothContextProvider."
570
647
  );
@@ -577,14 +654,14 @@ var useSmoothStatus = () => {
577
654
 
578
655
  // src/utils/smooth/useSmooth.tsx
579
656
  var _reactusecallbackref = require('@radix-ui/react-use-callback-ref');
580
- var TextStreamAnimator = (_class4 = class {
581
- constructor(currentText, setText) {;_class4.prototype.__init7.call(this);_class4.prototype.__init8.call(this);_class4.prototype.__init9.call(this);_class4.prototype.__init10.call(this);
657
+ var TextStreamAnimator = (_class5 = class {
658
+ constructor(currentText, setText) {;_class5.prototype.__init10.call(this);_class5.prototype.__init11.call(this);_class5.prototype.__init12.call(this);_class5.prototype.__init13.call(this);
582
659
  this.currentText = currentText;
583
660
  this.setText = setText;
584
661
  }
585
- __init7() {this.animationFrameId = null}
586
- __init8() {this.lastUpdateTime = Date.now()}
587
- __init9() {this.targetText = ""}
662
+ __init10() {this.animationFrameId = null}
663
+ __init11() {this.lastUpdateTime = Date.now()}
664
+ __init12() {this.targetText = ""}
588
665
  start() {
589
666
  if (this.animationFrameId !== null) return;
590
667
  this.lastUpdateTime = Date.now();
@@ -596,7 +673,7 @@ var TextStreamAnimator = (_class4 = class {
596
673
  this.animationFrameId = null;
597
674
  }
598
675
  }
599
- __init10() {this.animate = () => {
676
+ __init13() {this.animate = () => {
600
677
  const currentTime = Date.now();
601
678
  const deltaTime = currentTime - this.lastUpdateTime;
602
679
  let timeToConsume = deltaTime;
@@ -620,7 +697,7 @@ var TextStreamAnimator = (_class4 = class {
620
697
  this.lastUpdateTime = currentTime - timeToConsume;
621
698
  this.setText(this.currentText);
622
699
  }}
623
- }, _class4);
700
+ }, _class5);
624
701
  var SMOOTH_STATUS = Object.freeze({
625
702
  type: "running"
626
703
  });
@@ -635,10 +712,10 @@ var useSmooth = (state, smooth = false) => {
635
712
  const [displayedText, setDisplayedText] = _react.useState.call(void 0, text);
636
713
  const setText = _reactusecallbackref.useCallbackRef.call(void 0, (text2) => {
637
714
  setDisplayedText(text2);
638
- _optionalChain([useSmoothStatus2, 'optionalAccess', _29 => _29.setState, 'call', _30 => _30(text2 !== state.part.text ? SMOOTH_STATUS : state.status)]);
715
+ _optionalChain([useSmoothStatus2, 'optionalAccess', _31 => _31.setState, 'call', _32 => _32(text2 !== state.part.text ? SMOOTH_STATUS : state.status)]);
639
716
  });
640
717
  _react.useEffect.call(void 0, () => {
641
- _optionalChain([useSmoothStatus2, 'optionalAccess', _31 => _31.setState, 'call', _32 => _32(text !== displayedText ? SMOOTH_STATUS : state.status)]);
718
+ _optionalChain([useSmoothStatus2, 'optionalAccess', _33 => _33.setState, 'call', _34 => _34(text !== displayedText ? SMOOTH_STATUS : state.status)]);
642
719
  }, [useSmoothStatus2, text, displayedText, state.status]);
643
720
  const [animatorRef] = _react.useState.call(void 0,
644
721
  new TextStreamAnimator(text, setText)
@@ -832,7 +909,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
832
909
  });
833
910
  if (mergeRoundtrips) {
834
911
  const previousMessage = messages[messages.length - 1];
835
- if (_optionalChain([previousMessage, 'optionalAccess', _33 => _33.role]) === "assistant") {
912
+ if (_optionalChain([previousMessage, 'optionalAccess', _35 => _35.role]) === "assistant") {
836
913
  previousMessage.content.push(...newContent);
837
914
  break;
838
915
  }
@@ -845,7 +922,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
845
922
  }
846
923
  case "tool": {
847
924
  const previousMessage = messages[messages.length - 1];
848
- if (_optionalChain([previousMessage, 'optionalAccess', _34 => _34.role]) !== "assistant")
925
+ if (_optionalChain([previousMessage, 'optionalAccess', _36 => _36.role]) !== "assistant")
849
926
  throw new Error(
850
927
  "A tool message must be preceded by an assistant message."
851
928
  );
@@ -921,14 +998,14 @@ function streamPartDecoderStream() {
921
998
  controller.enqueue(decodeStreamPart(chunk));
922
999
  }
923
1000
  });
924
- return new (0, _chunkBQ3MRWUVjs.PipeableTransformStream)((readable) => {
1001
+ return new (0, _chunkBNSCUYW7js.PipeableTransformStream)((readable) => {
925
1002
  return readable.pipeThrough(new TextDecoderStream()).pipeThrough(chunkByLineStream()).pipeThrough(decodeStream);
926
1003
  });
927
1004
  }
928
1005
 
929
1006
  // src/runtimes/edge/streams/utils/index.ts
930
1007
  var streamUtils = {
931
- streamPartEncoderStream: _chunkBQ3MRWUVjs.streamPartEncoderStream,
1008
+ streamPartEncoderStream: _chunkBNSCUYW7js.streamPartEncoderStream,
932
1009
  streamPartDecoderStream
933
1010
  };
934
1011
 
@@ -1037,8 +1114,8 @@ var EdgeChatAdapter = class {
1037
1114
  credentials: _nullishCoalesce(this.options.credentials, () => ( "same-origin")),
1038
1115
  body: JSON.stringify({
1039
1116
  system: config.system,
1040
- messages: _chunkBQ3MRWUVjs.toCoreMessages.call(void 0, messages),
1041
- tools: config.tools ? _chunkBQ3MRWUVjs.toLanguageModelTools.call(void 0, config.tools) : [],
1117
+ messages: _chunkBNSCUYW7js.toCoreMessages.call(void 0, messages),
1118
+ tools: config.tools ? _chunkBNSCUYW7js.toLanguageModelTools.call(void 0, config.tools) : [],
1042
1119
  ...config.callSettings,
1043
1120
  ...config.config,
1044
1121
  ...this.options.body
@@ -1048,7 +1125,7 @@ var EdgeChatAdapter = class {
1048
1125
  if (result.status !== 200) {
1049
1126
  throw new Error(`Status ${result.status}: ${await result.text()}`);
1050
1127
  }
1051
- const stream = result.body.pipeThrough(streamPartDecoderStream()).pipeThrough(assistantDecoderStream()).pipeThrough(_chunkBQ3MRWUVjs.toolResultStream.call(void 0, config.tools, abortSignal)).pipeThrough(_chunkBQ3MRWUVjs.runResultStream.call(void 0, ));
1128
+ const stream = result.body.pipeThrough(streamPartDecoderStream()).pipeThrough(assistantDecoderStream()).pipeThrough(_chunkBNSCUYW7js.toolResultStream.call(void 0, config.tools, abortSignal)).pipeThrough(_chunkBNSCUYW7js.runResultStream.call(void 0, ));
1052
1129
  let update;
1053
1130
  for await (update of asAsyncIterable(stream)) {
1054
1131
  yield update;
@@ -1074,11 +1151,11 @@ var useEdgeRuntime = ({
1074
1151
  };
1075
1152
 
1076
1153
  // src/runtimes/local/shouldContinue.tsx
1077
- var shouldContinue = (result) => _optionalChain([result, 'access', _35 => _35.status, 'optionalAccess', _36 => _36.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
1154
+ var shouldContinue = (result) => _optionalChain([result, 'access', _37 => _37.status, 'optionalAccess', _38 => _38.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
1078
1155
 
1079
1156
  // src/runtimes/local/LocalThreadRuntime.tsx
1080
- var LocalThreadRuntime = (_class5 = class {
1081
- constructor(configProvider, adapter, { initialMessages, ...options }) {;_class5.prototype.__init11.call(this);_class5.prototype.__init12.call(this);_class5.prototype.__init13.call(this);_class5.prototype.__init14.call(this);_class5.prototype.__init15.call(this);_class5.prototype.__init16.call(this);
1157
+ var LocalThreadRuntime = (_class6 = class {
1158
+ constructor(configProvider, adapter, { initialMessages, ...options }) {;_class6.prototype.__init14.call(this);_class6.prototype.__init15.call(this);_class6.prototype.__init16.call(this);_class6.prototype.__init17.call(this);_class6.prototype.__init18.call(this);_class6.prototype.__init19.call(this);
1082
1159
  this.configProvider = configProvider;
1083
1160
  this.adapter = adapter;
1084
1161
  this.threadId = generateId();
@@ -1092,40 +1169,46 @@ var LocalThreadRuntime = (_class5 = class {
1092
1169
  }
1093
1170
  }
1094
1171
  }
1095
- __init11() {this._subscriptions = /* @__PURE__ */ new Set()}
1096
- __init12() {this.abortController = null}
1097
- __init13() {this.repository = new MessageRepository()}
1098
- __init14() {this.capabilities = {
1172
+ __init14() {this._subscriptions = /* @__PURE__ */ new Set()}
1173
+ __init15() {this.abortController = null}
1174
+ __init16() {this.repository = new MessageRepository()}
1175
+ __init17() {this.capabilities = {
1099
1176
  switchToBranch: true,
1100
1177
  edit: true,
1101
1178
  reload: true,
1102
1179
  cancel: true,
1103
1180
  unstable_copy: true,
1104
- speak: false
1181
+ speak: false,
1182
+ attachments: false
1105
1183
  }}
1106
1184
 
1107
- __init15() {this.isDisabled = false}
1185
+ __init18() {this.isDisabled = false}
1108
1186
  get messages() {
1109
1187
  return this.repository.getMessages();
1110
1188
  }
1111
- __init16() {this.composer = {
1112
- text: "",
1113
- setText: (value) => {
1114
- this.composer.text = value;
1115
- this.notifySubscribers();
1116
- }
1117
- }}
1189
+ __init19() {this.composer = new ThreadRuntimeComposer(
1190
+ this,
1191
+ this.notifySubscribers.bind(this)
1192
+ )}
1118
1193
 
1119
1194
  get options() {
1120
1195
  return this._options;
1121
1196
  }
1122
1197
  set options({ initialMessages, ...options }) {
1123
1198
  this._options = options;
1124
- const canSpeak = _optionalChain([options, 'access', _37 => _37.adapters, 'optionalAccess', _38 => _38.speech]) !== void 0;
1199
+ let hasUpdates = false;
1200
+ const canSpeak = _optionalChain([options, 'access', _39 => _39.adapters, 'optionalAccess', _40 => _40.speech]) !== void 0;
1125
1201
  if (this.capabilities.speak !== canSpeak) {
1126
1202
  this.capabilities.speak = canSpeak;
1127
- this.notifySubscribers();
1203
+ hasUpdates = true;
1128
1204
  }
1205
+ this.composer.setAttachmentAdapter(_optionalChain([options, 'access', _41 => _41.adapters, 'optionalAccess', _42 => _42.attachments]));
1206
+ const canAttach = _optionalChain([options, 'access', _43 => _43.adapters, 'optionalAccess', _44 => _44.attachments]) !== void 0;
1207
+ if (this.capabilities.attachments !== canAttach) {
1208
+ this.capabilities.attachments = canAttach;
1209
+ hasUpdates = true;
1210
+ }
1211
+ if (hasUpdates) this.notifySubscribers();
1129
1212
  }
1130
1213
  getBranches(messageId) {
1131
1214
  return this.repository.getBranches(messageId);
@@ -1144,6 +1227,7 @@ var LocalThreadRuntime = (_class5 = class {
1144
1227
  id: userMessageId,
1145
1228
  role: "user",
1146
1229
  content: message.content,
1230
+ attachments: _nullishCoalesce(message.attachments, () => ( [])),
1147
1231
  createdAt: /* @__PURE__ */ new Date()
1148
1232
  };
1149
1233
  this.repository.addOrUpdateMessage(message.parentId, userMessage);
@@ -1165,18 +1249,18 @@ var LocalThreadRuntime = (_class5 = class {
1165
1249
  }
1166
1250
  async performRoundtrip(parentId, message) {
1167
1251
  const messages = this.repository.getMessages();
1168
- _optionalChain([this, 'access', _39 => _39.abortController, 'optionalAccess', _40 => _40.abort, 'call', _41 => _41()]);
1252
+ _optionalChain([this, 'access', _45 => _45.abortController, 'optionalAccess', _46 => _46.abort, 'call', _47 => _47()]);
1169
1253
  this.abortController = new AbortController();
1170
1254
  const initialContent = message.content;
1171
- const initialRoundtrips = _optionalChain([message, 'access', _42 => _42.metadata, 'optionalAccess', _43 => _43.roundtrips]);
1172
- const initalCustom = _optionalChain([message, 'access', _44 => _44.metadata, 'optionalAccess', _45 => _45.custom]);
1255
+ const initialRoundtrips = _optionalChain([message, 'access', _48 => _48.metadata, 'optionalAccess', _49 => _49.roundtrips]);
1256
+ const initalCustom = _optionalChain([message, 'access', _50 => _50.metadata, 'optionalAccess', _51 => _51.custom]);
1173
1257
  const updateMessage = (m) => {
1174
1258
  message = {
1175
1259
  ...message,
1176
1260
  ...m.content ? { content: [...initialContent, ..._nullishCoalesce(m.content, () => ( []))] } : void 0,
1177
1261
  status: _nullishCoalesce(m.status, () => ( message.status)),
1178
1262
  // TODO deprecated, remove in v0.6
1179
- ..._optionalChain([m, 'access', _46 => _46.metadata, 'optionalAccess', _47 => _47.roundtrips]) ? {
1263
+ ..._optionalChain([m, 'access', _52 => _52.metadata, 'optionalAccess', _53 => _53.roundtrips]) ? {
1180
1264
  roundtrips: [
1181
1265
  ..._nullishCoalesce(initialRoundtrips, () => ( [])),
1182
1266
  ...m.metadata.roundtrips
@@ -1191,7 +1275,7 @@ var LocalThreadRuntime = (_class5 = class {
1191
1275
  ...m.metadata.roundtrips
1192
1276
  ]
1193
1277
  } : void 0,
1194
- ..._optionalChain([m, 'access', _48 => _48.metadata, 'optionalAccess', _49 => _49.custom]) ? {
1278
+ ..._optionalChain([m, 'access', _54 => _54.metadata, 'optionalAccess', _55 => _55.custom]) ? {
1195
1279
  custom: { ..._nullishCoalesce(initalCustom, () => ( {})), ...m.metadata.custom }
1196
1280
  } : void 0
1197
1281
  }
@@ -1201,7 +1285,7 @@ var LocalThreadRuntime = (_class5 = class {
1201
1285
  this.notifySubscribers();
1202
1286
  };
1203
1287
  const maxToolRoundtrips = _nullishCoalesce(this.options.maxToolRoundtrips, () => ( 1));
1204
- const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _50 => _50.metadata, 'optionalAccess', _51 => _51.roundtrips, 'optionalAccess', _52 => _52.length]), () => ( 0));
1288
+ const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _56 => _56.metadata, 'optionalAccess', _57 => _57.roundtrips, 'optionalAccess', _58 => _58.length]), () => ( 0));
1205
1289
  if (toolRoundtrips > maxToolRoundtrips) {
1206
1290
  updateMessage({
1207
1291
  status: {
@@ -1298,7 +1382,7 @@ var LocalThreadRuntime = (_class5 = class {
1298
1382
  // TODO lift utterance state to thread runtime
1299
1383
 
1300
1384
  speak(messageId) {
1301
- const adapter = _optionalChain([this, 'access', _53 => _53.options, 'access', _54 => _54.adapters, 'optionalAccess', _55 => _55.speech]);
1385
+ const adapter = _optionalChain([this, 'access', _59 => _59.options, 'access', _60 => _60.adapters, 'optionalAccess', _61 => _61.speech]);
1302
1386
  if (!adapter) throw new Error("Speech adapter not configured");
1303
1387
  const { message } = this.repository.getMessage(messageId);
1304
1388
  if (this._utterance) {
@@ -1321,7 +1405,7 @@ var LocalThreadRuntime = (_class5 = class {
1321
1405
  this.repository.import(data);
1322
1406
  this.notifySubscribers();
1323
1407
  }
1324
- }, _class5);
1408
+ }, _class6);
1325
1409
 
1326
1410
  // src/runtimes/local/LocalRuntime.tsx
1327
1411
  var LocalRuntime = class extends BaseAssistantRuntime {
@@ -1359,7 +1443,7 @@ var LocalRuntime = class extends BaseAssistantRuntime {
1359
1443
  const messages = fromCoreMessages(initialMessages);
1360
1444
  this.thread.import({
1361
1445
  messages: messages.map((m, idx) => ({
1362
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _56 => _56[idx - 1], 'optionalAccess', _57 => _57.id]), () => ( null)),
1446
+ parentId: _nullishCoalesce(_optionalChain([messages, 'access', _62 => _62[idx - 1], 'optionalAccess', _63 => _63.id]), () => ( null)),
1363
1447
  message: m
1364
1448
  }))
1365
1449
  });
@@ -1383,8 +1467,8 @@ var getExternalStoreMessage = (message) => {
1383
1467
  };
1384
1468
 
1385
1469
  // src/runtimes/external-store/ThreadMessageConverter.ts
1386
- var ThreadMessageConverter = (_class6 = class {constructor() { _class6.prototype.__init17.call(this); }
1387
- __init17() {this.cache = /* @__PURE__ */ new WeakMap()}
1470
+ var ThreadMessageConverter = (_class7 = class {constructor() { _class7.prototype.__init20.call(this); }
1471
+ __init20() {this.cache = /* @__PURE__ */ new WeakMap()}
1388
1472
  convertMessages(messages, converter) {
1389
1473
  return messages.map((m, idx) => {
1390
1474
  const cached = this.cache.get(m);
@@ -1393,7 +1477,7 @@ var ThreadMessageConverter = (_class6 = class {constructor() { _class6.prototype
1393
1477
  return newMessage;
1394
1478
  });
1395
1479
  }
1396
- }, _class6);
1480
+ }, _class7);
1397
1481
 
1398
1482
  // src/runtimes/external-store/auto-status.tsx
1399
1483
  var AUTO_STATUS_RUNNING = Object.freeze({ type: "running" });
@@ -1406,12 +1490,14 @@ var getAutoStatus = (isLast, isRunning) => isLast && isRunning ? AUTO_STATUS_RUN
1406
1490
 
1407
1491
  // src/runtimes/external-store/ThreadMessageLike.tsx
1408
1492
  var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
1409
- const { role, id, createdAt, status } = like;
1493
+ const { role, id, createdAt, attachments, status } = like;
1410
1494
  const common = {
1411
1495
  id: _nullishCoalesce(id, () => ( fallbackId)),
1412
1496
  createdAt: _nullishCoalesce(createdAt, () => ( /* @__PURE__ */ new Date()))
1413
1497
  };
1414
1498
  const content = typeof like.content === "string" ? [{ type: "text", text: like.content }] : like.content;
1499
+ if (role !== "user" && attachments)
1500
+ throw new Error("Attachments are only supported for user messages");
1415
1501
  switch (role) {
1416
1502
  case "assistant":
1417
1503
  return {
@@ -1456,7 +1542,8 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
1456
1542
  throw new Error(`Unknown content part type: ${unhandledType}`);
1457
1543
  }
1458
1544
  }
1459
- })
1545
+ }),
1546
+ attachments: _nullishCoalesce(attachments, () => ( []))
1460
1547
  };
1461
1548
  case "system":
1462
1549
  if (content.length !== 1 || content[0].type !== "text")
@@ -1485,19 +1572,20 @@ var getThreadMessageText = (message) => {
1485
1572
 
1486
1573
  // src/runtimes/external-store/ExternalStoreThreadRuntime.tsx
1487
1574
  var hasUpcomingMessage = (isRunning, messages) => {
1488
- return isRunning && _optionalChain([messages, 'access', _58 => _58[messages.length - 1], 'optionalAccess', _59 => _59.role]) !== "assistant";
1575
+ return isRunning && _optionalChain([messages, 'access', _64 => _64[messages.length - 1], 'optionalAccess', _65 => _65.role]) !== "assistant";
1489
1576
  };
1490
- var ExternalStoreThreadRuntime = (_class7 = class {
1491
- __init18() {this._subscriptions = /* @__PURE__ */ new Set()}
1492
- __init19() {this.repository = new MessageRepository()}
1493
- __init20() {this.assistantOptimisticId = null}
1494
- __init21() {this._capabilities = {
1577
+ var ExternalStoreThreadRuntime = (_class8 = class {
1578
+ __init21() {this._subscriptions = /* @__PURE__ */ new Set()}
1579
+ __init22() {this.repository = new MessageRepository()}
1580
+ __init23() {this.assistantOptimisticId = null}
1581
+ __init24() {this._capabilities = {
1495
1582
  switchToBranch: false,
1496
1583
  edit: false,
1497
1584
  reload: false,
1498
1585
  cancel: false,
1499
1586
  unstable_copy: false,
1500
- speak: false
1587
+ speak: false,
1588
+ attachments: false
1501
1589
  }}
1502
1590
  get capabilities() {
1503
1591
  return this._capabilities;
@@ -1505,16 +1593,13 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1505
1593
 
1506
1594
 
1507
1595
 
1508
- __init22() {this.converter = new ThreadMessageConverter()}
1596
+ __init25() {this.converter = new ThreadMessageConverter()}
1509
1597
 
1510
- __init23() {this.composer = {
1511
- text: "",
1512
- setText: (value) => {
1513
- this.composer.text = value;
1514
- this.notifySubscribers();
1515
- }
1516
- }}
1517
- constructor(store) {;_class7.prototype.__init18.call(this);_class7.prototype.__init19.call(this);_class7.prototype.__init20.call(this);_class7.prototype.__init21.call(this);_class7.prototype.__init22.call(this);_class7.prototype.__init23.call(this);_class7.prototype.__init24.call(this);
1598
+ __init26() {this.composer = new ThreadRuntimeComposer(
1599
+ this,
1600
+ this.notifySubscribers.bind(this)
1601
+ )}
1602
+ constructor(store) {;_class8.prototype.__init21.call(this);_class8.prototype.__init22.call(this);_class8.prototype.__init23.call(this);_class8.prototype.__init24.call(this);_class8.prototype.__init25.call(this);_class8.prototype.__init26.call(this);_class8.prototype.__init27.call(this);
1518
1603
  this.store = store;
1519
1604
  }
1520
1605
  get store() {
@@ -1532,9 +1617,12 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1532
1617
  edit: this._store.onEdit !== void 0,
1533
1618
  reload: this._store.onReload !== void 0,
1534
1619
  cancel: this._store.onCancel !== void 0,
1535
- unstable_copy: _optionalChain([this, 'access', _63 => _63._store, 'access', _64 => _64.unstable_capabilities, 'optionalAccess', _65 => _65.copy]) !== null,
1536
- speak: this._store.onSpeak !== void 0
1620
+ speak: this._store.onSpeak !== void 0,
1621
+ unstable_copy: _optionalChain([this, 'access', _69 => _69._store, 'access', _70 => _70.unstable_capabilities, 'optionalAccess', _71 => _71.copy]) !== false,
1622
+ // default true
1623
+ attachments: !!_optionalChain([this, 'access', _72 => _72.store, 'access', _73 => _73.adapters, 'optionalAccess', _74 => _74.attachments])
1537
1624
  };
1625
+ this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _75 => _75._store, 'access', _76 => _76.adapters, 'optionalAccess', _77 => _77.attachments]));
1538
1626
  if (oldStore) {
1539
1627
  if (oldStore.convertMessage !== store.convertMessage) {
1540
1628
  this.converter = new ThreadMessageConverter();
@@ -1560,7 +1648,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1560
1648
  for (let i = 0; i < messages.length; i++) {
1561
1649
  const message = messages[i];
1562
1650
  const parent = messages[i - 1];
1563
- this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _66 => _66.id]), () => ( null)), message);
1651
+ this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _78 => _78.id]), () => ( null)), message);
1564
1652
  }
1565
1653
  if (this.assistantOptimisticId) {
1566
1654
  this.repository.deleteMessage(this.assistantOptimisticId);
@@ -1568,7 +1656,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1568
1656
  }
1569
1657
  if (hasUpcomingMessage(isRunning, messages)) {
1570
1658
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
1571
- _nullishCoalesce(_optionalChain([messages, 'access', _67 => _67.at, 'call', _68 => _68(-1), 'optionalAccess', _69 => _69.id]), () => ( null)),
1659
+ _nullishCoalesce(_optionalChain([messages, 'access', _79 => _79.at, 'call', _80 => _80(-1), 'optionalAccess', _81 => _81.id]), () => ( null)),
1572
1660
  {
1573
1661
  role: "assistant",
1574
1662
  content: []
@@ -1576,7 +1664,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1576
1664
  );
1577
1665
  }
1578
1666
  this.repository.resetHead(
1579
- _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _70 => _70.at, 'call', _71 => _71(-1), 'optionalAccess', _72 => _72.id]))), () => ( null))
1667
+ _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _82 => _82.at, 'call', _83 => _83(-1), 'optionalAccess', _84 => _84.id]))), () => ( null))
1580
1668
  );
1581
1669
  this.messages = this.repository.getMessages();
1582
1670
  this.notifySubscribers();
@@ -1594,7 +1682,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1594
1682
  this.updateMessages(this.repository.getMessages());
1595
1683
  }
1596
1684
  async append(message) {
1597
- if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _73 => _73.messages, 'access', _74 => _74.at, 'call', _75 => _75(-1), 'optionalAccess', _76 => _76.id]), () => ( null)))) {
1685
+ if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _85 => _85.messages, 'access', _86 => _86.at, 'call', _87 => _87(-1), 'optionalAccess', _88 => _88.id]), () => ( null)))) {
1598
1686
  if (!this._store.onEdit)
1599
1687
  throw new Error("Runtime does not support editing messages.");
1600
1688
  await this._store.onEdit(message);
@@ -1617,7 +1705,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1617
1705
  }
1618
1706
  let messages = this.repository.getMessages();
1619
1707
  const previousMessage = messages[messages.length - 1];
1620
- if (_optionalChain([previousMessage, 'optionalAccess', _77 => _77.role]) === "user" && previousMessage.id === _optionalChain([messages, 'access', _78 => _78.at, 'call', _79 => _79(-1), 'optionalAccess', _80 => _80.id])) {
1708
+ if (_optionalChain([previousMessage, 'optionalAccess', _89 => _89.role]) === "user" && previousMessage.id === _optionalChain([messages, 'access', _90 => _90.at, 'call', _91 => _91(-1), 'optionalAccess', _92 => _92.id])) {
1621
1709
  this.repository.deleteMessage(previousMessage.id);
1622
1710
  if (!this.composer.text.trim()) {
1623
1711
  this.composer.setText(getThreadMessageText(previousMessage));
@@ -1645,18 +1733,18 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1645
1733
  this._subscriptions.add(callback);
1646
1734
  return () => this._subscriptions.delete(callback);
1647
1735
  }
1648
- __init24() {this.updateMessages = (messages) => {
1649
- _optionalChain([this, 'access', _81 => _81._store, 'access', _82 => _82.setMessages, 'optionalCall', _83 => _83(
1736
+ __init27() {this.updateMessages = (messages) => {
1737
+ _optionalChain([this, 'access', _93 => _93._store, 'access', _94 => _94.setMessages, 'optionalCall', _95 => _95(
1650
1738
  messages.flatMap(getExternalStoreMessage).filter((m) => m != null)
1651
1739
  )]);
1652
1740
  }}
1653
- }, _class7);
1741
+ }, _class8);
1654
1742
 
1655
1743
  // src/runtimes/external-store/ExternalStoreRuntime.tsx
1656
- var ExternalStoreRuntime = (_class8 = class extends BaseAssistantRuntime {
1657
- __init25() {this._proxyConfigProvider = new ProxyConfigProvider()}
1744
+ var ExternalStoreRuntime = (_class9 = class extends BaseAssistantRuntime {
1745
+ __init28() {this._proxyConfigProvider = new ProxyConfigProvider()}
1658
1746
  constructor(store) {
1659
- super(new ExternalStoreThreadRuntime(store));_class8.prototype.__init25.call(this);;
1747
+ super(new ExternalStoreThreadRuntime(store));_class9.prototype.__init28.call(this);;
1660
1748
  }
1661
1749
  get store() {
1662
1750
  return this.thread.store;
@@ -1689,7 +1777,7 @@ var ExternalStoreRuntime = (_class8 = class extends BaseAssistantRuntime {
1689
1777
  await this.store.onNewThread();
1690
1778
  }
1691
1779
  }
1692
- }, _class8);
1780
+ }, _class9);
1693
1781
 
1694
1782
  // src/runtimes/external-store/useExternalStoreRuntime.tsx
1695
1783
 
@@ -1857,18 +1945,18 @@ var DangerousInBrowserAdapter = class {
1857
1945
  this.options = options;
1858
1946
  }
1859
1947
  async *run({ messages, abortSignal, config }) {
1860
- const res = await _chunkBQ3MRWUVjs.getEdgeRuntimeStream.call(void 0, {
1948
+ const res = await _chunkBNSCUYW7js.getEdgeRuntimeStream.call(void 0, {
1861
1949
  options: this.options,
1862
1950
  abortSignal,
1863
1951
  requestData: {
1864
1952
  system: config.system,
1865
- messages: _chunkBQ3MRWUVjs.toCoreMessages.call(void 0, messages),
1866
- tools: config.tools ? _chunkBQ3MRWUVjs.toLanguageModelTools.call(void 0, config.tools) : [],
1953
+ messages: _chunkBNSCUYW7js.toCoreMessages.call(void 0, messages),
1954
+ tools: config.tools ? _chunkBNSCUYW7js.toLanguageModelTools.call(void 0, config.tools) : [],
1867
1955
  ...config.callSettings,
1868
1956
  ...config.config
1869
1957
  }
1870
1958
  });
1871
- const stream = res.pipeThrough(_chunkBQ3MRWUVjs.toolResultStream.call(void 0, config.tools, abortSignal)).pipeThrough(_chunkBQ3MRWUVjs.runResultStream.call(void 0, ));
1959
+ const stream = res.pipeThrough(_chunkBNSCUYW7js.toolResultStream.call(void 0, config.tools, abortSignal)).pipeThrough(_chunkBNSCUYW7js.runResultStream.call(void 0, ));
1872
1960
  for await (const update of asAsyncIterable(stream)) {
1873
1961
  yield update;
1874
1962
  }
@@ -1925,6 +2013,147 @@ var WebSpeechSynthesisAdapter = class {
1925
2013
  }
1926
2014
  };
1927
2015
 
2016
+ // src/runtimes/attachment/SimpleImageAttachmentAdapter.ts
2017
+ var SimpleImageAttachmentAdapter = (_class10 = class {constructor() { _class10.prototype.__init29.call(this); }
2018
+ __init29() {this.accept = "image/*"}
2019
+ async add(state) {
2020
+ return {
2021
+ id: state.file.name,
2022
+ type: "image",
2023
+ name: state.file.name,
2024
+ file: state.file
2025
+ };
2026
+ }
2027
+ async send(attachment) {
2028
+ return {
2029
+ ...attachment,
2030
+ content: [
2031
+ {
2032
+ type: "image",
2033
+ image: await getFileDataURL(attachment.file)
2034
+ }
2035
+ ]
2036
+ };
2037
+ }
2038
+ async remove() {
2039
+ }
2040
+ }, _class10);
2041
+ var getFileDataURL = (file) => new Promise((resolve, reject) => {
2042
+ const reader = new FileReader();
2043
+ reader.onload = () => resolve(reader.result);
2044
+ reader.onerror = (error) => reject(error);
2045
+ reader.readAsDataURL(file);
2046
+ });
2047
+
2048
+ // src/runtimes/attachment/SimpleTextAttachmentAdapter.ts
2049
+ var SimpleTextAttachmentAdapter = (_class11 = class {constructor() { _class11.prototype.__init30.call(this); }
2050
+ __init30() {this.accept = "text/plain,text/html,text/markdown,text/csv,text/xml,text/json,text/css"}
2051
+ async add(state) {
2052
+ return {
2053
+ id: state.file.name,
2054
+ type: "document",
2055
+ name: state.file.name,
2056
+ file: state.file
2057
+ };
2058
+ }
2059
+ async send(attachment) {
2060
+ return {
2061
+ ...attachment,
2062
+ content: [
2063
+ {
2064
+ type: "text",
2065
+ text: `<attachment name=${attachment.name}>
2066
+ ${await getFileText(attachment.file)}
2067
+ </attachment>`
2068
+ }
2069
+ ]
2070
+ };
2071
+ }
2072
+ async remove() {
2073
+ }
2074
+ }, _class11);
2075
+ var getFileText = (file) => new Promise((resolve, reject) => {
2076
+ const reader = new FileReader();
2077
+ reader.onload = () => resolve(reader.result);
2078
+ reader.onerror = (error) => reject(error);
2079
+ reader.readAsText(file);
2080
+ });
2081
+
2082
+ // src/runtimes/attachment/CompositeAttachmentAdapter.ts
2083
+ function fileMatchesAccept(file, acceptString) {
2084
+ if (acceptString === "*") {
2085
+ return true;
2086
+ }
2087
+ const allowedTypes = acceptString.split(",").map((type) => type.trim().toLowerCase());
2088
+ const fileExtension = "." + file.name.split(".").pop().toLowerCase();
2089
+ const fileMimeType = file.type.toLowerCase();
2090
+ for (const type of allowedTypes) {
2091
+ if (type.startsWith(".") && type === fileExtension) {
2092
+ return true;
2093
+ }
2094
+ if (type.includes("/") && type === fileMimeType) {
2095
+ return true;
2096
+ }
2097
+ if (type === "image/*" || type === "video/*" || type === "audio/*") {
2098
+ if (type.endsWith("/*")) {
2099
+ const generalType = type.split("/")[0];
2100
+ if (fileMimeType.startsWith(generalType + "/")) {
2101
+ return true;
2102
+ }
2103
+ }
2104
+ }
2105
+ }
2106
+ return false;
2107
+ }
2108
+ var CompositeAttachmentAdapter = class {
2109
+
2110
+
2111
+ constructor(adapters) {
2112
+ this._adapters = adapters;
2113
+ const wildcardIdx = adapters.findIndex((a) => a.accept === "*");
2114
+ if (wildcardIdx !== -1) {
2115
+ if (wildcardIdx !== adapters.length - 1)
2116
+ throw new Error(
2117
+ "A wildcard adapter (handling all files) can only be specified as the last adapter."
2118
+ );
2119
+ this.accept = "*";
2120
+ } else {
2121
+ this.accept = adapters.map((a) => a.accept).join(",");
2122
+ }
2123
+ }
2124
+ async add(state) {
2125
+ for (const adapter of this._adapters) {
2126
+ if (fileMatchesAccept(state.file, adapter.accept)) {
2127
+ return adapter.add(state);
2128
+ }
2129
+ }
2130
+ throw new Error("No matching adapter found for file");
2131
+ }
2132
+ async send(attachment) {
2133
+ const adapters = this._adapters.slice();
2134
+ for (const adapter of adapters) {
2135
+ if (fileMatchesAccept(attachment.file, adapter.accept)) {
2136
+ return adapter.send(attachment);
2137
+ }
2138
+ }
2139
+ throw new Error("No matching adapter found for attachment");
2140
+ }
2141
+ async remove(attachment) {
2142
+ const adapters = this._adapters.slice();
2143
+ for (const adapter of adapters) {
2144
+ if (fileMatchesAccept(attachment.file, adapter.accept)) {
2145
+ return adapter.remove(attachment);
2146
+ }
2147
+ }
2148
+ throw new Error("No matching adapter found for attachment");
2149
+ }
2150
+ };
2151
+
2152
+ // src/context/ReadonlyStore.ts
2153
+ var writableStore = (store) => {
2154
+ return store;
2155
+ };
2156
+
1928
2157
  // src/context/providers/ThreadProvider.tsx
1929
2158
 
1930
2159
  var ThreadProvider = ({
@@ -1954,18 +2183,20 @@ var ThreadProvider = ({
1954
2183
  const state = getThreadStateFromRuntime(thread);
1955
2184
  if (oldState.threadId !== state.threadId || oldState.isDisabled !== state.isDisabled || oldState.isRunning !== state.isRunning || // TODO ensure capabilities is memoized
1956
2185
  oldState.capabilities !== state.capabilities) {
1957
- context.useThread.setState(
1958
- state,
1959
- true
1960
- );
2186
+ writableStore(context.useThread).setState(state, true);
1961
2187
  }
1962
2188
  if (thread.messages !== context.useThreadMessages.getState()) {
1963
- context.useThreadMessages.setState(thread.messages, true);
2189
+ writableStore(context.useThreadMessages).setState(
2190
+ thread.messages,
2191
+ true
2192
+ );
1964
2193
  }
1965
2194
  const composerState = context.useComposer.getState();
1966
- if (thread.composer.text !== composerState.text || state.capabilities.cancel !== composerState.canCancel) {
1967
- context.useComposer.setState({
2195
+ if (thread.composer.isEmpty !== composerState.isEmpty || thread.composer.text !== composerState.text || thread.composer.attachments !== composerState.attachments || state.capabilities.cancel !== composerState.canCancel) {
2196
+ writableStore(context.useComposer).setState({
2197
+ isEmpty: thread.composer.isEmpty,
1968
2198
  text: thread.composer.text,
2199
+ attachments: thread.composer.attachments,
1969
2200
  canCancel: state.capabilities.cancel
1970
2201
  });
1971
2202
  }
@@ -1975,7 +2206,7 @@ var ThreadProvider = ({
1975
2206
  }, [provider, context]);
1976
2207
  _react.useInsertionEffect.call(void 0,
1977
2208
  () => provider.subscribe(() => {
1978
- context.useThreadRuntime.setState(provider.thread, true);
2209
+ writableStore(context.useThreadRuntime).setState(provider.thread, true);
1979
2210
  }),
1980
2211
  [provider, context]
1981
2212
  );
@@ -2027,7 +2258,7 @@ var AssistantProvider = ({ children, runtime }) => {
2027
2258
  return runtime.registerModelConfigProvider(getModelConfig);
2028
2259
  }, [runtime, getModelConfig]);
2029
2260
  _react.useEffect.call(void 0,
2030
- () => context.useAssistantRuntime.setState(runtime, true),
2261
+ () => writableStore(context.useAssistantRuntime).setState(runtime, true),
2031
2262
  [runtime, context]
2032
2263
  );
2033
2264
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantContext.Provider, { value: context, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadProvider, { provider: runtime, children }) });
@@ -2048,7 +2279,7 @@ var AssistantRuntimeProvider = _react.memo.call(void 0, AssistantRuntimeProvider
2048
2279
  var MessageContext = _react.createContext.call(void 0, null);
2049
2280
  function useMessageContext(options) {
2050
2281
  const context = _react.useContext.call(void 0, MessageContext);
2051
- if (!_optionalChain([options, 'optionalAccess', _84 => _84.optional]) && !context)
2282
+ if (!_optionalChain([options, 'optionalAccess', _96 => _96.optional]) && !context)
2052
2283
  throw new Error(
2053
2284
  "This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
2054
2285
  );
@@ -2075,7 +2306,7 @@ var ContentPartContext = _react.createContext.call(void 0,
2075
2306
  );
2076
2307
  function useContentPartContext(options) {
2077
2308
  const context = _react.useContext.call(void 0, ContentPartContext);
2078
- if (!_optionalChain([options, 'optionalAccess', _85 => _85.optional]) && !context)
2309
+ if (!_optionalChain([options, 'optionalAccess', _97 => _97.optional]) && !context)
2079
2310
  throw new Error(
2080
2311
  "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
2081
2312
  );
@@ -2087,15 +2318,17 @@ function useContentPartContext(options) {
2087
2318
  var toAppendMessage = (useThreadMessages, message) => {
2088
2319
  if (typeof message === "string") {
2089
2320
  return {
2090
- parentId: _nullishCoalesce(_optionalChain([useThreadMessages, 'access', _86 => _86.getState, 'call', _87 => _87(), 'access', _88 => _88.at, 'call', _89 => _89(-1), 'optionalAccess', _90 => _90.id]), () => ( null)),
2321
+ parentId: _nullishCoalesce(_optionalChain([useThreadMessages, 'access', _98 => _98.getState, 'call', _99 => _99(), 'access', _100 => _100.at, 'call', _101 => _101(-1), 'optionalAccess', _102 => _102.id]), () => ( null)),
2091
2322
  role: "user",
2092
- content: [{ type: "text", text: message }]
2323
+ content: [{ type: "text", text: message }],
2324
+ attachments: []
2093
2325
  };
2094
2326
  }
2095
2327
  return {
2096
- parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([useThreadMessages, 'access', _91 => _91.getState, 'call', _92 => _92(), 'access', _93 => _93.at, 'call', _94 => _94(-1), 'optionalAccess', _95 => _95.id]))), () => ( null)),
2328
+ parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([useThreadMessages, 'access', _103 => _103.getState, 'call', _104 => _104(), 'access', _105 => _105.at, 'call', _106 => _106(-1), 'optionalAccess', _107 => _107.id]))), () => ( null)),
2097
2329
  role: _nullishCoalesce(message.role, () => ( "user")),
2098
- content: message.content
2330
+ content: message.content,
2331
+ attachments: _nullishCoalesce(message.attachments, () => ( []))
2099
2332
  };
2100
2333
  };
2101
2334
  var useAppendMessage = () => {
@@ -2145,7 +2378,7 @@ var useAssistantTool = (tool) => {
2145
2378
  const unsub2 = render ? setToolUI(toolName, render) : void 0;
2146
2379
  return () => {
2147
2380
  unsub1();
2148
- _optionalChain([unsub2, 'optionalCall', _96 => _96()]);
2381
+ _optionalChain([unsub2, 'optionalCall', _108 => _108()]);
2149
2382
  };
2150
2383
  }, [registerModelConfigProvider, setToolUI, tool]);
2151
2384
  };
@@ -2156,6 +2389,7 @@ var makeAssistantTool = (tool) => {
2156
2389
  useAssistantTool(tool);
2157
2390
  return null;
2158
2391
  };
2392
+ Tool.unstable_tool = tool;
2159
2393
  return Tool;
2160
2394
  };
2161
2395
 
@@ -2177,6 +2411,7 @@ var makeAssistantToolUI = (tool) => {
2177
2411
  useAssistantToolUI(tool);
2178
2412
  return null;
2179
2413
  };
2414
+ ToolUI.unstable_tool = tool;
2180
2415
  return ToolUI;
2181
2416
  };
2182
2417
 
@@ -2398,7 +2633,7 @@ var useComposerSend = () => {
2398
2633
  const { useComposer } = useComposerContext();
2399
2634
  const disabled = useCombinedStore(
2400
2635
  [useThread, useComposer],
2401
- (t, c) => t.isRunning || !c.isEditing || c.text.length === 0
2636
+ (t, c) => t.isRunning || !c.isEditing || c.isEmpty
2402
2637
  );
2403
2638
  const callback = _react.useCallback.call(void 0, () => {
2404
2639
  const composerState = useComposer.getState();
@@ -2411,6 +2646,30 @@ var useComposerSend = () => {
2411
2646
  return callback;
2412
2647
  };
2413
2648
 
2649
+ // src/primitive-hooks/composer/useComposerAddAttachment.tsx
2650
+
2651
+ var useComposerAddAttachment = () => {
2652
+ const { useComposer, useThreadRuntime } = useThreadContext();
2653
+ const disabled = useComposer((c) => !c.isEditing);
2654
+ const callback = _react.useCallback.call(void 0, () => {
2655
+ const { addAttachment } = useComposer.getState();
2656
+ const { attachmentAccept } = useThreadRuntime.getState().composer;
2657
+ const input = document.createElement("input");
2658
+ input.type = "file";
2659
+ if (attachmentAccept !== "*") {
2660
+ input.accept = attachmentAccept;
2661
+ }
2662
+ input.onchange = (e) => {
2663
+ const file = _optionalChain([e, 'access', _109 => _109.target, 'access', _110 => _110.files, 'optionalAccess', _111 => _111[0]]);
2664
+ if (!file) return;
2665
+ addAttachment(file);
2666
+ };
2667
+ input.click();
2668
+ }, [useComposer, useThreadRuntime]);
2669
+ if (disabled) return null;
2670
+ return callback;
2671
+ };
2672
+
2414
2673
  // src/primitive-hooks/contentPart/useContentPartDisplay.tsx
2415
2674
  var useContentPartDisplay = () => {
2416
2675
  const { useContentPart } = useContentPartContext();
@@ -2465,6 +2724,10 @@ var useMessageIf = (props) => {
2465
2724
  if (props.copied === false && isCopied) return false;
2466
2725
  if (props.speaking === true && !isSpeaking) return false;
2467
2726
  if (props.speaking === false && isSpeaking) return false;
2727
+ if (props.hasAttachments === true && (message.role !== "user" || !message.attachments.length))
2728
+ return false;
2729
+ if (props.hasAttachments === false && message.role === "user" && !!message.attachments.length)
2730
+ return false;
2468
2731
  return true;
2469
2732
  }
2470
2733
  );
@@ -2610,7 +2873,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
2610
2873
  ...primitiveProps,
2611
2874
  ref: forwardedRef,
2612
2875
  onClick: _primitive.composeEventHandlers.call(void 0, primitiveProps.onClick, () => {
2613
- _optionalChain([callback, 'optionalCall', _97 => _97()]);
2876
+ _optionalChain([callback, 'optionalCall', _112 => _112()]);
2614
2877
  })
2615
2878
  }
2616
2879
  );
@@ -2666,7 +2929,7 @@ var ActionBarPrimitiveStopSpeaking = _react.forwardRef.call(void 0, (props, ref)
2666
2929
  ...props,
2667
2930
  ref,
2668
2931
  onClick: _primitive.composeEventHandlers.call(void 0, props.onClick, () => {
2669
- _optionalChain([callback, 'optionalCall', _98 => _98()]);
2932
+ _optionalChain([callback, 'optionalCall', _113 => _113()]);
2670
2933
  })
2671
2934
  }
2672
2935
  );
@@ -2842,6 +3105,7 @@ BranchPickerPrimitiveNumber.displayName = "BranchPickerPrimitive.Number";
2842
3105
  // src/primitives/message/index.ts
2843
3106
  var message_exports = {};
2844
3107
  _chunkDCHYNTHIjs.__export.call(void 0, message_exports, {
3108
+ Attachments: () => MessagePrimitiveAttachments,
2845
3109
  Content: () => MessagePrimitiveContent,
2846
3110
  If: () => MessagePrimitiveIf,
2847
3111
  InProgress: () => MessagePrimitiveInProgress,
@@ -2952,7 +3216,7 @@ var getContentPartState = ({ message }, useContentPart, partIndex) => {
2952
3216
  }
2953
3217
  }
2954
3218
  const status = toContentPartStatus(message, partIndex, part);
2955
- const currentState = _optionalChain([useContentPart, 'optionalAccess', _99 => _99.getState, 'call', _100 => _100()]);
3219
+ const currentState = _optionalChain([useContentPart, 'optionalAccess', _114 => _114.getState, 'call', _115 => _115()]);
2956
3220
  if (currentState && currentState.part === part && currentState.status === status)
2957
3221
  return null;
2958
3222
  return Object.freeze({ part, status });
@@ -2973,7 +3237,7 @@ var useContentPartContext2 = (partIndex) => {
2973
3237
  partIndex
2974
3238
  );
2975
3239
  if (!newState) return;
2976
- context.useContentPart.setState(newState, true);
3240
+ writableStore(context.useContentPart).setState(newState, true);
2977
3241
  };
2978
3242
  syncContentPart(useMessage.getState());
2979
3243
  return useMessage.subscribe(syncContentPart);
@@ -3033,21 +3297,22 @@ ContentPartPrimitiveInProgress.displayName = "ContentPartPrimitive.InProgress";
3033
3297
 
3034
3298
  // src/primitives/message/MessageContent.tsx
3035
3299
 
3300
+ var ToolUIDisplay = ({
3301
+ UI,
3302
+ ...props
3303
+ }) => {
3304
+ const { useToolUIs } = useAssistantContext();
3305
+ const Render = _nullishCoalesce(useToolUIs((s) => s.getToolUI(props.part.toolName)), () => ( UI));
3306
+ if (!Render) return null;
3307
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Render, { ...props });
3308
+ };
3036
3309
  var defaultComponents = {
3037
3310
  Text: () => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { style: { whiteSpace: "pre-line" }, children: [
3038
3311
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveText, {}),
3039
3312
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveInProgress, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { style: { fontFamily: "revert" }, children: " \u25CF" }) })
3040
3313
  ] }),
3041
3314
  Image: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveImage, {}),
3042
- UI: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveDisplay, {}),
3043
- tools: {
3044
- Fallback: (props) => {
3045
- const { useToolUIs } = useAssistantContext();
3046
- const Render = useToolUIs((s) => s.getToolUI(props.part.toolName));
3047
- if (!Render) return null;
3048
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Render, { ...props });
3049
- }
3050
- }
3315
+ UI: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ContentPartPrimitiveDisplay, {})
3051
3316
  };
3052
3317
  var MessageContentPartComponent = ({
3053
3318
  components: {
@@ -3055,7 +3320,7 @@ var MessageContentPartComponent = ({
3055
3320
  Text: Text2 = defaultComponents.Text,
3056
3321
  Image: Image2 = defaultComponents.Image,
3057
3322
  UI = defaultComponents.UI,
3058
- tools: { by_name = {}, Fallback: Fallback2 = defaultComponents.tools.Fallback } = {}
3323
+ tools: { by_name = {}, Fallback: Fallback2 = void 0 } = {}
3059
3324
  } = {}
3060
3325
  }) => {
3061
3326
  const { useThreadActions } = useThreadContext();
@@ -3086,7 +3351,15 @@ var MessageContentPartComponent = ({
3086
3351
  toolCallId: part.toolCallId,
3087
3352
  result
3088
3353
  });
3089
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Tool, { part, status, addResult });
3354
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3355
+ ToolUIDisplay,
3356
+ {
3357
+ UI: Tool,
3358
+ part,
3359
+ status,
3360
+ addResult
3361
+ }
3362
+ );
3090
3363
  }
3091
3364
  default:
3092
3365
  const unhandledType = type;
@@ -3101,24 +3374,14 @@ var MessageContentPartImpl = ({
3101
3374
  };
3102
3375
  var MessageContentPart = _react.memo.call(void 0,
3103
3376
  MessageContentPartImpl,
3104
- (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _101 => _101.components, 'optionalAccess', _102 => _102.Text]) === _optionalChain([next, 'access', _103 => _103.components, 'optionalAccess', _104 => _104.Text]) && _optionalChain([prev, 'access', _105 => _105.components, 'optionalAccess', _106 => _106.Image]) === _optionalChain([next, 'access', _107 => _107.components, 'optionalAccess', _108 => _108.Image]) && _optionalChain([prev, 'access', _109 => _109.components, 'optionalAccess', _110 => _110.UI]) === _optionalChain([next, 'access', _111 => _111.components, 'optionalAccess', _112 => _112.UI]) && _optionalChain([prev, 'access', _113 => _113.components, 'optionalAccess', _114 => _114.tools]) === _optionalChain([next, 'access', _115 => _115.components, 'optionalAccess', _116 => _116.tools])
3377
+ (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _116 => _116.components, 'optionalAccess', _117 => _117.Text]) === _optionalChain([next, 'access', _118 => _118.components, 'optionalAccess', _119 => _119.Text]) && _optionalChain([prev, 'access', _120 => _120.components, 'optionalAccess', _121 => _121.Image]) === _optionalChain([next, 'access', _122 => _122.components, 'optionalAccess', _123 => _123.Image]) && _optionalChain([prev, 'access', _124 => _124.components, 'optionalAccess', _125 => _125.UI]) === _optionalChain([next, 'access', _126 => _126.components, 'optionalAccess', _127 => _127.UI]) && _optionalChain([prev, 'access', _128 => _128.components, 'optionalAccess', _129 => _129.tools]) === _optionalChain([next, 'access', _130 => _130.components, 'optionalAccess', _131 => _131.tools])
3105
3378
  );
3106
3379
  var MessagePrimitiveContent = ({
3107
3380
  components
3108
3381
  }) => {
3109
3382
  const { useMessage } = useMessageContext();
3110
3383
  const contentLength = useMessage((s) => s.message.content.length) || 1;
3111
- return new Array(contentLength).fill(null).map((_, idx) => {
3112
- const partIndex = idx;
3113
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3114
- MessageContentPart,
3115
- {
3116
- partIndex,
3117
- components
3118
- },
3119
- partIndex
3120
- );
3121
- });
3384
+ return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPart, { partIndex: index, components }, index));
3122
3385
  };
3123
3386
  MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
3124
3387
 
@@ -3128,6 +3391,125 @@ var MessagePrimitiveInProgress = () => {
3128
3391
  };
3129
3392
  MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
3130
3393
 
3394
+ // src/primitives/message/MessageAttachments.tsx
3395
+
3396
+
3397
+ // src/context/react/AttachmentContext.ts
3398
+
3399
+ var AttachmentContext = _react.createContext.call(void 0,
3400
+ null
3401
+ );
3402
+ function useAttachmentContext(options) {
3403
+ const context = _react.useContext.call(void 0, AttachmentContext);
3404
+ if (_optionalChain([options, 'optionalAccess', _132 => _132.type]) === "composer" && _optionalChain([context, 'optionalAccess', _133 => _133.type]) !== "composer")
3405
+ throw new Error(
3406
+ "This component must be used within a ComposerPrimitive.Attachments component."
3407
+ );
3408
+ if (_optionalChain([options, 'optionalAccess', _134 => _134.type]) === "message" && _optionalChain([context, 'optionalAccess', _135 => _135.type]) !== "message")
3409
+ throw new Error(
3410
+ "This component must be used within a MessagePrimitive.Attachments component."
3411
+ );
3412
+ if (!_optionalChain([options, 'optionalAccess', _136 => _136.optional]) && !context)
3413
+ throw new Error(
3414
+ "This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component."
3415
+ );
3416
+ return context;
3417
+ }
3418
+
3419
+ // src/context/providers/MessageAttachmentProvider.tsx
3420
+
3421
+
3422
+
3423
+ var getAttachment = ({ message }, useAttachment, partIndex) => {
3424
+ if (message.role !== "user") return null;
3425
+ const attachments = message.attachments;
3426
+ let attachment = attachments[partIndex];
3427
+ if (!attachment) return null;
3428
+ const currentState = _optionalChain([useAttachment, 'optionalAccess', _137 => _137.getState, 'call', _138 => _138()]);
3429
+ if (currentState && currentState.attachment === attachment) return null;
3430
+ return Object.freeze({ attachment });
3431
+ };
3432
+ var useMessageAttachmentContext = (partIndex) => {
3433
+ const { useMessage } = useMessageContext();
3434
+ const [context] = _react.useState.call(void 0,
3435
+ () => {
3436
+ const useAttachment = _zustand.create.call(void 0,
3437
+ () => getAttachment(useMessage.getState(), void 0, partIndex)
3438
+ );
3439
+ return { type: "message", useAttachment };
3440
+ }
3441
+ );
3442
+ _react.useEffect.call(void 0, () => {
3443
+ const syncAttachment = (messageState) => {
3444
+ const newState = getAttachment(
3445
+ messageState,
3446
+ context.useAttachment,
3447
+ partIndex
3448
+ );
3449
+ if (!newState) return;
3450
+ writableStore(context.useAttachment).setState(newState, true);
3451
+ };
3452
+ syncAttachment(useMessage.getState());
3453
+ return useMessage.subscribe(syncAttachment);
3454
+ }, [context, useMessage, partIndex]);
3455
+ return context;
3456
+ };
3457
+ var MessageAttachmentProvider = ({
3458
+ attachmentIndex: partIndex,
3459
+ children
3460
+ }) => {
3461
+ const context = useMessageAttachmentContext(partIndex);
3462
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentContext.Provider, { value: context, children });
3463
+ };
3464
+
3465
+ // src/primitives/message/MessageAttachments.tsx
3466
+
3467
+ var getComponent = (components, attachment) => {
3468
+ const type = attachment.type;
3469
+ switch (type) {
3470
+ case "image":
3471
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _139 => _139.Image]), () => ( _optionalChain([components, 'optionalAccess', _140 => _140.Attachment])));
3472
+ case "document":
3473
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _141 => _141.Document]), () => ( _optionalChain([components, 'optionalAccess', _142 => _142.Attachment])));
3474
+ case "file":
3475
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _143 => _143.File]), () => ( _optionalChain([components, 'optionalAccess', _144 => _144.Attachment])));
3476
+ default:
3477
+ const _exhaustiveCheck = type;
3478
+ throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
3479
+ }
3480
+ };
3481
+ var AttachmentComponent = ({ components }) => {
3482
+ const { useAttachment } = useAttachmentContext({ type: "message" });
3483
+ const Component = useAttachment(
3484
+ (a) => getComponent(components, a.attachment)
3485
+ );
3486
+ if (!Component) return null;
3487
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, {});
3488
+ };
3489
+ var MessageAttachmentImpl = ({ components, attachmentIndex }) => {
3490
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent, { components }) });
3491
+ };
3492
+ var MessageAttachment = _react.memo.call(void 0,
3493
+ MessageAttachmentImpl,
3494
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _145 => _145.components, 'optionalAccess', _146 => _146.Image]) === _optionalChain([next, 'access', _147 => _147.components, 'optionalAccess', _148 => _148.Image]) && _optionalChain([prev, 'access', _149 => _149.components, 'optionalAccess', _150 => _150.Document]) === _optionalChain([next, 'access', _151 => _151.components, 'optionalAccess', _152 => _152.Document]) && _optionalChain([prev, 'access', _153 => _153.components, 'optionalAccess', _154 => _154.File]) === _optionalChain([next, 'access', _155 => _155.components, 'optionalAccess', _156 => _156.File]) && _optionalChain([prev, 'access', _157 => _157.components, 'optionalAccess', _158 => _158.Attachment]) === _optionalChain([next, 'access', _159 => _159.components, 'optionalAccess', _160 => _160.Attachment])
3495
+ );
3496
+ var MessagePrimitiveAttachments = ({ components }) => {
3497
+ const { useMessage } = useMessageContext();
3498
+ const attachmentsCount = useMessage(({ message }) => {
3499
+ if (message.role !== "user") return 0;
3500
+ return message.attachments.length;
3501
+ });
3502
+ return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3503
+ MessageAttachment,
3504
+ {
3505
+ attachmentIndex: index,
3506
+ components
3507
+ },
3508
+ index
3509
+ ));
3510
+ };
3511
+ MessagePrimitiveAttachments.displayName = "MessagePrimitive.Attachments";
3512
+
3131
3513
  // src/primitives/branchPicker/BranchPickerRoot.tsx
3132
3514
 
3133
3515
  var BranchPickerPrimitiveRoot = _react.forwardRef.call(void 0, ({ hideWhenSingleBranch, ...rest }, ref) => {
@@ -3138,6 +3520,8 @@ BranchPickerPrimitiveRoot.displayName = "BranchPickerPrimitive.Root";
3138
3520
  // src/primitives/composer/index.ts
3139
3521
  var composer_exports = {};
3140
3522
  _chunkDCHYNTHIjs.__export.call(void 0, composer_exports, {
3523
+ AddAttachment: () => ComposerPrimitiveAddAttachment,
3524
+ Attachments: () => ComposerPrimitiveAttachments,
3141
3525
  Cancel: () => ComposerPrimitiveCancel,
3142
3526
  If: () => ComposerPrimitiveIf,
3143
3527
  Input: () => ComposerPrimitiveInput,
@@ -3216,7 +3600,7 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
3216
3600
  const { isRunning } = useThread.getState();
3217
3601
  if (!isRunning) {
3218
3602
  e.preventDefault();
3219
- _optionalChain([textareaRef, 'access', _117 => _117.current, 'optionalAccess', _118 => _118.closest, 'call', _119 => _119("form"), 'optionalAccess', _120 => _120.requestSubmit, 'call', _121 => _121()]);
3603
+ _optionalChain([textareaRef, 'access', _161 => _161.current, 'optionalAccess', _162 => _162.closest, 'call', _163 => _163("form"), 'optionalAccess', _164 => _164.requestSubmit, 'call', _165 => _165()]);
3220
3604
  }
3221
3605
  }
3222
3606
  };
@@ -3257,29 +3641,111 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
3257
3641
  ComposerPrimitiveInput.displayName = "ComposerPrimitive.Input";
3258
3642
 
3259
3643
  // src/primitives/composer/ComposerSend.tsx
3644
+ var ComposerPrimitiveSend = createActionButton(
3645
+ "ComposerPrimitive.Send",
3646
+ useComposerSend
3647
+ );
3260
3648
 
3649
+ // src/primitives/composer/ComposerCancel.tsx
3650
+ var ComposerPrimitiveCancel = createActionButton(
3651
+ "ComposerPrimitive.Cancel",
3652
+ useComposerCancel
3653
+ );
3261
3654
 
3655
+ // src/primitives/composer/ComposerAddAttachment.tsx
3656
+ var ComposerPrimitiveAddAttachment = createActionButton(
3657
+ "ComposerPrimitive.AddAttachment",
3658
+ useComposerAddAttachment
3659
+ );
3262
3660
 
3263
- var ComposerPrimitiveSend = _react.forwardRef.call(void 0, ({ disabled, ...rest }, ref) => {
3264
- const { useComposer } = useComposerContext();
3265
- const hasValue = useComposer((c) => c.isEditing && c.text.length > 0);
3266
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3267
- _reactprimitive.Primitive.button,
3268
- {
3269
- type: "submit",
3270
- ...rest,
3271
- ref,
3272
- disabled: disabled || !hasValue
3661
+ // src/primitives/composer/ComposerAttachments.tsx
3662
+
3663
+
3664
+ // src/context/providers/ComposerAttachmentProvider.tsx
3665
+
3666
+
3667
+
3668
+ var getAttachment2 = ({ attachments }, useAttachment, partIndex) => {
3669
+ let attachment = attachments[partIndex];
3670
+ if (!attachment) return null;
3671
+ const currentState = _optionalChain([useAttachment, 'optionalAccess', _166 => _166.getState, 'call', _167 => _167()]);
3672
+ if (currentState && currentState.attachment === attachment) return null;
3673
+ return Object.freeze({ attachment });
3674
+ };
3675
+ var useComposerAttachmentContext = (partIndex) => {
3676
+ const { useComposer } = useThreadContext();
3677
+ const [context] = _react.useState.call(void 0,
3678
+ () => {
3679
+ const useAttachment = _zustand.create.call(void 0,
3680
+ () => getAttachment2(useComposer.getState(), void 0, partIndex)
3681
+ );
3682
+ return { type: "composer", useAttachment };
3273
3683
  }
3274
3684
  );
3275
- });
3276
- ComposerPrimitiveSend.displayName = "ComposerPrimitive.Send";
3685
+ _react.useEffect.call(void 0, () => {
3686
+ const syncAttachment = (composer) => {
3687
+ const newState = getAttachment2(
3688
+ composer,
3689
+ context.useAttachment,
3690
+ partIndex
3691
+ );
3692
+ if (!newState) return;
3693
+ writableStore(context.useAttachment).setState(newState, true);
3694
+ };
3695
+ syncAttachment(useComposer.getState());
3696
+ return useComposer.subscribe(syncAttachment);
3697
+ }, [context, useComposer, partIndex]);
3698
+ return context;
3699
+ };
3700
+ var ComposerAttachmentProvider = ({ attachmentIndex: partIndex, children }) => {
3701
+ const context = useComposerAttachmentContext(partIndex);
3702
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentContext.Provider, { value: context, children });
3703
+ };
3277
3704
 
3278
- // src/primitives/composer/ComposerCancel.tsx
3279
- var ComposerPrimitiveCancel = createActionButton(
3280
- "ComposerPrimitive.Cancel",
3281
- useComposerCancel
3705
+ // src/primitives/composer/ComposerAttachments.tsx
3706
+
3707
+ var getComponent2 = (components, attachment) => {
3708
+ const type = attachment.type;
3709
+ switch (type) {
3710
+ case "image":
3711
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _168 => _168.Image]), () => ( _optionalChain([components, 'optionalAccess', _169 => _169.Attachment])));
3712
+ case "document":
3713
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _170 => _170.Document]), () => ( _optionalChain([components, 'optionalAccess', _171 => _171.Attachment])));
3714
+ case "file":
3715
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _172 => _172.File]), () => ( _optionalChain([components, 'optionalAccess', _173 => _173.Attachment])));
3716
+ default:
3717
+ const _exhaustiveCheck = type;
3718
+ throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
3719
+ }
3720
+ };
3721
+ var AttachmentComponent2 = ({ components }) => {
3722
+ const { useAttachment } = useAttachmentContext({ type: "composer" });
3723
+ const Component = useAttachment(
3724
+ (a) => getComponent2(components, a.attachment)
3725
+ );
3726
+ if (!Component) return null;
3727
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, {});
3728
+ };
3729
+ var ComposerAttachmentImpl = ({ components, attachmentIndex }) => {
3730
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent2, { components }) });
3731
+ };
3732
+ var ComposerAttachment = _react.memo.call(void 0,
3733
+ ComposerAttachmentImpl,
3734
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _174 => _174.components, 'optionalAccess', _175 => _175.Image]) === _optionalChain([next, 'access', _176 => _176.components, 'optionalAccess', _177 => _177.Image]) && _optionalChain([prev, 'access', _178 => _178.components, 'optionalAccess', _179 => _179.Document]) === _optionalChain([next, 'access', _180 => _180.components, 'optionalAccess', _181 => _181.Document]) && _optionalChain([prev, 'access', _182 => _182.components, 'optionalAccess', _183 => _183.File]) === _optionalChain([next, 'access', _184 => _184.components, 'optionalAccess', _185 => _185.File]) && _optionalChain([prev, 'access', _186 => _186.components, 'optionalAccess', _187 => _187.Attachment]) === _optionalChain([next, 'access', _188 => _188.components, 'optionalAccess', _189 => _189.Attachment])
3282
3735
  );
3736
+ var ComposerPrimitiveAttachments = ({ components }) => {
3737
+ const { useComposer } = useThreadContext();
3738
+ const attachmentsCount = useComposer((s) => s.attachments.length);
3739
+ return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3740
+ ComposerAttachment,
3741
+ {
3742
+ attachmentIndex: index,
3743
+ components
3744
+ },
3745
+ index
3746
+ ));
3747
+ };
3748
+ ComposerPrimitiveAttachments.displayName = "ComposerPrimitive.Attachments";
3283
3749
 
3284
3750
  // src/primitives/composer/ComposerIf.tsx
3285
3751
  var ComposerPrimitiveIf = ({
@@ -3427,9 +3893,7 @@ var useThreadViewportAutoScroll = ({
3427
3893
  isScrollingToBottomRef.current = false;
3428
3894
  }
3429
3895
  if (newIsAtBottom !== isAtBottom) {
3430
- useViewport.setState({
3431
- isAtBottom: newIsAtBottom
3432
- });
3896
+ writableStore(useViewport).setState({ isAtBottom: newIsAtBottom });
3433
3897
  }
3434
3898
  }
3435
3899
  lastScrollTop.current = div.scrollTop;
@@ -3485,13 +3949,19 @@ var makeEditComposerStore = ({
3485
3949
  },
3486
3950
  text: "",
3487
3951
  setText: (text) => {
3488
- set({ text });
3952
+ set({ text, isEmpty: text.trim().length === 0 });
3489
3953
  },
3490
3954
  canCancel: false,
3491
3955
  isEditing: false,
3956
+ isEmpty: true,
3492
3957
  edit: () => {
3493
3958
  const text = onEdit();
3494
- set({ isEditing: true, canCancel: true, text });
3959
+ set({
3960
+ isEditing: true,
3961
+ canCancel: true,
3962
+ isEmpty: text.trim().length === 0,
3963
+ text
3964
+ });
3495
3965
  },
3496
3966
  send: () => {
3497
3967
  const text = get().text;
@@ -3518,7 +3988,7 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
3518
3988
  },
3519
3989
  isSpeaking: false,
3520
3990
  stopSpeaking: () => {
3521
- _optionalChain([utterance, 'optionalAccess', _122 => _122.cancel, 'call', _123 => _123()]);
3991
+ _optionalChain([utterance, 'optionalAccess', _190 => _190.cancel, 'call', _191 => _191()]);
3522
3992
  },
3523
3993
  addUtterance: (utt) => {
3524
3994
  utterance = utt;
@@ -3533,15 +4003,15 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
3533
4003
  // src/context/providers/MessageProvider.tsx
3534
4004
 
3535
4005
  var getIsLast = (messages, message) => {
3536
- return _optionalChain([messages, 'access', _124 => _124[messages.length - 1], 'optionalAccess', _125 => _125.id]) === message.id;
4006
+ return _optionalChain([messages, 'access', _192 => _192[messages.length - 1], 'optionalAccess', _193 => _193.id]) === message.id;
3537
4007
  };
3538
4008
  var getMessageState = (messages, getBranches, useMessage, messageIndex) => {
3539
- const parentId = _nullishCoalesce(_optionalChain([messages, 'access', _126 => _126[messageIndex - 1], 'optionalAccess', _127 => _127.id]), () => ( null));
4009
+ const parentId = _nullishCoalesce(_optionalChain([messages, 'access', _194 => _194[messageIndex - 1], 'optionalAccess', _195 => _195.id]), () => ( null));
3540
4010
  const message = messages[messageIndex];
3541
4011
  if (!message) return null;
3542
4012
  const isLast = getIsLast(messages, message);
3543
4013
  const branches = getBranches(message.id);
3544
- const currentState = _optionalChain([useMessage, 'optionalAccess', _128 => _128.getState, 'call', _129 => _129()]);
4014
+ const currentState = _optionalChain([useMessage, 'optionalAccess', _196 => _196.getState, 'call', _197 => _197()]);
3545
4015
  if (currentState && currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
3546
4016
  return null;
3547
4017
  return Object.freeze({
@@ -3585,7 +4055,8 @@ var useMessageContext2 = (messageIndex) => {
3585
4055
  useThreadActions.getState().append({
3586
4056
  parentId,
3587
4057
  role: "user",
3588
- content: [{ type: "text", text }, ...nonTextParts]
4058
+ content: [{ type: "text", text }, ...nonTextParts],
4059
+ attachments: message.attachments
3589
4060
  });
3590
4061
  }
3591
4062
  });
@@ -3600,10 +4071,7 @@ var useMessageContext2 = (messageIndex) => {
3600
4071
  messageIndex
3601
4072
  );
3602
4073
  if (!newState) return;
3603
- context.useMessage.setState(
3604
- newState,
3605
- true
3606
- );
4074
+ writableStore(context.useMessage).setState(newState, true);
3607
4075
  };
3608
4076
  syncMessage(useThreadMessages.getState());
3609
4077
  return useThreadMessages.subscribe(syncMessage);
@@ -3653,22 +4121,12 @@ var ThreadPrimitiveMessagesImpl = ({
3653
4121
  const { useThreadMessages } = useThreadContext();
3654
4122
  const messagesLength = useThreadMessages((t) => t.length);
3655
4123
  if (messagesLength === 0) return null;
3656
- return new Array(messagesLength).fill(null).map((_, idx) => {
3657
- const messageIndex = idx;
3658
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3659
- ThreadMessage,
3660
- {
3661
- messageIndex,
3662
- components
3663
- },
3664
- messageIndex
3665
- );
3666
- });
4124
+ return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadMessage, { messageIndex: index, components }, index));
3667
4125
  };
3668
4126
  ThreadPrimitiveMessagesImpl.displayName = "ThreadPrimitive.Messages";
3669
4127
  var ThreadPrimitiveMessages = _react.memo.call(void 0,
3670
4128
  ThreadPrimitiveMessagesImpl,
3671
- (prev, next) => _optionalChain([prev, 'access', _130 => _130.components, 'optionalAccess', _131 => _131.Message]) === _optionalChain([next, 'access', _132 => _132.components, 'optionalAccess', _133 => _133.Message]) && _optionalChain([prev, 'access', _134 => _134.components, 'optionalAccess', _135 => _135.UserMessage]) === _optionalChain([next, 'access', _136 => _136.components, 'optionalAccess', _137 => _137.UserMessage]) && _optionalChain([prev, 'access', _138 => _138.components, 'optionalAccess', _139 => _139.EditComposer]) === _optionalChain([next, 'access', _140 => _140.components, 'optionalAccess', _141 => _141.EditComposer]) && _optionalChain([prev, 'access', _142 => _142.components, 'optionalAccess', _143 => _143.AssistantMessage]) === _optionalChain([next, 'access', _144 => _144.components, 'optionalAccess', _145 => _145.AssistantMessage]) && _optionalChain([prev, 'access', _146 => _146.components, 'optionalAccess', _147 => _147.SystemMessage]) === _optionalChain([next, 'access', _148 => _148.components, 'optionalAccess', _149 => _149.SystemMessage])
4129
+ (prev, next) => _optionalChain([prev, 'access', _198 => _198.components, 'optionalAccess', _199 => _199.Message]) === _optionalChain([next, 'access', _200 => _200.components, 'optionalAccess', _201 => _201.Message]) && _optionalChain([prev, 'access', _202 => _202.components, 'optionalAccess', _203 => _203.UserMessage]) === _optionalChain([next, 'access', _204 => _204.components, 'optionalAccess', _205 => _205.UserMessage]) && _optionalChain([prev, 'access', _206 => _206.components, 'optionalAccess', _207 => _207.EditComposer]) === _optionalChain([next, 'access', _208 => _208.components, 'optionalAccess', _209 => _209.EditComposer]) && _optionalChain([prev, 'access', _210 => _210.components, 'optionalAccess', _211 => _211.AssistantMessage]) === _optionalChain([next, 'access', _212 => _212.components, 'optionalAccess', _213 => _213.AssistantMessage]) && _optionalChain([prev, 'access', _214 => _214.components, 'optionalAccess', _215 => _215.SystemMessage]) === _optionalChain([next, 'access', _216 => _216.components, 'optionalAccess', _217 => _217.SystemMessage])
3672
4130
  );
3673
4131
 
3674
4132
  // src/primitives/thread/ThreadScrollToBottom.tsx
@@ -3700,7 +4158,7 @@ var ThreadConfigProvider = ({
3700
4158
  }) => {
3701
4159
  const assistant = useAssistantContext({ optional: true });
3702
4160
  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 });
3703
- if (!_optionalChain([config, 'optionalAccess', _150 => _150.runtime])) return configProvider;
4161
+ if (!_optionalChain([config, 'optionalAccess', _218 => _218.runtime])) return configProvider;
3704
4162
  if (assistant) {
3705
4163
  throw new Error(
3706
4164
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -3787,8 +4245,7 @@ var AssistantActionBarSpeak = _react.forwardRef.call(void 0, (props, ref) => {
3787
4245
  } = {}
3788
4246
  } = useThreadConfig();
3789
4247
  const allowSpeak = useAllowSpeak();
3790
- if (!allowSpeak) return null;
3791
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.Speak, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.AudioLinesIcon, {}))) }) });
4248
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.Speak, { disabled: !allowSpeak, asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.AudioLinesIcon, {}))) }) });
3792
4249
  });
3793
4250
  AssistantActionBarSpeak.displayName = "AssistantActionBarSpeak";
3794
4251
  var AssistantActionBarStopSpeaking = _react.forwardRef.call(void 0, (props, ref) => {
@@ -3800,8 +4257,7 @@ var AssistantActionBarStopSpeaking = _react.forwardRef.call(void 0, (props, ref)
3800
4257
  } = {}
3801
4258
  } = useThreadConfig();
3802
4259
  const allowSpeak = useAllowSpeak();
3803
- if (!allowSpeak) return null;
3804
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.StopSpeaking, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip: stopTooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.StopCircleIcon, {}))) }) });
4260
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.StopSpeaking, { disabled: !allowSpeak, asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip: stopTooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.StopCircleIcon, {}))) }) });
3805
4261
  });
3806
4262
  AssistantActionBarStopSpeaking.displayName = "AssistantActionBarStopSpeaking";
3807
4263
  var AssistantActionBarReload = _react.forwardRef.call(void 0, (props, ref) => {
@@ -3811,8 +4267,7 @@ var AssistantActionBarReload = _react.forwardRef.call(void 0, (props, ref) => {
3811
4267
  } = {}
3812
4268
  } = useThreadConfig();
3813
4269
  const allowReload = useAllowReload();
3814
- if (!allowReload) return null;
3815
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.Reload, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.RefreshCwIcon, {}) }) });
4270
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.Reload, { disabled: !allowReload, asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.RefreshCwIcon, {}) }) });
3816
4271
  });
3817
4272
  AssistantActionBarReload.displayName = "AssistantActionBarReload";
3818
4273
  var exports = {
@@ -3835,11 +4290,11 @@ var assistant_action_bar_default = Object.assign(
3835
4290
 
3836
4291
 
3837
4292
 
3838
- var useAllowBranchPicker = () => {
4293
+ var useAllowBranchPicker = (ensureCapability = false) => {
3839
4294
  const { branchPicker: { allowBranchPicker = true } = {} } = useThreadConfig();
3840
4295
  const { useThread } = useThreadContext();
3841
4296
  const branchPickerSupported = useThread((t) => t.capabilities.edit);
3842
- return branchPickerSupported && allowBranchPicker;
4297
+ return allowBranchPicker && (!ensureCapability || branchPickerSupported);
3843
4298
  };
3844
4299
  var BranchPicker = () => {
3845
4300
  const allowBranchPicker = useAllowBranchPicker();
@@ -3861,7 +4316,8 @@ var BranchPickerPrevious2 = _react.forwardRef.call(void 0, (props, ref) => {
3861
4316
  branchPicker: { previous: { tooltip = "Previous" } = {} } = {}
3862
4317
  } = {}
3863
4318
  } = useThreadConfig();
3864
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, branchPicker_exports.Previous, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeftIcon, {}))) }) });
4319
+ const allowBranchPicker = useAllowBranchPicker();
4320
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, branchPicker_exports.Previous, { disabled: !allowBranchPicker, asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeftIcon, {}))) }) });
3865
4321
  });
3866
4322
  BranchPickerPrevious2.displayName = "BranchPickerPrevious";
3867
4323
  var BranchPickerStateWrapper = withDefaults("span", {
@@ -3879,7 +4335,8 @@ var BranchPickerNext = _react.forwardRef.call(void 0, (props, ref) => {
3879
4335
  const {
3880
4336
  strings: { branchPicker: { next: { tooltip = "Next" } = {} } = {} } = {}
3881
4337
  } = useThreadConfig();
3882
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, branchPicker_exports.Next, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRightIcon, {}))) }) });
4338
+ const allowBranchPicker = useAllowBranchPicker();
4339
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, branchPicker_exports.Next, { disabled: !allowBranchPicker, asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRightIcon, {}))) }) });
3883
4340
  });
3884
4341
  BranchPickerNext.displayName = "BranchPickerNext";
3885
4342
  var exports2 = {
@@ -3955,13 +4412,27 @@ var AssistantMessageContentWrapper = withDefaults("div", {
3955
4412
  className: "aui-assistant-message-content"
3956
4413
  });
3957
4414
  var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: componentsProp, ...rest }, ref) => {
3958
- const { assistantMessage: { components = {} } = {} } = useThreadConfig();
4415
+ const { tools, assistantMessage: { components = {} } = {} } = useThreadConfig();
4416
+ const toolsComponents = _react.useMemo.call(void 0,
4417
+ () => ({
4418
+ by_name: !tools ? void 0 : Object.fromEntries(
4419
+ tools.map((t) => [
4420
+ t.unstable_tool.toolName,
4421
+ t.unstable_tool.render
4422
+ ])
4423
+ ),
4424
+ Fallback: components.ToolFallback
4425
+ }),
4426
+ // eslint-disable-next-line react-hooks/exhaustive-deps
4427
+ [..._nullishCoalesce(tools, () => ( [])), components.ToolFallback]
4428
+ );
3959
4429
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantMessageContentWrapper, { ...rest, ref, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3960
4430
  message_exports.Content,
3961
4431
  {
3962
4432
  components: {
3963
4433
  ...componentsProp,
3964
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _151 => _151.Text]), () => ( components.Text)), () => ( content_part_default.Text))
4434
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _219 => _219.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
4435
+ tools: toolsComponents
3965
4436
  }
3966
4437
  }
3967
4438
  ) });
@@ -4006,10 +4477,71 @@ var CircleStopIcon = () => {
4006
4477
  };
4007
4478
  CircleStopIcon.displayName = "CircleStopIcon";
4008
4479
 
4480
+ // src/ui/composer-attachment.tsx
4481
+
4482
+
4483
+
4484
+ var ComposerAttachmentRoot = withDefaults("div", {
4485
+ className: "aui-composer-attachment-root"
4486
+ });
4487
+ ComposerAttachmentRoot.displayName = "ComposerAttachmentRoot";
4488
+ var ComposerAttachment2 = () => {
4489
+ const { useAttachment } = useAttachmentContext({ type: "composer" });
4490
+ const attachment = useAttachment((a) => a.attachment);
4491
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ComposerAttachmentRoot, { children: [
4492
+ ".",
4493
+ attachment.name.split(".").pop(),
4494
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAttachmentRemove, {})
4495
+ ] });
4496
+ };
4497
+ ComposerAttachment2.displayName = "ComposerAttachment";
4498
+ var ComposerAttachmentRemove = _react.forwardRef.call(void 0, (props, ref) => {
4499
+ const {
4500
+ strings: {
4501
+ composer: { removeAttachment: { tooltip = "Remove file" } = {} } = {}
4502
+ } = {}
4503
+ } = useThreadConfig();
4504
+ const { useComposer } = useThreadContext();
4505
+ const { useAttachment } = useAttachmentContext();
4506
+ const handleRemoveAttachment = () => {
4507
+ useComposer.getState().removeAttachment(useAttachment.getState().attachment.id);
4508
+ };
4509
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
4510
+ TooltipIconButton,
4511
+ {
4512
+ tooltip,
4513
+ className: "aui-composer-attachment-remove",
4514
+ side: "top",
4515
+ ...props,
4516
+ onClick: handleRemoveAttachment,
4517
+ ref,
4518
+ children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.CircleXIcon, {})))
4519
+ }
4520
+ );
4521
+ });
4522
+ ComposerAttachmentRemove.displayName = "ComposerAttachmentRemove";
4523
+ var exports5 = {
4524
+ Root: ComposerAttachmentRoot,
4525
+ Remove: ComposerAttachmentRemove
4526
+ };
4527
+ var composer_attachment_default = Object.assign(
4528
+ ComposerAttachment2,
4529
+ exports5
4530
+ );
4531
+
4009
4532
  // src/ui/composer.tsx
4010
4533
 
4534
+ var useAllowAttachments = (ensureCapability = false) => {
4535
+ const { composer: { allowAttachments = true } = {} } = useThreadConfig();
4536
+ const { useThread } = useThreadContext();
4537
+ const attachmentsSupported = useThread((t) => t.capabilities.attachments);
4538
+ return allowAttachments && (!ensureCapability || attachmentsSupported);
4539
+ };
4011
4540
  var Composer = () => {
4541
+ const allowAttachments = useAllowAttachments(true);
4012
4542
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ComposerRoot, { children: [
4543
+ allowAttachments && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAttachments, {}),
4544
+ allowAttachments && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAddAttachment, {}),
4013
4545
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerInput, { autoFocus: true }),
4014
4546
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAction, {})
4015
4547
  ] });
@@ -4035,6 +4567,43 @@ var ComposerInput = _react.forwardRef.call(void 0,
4035
4567
  }
4036
4568
  );
4037
4569
  ComposerInput.displayName = "ComposerInput";
4570
+ var ComposerAttachmentsContainer = withDefaults("div", {
4571
+ className: "aui-composer-attachments"
4572
+ });
4573
+ var ComposerAttachments = ({ components }) => {
4574
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAttachmentsContainer, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
4575
+ composer_exports.Attachments,
4576
+ {
4577
+ components: {
4578
+ ...components,
4579
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _220 => _220.Attachment]), () => ( composer_attachment_default))
4580
+ }
4581
+ }
4582
+ ) });
4583
+ };
4584
+ var ComposerAttachButton = withDefaults(TooltipIconButton, {
4585
+ variant: "default",
4586
+ className: "aui-composer-attach"
4587
+ });
4588
+ var ComposerAddAttachment = _react.forwardRef.call(void 0, (props, ref) => {
4589
+ const {
4590
+ strings: {
4591
+ composer: { addAttachment: { tooltip = "Attach file" } = {} } = {}
4592
+ } = {}
4593
+ } = useThreadConfig();
4594
+ const allowAttachments = useAllowAttachments();
4595
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, composer_exports.AddAttachment, { disabled: !allowAttachments, asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
4596
+ ComposerAttachButton,
4597
+ {
4598
+ tooltip,
4599
+ variant: "ghost",
4600
+ ...props,
4601
+ ref,
4602
+ children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.PaperclipIcon, {})))
4603
+ }
4604
+ ) });
4605
+ });
4606
+ ComposerAddAttachment.displayName = "ComposerAddAttachment";
4038
4607
  var useAllowCancel = () => {
4039
4608
  const { useThread } = useThreadContext();
4040
4609
  const cancelSupported = useThread((t) => t.capabilities.cancel);
@@ -4071,14 +4640,16 @@ var ComposerCancel = _react.forwardRef.call(void 0, (props, ref) => {
4071
4640
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerCancelButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, CircleStopIcon, {}))) }) });
4072
4641
  });
4073
4642
  ComposerCancel.displayName = "ComposerCancel";
4074
- var exports5 = {
4643
+ var exports6 = {
4075
4644
  Root: ComposerRoot,
4076
4645
  Input: ComposerInput,
4077
4646
  Action: ComposerAction,
4078
4647
  Send: ComposerSend,
4079
- Cancel: ComposerCancel
4648
+ Cancel: ComposerCancel,
4649
+ AddAttachment: ComposerAddAttachment,
4650
+ Attachments: ComposerAttachments
4080
4651
  };
4081
- var composer_default = Object.assign(Composer, exports5);
4652
+ var composer_default = Object.assign(Composer, exports6);
4082
4653
 
4083
4654
  // src/ui/thread-welcome.tsx
4084
4655
 
@@ -4138,13 +4709,13 @@ var ThreadWelcomeSuggestion = ({
4138
4709
  };
4139
4710
  var ThreadWelcomeSuggestions = () => {
4140
4711
  const { welcome: { suggestions } = {} } = useThreadConfig();
4141
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _152 => _152.map, 'call', _153 => _153((suggestion, idx) => {
4712
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _221 => _221.map, 'call', _222 => _222((suggestion, idx) => {
4142
4713
  const key = `${suggestion.prompt}-${idx}`;
4143
4714
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
4144
4715
  })]) });
4145
4716
  };
4146
4717
  ThreadWelcomeSuggestions.displayName = "ThreadWelcomeSuggestions";
4147
- var exports6 = {
4718
+ var exports7 = {
4148
4719
  Root: ThreadWelcomeRoot,
4149
4720
  Center: ThreadWelcomeCenter,
4150
4721
  Avatar: ThreadWelcomeAvatar,
@@ -4152,7 +4723,7 @@ var exports6 = {
4152
4723
  Suggestions: ThreadWelcomeSuggestions,
4153
4724
  Suggestion: ThreadWelcomeSuggestion
4154
4725
  };
4155
- var thread_welcome_default = Object.assign(ThreadWelcome, exports6);
4726
+ var thread_welcome_default = Object.assign(ThreadWelcome, exports7);
4156
4727
 
4157
4728
  // src/ui/user-message.tsx
4158
4729
 
@@ -4182,20 +4753,43 @@ var UserActionBarEdit = _react.forwardRef.call(void 0, (props, ref) => {
4182
4753
  strings: { userMessage: { edit: { tooltip = "Edit" } = {} } = {} } = {}
4183
4754
  } = useThreadConfig();
4184
4755
  const allowEdit = useAllowEdit();
4185
- if (!allowEdit) return null;
4186
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.Edit, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.PencilIcon, {}))) }) });
4756
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.Edit, { disabled: !allowEdit, asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.PencilIcon, {}))) }) });
4187
4757
  });
4188
4758
  UserActionBarEdit.displayName = "UserActionBarEdit";
4189
- var exports7 = {
4759
+ var exports8 = {
4190
4760
  Root: UserActionBarRoot,
4191
4761
  Edit: UserActionBarEdit
4192
4762
  };
4193
- var user_action_bar_default = Object.assign(UserActionBar, exports7);
4763
+ var user_action_bar_default = Object.assign(UserActionBar, exports8);
4764
+
4765
+ // src/ui/user-message-attachment.tsx
4766
+
4767
+ var UserMessageAttachmentRoot = withDefaults("div", {
4768
+ className: "aui-user-message-attachment-root"
4769
+ });
4770
+ UserMessageAttachmentRoot.displayName = "UserMessageAttachmentRoot";
4771
+ var UserMessageAttachment = () => {
4772
+ const { useAttachment } = useAttachmentContext();
4773
+ const attachment = useAttachment((a) => a.attachment);
4774
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, UserMessageAttachmentRoot, { children: [
4775
+ ".",
4776
+ attachment.name.split(".").pop()
4777
+ ] });
4778
+ };
4779
+ UserMessageAttachment.displayName = "UserMessageAttachment";
4780
+ var exports9 = {
4781
+ Root: UserMessageAttachmentRoot
4782
+ };
4783
+ var user_message_attachment_default = Object.assign(
4784
+ UserMessageAttachment,
4785
+ exports9
4786
+ );
4194
4787
 
4195
4788
  // src/ui/user-message.tsx
4196
4789
 
4197
4790
  var UserMessage = () => {
4198
4791
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, UserMessageRoot, { children: [
4792
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UserMessageAttachments, {}),
4199
4793
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, user_action_bar_default, {}),
4200
4794
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UserMessageContent, {}),
4201
4795
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, branch_picker_default, {})
@@ -4216,18 +4810,35 @@ var UserMessageContent = _react.forwardRef.call(void 0,
4216
4810
  {
4217
4811
  components: {
4218
4812
  ...components,
4219
- Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _154 => _154.Text]), () => ( content_part_default.Text))
4813
+ Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _223 => _223.Text]), () => ( content_part_default.Text))
4220
4814
  }
4221
4815
  }
4222
4816
  ) });
4223
4817
  }
4224
4818
  );
4225
4819
  UserMessageContent.displayName = "UserMessageContent";
4226
- var exports8 = {
4820
+ var UserMessageAttachmentsContainer = withDefaults("div", {
4821
+ className: "aui-user-message-attachments"
4822
+ });
4823
+ var UserMessageAttachments = ({
4824
+ components
4825
+ }) => {
4826
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, message_exports.If, { hasAttachments: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UserMessageAttachmentsContainer, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
4827
+ message_exports.Attachments,
4828
+ {
4829
+ components: {
4830
+ ...components,
4831
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _224 => _224.Attachment]), () => ( user_message_attachment_default))
4832
+ }
4833
+ }
4834
+ ) }) });
4835
+ };
4836
+ var exports10 = {
4227
4837
  Root: UserMessageRoot,
4228
- Content: UserMessageContent
4838
+ Content: UserMessageContent,
4839
+ Attachments: UserMessageAttachments
4229
4840
  };
4230
- var user_message_default = Object.assign(UserMessage, exports8);
4841
+ var user_message_default = Object.assign(UserMessage, exports10);
4231
4842
 
4232
4843
  // src/ui/edit-composer.tsx
4233
4844
 
@@ -4274,14 +4885,14 @@ var EditComposerSend = _react.forwardRef.call(void 0,
4274
4885
  }
4275
4886
  );
4276
4887
  EditComposerSend.displayName = "EditComposerSend";
4277
- var exports9 = {
4888
+ var exports11 = {
4278
4889
  Root: EditComposerRoot,
4279
4890
  Input: EditComposerInput,
4280
4891
  Footer: EditComposerFooter,
4281
4892
  Cancel: EditComposerCancel,
4282
4893
  Send: EditComposerSend
4283
4894
  };
4284
- var edit_composer_default = Object.assign(EditComposer, exports9);
4895
+ var edit_composer_default = Object.assign(EditComposer, exports11);
4285
4896
 
4286
4897
  // src/ui/thread.tsx
4287
4898
 
@@ -4318,10 +4929,10 @@ var ThreadMessages = ({ components, ...rest }) => {
4318
4929
  thread_exports.Messages,
4319
4930
  {
4320
4931
  components: {
4321
- UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _155 => _155.UserMessage]), () => ( user_message_default)),
4322
- EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _156 => _156.EditComposer]), () => ( edit_composer_default)),
4323
- AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _157 => _157.AssistantMessage]), () => ( assistant_message_default)),
4324
- SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _158 => _158.SystemMessage]), () => ( SystemMessage))
4932
+ UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _225 => _225.UserMessage]), () => ( user_message_default)),
4933
+ EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _226 => _226.EditComposer]), () => ( edit_composer_default)),
4934
+ AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _227 => _227.AssistantMessage]), () => ( assistant_message_default)),
4935
+ SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _228 => _228.SystemMessage]), () => ( SystemMessage))
4325
4936
  },
4326
4937
  ...rest
4327
4938
  }
@@ -4341,14 +4952,14 @@ var ThreadScrollToBottom = _react.forwardRef.call(void 0, (props, ref) => {
4341
4952
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, thread_exports.ScrollToBottom, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadScrollToBottomIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ArrowDownIcon, {}))) }) });
4342
4953
  });
4343
4954
  ThreadScrollToBottom.displayName = "ThreadScrollToBottom";
4344
- var exports10 = {
4955
+ var exports12 = {
4345
4956
  Root: ThreadRoot,
4346
4957
  Viewport: ThreadViewport,
4347
4958
  Messages: ThreadMessages,
4348
4959
  ScrollToBottom: ThreadScrollToBottom,
4349
4960
  ViewportFooter: ThreadViewportFooter
4350
4961
  };
4351
- var thread_default = Object.assign(Thread, exports10);
4962
+ var thread_default = Object.assign(Thread, exports12);
4352
4963
 
4353
4964
  // src/ui/assistant-modal.tsx
4354
4965
 
@@ -4422,14 +5033,20 @@ var AssistantModalContent = withDefaults(assistantModal_exports.Content, {
4422
5033
  sideOffset: 16
4423
5034
  });
4424
5035
  AssistantModalContent.displayName = "AssistantModalContent";
4425
- var exports11 = {
5036
+ var exports13 = {
4426
5037
  Root: AssistantModalRoot,
4427
5038
  Trigger: AssistantModalTrigger,
4428
5039
  Content: AssistantModalContent,
4429
5040
  Button: AssistantModalButton,
4430
5041
  Anchor: AssistantModalAnchor
4431
5042
  };
4432
- var assistant_modal_default = Object.assign(AssistantModal, exports11);
5043
+ var assistant_modal_default = Object.assign(AssistantModal, exports13);
5044
+
5045
+
5046
+
5047
+
5048
+
5049
+
4433
5050
 
4434
5051
 
4435
5052
 
@@ -4504,5 +5121,5 @@ var assistant_modal_default = Object.assign(AssistantModal, exports11);
4504
5121
 
4505
5122
 
4506
5123
 
4507
- 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.ComposerPrimitive = composer_exports; exports.ContentPart = content_part_default; exports.ContentPartPrimitive = contentPart_exports; exports.EdgeChatAdapter = EdgeChatAdapter; exports.EditComposer = edit_composer_default; exports.ExternalStoreRuntime = ExternalStoreRuntime; exports.INTERNAL = internal_exports; exports.MessagePrimitive = message_exports; 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.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 = _chunkBQ3MRWUVjs.toCoreMessage; exports.toCoreMessages = _chunkBQ3MRWUVjs.toCoreMessages; exports.toLanguageModelMessages = _chunkBQ3MRWUVjs.toLanguageModelMessages; exports.toLanguageModelTools = _chunkBQ3MRWUVjs.toLanguageModelTools; exports.useActionBarCopy = useActionBarCopy; exports.useActionBarEdit = useActionBarEdit; exports.useActionBarReload = useActionBarReload; exports.useActionBarSpeak = useActionBarSpeak; exports.useActionBarStopSpeaking = useActionBarStopSpeaking; exports.useAppendMessage = useAppendMessage; exports.useAssistantContext = useAssistantContext; exports.useAssistantInstructions = useAssistantInstructions; exports.useAssistantTool = useAssistantTool; exports.useAssistantToolUI = useAssistantToolUI; exports.useBranchPickerCount = useBranchPickerCount; exports.useBranchPickerNext = useBranchPickerNext; exports.useBranchPickerNumber = useBranchPickerNumber; exports.useBranchPickerPrevious = useBranchPickerPrevious; exports.useComposerCancel = useComposerCancel; exports.useComposerContext = useComposerContext; exports.useComposerIf = useComposerIf; exports.useComposerSend = useComposerSend; exports.useContentPartContext = useContentPartContext; exports.useContentPartDisplay = useContentPartDisplay; exports.useContentPartImage = useContentPartImage; exports.useContentPartText = useContentPartText; exports.useDangerousInBrowserRuntime = useDangerousInBrowserRuntime; exports.useEdgeRuntime = useEdgeRuntime; exports.useExternalMessageConverter = useExternalMessageConverter; exports.useExternalStoreRuntime = useExternalStoreRuntime; exports.useLocalRuntime = useLocalRuntime; exports.useMessageContext = useMessageContext; exports.useMessageIf = useMessageIf; exports.useSwitchToNewThread = useSwitchToNewThread; exports.useThreadConfig = useThreadConfig; exports.useThreadContext = useThreadContext; exports.useThreadEmpty = useThreadEmpty; exports.useThreadIf = useThreadIf; exports.useThreadScrollToBottom = useThreadScrollToBottom; exports.useThreadSuggestion = useThreadSuggestion;
5124
+ 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.ExternalStoreRuntime = ExternalStoreRuntime; exports.INTERNAL = internal_exports; exports.MessagePrimitive = message_exports; exports.SimpleImageAttachmentAdapter = SimpleImageAttachmentAdapter; exports.SimpleTextAttachmentAdapter = SimpleTextAttachmentAdapter; 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 = _chunkBNSCUYW7js.toCoreMessage; exports.toCoreMessages = _chunkBNSCUYW7js.toCoreMessages; exports.toLanguageModelMessages = _chunkBNSCUYW7js.toLanguageModelMessages; exports.toLanguageModelTools = _chunkBNSCUYW7js.toLanguageModelTools; exports.useActionBarCopy = useActionBarCopy; exports.useActionBarEdit = useActionBarEdit; exports.useActionBarReload = useActionBarReload; exports.useActionBarSpeak = useActionBarSpeak; exports.useActionBarStopSpeaking = useActionBarStopSpeaking; exports.useAppendMessage = useAppendMessage; exports.useAssistantContext = useAssistantContext; exports.useAssistantInstructions = useAssistantInstructions; exports.useAssistantTool = useAssistantTool; exports.useAssistantToolUI = useAssistantToolUI; exports.useBranchPickerCount = useBranchPickerCount; exports.useBranchPickerNext = useBranchPickerNext; exports.useBranchPickerNumber = useBranchPickerNumber; exports.useBranchPickerPrevious = useBranchPickerPrevious; exports.useComposerAddAttachment = useComposerAddAttachment; exports.useComposerCancel = useComposerCancel; exports.useComposerContext = useComposerContext; exports.useComposerIf = useComposerIf; exports.useComposerSend = useComposerSend; exports.useContentPartContext = useContentPartContext; exports.useContentPartDisplay = useContentPartDisplay; exports.useContentPartImage = useContentPartImage; exports.useContentPartText = useContentPartText; exports.useDangerousInBrowserRuntime = useDangerousInBrowserRuntime; exports.useEdgeRuntime = useEdgeRuntime; exports.useExternalMessageConverter = useExternalMessageConverter; exports.useExternalStoreRuntime = useExternalStoreRuntime; exports.useLocalRuntime = useLocalRuntime; exports.useMessageContext = useMessageContext; exports.useMessageIf = useMessageIf; exports.useSwitchToNewThread = useSwitchToNewThread; exports.useThreadConfig = useThreadConfig; exports.useThreadContext = useThreadContext; exports.useThreadEmpty = useThreadEmpty; exports.useThreadIf = useThreadIf; exports.useThreadScrollToBottom = useThreadScrollToBottom; exports.useThreadSuggestion = useThreadSuggestion;
4508
5125
  //# sourceMappingURL=index.js.map