@assistant-ui/react 0.5.67 → 0.5.68

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
@@ -234,13 +234,7 @@ var ThreadRuntimeProvider = ({ children, runtime }) => {
234
234
  useViewport
235
235
  };
236
236
  }, [useThread2, useThreadRuntime2, useThreadMessages2, useThreadComposer2]);
237
- const Synchronizer = context.useThread(
238
- (t) => t.unstable_synchronizer
239
- );
240
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ThreadContext.Provider, { value: context, children: [
241
- Synchronizer && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Synchronizer, {}),
242
- children
243
- ] });
237
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadContext.Provider, { value: context, children });
244
238
  };
245
239
 
246
240
  // src/context/providers/AssistantRuntimeProvider.tsx
@@ -576,11 +570,11 @@ var useActionBarCopy = ({
576
570
  // src/primitive-hooks/actionBar/useActionBarEdit.tsx
577
571
 
578
572
  var useActionBarEdit = () => {
579
- const composerRuntime = useComposerRuntime();
580
- const disabled = useComposer((c) => c.isEditing);
573
+ const messageRuntime = useMessageRuntime();
574
+ const disabled = useEditComposer((c) => c.isEditing);
581
575
  const callback = _react.useCallback.call(void 0, () => {
582
- composerRuntime.beginEdit();
583
- }, [composerRuntime]);
576
+ messageRuntime.composer.beginEdit();
577
+ }, [messageRuntime]);
584
578
  if (disabled) return null;
585
579
  return callback;
586
580
  };
@@ -1589,40 +1583,204 @@ var ContentPartPrimitiveInProgress = ({ children }) => {
1589
1583
  };
1590
1584
  ContentPartPrimitiveInProgress.displayName = "ContentPartPrimitive.InProgress";
1591
1585
 
1586
+ // src/api/AttachmentRuntime.ts
1587
+ var AttachmentRuntime = class {
1588
+ constructor(_core) {
1589
+ this._core = _core;
1590
+ }
1591
+ getState() {
1592
+ return this._core.getState();
1593
+ }
1594
+ subscribe(callback) {
1595
+ return this._core.subscribe(callback);
1596
+ }
1597
+ };
1598
+ var ComposerAttachmentRuntime = class extends AttachmentRuntime {
1599
+ constructor(core, _composerApi) {
1600
+ super(core);
1601
+ this._composerApi = _composerApi;
1602
+ }
1603
+ remove() {
1604
+ const core = this._composerApi.getState();
1605
+ if (!core) throw new Error("Composer is not available");
1606
+ return core.removeAttachment(this.getState().id);
1607
+ }
1608
+ };
1609
+ var ThreadComposerAttachmentRuntime = class extends ComposerAttachmentRuntime {
1610
+ get source() {
1611
+ return "thread-composer";
1612
+ }
1613
+ };
1614
+ var EditComposerAttachmentRuntime = class extends ComposerAttachmentRuntime {
1615
+ get source() {
1616
+ return "edit-composer";
1617
+ }
1618
+ };
1619
+ var MessageAttachmentRuntime = class extends AttachmentRuntime {
1620
+ get source() {
1621
+ return "message";
1622
+ }
1623
+ constructor(core) {
1624
+ super(core);
1625
+ }
1626
+ remove() {
1627
+ throw new Error("Message attachments cannot be removed");
1628
+ }
1629
+ };
1630
+
1631
+ // src/api/subscribable/BaseSubject.ts
1632
+ var BaseSubject = (_class2 = class {constructor() { _class2.prototype.__init5.call(this); }
1633
+ __init5() {this._subscriptions = /* @__PURE__ */ new Set()}
1634
+
1635
+ get isConnected() {
1636
+ return !!this._connection;
1637
+ }
1638
+ notifySubscribers() {
1639
+ for (const callback of this._subscriptions) callback();
1640
+ }
1641
+ _updateConnection() {
1642
+ if (this._subscriptions.size > 0) {
1643
+ if (this._connection) return;
1644
+ this._connection = this._connect();
1645
+ } else {
1646
+ _optionalChain([this, 'access', _16 => _16._connection, 'optionalCall', _17 => _17()]);
1647
+ this._connection = void 0;
1648
+ }
1649
+ }
1650
+ subscribe(callback) {
1651
+ this._subscriptions.add(callback);
1652
+ this._updateConnection();
1653
+ return () => {
1654
+ this._subscriptions.delete(callback);
1655
+ this._updateConnection();
1656
+ };
1657
+ }
1658
+ }, _class2);
1659
+
1660
+ // src/api/subscribable/SKIP_UPDATE.ts
1661
+ var SKIP_UPDATE = Symbol("skip-update");
1662
+
1663
+ // src/api/subscribable/LazyMemoizeSubject.ts
1664
+ var LazyMemoizeSubject = (_class3 = class extends BaseSubject {
1665
+ constructor(binding) {
1666
+ super();_class3.prototype.__init6.call(this);_class3.prototype.__init7.call(this);;
1667
+ this.binding = binding;
1668
+ }
1669
+ __init6() {this._previousStateDirty = true}
1670
+
1671
+ __init7() {this.getState = () => {
1672
+ if (!this.isConnected || this._previousStateDirty) {
1673
+ const newState = this.binding.getState();
1674
+ if (newState !== SKIP_UPDATE) {
1675
+ this._previousState = newState;
1676
+ }
1677
+ this._previousStateDirty = false;
1678
+ }
1679
+ if (this._previousState === void 0)
1680
+ throw new Error("Entry not available in the store");
1681
+ return this._previousState;
1682
+ }}
1683
+ _connect() {
1684
+ const callback = () => {
1685
+ this._previousStateDirty = true;
1686
+ this.notifySubscribers();
1687
+ };
1688
+ return this.binding.subscribe(callback);
1689
+ }
1690
+ }, _class3);
1691
+
1692
+ // src/api/subscribable/shallowEqual.ts
1693
+ function shallowEqual(objA, objB) {
1694
+ if (objA === void 0 && objB === void 0) return true;
1695
+ if (objA === void 0) return false;
1696
+ if (objB === void 0) return false;
1697
+ for (const key of Object.keys(objA)) {
1698
+ const valueA = objA[key];
1699
+ const valueB = objB[key];
1700
+ if (!Object.is(valueA, valueB)) return false;
1701
+ }
1702
+ return true;
1703
+ }
1704
+
1705
+ // src/api/subscribable/ShallowMemoizeSubject.ts
1706
+ var ShallowMemoizeSubject = (_class4 = class extends BaseSubject {
1707
+ constructor(binding) {
1708
+ super();_class4.prototype.__init8.call(this);;
1709
+ this.binding = binding;
1710
+ const state = binding.getState();
1711
+ if (state === SKIP_UPDATE)
1712
+ throw new Error("Entry not available in the store");
1713
+ this._previousState = state;
1714
+ }
1715
+
1716
+ __init8() {this.getState = () => {
1717
+ if (!this.isConnected) this._syncState();
1718
+ return this._previousState;
1719
+ }}
1720
+ _syncState() {
1721
+ const state = this.binding.getState();
1722
+ if (state === SKIP_UPDATE) return false;
1723
+ if (shallowEqual(state, this._previousState)) return false;
1724
+ this._previousState = state;
1725
+ return true;
1726
+ }
1727
+ _connect() {
1728
+ const callback = () => {
1729
+ if (this._syncState()) {
1730
+ this.notifySubscribers();
1731
+ }
1732
+ };
1733
+ return this.binding.subscribe(callback);
1734
+ }
1735
+ }, _class4);
1736
+
1592
1737
  // src/api/ComposerRuntime.ts
1593
1738
  var METHOD_NOT_SUPPORTED = () => {
1594
1739
  throw new Error("Composer is not available");
1595
1740
  };
1596
1741
  var EMPTY_ARRAY = Object.freeze([]);
1597
- var getThreadComposerState = (type, runtime, beginEdit, focus, onFocus) => {
1742
+ var getThreadComposerState = (runtime, focus, onFocus) => {
1743
+ return Object.freeze({
1744
+ type: "thread",
1745
+ isEditing: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _18 => _18.isEditing]), () => ( false)),
1746
+ canCancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _19 => _19.canCancel]), () => ( false)),
1747
+ isEmpty: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _20 => _20.isEmpty]), () => ( true)),
1748
+ text: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _21 => _21.text]), () => ( "")),
1749
+ attachments: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _22 => _22.attachments]), () => ( EMPTY_ARRAY)),
1750
+ attachmentAccept: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _23 => _23.attachmentAccept]), () => ( "*")),
1751
+ value: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _24 => _24.text]), () => ( "")),
1752
+ setValue: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _25 => _25.setText, 'access', _26 => _26.bind, 'call', _27 => _27(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1753
+ setText: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _28 => _28.setText, 'access', _29 => _29.bind, 'call', _30 => _30(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1754
+ // edit: beginEdit,
1755
+ send: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _31 => _31.send, 'access', _32 => _32.bind, 'call', _33 => _33(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1756
+ cancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _34 => _34.cancel, 'access', _35 => _35.bind, 'call', _36 => _36(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1757
+ focus,
1758
+ onFocus,
1759
+ reset: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _37 => _37.reset, 'access', _38 => _38.bind, 'call', _39 => _39(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1760
+ addAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _40 => _40.addAttachment, 'access', _41 => _41.bind, 'call', _42 => _42(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1761
+ removeAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _43 => _43.removeAttachment, 'access', _44 => _44.bind, 'call', _45 => _45(runtime)]), () => ( METHOD_NOT_SUPPORTED))
1762
+ });
1763
+ };
1764
+ var getEditComposerState = (runtime, beginEdit) => {
1598
1765
  return Object.freeze({
1599
- type,
1600
- isEditing: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _16 => _16.isEditing]), () => ( false)),
1601
- canCancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _17 => _17.canCancel]), () => ( false)),
1602
- isEmpty: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _18 => _18.isEmpty]), () => ( true)),
1603
- text: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _19 => _19.text]), () => ( "")),
1604
- attachments: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _20 => _20.attachments]), () => ( EMPTY_ARRAY)),
1605
- attachmentAccept: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _21 => _21.attachmentAccept]), () => ( "*")),
1606
- value: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _22 => _22.text]), () => ( "")),
1607
- setValue: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _23 => _23.setText, 'access', _24 => _24.bind, 'call', _25 => _25(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1608
- setText: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _26 => _26.setText, 'access', _27 => _27.bind, 'call', _28 => _28(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1766
+ type: "edit",
1767
+ isEditing: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _46 => _46.isEditing]), () => ( false)),
1768
+ canCancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _47 => _47.canCancel]), () => ( false)),
1769
+ isEmpty: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _48 => _48.isEmpty]), () => ( true)),
1770
+ text: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _49 => _49.text]), () => ( "")),
1771
+ attachments: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _50 => _50.attachments]), () => ( EMPTY_ARRAY)),
1772
+ attachmentAccept: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _51 => _51.attachmentAccept]), () => ( "*")),
1773
+ value: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _52 => _52.text]), () => ( "")),
1774
+ setValue: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _53 => _53.setText, 'access', _54 => _54.bind, 'call', _55 => _55(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1775
+ setText: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _56 => _56.setText, 'access', _57 => _57.bind, 'call', _58 => _58(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1609
1776
  edit: beginEdit,
1610
- send: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _29 => _29.send, 'access', _30 => _30.bind, 'call', _31 => _31(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1611
- cancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _32 => _32.cancel, 'access', _33 => _33.bind, 'call', _34 => _34(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1612
- focus: _nullishCoalesce(focus, () => ( METHOD_NOT_SUPPORTED)),
1613
- onFocus: _nullishCoalesce(onFocus, () => ( METHOD_NOT_SUPPORTED)),
1614
- reset: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _35 => _35.reset, 'access', _36 => _36.bind, 'call', _37 => _37(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1615
- addAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _38 => _38.addAttachment, 'access', _39 => _39.bind, 'call', _40 => _40(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1616
- removeAttachment: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _41 => _41.removeAttachment, 'access', _42 => _42.bind, 'call', _43 => _43(runtime)]), () => ( METHOD_NOT_SUPPORTED))
1777
+ send: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _59 => _59.send, 'access', _60 => _60.bind, 'call', _61 => _61(runtime)]), () => ( METHOD_NOT_SUPPORTED)),
1778
+ cancel: _nullishCoalesce(_optionalChain([runtime, 'optionalAccess', _62 => _62.cancel, 'access', _63 => _63.bind, 'call', _64 => _64(runtime)]), () => ( METHOD_NOT_SUPPORTED))
1617
1779
  });
