@assistant-ui/react 0.5.46 → 0.5.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8;"use client";
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8; var _class9; var _class10; var _class11;"use client";
2
2
 
3
3
 
4
4
 
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- var _chunkBQ3MRWUVjs = require('./chunk-BQ3MRWUV.js');
13
+ var _chunkBNSCUYW7js = require('./chunk-BNSCUYW7.js');
14
14
 
15
15
 
16
16
  var _chunkDCHYNTHIjs = require('./chunk-DCHYNTHI.js');
@@ -42,7 +42,7 @@ var _zustand = require('zustand');
42
42
  var ProxyConfigProvider = (_class = class {constructor() { _class.prototype.__init.call(this); }
43
43
  __init() {this._providers = /* @__PURE__ */ new Set()}
44
44
  getModelConfig() {
45
- return _chunkBQ3MRWUVjs.mergeModelConfigs.call(void 0, this._providers);
45
+ return _chunkBNSCUYW7js.mergeModelConfigs.call(void 0, this._providers);
46
46
  }
47
47
  registerModelConfigProvider(provider) {
48
48
  this._providers.add(provider);
@@ -125,21 +125,26 @@ var makeComposerStore = (useThreadRuntime) => {
125
125
  setValue(value) {
126
126
  get().setText(value);
127
127
  },
128
+ attachments: runtime.composer.attachments,
129
+ addAttachment: (file) => {
130
+ useThreadRuntime.getState().composer.addAttachment(file);
131
+ },
132
+ removeAttachment: (attachmentId) => {
133
+ useThreadRuntime.getState().composer.removeAttachment(attachmentId);
134
+ },
135
+ reset: () => {
136
+ useThreadRuntime.getState().composer.reset();
137
+ },
128
138
  text: runtime.composer.text,
129
- setText: (value) => {
130
- useThreadRuntime.getState().composer.setText(value);
139
+ setText: (text) => {
140
+ useThreadRuntime.getState().composer.setText(text);
131
141
  },
132
142
  canCancel: runtime.capabilities.cancel,
133
143
  isEditing: true,
144
+ isEmpty: runtime.composer.isEmpty,
134
145
  send: () => {
135
146
  const runtime2 = useThreadRuntime.getState();
136
- const text = runtime2.composer.text;
137
- runtime2.composer.setText("");
138
- runtime2.append({
139
- parentId: _nullishCoalesce(_optionalChain([runtime2, 'access', _6 => _6.messages, 'access', _7 => _7.at, 'call', _8 => _8(-1), 'optionalAccess', _9 => _9.id]), () => ( null)),
140
- role: "user",
141
- content: [{ type: "text", text }]
142
- });
147
+ runtime2.composer.send();
143
148
  },
144
149
  cancel: () => {
145
150
  useThreadRuntime.getState().cancelRun();
@@ -167,7 +172,7 @@ var getThreadStateFromRuntime = (runtime) => {
167
172
  threadId: runtime.threadId,
168
173
  capabilities: runtime.capabilities,
169
174
  isDisabled: runtime.isDisabled,
170
- isRunning: _optionalChain([lastMessage, 'optionalAccess', _10 => _10.role]) !== "assistant" ? false : lastMessage.status.type === "running"
175
+ isRunning: _optionalChain([lastMessage, 'optionalAccess', _6 => _6.role]) !== "assistant" ? false : lastMessage.status.type === "running"
171
176
  });
172
177
  };
173
178
  var makeThreadStore = (runtimeRef) => {
@@ -228,7 +233,7 @@ var subscribeToMainThread = (runtime, callback) => {
228
233
  let first = true;
229
234
  let cleanup;
230
235
  const inner = () => {
231
- _optionalChain([cleanup, 'optionalCall', _11 => _11()]);
236
+ _optionalChain([cleanup, 'optionalCall', _7 => _7()]);
232
237
  cleanup = runtime.thread.subscribe(callback);
233
238
  if (!first) {
234
239
  callback();
@@ -239,7 +244,7 @@ var subscribeToMainThread = (runtime, callback) => {
239
244
  inner();
240
245
  return () => {
241
246
  unsubscribe();
242
- _optionalChain([cleanup, 'optionalCall', _12 => _12()]);
247
+ _optionalChain([cleanup, 'optionalCall', _8 => _8()]);
243
248
  };
244
249
  };
245
250
 
@@ -275,6 +280,7 @@ _chunkDCHYNTHIjs.__export.call(void 0, internal_exports, {
275
280
  BaseAssistantRuntime: () => BaseAssistantRuntime,
276
281
  MessageRepository: () => MessageRepository,
277
282
  ProxyConfigProvider: () => ProxyConfigProvider,
283
+ ThreadRuntimeComposer: () => ThreadRuntimeComposer,
278
284
  TooltipIconButton: () => TooltipIconButton,
279
285
  generateId: () => generateId,
280
286
  useSmooth: () => useSmooth,
@@ -282,6 +288,76 @@ _chunkDCHYNTHIjs.__export.call(void 0, internal_exports, {
282
288
  withSmoothContextProvider: () => withSmoothContextProvider
283
289
  });
284
290
 
291
+ // src/runtimes/utils/ThreadRuntimeComposer.tsx
292
+ var ThreadRuntimeComposer = (_class3 = class {
293
+ constructor(runtime, notifySubscribers) {;_class3.prototype.__init4.call(this);_class3.prototype.__init5.call(this);_class3.prototype.__init6.call(this);
294
+ this.runtime = runtime;
295
+ this.notifySubscribers = notifySubscribers;
296
+ }
297
+
298
+ __init4() {this.attachmentAccept = "*"}
299
+ get isEmpty() {
300
+ return !this.text.trim() && !this.attachments.length;
301
+ }
302
+ setAttachmentAdapter(adapter) {
303
+ this._attachmentAdapter = adapter;
304
+ const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _9 => _9.accept]), () => ( "*"));
305
+ if (this.attachmentAccept !== accept) {
306
+ this.attachmentAccept = accept;
307
+ return true;
308
+ }
309
+ return false;
310
+ }
311
+ __init5() {this._attachments = []}
312
+ get attachments() {
313
+ return this._attachments;
314
+ }
315
+ async addAttachment(file) {
316
+ if (!this._attachmentAdapter)
317
+ throw new Error("Attachments are not supported");
318
+ const attachment = await this._attachmentAdapter.add({ file });
319
+ this._attachments = [...this._attachments, attachment];
320
+ this.notifySubscribers();
321
+ }
322
+ async removeAttachment(attachmentId) {
323
+ if (!this._attachmentAdapter)
324
+ throw new Error("Attachments are not supported");
325
+ const index = this._attachments.findIndex((a) => a.id === attachmentId);
326
+ if (index === -1) throw new Error("Attachment not found");
327
+ const attachment = this._attachments[index];
328
+ await this._attachmentAdapter.remove(attachment);
329
+ this._attachments = this._attachments.toSpliced(index, 1);
330
+ this.notifySubscribers();
331
+ }
332
+ __init6() {this._text = ""}
333
+ get text() {
334
+ return this._text;
335
+ }
336
+ setText(value) {
337
+ this._text = value;
338
+ this.notifySubscribers();
339
+ }
340
+ reset() {
341
+ this._text = "";
342
+ this._attachments = [];
343
+ this.notifySubscribers();
344
+ }
345
+ async send() {
346
+ const attachments = this._attachmentAdapter ? await Promise.all(
347
+ this.attachments.map(
348
+ async (a) => await this._attachmentAdapter.send(a)
349
+ )
350
+ ) : [];
351
+ this.runtime.append({
352
+ parentId: _nullishCoalesce(_optionalChain([this, 'access', _10 => _10.runtime, 'access', _11 => _11.messages, 'access', _12 => _12.at, 'call', _13 => _13(-1), 'optionalAccess', _14 => _14.id]), () => ( null)),
353
+ role: "user",
354
+ content: this.text ? [{ type: "text", text: this.text }] : [],
355
+ attachments
356
+ });
357
+ this.reset();
358
+ }
359
+ }, _class3);
360
+
285
361
  // src/utils/idUtils.tsx
286
362
  var _nonsecure = require('nanoid/non-secure');
287
363
  var generateId = _nonsecure.customAlphabet.call(void 0,
@@ -324,7 +400,8 @@ var fromCoreMessage = (message, {
324
400
  return {
325
401
  ...commonProps,
326
402
  role,
327
- content: message.content
403
+ content: message.content,
404
+ attachments: []
328
405
  };
329
406
  case "system":
330
407
  return {
@@ -345,11 +422,11 @@ var findHead = (message) => {
345
422
  if ("current" in message) return message;
346
423
  return null;
347
424
  };
348
- var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__init4.call(this);_class3.prototype.__init5.call(this);_class3.prototype.__init6.call(this); }
349
- __init4() {this.messages = /* @__PURE__ */ new Map()}
425
+ var MessageRepository = (_class4 = class {constructor() { _class4.prototype.__init7.call(this);_class4.prototype.__init8.call(this);_class4.prototype.__init9.call(this); }
426
+ __init7() {this.messages = /* @__PURE__ */ new Map()}
350
427
  // message_id -> item
351
- __init5() {this.head = null}
352
- __init6() {this.root = {
428
+ __init8() {this.head = null}
429
+ __init9() {this.root = {
353
430
  children: [],
354
431
  next: null
355
432
  }}
@@ -391,7 +468,7 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
391
468
  }
392
469
  }
393
470
  getMessages() {
394
- const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _13 => _13.head, 'optionalAccess', _14 => _14.level]), () => ( 0)));
471
+ const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _15 => _15.head, 'optionalAccess', _16 => _16.level]), () => ( 0)));
395
472
  for (let current = this.head; current; current = current.prev) {
396
473
  messages[current.level] = current.current;
397
474
  }
@@ -429,7 +506,7 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
429
506
  "MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui."
430
507
  );
431
508
  return {
432
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _15 => _15.prev, 'optionalAccess', _16 => _16.current, 'access', _17 => _17.id]), () => ( null)),
509
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _17 => _17.prev, 'optionalAccess', _18 => _18.current, 'access', _19 => _19.id]), () => ( null)),
433
510
  message: message.current
