@assistant-ui/react 0.5.45 → 0.5.47

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8;"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