1618
1780
  };
1619
- var ComposerRuntime = (_class2 = class {
1620
- constructor(_core, _beginEdit) {;_class2.prototype.__init5.call(this);
1781
+ var ComposerRuntime = class {
1782
+ constructor(_core) {
1621
1783
  this._core = _core;
1622
- this._beginEdit = _beginEdit;
1623
- }
1624
- get type() {
1625
- return this._beginEdit ? "edit" : "thread";
1626
1784
  }
1627
1785
  /**
1628
1786
  * @deprecated Use `getState().isEditing` instead. This will be removed in 0.6.0.
@@ -1654,7 +1812,6 @@ var ComposerRuntime = (_class2 = class {
1654
1812
  get attachmentAccept() {
1655
1813
  return this.getState().attachmentAccept;
1656
1814
  }
1657
- // TODO should this instead return getAttachmentByIndex([idx]) instead?
1658
1815
  /**
1659
1816
  * @deprecated Use `getState().attachments` instead. This will be removed in 0.6.0.
1660
1817
  */
@@ -1667,15 +1824,6 @@ var ComposerRuntime = (_class2 = class {
1667
1824
  get value() {
1668
1825
  return this.text;
1669
1826
  }
1670
- getState() {
1671
- return getThreadComposerState(
1672
- this.type,
1673
- this._core.getState(),
1674
- _nullishCoalesce(_optionalChain([this, 'access', _44 => _44._beginEdit, 'optionalAccess', _45 => _45.bind, 'call', _46 => _46(this)]), () => ( METHOD_NOT_SUPPORTED)),
1675
- this.focus.bind(this),
1676
- this.onFocus.bind(this)
1677
- );
1678
- }
1679
1827
  setText(text) {
1680
1828
  const core = this._core.getState();
1681
1829
  if (!core) throw new Error("Composer is not available");
@@ -1715,19 +1863,38 @@ var ComposerRuntime = (_class2 = class {
1715
1863
  if (!core) throw new Error("Composer is not available");
1716
1864
  core.cancel();
1717
1865
  }
1718
- beginEdit() {
1719
- _optionalChain([this, 'access', _47 => _47._beginEdit, 'optionalCall', _48 => _48()]);
1720
- }
1721
- /**
1722
- * @deprecated Use `beginEdit()` instead. This will be removed in 0.6.0.
1723
- */
1724
- edit() {
1725
- this.beginEdit();
1726
- }
1727
1866
  subscribe(callback) {
1728
1867
  return this._core.subscribe(callback);
1729
1868
  }
1730
- __init5() {this._focusListeners = /* @__PURE__ */ new Set()}
1869
+ };
1870
+ var ThreadComposerRuntime = (_class5 = class extends ComposerRuntime {
1871
+ get type() {
1872
+ return "thread";
1873
+ }
1874
+
1875
+ constructor(core) {
1876
+ const stateBinding = new LazyMemoizeSubject({
1877
+ getState: () => getThreadComposerState(
1878
+ core.getState(),
1879
+ this.focus.bind(this),
1880
+ this.onFocus.bind(this)
1881
+ ),
1882
+ subscribe: (callback) => core.subscribe(callback)
1883
+ });
1884
+ super({
1885
+ getState: () => core.getState(),
1886
+ subscribe: (callback) => stateBinding.subscribe(callback)
1887
+ });_class5.prototype.__init9.call(this);;
1888
+ this._getState = stateBinding.getState.bind(stateBinding);
1889
+ }
1890
+ get attachments() {
1891
+ return _nullishCoalesce(_optionalChain([this, 'access', _65 => _65.getState, 'call', _66 => _66(), 'optionalAccess', _67 => _67.attachments]), () => ( EMPTY_ARRAY));
1892
+ }
1893
+ getState() {
1894
+ return this._getState();
1895
+ }
1896
+ // TODO replace with events
1897
+ __init9() {this._focusListeners = /* @__PURE__ */ new Set()}
1731
1898
  focus() {
1732
1899
  this._focusListeners.forEach((callback) => callback());
1733
1900
  }
@@ -1735,36 +1902,73 @@ var ComposerRuntime = (_class2 = class {
1735
1902
  this._focusListeners.add(callback);
1736
1903
  return () => this._focusListeners.delete(callback);
1737
1904
  }
1738
- }, _class2);
1739
-
1740
- // src/api/subscribable/BaseSubject.ts
1741
- var BaseSubject = (_class3 = class {constructor() { _class3.prototype.__init6.call(this); }
1742
- __init6() {this._subscriptions = /* @__PURE__ */ new Set()}
1905
+ unstable_getAttachmentByIndex(idx) {
1906
+ return new ThreadComposerAttachmentRuntime(
1907
+ new ShallowMemoizeSubject({
1908
+ getState: () => {
1909
+ const attachments = this.getState().attachments;
1910
+ const attachment = attachments[idx];
1911
+ if (!attachment) return SKIP_UPDATE;
1912
+ return {
1913
+ ...attachment,
1914
+ attachment,
1915
+ source: "thread-composer"
1916
+ };
1917
+ },
1918
+ subscribe: (callback) => this._core.subscribe(callback)
1919
+ }),
1920
+ this._core
1921
+ );
1922
+ }
1923
+ }, _class5);
1924
+ var EditComposerRuntime = class extends ComposerRuntime {
1925
+ constructor(core, _beginEdit) {
1926
+ const stateBinding = new LazyMemoizeSubject({
1927
+ getState: () => getEditComposerState(core.getState(), this._beginEdit),
1928
+ subscribe: (callback) => core.subscribe(callback)
1929
+ });
1930
+ super({
1931
+ getState: () => core.getState(),
1932
+ subscribe: (callback) => stateBinding.subscribe(callback)
1933
+ });
1934
+ this._beginEdit = _beginEdit;
1935
+ this._getState = stateBinding.getState.bind(stateBinding);
1936
+ }
1937
+ get type() {
1938
+ return "edit";
1939
+ }
1743
1940
 
1744
- get isConnected() {
1745
- return !!this._connection;
1941
+ getState() {
1942
+ return this._getState();
1746
1943
  }
1747
- notifySubscribers() {
1748
- for (const callback of this._subscriptions) callback();
1944
+ beginEdit() {
1945
+ this._beginEdit();
1749
1946
  }
1750
- _updateConnection() {
1751
- if (this._subscriptions.size > 0) {
1752
- if (this._connection) return;
1753
- this._connection = this._connect();
1754
- } else {
1755
- _optionalChain([this, 'access', _49 => _49._connection, 'optionalCall', _50 => _50()]);
1756
- this._connection = void 0;
1757
- }
1947
+ /**
1948
+ * @deprecated Use `beginEdit()` instead. This will be removed in 0.6.0.
1949
+ */
1950
+ edit() {
1951
+ this.beginEdit();
1758
1952
  }
1759
- subscribe(callback) {
1760
- this._subscriptions.add(callback);
1761
- this._updateConnection();
1762
- return () => {
1763
- this._subscriptions.delete(callback);
1764
- this._updateConnection();
1765
- };
1953
+ unstable_getAttachmentByIndex(idx) {
1954
+ return new EditComposerAttachmentRuntime(
1955
+ new ShallowMemoizeSubject({
1956
+ getState: () => {
1957
+ const attachments = this.getState().attachments;
1958
+ const attachment = attachments[idx];
1959
+ if (!attachment) return SKIP_UPDATE;
1960
+ return {
1961
+ ...attachment,
1962
+ attachment,
1963
+ source: "edit-composer"
1964
+ };
1965
+ },
1966
+ subscribe: (callback) => this._core.subscribe(callback)
1967
+ }),
1968
+ this._core
1969
+ );
1766
1970
  }
1767
- }, _class3);
1971
+ };
1768
1972
 
1769
1973
  // src/api/subscribable/NestedSubscriptionSubject.ts
1770
1974
  var NestedSubscriptionSubject = class extends BaseSubject {
@@ -1780,68 +1984,23 @@ var NestedSubscriptionSubject = class extends BaseSubject {
1780
1984
  this.notifySubscribers();
1781
1985
  };
1782
1986
  let lastState = this.binding.getState();
1783
- let innerUnsubscribe = _optionalChain([lastState, 'optionalAccess', _51 => _51.subscribe, 'call', _52 => _52(callback)]);
1987
+ let innerUnsubscribe = _optionalChain([lastState, 'optionalAccess', _68 => _68.subscribe, 'call', _69 => _69(callback)]);
1784
1988
  const onRuntimeUpdate = () => {
1785
1989
  const newState = this.binding.getState();
1786
1990
  if (newState === lastState) return;
1787
1991
  lastState = newState;
1788
- _optionalChain([innerUnsubscribe, 'optionalCall', _53 => _53()]);
1789
- innerUnsubscribe = _optionalChain([this, 'access', _54 => _54.binding, 'access', _55 => _55.getState, 'call', _56 => _56(), 'optionalAccess', _57 => _57.subscribe, 'call', _58 => _58(callback)]);
1992
+ _optionalChain([innerUnsubscribe, 'optionalCall', _70 => _70()]);
1993
+ innerUnsubscribe = _optionalChain([this, 'access', _71 => _71.binding, 'access', _72 => _72.getState, 'call', _73 => _73(), 'optionalAccess', _74 => _74.subscribe, 'call', _75 => _75(callback)]);
1790
1994
  callback();
1791
1995
  };
1792
1996
  const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
1793
1997
  return () => {
1794
- _optionalChain([outerUnsubscribe, 'optionalCall', _59 => _59()]);
1795
- _optionalChain([innerUnsubscribe, 'optionalCall', _60 => _60()]);
1998
+ _optionalChain([outerUnsubscribe, 'optionalCall', _76 => _76()]);
1999
+ _optionalChain([innerUnsubscribe, 'optionalCall', _77 => _77()]);
1796
2000
  };
1797
2001
  }
1798
2002
  };
1799
2003
 
1800
- // src/api/subscribable/shallowEqual.ts
1801
- function shallowEqual(objA, objB) {
1802
- if (objA === void 0 && objB === void 0) return true;
1803
- if (objA === void 0) return false;
1804
- if (objB === void 0) return false;
1805
- for (const key of Object.keys(objA)) {
1806
- const valueA = objA[key];
1807
- const valueB = objB[key];
1808
- if (!Object.is(valueA, valueB)) return false;
1809
- }
1810
- return true;
1811
- }
1812
-
1813
- // src/api/subscribable/ShallowMemoizeSubject.ts
1814
- var ShallowMemoizeSubject = (_class4 = class extends BaseSubject {
1815
- constructor(binding) {
1816
- super();_class4.prototype.__init7.call(this);;
1817
- this.binding = binding;
1818
- const state = binding.getState();
1819
- if (state === void 0)
1820
- throw new Error("Entry not available in the store");
1821
- this._previousState = state;
1822
- }
1823
-
1824
- __init7() {this.getState = () => {
1825
- if (!this.isConnected) this._syncState();
1826
- return this._previousState;
1827
- }}
1828
- _syncState() {
1829
- const state = this.binding.getState();
1830
- if (state === void 0) return false;
1831
- if (shallowEqual(state, this._previousState)) return false;
1832
- this._previousState = state;
1833
- return true;
1834
- }
1835
- _connect() {
1836
- const callback = () => {
1837
- if (this._syncState()) {
1838
- this.notifySubscribers();
1839
- }
1840
- };
1841
- return this.binding.subscribe(callback);
1842
- }
1843
- }, _class4);
1844
-
1845
2004
  // src/api/MessageRuntime.ts
1846
2005
  var COMPLETE_STATUS2 = {
1847
2006
  type: "complete"
@@ -1868,7 +2027,7 @@ var getContentPartState = (message, partIndex) => {
1868
2027
  if (message.content.length === 0 && partIndex === 0) {
1869
2028
  part = EMPTY_CONTENT;
1870
2029
  } else {
1871
- return void 0;
2030
+ return SKIP_UPDATE;
1872
2031
  }
1873
2032
  } else if (message.content.length === 1 && part.type === "text" && part.text.length === 0) {
1874
2033
  part = EMPTY_CONTENT;
@@ -1876,12 +2035,12 @@ var getContentPartState = (message, partIndex) => {
1876
2035
  const status = toContentPartStatus(message, partIndex, part);
1877
2036
  return Object.freeze({ ...part, part, status });
1878
2037
  };
1879
- var MessageRuntime = (_class5 = class {
1880
- constructor(_core, _threadBinding) {;_class5.prototype.__init8.call(this);
2038
+ var MessageRuntime = (_class6 = class {
2039
+ constructor(_core, _threadBinding) {;_class6.prototype.__init10.call(this);
1881
2040
  this._core = _core;
1882
2041
  this._threadBinding = _threadBinding;
1883
2042
  }
1884
- __init8() {this.composer = new ComposerRuntime(
2043
+ __init10() {this.composer = new EditComposerRuntime(
1885
2044
  new NestedSubscriptionSubject({
1886
2045
  getState: () => this._threadBinding.getState().getEditComposer(this._core.getState().id),
1887
2046
  subscribe: (callback) => this._threadBinding.subscribe(callback)
@@ -1958,7 +2117,24 @@ var MessageRuntime = (_class5 = class {
1958
2117
  this._threadBinding
1959
2118
  );
1960
2119
  }
1961
- }, _class5);
2120
+ unstable_getAttachmentByIndex(idx) {
2121
+ return new MessageAttachmentRuntime(
2122
+ new ShallowMemoizeSubject({
2123
+ getState: () => {
2124
+ const attachments = this.getState().attachments;
2125
+ const attachment = _optionalChain([attachments, 'optionalAccess', _78 => _78[idx]]);
2126
+ if (!attachment) return SKIP_UPDATE;
2127
+ return {
2128
+ ...attachment,
2129
+ attachment,
2130
+ source: "message"
2131
+ };
2132
+ },
2133
+ subscribe: (callback) => this._core.subscribe(callback)
2134
+ })
2135
+ );
2136
+ }
2137
+ }, _class6);
1962
2138
 
1963
2139
  // src/primitives/message/MessageContent.tsx
1964
2140
 
@@ -2035,7 +2211,7 @@ var MessageContentPartImpl = ({
2035
2211
  };
2036
2212
  var MessageContentPart = _react.memo.call(void 0,
2037
2213
  MessageContentPartImpl,
2038
- (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _61 => _61.components, 'optionalAccess', _62 => _62.Text]) === _optionalChain([next, 'access', _63 => _63.components, 'optionalAccess', _64 => _64.Text]) && _optionalChain([prev, 'access', _65 => _65.components, 'optionalAccess', _66 => _66.Image]) === _optionalChain([next, 'access', _67 => _67.components, 'optionalAccess', _68 => _68.Image]) && _optionalChain([prev, 'access', _69 => _69.components, 'optionalAccess', _70 => _70.UI]) === _optionalChain([next, 'access', _71 => _71.components, 'optionalAccess', _72 => _72.UI]) && _optionalChain([prev, 'access', _73 => _73.components, 'optionalAccess', _74 => _74.tools]) === _optionalChain([next, 'access', _75 => _75.components, 'optionalAccess', _76 => _76.tools])
2214
+ (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _79 => _79.components, 'optionalAccess', _80 => _80.Text]) === _optionalChain([next, 'access', _81 => _81.components, 'optionalAccess', _82 => _82.Text]) && _optionalChain([prev, 'access', _83 => _83.components, 'optionalAccess', _84 => _84.Image]) === _optionalChain([next, 'access', _85 => _85.components, 'optionalAccess', _86 => _86.Image]) && _optionalChain([prev, 'access', _87 => _87.components, 'optionalAccess', _88 => _88.UI]) === _optionalChain([next, 'access', _89 => _89.components, 'optionalAccess', _90 => _90.UI]) && _optionalChain([prev, 'access', _91 => _91.components, 'optionalAccess', _92 => _92.tools]) === _optionalChain([next, 'access', _93 => _93.components, 'optionalAccess', _94 => _94.tools])
2039
2215
  );
2040
2216
  var MessagePrimitiveContent = ({
2041
2217
  components
@@ -2061,86 +2237,93 @@ var AttachmentContext = _react.createContext.call(void 0,
2061
2237
  );
2062
2238
  function useAttachmentContext(options) {
2063
2239
  const context = _react.useContext.call(void 0, AttachmentContext);
2064
- if (!_optionalChain([options, 'optionalAccess', _77 => _77.optional]) && !context)
2240
+ if (!_optionalChain([options, 'optionalAccess', _95 => _95.optional]) && !context)
2065
2241
  throw new Error(
2066
2242
  "This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component."
2067
2243
  );
2068
2244
  return context;
2069
2245
  }
2070
- function useComposerAttachmentContext(options) {
2246
+ function useThreadComposerAttachmentContext(options) {
2247
+ const context = useAttachmentContext(options);
2248
+ if (!context) return null;
2249
+ if (context.source !== "thread-composer")
2250
+ throw new Error(
2251
+ "This component must be used within a thread's ComposerPrimitive.Attachments component."
2252
+ );
2253
+ return context;
2254
+ }
2255
+ function useEditComposerAttachmentContext(options) {
2071
2256
  const context = useAttachmentContext(options);
2072
2257
  if (!context) return null;
2073
- if (context.type !== "composer")
2258
+ if (context.source !== "edit-composer")
2074
2259
  throw new Error(
2075
- "This component must be used within a ComposerPrimitive.Attachments component."
2260
+ "This component must be used within a messages's ComposerPrimitive.Attachments component."
2076
2261
  );
2077
2262
  return context;
2078
2263
  }
2079
2264
  function useMessageAttachmentContext(options) {
2080
2265
  const context = useAttachmentContext(options);
2081
2266
  if (!context) return null;
2082
- if (context.type !== "message")
2267
+ if (context.source !== "message")
2083
2268
  throw new Error(
2084
2269
  "This component must be used within a MessagePrimitive.Attachments component."
2085
2270
  );
2086
2271
  return context;
2087
2272
  }
2088
- var { useAttachment, useAttachmentStore } = createContextStoreHook(
2273
+ function useAttachmentRuntime(options) {
2274
+ const attachmentRuntime = useAttachmentContext(options);
2275
+ if (!attachmentRuntime) return null;
2276
+ return attachmentRuntime.useAttachmentRuntime();
2277
+ }
2278
+ var { useAttachment } = createContextStoreHook(
2089
2279
  useAttachmentContext,
2090
2280
  "useAttachment"
2091
2281
  );
2092
- var {
2093
- useAttachment: useComposerAttachment,
2094
- useAttachmentStore: useComposerAttachmentStore
2095
- } = createContextStoreHook(useComposerAttachmentContext, "useAttachment");
2096
- var {
2097
- useAttachment: useMessageAttachment,
2098
- useAttachmentStore: useMessageAttachmentStore
2099
- } = createContextStoreHook(useMessageAttachmentContext, "useAttachment");
2282
+ var { useAttachment: useThreadComposerAttachment } = createContextStoreHook(useThreadComposerAttachmentContext, "useAttachment");
2283
+ var { useAttachment: useEditComposerAttachment } = createContextStoreHook(useEditComposerAttachmentContext, "useAttachment");
2284
+ var { useAttachment: useMessageAttachment } = createContextStoreHook(
2285
+ useMessageAttachmentContext,
2286
+ "useAttachment"
2287
+ );
2288
+
2289
+ // src/context/providers/AttachmentRuntimeProvider.tsx
2290
+
2100
2291
 
2101
- // src/context/providers/MessageAttachmentProvider.tsx
2102
2292
 
2103
2293
 
2104
2294
 
2105
- var getAttachment = (message, useAttachment2, partIndex) => {
2106
- if (message.role !== "user") return null;
2107
- const attachments = message.attachments;
2108
- const attachment = attachments[partIndex];
2109
- if (!attachment) return null;
2110
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _78 => _78.getState, 'call', _79 => _79()]);
2111
- if (currentState && currentState.attachment === attachment) return null;
2112
- return Object.freeze({ attachment });
2295
+
2296
+
2297
+ var useAttachmentRuntimeStore = (runtime) => {
2298
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime));
2299
+ _react.useEffect.call(void 0, () => {
2300
+ writableStore(store).setState(runtime, true);
2301
+ }, [runtime, store]);
2302
+ return store;
2113
2303
  };
2114
- var useMessageAttachmentContext2 = (partIndex) => {
2115
- const messageStore = useMessageStore();
2116
- const [context] = _react.useState.call(void 0,
2117
- () => {
2118
- const useAttachment2 = _zustand.create.call(void 0,
2119
- () => getAttachment(messageStore.getState(), void 0, partIndex)
2120
- );
2121
- return { type: "message", useAttachment: useAttachment2 };
2122
- }
2123
- );
2304
+ var useAttachmentStore = (runtime) => {
2305
+ const [store] = _react.useState.call(void 0, () => _zustand.create.call(void 0, () => runtime.getState()));
2124
2306
  _react.useEffect.call(void 0, () => {
2125
- const syncAttachment = (messageState) => {
2126
- const newState = getAttachment(
2127
- messageState,
2128
- context.useAttachment,
2129
- partIndex
2130
- );
2131
- if (!newState) return;
2132
- writableStore(context.useAttachment).setState(newState, true);
2133
- };
2134
- syncAttachment(messageStore.getState());
2135
- return messageStore.subscribe(syncAttachment);
2136
- }, [context, messageStore, partIndex]);
2137
- return context;
2307
+ const updateState = () => writableStore(store).setState(runtime.getState(), true);
2308
+ updateState();
2309
+ return runtime.subscribe(updateState);
2310
+ }, [runtime, store]);
2311
+ return store;
2138
2312
  };
2139
- var MessageAttachmentProvider = ({
2140
- attachmentIndex: partIndex,
2313
+ var AttachmentRuntimeProvider = ({
2314
+ runtime,
2141
2315
  children
2142
2316
  }) => {
2143
- const context = useMessageAttachmentContext2(partIndex);
2317
+ const useAttachmentRuntime2 = useAttachmentRuntimeStore(runtime);
2318
+ const useAttachment2 = useAttachmentStore(runtime);
2319
+ const source = useAttachment2((s) => s.source);
2320
+ const context = _react.useMemo.call(void 0, () => {
2321
+ return {
2322
+ source,
2323
+ useAttachmentRuntime: useAttachmentRuntime2,
2324
+ useAttachment: useAttachment2
2325
+ };
2326
+ }, [useAttachmentRuntime2, useAttachment2]);
2144
2327
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentContext.Provider, { value: context, children });
2145
2328
  };
2146
2329
 
@@ -2150,11 +2333,11 @@ var getComponent = (components, attachment) => {
2150
2333
  const type = attachment.type;
2151
2334
  switch (type) {
2152
2335
  case "image":
2153
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _80 => _80.Image]), () => ( _optionalChain([components, 'optionalAccess', _81 => _81.Attachment])));
2336
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _96 => _96.Image]), () => ( _optionalChain([components, 'optionalAccess', _97 => _97.Attachment])));
2154
2337
  case "document":
2155
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _82 => _82.Document]), () => ( _optionalChain([components, 'optionalAccess', _83 => _83.Attachment])));
2338
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _98 => _98.Document]), () => ( _optionalChain([components, 'optionalAccess', _99 => _99.Attachment])));
2156
2339
  case "file":
2157
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _84 => _84.File]), () => ( _optionalChain([components, 'optionalAccess', _85 => _85.Attachment])));
2340
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _100 => _100.File]), () => ( _optionalChain([components, 'optionalAccess', _101 => _101.Attachment])));
2158
2341
  default:
2159
2342
  const _exhaustiveCheck = type;
2160
2343
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
@@ -2168,11 +2351,16 @@ var AttachmentComponent = ({ components }) => {
2168
2351
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, {});
2169
2352
  };
2170
2353
  var MessageAttachmentImpl = ({ components, attachmentIndex }) => {
2171
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, MessageAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent, { components }) });
2354
+ const messageRuntime = useMessageRuntime();
2355
+ const runtime = _react.useMemo.call(void 0,
2356
+ () => messageRuntime.unstable_getAttachmentByIndex(attachmentIndex),
2357
+ [messageRuntime, attachmentIndex]
2358
+ );
2359
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentRuntimeProvider, { runtime, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent, { components }) });
2172
2360
  };