434
511
  };
435
512
  }
@@ -513,11 +590,11 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
513
590
  for (const [, message] of this.messages) {
514
591
  exportItems.push({
515
592
  message: message.current,
516
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _18 => _18.prev, 'optionalAccess', _19 => _19.current, 'access', _20 => _20.id]), () => ( null))
593
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _20 => _20.prev, 'optionalAccess', _21 => _21.current, 'access', _22 => _22.id]), () => ( null))
517
594
  });
518
595
  }
519
596
  return {
520
- headId: _nullishCoalesce(_optionalChain([this, 'access', _21 => _21.head, 'optionalAccess', _22 => _22.current, 'access', _23 => _23.id]), () => ( null)),
597
+ headId: _nullishCoalesce(_optionalChain([this, 'access', _23 => _23.head, 'optionalAccess', _24 => _24.current, 'access', _25 => _25.id]), () => ( null)),
521
598
  messages: exportItems
522
599
  };
523
600
  }
@@ -525,9 +602,9 @@ var MessageRepository = (_class3 = class {constructor() { _class3.prototype.__in
525
602
  for (const { message, parentId } of messages) {
526
603
  this.addOrUpdateMessage(parentId, message);
527
604
  }
528
- this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _24 => _24.at, 'call', _25 => _25(-1), 'optionalAccess', _26 => _26.message, 'access', _27 => _27.id]))), () => ( null)));
605
+ this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _26 => _26.at, 'call', _27 => _27(-1), 'optionalAccess', _28 => _28.message, 'access', _29 => _29.id]))), () => ( null)));
529
606
  }
530
- }, _class3);
607
+ }, _class4);
531
608
 
532
609
  // src/utils/smooth/useSmooth.tsx
533
610
 
@@ -564,7 +641,7 @@ var withSmoothContextProvider = (Component) => {
564
641
  };
565
642
  function useSmoothContext(options) {
566
643
  const context = _react.useContext.call(void 0, SmoothContext);
567
- if (!_optionalChain([options, 'optionalAccess', _28 => _28.optional]) && !context)
644
+ if (!_optionalChain([options, 'optionalAccess', _30 => _30.optional]) && !context)
568
645
  throw new Error(
569
646
  "This component must be used within a SmoothContextProvider."
570
647
  );
@@ -577,14 +654,14 @@ var useSmoothStatus = () => {
577
654
 
578
655
  // src/utils/smooth/useSmooth.tsx
579
656
  var _reactusecallbackref = require('@radix-ui/react-use-callback-ref');
580
- var TextStreamAnimator = (_class4 = class {
581
- constructor(currentText, setText) {;_class4.prototype.__init7.call(this);_class4.prototype.__init8.call(this);_class4.prototype.__init9.call(this);_class4.prototype.__init10.call(this);
657
+ var TextStreamAnimator = (_class5 = class {
658
+ constructor(currentText, setText) {;_class5.prototype.__init10.call(this);_class5.prototype.__init11.call(this);_class5.prototype.__init12.call(this);_class5.prototype.__init13.call(this);
582
659
  this.currentText = currentText;
583
660
  this.setText = setText;
584
661
  }
585
- __init7() {this.animationFrameId = null}
586
- __init8() {this.lastUpdateTime = Date.now()}
587
- __init9() {this.targetText = ""}
662
+ __init10() {this.animationFrameId = null}
663
+ __init11() {this.lastUpdateTime = Date.now()}
664
+ __init12() {this.targetText = ""}
588
665
  start() {
589
666
  if (this.animationFrameId !== null) return;
590
667
  this.lastUpdateTime = Date.now();
@@ -596,7 +673,7 @@ var TextStreamAnimator = (_class4 = class {
596
673
  this.animationFrameId = null;
597
674
  }
598
675
  }
599
- __init10() {this.animate = () => {
676
+ __init13() {this.animate = () => {
600
677
  const currentTime = Date.now();
601
678
  const deltaTime = currentTime - this.lastUpdateTime;
602
679
  let timeToConsume = deltaTime;
@@ -620,7 +697,7 @@ var TextStreamAnimator = (_class4 = class {
620
697
  this.lastUpdateTime = currentTime - timeToConsume;
621
698
  this.setText(this.currentText);
622
699
  }}
623
- }, _class4);
700
+ }, _class5);
624
701
  var SMOOTH_STATUS = Object.freeze({
625
702
  type: "running"
626
703
  });
@@ -635,10 +712,10 @@ var useSmooth = (state, smooth = false) => {
635
712
  const [displayedText, setDisplayedText] = _react.useState.call(void 0, text);
636
713
  const setText = _reactusecallbackref.useCallbackRef.call(void 0, (text2) => {
637
714
  setDisplayedText(text2);
638
- _optionalChain([useSmoothStatus2, 'optionalAccess', _29 => _29.setState, 'call', _30 => _30(text2 !== state.part.text ? SMOOTH_STATUS : state.status)]);
715
+ _optionalChain([useSmoothStatus2, 'optionalAccess', _31 => _31.setState, 'call', _32 => _32(text2 !== state.part.text ? SMOOTH_STATUS : state.status)]);
639
716
  });
640
717
  _react.useEffect.call(void 0, () => {
641
- _optionalChain([useSmoothStatus2, 'optionalAccess', _31 => _31.setState, 'call', _32 => _32(text !== displayedText ? SMOOTH_STATUS : state.status)]);
718
+ _optionalChain([useSmoothStatus2, 'optionalAccess', _33 => _33.setState, 'call', _34 => _34(text !== displayedText ? SMOOTH_STATUS : state.status)]);
642
719
  }, [useSmoothStatus2, text, displayedText, state.status]);
643
720
  const [animatorRef] = _react.useState.call(void 0,
644
721
  new TextStreamAnimator(text, setText)
@@ -832,7 +909,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
832
909
  });
833
910
  if (mergeRoundtrips) {
834
911
  const previousMessage = messages[messages.length - 1];
835
- if (_optionalChain([previousMessage, 'optionalAccess', _33 => _33.role]) === "assistant") {
912
+ if (_optionalChain([previousMessage, 'optionalAccess', _35 => _35.role]) === "assistant") {
836
913
  previousMessage.content.push(...newContent);
837
914
  break;
838
915
  }
@@ -845,7 +922,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
845
922
  }
846
923
  case "tool": {
847
924
  const previousMessage = messages[messages.length - 1];
848
- if (_optionalChain([previousMessage, 'optionalAccess', _34 => _34.role]) !== "assistant")
925
+ if (_optionalChain([previousMessage, 'optionalAccess', _36 => _36.role]) !== "assistant")
849
926
  throw new Error(
850
927
  "A tool message must be preceded by an assistant message."
851
928
  );
@@ -921,14 +998,14 @@ function streamPartDecoderStream() {
921
998
  controller.enqueue(decodeStreamPart(chunk));
922
999
  }
923
1000
  });
924
- return new (0, _chunkBQ3MRWUVjs.PipeableTransformStream)((readable) => {
1001
+ return new (0, _chunkBNSCUYW7js.PipeableTransformStream)((readable) => {
925
1002
  return readable.pipeThrough(new TextDecoderStream()).pipeThrough(chunkByLineStream()).pipeThrough(decodeStream);
926
1003
  });
927
1004
  }
928
1005
 
929
1006
  // src/runtimes/edge/streams/utils/index.ts
930
1007
  var streamUtils = {
931
- streamPartEncoderStream: _chunkBQ3MRWUVjs.streamPartEncoderStream,
1008
+ streamPartEncoderStream: _chunkBNSCUYW7js.streamPartEncoderStream,
932
1009
  streamPartDecoderStream
933
1010
  };
934
1011
 
@@ -1037,8 +1114,8 @@ var EdgeChatAdapter = class {
1037
1114
  credentials: _nullishCoalesce(this.options.credentials, () => ( "same-origin")),
1038
1115
  body: JSON.stringify({
1039
1116
  system: config.system,
1040
- messages: _chunkBQ3MRWUVjs.toCoreMessages.call(void 0, messages),
1041
- tools: config.tools ? _chunkBQ3MRWUVjs.toLanguageModelTools.call(void 0, config.tools) : [],
1117
+ messages: _chunkBNSCUYW7js.toCoreMessages.call(void 0, messages),
1118
+ tools: config.tools ? _chunkBNSCUYW7js.toLanguageModelTools.call(void 0, config.tools) : [],
1042
1119
  ...config.callSettings,
1043
1120
  ...config.config,
1044
1121
  ...this.options.body
@@ -1048,7 +1125,7 @@ var EdgeChatAdapter = class {
1048
1125
  if (result.status !== 200) {
1049
1126
  throw new Error(`Status ${result.status}: ${await result.text()}`);
1050
1127
  }
1051
- const stream = result.body.pipeThrough(streamPartDecoderStream()).pipeThrough(assistantDecoderStream()).pipeThrough(_chunkBQ3MRWUVjs.toolResultStream.call(void 0, config.tools, abortSignal)).pipeThrough(_chunkBQ3MRWUVjs.runResultStream.call(void 0, ));
1128
+ const stream = result.body.pipeThrough(streamPartDecoderStream()).pipeThrough(assistantDecoderStream()).pipeThrough(_chunkBNSCUYW7js.toolResultStream.call(void 0, config.tools, abortSignal)).pipeThrough(_chunkBNSCUYW7js.runResultStream.call(void 0, ));
1052
1129
  let update;
1053
1130
  for await (update of asAsyncIterable(stream)) {
1054
1131
  yield update;
@@ -1074,11 +1151,11 @@ var useEdgeRuntime = ({
1074
1151
  };
1075
1152
 
1076
1153
  // src/runtimes/local/shouldContinue.tsx
1077
- var shouldContinue = (result) => _optionalChain([result, 'access', _35 => _35.status, 'optionalAccess', _36 => _36.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
1154
+ var shouldContinue = (result) => _optionalChain([result, 'access', _37 => _37.status, 'optionalAccess', _38 => _38.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
1078
1155
 
1079
1156
  // src/runtimes/local/LocalThreadRuntime.tsx
1080
- var LocalThreadRuntime = (_class5 = class {
1081
- constructor(configProvider, adapter, { initialMessages, ...options }) {;_class5.prototype.__init11.call(this);_class5.prototype.__init12.call(this);_class5.prototype.__init13.call(this);_class5.prototype.__init14.call(this);_class5.prototype.__init15.call(this);_class5.prototype.__init16.call(this);
1157
+ var LocalThreadRuntime = (_class6 = class {
1158
+ constructor(configProvider, adapter, { initialMessages, ...options }) {;_class6.prototype.__init14.call(this);_class6.prototype.__init15.call(this);_class6.prototype.__init16.call(this);_class6.prototype.__init17.call(this);_class6.prototype.__init18.call(this);_class6.prototype.__init19.call(this);
1082
1159
  this.configProvider = configProvider;
1083
1160
  this.adapter = adapter;
1084
1161
  this.threadId = generateId();
@@ -1092,40 +1169,46 @@ var LocalThreadRuntime = (_class5 = class {
1092
1169
  }
1093
1170
  }
1094
1171
  }
1095
- __init11() {this._subscriptions = /* @__PURE__ */ new Set()}
1096
- __init12() {this.abortController = null}
1097
- __init13() {this.repository = new MessageRepository()}
1098
- __init14() {this.capabilities = {
1172
+ __init14() {this._subscriptions = /* @__PURE__ */ new Set()}
1173
+ __init15() {this.abortController = null}
1174
+ __init16() {this.repository = new MessageRepository()}
1175
+ __init17() {this.capabilities = {
1099
1176
  switchToBranch: true,
1100
1177
  edit: true,
1101
1178
  reload: true,
1102
1179
  cancel: true,
1103
1180
  unstable_copy: true,
1104
- speak: false
1181
+ speak: false,
1182
+ attachments: false
1105
1183
  }}
1106
1184
 
1107
- __init15() {this.isDisabled = false}
1185
+ __init18() {this.isDisabled = false}
1108
1186
  get messages() {
1109
1187
  return this.repository.getMessages();
1110
1188
  }
1111
- __init16() {this.composer = {
1112
- text: "",
1113
- setText: (value) => {
1114
- this.composer.text = value;
1115
- this.notifySubscribers();
1116
- }
1117
- }}
1189
+ __init19() {this.composer = new ThreadRuntimeComposer(
1190
+ this,
1191
+ this.notifySubscribers.bind(this)
1192
+ )}
1118
1193
 
1119
1194
  get options() {
1120
1195
  return this._options;
1121
1196
  }
1122
1197
  set options({ initialMessages, ...options }) {
1123
1198
  this._options = options;
1124
- const canSpeak = _optionalChain([options, 'access', _37 => _37.adapters, 'optionalAccess', _38 => _38.speech]) !== void 0;
1199
+ let hasUpdates = false;
1200
+ const canSpeak = _optionalChain([options, 'access', _39 => _39.adapters, 'optionalAccess', _40 => _40.speech]) !== void 0;
1125
1201
  if (this.capabilities.speak !== canSpeak) {
1126
1202
  this.capabilities.speak = canSpeak;
1127
- this.notifySubscribers();
1203
+ hasUpdates = true;
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;
1128
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
  };
@@ -2400,7 +2633,7 @@ var useComposerSend = () => {
2400
2633
  const { useComposer } = useComposerContext();
2401
2634
  const disabled = useCombinedStore(
2402
2635
  [useThread, useComposer],
2403
- (t, c) => t.isRunning || !c.isEditing || c.text.length === 0
2636
+ (t, c) => t.isRunning || !c.isEditing || c.isEmpty
2404
2637
  );
2405
2638
  const callback = _react.useCallback.call(void 0, () => {
2406
2639
  const composerState = useComposer.getState();
@@ -2413,6 +2646,30 @@ var useComposerSend = () => {
2413
2646
  return callback;
2414
2647
  };
2415
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
+
2416
2673
  // src/primitive-hooks/contentPart/useContentPartDisplay.tsx
2417
2674
  var useContentPartDisplay = () => {
2418
2675
  const { useContentPart } = useContentPartContext();
@@ -2467,6 +2724,10 @@ var useMessageIf = (props) => {
2467
2724
  if (props.copied === false && isCopied) return false;
2468
2725
  if (props.speaking === true && !isSpeaking) return false;
2469
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;
2470
2731
  return true;
2471
2732
  }
2472
2733
  );
@@ -2612,7 +2873,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
2612
2873
  ...primitiveProps,
2613
2874
  ref: forwardedRef,
2614
2875
  onClick: _primitive.composeEventHandlers.call(void 0, primitiveProps.onClick, () => {
2615
- _optionalChain([callback, 'optionalCall', _97 => _97()]);
2876
+ _optionalChain([callback, 'optionalCall', _112 => _112()]);
2616
2877
  })
2617
2878
  }
2618
2879
  );
@@ -2668,7 +2929,7 @@ var ActionBarPrimitiveStopSpeaking = _react.forwardRef.call(void 0, (props, ref)
2668
2929
  ...props,
2669
2930
  ref,
2670
2931
  onClick: _primitive.composeEventHandlers.call(void 0, props.onClick, () => {
2671
- _optionalChain([callback, 'optionalCall', _98 => _98()]);
2932
+ _optionalChain([callback, 'optionalCall', _113 => _113()]);
2672
2933
  })
2673
2934
  }
2674
2935
  );
@@ -2844,6 +3105,7 @@ BranchPickerPrimitiveNumber.displayName = "BranchPickerPrimitive.Number";
2844
3105
  // src/primitives/message/index.ts
2845
3106
  var message_exports = {};
2846
3107
  _chunkDCHYNTHIjs.__export.call(void 0, message_exports, {
3108
+ Attachments: () => MessagePrimitiveAttachments,
2847
3109
  Content: () => MessagePrimitiveContent,
2848
3110
  If: () => MessagePrimitiveIf,
2849
3111
  InProgress: () => MessagePrimitiveInProgress,
@@ -2954,7 +3216,7 @@ var getContentPartState = ({ message }, useContentPart, partIndex) => {
2954
3216
  }
2955
3217
  }
2956
3218
  const status = toContentPartStatus(message, partIndex, part);
2957
- const currentState = _optionalChain([useContentPart, 'optionalAccess', _99 => _99.getState, 'call', _100 => _100()]);
3219
+ const currentState = _optionalChain([useContentPart, 'optionalAccess', _114 => _114.getState, 'call', _115 => _115()]);
2958
3220
  if (currentState && currentState.part === part && currentState.status === status)
2959
3221
  return null;
2960
3222
  return Object.freeze({ part, status });
@@ -2975,7 +3237,7 @@ var useContentPartContext2 = (partIndex) => {
2975
3237
  partIndex
2976
3238
  );
2977
3239
  if (!newState) return;
2978
- context.useContentPart.setState(newState, true);
3240
+ writableStore(context.useContentPart).setState(newState, true);
2979
3241
  };
2980
3242
  syncContentPart(useMessage.getState());
2981
3243
  return useMessage.subscribe(syncContentPart);
@@ -3112,24 +3374,14 @@ var MessageContentPartImpl = ({
3112
3374
  };
3113
3375
  var MessageContentPart = _react.memo.call(void 0,
3114
3376
  MessageContentPartImpl,
3115
- (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])
3116
3378
  );
3117
3379
  var MessagePrimitiveContent = ({
3118
3380
  components
3119
3381
  }) => {
3120
3382
  const { useMessage } = useMessageContext();
3121
3383
  const contentLength = useMessage((s) => s.message.content.length) || 1;
3122
- return new Array(contentLength).fill(null).map((_, idx) => {
3123
- const partIndex = idx;
3124
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3125
- MessageContentPart,
3126
- {
3127
- partIndex,
3128
- components
3129
- },
3130
- partIndex
3131
- );
3132
- });
3384
+ return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageContentPart, { partIndex: index, components }, index));
3133
3385
  };
3134
3386
  MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
3135
3387
 
@@ -3139,6 +3391,125 @@ var MessagePrimitiveInProgress = () => {
3139
3391
  };
3140
3392
  MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
3141
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
+
3142
3513
  // src/primitives/branchPicker/BranchPickerRoot.tsx
3143
3514
 
3144
3515
  var BranchPickerPrimitiveRoot = _react.forwardRef.call(void 0, ({ hideWhenSingleBranch, ...rest }, ref) => {
@@ -3149,6 +3520,8 @@ BranchPickerPrimitiveRoot.displayName = "BranchPickerPrimitive.Root";
3149
3520
  // src/primitives/composer/index.ts
3150
3521
  var composer_exports = {};
3151
3522
  _chunkDCHYNTHIjs.__export.call(void 0, composer_exports, {
3523
+ AddAttachment: () => ComposerPrimitiveAddAttachment,
3524
+ Attachments: () => ComposerPrimitiveAttachments,
3152
3525
  Cancel: () => ComposerPrimitiveCancel,
3153
3526
  If: () => ComposerPrimitiveIf,
3154
3527
  Input: () => ComposerPrimitiveInput,
@@ -3227,7 +3600,7 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
3227
3600
  const { isRunning } = useThread.getState();
3228
3601
  if (!isRunning) {
3229
3602
  e.preventDefault();
3230
- _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()]);
3231
3604
  }
3232
3605
  }
3233
3606
  };
@@ -3268,29 +3641,111 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
3268
3641
  ComposerPrimitiveInput.displayName = "ComposerPrimitive.Input";
3269
3642
 
3270
3643
  // src/primitives/composer/ComposerSend.tsx
3644
+ var ComposerPrimitiveSend = createActionButton(
3645
+ "ComposerPrimitive.Send",
3646
+ useComposerSend
3647
+ );
3648
+
3649
+ // src/primitives/composer/ComposerCancel.tsx
3650
+ var ComposerPrimitiveCancel = createActionButton(
3651
+ "ComposerPrimitive.Cancel",
3652
+ useComposerCancel
3653
+ );
3271
3654
 
3655
+ // src/primitives/composer/ComposerAddAttachment.tsx
3656
+ var ComposerPrimitiveAddAttachment = createActionButton(
3657
+ "ComposerPrimitive.AddAttachment",
3658
+ useComposerAddAttachment
3659
+ );
3272
3660
 
3661
+ // src/primitives/composer/ComposerAttachments.tsx
3273
3662
 
3274
- var ComposerPrimitiveSend = _react.forwardRef.call(void 0, ({ disabled, ...rest }, ref) => {
3275
- const { useComposer } = useComposerContext();
3276
- const hasValue = useComposer((c) => c.isEditing && c.text.length > 0);
3277
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3278
- _reactprimitive.Primitive.button,
3279
- {
3280
- type: "submit",
3281
- ...rest,
3282
- ref,
3283
- disabled: disabled || !hasValue
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 };
3284
3683
  }
3285
3684
  );
3286
- });
3287
- 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
+ };
3288
3704
 
3289
- // src/primitives/composer/ComposerCancel.tsx
3290
- var ComposerPrimitiveCancel = createActionButton(
3291
- "ComposerPrimitive.Cancel",
3292
- 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])
3293
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";
3294
3749
 
3295
3750
  // src/primitives/composer/ComposerIf.tsx
3296
3751
  var ComposerPrimitiveIf = ({
@@ -3438,9 +3893,7 @@ var useThreadViewportAutoScroll = ({
3438
3893
  isScrollingToBottomRef.current = false;
3439
3894
  }
3440
3895
  if (newIsAtBottom !== isAtBottom) {
3441
- useViewport.setState({
3442
- isAtBottom: newIsAtBottom
3443
- });
3896
+ writableStore(useViewport).setState({ isAtBottom: newIsAtBottom });
3444
3897
  }
3445
3898
  }
3446
3899
  lastScrollTop.current = div.scrollTop;
@@ -3496,13 +3949,19 @@ var makeEditComposerStore = ({
3496
3949
  },
3497
3950
  text: "",
3498
3951
  setText: (text) => {
3499
- set({ text });
3952
+ set({ text, isEmpty: text.trim().length === 0 });
3500
3953
  },
3501
3954
  canCancel: false,
3502
3955
  isEditing: false,
3956
+ isEmpty: true,
3503
3957
  edit: () => {
3504
3958
  const text = onEdit();
3505
- set({ isEditing: true, canCancel: true, text });
3959
+ set({
3960
+ isEditing: true,
3961
+ canCancel: true,
3962
+ isEmpty: text.trim().length === 0,
3963
+ text
3964
+ });
3506
3965
  },
3507
3966
  send: () => {
3508
3967
  const text = get().text;
@@ -3529,7 +3988,7 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
3529
3988
  },
3530
3989
  isSpeaking: false,
3531
3990
  stopSpeaking: () => {
3532
- _optionalChain([utterance, 'optionalAccess', _122 => _122.cancel, 'call', _123 => _123()]);
3991
+ _optionalChain([utterance, 'optionalAccess', _190 => _190.cancel, 'call', _191 => _191()]);
3533
3992
  },
3534
3993
  addUtterance: (utt) => {
3535
3994
  utterance = utt;
@@ -3544,15 +4003,15 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
3544
4003
  // src/context/providers/MessageProvider.tsx
3545
4004
 
3546
4005
  var getIsLast = (messages, message) => {
3547
- 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;
3548
4007
  };
3549
4008
  var getMessageState = (messages, getBranches, useMessage, messageIndex) => {
3550
- 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));
3551
4010
  const message = messages[messageIndex];
3552
4011
  if (!message) return null;
3553
4012
  const isLast = getIsLast(messages, message);
3554
4013
  const branches = getBranches(message.id);
3555
- const currentState = _optionalChain([useMessage, 'optionalAccess', _128 => _128.getState, 'call', _129 => _129()]);
4014
+ const currentState = _optionalChain([useMessage, 'optionalAccess', _196 => _196.getState, 'call', _197 => _197()]);
3556
4015
  if (currentState && currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
3557
4016
  return null;
3558
4017
  return Object.freeze({
@@ -3596,7 +4055,8 @@ var useMessageContext2 = (messageIndex) => {
3596
4055
  useThreadActions.getState().append({
3597
4056
  parentId,
3598
4057
  role: "user",
3599
- content: [{ type: "text", text }, ...nonTextParts]
4058
+ content: [{ type: "text", text }, ...nonTextParts],
4059
+ attachments: message.attachments
3600
4060
  });
3601
4061
  }
3602
4062
  });
@@ -3611,10 +4071,7 @@ var useMessageContext2 = (messageIndex) => {
3611
4071
  messageIndex
3612
4072
  );
3613
4073
  if (!newState) return;
3614
- context.useMessage.setState(
3615
- newState,
3616
- true
3617
- );
4074
+ writableStore(context.useMessage).setState(newState, true);
3618
4075
  };
3619
4076
  syncMessage(useThreadMessages.getState());
3620
4077
  return useThreadMessages.subscribe(syncMessage);
@@ -3664,22 +4121,12 @@ var ThreadPrimitiveMessagesImpl = ({
3664
4121
  const { useThreadMessages } = useThreadContext();
3665
4122
  const messagesLength = useThreadMessages((t) => t.length);
3666
4123
  if (messagesLength === 0) return null;
3667
- return new Array(messagesLength).fill(null).map((_, idx) => {
3668
- const messageIndex = idx;
3669
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3670
- ThreadMessage,
3671
- {
3672
- messageIndex,
3673
- components
3674
- },
3675
- messageIndex
3676
- );
3677
- });
4124
+ return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadMessage, { messageIndex: index, components }, index));
3678
4125
  };
3679
4126
  ThreadPrimitiveMessagesImpl.displayName = "ThreadPrimitive.Messages";
3680
4127
  var ThreadPrimitiveMessages = _react.memo.call(void 0,
3681
4128
  ThreadPrimitiveMessagesImpl,
3682
- (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])
3683
4130
  );
3684
4131
 
3685
4132
  // src/primitives/thread/ThreadScrollToBottom.tsx
@@ -3711,7 +4158,7 @@ var ThreadConfigProvider = ({
3711
4158
  }) => {
3712
4159
  const assistant = useAssistantContext({ optional: true });
3713
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 });
3714
- if (!_optionalChain([config, 'optionalAccess', _150 => _150.runtime])) return configProvider;
4161
+ if (!_optionalChain([config, 'optionalAccess', _218 => _218.runtime])) return configProvider;
3715
4162
  if (assistant) {
3716
4163
  throw new Error(
3717
4164
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -3798,8 +4245,7 @@ var AssistantActionBarSpeak = _react.forwardRef.call(void 0, (props, ref) => {
3798
4245
  } = {}
3799
4246
  } = useThreadConfig();
3800
4247
  const allowSpeak = useAllowSpeak();
3801
- if (!allowSpeak) return null;
3802
- 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, {}))) }) });
3803
4249
  });
3804
4250
  AssistantActionBarSpeak.displayName = "AssistantActionBarSpeak";
3805
4251
  var AssistantActionBarStopSpeaking = _react.forwardRef.call(void 0, (props, ref) => {
@@ -3811,8 +4257,7 @@ var AssistantActionBarStopSpeaking = _react.forwardRef.call(void 0, (props, ref)
3811
4257
  } = {}
3812
4258
  } = useThreadConfig();
3813
4259
  const allowSpeak = useAllowSpeak();
3814
- if (!allowSpeak) return null;
3815
- 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, {}))) }) });
3816
4261
  });
3817
4262
  AssistantActionBarStopSpeaking.displayName = "AssistantActionBarStopSpeaking";
3818
4263
  var AssistantActionBarReload = _react.forwardRef.call(void 0, (props, ref) => {
@@ -3822,8 +4267,7 @@ var AssistantActionBarReload = _react.forwardRef.call(void 0, (props, ref) => {
3822
4267
  } = {}
3823
4268
  } = useThreadConfig();
3824
4269
  const allowReload = useAllowReload();
3825
- if (!allowReload) return null;
3826
- 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, {}) }) });
3827
4271
  });