2173
2361
  var MessageAttachment = _react.memo.call(void 0,
2174
2362
  MessageAttachmentImpl,
2175
- (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _86 => _86.components, 'optionalAccess', _87 => _87.Image]) === _optionalChain([next, 'access', _88 => _88.components, 'optionalAccess', _89 => _89.Image]) && _optionalChain([prev, 'access', _90 => _90.components, 'optionalAccess', _91 => _91.Document]) === _optionalChain([next, 'access', _92 => _92.components, 'optionalAccess', _93 => _93.Document]) && _optionalChain([prev, 'access', _94 => _94.components, 'optionalAccess', _95 => _95.File]) === _optionalChain([next, 'access', _96 => _96.components, 'optionalAccess', _97 => _97.File]) && _optionalChain([prev, 'access', _98 => _98.components, 'optionalAccess', _99 => _99.Attachment]) === _optionalChain([next, 'access', _100 => _100.components, 'optionalAccess', _101 => _101.Attachment])
2363
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _102 => _102.components, 'optionalAccess', _103 => _103.Image]) === _optionalChain([next, 'access', _104 => _104.components, 'optionalAccess', _105 => _105.Image]) && _optionalChain([prev, 'access', _106 => _106.components, 'optionalAccess', _107 => _107.Document]) === _optionalChain([next, 'access', _108 => _108.components, 'optionalAccess', _109 => _109.Document]) && _optionalChain([prev, 'access', _110 => _110.components, 'optionalAccess', _111 => _111.File]) === _optionalChain([next, 'access', _112 => _112.components, 'optionalAccess', _113 => _113.File]) && _optionalChain([prev, 'access', _114 => _114.components, 'optionalAccess', _115 => _115.Attachment]) === _optionalChain([next, 'access', _116 => _116.components, 'optionalAccess', _117 => _117.Attachment])
2176
2364
  );