3828
4272
  AssistantActionBarReload.displayName = "AssistantActionBarReload";
3829
4273
  var exports = {
@@ -3846,11 +4290,11 @@ var assistant_action_bar_default = Object.assign(
3846
4290
 
3847
4291
 
3848
4292
 
3849
- var useAllowBranchPicker = () => {
4293
+ var useAllowBranchPicker = (ensureCapability = false) => {
3850
4294
  const { branchPicker: { allowBranchPicker = true } = {} } = useThreadConfig();
3851
4295
  const { useThread } = useThreadContext();
3852
4296
  const branchPickerSupported = useThread((t) => t.capabilities.edit);
3853
- return branchPickerSupported && allowBranchPicker;
4297
+ return allowBranchPicker && (!ensureCapability || branchPickerSupported);
3854
4298
  };
3855
4299
  var BranchPicker = () => {
3856
4300
  const allowBranchPicker = useAllowBranchPicker();
@@ -3872,7 +4316,8 @@ var BranchPickerPrevious2 = _react.forwardRef.call(void 0, (props, ref) => {
3872
4316
  branchPicker: { previous: { tooltip = "Previous" } = {} } = {}
3873
4317
  } = {}
3874
4318
  } = useThreadConfig();
3875
- 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, {}))) }) });
3876
4321
  });
3877
4322
  BranchPickerPrevious2.displayName = "BranchPickerPrevious";
3878
4323
  var BranchPickerStateWrapper = withDefaults("span", {
@@ -3890,7 +4335,8 @@ var BranchPickerNext = _react.forwardRef.call(void 0, (props, ref) => {
3890
4335
  const {
3891
4336
  strings: { branchPicker: { next: { tooltip = "Next" } = {} } = {} } = {}
3892
4337
  } = useThreadConfig();
3893
- 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, {}))) }) });
3894
4340
  });
3895
4341
  BranchPickerNext.displayName = "BranchPickerNext";
3896
4342
  var exports2 = {
@@ -3967,21 +4413,26 @@ var AssistantMessageContentWrapper = withDefaults("div", {
3967
4413
  });
3968
4414
  var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: componentsProp, ...rest }, ref) => {
3969
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
+ );
3970
4429
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantMessageContentWrapper, { ...rest, ref, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
3971
4430
  message_exports.Content,
3972
4431
  {
3973
4432
  components: {
3974
4433
  ...componentsProp,
3975
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _151 => _151.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
3976
- tools: {
3977
- by_name: !tools ? void 0 : Object.fromEntries(
3978
- tools.map((t) => [
3979
- t.unstable_tool.toolName,
3980
- t.unstable_tool.render
3981
- ])
3982
- ),
3983
- Fallback: components.ToolFallback
3984
- }
4434
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _219 => _219.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
4435
+ tools: toolsComponents
3985
4436
  }
3986
4437
  }
3987
4438
  ) });