2177
2365
  var MessagePrimitiveAttachments = ({ components }) => {
2178
2366
  const attachmentsCount = useMessage(({ message }) => {
@@ -2283,7 +2471,7 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
2283
2471
  const { isRunning } = threadStore.getState();
2284
2472
  if (!isRunning) {
2285
2473
  e.preventDefault();
2286
- _optionalChain([textareaRef, 'access', _102 => _102.current, 'optionalAccess', _103 => _103.closest, 'call', _104 => _104("form"), 'optionalAccess', _105 => _105.requestSubmit, 'call', _106 => _106()]);
2474
+ _optionalChain([textareaRef, 'access', _118 => _118.current, 'optionalAccess', _119 => _119.closest, 'call', _120 => _120("form"), 'optionalAccess', _121 => _121.requestSubmit, 'call', _122 => _122()]);
2287
2475
  }
2288
2476
  }
2289
2477
  };
@@ -2344,79 +2532,41 @@ var ComposerPrimitiveAddAttachment = createActionButton(
2344
2532
  // src/primitives/composer/ComposerAttachments.tsx
2345
2533
 
2346
2534
 
2347
- // src/context/providers/ComposerAttachmentProvider.tsx
2348
-
2349
-
2350
-
2351
- var getAttachment2 = ({ attachments }, useAttachment2, partIndex) => {
2352
- const attachment = attachments[partIndex];
2353
- if (!attachment) return null;
2354
- const currentState = _optionalChain([useAttachment2, 'optionalAccess', _107 => _107.getState, 'call', _108 => _108()]);
2355
- if (currentState && currentState.attachment === attachment) return null;
2356
- return Object.freeze({ attachment });
2357
- };
2358
- var useComposerAttachmentContext2 = (partIndex) => {
2359
- const threadComposerStore = useThreadComposerStore();
2360
- const [context] = _react.useState.call(void 0,
2361
- () => {
2362
- const useAttachment2 = _zustand.create.call(void 0,
2363
- () => getAttachment2(threadComposerStore.getState(), void 0, partIndex)
2364
- );
2365
- return { type: "composer", useAttachment: useAttachment2 };
2366
- }
2367
- );
2368
- _react.useEffect.call(void 0, () => {
2369
- const syncAttachment = (composer) => {
2370
- const newState = getAttachment2(
2371
- composer,
2372
- context.useAttachment,
2373
- partIndex
2374
- );
2375
- if (!newState) return;
2376
- writableStore(context.useAttachment).setState(newState, true);
2377
- };
2378
- syncAttachment(threadComposerStore.getState());
2379
- return threadComposerStore.subscribe(syncAttachment);
2380
- }, [context, threadComposerStore, partIndex]);
2381
- return context;
2382
- };
2383
- var ComposerAttachmentProvider = ({ attachmentIndex: partIndex, children }) => {
2384
- const context = useComposerAttachmentContext2(partIndex);
2385
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentContext.Provider, { value: context, children });
2386
- };
2387
-
2388
- // src/primitives/composer/ComposerAttachments.tsx
2389
-
2390
2535
  var getComponent2 = (components, attachment) => {
2391
2536
  const type = attachment.type;
2392
2537
  switch (type) {
2393
2538
  case "image":
2394
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _109 => _109.Image]), () => ( _optionalChain([components, 'optionalAccess', _110 => _110.Attachment])));
2539
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _123 => _123.Image]), () => ( _optionalChain([components, 'optionalAccess', _124 => _124.Attachment])));
2395
2540
  case "document":
2396
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _111 => _111.Document]), () => ( _optionalChain([components, 'optionalAccess', _112 => _112.Attachment])));
2541
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _125 => _125.Document]), () => ( _optionalChain([components, 'optionalAccess', _126 => _126.Attachment])));
2397
2542
  case "file":
2398
- return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _113 => _113.File]), () => ( _optionalChain([components, 'optionalAccess', _114 => _114.Attachment])));
2543
+ return _nullishCoalesce(_optionalChain([components, 'optionalAccess', _127 => _127.File]), () => ( _optionalChain([components, 'optionalAccess', _128 => _128.Attachment])));
2399
2544
  default:
2400
2545
  const _exhaustiveCheck = type;
2401
2546
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
2402
2547
  }
2403
2548
  };
2404
2549
  var AttachmentComponent2 = ({ components }) => {
2405
- const Component = useComposerAttachment(
2406
- (a) => getComponent2(components, a.attachment)
2550
+ const Component = useThreadComposerAttachment(
2551
+ (a) => getComponent2(components, a)
2407
2552
  );
2408
2553
  if (!Component) return null;
2409
2554
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, {});
2410
2555
  };
2411
2556
  var ComposerAttachmentImpl = ({ components, attachmentIndex }) => {
2412
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ComposerAttachmentProvider, { attachmentIndex, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent2, { components }) });
2557
+ const composerRuntime = useComposerRuntime();
2558
+ const runtime = _react.useMemo.call(void 0,
2559
+ () => composerRuntime.unstable_getAttachmentByIndex(attachmentIndex),
2560
+ [composerRuntime, attachmentIndex]
2561
+ );
2562
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentRuntimeProvider, { runtime, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AttachmentComponent2, { components }) });
2413
2563
  };
2414
2564
  var ComposerAttachment = _react.memo.call(void 0,
2415
2565
  ComposerAttachmentImpl,
2416
- (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _115 => _115.components, 'optionalAccess', _116 => _116.Image]) === _optionalChain([next, 'access', _117 => _117.components, 'optionalAccess', _118 => _118.Image]) && _optionalChain([prev, 'access', _119 => _119.components, 'optionalAccess', _120 => _120.Document]) === _optionalChain([next, 'access', _121 => _121.components, 'optionalAccess', _122 => _122.Document]) && _optionalChain([prev, 'access', _123 => _123.components, 'optionalAccess', _124 => _124.File]) === _optionalChain([next, 'access', _125 => _125.components, 'optionalAccess', _126 => _126.File]) && _optionalChain([prev, 'access', _127 => _127.components, 'optionalAccess', _128 => _128.Attachment]) === _optionalChain([next, 'access', _129 => _129.components, 'optionalAccess', _130 => _130.Attachment])
2566
+ (prev, next) => prev.attachmentIndex === next.attachmentIndex && _optionalChain([prev, 'access', _129 => _129.components, 'optionalAccess', _130 => _130.Image]) === _optionalChain([next, 'access', _131 => _131.components, 'optionalAccess', _132 => _132.Image]) && _optionalChain([prev, 'access', _133 => _133.components, 'optionalAccess', _134 => _134.Document]) === _optionalChain([next, 'access', _135 => _135.components, 'optionalAccess', _136 => _136.Document]) && _optionalChain([prev, 'access', _137 => _137.components, 'optionalAccess', _138 => _138.File]) === _optionalChain([next, 'access', _139 => _139.components, 'optionalAccess', _140 => _140.File]) && _optionalChain([prev, 'access', _141 => _141.components, 'optionalAccess', _142 => _142.Attachment]) === _optionalChain([next, 'access', _143 => _143.components, 'optionalAccess', _144 => _144.Attachment])
2417
2567
  );
2418
2568
  var ComposerPrimitiveAttachments = ({ components }) => {
2419
- const attachmentsCount = useThreadComposer((s) => s.attachments.length);
2569
+ const attachmentsCount = useComposer((s) => s.attachments.length);
2420
2570
  return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2421
2571
  ComposerAttachment,
2422
2572
  {
@@ -2633,7 +2783,7 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
2633
2783
  },
2634
2784
  isSpeaking: false,
2635
2785
  stopSpeaking: () => {
2636
- _optionalChain([utterance, 'optionalAccess', _131 => _131.cancel, 'call', _132 => _132()]);
2786
+ _optionalChain([utterance, 'optionalAccess', _145 => _145.cancel, 'call', _146 => _146()]);
2637
2787
  },
2638
2788
  addUtterance: (utt) => {
2639
2789
  utterance = utt;
@@ -2780,7 +2930,7 @@ var subscribeToMainThread = (runtime, callback) => {
2780
2930
  let first = true;
2781
2931
  let cleanup;
2782
2932
  const inner = () => {
2783
- _optionalChain([cleanup, 'optionalCall', _133 => _133()]);
2933
+ _optionalChain([cleanup, 'optionalCall', _147 => _147()]);
2784
2934
  cleanup = runtime.thread.subscribe(callback);
2785
2935
  if (!first) {
2786
2936
  callback();
@@ -2791,7 +2941,7 @@ var subscribeToMainThread = (runtime, callback) => {
2791
2941
  inner();
2792
2942
  return () => {
2793
2943
  unsubscribe();
2794
- _optionalChain([cleanup, 'optionalCall', _134 => _134()]);
2944
+ _optionalChain([cleanup, 'optionalCall', _148 => _148()]);
2795
2945
  };
2796
2946
  };
2797
2947
 
@@ -2799,8 +2949,8 @@ var subscribeToMainThread = (runtime, callback) => {
2799
2949
 
2800
2950
 
2801
2951
  // src/runtimes/core/BaseAssistantRuntimeCore.tsx
2802
- var BaseAssistantRuntimeCore = (_class6 = class {
2803
- constructor(_thread) {;_class6.prototype.__init9.call(this);_class6.prototype.__init10.call(this);
2952
+ var BaseAssistantRuntimeCore = (_class7 = class {
2953
+ constructor(_thread) {;_class7.prototype.__init11.call(this);_class7.prototype.__init12.call(this);
2804
2954
  this._thread = _thread;
2805
2955
  this._thread = _thread;
2806
2956
  }
@@ -2811,15 +2961,15 @@ var BaseAssistantRuntimeCore = (_class6 = class {
2811
2961
  this._thread = thread;
2812
2962
  this.subscriptionHandler();
2813
2963
  }
2814
- __init9() {this._subscriptions = /* @__PURE__ */ new Set()}
2964
+ __init11() {this._subscriptions = /* @__PURE__ */ new Set()}
2815
2965
  subscribe(callback) {
2816
2966
  this._subscriptions.add(callback);
2817
2967
  return () => this._subscriptions.delete(callback);
2818
2968
  }
2819
- __init10() {this.subscriptionHandler = () => {
2969
+ __init12() {this.subscriptionHandler = () => {
2820
2970
  for (const callback of this._subscriptions) callback();
2821
2971
  }}
2822
- }, _class6);
2972
+ }, _class7);
2823
2973
 
2824
2974
  // src/internal.ts
2825
2975
  var internal_exports = {};
@@ -2838,10 +2988,11 @@ _chunkPZ5AY32Cjs.__export.call(void 0, internal_exports, {
2838
2988
  });
2839
2989
 
2840
2990
  // src/runtimes/composer/BaseComposerRuntimeCore.tsx
2841
- var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototype.__init11.call(this);_class7.prototype.__init12.call(this);_class7.prototype.__init13.call(this);_class7.prototype.__init14.call(this);_class7.prototype.__init15.call(this); }
2842
- __init11() {this.isEditing = true}
2843
- __init12() {this.attachmentAccept = "*"}
2844
- __init13() {this._attachments = []}
2991
+ var isAttachmentComplete = (a) => a.status.type === "complete";
2992
+ var BaseComposerRuntimeCore = (_class8 = class {constructor() { _class8.prototype.__init13.call(this);_class8.prototype.__init14.call(this);_class8.prototype.__init15.call(this);_class8.prototype.__init16.call(this);_class8.prototype.__init17.call(this); }
2993
+ __init13() {this.isEditing = true}
2994
+ __init14() {this.attachmentAccept = "*"}
2995
+ __init15() {this._attachments = []}
2845
2996
  set attachments(value) {
2846
2997
  this._attachments = value;
2847
2998
  this.notifySubscribers();
@@ -2852,7 +3003,7 @@ var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototyp
2852
3003
  get isEmpty() {
2853
3004
  return !this.text.trim() && !this.attachments.length;
2854
3005
  }
2855
- __init14() {this._text = ""}
3006
+ __init16() {this._text = ""}
2856
3007
  get text() {
2857
3008
  return this._text;
2858
3009
  }
@@ -2867,9 +3018,14 @@ var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototyp
2867
3018
  }
2868
3019
  async send() {
2869
3020
  const attachments = this._attachmentAdapter ? await Promise.all(
2870
- this.attachments.map(
2871
- async (a) => await this._attachmentAdapter.send(a)
2872
- )
3021
+ this.attachments.map(async (a) => {
3022
+ if (isAttachmentComplete(a)) return a;
3023
+ const result = await this._attachmentAdapter.send(a);
3024
+ if (_optionalChain([result, 'access', _149 => _149.status, 'optionalAccess', _150 => _150.type]) !== "complete") {
3025
+ result.status = { type: "complete" };
3026
+ }
3027
+ return result;
3028
+ })
2873
3029
  ) : [];
2874
3030
  const message = {
2875
3031
  role: "user",
@@ -2882,7 +3038,7 @@ var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototyp
2882
3038
 
2883
3039
  setAttachmentAdapter(adapter) {
2884
3040
  this._attachmentAdapter = adapter;
2885
- const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _135 => _135.accept]), () => ( "*"));
3041
+ const accept = _nullishCoalesce(_optionalChain([adapter, 'optionalAccess', _151 => _151.accept]), () => ( "*"));
2886
3042
  if (this.attachmentAccept !== accept) {
2887
3043
  this.attachmentAccept = accept;
2888
3044
  this.notifySubscribers();
@@ -2892,6 +3048,9 @@ var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototyp
2892
3048
  if (!this._attachmentAdapter)
2893
3049
  throw new Error("Attachments are not supported");
2894
3050
  const attachment = await this._attachmentAdapter.add({ file });
3051
+ if (attachment.status === void 0) {
3052
+ attachment.status = { type: "requires-action", reason: "composer-send" };
3053
+ }
2895
3054
  this._attachments = [...this._attachments, attachment];
2896
3055
  this.notifySubscribers();
2897
3056
  }
@@ -2905,7 +3064,7 @@ var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototyp
2905
3064
  this._attachments = this._attachments.toSpliced(index, 1);
2906
3065
  this.notifySubscribers();
2907
3066
  }
2908
- __init15() {this._subscriptions = /* @__PURE__ */ new Set()}
3067
+ __init17() {this._subscriptions = /* @__PURE__ */ new Set()}
2909
3068
  notifySubscribers() {
2910
3069
  for (const callback of this._subscriptions) callback();
2911
3070
  }
@@ -2913,19 +3072,22 @@ var BaseComposerRuntimeCore = (_class7 = class {constructor() { _class7.prototyp
2913
3072
  this._subscriptions.add(callback);
2914
3073
  return () => this._subscriptions.delete(callback);
2915
3074
  }
2916
- }, _class7);
3075
+ }, _class8);
2917
3076
 
2918
3077
  // src/runtimes/composer/DefaultThreadComposerRuntimeCore.tsx
2919
- var DefaultThreadComposerRuntimeCore = (_class8 = class extends BaseComposerRuntimeCore {
3078
+ var DefaultThreadComposerRuntimeCore = (_class9 = class extends BaseComposerRuntimeCore {
2920
3079
  constructor(runtime) {
2921
- super();_class8.prototype.__init16.call(this);;
3080
+ super();_class9.prototype.__init18.call(this);;
2922
3081
  this.runtime = runtime;
2923
3082
  this.connect();
2924
3083
  }
2925
- __init16() {this._canCancel = false}
3084
+ __init18() {this._canCancel = false}
2926
3085
  get canCancel() {
2927
3086
  return this._canCancel;
2928
3087
  }
3088
+ get attachments() {
3089
+ return super.attachments;
3090
+ }
2929
3091
  connect() {
2930
3092
  return this.runtime.subscribe(() => {
2931
3093
  if (this.canCancel !== this.runtime.capabilities.cancel) {
@@ -2937,17 +3099,17 @@ var DefaultThreadComposerRuntimeCore = (_class8 = class extends BaseComposerRunt
2937
3099
  async handleSend(message) {
2938
3100
  this.runtime.append({
2939
3101
  ...message,
2940
- parentId: _nullishCoalesce(_optionalChain([this, 'access', _136 => _136.runtime, 'access', _137 => _137.messages, 'access', _138 => _138.at, 'call', _139 => _139(-1), 'optionalAccess', _140 => _140.id]), () => ( null))
3102
+ parentId: _nullishCoalesce(_optionalChain([this, 'access', _152 => _152.runtime, 'access', _153 => _153.messages, 'access', _154 => _154.at, 'call', _155 => _155(-1), 'optionalAccess', _156 => _156.id]), () => ( null))
2941
3103
  });
2942
3104
  }
2943
3105
  async cancel() {
2944
3106
  this.runtime.cancelRun();
2945
3107
  }
2946
- }, _class8);
3108
+ }, _class9);
2947
3109
 
2948
3110
  // src/utils/ProxyConfigProvider.ts
2949
- var ProxyConfigProvider = (_class9 = class {constructor() { _class9.prototype.__init17.call(this); }
2950
- __init17() {this._providers = /* @__PURE__ */ new Set()}
3111
+ var ProxyConfigProvider = (_class10 = class {constructor() { _class10.prototype.__init19.call(this); }
3112
+ __init19() {this._providers = /* @__PURE__ */ new Set()}
2951
3113
  getModelConfig() {
2952
3114
  return _chunk5KIEXJRKjs.mergeModelConfigs.call(void 0, this._providers);
2953
3115
  }
@@ -2957,7 +3119,7 @@ var ProxyConfigProvider = (_class9 = class {constructor() { _class9.prototype.__
2957
3119
  this._providers.delete(provider);
2958
3120
  };
2959
3121
  }
2960
- }, _class9);
3122
+ }, _class10);
2961
3123
 
2962
3124
  // src/utils/idUtils.tsx
2963
3125
  var _nonsecure = require('nanoid/non-secure');
@@ -3024,11 +3186,11 @@ var findHead = (message) => {
3024
3186
  if ("current" in message) return message;
3025
3187
  return null;
3026
3188
  };
3027
- var MessageRepository = (_class10 = class {constructor() { _class10.prototype.__init18.call(this);_class10.prototype.__init19.call(this);_class10.prototype.__init20.call(this); }
3028
- __init18() {this.messages = /* @__PURE__ */ new Map()}
3189
+ var MessageRepository = (_class11 = class {constructor() { _class11.prototype.__init20.call(this);_class11.prototype.__init21.call(this);_class11.prototype.__init22.call(this); }
3190
+ __init20() {this.messages = /* @__PURE__ */ new Map()}
3029
3191
  // message_id -> item
3030
- __init19() {this.head = null}
3031
- __init20() {this.root = {
3192
+ __init21() {this.head = null}
3193
+ __init22() {this.root = {
3032
3194
  children: [],
3033
3195
  next: null
3034
3196
  }}
@@ -3070,7 +3232,7 @@ var MessageRepository = (_class10 = class {constructor() { _class10.prototype.__
3070
3232
  }
3071
3233
  }
3072
3234
  getMessages() {
3073
- const messages2 = new Array(_nullishCoalesce(_optionalChain([this, 'access', _141 => _141.head, 'optionalAccess', _142 => _142.level]), () => ( 0)));
3235
+ const messages2 = new Array(_nullishCoalesce(_optionalChain([this, 'access', _157 => _157.head, 'optionalAccess', _158 => _158.level]), () => ( 0)));
3074
3236
  for (let current = this.head; current; current = current.prev) {
3075
3237
  messages2[current.level] = current.current;
3076
3238
  }
@@ -3108,7 +3270,7 @@ var MessageRepository = (_class10 = class {constructor() { _class10.prototype.__
3108
3270
  "MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui."
3109
3271
  );
3110
3272
  return {
3111
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _143 => _143.prev, 'optionalAccess', _144 => _144.current, 'access', _145 => _145.id]), () => ( null)),
3273
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _159 => _159.prev, 'optionalAccess', _160 => _160.current, 'access', _161 => _161.id]), () => ( null)),
3112
3274
  message: message.current
3113
3275
  };
3114
3276
  }
@@ -3192,11 +3354,11 @@ var MessageRepository = (_class10 = class {constructor() { _class10.prototype.__
3192
3354
  for (const [, message] of this.messages) {
3193
3355
  exportItems.push({
3194
3356
  message: message.current,
3195
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _146 => _146.prev, 'optionalAccess', _147 => _147.current, 'access', _148 => _148.id]), () => ( null))
3357
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _162 => _162.prev, 'optionalAccess', _163 => _163.current, 'access', _164 => _164.id]), () => ( null))
3196
3358
  });
3197
3359
  }
3198
3360
  return {
3199
- headId: _nullishCoalesce(_optionalChain([this, 'access', _149 => _149.head, 'optionalAccess', _150 => _150.current, 'access', _151 => _151.id]), () => ( null)),
3361
+ headId: _nullishCoalesce(_optionalChain([this, 'access', _165 => _165.head, 'optionalAccess', _166 => _166.current, 'access', _167 => _167.id]), () => ( null)),
3200
3362
  messages: exportItems
3201
3363
  };
3202
3364
  }
@@ -3204,9 +3366,9 @@ var MessageRepository = (_class10 = class {constructor() { _class10.prototype.__
3204
3366
  for (const { message, parentId } of messages2) {
3205
3367
  this.addOrUpdateMessage(parentId, message);
3206
3368
  }
3207
- this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages2, 'access', _152 => _152.at, 'call', _153 => _153(-1), 'optionalAccess', _154 => _154.message, 'access', _155 => _155.id]))), () => ( null)));
3369
+ this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages2, 'access', _168 => _168.at, 'call', _169 => _169(-1), 'optionalAccess', _170 => _170.message, 'access', _171 => _171.id]))), () => ( null)));
3208
3370
  }
3209
- }, _class10);
3371
+ }, _class11);
3210
3372
 