@@ -4026,10 +4477,71 @@ var CircleStopIcon = () => {
4026
4477
  };
4027
4478
  CircleStopIcon.displayName = "CircleStopIcon";
4028
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
+
4029
4532
  // src/ui/composer.tsx
4030
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
+ };
4031
4540
  var Composer = () => {
4541
+ const allowAttachments = useAllowAttachments(true);
4032
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, {}),
4033
4545
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerInput, { autoFocus: true }),
4034
4546
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAction, {})
4035
4547
  ] });
@@ -4055,6 +4567,43 @@ var ComposerInput = _react.forwardRef.call(void 0,
4055
4567
  }
4056
4568
  );
4057
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";
4058
4607
  var useAllowCancel = () => {
4059
4608
  const { useThread } = useThreadContext();
4060
4609
  const cancelSupported = useThread((t) => t.capabilities.cancel);
@@ -4091,14 +4640,16 @@ var ComposerCancel = _react.forwardRef.call(void 0, (props, ref) => {
4091
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, {}))) }) });
4092
4641
  });
4093
4642
  ComposerCancel.displayName = "ComposerCancel";
4094
- var exports5 = {
4643
+ var exports6 = {
4095
4644
  Root: ComposerRoot,
4096
4645
  Input: ComposerInput,
4097
4646
  Action: ComposerAction,
4098
4647
  Send: ComposerSend,
4099
- Cancel: ComposerCancel
4648
+ Cancel: ComposerCancel,
4649
+ AddAttachment: ComposerAddAttachment,
4650
+ Attachments: ComposerAttachments
4100
4651
  };
4101
- var composer_default = Object.assign(Composer, exports5);
4652
+ var composer_default = Object.assign(Composer, exports6);
4102
4653
 
4103
4654
  // src/ui/thread-welcome.tsx
4104
4655
 
@@ -4158,13 +4709,13 @@ var ThreadWelcomeSuggestion = ({
4158
4709
  };
4159
4710
  var ThreadWelcomeSuggestions = () => {
4160
4711
  const { welcome: { suggestions } = {} } = useThreadConfig();
4161
- 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) => {
4162
4713
  const key = `${suggestion.prompt}-${idx}`;
4163
4714
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
4164
4715
  })]) });
4165
4716
  };
4166
4717
  ThreadWelcomeSuggestions.displayName = "ThreadWelcomeSuggestions";
4167
- var exports6 = {
4718
+ var exports7 = {
4168
4719
  Root: ThreadWelcomeRoot,
4169
4720
  Center: ThreadWelcomeCenter,
4170
4721
  Avatar: ThreadWelcomeAvatar,
@@ -4172,7 +4723,7 @@ var exports6 = {
4172
4723
  Suggestions: ThreadWelcomeSuggestions,
4173
4724
  Suggestion: ThreadWelcomeSuggestion
4174
4725
  };
4175
- var thread_welcome_default = Object.assign(ThreadWelcome, exports6);
4726
+ var thread_welcome_default = Object.assign(ThreadWelcome, exports7);
4176
4727
 
4177
4728
  // src/ui/user-message.tsx
4178
4729
 
@@ -4202,20 +4753,43 @@ var UserActionBarEdit = _react.forwardRef.call(void 0, (props, ref) => {
4202
4753
  strings: { userMessage: { edit: { tooltip = "Edit" } = {} } = {} } = {}
4203
4754
  } = useThreadConfig();
4204
4755
  const allowEdit = useAllowEdit();
4205
- if (!allowEdit) return null;
4206
- 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, {}))) }) });
4207
4757
  });