3211
3373
  // src/ui/base/tooltip-icon-button.tsx
3212
3374
 
@@ -3334,42 +3496,11 @@ var AssistantRuntime = class {
3334
3496
  }
3335
3497
  };
3336
3498
 
3337
- // src/api/subscribable/LazyMemoizeSubject.ts
3338
- var LazyMemoizeSubject = (_class11 = class extends BaseSubject {
3339
- constructor(binding) {
3340
- super();_class11.prototype.__init21.call(this);_class11.prototype.__init22.call(this);;
3341
- this.binding = binding;
3342
- const state = binding.getState();
3343
- if (state === void 0)
3344
- throw new Error("Entry not available in the store");
3345
- this._previousState = state;
3346
- }
3347
- __init21() {this._previousStateDirty = true}
3348
-
3349
- __init22() {this.getState = () => {
3350
- if (!this.isConnected || this._previousStateDirty) {
3351
- const newState = this.binding.getState();
3352
- if (newState !== void 0) {
3353
- this._previousState = newState;
3354
- }
3355
- this._previousStateDirty = false;
3356
- }
3357
- return this._previousState;
3358
- }}
3359
- _connect() {
3360
- const callback = () => {
3361
- this._previousStateDirty = true;
3362
- this.notifySubscribers();
3363
- };
3364
- return this.binding.subscribe(callback);
3365
- }
3366
- }, _class11);
3367
-
3368
3499
  // src/api/ThreadRuntime.ts
3369
3500
  var toAppendMessage = (messages2, message) => {
3370
3501
  if (typeof message === "string") {
3371
3502
  return {
3372
- parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _156 => _156.at, 'call', _157 => _157(-1), 'optionalAccess', _158 => _158.id]), () => ( null)),
3503
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _172 => _172.at, 'call', _173 => _173(-1), 'optionalAccess', _174 => _174.id]), () => ( null)),
3373
3504
  role: "user",
3374
3505
  content: [{ type: "text", text: message }],
3375
3506
  attachments: []
@@ -3379,7 +3510,7 @@ var toAppendMessage = (messages2, message) => {
3379
3510
  return message;
3380
3511
  }
3381
3512
  return {
3382
- parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([messages2, 'access', _159 => _159.at, 'call', _160 => _160(-1), 'optionalAccess', _161 => _161.id]))), () => ( null)),
3513
+ parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([messages2, 'access', _175 => _175.at, 'call', _176 => _176(-1), 'optionalAccess', _177 => _177.id]))), () => ( null)),
3383
3514
  role: _nullishCoalesce(message.role, () => ( "user")),
3384
3515
  content: message.content,
3385
3516
  attachments: _nullishCoalesce(message.attachments, () => ( []))
@@ -3391,9 +3522,8 @@ var getThreadState = (runtime) => {
3391
3522
  threadId: runtime.threadId,
3392
3523
  capabilities: runtime.capabilities,
3393
3524
  isDisabled: runtime.isDisabled,
3394
- isRunning: _optionalChain([lastMessage, 'optionalAccess', _162 => _162.role]) !== "assistant" ? false : lastMessage.status.type === "running",
3395
- messages: runtime.messages,
3396
- unstable_synchronizer: runtime.unstable_synchronizer
3525
+ isRunning: _optionalChain([lastMessage, 'optionalAccess', _178 => _178.role]) !== "assistant" ? false : lastMessage.status.type === "running",
3526
+ messages: runtime.messages
3397
3527
  });
3398
3528
  };