4208
4758
  UserActionBarEdit.displayName = "UserActionBarEdit";
4209
- var exports7 = {
4759
+ var exports8 = {
4210
4760
  Root: UserActionBarRoot,
4211
4761
  Edit: UserActionBarEdit
4212
4762
  };
4213
- 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
+ );
4214
4787
 
4215
4788
  // src/ui/user-message.tsx
4216
4789
 
4217
4790
  var UserMessage = () => {
4218
4791
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, UserMessageRoot, { children: [
4792
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UserMessageAttachments, {}),
4219
4793
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, user_action_bar_default, {}),
4220
4794
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, UserMessageContent, {}),
4221
4795
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, branch_picker_default, {})
@@ -4236,18 +4810,35 @@ var UserMessageContent = _react.forwardRef.call(void 0,
4236
4810
  {
4237
4811
  components: {
4238
4812
  ...components,
4239
- 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))
4240
4814
  }
4241
4815
  }
4242
4816
  ) });
4243
4817
  }
4244
4818
  );
4245
4819
  UserMessageContent.displayName = "UserMessageContent";
4246
- 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 = {
4247
4837
  Root: UserMessageRoot,
4248
- Content: UserMessageContent
4838
+ Content: UserMessageContent,
4839
+ Attachments: UserMessageAttachments
4249
4840
  };
4250
- var user_message_default = Object.assign(UserMessage, exports8);
4841
+ var user_message_default = Object.assign(UserMessage, exports10);
4251
4842
 
4252
4843
  // src/ui/edit-composer.tsx
4253
4844
 
@@ -4294,14 +4885,14 @@ var EditComposerSend = _react.forwardRef.call(void 0,
4294
4885
  }
4295
4886
  );
4296
4887
  EditComposerSend.displayName = "EditComposerSend";
4297
- var exports9 = {
4888
+ var exports11 = {
4298
4889
  Root: EditComposerRoot,
4299
4890
  Input: EditComposerInput,
4300
4891
  Footer: EditComposerFooter,
4301
4892
  Cancel: EditComposerCancel,
4302
4893
  Send: EditComposerSend
4303
4894
  };
4304
- var edit_composer_default = Object.assign(EditComposer, exports9);
4895
+ var edit_composer_default = Object.assign(EditComposer, exports11);
4305
4896
 
4306
4897
  // src/ui/thread.tsx
4307
4898
 
@@ -4338,10 +4929,10 @@ var ThreadMessages = ({ components, ...rest }) => {
4338
4929
  thread_exports.Messages,
4339
4930
  {
4340
4931
  components: {
4341
- UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _155 => _155.UserMessage]), () => ( user_message_default)),
4342
- EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _156 => _156.EditComposer]), () => ( edit_composer_default)),
4343
- AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _157 => _157.AssistantMessage]), () => ( assistant_message_default)),
4344
- 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))
4345
4936
  },
4346
4937
  ...rest
4347
4938
  }
@@ -4361,14 +4952,14 @@ var ThreadScrollToBottom = _react.forwardRef.call(void 0, (props, ref) => {
4361
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, {}))) }) });
4362
4953
  });
4363
4954
  ThreadScrollToBottom.displayName = "ThreadScrollToBottom";
4364
- var exports10 = {
4955
+ var exports12 = {
4365
4956
  Root: ThreadRoot,
4366
4957
  Viewport: ThreadViewport,
4367
4958
  Messages: ThreadMessages,
4368
4959
  ScrollToBottom: ThreadScrollToBottom,
4369
4960
  ViewportFooter: ThreadViewportFooter
4370
4961
  };
4371
- var thread_default = Object.assign(Thread, exports10);
4962
+ var thread_default = Object.assign(Thread, exports12);
4372
4963
 
4373
4964
  // src/ui/assistant-modal.tsx
4374
4965
 
@@ -4442,14 +5033,20 @@ var AssistantModalContent = withDefaults(assistantModal_exports.Content, {
4442
5033
  sideOffset: 16
4443
5034
  });
4444
5035
  AssistantModalContent.displayName = "AssistantModalContent";
4445
- var exports11 = {
5036
+ var exports13 = {
4446
5037
  Root: AssistantModalRoot,
4447
5038
  Trigger: AssistantModalTrigger,
4448
5039
  Content: AssistantModalContent,
4449
5040
  Button: AssistantModalButton,
4450
5041
  Anchor: AssistantModalAnchor
4451
5042
  };
4452
- var assistant_modal_default = Object.assign(AssistantModal, exports11);
5043
+ var assistant_modal_default = Object.assign(AssistantModal, exports13);
5044
+
5045
+
5046
+
5047
+
5048
+
5049
+
4453
5050
 
4454
5051
 
4455
5052
 
@@ -4524,5 +5121,5 @@ var assistant_modal_default = Object.assign(AssistantModal, exports11);
4524
5121
 
4525
5122
 
4526
5123
 
4527
- 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;
4528
5125
  //# sourceMappingURL=index.js.map