3399
3529
  var ThreadRuntime = (_class12 = class {
@@ -3443,7 +3573,7 @@ var ThreadRuntime = (_class12 = class {
3443
3573
  subscribe: (callback) => threadBinding.subscribe(callback)
3444
3574
  };
3445
3575
  }
3446
- __init23() {this.composer = new ComposerRuntime(
3576
+ __init23() {this.composer = new ThreadComposerRuntime(
3447
3577
  new NestedSubscriptionSubject({
3448
3578
  getState: () => this._threadBinding.getState().composer,
3449
3579
  subscribe: (callback) => this._threadBinding.subscribe(callback)
@@ -3500,13 +3630,13 @@ var ThreadRuntime = (_class12 = class {
3500
3630
  return this._threadBinding.getState().submitFeedback(options);
3501
3631
  }
3502
3632
  /**
3503
- * @deprecated This is a temporary API. This will be removed in 0.6.0.
3633
+ * @deprecated Use `getMesssageById(id).unstable_getMessageByIndex(idx).composer` instead. This will be removed in 0.6.0.
3504
3634
  */
3505
3635
  getEditComposer(messageId) {
3506
3636
  return this._threadBinding.getState().getEditComposer(messageId);
3507
3637
  }
3508
3638
  /**
3509
- * @deprecated This is a temporary API. This will be removed in 0.6.0.
3639
+ * @deprecated Use `getMesssageById(id).unstable_getMessageByIndex(idx).composer.beginEdit()` instead. This will be removed in 0.6.0.
3510
3640
  */
3511
3641
  beginEdit(messageId) {
3512
3642
  return this._threadBinding.getState().beginEdit(messageId);
@@ -3522,15 +3652,15 @@ var ThreadRuntime = (_class12 = class {
3522
3652
  return new MessageRuntime(
3523
3653
  new ShallowMemoizeSubject({
3524
3654
  getState: () => {
3525
- const messages2 = this.messages;
3655
+ const messages2 = this.getState().messages;
3526
3656
  const message = messages2[idx];
3527
- if (!message) return void 0;
3657
+ if (!message) return SKIP_UPDATE;
3528
3658
  const branches = this._threadBinding.getState().getBranches(message.id);
3529
3659
  return {
3530
3660
  ...message,
3531
3661
  message,
3532
3662
  isLast: idx === messages2.length - 1,
3533
- parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _163 => _163[idx - 1], 'optionalAccess', _164 => _164.id]), () => ( null)),
3663
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _179 => _179[idx - 1], 'optionalAccess', _180 => _180.id]), () => ( null)),
3534
3664
  branches,
3535
3665
  branchNumber: branches.indexOf(message.id) + 1,
3536
3666
  branchCount: branches.length
@@ -3582,6 +3712,9 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3582
3712
  }
3583
3713
  throw new Error("Only images with URL data are supported");
3584
3714
  }
3715
+ case "file": {
3716
+ throw new Error("File content parts are not supported");
3717
+ }
3585
3718
  default: {
3586
3719
  const unhandledType = type;
3587
3720
  throw new Error(`Unknown content part type: ${unhandledType}`);
@@ -3606,7 +3739,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3606
3739
  });
3607
3740
  if (mergeRoundtrips) {
3608
3741
  const previousMessage = messages2[messages2.length - 1];
3609
- if (_optionalChain([previousMessage, 'optionalAccess', _165 => _165.role]) === "assistant") {
3742
+ if (_optionalChain([previousMessage, 'optionalAccess', _181 => _181.role]) === "assistant") {
3610
3743
  previousMessage.content.push(...newContent);
3611
3744
  break;
3612
3745
  }
@@ -3619,7 +3752,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
3619
3752
  }
3620
3753
  case "tool": {
3621
3754
  const previousMessage = messages2[messages2.length - 1];
3622
- if (_optionalChain([previousMessage, 'optionalAccess', _166 => _166.role]) !== "assistant")
3755
+ if (_optionalChain([previousMessage, 'optionalAccess', _182 => _182.role]) !== "assistant")
3623
3756
  throw new Error(
3624
3757
  "A tool message must be preceded by an assistant message."
3625
3758
  );
@@ -3848,7 +3981,7 @@ var useEdgeRuntime = ({
3848
3981
  };
3849
3982
 
3850
3983
  // src/runtimes/local/shouldContinue.tsx
3851
- var shouldContinue = (result) => _optionalChain([result, 'access', _167 => _167.status, 'optionalAccess', _168 => _168.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
3984
+ var shouldContinue = (result) => _optionalChain([result, 'access', _183 => _183.status, 'optionalAccess', _184 => _184.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
3852
3985
 
3853
3986
  // src/runtimes/composer/DefaultEditComposerRuntimeCore.tsx
3854
3987
  var DefaultEditComposerRuntimeCore = class extends BaseComposerRuntimeCore {
@@ -3932,18 +4065,18 @@ var LocalThreadRuntimeCore = (_class13 = class {
3932
4065
  set options({ initialMessages, ...options }) {
3933
4066
  this._options = options;
3934
4067
  let hasUpdates = false;
3935
- const canSpeak = _optionalChain([options, 'access', _169 => _169.adapters, 'optionalAccess', _170 => _170.speech]) !== void 0;
4068
+ const canSpeak = _optionalChain([options, 'access', _185 => _185.adapters, 'optionalAccess', _186 => _186.speech]) !== void 0;
3936
4069
  if (this.capabilities.speak !== canSpeak) {
3937
4070
  this.capabilities.speak = canSpeak;
3938
4071
  hasUpdates = true;
3939
4072
  }
3940
- this.composer.setAttachmentAdapter(_optionalChain([options, 'access', _171 => _171.adapters, 'optionalAccess', _172 => _172.attachments]));
3941
- const canAttach = _optionalChain([options, 'access', _173 => _173.adapters, 'optionalAccess', _174 => _174.attachments]) !== void 0;
4073
+ this.composer.setAttachmentAdapter(_optionalChain([options, 'access', _187 => _187.adapters, 'optionalAccess', _188 => _188.attachments]));
4074
+ const canAttach = _optionalChain([options, 'access', _189 => _189.adapters, 'optionalAccess', _190 => _190.attachments]) !== void 0;
3942
4075
  if (this.capabilities.attachments !== canAttach) {
3943
4076
  this.capabilities.attachments = canAttach;
3944
4077
  hasUpdates = true;
3945
4078
  }
3946
- const canFeedback = _optionalChain([options, 'access', _175 => _175.adapters, 'optionalAccess', _176 => _176.feedback]) !== void 0;
4079
+ const canFeedback = _optionalChain([options, 'access', _191 => _191.adapters, 'optionalAccess', _192 => _192.feedback]) !== void 0;
3947
4080
  if (this.capabilities.feedback !== canFeedback) {
3948
4081
  this.capabilities.feedback = canFeedback;
3949
4082
  hasUpdates = true;
@@ -4002,18 +4135,18 @@ var LocalThreadRuntimeCore = (_class13 = class {
4002
4135
  }
4003
4136
  async performRoundtrip(parentId, message) {
4004
4137
  const messages2 = this.repository.getMessages();
4005
- _optionalChain([this, 'access', _177 => _177.abortController, 'optionalAccess', _178 => _178.abort, 'call', _179 => _179()]);
4138
+ _optionalChain([this, 'access', _193 => _193.abortController, 'optionalAccess', _194 => _194.abort, 'call', _195 => _195()]);
4006
4139
  this.abortController = new AbortController();
4007
4140
  const initialContent = message.content;
4008
- const initialRoundtrips = _optionalChain([message, 'access', _180 => _180.metadata, 'optionalAccess', _181 => _181.roundtrips]);
4009
- const initalCustom = _optionalChain([message, 'access', _182 => _182.metadata, 'optionalAccess', _183 => _183.custom]);
4141
+ const initialRoundtrips = _optionalChain([message, 'access', _196 => _196.metadata, 'optionalAccess', _197 => _197.roundtrips]);
4142
+ const initalCustom = _optionalChain([message, 'access', _198 => _198.metadata, 'optionalAccess', _199 => _199.custom]);
4010
4143
  const updateMessage = (m) => {
4011
4144
  message = {
4012
4145
  ...message,
4013
4146
  ...m.content ? { content: [...initialContent, ..._nullishCoalesce(m.content, () => ( []))] } : void 0,
4014
4147
  status: _nullishCoalesce(m.status, () => ( message.status)),
4015
4148
  // TODO deprecated, remove in v0.6
4016
- ..._optionalChain([m, 'access', _184 => _184.metadata, 'optionalAccess', _185 => _185.roundtrips]) ? {
4149
+ ..._optionalChain([m, 'access', _200 => _200.metadata, 'optionalAccess', _201 => _201.roundtrips]) ? {
4017
4150
  roundtrips: [
4018
4151
  ..._nullishCoalesce(initialRoundtrips, () => ( [])),
4019
4152
  ...m.metadata.roundtrips
@@ -4028,7 +4161,7 @@ var LocalThreadRuntimeCore = (_class13 = class {
4028
4161
  ...m.metadata.roundtrips
4029
4162
  ]
4030
4163
  } : void 0,
4031
- ..._optionalChain([m, 'access', _186 => _186.metadata, 'optionalAccess', _187 => _187.custom]) ? {
4164
+ ..._optionalChain([m, 'access', _202 => _202.metadata, 'optionalAccess', _203 => _203.custom]) ? {
4032
4165
  custom: { ..._nullishCoalesce(initalCustom, () => ( {})), ...m.metadata.custom }
4033
4166
  } : void 0
4034
4167
  }
@@ -4038,7 +4171,7 @@ var LocalThreadRuntimeCore = (_class13 = class {
4038
4171
  this.notifySubscribers();
4039
4172
  };
4040
4173
  const maxToolRoundtrips = _nullishCoalesce(this.options.maxToolRoundtrips, () => ( 1));
4041
- const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _188 => _188.metadata, 'optionalAccess', _189 => _189.roundtrips, 'optionalAccess', _190 => _190.length]), () => ( 0));
4174
+ const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _204 => _204.metadata, 'optionalAccess', _205 => _205.roundtrips, 'optionalAccess', _206 => _206.length]), () => ( 0));
4042
4175
  if (toolRoundtrips > maxToolRoundtrips) {
4043
4176
  updateMessage({
4044
4177
  status: {
@@ -4137,7 +4270,7 @@ var LocalThreadRuntimeCore = (_class13 = class {
4137
4270
  // TODO lift utterance state to thread runtime
4138
4271
 
4139
4272
  speak(messageId) {
4140
- const adapter = _optionalChain([this, 'access', _191 => _191.options, 'access', _192 => _192.adapters, 'optionalAccess', _193 => _193.speech]);
4273
+ const adapter = _optionalChain([this, 'access', _207 => _207.options, 'access', _208 => _208.adapters, 'optionalAccess', _209 => _209.speech]);
4141
4274
  if (!adapter) throw new Error("Speech adapter not configured");
4142
4275
  const { message } = this.repository.getMessage(messageId);
4143
4276
  if (this._utterance) {
@@ -4154,7 +4287,7 @@ var LocalThreadRuntimeCore = (_class13 = class {
4154
4287
  return this._utterance;
4155
4288
  }
4156
4289
  submitFeedback({ messageId, type }) {
4157
- const adapter = _optionalChain([this, 'access', _194 => _194.options, 'access', _195 => _195.adapters, 'optionalAccess', _196 => _196.feedback]);
4290
+ const adapter = _optionalChain([this, 'access', _210 => _210.options, 'access', _211 => _211.adapters, 'optionalAccess', _212 => _212.feedback]);
4158
4291
  if (!adapter) throw new Error("Feedback adapter not configured");
4159
4292
  const { message } = this.repository.getMessage(messageId);
4160
4293
  adapter.submit({ message, type });
@@ -4201,7 +4334,7 @@ var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
4201
4334
  const messages2 = fromCoreMessages(initialMessages);
4202
4335
  this.thread.import({
4203
4336
  messages: messages2.map((m, idx) => ({
4204
- parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _197 => _197[idx - 1], 'optionalAccess', _198 => _198.id]), () => ( null)),
4337
+ parentId: _nullishCoalesce(_optionalChain([messages2, 'access', _213 => _213[idx - 1], 'optionalAccess', _214 => _214.id]), () => ( null)),
4205
4338
  message: m
4206
4339
  }))
4207
4340
  });
@@ -4334,7 +4467,7 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
4334
4467
 
4335
4468
  // src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx
4336
4469
  var hasUpcomingMessage = (isRunning, messages2) => {
4337
- return isRunning && _optionalChain([messages2, 'access', _199 => _199[messages2.length - 1], 'optionalAccess', _200 => _200.role]) !== "assistant";
4470
+ return isRunning && _optionalChain([messages2, 'access', _215 => _215[messages2.length - 1], 'optionalAccess', _216 => _216.role]) !== "assistant";
4338
4471
  };
4339
4472
  var ExternalStoreThreadRuntimeCore = (_class15 = class {
4340
4473
  constructor(configProvider, store) {;_class15.prototype.__init32.call(this);_class15.prototype.__init33.call(this);_class15.prototype.__init34.call(this);_class15.prototype.__init35.call(this);_class15.prototype.__init36.call(this);_class15.prototype.__init37.call(this);_class15.prototype.__init38.call(this);_class15.prototype.__init39.call(this);
@@ -4396,12 +4529,12 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4396
4529
  reload: this._store.onReload !== void 0,
4397
4530
  cancel: this._store.onCancel !== void 0,
4398
4531
  speak: this._store.onSpeak !== void 0,
4399
- unstable_copy: _optionalChain([this, 'access', _204 => _204._store, 'access', _205 => _205.unstable_capabilities, 'optionalAccess', _206 => _206.copy]) !== false,
4532
+ unstable_copy: _optionalChain([this, 'access', _220 => _220._store, 'access', _221 => _221.unstable_capabilities, 'optionalAccess', _222 => _222.copy]) !== false,
4400
4533
  // default true
4401
- attachments: !!_optionalChain([this, 'access', _207 => _207.store, 'access', _208 => _208.adapters, 'optionalAccess', _209 => _209.attachments]),
4402
- feedback: !!_optionalChain([this, 'access', _210 => _210.store, 'access', _211 => _211.adapters, 'optionalAccess', _212 => _212.feedback])
4534
+ attachments: !!_optionalChain([this, 'access', _223 => _223.store, 'access', _224 => _224.adapters, 'optionalAccess', _225 => _225.attachments]),
4535
+ feedback: !!_optionalChain([this, 'access', _226 => _226.store, 'access', _227 => _227.adapters, 'optionalAccess', _228 => _228.feedback])
4403
4536
  };
4404
- this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _213 => _213._store, 'access', _214 => _214.adapters, 'optionalAccess', _215 => _215.attachments]));
4537
+ this.composer.setAttachmentAdapter(_optionalChain([this, 'access', _229 => _229._store, 'access', _230 => _230.adapters, 'optionalAccess', _231 => _231.attachments]));
4405
4538
  if (oldStore) {
4406
4539
  if (oldStore.convertMessage !== store.convertMessage) {
4407
4540
  this.converter = new ThreadMessageConverter();
@@ -4427,7 +4560,7 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4427
4560
  for (let i = 0; i < messages2.length; i++) {
4428
4561
  const message = messages2[i];
4429
4562
  const parent = messages2[i - 1];
4430
- this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _216 => _216.id]), () => ( null)), message);
4563
+ this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _232 => _232.id]), () => ( null)), message);
4431
4564
  }
4432
4565
  if (this.assistantOptimisticId) {
4433
4566
  this.repository.deleteMessage(this.assistantOptimisticId);
@@ -4435,7 +4568,7 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4435
4568
  }
4436
4569
  if (hasUpcomingMessage(isRunning, messages2)) {
4437
4570
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
4438
- _nullishCoalesce(_optionalChain([messages2, 'access', _217 => _217.at, 'call', _218 => _218(-1), 'optionalAccess', _219 => _219.id]), () => ( null)),
4571
+ _nullishCoalesce(_optionalChain([messages2, 'access', _233 => _233.at, 'call', _234 => _234(-1), 'optionalAccess', _235 => _235.id]), () => ( null)),
4439
4572
  {
4440
4573
  role: "assistant",
4441
4574
  content: []
@@ -4443,7 +4576,7 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4443
4576
  );
4444
4577
  }
4445
4578
  this.repository.resetHead(
4446
- _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages2, 'access', _220 => _220.at, 'call', _221 => _221(-1), 'optionalAccess', _222 => _222.id]))), () => ( null))
4579
+ _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages2, 'access', _236 => _236.at, 'call', _237 => _237(-1), 'optionalAccess', _238 => _238.id]))), () => ( null))
4447
4580
  );
4448
4581
  this.messages = this.repository.getMessages();
4449
4582
  this.notifySubscribers();
@@ -4464,7 +4597,7 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4464
4597
  this.updateMessages(this.repository.getMessages());
4465
4598
  }
4466
4599
  async append(message) {
4467
- if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _223 => _223.messages, 'access', _224 => _224.at, 'call', _225 => _225(-1), 'optionalAccess', _226 => _226.id]), () => ( null)))) {
4600
+ if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _239 => _239.messages, 'access', _240 => _240.at, 'call', _241 => _241(-1), 'optionalAccess', _242 => _242.id]), () => ( null)))) {
4468
4601
  if (!this._store.onEdit)
4469
4602
  throw new Error("Runtime does not support editing messages.");
4470
4603
  await this._store.onEdit(message);
@@ -4487,7 +4620,7 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4487
4620
  }
4488
4621
  let messages2 = this.repository.getMessages();
4489
4622
  const previousMessage = messages2[messages2.length - 1];
4490
- if (_optionalChain([previousMessage, 'optionalAccess', _227 => _227.role]) === "user" && previousMessage.id === _optionalChain([messages2, 'access', _228 => _228.at, 'call', _229 => _229(-1), 'optionalAccess', _230 => _230.id])) {
4623
+ if (_optionalChain([previousMessage, 'optionalAccess', _243 => _243.role]) === "user" && previousMessage.id === _optionalChain([messages2, 'access', _244 => _244.at, 'call', _245 => _245(-1), 'optionalAccess', _246 => _246.id])) {
4491
4624
  this.repository.deleteMessage(previousMessage.id);
4492
4625
  if (!this.composer.text.trim()) {
4493
4626
  this.composer.setText(getThreadMessageText(previousMessage));
@@ -4512,7 +4645,7 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4512
4645
  return this._store.onSpeak(message);
4513
4646
  }
4514
4647
  submitFeedback({ messageId, type }) {
4515
- const adapter = _optionalChain([this, 'access', _231 => _231._store, 'access', _232 => _232.adapters, 'optionalAccess', _233 => _233.feedback]);
4648
+ const adapter = _optionalChain([this, 'access', _247 => _247._store, 'access', _248 => _248.adapters, 'optionalAccess', _249 => _249.feedback]);
4516
4649
  if (!adapter) throw new Error("Feedback adapter not configured");
4517
4650
  const { message } = this.repository.getMessage(messageId);
4518
4651
  adapter.submit({ message, type });
@@ -4522,7 +4655,7 @@ var ExternalStoreThreadRuntimeCore = (_class15 = class {
4522
4655
  return () => this._subscriptions.delete(callback);
4523
4656
  }
4524
4657
  __init39() {this.updateMessages = (messages2) => {
4525
- _optionalChain([this, 'access', _234 => _234._store, 'access', _235 => _235.setMessages, 'optionalCall', _236 => _236(
4658
+ _optionalChain([this, 'access', _250 => _250._store, 'access', _251 => _251.setMessages, 'optionalCall', _252 => _252(
4526
4659
  messages2.flatMap(getExternalStoreMessage).filter((m) => m != null)
4527
4660
  )]);
4528
4661
  }}
@@ -4819,12 +4952,15 @@ var SimpleImageAttachmentAdapter = (_class16 = class {constructor() { _class16.p
4819
4952
  id: state.file.name,
4820
4953
  type: "image",
4821
4954
  name: state.file.name,
4822
- file: state.file
4955
+ contentType: state.file.type,
4956
+ file: state.file,
4957
+ status: { type: "requires-action", reason: "composer-send" }
4823
4958
  };
4824
4959
  }
4825
4960
  async send(attachment) {
4826
4961
  return {
4827
4962
  ...attachment,
4963
+ status: { type: "complete" },
4828
4964
  content: [
4829
4965
  {
4830
4966
  type: "image",
@@ -4851,12 +4987,15 @@ var SimpleTextAttachmentAdapter = (_class17 = class {constructor() { _class17.pr
4851
4987
  id: state.file.name,
4852
4988
  type: "document",
4853
4989
  name: state.file.name,
4854
- file: state.file
4990
+ contentType: state.file.type,
4991
+ file: state.file,
4992
+ status: { type: "requires-action", reason: "composer-send" }
4855
4993
  };
4856
4994
  }
4857
4995
  async send(attachment) {
4858
4996
  return {
4859
4997
  ...attachment,
4998
+ status: { type: "complete" },
4860
4999
  content: [
4861
5000
  {
4862
5001
  type: "text",
@@ -4939,7 +5078,14 @@ var CompositeAttachmentAdapter = class {
4939
5078
  async remove(attachment) {
4940
5079
  const adapters = this._adapters.slice();
4941
5080
  for (const adapter of adapters) {
4942
- if (fileMatchesAccept(attachment.file, adapter.accept)) {
5081
+ if (fileMatchesAccept(
5082
+ {
5083
+ name: attachment.name,
5084
+ type: _nullishCoalesce(attachment.contentType, () => ( "unknown/unknown"))
5085
+ // TODO remove after 0.6.0
5086
+ },
5087
+ adapter.accept
5088
+ )) {
4943
5089
  return adapter.remove(attachment);
4944
5090
  }
4945
5091
  }
@@ -4963,7 +5109,7 @@ var ThreadConfigProvider = ({
4963
5109
  }) => {
4964
5110
  const hasAssistant = !!useAssistantRuntime({ optional: true });
4965
5111
  const configProvider = config && Object.keys(_nullishCoalesce(config, () => ( {}))).length > 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
4966
- if (!_optionalChain([config, 'optionalAccess', _237 => _237.runtime])) return configProvider;
5112
+ if (!_optionalChain([config, 'optionalAccess', _253 => _253.runtime])) return configProvider;
4967
5113
  if (hasAssistant) {
4968
5114
  throw new Error(
4969
5115
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -5157,7 +5303,7 @@ var useAllowBranchPicker = (ensureCapability = false) => {
5157
5303
  return allowBranchPicker && (!ensureCapability || branchPickerSupported);
5158
5304
  };
5159
5305
  var BranchPicker = () => {
5160
- const allowBranchPicker = useAllowBranchPicker();
5306
+ const allowBranchPicker = useAllowBranchPicker(true);
5161
5307
  if (!allowBranchPicker) return null;
5162
5308
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, BranchPickerRoot, { hideWhenSingleBranch: true, children: [
5163
5309
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BranchPickerPrevious2, {}),
@@ -5291,7 +5437,7 @@ var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: comp
5291
5437
  {
5292
5438
  components: {
5293
5439
  ...componentsProp,
5294
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _238 => _238.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5440
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _254 => _254.Text]), () => ( components.Text)), () => ( content_part_default.Text)),
5295
5441
  tools: toolsComponents
5296
5442
  }
5297
5443
  }
@@ -5346,7 +5492,7 @@ var ComposerAttachmentRoot = withDefaults("div", {
5346
5492
  });
5347
5493
  ComposerAttachmentRoot.displayName = "ComposerAttachmentRoot";
5348
5494
  var ComposerAttachment2 = () => {
5349
- const attachment = useComposerAttachment((a) => a.attachment);
5495
+ const attachment = useThreadComposerAttachment((a) => a.attachment);
5350
5496
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, ComposerAttachmentRoot, { children: [
5351
5497
  ".",
5352
5498
  attachment.name.split(".").pop(),
@@ -5360,10 +5506,9 @@ var ComposerAttachmentRemove = _react.forwardRef.call(void 0, (props, ref) => {
5360
5506
  composer: { removeAttachment: { tooltip = "Remove file" } = {} } = {}
5361
5507
  } = {}
5362
5508
  } = useThreadConfig();
5363
- const composerStore = useThreadComposerStore();
5364
- const attachmentStore = useAttachmentStore();
5509
+ const attachmentRuntime = useAttachmentRuntime();
5365
5510
  const handleRemoveAttachment = () => {
5366
- composerStore.getState().removeAttachment(attachmentStore.getState().attachment.id);
5511
+ attachmentRuntime.remove();
5367
5512
  };
5368
5513
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
5369
5514
  TooltipIconButton,
@@ -5434,7 +5579,7 @@ var ComposerAttachments = ({ components }) => {
5434
5579
  {
5435
5580
  components: {
5436
5581
  ...components,
5437
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _239 => _239.Attachment]), () => ( composer_attachment_default))
5582
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _255 => _255.Attachment]), () => ( composer_attachment_default))
5438
5583
  }
5439
5584
  }
5440
5585
  ) });
@@ -5566,7 +5711,7 @@ var ThreadWelcomeSuggestion = ({
5566
5711
  };
5567
5712
  var ThreadWelcomeSuggestions = () => {
5568
5713
  const { welcome: { suggestions } = {} } = useThreadConfig();
5569
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _240 => _240.map, 'call', _241 => _241((suggestion, idx) => {
5714
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _256 => _256.map, 'call', _257 => _257((suggestion, idx) => {
5570
5715
  const key = `${suggestion.prompt}-${idx}`;
5571
5716
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
5572
5717
  })]) });
@@ -5665,7 +5810,7 @@ var UserMessageContent = _react.forwardRef.call(void 0,
5665
5810
  {
5666
5811
  components: {
5667
5812
  ...components,
5668
- Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _242 => _242.Text]), () => ( content_part_default.Text))
5813
+ Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _258 => _258.Text]), () => ( content_part_default.Text))
5669
5814
  }
5670
5815
  }
5671
5816
  ) });
@@ -5683,7 +5828,7 @@ var UserMessageAttachments = ({
5683
5828
  {
5684
5829
  components: {
5685
5830
  ...components,
5686
- Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _243 => _243.Attachment]), () => ( user_message_attachment_default))
5831
+ Attachment: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _259 => _259.Attachment]), () => ( user_message_attachment_default))
5687
5832
  }
5688
5833
  }
5689
5834
  ) }) });
@@ -5784,10 +5929,10 @@ var ThreadMessages = ({ components, ...rest }) => {
5784
5929
  thread_exports.Messages,
5785
5930
  {
5786
5931
  components: {
5787
- UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _244 => _244.UserMessage]), () => ( user_message_default)),
5788
- EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _245 => _245.EditComposer]), () => ( edit_composer_default)),
5789
- AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _246 => _246.AssistantMessage]), () => ( assistant_message_default)),
5790
- SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _247 => _247.SystemMessage]), () => ( SystemMessage))
5932
+ UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _260 => _260.UserMessage]), () => ( user_message_default)),
5933
+ EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _261 => _261.EditComposer]), () => ( edit_composer_default)),
5934
+ AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _262 => _262.AssistantMessage]), () => ( assistant_message_default)),
5935
+ SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _263 => _263.SystemMessage]), () => ( SystemMessage))
5791
5936
  },
5792
5937
  ...rest
5793
5938
  }