@harnessio/ai-chat-core 0.0.6 → 0.0.8

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,8 +1,8 @@
1
- var $ = Object.defineProperty;
2
- var U = (i, s, t) => s in i ? $(i, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[s] = t;
3
- var c = (i, s, t) => U(i, typeof s != "symbol" ? s + "" : s, t);
4
- import B, { createContext as H, useContext as Q, useState as x, useEffect as w, useReducer as J } from "react";
5
- class W {
1
+ var Q = Object.defineProperty;
2
+ var $ = (i, s, t) => s in i ? Q(i, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[s] = t;
3
+ var c = (i, s, t) => $(i, typeof s != "symbol" ? s + "" : s, t);
4
+ import B, { createContext as U, useContext as H, useState as x, useEffect as w, useReducer as J } from "react";
5
+ class z {
6
6
  constructor() {
7
7
  c(this, "plugins", /* @__PURE__ */ new Map());
8
8
  c(this, "renderersByType", /* @__PURE__ */ new Map());
@@ -36,7 +36,7 @@ class W {
36
36
  this.plugins.clear(), this.renderersByType.clear();
37
37
  }
38
38
  }
39
- class z {
39
+ class W {
40
40
  constructor() {
41
41
  c(this, "handlers", /* @__PURE__ */ new Map());
42
42
  c(this, "renderers", /* @__PURE__ */ new Map());
@@ -263,7 +263,7 @@ let Y = 0, K = 0;
263
263
  function P() {
264
264
  return `msg-${Date.now()}-${++Y}`;
265
265
  }
266
- function F() {
266
+ function L() {
267
267
  return `thread-${Date.now()}-${++K}`;
268
268
  }
269
269
  class I extends y {
@@ -322,7 +322,7 @@ class X extends y {
322
322
  this._isSubmitting = t, this.notifySubscribers();
323
323
  }
324
324
  }
325
- class R extends y {
325
+ class C extends y {
326
326
  constructor(t) {
327
327
  super();
328
328
  c(this, "composer");
@@ -395,7 +395,7 @@ class R extends y {
395
395
  return super.subscribe(t);
396
396
  }
397
397
  }
398
- class v extends y {
398
+ class M extends y {
399
399
  constructor(t) {
400
400
  super();
401
401
  c(this, "_messages", []);
@@ -631,13 +631,20 @@ class Z extends y {
631
631
  c(this, "_threadItems", /* @__PURE__ */ new Map());
632
632
  c(this, "_threadStates", /* @__PURE__ */ new Map());
633
633
  c(this, "_isLoading", !1);
634
+ c(this, "_isLoadingMore", !1);
635
+ c(this, "_currentPage", 0);
636
+ c(this, "_totalPages", 0);
637
+ c(this, "_totalCount", 0);
638
+ c(this, "_hasMore", !0);
639
+ c(this, "_searchQuery");
640
+ c(this, "_abortController", null);
634
641
  c(this, "main");
635
- this.config = t, this._mainThreadId = F();
636
- const e = new v({
642
+ this.config = t, this._mainThreadId = L();
643
+ const e = new M({
637
644
  streamAdapter: t.streamAdapter,
638
645
  capabilityExecutionManager: t.capabilityExecutionManager
639
646
  });
640
- this.main = new R(e), this._threads.set(this._mainThreadId, this.main);
647
+ this.main = new C(e), this._threads.set(this._mainThreadId, this.main);
641
648
  const n = {
642
649
  id: this._mainThreadId,
643
650
  title: "New Chat",
@@ -658,6 +665,9 @@ class Z extends y {
658
665
  get isLoading() {
659
666
  return this._isLoading;
660
667
  }
668
+ get isLoadingMore() {
669
+ return this._isLoadingMore;
670
+ }
661
671
  /**
662
672
  * Get the currently active main thread
663
673
  */
@@ -673,7 +683,15 @@ class Z extends y {
673
683
  mainThreadId: this._mainThreadId,
674
684
  threads: t,
675
685
  isLoading: this._isLoading,
676
- threadItems: e
686
+ isLoadingMore: this._isLoadingMore,
687
+ threadItems: e,
688
+ pagination: {
689
+ currentPage: this._currentPage,
690
+ totalPages: this._totalPages,
691
+ totalCount: this._totalCount,
692
+ hasMore: this._hasMore
693
+ },
694
+ searchQuery: this._searchQuery
677
695
  };
678
696
  }
679
697
  async switchToThread(t) {
@@ -698,10 +716,10 @@ class Z extends y {
698
716
  this.notifySubscribers();
699
717
  }
700
718
  async switchToNewThread() {
701
- const t = F(), e = new v({
719
+ const t = L(), e = new M({
702
720
  streamAdapter: this.config.streamAdapter,
703
721
  capabilityExecutionManager: this.config.capabilityExecutionManager
704
- }), n = new R(e);
722
+ }), n = new C(e);
705
723
  this._threads.set(t, n);
706
724
  const r = {
707
725
  id: t,
@@ -719,7 +737,7 @@ class Z extends y {
719
737
  onDelete: this.deleteThread.bind(this)
720
738
  });
721
739
  if (this._threadItems.set(t, a), n.subscribe(() => {
722
- this.notifySubscribers();
740
+ this.syncThreadStateFromRuntime(t, n), this.notifySubscribers();
723
741
  }), this.config.threadListAdapter)
724
742
  try {
725
743
  const o = await this.config.threadListAdapter.createThread();
@@ -729,37 +747,62 @@ class Z extends y {
729
747
  }
730
748
  await this.switchToThread(t);
731
749
  }
732
- async loadThreads() {
750
+ async loadThreads(t, e = !1) {
733
751
  if (!this.config.threadListAdapter) {
734
752
  console.warn("No threadListAdapter configured");
735
753
  return;
736
754
  }
737
- this._isLoading = !0, this.notifySubscribers();
738
- try {
739
- const t = await this.config.threadListAdapter.loadThreads();
740
- for (const e of t) {
741
- if (this._threadStates.has(e.id))
742
- continue;
743
- const n = new v({
744
- streamAdapter: this.config.streamAdapter
745
- }), r = new R(n);
746
- this._threads.set(e.id, r), this._threadStates.set(e.id, e);
747
- const a = new I({
748
- state: e,
749
- onSwitchTo: this.switchToThread.bind(this),
750
- onRename: this.renameThread.bind(this),
751
- onDelete: this.deleteThread.bind(this)
752
- });
753
- this._threadItems.set(e.id, a), r.subscribe(() => {
754
- this.notifySubscribers();
755
+ this._abortController && this._abortController.abort(), this._abortController = new AbortController();
756
+ const n = t !== this._searchQuery, r = e || n;
757
+ if (r && (this._currentPage = 0, this._searchQuery = t, this._hasMore = !0, this._threadStates.clear(), this._threads.clear(), this._threadItems.clear()), !(!r && !this._hasMore)) {
758
+ r ? this._isLoading = !0 : this._isLoadingMore = !0, this.notifySubscribers();
759
+ try {
760
+ const a = await this.config.threadListAdapter.loadThreads({
761
+ query: this._searchQuery,
762
+ page: this._currentPage,
763
+ size: 50
755
764
  });
765
+ let o, u;
766
+ Array.isArray(a) ? (o = a, u = void 0) : (o = a.threads, u = a.pagination), u ? (this._totalPages = u.pageCount ?? 0, this._totalCount = u.total ?? 0, this._currentPage = u.pageNumber ?? this._currentPage, this._hasMore = u.pageNumber !== void 0 && u.pageCount !== void 0 && u.pageNumber < u.pageCount - 1) : this._hasMore = !1;
767
+ for (const f of o) {
768
+ if (this._threadStates.has(f.id))
769
+ continue;
770
+ const l = new M({
771
+ streamAdapter: this.config.streamAdapter,
772
+ capabilityExecutionManager: this.config.capabilityExecutionManager
773
+ }), h = new C(l);
774
+ this._threads.set(f.id, h), this._threadStates.set(f.id, f);
775
+ const d = new I({
776
+ state: f,
777
+ onSwitchTo: this.switchToThread.bind(this),
778
+ onRename: this.renameThread.bind(this),
779
+ onDelete: this.deleteThread.bind(this)
780
+ });
781
+ this._threadItems.set(f.id, d), h.subscribe(() => {
782
+ this.syncThreadStateFromRuntime(f.id, h), this.notifySubscribers();
783
+ });
784
+ }
785
+ } catch (a) {
786
+ a instanceof Error && a.name !== "AbortError" && console.error("Failed to load threads:", a);
787
+ } finally {
788
+ this._isLoading = !1, this._isLoadingMore = !1, this._abortController = null, this.notifySubscribers();
756
789
  }
757
- } catch (t) {
758
- console.error("Failed to load threads:", t);
759
- } finally {
760
- this._isLoading = !1, this.notifySubscribers();
761
790
  }
762
791
  }
792
+ async loadMoreThreads() {
793
+ this._isLoading || this._isLoadingMore || !this._hasMore || (this._currentPage += 1, await this.loadThreads(this._searchQuery, !1));
794
+ }
795
+ async searchThreads(t) {
796
+ await this.loadThreads(t, !0);
797
+ }
798
+ /**
799
+ * Syncs conversationId and title from thread runtime to thread state
800
+ */
801
+ syncThreadStateFromRuntime(t, e) {
802
+ var r;
803
+ const n = this._threadStates.get(t);
804
+ n && (n.conversationId !== e.conversationId || n.title !== e.title) && (n.conversationId = e.conversationId, n.title = e.title || n.title, n.updatedAt = Date.now(), this._threadStates.set(t, n), (r = this._threadItems.get(t)) == null || r.updateState(n));
805
+ }
763
806
  async renameThread(t, e) {
764
807
  var r;
765
808
  const n = this._threadStates.get(t);
@@ -798,9 +841,9 @@ class ft extends y {
798
841
  c(this, "capabilityExecutionManager");
799
842
  c(this, "_contentFocusRuntime");
800
843
  c(this, "_currentThreadUnsubscribe");
801
- this.pluginRegistry = new W(), t.plugins && t.plugins.forEach((e) => {
844
+ this.pluginRegistry = new z(), t.plugins && t.plugins.forEach((e) => {
802
845
  this.pluginRegistry.registerPlugin(e);
803
- }), this.capabilityRegistry = new z(), this.capabilityExecutionManager = new V((e) => this.capabilityRegistry.getHandler(e)), this.threads = new Z({
846
+ }), this.capabilityRegistry = new W(), this.capabilityExecutionManager = new V((e) => this.capabilityRegistry.getHandler(e)), this.threads = new Z({
804
847
  streamAdapter: t.streamAdapter,
805
848
  threadListAdapter: t.threadListAdapter,
806
849
  capabilityExecutionManager: this.capabilityExecutionManager
@@ -863,16 +906,16 @@ class ft extends y {
863
906
  }
864
907
  }
865
908
  }
866
- var C = { exports: {} }, _ = {};
909
+ var R = { exports: {} }, _ = {};
867
910
  /*
868
911
  object-assign
869
912
  (c) Sindre Sorhus
870
913
  @license MIT
871
914
  */
872
- var E, L;
915
+ var v, F;
873
916
  function tt() {
874
- if (L) return E;
875
- L = 1;
917
+ if (F) return v;
918
+ F = 1;
876
919
  var i = Object.getOwnPropertySymbols, s = Object.prototype.hasOwnProperty, t = Object.prototype.propertyIsEnumerable;
877
920
  function e(r) {
878
921
  if (r == null)
@@ -901,7 +944,7 @@ function tt() {
901
944
  return !1;
902
945
  }
903
946
  }
904
- return E = n() ? Object.assign : function(r, a) {
947
+ return v = n() ? Object.assign : function(r, a) {
905
948
  for (var o, u = e(r), f, l = 1; l < arguments.length; l++) {
906
949
  o = Object(arguments[l]);
907
950
  for (var h in o)
@@ -913,7 +956,7 @@ function tt() {
913
956
  }
914
957
  }
915
958
  return u;
916
- }, E;
959
+ }, v;
917
960
  }
918
961
  /** @license React v17.0.2
919
962
  * react-jsx-runtime.production.min.js
@@ -923,10 +966,10 @@ function tt() {
923
966
  * This source code is licensed under the MIT license found in the
924
967
  * LICENSE file in the root directory of this source tree.
925
968
  */
926
- var j;
969
+ var N;
927
970
  function et() {
928
- if (j) return _;
929
- j = 1, tt();
971
+ if (N) return _;
972
+ N = 1, tt();
930
973
  var i = B, s = 60103;
931
974
  if (_.Fragment = 60107, typeof Symbol == "function" && Symbol.for) {
932
975
  var t = Symbol.for;
@@ -934,41 +977,40 @@ function et() {
934
977
  }
935
978
  var e = i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, n = Object.prototype.hasOwnProperty, r = { key: !0, ref: !0, __self: !0, __source: !0 };
936
979
  function a(o, u, f) {
937
- var l, h = {}, d = null, p = null;
938
- f !== void 0 && (d = "" + f), u.key !== void 0 && (d = "" + u.key), u.ref !== void 0 && (p = u.ref);
980
+ var l, h = {}, d = null, g = null;
981
+ f !== void 0 && (d = "" + f), u.key !== void 0 && (d = "" + u.key), u.ref !== void 0 && (g = u.ref);
939
982
  for (l in u) n.call(u, l) && !r.hasOwnProperty(l) && (h[l] = u[l]);
940
983
  if (o && o.defaultProps) for (l in u = o.defaultProps, u) h[l] === void 0 && (h[l] = u[l]);
941
- return { $$typeof: s, type: o, key: d, ref: p, props: h, _owner: e.current };
984
+ return { $$typeof: s, type: o, key: d, ref: g, props: h, _owner: e.current };
942
985
  }
943
986
  return _.jsx = a, _.jsxs = a, _;
944
987
  }
945
- var O;
988
+ var j;
946
989
  function st() {
947
- return O || (O = 1, C.exports = et()), C.exports;
990
+ return j || (j = 1, R.exports = et()), R.exports;
948
991
  }
949
992
  var S = st();
950
- const k = H(null);
951
- function pt({ runtime: i, children: s }) {
993
+ const k = U(null);
994
+ function gt({ runtime: i, children: s }) {
952
995
  return /* @__PURE__ */ S.jsx(k.Provider, { value: i, children: s });
953
996
  }
954
997
  function rt() {
955
- const i = Q(k);
998
+ const i = H(k);
956
999
  if (!i)
957
1000
  throw new Error("useAssistantRuntimeContext must be used within AssistantRuntimeProvider");
958
1001
  return i;
959
1002
  }
960
- function g() {
1003
+ function p() {
961
1004
  return rt();
962
1005
  }
963
- function gt() {
964
- const i = g();
1006
+ function pt() {
1007
+ const i = p();
965
1008
  return {
966
1009
  switchToThread: (s) => i.threads.switchToThread(s),
967
1010
  switchToNewThread: () => i.threads.switchToNewThread(),
968
- loadThreads: () => {
969
- var s, t;
970
- return (t = (s = i.threads).loadThreads) == null ? void 0 : t.call(s);
971
- },
1011
+ loadThreads: (s, t) => i.threads.loadThreads(s, t),
1012
+ loadMoreThreads: () => i.threads.loadMoreThreads(),
1013
+ searchThreads: (s) => i.threads.searchThreads(s),
972
1014
  renameThread: (s, t) => {
973
1015
  var e, n;
974
1016
  return (n = (e = i.threads).renameThread) == null ? void 0 : n.call(e, s, t);
@@ -980,15 +1022,15 @@ function gt() {
980
1022
  };
981
1023
  }
982
1024
  function bt() {
983
- const i = g(), [s, t] = x(i.threads.getState());
1025
+ const i = p(), [s, t] = x(i.threads.getState());
984
1026
  return w(() => i.threads.subscribe(() => {
985
1027
  t(i.threads.getState());
986
1028
  }), [i]), s;
987
1029
  }
988
1030
  function nt() {
989
- return g().threads.getMainThread();
1031
+ return p().threads.getMainThread();
990
1032
  }
991
- var M = { exports: {} }, A = {};
1033
+ var E = { exports: {} }, A = {};
992
1034
  /**
993
1035
  * @license React
994
1036
  * use-sync-external-store-shim.production.js
@@ -998,22 +1040,22 @@ var M = { exports: {} }, A = {};
998
1040
  * This source code is licensed under the MIT license found in the
999
1041
  * LICENSE file in the root directory of this source tree.
1000
1042
  */
1001
- var N;
1043
+ var O;
1002
1044
  function it() {
1003
- if (N) return A;
1004
- N = 1;
1045
+ if (O) return A;
1046
+ O = 1;
1005
1047
  var i = B;
1006
1048
  function s(h, d) {
1007
1049
  return h === d && (h !== 0 || 1 / h === 1 / d) || h !== h && d !== d;
1008
1050
  }
1009
1051
  var t = typeof Object.is == "function" ? Object.is : s, e = i.useState, n = i.useEffect, r = i.useLayoutEffect, a = i.useDebugValue;
1010
1052
  function o(h, d) {
1011
- var p = d(), m = e({ inst: { value: p, getSnapshot: d } }), b = m[0].inst, T = m[1];
1053
+ var g = d(), m = e({ inst: { value: g, getSnapshot: d } }), b = m[0].inst, T = m[1];
1012
1054
  return r(
1013
1055
  function() {
1014
- b.value = p, b.getSnapshot = d, u(b) && T({ inst: b });
1056
+ b.value = g, b.getSnapshot = d, u(b) && T({ inst: b });
1015
1057
  },
1016
- [h, p, d]
1058
+ [h, g, d]
1017
1059
  ), n(
1018
1060
  function() {
1019
1061
  return u(b) && T({ inst: b }), h(function() {
@@ -1021,14 +1063,14 @@ function it() {
1021
1063
  });
1022
1064
  },
1023
1065
  [h]
1024
- ), a(p), p;
1066
+ ), a(g), g;
1025
1067
  }
1026
1068
  function u(h) {
1027
1069
  var d = h.getSnapshot;
1028
1070
  h = h.value;
1029
1071
  try {
1030
- var p = d();
1031
- return !t(h, p);
1072
+ var g = d();
1073
+ return !t(h, g);
1032
1074
  } catch {
1033
1075
  return !0;
1034
1076
  }
@@ -1041,11 +1083,11 @@ function it() {
1041
1083
  }
1042
1084
  var D;
1043
1085
  function at() {
1044
- return D || (D = 1, M.exports = it()), M.exports;
1086
+ return D || (D = 1, E.exports = it()), E.exports;
1045
1087
  }
1046
1088
  var ot = at();
1047
1089
  function yt() {
1048
- const i = g();
1090
+ const i = p();
1049
1091
  return ot.useSyncExternalStore(
1050
1092
  (s) => i.subscribe(() => {
1051
1093
  s();
@@ -1078,7 +1120,7 @@ function mt() {
1078
1120
  }
1079
1121
  function q(i, s) {
1080
1122
  var r, a, o, u;
1081
- const e = g().pluginRegistry.getBestRendererForType(i);
1123
+ const e = p().pluginRegistry.getBestRendererForType(i);
1082
1124
  if (!e)
1083
1125
  return {
1084
1126
  component: null,
@@ -1097,7 +1139,7 @@ function q(i, s) {
1097
1139
  };
1098
1140
  }
1099
1141
  function _t() {
1100
- const i = g(), [s, t] = x(i.contentFocus.state);
1142
+ const i = p(), [s, t] = x(i.contentFocus.state);
1101
1143
  return w(() => i.contentFocus.subscribe(() => {
1102
1144
  t(i.contentFocus.state);
1103
1145
  }), [i]), {
@@ -1111,7 +1153,7 @@ function _t() {
1111
1153
  };
1112
1154
  }
1113
1155
  function ut(i) {
1114
- const s = g();
1156
+ const s = p();
1115
1157
  w(() => (i.execute && s.capabilityRegistry.registerHandler(i.name, { execute: i.execute }), i.render && s.capabilityRegistry.registerRenderer(i.name, {
1116
1158
  component: i.render
1117
1159
  }), () => {
@@ -1119,7 +1161,7 @@ function ut(i) {
1119
1161
  }), [i.name, s]);
1120
1162
  }
1121
1163
  function ct(i) {
1122
- const s = g(), [t, e] = x(
1164
+ const s = p(), [t, e] = x(
1123
1165
  () => s.capabilityExecutionManager.getExecution(i)
1124
1166
  ), [, n] = J((r) => r + 1, 0);
1125
1167
  return w(() => {
@@ -1133,7 +1175,7 @@ function ct(i) {
1133
1175
  }, [i, s]), t;
1134
1176
  }
1135
1177
  function ht({ message: i, content: s }) {
1136
- const t = g(), e = s, n = ct(e.capabilityId), r = t.capabilityRegistry.getRenderer(e.capabilityName);
1178
+ const t = p(), e = s, n = ct(e.capabilityId), r = t.capabilityRegistry.getRenderer(e.capabilityName);
1137
1179
  if (!r || !n)
1138
1180
  return null;
1139
1181
  const a = r.component;
@@ -1229,11 +1271,11 @@ class Tt {
1229
1271
  if (d === "eof" || h === "eof")
1230
1272
  break;
1231
1273
  try {
1232
- const p = JSON.parse(d);
1274
+ const g = JSON.parse(d);
1233
1275
  if (a && this.shouldProcessEvent(a)) {
1234
1276
  const m = this.convertEvent({
1235
1277
  event: a,
1236
- data: p
1278
+ data: g
1237
1279
  });
1238
1280
  m && (yield m);
1239
1281
  }
@@ -1251,21 +1293,21 @@ class Tt {
1251
1293
  }
1252
1294
  export {
1253
1295
  ft as AssistantRuntime,
1254
- pt as AssistantRuntimeProvider,
1296
+ gt as AssistantRuntimeProvider,
1255
1297
  St as AuxiliaryRenderer,
1256
1298
  Tt as BaseSSEStreamAdapter,
1257
1299
  V as CapabilityExecutionManager,
1258
- z as CapabilityRegistry,
1300
+ W as CapabilityRegistry,
1259
1301
  ht as CapabilityRendererComp,
1260
1302
  X as ComposerRuntime,
1261
1303
  xt as ContentRenderer,
1262
- W as PluginRegistry,
1304
+ z as PluginRegistry,
1263
1305
  I as ThreadListItemRuntime,
1264
1306
  Z as ThreadListRuntime,
1265
- R as ThreadRuntime,
1266
- v as ThreadRuntimeCore,
1307
+ C as ThreadRuntime,
1308
+ M as ThreadRuntimeCore,
1267
1309
  wt as makeCapability,
1268
- g as useAssistantRuntime,
1310
+ p as useAssistantRuntime,
1269
1311
  ut as useCapability,
1270
1312
  ct as useCapabilityExecution,
1271
1313
  mt as useComposer,
@@ -1273,7 +1315,7 @@ export {
1273
1315
  q as useContentRenderer,
1274
1316
  nt as useCurrentThread,
1275
1317
  yt as useMessages,
1276
- gt as useThreadList,
1318
+ pt as useThreadList,
1277
1319
  bt as useThreadListState
1278
1320
  };
1279
1321
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/core/PluginRegistry.ts","../src/core/CapabilityRegistry.ts","../src/core/CapabilityExecutionManager.ts","../src/utils/Subscribable.ts","../src/runtime/ContentFocusRuntime/ContentFocusRuntime.ts","../src/utils/idGenerator.ts","../src/runtime/ThreadListItemRuntime/ThreadListItemRuntime.ts","../src/runtime/ComposerRuntime/ComposerRuntime.ts","../src/runtime/ThreadRuntime/ThreadRuntime.ts","../src/runtime/ThreadRuntime/ThreadRuntimeCore.ts","../src/runtime/ThreadListRuntime/ThreadListRuntime.tsx","../src/runtime/AssistantRuntime/AssistantRuntime.tsx","../../../node_modules/.pnpm/object-assign@4.1.1/node_modules/object-assign/index.js","../../../node_modules/.pnpm/react@17.0.2/node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/.pnpm/react@17.0.2/node_modules/react/jsx-runtime.js","../src/react/providers/AssistantRuntimeProvider.tsx","../src/react/hooks/useAssistantRuntime.ts","../src/react/hooks/useThreadList.ts","../src/react/hooks/useCurrentThread.ts","../../../node_modules/.pnpm/use-sync-external-store@1.5.0_react@17.0.2/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.5.0_react@17.0.2/node_modules/use-sync-external-store/shim/index.js","../src/react/hooks/useMessages.ts","../src/react/hooks/useComposer.ts","../src/react/hooks/useContentRenderer.ts","../src/react/hooks/useContentFocus.ts","../src/react/hooks/useCapability.ts","../src/react/hooks/useCapabilityExecution.ts","../src/react/components/CapabilityRenderer.tsx","../src/react/components/ContentRenderer.tsx","../src/react/components/AuxiliaryRenderer.tsx","../src/react/utils/makeCapability.tsx","../src/utils/BaseSSEStreamAdapter.ts"],"sourcesContent":["import { ChatPlugin, MessageRenderer } from '../types/plugin'\n\nexport class PluginRegistry {\n private plugins = new Map<string, ChatPlugin>()\n private renderersByType = new Map<string, MessageRenderer[]>()\n\n public registerPlugin(plugin: ChatPlugin): void {\n if (this.plugins.has(plugin.id)) {\n // handle duplicate plugin registration\n // show a warning / error\n }\n\n this.plugins.set(plugin.id, plugin)\n\n plugin.renderers.forEach(renderer => {\n const renderers = this.renderersByType.get(renderer.type) || []\n renderers.push(renderer)\n renderers.sort((a, b) => (b?.priority ?? 0) - (a?.priority ?? 0))\n this.renderersByType.set(renderer.type, renderers)\n })\n }\n\n public unregisterPlugin(pluginId: string): boolean {\n const plugin = this.plugins.get(pluginId)\n if (!plugin) {\n return false\n }\n\n plugin.renderers.forEach(renderer => {\n const renderers = this.renderersByType.get(renderer.type) || []\n const filteredRenderers = renderers.filter(r => !plugin.renderers.includes(r))\n\n if (filteredRenderers.length === 0) {\n this.renderersByType.delete(renderer.type)\n } else {\n this.renderersByType.set(renderer.type, filteredRenderers)\n }\n })\n\n return this.plugins.delete(pluginId)\n }\n\n public getPlugin(pluginId: string): ChatPlugin | undefined {\n return this.plugins.get(pluginId)\n }\n\n public getAllPlugins(): ChatPlugin[] {\n return Array.from(this.plugins.values())\n }\n\n public getRenderersByType(type: string): MessageRenderer[] {\n return this.renderersByType.get(type) || []\n }\n\n public getBestRendererForType(type: string): MessageRenderer | undefined {\n const renderers = this.getRenderersByType(type)\n return renderers[0]\n }\n\n public clear(): void {\n this.plugins.clear()\n this.renderersByType.clear()\n }\n}\n","import { CapabilityHandler, CapabilityRenderer } from '../types/capability'\n\nexport class CapabilityRegistry {\n private handlers = new Map<string, CapabilityHandler>()\n private renderers = new Map<string, CapabilityRenderer>()\n\n public registerHandler(name: string, handler: CapabilityHandler): void {\n this.handlers.set(name, handler)\n }\n\n public registerRenderer(name: string, renderer: CapabilityRenderer): void {\n this.renderers.set(name, renderer)\n }\n\n public unregister(name: string): void {\n this.handlers.delete(name)\n this.renderers.delete(name)\n }\n\n public getHandler(name: string): CapabilityHandler | undefined {\n return this.handlers.get(name)\n }\n\n public getRenderer(name: string): CapabilityRenderer | undefined {\n return this.renderers.get(name)\n }\n\n public getStrategy() {\n return 'queue'\n }\n\n public hasHandler(name: string): boolean {\n return this.handlers.has(name)\n }\n\n public hasRenderer(name: string): boolean {\n return this.renderers.has(name)\n }\n\n public clear(): void {\n this.handlers.clear()\n this.renderers.clear()\n }\n\n public getAllCapabilityNames(): string[] {\n return Array.from(new Set([...this.handlers.keys(), ...this.renderers.keys()]))\n }\n}\n","import { CapabilityExecution, CapabilityHandler } from '../types/capability'\n\nexport class CapabilityExecutionManager {\n private executions = new Map<string, CapabilityExecution>()\n private executionQueue: string[] = []\n private isProcessing = false\n private runningByName = new Map<string, string[]>()\n private subscribers = new Set<(executionId: string) => void>()\n private getHandler: (name: string) => CapabilityHandler | undefined\n\n constructor(getHandler: (name: string) => CapabilityHandler | undefined) {\n this.getHandler = getHandler\n }\n\n public async executeCapability<TArgs, TResult>(\n name: string,\n id: string,\n args: TArgs,\n messageId: string,\n strategy = 'queue'\n ): Promise<void> {\n const handler = this.getHandler(name)\n if (!handler) {\n console.warn(`No handler registered for capability: ${name}`)\n return\n }\n\n const execution: CapabilityExecution<TArgs, TResult> = {\n id,\n name,\n args,\n status: { type: 'queued' },\n timestamp: Date.now(),\n messageId\n }\n\n this.executions.set(id, execution)\n this.notifySubscribers(id)\n\n switch (strategy) {\n case 'queue':\n default:\n this.executionQueue.push(id)\n break\n }\n\n if (!this.isProcessing) {\n this.processQueue()\n }\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessing || this.executionQueue.length === 0) {\n return\n }\n\n this.isProcessing = true\n\n while (this.executionQueue.length > 0) {\n const executionId = this.executionQueue.shift()!\n const execution = this.executions.get(executionId)\n\n if (!execution) continue\n\n const handler = this.getHandler(execution.name)\n if (!handler) continue\n\n execution.status = { type: 'running' }\n this.notifySubscribers(executionId)\n\n const running = this.runningByName.get(execution.name) || []\n running.push(executionId)\n this.runningByName.set(execution.name, running)\n\n try {\n const result = await handler.execute(execution.args, {\n messageId: execution.messageId,\n capabilityId: executionId\n })\n\n execution.status = { type: 'complete', result }\n execution.result = result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n execution.status = { type: 'error', error: errorMessage }\n execution.error = errorMessage\n } finally {\n const running = this.runningByName.get(execution.name) || []\n const index = running.indexOf(executionId)\n if (index > -1) {\n running.splice(index, 1)\n }\n if (running.length === 0) {\n this.runningByName.delete(execution.name)\n } else {\n this.runningByName.set(execution.name, running)\n }\n\n this.notifySubscribers(executionId)\n }\n }\n\n this.isProcessing = false\n }\n\n public getExecution(id: string): CapabilityExecution | undefined {\n return this.executions.get(id)\n }\n\n public getExecutionsByMessage(messageId: string): CapabilityExecution[] {\n return Array.from(this.executions.values()).filter(e => e.messageId === messageId)\n }\n\n public subscribe(callback: (executionId: string) => void): () => void {\n this.subscribers.add(callback)\n return () => this.subscribers.delete(callback)\n }\n\n private notifySubscribers(executionId: string): void {\n this.subscribers.forEach(callback => callback(executionId))\n }\n\n public clear(): void {\n this.executions.clear()\n this.executionQueue = []\n this.runningByName.clear()\n }\n}\n","export type Unsubscribe = () => void\n\nexport abstract class BaseSubscribable {\n private _subscriptions = new Set<() => void>()\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback)\n return () => {\n this._subscriptions.delete(callback)\n }\n }\n\n protected notifySubscribers(): void {\n for (const callback of this._subscriptions) {\n callback()\n }\n }\n\n protected getSubscriberCount(): number {\n return this._subscriptions.size\n }\n}\n","import { Message, MessageContent } from '../../types/message'\nimport { BaseSubscribable } from '../../utils/Subscribable'\n\nexport type FocusContext = 'detail'\n\nexport interface ContentFocusState {\n isActive: boolean\n context: FocusContext | null\n focusedContent: MessageContent | null\n focusedMessage: Message | null\n focusedMessageId: string | null\n focusedContentIndex: number | null\n}\n\nexport class ContentFocusRuntime extends BaseSubscribable {\n private _state: ContentFocusState = {\n isActive: false,\n context: null,\n focusedContent: null,\n focusedMessage: null,\n focusedMessageId: null,\n focusedContentIndex: null\n }\n\n public get state(): ContentFocusState {\n return this._state\n }\n\n public get isActive(): boolean {\n return this._state.isActive\n }\n\n public get context(): FocusContext | null {\n return this._state.context\n }\n\n public get focusedContent(): MessageContent | null {\n return this._state.focusedContent\n }\n\n public get focusedMessage(): Message | null {\n return this._state.focusedMessage\n }\n\n public get focusedMessageId(): string | null {\n return this._state.focusedMessageId\n }\n\n public get focusedContentIndex(): number | null {\n return this._state.focusedContentIndex\n }\n\n public focus(\n content: MessageContent,\n message: Message,\n contentIndex: number,\n context: FocusContext = 'detail'\n ): void {\n this._state = {\n isActive: true,\n context,\n focusedContent: content,\n focusedMessage: message,\n focusedMessageId: message.id,\n focusedContentIndex: contentIndex\n }\n this.notifySubscribers()\n }\n\n public blur(): void {\n this._state = {\n isActive: false,\n context: null,\n focusedContent: null,\n focusedMessage: null,\n focusedMessageId: null,\n focusedContentIndex: null\n }\n this.notifySubscribers()\n }\n\n public toggle(\n content: MessageContent,\n message: Message,\n contentIndex: number,\n context: FocusContext = 'detail'\n ): void {\n if (\n this._state.isActive &&\n this._state.focusedMessageId === message.id &&\n this._state.focusedContentIndex === contentIndex &&\n this._state.context === context\n ) {\n this.blur()\n } else {\n this.focus(content, message, contentIndex, context)\n }\n }\n\n public switchContext(context: FocusContext): void {\n if (this._state.isActive && this._state.focusedContent) {\n this._state = {\n ...this._state,\n context\n }\n this.notifySubscribers()\n }\n }\n\n public focusNext(messages: readonly Message[]): void {\n if (!this._state.focusedMessageId || !messages.length) return\n\n const currentMsgIndex = messages.findIndex(m => m.id === this._state.focusedMessageId)\n if (currentMsgIndex === -1) return\n\n const currentMsg = messages[currentMsgIndex]\n const currentContentIndex = this._state.focusedContentIndex ?? 0\n\n if (currentContentIndex + 1 < currentMsg.content.length) {\n const nextContent = currentMsg.content[currentContentIndex + 1]\n this.focus(nextContent, currentMsg, currentContentIndex + 1, this._state.context || 'detail')\n return\n }\n\n // Try first content in next message\n if (currentMsgIndex + 1 < messages.length) {\n const nextMsg = messages[currentMsgIndex + 1]\n if (nextMsg.content.length > 0) {\n this.focus(nextMsg.content[0], nextMsg, 0, this._state.context || 'detail')\n }\n }\n }\n\n public focusPrevious(messages: readonly Message[]): void {\n if (!this._state.focusedMessageId || !messages.length) return\n\n const currentMsgIndex = messages.findIndex(m => m.id === this._state.focusedMessageId)\n if (currentMsgIndex === -1) return\n\n const currentMsg = messages[currentMsgIndex]\n const currentContentIndex = this._state.focusedContentIndex ?? 0\n\n if (currentContentIndex > 0) {\n const prevContent = currentMsg.content[currentContentIndex - 1]\n this.focus(prevContent, currentMsg, currentContentIndex - 1, this._state.context || 'detail')\n return\n }\n\n // Try last content in previous message\n if (currentMsgIndex > 0) {\n const prevMsg = messages[currentMsgIndex - 1]\n if (prevMsg.content.length > 0) {\n const lastIndex = prevMsg.content.length - 1\n this.focus(prevMsg.content[lastIndex], prevMsg, lastIndex, this._state.context || 'detail')\n }\n }\n }\n}\n","let messageIdCounter = 0\nlet threadIdCounter = 0\n\nexport function generateMessageId(): string {\n return `msg-${Date.now()}-${++messageIdCounter}`\n}\n\nexport function generateThreadId(): string {\n return `thread-${Date.now()}-${++threadIdCounter}`\n}\n\nexport function generateId(prefix = 'id'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n","import { ThreadListItemState } from '../../types/thread'\nimport { BaseSubscribable, Unsubscribe } from '../../utils/Subscribable'\n\nexport interface ThreadListItemRuntimeConfig {\n state: ThreadListItemState\n onSwitchTo: (threadId: string) => Promise<void>\n onRename: (threadId: string, title: string) => Promise<void>\n onDelete: (threadId: string) => Promise<void>\n}\n\nexport class ThreadListItemRuntime extends BaseSubscribable {\n private _state: ThreadListItemState\n\n constructor(private config: ThreadListItemRuntimeConfig) {\n super()\n this._state = config.state\n }\n\n public get state(): ThreadListItemState {\n return this._state\n }\n\n public getState(): ThreadListItemState {\n return this._state\n }\n\n public updateState(state: ThreadListItemState): void {\n this._state = state\n this.notifySubscribers()\n }\n\n public async switchTo(): Promise<void> {\n await this.config.onSwitchTo(this._state.id)\n }\n\n public async rename(newTitle: string): Promise<void> {\n await this.config.onRename(this._state.id, newTitle)\n }\n\n public async delete(): Promise<void> {\n await this.config.onDelete(this._state.id)\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return super.subscribe(callback)\n }\n}\n","import { BaseSubscribable } from '../../utils/Subscribable'\n\nexport interface ComposerState {\n text: string\n isSubmitting: boolean\n}\n\nexport class ComposerRuntime extends BaseSubscribable {\n private _text: string = ''\n private _isSubmitting: boolean = false\n\n public get text(): string {\n return this._text\n }\n\n public get isSubmitting(): boolean {\n return this._isSubmitting\n }\n\n public getState(): ComposerState {\n return {\n text: this._text,\n isSubmitting: this._isSubmitting\n }\n }\n\n public setText(text: string): void {\n this._text = text\n this.notifySubscribers()\n }\n\n public clear(): void {\n this._text = ''\n this.notifySubscribers()\n }\n\n public setSubmitting(isSubmitting: boolean): void {\n this._isSubmitting = isSubmitting\n this.notifySubscribers()\n }\n}\n\nexport default ComposerRuntime\n","import { AppendMessage, Message, TextContent } from '../../types/message'\nimport { RuntimeCapabilities, ThreadState } from '../../types/thread'\nimport { BaseSubscribable, Unsubscribe } from '../../utils/Subscribable'\nimport ComposerRuntime from '../ComposerRuntime/ComposerRuntime'\nimport { ThreadRuntimeCore } from './ThreadRuntimeCore'\n\nexport class ThreadRuntime extends BaseSubscribable {\n public readonly composer: ComposerRuntime\n\n constructor(private _core: ThreadRuntimeCore) {\n super()\n this.composer = new ComposerRuntime()\n\n // Subscribe to core changes and propagate\n this._core.subscribe(() => {\n this.notifySubscribers()\n })\n }\n\n public get messages(): readonly Message[] {\n return this._core.messages\n }\n\n public get isRunning(): boolean {\n return this._core.isRunning\n }\n\n public get isDisabled(): boolean {\n return this._core.isDisabled\n }\n\n public get capabilities(): RuntimeCapabilities {\n return this._core.capabilities\n }\n\n public get conversationId(): string | undefined {\n return this._core.conversationId\n }\n\n public get title(): string | undefined {\n return this._core.title\n }\n\n public getState(): ThreadState {\n return {\n threadId: 'main', // Will be set by ThreadListRuntime\n isDisabled: this._core.isDisabled,\n isRunning: this._core.isRunning,\n capabilities: this._core.capabilities,\n conversationId: this._core.conversationId,\n title: this._core.title\n }\n }\n\n public append(message: AppendMessage): void {\n this._core.append(message)\n }\n\n public async send(text: string): Promise<void> {\n if (!text.trim()) return\n\n this.composer.setSubmitting(true)\n\n try {\n this.composer.clear()\n await this._core.startRun({\n role: 'user',\n content: [{ type: 'text', data: text } as TextContent]\n })\n } catch (e) {\n // TODO: Handle error\n } finally {\n this.composer.setSubmitting(false)\n }\n }\n\n public cancelRun(): void {\n this._core.cancelRun()\n }\n\n public clear(): void {\n this._core.clear()\n }\n\n public reset(messages: Message[] = []): void {\n this._core.reset(messages)\n }\n\n public setConversationId(conversationId: string | undefined): void {\n this._core.setConversationId(conversationId)\n }\n\n public setTitle(title: string | undefined): void {\n this._core.setTitle(title)\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return super.subscribe(callback)\n }\n}\n","import { CapabilityExecutionManager } from '../../core'\nimport { CapabilityContent } from '../../types'\nimport { StreamAdapter, StreamEvent } from '../../types/adapters'\nimport { AppendMessage, Message, MessageContent, MessageStatus } from '../../types/message'\nimport { RuntimeCapabilities } from '../../types/thread'\nimport { generateMessageId } from '../../utils/idGenerator'\nimport { BaseSubscribable } from '../../utils/Subscribable'\n\nexport interface ThreadRuntimeCoreConfig {\n streamAdapter: StreamAdapter\n initialMessages?: Message[]\n onMessagesChange?: (messages: Message[]) => void\n capabilityExecutionManager?: CapabilityExecutionManager\n}\n\nexport class ThreadRuntimeCore extends BaseSubscribable {\n private _messages: Message[] = []\n private _isRunning = false\n private _isDisabled = false\n private _abortController: AbortController | null = null\n private _conversationId?: string\n private _title?: string\n\n // Track current part being accumulated\n private _currentPart: {\n messageId: string\n contentIndex: number\n type: string\n parentId?: string\n } | null = null\n\n constructor(private config: ThreadRuntimeCoreConfig) {\n super()\n if (config.initialMessages) {\n this._messages = [...config.initialMessages]\n }\n }\n\n public get messages(): readonly Message[] {\n return this._messages\n }\n\n public get isRunning(): boolean {\n return this._isRunning\n }\n\n public get isDisabled(): boolean {\n return this._isDisabled\n }\n\n public get conversationId(): string | undefined {\n return this._conversationId\n }\n\n public get title(): string | undefined {\n return this._title\n }\n\n public get capabilities(): RuntimeCapabilities {\n return {\n cancel: true,\n edit: false,\n reload: false,\n speech: false,\n attachments: false,\n feedback: false\n }\n }\n\n private updateMessages(messages: Message[]): void {\n this._messages = messages\n this.config.onMessagesChange?.(this._messages)\n this.notifySubscribers()\n }\n\n public append(message: AppendMessage): void {\n const newMessage: Message = {\n id: message.id || generateMessageId(),\n parentId: message.parentId,\n role: message.role,\n content: message.content,\n status: message.status || { type: 'complete' },\n timestamp: message.timestamp || Date.now(),\n metadata: message.metadata\n }\n\n this.updateMessages([...this._messages, newMessage])\n }\n\n public async startRun(userMessage: AppendMessage): Promise<void> {\n if (this._isRunning) {\n throw new Error('A run is already in progress')\n }\n\n this.append(userMessage)\n this._isRunning = true\n this._abortController = new AbortController()\n this._currentPart = null // Reset current part\n\n const assistantMessageId = generateMessageId()\n const assistantMessage: Message = {\n id: assistantMessageId,\n role: 'assistant',\n content: [],\n status: { type: 'running' },\n timestamp: Date.now()\n }\n\n this.updateMessages([...this._messages, assistantMessage])\n\n try {\n const stream = this.config.streamAdapter.stream({\n messages: this._messages,\n conversationId: this._conversationId,\n signal: this._abortController.signal\n })\n\n for await (const event of stream) {\n if (this._abortController.signal.aborted) {\n break\n }\n\n this.handleStreamEvent(assistantMessageId, event.event)\n }\n\n this.updateMessageStatus(assistantMessageId, { type: 'complete' })\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.updateMessageStatus(assistantMessageId, { type: 'cancelled' })\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n this.updateMessageStatus(assistantMessageId, {\n type: 'error',\n error: errorMessage\n })\n }\n } finally {\n this._isRunning = false\n this._abortController = null\n this._currentPart = null // Clean up\n this.notifySubscribers()\n }\n }\n\n private handleStreamEvent(messageId: string, event: StreamEvent): void {\n const messageIndex = this._messages.findIndex(m => m.id === messageId)\n if (messageIndex === -1) return\n\n const message = this._messages[messageIndex]\n\n // Handle core events with type guards\n if (event.type === 'part-start') {\n this.handlePartStart(message, event as Extract<StreamEvent, { type: 'part-start' }>)\n } else if (event.type === 'text-delta' || event.type === 'assistant_thought') {\n this.handleTextDelta(message, event as Extract<StreamEvent, { type: 'text-delta' }>)\n } else if (event.type === 'part-finish') {\n this.handlePartFinish()\n } else if (event.type === 'metadata') {\n const metadataEvent = event as Extract<StreamEvent, { type: 'metadata' }>\n message.metadata = {\n ...message.metadata,\n conversationId: metadataEvent.conversationId,\n interactionId: metadataEvent.interactionId\n }\n\n if (metadataEvent.conversationId && !this._conversationId) {\n this._conversationId = metadataEvent.conversationId\n }\n\n if (metadataEvent.title && !this._title) {\n this._title = metadataEvent.title\n }\n } else if (event.type === 'capability_execution') {\n const capabilityEvent = event as Extract<StreamEvent, { type: 'capability_execution' }>\n message.content = [\n ...message.content,\n {\n type: 'capability',\n capabilityId: capabilityEvent.capabilityId,\n capabilityName: capabilityEvent.capabilityName,\n args: capabilityEvent.args\n } as CapabilityContent\n ]\n\n // Execute capability if manager is available\n if (this.config.capabilityExecutionManager) {\n this.config.capabilityExecutionManager.executeCapability(\n capabilityEvent.capabilityName,\n capabilityEvent.capabilityId,\n capabilityEvent.args,\n messageId,\n capabilityEvent.strategy\n )\n }\n } else if (event.type === 'error') {\n const errorEvent = event as Extract<StreamEvent, { type: 'error' }>\n message.content = [\n ...message.content,\n {\n type: 'error',\n data: errorEvent.error\n }\n ]\n } else {\n // Handle custom events\n const customEvent = event as Extract<StreamEvent, { data?: any }>\n message.content = [\n ...message.content,\n {\n type: customEvent.type,\n data: customEvent.data,\n parentId: customEvent.parentId\n }\n ]\n }\n\n // Update message with new reference\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n { ...message, timestamp: Date.now() },\n ...this._messages.slice(messageIndex + 1)\n ]\n\n this.updateMessages(updatedMessages)\n }\n\n private handlePartStart(message: Message, event: Extract<StreamEvent, { type: 'part-start' }>): void {\n const contentIndex = message.content.length\n\n // Create initial content based on type\n let initialContent: MessageContent\n\n switch (event.part.type) {\n case 'assistant_thought':\n // Initialize as array for assistant thoughts\n initialContent = {\n type: event.part.type,\n data: [],\n parentId: event.part.parentId\n } as any\n break\n\n case 'text':\n // Initialize as empty string for text\n initialContent = {\n type: event.part.type,\n data: '',\n parentId: event.part.parentId\n } as any\n break\n\n default:\n initialContent = {\n type: event.part.type,\n parentId: event.part.parentId\n } as any\n }\n\n // Add to message with new reference\n message.content = [...message.content, initialContent]\n\n // Track current part\n this._currentPart = {\n messageId: message.id,\n contentIndex,\n type: event.part.type,\n parentId: event.part.parentId\n }\n }\n\n private handleTextDelta(message: Message, event: Extract<StreamEvent, { type: 'text-delta' }>): void {\n if (!this._currentPart) {\n console.warn('Received text-delta without part-start')\n return\n }\n\n const content = message.content[this._currentPart.contentIndex] as any\n\n if (content.type === 'assistant_thought') {\n // For assistant thoughts, push each delta as a new array item\n if (!Array.isArray(content.data)) {\n content.data = []\n }\n if (event.delta.trim()) {\n content.data.push(event.delta.trim())\n }\n } else {\n // For text and other types, concatenate into a single string\n content.data = (content.data || '') + event.delta\n }\n }\n\n private handlePartFinish(): void {\n if (!this._currentPart) {\n console.warn('Received part-finish without part-start')\n return\n }\n\n // Part is complete, clear tracking\n this._currentPart = null\n }\n\n private updateMessageStatus(messageId: string, status: MessageStatus): void {\n const messageIndex = this._messages.findIndex(m => m.id === messageId)\n if (messageIndex === -1) return\n\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n {\n ...this._messages[messageIndex],\n status\n },\n ...this._messages.slice(messageIndex + 1)\n ]\n\n this.updateMessages(updatedMessages)\n }\n\n public clear(): void {\n this.updateMessages([])\n }\n\n public cancelRun(): void {\n if (!this._isRunning || !this._abortController) {\n return\n }\n\n this._abortController.abort()\n }\n\n public reset(messages: Message[] = []): void {\n this.updateMessages([...messages])\n }\n\n public setConversationId(conversationId: string | undefined): void {\n this._conversationId = conversationId\n this.notifySubscribers()\n }\n\n public setTitle(title: string | undefined): void {\n this._title = title\n this.notifySubscribers()\n }\n}\n","import { CapabilityExecutionManager } from '../../core'\nimport { StreamAdapter, ThreadListAdapter } from '../../types/adapters'\nimport { ThreadListItemState } from '../../types/thread'\nimport { generateThreadId } from '../../utils/idGenerator'\nimport { BaseSubscribable } from '../../utils/Subscribable'\nimport { ThreadListItemRuntime } from '../ThreadListItemRuntime/ThreadListItemRuntime'\nimport { ThreadRuntime } from '../ThreadRuntime/ThreadRuntime'\nimport { ThreadRuntimeCore } from '../ThreadRuntime/ThreadRuntimeCore'\n\nexport interface ThreadListState {\n mainThreadId: string\n threads: readonly string[]\n isLoading: boolean\n threadItems: Record<string, ThreadListItemState>\n}\n\nexport interface ThreadListRuntimeConfig {\n streamAdapter: StreamAdapter\n threadListAdapter?: ThreadListAdapter\n capabilityExecutionManager?: CapabilityExecutionManager\n}\n\nexport class ThreadListRuntime extends BaseSubscribable {\n private _mainThreadId: string\n private _threads = new Map<string, ThreadRuntime>()\n private _threadItems = new Map<string, ThreadListItemRuntime>()\n private _threadStates = new Map<string, ThreadListItemState>()\n private _isLoading = false\n public readonly main: ThreadRuntime\n\n constructor(private config: ThreadListRuntimeConfig) {\n super()\n\n // Create main thread\n this._mainThreadId = generateThreadId()\n const mainCore = new ThreadRuntimeCore({\n streamAdapter: config.streamAdapter,\n capabilityExecutionManager: config.capabilityExecutionManager\n })\n this.main = new ThreadRuntime(mainCore)\n this._threads.set(this._mainThreadId, this.main)\n\n // Create main thread state\n const mainState: ThreadListItemState = {\n id: this._mainThreadId,\n title: 'New Chat',\n status: { type: 'regular' },\n isMain: true,\n createdAt: Date.now(),\n updatedAt: Date.now()\n }\n this._threadStates.set(this._mainThreadId, mainState)\n\n // Create main thread item\n const mainItem = new ThreadListItemRuntime({\n state: mainState,\n onSwitchTo: this.switchToThread.bind(this),\n onRename: this.renameThread.bind(this),\n onDelete: this.deleteThread.bind(this)\n })\n this._threadItems.set(this._mainThreadId, mainItem)\n }\n\n public get isLoading(): boolean {\n return this._isLoading\n }\n\n /**\n * Get the currently active main thread\n */\n public getMainThread(): ThreadRuntime {\n const mainThread = this._threads.get(this._mainThreadId)\n if (!mainThread) {\n return this.main\n }\n return mainThread\n }\n\n public getState(): ThreadListState {\n const threads: string[] = []\n const threadItems: Record<string, ThreadListItemState> = {}\n\n for (const [id, state] of this._threadStates) {\n threadItems[id] = state\n if (state.status.type === 'regular') {\n threads.push(id)\n }\n }\n\n return {\n mainThreadId: this._mainThreadId,\n threads,\n isLoading: this._isLoading,\n threadItems\n }\n }\n\n public async switchToThread(threadId: string): Promise<void> {\n const thread = this._threads.get(threadId)\n if (!thread) {\n throw new Error(`Thread ${threadId} not found`)\n }\n\n // Update old main thread\n const oldMainState = this._threadStates.get(this._mainThreadId)\n if (oldMainState) {\n oldMainState.isMain = false\n this._threadStates.set(this._mainThreadId, oldMainState)\n this._threadItems.get(this._mainThreadId)?.updateState(oldMainState)\n }\n\n // Update new main thread\n this._mainThreadId = threadId\n const newMainState = this._threadStates.get(threadId)\n if (newMainState) {\n newMainState.isMain = true\n this._threadStates.set(threadId, newMainState)\n this._threadItems.get(threadId)?.updateState(newMainState)\n\n // Update thread's conversationId and title\n thread.setConversationId(newMainState.conversationId)\n thread.setTitle(newMainState.title)\n }\n\n // Load thread messages if adapter exists\n if (this.config.threadListAdapter && newMainState?.conversationId) {\n this._isLoading = true\n this.notifySubscribers()\n\n try {\n const messages = await this.config.threadListAdapter.loadThread(threadId)\n thread.reset(messages)\n } catch (error) {\n console.error('Failed to load thread:', error)\n } finally {\n this._isLoading = false\n }\n }\n\n this.notifySubscribers()\n }\n\n public async switchToNewThread(): Promise<void> {\n const newThreadId = generateThreadId()\n const newCore = new ThreadRuntimeCore({\n streamAdapter: this.config.streamAdapter,\n capabilityExecutionManager: this.config.capabilityExecutionManager\n })\n const newThread = new ThreadRuntime(newCore)\n\n this._threads.set(newThreadId, newThread)\n\n // Create new thread state\n const newState: ThreadListItemState = {\n id: newThreadId,\n title: 'New Chat',\n status: { type: 'regular' },\n isMain: false,\n createdAt: Date.now(),\n updatedAt: Date.now()\n }\n this._threadStates.set(newThreadId, newState)\n\n // Create new thread item\n const newItem = new ThreadListItemRuntime({\n state: newState,\n onSwitchTo: this.switchToThread.bind(this),\n onRename: this.renameThread.bind(this),\n onDelete: this.deleteThread.bind(this)\n })\n this._threadItems.set(newThreadId, newItem)\n\n // Subscribe to new thread changes\n newThread.subscribe(() => {\n this.notifySubscribers()\n })\n\n // Create thread via adapter if exists\n if (this.config.threadListAdapter) {\n try {\n const createdState = await this.config.threadListAdapter.createThread()\n newState.conversationId = createdState.conversationId\n this._threadStates.set(newThreadId, newState)\n newItem.updateState(newState)\n } catch (error) {\n console.error('Failed to create thread:', error)\n }\n }\n\n await this.switchToThread(newThreadId)\n }\n\n public async loadThreads(): Promise<void> {\n if (!this.config.threadListAdapter) {\n console.warn('No threadListAdapter configured')\n return\n }\n\n this._isLoading = true\n this.notifySubscribers()\n\n try {\n const threadStates = await this.config.threadListAdapter.loadThreads()\n\n for (const state of threadStates) {\n if (this._threadStates.has(state.id)) {\n continue\n }\n\n const threadCore = new ThreadRuntimeCore({\n streamAdapter: this.config.streamAdapter\n })\n const thread = new ThreadRuntime(threadCore)\n this._threads.set(state.id, thread)\n\n this._threadStates.set(state.id, state)\n\n // Create thread item\n const threadItem = new ThreadListItemRuntime({\n state,\n onSwitchTo: this.switchToThread.bind(this),\n onRename: this.renameThread.bind(this),\n onDelete: this.deleteThread.bind(this)\n })\n this._threadItems.set(state.id, threadItem)\n\n // Subscribe to thread changes\n thread.subscribe(() => {\n this.notifySubscribers()\n })\n }\n } catch (error) {\n console.error('Failed to load threads:', error)\n } finally {\n this._isLoading = false\n this.notifySubscribers()\n }\n }\n\n private async renameThread(threadId: string, newTitle: string): Promise<void> {\n const state = this._threadStates.get(threadId)\n if (!state) return\n\n state.title = newTitle\n state.updatedAt = Date.now()\n this._threadStates.set(threadId, state)\n this._threadItems.get(threadId)?.updateState(state)\n\n if (this.config.threadListAdapter) {\n try {\n await this.config.threadListAdapter.updateThread(threadId, { title: newTitle })\n } catch (error) {\n console.error('Failed to rename thread:', error)\n }\n }\n\n this.notifySubscribers()\n }\n\n private async deleteThread(threadId: string): Promise<void> {\n if (threadId === this._mainThreadId && this._threads.size === 1) {\n throw new Error('Cannot delete the last thread')\n }\n\n // If deleting main thread, switch to another thread first\n if (threadId === this._mainThreadId) {\n const otherThreadId = Array.from(this._threads.keys()).find(id => id !== threadId)\n if (otherThreadId) {\n await this.switchToThread(otherThreadId)\n }\n }\n\n this._threads.delete(threadId)\n this._threadItems.delete(threadId)\n this._threadStates.delete(threadId)\n\n if (this.config.threadListAdapter) {\n try {\n await this.config.threadListAdapter.deleteThread(threadId)\n } catch (error) {\n console.error('Failed to delete thread:', error)\n }\n }\n\n this.notifySubscribers()\n }\n}\n","import { CapabilityExecutionManager, CapabilityRegistry } from '../../core'\nimport { PluginRegistry } from '../../core/PluginRegistry'\nimport { Message } from '../../types/message'\nimport { ChatPlugin } from '../../types/plugin'\nimport { BaseSubscribable } from '../../utils/Subscribable'\nimport { ContentFocusRuntime } from '../ContentFocusRuntime/ContentFocusRuntime'\nimport { ThreadListRuntime, ThreadListRuntimeConfig } from '../ThreadListRuntime/ThreadListRuntime'\nimport { ThreadRuntime } from '../ThreadRuntime/ThreadRuntime'\n\nexport interface AssistantRuntimeConfig extends ThreadListRuntimeConfig {\n plugins?: ChatPlugin[]\n}\n\nexport class AssistantRuntime extends BaseSubscribable {\n public readonly threads: ThreadListRuntime\n public readonly pluginRegistry: PluginRegistry\n public readonly capabilityRegistry: CapabilityRegistry\n public readonly capabilityExecutionManager: CapabilityExecutionManager\n private _contentFocusRuntime: ContentFocusRuntime\n private _currentThreadUnsubscribe?: () => void\n\n constructor(config: AssistantRuntimeConfig) {\n super()\n\n // Initialize plugin registry\n this.pluginRegistry = new PluginRegistry()\n if (config.plugins) {\n config.plugins.forEach(plugin => {\n this.pluginRegistry.registerPlugin(plugin)\n })\n }\n\n // Initialize capability registry\n this.capabilityRegistry = new CapabilityRegistry()\n this.capabilityExecutionManager = new CapabilityExecutionManager(name => this.capabilityRegistry.getHandler(name))\n\n // Initialize thread list\n this.threads = new ThreadListRuntime({\n streamAdapter: config.streamAdapter,\n threadListAdapter: config.threadListAdapter,\n capabilityExecutionManager: this.capabilityExecutionManager\n })\n\n this._contentFocusRuntime = new ContentFocusRuntime()\n\n // Subscribe to content focus changes\n this._contentFocusRuntime.subscribe(() => {\n this.notifySubscribers()\n })\n\n // Subscribe to thread list changes (including thread switches)\n this.threads.subscribe(() => {\n // Re-subscribe to the new main thread when it changes\n this.subscribeToCurrentThread()\n this.notifySubscribers()\n })\n\n // Initial subscription to main thread\n this.subscribeToCurrentThread()\n }\n\n public get thread(): ThreadRuntime {\n return this.threads.getMainThread()\n }\n\n public get contentFocus(): ContentFocusRuntime {\n return this._contentFocusRuntime\n }\n\n /**\n * Register a plugin\n */\n public registerPlugin(plugin: ChatPlugin): void {\n this.pluginRegistry.registerPlugin(plugin)\n\n plugin.init?.({\n streamingEnabled: true,\n feedbackEnabled: false,\n detailPanelEnabled: true\n })\n }\n\n /**\n * Unregister a plugin\n */\n public unregisterPlugin(pluginId: string): boolean {\n return this.pluginRegistry.unregisterPlugin(pluginId)\n }\n\n /**\n * Subscribe to the current main thread\n * Called when thread switches to ensure we listen to the right thread\n */\n private subscribeToCurrentThread(): void {\n // Unsubscribe from previous thread\n if (this._currentThreadUnsubscribe) {\n this._currentThreadUnsubscribe()\n }\n\n // Subscribe to new main thread\n this._currentThreadUnsubscribe = this.thread.subscribe(() => {\n this.handleMessagesChange(this.thread.messages)\n this.notifySubscribers()\n })\n }\n\n private handleMessagesChange(messages: readonly Message[]): void {\n if (messages.length === 0) return\n\n // Only auto-focus when a new assistant message completes\n const lastMessage = messages[messages.length - 1]\n\n if (lastMessage.role === 'assistant' && lastMessage.status.type === 'complete') {\n this.autoFocusLastContent(messages)\n }\n }\n\n private autoFocusLastContent(messages: readonly Message[]): void {\n if (messages.length === 0) return\n if (this._contentFocusRuntime.isActive) return // Don't override existing focus\n\n // Find last assistant message\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message.role !== 'assistant') continue\n\n // Find last content with focus capability\n for (let j = message.content.length - 1; j >= 0; j--) {\n const content = message.content[j]\n const renderer = this.pluginRegistry.getRenderersByType(content.type)\n\n if (renderer.length > 0 && renderer[0].capabilities?.supportsFocus) {\n this._contentFocusRuntime.focus(content, message, j, 'detail')\n return\n }\n }\n }\n }\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/** @license React v17.0.2\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';require(\"object-assign\");var f=require(\"react\"),g=60103;exports.Fragment=60107;if(\"function\"===typeof Symbol&&Symbol.for){var h=Symbol.for;g=h(\"react.element\");exports.Fragment=h(\"react.fragment\")}var m=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,n=Object.prototype.hasOwnProperty,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,k){var b,d={},e=null,l=null;void 0!==k&&(e=\"\"+k);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(l=a.ref);for(b in a)n.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:g,type:c,key:e,ref:l,props:d,_owner:m.current}}exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { createContext, ReactNode, useContext } from 'react'\n\nimport { AssistantRuntime } from '../../runtime/AssistantRuntime/AssistantRuntime'\n\nconst AssistantRuntimeContext = createContext<AssistantRuntime | null>(null)\n\nexport interface AssistantRuntimeProviderProps {\n runtime: AssistantRuntime\n children: ReactNode\n}\n\nexport function AssistantRuntimeProvider({ runtime, children }: AssistantRuntimeProviderProps): JSX.Element {\n return <AssistantRuntimeContext.Provider value={runtime}>{children}</AssistantRuntimeContext.Provider>\n}\n\nexport function useAssistantRuntimeContext(): AssistantRuntime {\n const runtime = useContext(AssistantRuntimeContext)\n if (!runtime) {\n throw new Error('useAssistantRuntimeContext must be used within AssistantRuntimeProvider')\n }\n return runtime\n}\n","import { AssistantRuntime } from '../../runtime/AssistantRuntime/AssistantRuntime'\nimport { useAssistantRuntimeContext } from '../providers/AssistantRuntimeProvider'\n\nexport function useAssistantRuntime(): AssistantRuntime {\n return useAssistantRuntimeContext()\n}\n","import { useEffect, useState } from 'react'\n\nimport { ThreadListState } from '../../runtime/ThreadListRuntime/ThreadListRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useThreadList() {\n const runtime = useAssistantRuntime()\n\n return {\n switchToThread: (threadId: string) => runtime.threads.switchToThread(threadId),\n switchToNewThread: () => runtime.threads.switchToNewThread(),\n loadThreads: () => runtime.threads.loadThreads?.(),\n renameThread: (threadId: string, title: string) => runtime.threads['renameThread']?.(threadId, title),\n deleteThread: (threadId: string) => runtime.threads['deleteThread']?.(threadId)\n }\n}\n\nexport function useThreadListState() {\n const runtime = useAssistantRuntime()\n const [state, setState] = useState<ThreadListState>(runtime.threads.getState())\n\n useEffect(() => {\n const unsubscribe = runtime.threads.subscribe(() => {\n setState(runtime.threads.getState())\n })\n return unsubscribe\n }, [runtime])\n\n return state\n}\n","import { ThreadRuntime } from '../../runtime/ThreadRuntime/ThreadRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCurrentThread(): ThreadRuntime {\n const mainThread = useAssistantRuntime().threads.getMainThread()\n return mainThread\n}\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","import { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { Message } from '../../types/message'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useMessages(): readonly Message[] {\n const runtime = useAssistantRuntime()\n\n return useSyncExternalStore(\n callback => {\n // Subscribe to runtime, which notifies when thread switches\n // or when the current thread's messages change\n return runtime.subscribe(() => {\n callback()\n })\n },\n\n () => {\n // Always get messages from the current main thread\n return runtime.thread.messages\n },\n () => runtime.thread.messages\n )\n}\n","import { useState } from 'react'\n\nimport { useCurrentThread } from './useCurrentThread'\n\nexport function useComposer() {\n const thread = useCurrentThread()\n const [text, setText] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const send = async (e?: React.FormEvent) => {\n e?.preventDefault()\n\n if (!text.trim() || isSubmitting) return\n\n const messageText = text\n setText('')\n setIsSubmitting(true)\n\n try {\n await thread.send(messageText)\n } catch (error) {\n console.error('Failed to send message:', error)\n setText(messageText)\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return {\n text,\n setText,\n isSubmitting,\n send,\n clear: () => setText(''),\n append: (value: string) => setText(prev => prev + value)\n }\n}\n","import { FocusContext } from '../../runtime/ContentFocusRuntime/ContentFocusRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useContentRenderer(contentType: string, context?: FocusContext) {\n const runtime = useAssistantRuntime()\n const renderer = runtime.pluginRegistry.getBestRendererForType(contentType)\n\n if (!renderer) {\n return {\n component: null,\n auxiliaryComponent: null,\n supportsFocus: false,\n supportsPreview: false,\n supportsFullscreen: false\n }\n }\n\n // Get auxiliary component for specific context\n const auxiliaryComponent = context ? renderer.auxiliary?.[context] : null\n\n return {\n component: renderer.component,\n auxiliaryComponent,\n supportsFocus: renderer.capabilities?.supportsFocus ?? false,\n supportsPreview: renderer.capabilities?.supportsPreview ?? false,\n supportsFullscreen: renderer.capabilities?.supportsFullscreen ?? false\n }\n}\n\nexport function useHasAuxiliaryView(contentType: string, context: FocusContext): boolean {\n const runtime = useAssistantRuntime()\n const renderer = runtime.pluginRegistry.getBestRendererForType(contentType)\n return !!renderer?.auxiliary?.[context]\n}\n\nexport function useSupportsFocus(contentType: string): boolean {\n const runtime = useAssistantRuntime()\n const renderer = runtime.pluginRegistry.getBestRendererForType(contentType)\n return renderer?.capabilities?.supportsFocus ?? false\n}\n","import { useEffect, useState } from 'react'\n\nimport { ContentFocusState, FocusContext } from '../../runtime/ContentFocusRuntime/ContentFocusRuntime'\nimport { Message, MessageContent } from '../../types/message'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useContentFocus() {\n const runtime = useAssistantRuntime()\n const [state, setState] = useState<ContentFocusState>(runtime.contentFocus.state)\n\n useEffect(() => {\n const unsubscribe = runtime.contentFocus.subscribe(() => {\n setState(runtime.contentFocus.state)\n })\n return unsubscribe\n }, [runtime])\n\n return {\n ...state,\n focus: (content: MessageContent, message: Message, contentIndex: number, context?: FocusContext) =>\n runtime.contentFocus.focus(content, message, contentIndex, context),\n blur: () => runtime.contentFocus.blur(),\n toggle: (content: MessageContent, message: Message, contentIndex: number, context?: FocusContext) =>\n runtime.contentFocus.toggle(content, message, contentIndex, context),\n switchContext: (context: FocusContext) => runtime.contentFocus.switchContext(context),\n focusNext: () => runtime.contentFocus.focusNext(runtime.thread.messages),\n focusPrevious: () => runtime.contentFocus.focusPrevious(runtime.thread.messages)\n }\n}\n\nexport function useContentFocusState() {\n const runtime = useAssistantRuntime()\n const [state, setState] = useState<ContentFocusState>(runtime.contentFocus.state)\n\n useEffect(() => {\n const unsubscribe = runtime.contentFocus.subscribe(() => {\n setState(runtime.contentFocus.state)\n })\n return unsubscribe\n }, [runtime])\n\n return state\n}\n","import { useEffect } from 'react'\n\nimport { CapabilityConfig } from '../../types/capability'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCapability<TArgs = any, TResult = any>(config: CapabilityConfig<TArgs, TResult>): void {\n const runtime = useAssistantRuntime()\n\n useEffect(() => {\n // Register handler\n if (config.execute) {\n runtime.capabilityRegistry.registerHandler(config.name, { execute: config.execute })\n }\n\n // Register renderer\n if (config.render) {\n runtime.capabilityRegistry.registerRenderer(config.name, {\n component: config.render\n })\n }\n\n // Cleanup on unmount\n return () => {\n runtime.capabilityRegistry.unregister(config.name)\n }\n }, [config.name, runtime])\n}\n","import { useEffect, useReducer, useState } from 'react'\n\nimport { CapabilityExecution } from '../../types/capability'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCapabilityExecution(capabilityId: string): CapabilityExecution | undefined {\n const runtime = useAssistantRuntime()\n const [execution, setExecution] = useState<CapabilityExecution | undefined>(() =>\n runtime.capabilityExecutionManager.getExecution(capabilityId)\n )\n const [, forceUpdate] = useReducer(x => x + 1, 0)\n\n useEffect(() => {\n // Get initial state\n const initialExecution = runtime.capabilityExecutionManager.getExecution(capabilityId)\n setExecution(initialExecution)\n\n // Subscribe to updates\n const unsubscribe = runtime.capabilityExecutionManager.subscribe(id => {\n if (id === capabilityId) {\n const updatedExecution = runtime.capabilityExecutionManager.getExecution(capabilityId)\n setExecution(updatedExecution)\n forceUpdate()\n }\n })\n\n return unsubscribe\n }, [capabilityId, runtime])\n\n return execution\n}\n","import { CapabilityContent } from '../../types/capability'\nimport { Message, MessageContent } from '../../types/message'\nimport { useAssistantRuntime } from '../hooks/useAssistantRuntime'\nimport { useCapabilityExecution } from '../hooks/useCapabilityExecution'\n\nexport interface CapabilityRendererProps {\n message: Message\n content: MessageContent\n}\n\nexport function CapabilityRendererComp({ message, content }: CapabilityRendererProps) {\n const runtime = useAssistantRuntime()\n const capabilityContent = content as CapabilityContent\n const execution = useCapabilityExecution(capabilityContent.capabilityId)\n\n const renderer = runtime.capabilityRegistry.getRenderer(capabilityContent.capabilityName)\n\n if (!renderer || !execution) {\n return null\n }\n\n const Component = renderer.component\n\n return (\n <Component\n capabilityName={execution.name}\n capabilityId={execution.id}\n args={execution.args}\n result={execution.result}\n status={execution.status}\n message={message}\n />\n )\n}\n","import { Message, MessageContent } from '../../types/message'\nimport { useContentRenderer } from '../hooks/useContentRenderer'\nimport { CapabilityRendererComp } from './CapabilityRenderer'\n\nexport function ContentRenderer({ message, content }: { message: Message; content: MessageContent }) {\n const { component } = useContentRenderer(content.type)\n\n if (content.type === 'capability') {\n return <CapabilityRendererComp message={message} content={content} />\n }\n\n if (!component) {\n return null\n }\n\n const Component = component\n return <Component content={content} message={message} />\n}\n","import { AuxiliaryRendererProps } from '../../types/plugin'\nimport { useContentRenderer } from '../hooks'\n\nexport function AuxiliaryRenderer({\n message,\n content,\n context,\n onClose,\n onNavigate,\n onSwitchContext\n}: AuxiliaryRendererProps) {\n const { auxiliaryComponent } = useContentRenderer(content.type, context)\n\n if (!auxiliaryComponent) {\n return null\n }\n\n const Component = auxiliaryComponent\n return (\n <Component\n content={content}\n message={message}\n context={context}\n onClose={onClose}\n onNavigate={onNavigate}\n onSwitchContext={onSwitchContext}\n />\n )\n}\n","import { FC } from 'react'\n\nimport { CapabilityConfig } from '../../types'\nimport { useCapability } from '../hooks/useCapability'\n\nexport function makeCapability<TArgs = any, TResult = any>(config: CapabilityConfig<TArgs, TResult>): FC {\n const Capability: FC = () => {\n useCapability(config)\n return null\n }\n\n Capability.displayName = `Capability(${config.name})`\n\n return Capability\n}\n","import { StreamAdapter, StreamChunk } from '../types/adapters'\nimport { Message } from '../types/message'\n\nexport interface SSEEvent {\n event: string\n data: any\n}\n\nexport abstract class BaseSSEStreamAdapter<TAllowedEvents extends readonly string[] = readonly string[]>\n implements StreamAdapter\n{\n protected abstract prepareRequest(params: { messages: Message[]; conversationId?: string; signal?: AbortSignal }): {\n url: string\n options: RequestInit\n }\n\n protected abstract convertEvent(event: SSEEvent & { event: TAllowedEvents[number] }): StreamChunk | null\n\n protected getAllowedEvents(): TAllowedEvents | null {\n return null\n }\n\n protected shouldProcessEvent(eventType: string): boolean {\n const allowedEvents = this.getAllowedEvents()\n if (!allowedEvents) return true\n return allowedEvents.includes(eventType)\n }\n\n async *stream(params: {\n messages: Message[]\n conversationId?: string\n signal?: AbortSignal\n }): AsyncGenerator<StreamChunk, void, unknown> {\n const { signal } = params\n const { url, options } = this.prepareRequest(params)\n\n const response = await fetch(url, { ...options, signal })\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n if (!response.body) {\n throw new Error('Response body is null')\n }\n\n yield* this.parseSSEStream(response.body, signal)\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk, void, unknown> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let currentEvent: string | null = null\n\n try {\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const { done, value } = await reader.read()\n\n if (done) break\n if (signal?.aborted) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n\n if (!trimmedLine) {\n currentEvent = null\n continue\n }\n\n if (trimmedLine === ': ping') {\n continue\n }\n\n if (trimmedLine.startsWith('event:')) {\n currentEvent = trimmedLine.substring(6).trim()\n continue\n }\n\n if (trimmedLine.startsWith('data:')) {\n const dataStr = trimmedLine.substring(5).trim()\n\n if (dataStr === 'eof' || trimmedLine === 'eof') {\n break\n }\n\n try {\n const data = JSON.parse(dataStr)\n\n if (currentEvent && this.shouldProcessEvent(currentEvent)) {\n const chunk = this.convertEvent({\n event: currentEvent as TAllowedEvents[number],\n data\n })\n if (chunk) {\n yield chunk\n }\n }\n } catch (e) {\n // handle error\n }\n\n currentEvent = null\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n }\n}\n"],"names":["PluginRegistry","__publicField","plugin","renderer","renderers","a","b","pluginId","filteredRenderers","r","type","CapabilityRegistry","name","handler","CapabilityExecutionManager","getHandler","id","args","messageId","strategy","execution","executionId","running","result","error","errorMessage","index","e","callback","BaseSubscribable","ContentFocusRuntime","content","message","contentIndex","context","messages","currentMsgIndex","m","currentMsg","currentContentIndex","nextContent","nextMsg","prevContent","prevMsg","lastIndex","messageIdCounter","threadIdCounter","generateMessageId","generateThreadId","ThreadListItemRuntime","config","state","newTitle","ComposerRuntime","text","isSubmitting","ThreadRuntime","_core","conversationId","title","ThreadRuntimeCore","_b","_a","newMessage","userMessage","assistantMessageId","assistantMessage","stream","event","messageIndex","metadataEvent","capabilityEvent","errorEvent","customEvent","updatedMessages","initialContent","status","ThreadListRuntime","mainCore","mainState","mainItem","mainThread","threads","threadItems","threadId","thread","oldMainState","newMainState","newThreadId","newCore","newThread","newState","newItem","createdState","threadStates","threadCore","threadItem","otherThreadId","AssistantRuntime","lastMessage","i","j","getOwnPropertySymbols","hasOwnProperty","propIsEnumerable","toObject","val","shouldUseNative","test1","test2","order2","n","test3","letter","objectAssign","target","source","from","to","symbols","s","key","require$$0","f","require$$1","g","reactJsxRuntime_production_min","h","p","q","c","k","d","l","jsxRuntimeModule","AssistantRuntimeContext","createContext","AssistantRuntimeProvider","runtime","children","useAssistantRuntimeContext","useContext","useAssistantRuntime","useThreadList","useThreadListState","setState","useState","useEffect","useCurrentThread","React","is","x","y","objectIs","useLayoutEffect","useDebugValue","useSyncExternalStore$2","subscribe","getSnapshot","value","_useState","inst","forceUpdate","checkIfSnapshotChanged","latestGetSnapshot","nextValue","useSyncExternalStore$1","shim","useSyncExternalStoreShim_production","shimModule","useMessages","useSyncExternalStore","useComposer","setText","setIsSubmitting","messageText","prev","useContentRenderer","contentType","auxiliaryComponent","_c","_d","useContentFocus","useCapability","useCapabilityExecution","capabilityId","setExecution","useReducer","initialExecution","updatedExecution","CapabilityRendererComp","capabilityContent","Component","jsx","ContentRenderer","component","AuxiliaryRenderer","onClose","onNavigate","onSwitchContext","makeCapability","Capability","BaseSSEStreamAdapter","eventType","allowedEvents","params","signal","url","options","response","body","reader","decoder","buffer","currentEvent","done","lines","line","trimmedLine","dataStr","data","chunk"],"mappings":"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","x_google_ignoreList":[12,13,14,19,20]}
1
+ {"version":3,"file":"index.js","sources":["../src/core/PluginRegistry.ts","../src/core/CapabilityRegistry.ts","../src/core/CapabilityExecutionManager.ts","../src/utils/Subscribable.ts","../src/runtime/ContentFocusRuntime/ContentFocusRuntime.ts","../src/utils/idGenerator.ts","../src/runtime/ThreadListItemRuntime/ThreadListItemRuntime.ts","../src/runtime/ComposerRuntime/ComposerRuntime.ts","../src/runtime/ThreadRuntime/ThreadRuntime.ts","../src/runtime/ThreadRuntime/ThreadRuntimeCore.ts","../src/runtime/ThreadListRuntime/ThreadListRuntime.tsx","../src/runtime/AssistantRuntime/AssistantRuntime.tsx","../../../node_modules/.pnpm/object-assign@4.1.1/node_modules/object-assign/index.js","../../../node_modules/.pnpm/react@17.0.2/node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/.pnpm/react@17.0.2/node_modules/react/jsx-runtime.js","../src/react/providers/AssistantRuntimeProvider.tsx","../src/react/hooks/useAssistantRuntime.ts","../src/react/hooks/useThreadList.ts","../src/react/hooks/useCurrentThread.ts","../../../node_modules/.pnpm/use-sync-external-store@1.5.0_react@17.0.2/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.5.0_react@17.0.2/node_modules/use-sync-external-store/shim/index.js","../src/react/hooks/useMessages.ts","../src/react/hooks/useComposer.ts","../src/react/hooks/useContentRenderer.ts","../src/react/hooks/useContentFocus.ts","../src/react/hooks/useCapability.ts","../src/react/hooks/useCapabilityExecution.ts","../src/react/components/CapabilityRenderer.tsx","../src/react/components/ContentRenderer.tsx","../src/react/components/AuxiliaryRenderer.tsx","../src/react/utils/makeCapability.tsx","../src/utils/BaseSSEStreamAdapter.ts"],"sourcesContent":["import { ChatPlugin, MessageRenderer } from '../types/plugin'\n\nexport class PluginRegistry {\n private plugins = new Map<string, ChatPlugin>()\n private renderersByType = new Map<string, MessageRenderer[]>()\n\n public registerPlugin(plugin: ChatPlugin): void {\n if (this.plugins.has(plugin.id)) {\n // handle duplicate plugin registration\n // show a warning / error\n }\n\n this.plugins.set(plugin.id, plugin)\n\n plugin.renderers.forEach(renderer => {\n const renderers = this.renderersByType.get(renderer.type) || []\n renderers.push(renderer)\n renderers.sort((a, b) => (b?.priority ?? 0) - (a?.priority ?? 0))\n this.renderersByType.set(renderer.type, renderers)\n })\n }\n\n public unregisterPlugin(pluginId: string): boolean {\n const plugin = this.plugins.get(pluginId)\n if (!plugin) {\n return false\n }\n\n plugin.renderers.forEach(renderer => {\n const renderers = this.renderersByType.get(renderer.type) || []\n const filteredRenderers = renderers.filter(r => !plugin.renderers.includes(r))\n\n if (filteredRenderers.length === 0) {\n this.renderersByType.delete(renderer.type)\n } else {\n this.renderersByType.set(renderer.type, filteredRenderers)\n }\n })\n\n return this.plugins.delete(pluginId)\n }\n\n public getPlugin(pluginId: string): ChatPlugin | undefined {\n return this.plugins.get(pluginId)\n }\n\n public getAllPlugins(): ChatPlugin[] {\n return Array.from(this.plugins.values())\n }\n\n public getRenderersByType(type: string): MessageRenderer[] {\n return this.renderersByType.get(type) || []\n }\n\n public getBestRendererForType(type: string): MessageRenderer | undefined {\n const renderers = this.getRenderersByType(type)\n return renderers[0]\n }\n\n public clear(): void {\n this.plugins.clear()\n this.renderersByType.clear()\n }\n}\n","import { CapabilityHandler, CapabilityRenderer } from '../types/capability'\n\nexport class CapabilityRegistry {\n private handlers = new Map<string, CapabilityHandler>()\n private renderers = new Map<string, CapabilityRenderer>()\n\n public registerHandler(name: string, handler: CapabilityHandler): void {\n this.handlers.set(name, handler)\n }\n\n public registerRenderer(name: string, renderer: CapabilityRenderer): void {\n this.renderers.set(name, renderer)\n }\n\n public unregister(name: string): void {\n this.handlers.delete(name)\n this.renderers.delete(name)\n }\n\n public getHandler(name: string): CapabilityHandler | undefined {\n return this.handlers.get(name)\n }\n\n public getRenderer(name: string): CapabilityRenderer | undefined {\n return this.renderers.get(name)\n }\n\n public getStrategy() {\n return 'queue'\n }\n\n public hasHandler(name: string): boolean {\n return this.handlers.has(name)\n }\n\n public hasRenderer(name: string): boolean {\n return this.renderers.has(name)\n }\n\n public clear(): void {\n this.handlers.clear()\n this.renderers.clear()\n }\n\n public getAllCapabilityNames(): string[] {\n return Array.from(new Set([...this.handlers.keys(), ...this.renderers.keys()]))\n }\n}\n","import { CapabilityExecution, CapabilityHandler } from '../types/capability'\n\nexport class CapabilityExecutionManager {\n private executions = new Map<string, CapabilityExecution>()\n private executionQueue: string[] = []\n private isProcessing = false\n private runningByName = new Map<string, string[]>()\n private subscribers = new Set<(executionId: string) => void>()\n private getHandler: (name: string) => CapabilityHandler | undefined\n\n constructor(getHandler: (name: string) => CapabilityHandler | undefined) {\n this.getHandler = getHandler\n }\n\n public async executeCapability<TArgs, TResult>(\n name: string,\n id: string,\n args: TArgs,\n messageId: string,\n strategy = 'queue'\n ): Promise<void> {\n const handler = this.getHandler(name)\n if (!handler) {\n console.warn(`No handler registered for capability: ${name}`)\n return\n }\n\n const execution: CapabilityExecution<TArgs, TResult> = {\n id,\n name,\n args,\n status: { type: 'queued' },\n timestamp: Date.now(),\n messageId\n }\n\n this.executions.set(id, execution)\n this.notifySubscribers(id)\n\n switch (strategy) {\n case 'queue':\n default:\n this.executionQueue.push(id)\n break\n }\n\n if (!this.isProcessing) {\n this.processQueue()\n }\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessing || this.executionQueue.length === 0) {\n return\n }\n\n this.isProcessing = true\n\n while (this.executionQueue.length > 0) {\n const executionId = this.executionQueue.shift()!\n const execution = this.executions.get(executionId)\n\n if (!execution) continue\n\n const handler = this.getHandler(execution.name)\n if (!handler) continue\n\n execution.status = { type: 'running' }\n this.notifySubscribers(executionId)\n\n const running = this.runningByName.get(execution.name) || []\n running.push(executionId)\n this.runningByName.set(execution.name, running)\n\n try {\n const result = await handler.execute(execution.args, {\n messageId: execution.messageId,\n capabilityId: executionId\n })\n\n execution.status = { type: 'complete', result }\n execution.result = result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n execution.status = { type: 'error', error: errorMessage }\n execution.error = errorMessage\n } finally {\n const running = this.runningByName.get(execution.name) || []\n const index = running.indexOf(executionId)\n if (index > -1) {\n running.splice(index, 1)\n }\n if (running.length === 0) {\n this.runningByName.delete(execution.name)\n } else {\n this.runningByName.set(execution.name, running)\n }\n\n this.notifySubscribers(executionId)\n }\n }\n\n this.isProcessing = false\n }\n\n public getExecution(id: string): CapabilityExecution | undefined {\n return this.executions.get(id)\n }\n\n public getExecutionsByMessage(messageId: string): CapabilityExecution[] {\n return Array.from(this.executions.values()).filter(e => e.messageId === messageId)\n }\n\n public subscribe(callback: (executionId: string) => void): () => void {\n this.subscribers.add(callback)\n return () => this.subscribers.delete(callback)\n }\n\n private notifySubscribers(executionId: string): void {\n this.subscribers.forEach(callback => callback(executionId))\n }\n\n public clear(): void {\n this.executions.clear()\n this.executionQueue = []\n this.runningByName.clear()\n }\n}\n","export type Unsubscribe = () => void\n\nexport abstract class BaseSubscribable {\n private _subscriptions = new Set<() => void>()\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback)\n return () => {\n this._subscriptions.delete(callback)\n }\n }\n\n protected notifySubscribers(): void {\n for (const callback of this._subscriptions) {\n callback()\n }\n }\n\n protected getSubscriberCount(): number {\n return this._subscriptions.size\n }\n}\n","import { Message, MessageContent } from '../../types/message'\nimport { BaseSubscribable } from '../../utils/Subscribable'\n\nexport type FocusContext = 'detail'\n\nexport interface ContentFocusState {\n isActive: boolean\n context: FocusContext | null\n focusedContent: MessageContent | null\n focusedMessage: Message | null\n focusedMessageId: string | null\n focusedContentIndex: number | null\n}\n\nexport class ContentFocusRuntime extends BaseSubscribable {\n private _state: ContentFocusState = {\n isActive: false,\n context: null,\n focusedContent: null,\n focusedMessage: null,\n focusedMessageId: null,\n focusedContentIndex: null\n }\n\n public get state(): ContentFocusState {\n return this._state\n }\n\n public get isActive(): boolean {\n return this._state.isActive\n }\n\n public get context(): FocusContext | null {\n return this._state.context\n }\n\n public get focusedContent(): MessageContent | null {\n return this._state.focusedContent\n }\n\n public get focusedMessage(): Message | null {\n return this._state.focusedMessage\n }\n\n public get focusedMessageId(): string | null {\n return this._state.focusedMessageId\n }\n\n public get focusedContentIndex(): number | null {\n return this._state.focusedContentIndex\n }\n\n public focus(\n content: MessageContent,\n message: Message,\n contentIndex: number,\n context: FocusContext = 'detail'\n ): void {\n this._state = {\n isActive: true,\n context,\n focusedContent: content,\n focusedMessage: message,\n focusedMessageId: message.id,\n focusedContentIndex: contentIndex\n }\n this.notifySubscribers()\n }\n\n public blur(): void {\n this._state = {\n isActive: false,\n context: null,\n focusedContent: null,\n focusedMessage: null,\n focusedMessageId: null,\n focusedContentIndex: null\n }\n this.notifySubscribers()\n }\n\n public toggle(\n content: MessageContent,\n message: Message,\n contentIndex: number,\n context: FocusContext = 'detail'\n ): void {\n if (\n this._state.isActive &&\n this._state.focusedMessageId === message.id &&\n this._state.focusedContentIndex === contentIndex &&\n this._state.context === context\n ) {\n this.blur()\n } else {\n this.focus(content, message, contentIndex, context)\n }\n }\n\n public switchContext(context: FocusContext): void {\n if (this._state.isActive && this._state.focusedContent) {\n this._state = {\n ...this._state,\n context\n }\n this.notifySubscribers()\n }\n }\n\n public focusNext(messages: readonly Message[]): void {\n if (!this._state.focusedMessageId || !messages.length) return\n\n const currentMsgIndex = messages.findIndex(m => m.id === this._state.focusedMessageId)\n if (currentMsgIndex === -1) return\n\n const currentMsg = messages[currentMsgIndex]\n const currentContentIndex = this._state.focusedContentIndex ?? 0\n\n if (currentContentIndex + 1 < currentMsg.content.length) {\n const nextContent = currentMsg.content[currentContentIndex + 1]\n this.focus(nextContent, currentMsg, currentContentIndex + 1, this._state.context || 'detail')\n return\n }\n\n // Try first content in next message\n if (currentMsgIndex + 1 < messages.length) {\n const nextMsg = messages[currentMsgIndex + 1]\n if (nextMsg.content.length > 0) {\n this.focus(nextMsg.content[0], nextMsg, 0, this._state.context || 'detail')\n }\n }\n }\n\n public focusPrevious(messages: readonly Message[]): void {\n if (!this._state.focusedMessageId || !messages.length) return\n\n const currentMsgIndex = messages.findIndex(m => m.id === this._state.focusedMessageId)\n if (currentMsgIndex === -1) return\n\n const currentMsg = messages[currentMsgIndex]\n const currentContentIndex = this._state.focusedContentIndex ?? 0\n\n if (currentContentIndex > 0) {\n const prevContent = currentMsg.content[currentContentIndex - 1]\n this.focus(prevContent, currentMsg, currentContentIndex - 1, this._state.context || 'detail')\n return\n }\n\n // Try last content in previous message\n if (currentMsgIndex > 0) {\n const prevMsg = messages[currentMsgIndex - 1]\n if (prevMsg.content.length > 0) {\n const lastIndex = prevMsg.content.length - 1\n this.focus(prevMsg.content[lastIndex], prevMsg, lastIndex, this._state.context || 'detail')\n }\n }\n }\n}\n","let messageIdCounter = 0\nlet threadIdCounter = 0\n\nexport function generateMessageId(): string {\n return `msg-${Date.now()}-${++messageIdCounter}`\n}\n\nexport function generateThreadId(): string {\n return `thread-${Date.now()}-${++threadIdCounter}`\n}\n\nexport function generateId(prefix = 'id'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n","import { ThreadListItemState } from '../../types/thread'\nimport { BaseSubscribable, Unsubscribe } from '../../utils/Subscribable'\n\nexport interface ThreadListItemRuntimeConfig {\n state: ThreadListItemState\n onSwitchTo: (threadId: string) => Promise<void>\n onRename: (threadId: string, title: string) => Promise<void>\n onDelete: (threadId: string) => Promise<void>\n}\n\nexport class ThreadListItemRuntime extends BaseSubscribable {\n private _state: ThreadListItemState\n\n constructor(private config: ThreadListItemRuntimeConfig) {\n super()\n this._state = config.state\n }\n\n public get state(): ThreadListItemState {\n return this._state\n }\n\n public getState(): ThreadListItemState {\n return this._state\n }\n\n public updateState(state: ThreadListItemState): void {\n this._state = state\n this.notifySubscribers()\n }\n\n public async switchTo(): Promise<void> {\n await this.config.onSwitchTo(this._state.id)\n }\n\n public async rename(newTitle: string): Promise<void> {\n await this.config.onRename(this._state.id, newTitle)\n }\n\n public async delete(): Promise<void> {\n await this.config.onDelete(this._state.id)\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return super.subscribe(callback)\n }\n}\n","import { BaseSubscribable } from '../../utils/Subscribable'\n\nexport interface ComposerState {\n text: string\n isSubmitting: boolean\n}\n\nexport class ComposerRuntime extends BaseSubscribable {\n private _text: string = ''\n private _isSubmitting: boolean = false\n\n public get text(): string {\n return this._text\n }\n\n public get isSubmitting(): boolean {\n return this._isSubmitting\n }\n\n public getState(): ComposerState {\n return {\n text: this._text,\n isSubmitting: this._isSubmitting\n }\n }\n\n public setText(text: string): void {\n this._text = text\n this.notifySubscribers()\n }\n\n public clear(): void {\n this._text = ''\n this.notifySubscribers()\n }\n\n public setSubmitting(isSubmitting: boolean): void {\n this._isSubmitting = isSubmitting\n this.notifySubscribers()\n }\n}\n\nexport default ComposerRuntime\n","import { AppendMessage, Message, TextContent } from '../../types/message'\nimport { RuntimeCapabilities, ThreadState } from '../../types/thread'\nimport { BaseSubscribable, Unsubscribe } from '../../utils/Subscribable'\nimport ComposerRuntime from '../ComposerRuntime/ComposerRuntime'\nimport { ThreadRuntimeCore } from './ThreadRuntimeCore'\n\nexport class ThreadRuntime extends BaseSubscribable {\n public readonly composer: ComposerRuntime\n\n constructor(private _core: ThreadRuntimeCore) {\n super()\n this.composer = new ComposerRuntime()\n\n // Subscribe to core changes and propagate\n this._core.subscribe(() => {\n this.notifySubscribers()\n })\n }\n\n public get messages(): readonly Message[] {\n return this._core.messages\n }\n\n public get isRunning(): boolean {\n return this._core.isRunning\n }\n\n public get isDisabled(): boolean {\n return this._core.isDisabled\n }\n\n public get capabilities(): RuntimeCapabilities {\n return this._core.capabilities\n }\n\n public get conversationId(): string | undefined {\n return this._core.conversationId\n }\n\n public get title(): string | undefined {\n return this._core.title\n }\n\n public getState(): ThreadState {\n return {\n threadId: 'main', // Will be set by ThreadListRuntime\n isDisabled: this._core.isDisabled,\n isRunning: this._core.isRunning,\n capabilities: this._core.capabilities,\n conversationId: this._core.conversationId,\n title: this._core.title\n }\n }\n\n public append(message: AppendMessage): void {\n this._core.append(message)\n }\n\n public async send(text: string): Promise<void> {\n if (!text.trim()) return\n\n this.composer.setSubmitting(true)\n\n try {\n this.composer.clear()\n await this._core.startRun({\n role: 'user',\n content: [{ type: 'text', data: text } as TextContent]\n })\n } catch (e) {\n // TODO: Handle error\n } finally {\n this.composer.setSubmitting(false)\n }\n }\n\n public cancelRun(): void {\n this._core.cancelRun()\n }\n\n public clear(): void {\n this._core.clear()\n }\n\n public reset(messages: Message[] = []): void {\n this._core.reset(messages)\n }\n\n public setConversationId(conversationId: string | undefined): void {\n this._core.setConversationId(conversationId)\n }\n\n public setTitle(title: string | undefined): void {\n this._core.setTitle(title)\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return super.subscribe(callback)\n }\n}\n","import { CapabilityExecutionManager } from '../../core'\nimport { CapabilityContent } from '../../types'\nimport { StreamAdapter, StreamEvent } from '../../types/adapters'\nimport { AppendMessage, Message, MessageContent, MessageStatus } from '../../types/message'\nimport { RuntimeCapabilities } from '../../types/thread'\nimport { generateMessageId } from '../../utils/idGenerator'\nimport { BaseSubscribable } from '../../utils/Subscribable'\n\nexport interface ThreadRuntimeCoreConfig {\n streamAdapter: StreamAdapter\n initialMessages?: Message[]\n onMessagesChange?: (messages: Message[]) => void\n capabilityExecutionManager?: CapabilityExecutionManager\n}\n\nexport class ThreadRuntimeCore extends BaseSubscribable {\n private _messages: Message[] = []\n private _isRunning = false\n private _isDisabled = false\n private _abortController: AbortController | null = null\n private _conversationId?: string\n private _title?: string\n\n // Track current part being accumulated\n private _currentPart: {\n messageId: string\n contentIndex: number\n type: string\n parentId?: string\n } | null = null\n\n constructor(private config: ThreadRuntimeCoreConfig) {\n super()\n if (config.initialMessages) {\n this._messages = [...config.initialMessages]\n }\n }\n\n public get messages(): readonly Message[] {\n return this._messages\n }\n\n public get isRunning(): boolean {\n return this._isRunning\n }\n\n public get isDisabled(): boolean {\n return this._isDisabled\n }\n\n public get conversationId(): string | undefined {\n return this._conversationId\n }\n\n public get title(): string | undefined {\n return this._title\n }\n\n public get capabilities(): RuntimeCapabilities {\n return {\n cancel: true,\n edit: false,\n reload: false,\n speech: false,\n attachments: false,\n feedback: false\n }\n }\n\n private updateMessages(messages: Message[]): void {\n this._messages = messages\n this.config.onMessagesChange?.(this._messages)\n this.notifySubscribers()\n }\n\n public append(message: AppendMessage): void {\n const newMessage: Message = {\n id: message.id || generateMessageId(),\n parentId: message.parentId,\n role: message.role,\n content: message.content,\n status: message.status || { type: 'complete' },\n timestamp: message.timestamp || Date.now(),\n metadata: message.metadata\n }\n\n this.updateMessages([...this._messages, newMessage])\n }\n\n public async startRun(userMessage: AppendMessage): Promise<void> {\n if (this._isRunning) {\n throw new Error('A run is already in progress')\n }\n\n this.append(userMessage)\n this._isRunning = true\n this._abortController = new AbortController()\n this._currentPart = null // Reset current part\n\n const assistantMessageId = generateMessageId()\n const assistantMessage: Message = {\n id: assistantMessageId,\n role: 'assistant',\n content: [],\n status: { type: 'running' },\n timestamp: Date.now()\n }\n\n this.updateMessages([...this._messages, assistantMessage])\n\n try {\n const stream = this.config.streamAdapter.stream({\n messages: this._messages,\n conversationId: this._conversationId,\n signal: this._abortController.signal\n })\n\n for await (const event of stream) {\n if (this._abortController.signal.aborted) {\n break\n }\n\n this.handleStreamEvent(assistantMessageId, event.event)\n }\n\n this.updateMessageStatus(assistantMessageId, { type: 'complete' })\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n this.updateMessageStatus(assistantMessageId, { type: 'cancelled' })\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n this.updateMessageStatus(assistantMessageId, {\n type: 'error',\n error: errorMessage\n })\n }\n } finally {\n this._isRunning = false\n this._abortController = null\n this._currentPart = null // Clean up\n this.notifySubscribers()\n }\n }\n\n private handleStreamEvent(messageId: string, event: StreamEvent): void {\n const messageIndex = this._messages.findIndex(m => m.id === messageId)\n if (messageIndex === -1) return\n\n const message = this._messages[messageIndex]\n\n // Handle core events with type guards\n if (event.type === 'part-start') {\n this.handlePartStart(message, event as Extract<StreamEvent, { type: 'part-start' }>)\n } else if (event.type === 'text-delta' || event.type === 'assistant_thought') {\n this.handleTextDelta(message, event as Extract<StreamEvent, { type: 'text-delta' }>)\n } else if (event.type === 'part-finish') {\n this.handlePartFinish()\n } else if (event.type === 'metadata') {\n const metadataEvent = event as Extract<StreamEvent, { type: 'metadata' }>\n message.metadata = {\n ...message.metadata,\n conversationId: metadataEvent.conversationId,\n interactionId: metadataEvent.interactionId\n }\n\n if (metadataEvent.conversationId && !this._conversationId) {\n this._conversationId = metadataEvent.conversationId\n }\n\n if (metadataEvent.title && !this._title) {\n this._title = metadataEvent.title\n }\n } else if (event.type === 'capability_execution') {\n const capabilityEvent = event as Extract<StreamEvent, { type: 'capability_execution' }>\n message.content = [\n ...message.content,\n {\n type: 'capability',\n capabilityId: capabilityEvent.capabilityId,\n capabilityName: capabilityEvent.capabilityName,\n args: capabilityEvent.args\n } as CapabilityContent\n ]\n\n // Execute capability if manager is available\n if (this.config.capabilityExecutionManager) {\n this.config.capabilityExecutionManager.executeCapability(\n capabilityEvent.capabilityName,\n capabilityEvent.capabilityId,\n capabilityEvent.args,\n messageId,\n capabilityEvent.strategy\n )\n }\n } else if (event.type === 'error') {\n const errorEvent = event as Extract<StreamEvent, { type: 'error' }>\n message.content = [\n ...message.content,\n {\n type: 'error',\n data: errorEvent.error\n }\n ]\n } else {\n // Handle custom events\n const customEvent = event as Extract<StreamEvent, { data?: any }>\n message.content = [\n ...message.content,\n {\n type: customEvent.type,\n data: customEvent.data,\n parentId: customEvent.parentId\n }\n ]\n }\n\n // Update message with new reference\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n { ...message, timestamp: Date.now() },\n ...this._messages.slice(messageIndex + 1)\n ]\n\n this.updateMessages(updatedMessages)\n }\n\n private handlePartStart(message: Message, event: Extract<StreamEvent, { type: 'part-start' }>): void {\n const contentIndex = message.content.length\n\n // Create initial content based on type\n let initialContent: MessageContent\n\n switch (event.part.type) {\n case 'assistant_thought':\n // Initialize as array for assistant thoughts\n initialContent = {\n type: event.part.type,\n data: [],\n parentId: event.part.parentId\n } as any\n break\n\n case 'text':\n // Initialize as empty string for text\n initialContent = {\n type: event.part.type,\n data: '',\n parentId: event.part.parentId\n } as any\n break\n\n default:\n initialContent = {\n type: event.part.type,\n parentId: event.part.parentId\n } as any\n }\n\n // Add to message with new reference\n message.content = [...message.content, initialContent]\n\n // Track current part\n this._currentPart = {\n messageId: message.id,\n contentIndex,\n type: event.part.type,\n parentId: event.part.parentId\n }\n }\n\n private handleTextDelta(message: Message, event: Extract<StreamEvent, { type: 'text-delta' }>): void {\n if (!this._currentPart) {\n console.warn('Received text-delta without part-start')\n return\n }\n\n const content = message.content[this._currentPart.contentIndex] as any\n\n if (content.type === 'assistant_thought') {\n // For assistant thoughts, push each delta as a new array item\n if (!Array.isArray(content.data)) {\n content.data = []\n }\n if (event.delta.trim()) {\n content.data.push(event.delta.trim())\n }\n } else {\n // For text and other types, concatenate into a single string\n content.data = (content.data || '') + event.delta\n }\n }\n\n private handlePartFinish(): void {\n if (!this._currentPart) {\n console.warn('Received part-finish without part-start')\n return\n }\n\n // Part is complete, clear tracking\n this._currentPart = null\n }\n\n private updateMessageStatus(messageId: string, status: MessageStatus): void {\n const messageIndex = this._messages.findIndex(m => m.id === messageId)\n if (messageIndex === -1) return\n\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n {\n ...this._messages[messageIndex],\n status\n },\n ...this._messages.slice(messageIndex + 1)\n ]\n\n this.updateMessages(updatedMessages)\n }\n\n public clear(): void {\n this.updateMessages([])\n }\n\n public cancelRun(): void {\n if (!this._isRunning || !this._abortController) {\n return\n }\n\n this._abortController.abort()\n }\n\n public reset(messages: Message[] = []): void {\n this.updateMessages([...messages])\n }\n\n public setConversationId(conversationId: string | undefined): void {\n this._conversationId = conversationId\n this.notifySubscribers()\n }\n\n public setTitle(title: string | undefined): void {\n this._title = title\n this.notifySubscribers()\n }\n}\n","import { CapabilityExecutionManager } from '../../core'\nimport { StreamAdapter, ThreadListAdapter, ThreadListPaginatedResponse } from '../../types/adapters'\nimport { ThreadListItemState } from '../../types/thread'\nimport { generateThreadId } from '../../utils/idGenerator'\nimport { BaseSubscribable } from '../../utils/Subscribable'\nimport { ThreadListItemRuntime } from '../ThreadListItemRuntime/ThreadListItemRuntime'\nimport { ThreadRuntime } from '../ThreadRuntime/ThreadRuntime'\nimport { ThreadRuntimeCore } from '../ThreadRuntime/ThreadRuntimeCore'\n\nexport interface ThreadListState {\n mainThreadId: string\n threads: readonly string[]\n isLoading: boolean\n isLoadingMore: boolean\n threadItems: Record<string, ThreadListItemState>\n pagination?: {\n currentPage: number\n totalPages: number\n totalCount: number\n hasMore: boolean\n }\n searchQuery?: string\n}\n\nexport interface ThreadListRuntimeConfig {\n streamAdapter: StreamAdapter\n threadListAdapter?: ThreadListAdapter\n capabilityExecutionManager?: CapabilityExecutionManager\n}\n\nexport class ThreadListRuntime extends BaseSubscribable {\n private _mainThreadId: string\n private _threads = new Map<string, ThreadRuntime>()\n private _threadItems = new Map<string, ThreadListItemRuntime>()\n private _threadStates = new Map<string, ThreadListItemState>()\n private _isLoading = false\n private _isLoadingMore = false\n private _currentPage = 0\n private _totalPages = 0\n private _totalCount = 0\n private _hasMore = true\n private _searchQuery: string | undefined\n private _abortController: AbortController | null = null\n public readonly main: ThreadRuntime\n\n constructor(private config: ThreadListRuntimeConfig) {\n super()\n\n // Create main thread\n this._mainThreadId = generateThreadId()\n const mainCore = new ThreadRuntimeCore({\n streamAdapter: config.streamAdapter,\n capabilityExecutionManager: config.capabilityExecutionManager\n })\n this.main = new ThreadRuntime(mainCore)\n this._threads.set(this._mainThreadId, this.main)\n\n // Create main thread state\n const mainState: ThreadListItemState = {\n id: this._mainThreadId,\n title: 'New Chat',\n status: { type: 'regular' },\n isMain: true,\n createdAt: Date.now(),\n updatedAt: Date.now()\n }\n this._threadStates.set(this._mainThreadId, mainState)\n\n // Create main thread item\n const mainItem = new ThreadListItemRuntime({\n state: mainState,\n onSwitchTo: this.switchToThread.bind(this),\n onRename: this.renameThread.bind(this),\n onDelete: this.deleteThread.bind(this)\n })\n this._threadItems.set(this._mainThreadId, mainItem)\n }\n\n public get isLoading(): boolean {\n return this._isLoading\n }\n\n public get isLoadingMore(): boolean {\n return this._isLoadingMore\n }\n\n /**\n * Get the currently active main thread\n */\n public getMainThread(): ThreadRuntime {\n const mainThread = this._threads.get(this._mainThreadId)\n if (!mainThread) {\n return this.main\n }\n return mainThread\n }\n\n public getState(): ThreadListState {\n const threads: string[] = []\n const threadItems: Record<string, ThreadListItemState> = {}\n\n for (const [id, state] of this._threadStates) {\n threadItems[id] = state\n if (state.status.type === 'regular') {\n threads.push(id)\n }\n }\n\n return {\n mainThreadId: this._mainThreadId,\n threads,\n isLoading: this._isLoading,\n isLoadingMore: this._isLoadingMore,\n threadItems,\n pagination: {\n currentPage: this._currentPage,\n totalPages: this._totalPages,\n totalCount: this._totalCount,\n hasMore: this._hasMore\n },\n searchQuery: this._searchQuery\n }\n }\n\n public async switchToThread(threadId: string): Promise<void> {\n const thread = this._threads.get(threadId)\n if (!thread) {\n throw new Error(`Thread ${threadId} not found`)\n }\n\n // Update old main thread\n const oldMainState = this._threadStates.get(this._mainThreadId)\n if (oldMainState) {\n oldMainState.isMain = false\n this._threadStates.set(this._mainThreadId, oldMainState)\n this._threadItems.get(this._mainThreadId)?.updateState(oldMainState)\n }\n\n // Update new main thread\n this._mainThreadId = threadId\n const newMainState = this._threadStates.get(threadId)\n if (newMainState) {\n newMainState.isMain = true\n this._threadStates.set(threadId, newMainState)\n this._threadItems.get(threadId)?.updateState(newMainState)\n\n // Update thread's conversationId and title\n thread.setConversationId(newMainState.conversationId)\n thread.setTitle(newMainState.title)\n }\n\n // Load thread messages if adapter exists\n if (this.config.threadListAdapter && newMainState?.conversationId) {\n this._isLoading = true\n this.notifySubscribers()\n\n try {\n const messages = await this.config.threadListAdapter.loadThread(threadId)\n thread.reset(messages)\n } catch (error) {\n console.error('Failed to load thread:', error)\n } finally {\n this._isLoading = false\n }\n }\n\n this.notifySubscribers()\n }\n\n public async switchToNewThread(): Promise<void> {\n const newThreadId = generateThreadId()\n const newCore = new ThreadRuntimeCore({\n streamAdapter: this.config.streamAdapter,\n capabilityExecutionManager: this.config.capabilityExecutionManager\n })\n const newThread = new ThreadRuntime(newCore)\n\n this._threads.set(newThreadId, newThread)\n\n // Create new thread state\n const newState: ThreadListItemState = {\n id: newThreadId,\n title: 'New Chat',\n status: { type: 'regular' },\n isMain: false,\n createdAt: Date.now(),\n updatedAt: Date.now()\n }\n this._threadStates.set(newThreadId, newState)\n\n // Create new thread item\n const newItem = new ThreadListItemRuntime({\n state: newState,\n onSwitchTo: this.switchToThread.bind(this),\n onRename: this.renameThread.bind(this),\n onDelete: this.deleteThread.bind(this)\n })\n this._threadItems.set(newThreadId, newItem)\n\n // Subscribe to new thread changes\n newThread.subscribe(() => {\n this.syncThreadStateFromRuntime(newThreadId, newThread)\n this.notifySubscribers()\n })\n\n // Create thread via adapter if exists\n if (this.config.threadListAdapter) {\n try {\n const createdState = await this.config.threadListAdapter.createThread()\n newState.conversationId = createdState.conversationId\n this._threadStates.set(newThreadId, newState)\n newItem.updateState(newState)\n } catch (error) {\n console.error('Failed to create thread:', error)\n }\n }\n\n await this.switchToThread(newThreadId)\n }\n\n public async loadThreads(query?: string, reset: boolean = false): Promise<void> {\n if (!this.config.threadListAdapter) {\n console.warn('No threadListAdapter configured')\n return\n }\n\n if (this._abortController) {\n this._abortController.abort()\n }\n this._abortController = new AbortController()\n\n const isNewSearch = query !== this._searchQuery\n const shouldReset = reset || isNewSearch\n\n if (shouldReset) {\n this._currentPage = 0\n this._searchQuery = query\n this._hasMore = true\n this._threadStates.clear()\n this._threads.clear()\n this._threadItems.clear()\n }\n\n if (!shouldReset && !this._hasMore) {\n return\n }\n\n if (shouldReset) {\n this._isLoading = true\n } else {\n this._isLoadingMore = true\n }\n this.notifySubscribers()\n\n try {\n const result = await this.config.threadListAdapter.loadThreads({\n query: this._searchQuery,\n page: this._currentPage,\n size: 50\n })\n\n // Handle both response types for backwards compatibility\n let threads: ThreadListItemState[]\n let pagination: ThreadListPaginatedResponse['pagination']\n\n if (Array.isArray(result)) {\n threads = result\n pagination = undefined\n } else {\n threads = result.threads\n pagination = result.pagination\n }\n\n // Update pagination state\n if (pagination) {\n this._totalPages = pagination.pageCount ?? 0\n this._totalCount = pagination.total ?? 0\n this._currentPage = pagination.pageNumber ?? this._currentPage\n this._hasMore =\n pagination.pageNumber !== undefined &&\n pagination.pageCount !== undefined &&\n pagination.pageNumber < pagination.pageCount - 1\n } else {\n this._hasMore = false\n }\n\n // Add new threads to state\n for (const state of threads) {\n if (this._threadStates.has(state.id)) {\n continue\n }\n\n const threadCore = new ThreadRuntimeCore({\n streamAdapter: this.config.streamAdapter,\n capabilityExecutionManager: this.config.capabilityExecutionManager\n })\n const thread = new ThreadRuntime(threadCore)\n this._threads.set(state.id, thread)\n this._threadStates.set(state.id, state)\n\n const threadItem = new ThreadListItemRuntime({\n state,\n onSwitchTo: this.switchToThread.bind(this),\n onRename: this.renameThread.bind(this),\n onDelete: this.deleteThread.bind(this)\n })\n this._threadItems.set(state.id, threadItem)\n\n thread.subscribe(() => {\n this.syncThreadStateFromRuntime(state.id, thread)\n this.notifySubscribers()\n })\n }\n } catch (error) {\n if (error instanceof Error && error.name !== 'AbortError') {\n console.error('Failed to load threads:', error)\n }\n } finally {\n this._isLoading = false\n this._isLoadingMore = false\n this._abortController = null\n this.notifySubscribers()\n }\n }\n\n public async loadMoreThreads(): Promise<void> {\n if (this._isLoading || this._isLoadingMore || !this._hasMore) {\n return\n }\n\n this._currentPage += 1\n await this.loadThreads(this._searchQuery, false)\n }\n\n public async searchThreads(query: string): Promise<void> {\n await this.loadThreads(query, true)\n }\n\n /**\n * Syncs conversationId and title from thread runtime to thread state\n */\n private syncThreadStateFromRuntime(threadId: string, thread: ThreadRuntime): void {\n const currentState = this._threadStates.get(threadId)\n if (currentState) {\n const hasChanges = currentState.conversationId !== thread.conversationId || currentState.title !== thread.title\n\n if (hasChanges) {\n currentState.conversationId = thread.conversationId\n currentState.title = thread.title || currentState.title\n currentState.updatedAt = Date.now()\n this._threadStates.set(threadId, currentState)\n this._threadItems.get(threadId)?.updateState(currentState)\n }\n }\n }\n\n private async renameThread(threadId: string, newTitle: string): Promise<void> {\n const state = this._threadStates.get(threadId)\n if (!state) return\n\n state.title = newTitle\n state.updatedAt = Date.now()\n this._threadStates.set(threadId, state)\n this._threadItems.get(threadId)?.updateState(state)\n\n if (this.config.threadListAdapter) {\n try {\n await this.config.threadListAdapter.updateThread(threadId, { title: newTitle })\n } catch (error) {\n console.error('Failed to rename thread:', error)\n }\n }\n\n this.notifySubscribers()\n }\n\n private async deleteThread(threadId: string): Promise<void> {\n if (threadId === this._mainThreadId && this._threads.size === 1) {\n throw new Error('Cannot delete the last thread')\n }\n\n // If deleting main thread, switch to another thread first\n if (threadId === this._mainThreadId) {\n const otherThreadId = Array.from(this._threads.keys()).find(id => id !== threadId)\n if (otherThreadId) {\n await this.switchToThread(otherThreadId)\n }\n }\n\n this._threads.delete(threadId)\n this._threadItems.delete(threadId)\n this._threadStates.delete(threadId)\n\n if (this.config.threadListAdapter) {\n try {\n await this.config.threadListAdapter.deleteThread(threadId)\n } catch (error) {\n console.error('Failed to delete thread:', error)\n }\n }\n\n this.notifySubscribers()\n }\n}\n","import { CapabilityExecutionManager, CapabilityRegistry } from '../../core'\nimport { PluginRegistry } from '../../core/PluginRegistry'\nimport { Message } from '../../types/message'\nimport { ChatPlugin } from '../../types/plugin'\nimport { BaseSubscribable } from '../../utils/Subscribable'\nimport { ContentFocusRuntime } from '../ContentFocusRuntime/ContentFocusRuntime'\nimport { ThreadListRuntime, ThreadListRuntimeConfig } from '../ThreadListRuntime/ThreadListRuntime'\nimport { ThreadRuntime } from '../ThreadRuntime/ThreadRuntime'\n\nexport interface AssistantRuntimeConfig extends ThreadListRuntimeConfig {\n plugins?: ChatPlugin[]\n}\n\nexport class AssistantRuntime extends BaseSubscribable {\n public readonly threads: ThreadListRuntime\n public readonly pluginRegistry: PluginRegistry\n public readonly capabilityRegistry: CapabilityRegistry\n public readonly capabilityExecutionManager: CapabilityExecutionManager\n private _contentFocusRuntime: ContentFocusRuntime\n private _currentThreadUnsubscribe?: () => void\n\n constructor(config: AssistantRuntimeConfig) {\n super()\n\n // Initialize plugin registry\n this.pluginRegistry = new PluginRegistry()\n if (config.plugins) {\n config.plugins.forEach(plugin => {\n this.pluginRegistry.registerPlugin(plugin)\n })\n }\n\n // Initialize capability registry\n this.capabilityRegistry = new CapabilityRegistry()\n this.capabilityExecutionManager = new CapabilityExecutionManager(name => this.capabilityRegistry.getHandler(name))\n\n // Initialize thread list\n this.threads = new ThreadListRuntime({\n streamAdapter: config.streamAdapter,\n threadListAdapter: config.threadListAdapter,\n capabilityExecutionManager: this.capabilityExecutionManager\n })\n\n this._contentFocusRuntime = new ContentFocusRuntime()\n\n // Subscribe to content focus changes\n this._contentFocusRuntime.subscribe(() => {\n this.notifySubscribers()\n })\n\n // Subscribe to thread list changes (including thread switches)\n this.threads.subscribe(() => {\n // Re-subscribe to the new main thread when it changes\n this.subscribeToCurrentThread()\n this.notifySubscribers()\n })\n\n // Initial subscription to main thread\n this.subscribeToCurrentThread()\n }\n\n public get thread(): ThreadRuntime {\n return this.threads.getMainThread()\n }\n\n public get contentFocus(): ContentFocusRuntime {\n return this._contentFocusRuntime\n }\n\n /**\n * Register a plugin\n */\n public registerPlugin(plugin: ChatPlugin): void {\n this.pluginRegistry.registerPlugin(plugin)\n\n plugin.init?.({\n streamingEnabled: true,\n feedbackEnabled: false,\n detailPanelEnabled: true\n })\n }\n\n /**\n * Unregister a plugin\n */\n public unregisterPlugin(pluginId: string): boolean {\n return this.pluginRegistry.unregisterPlugin(pluginId)\n }\n\n /**\n * Subscribe to the current main thread\n * Called when thread switches to ensure we listen to the right thread\n */\n private subscribeToCurrentThread(): void {\n // Unsubscribe from previous thread\n if (this._currentThreadUnsubscribe) {\n this._currentThreadUnsubscribe()\n }\n\n // Subscribe to new main thread\n this._currentThreadUnsubscribe = this.thread.subscribe(() => {\n this.handleMessagesChange(this.thread.messages)\n this.notifySubscribers()\n })\n }\n\n private handleMessagesChange(messages: readonly Message[]): void {\n if (messages.length === 0) return\n\n // Only auto-focus when a new assistant message completes\n const lastMessage = messages[messages.length - 1]\n\n if (lastMessage.role === 'assistant' && lastMessage.status.type === 'complete') {\n this.autoFocusLastContent(messages)\n }\n }\n\n private autoFocusLastContent(messages: readonly Message[]): void {\n if (messages.length === 0) return\n if (this._contentFocusRuntime.isActive) return // Don't override existing focus\n\n // Find last assistant message\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message.role !== 'assistant') continue\n\n // Find last content with focus capability\n for (let j = message.content.length - 1; j >= 0; j--) {\n const content = message.content[j]\n const renderer = this.pluginRegistry.getRenderersByType(content.type)\n\n if (renderer.length > 0 && renderer[0].capabilities?.supportsFocus) {\n this._contentFocusRuntime.focus(content, message, j, 'detail')\n return\n }\n }\n }\n }\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/** @license React v17.0.2\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';require(\"object-assign\");var f=require(\"react\"),g=60103;exports.Fragment=60107;if(\"function\"===typeof Symbol&&Symbol.for){var h=Symbol.for;g=h(\"react.element\");exports.Fragment=h(\"react.fragment\")}var m=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,n=Object.prototype.hasOwnProperty,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,k){var b,d={},e=null,l=null;void 0!==k&&(e=\"\"+k);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(l=a.ref);for(b in a)n.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:g,type:c,key:e,ref:l,props:d,_owner:m.current}}exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { createContext, ReactNode, useContext } from 'react'\n\nimport { AssistantRuntime } from '../../runtime/AssistantRuntime/AssistantRuntime'\n\nconst AssistantRuntimeContext = createContext<AssistantRuntime | null>(null)\n\nexport interface AssistantRuntimeProviderProps {\n runtime: AssistantRuntime\n children: ReactNode\n}\n\nexport function AssistantRuntimeProvider({ runtime, children }: AssistantRuntimeProviderProps): JSX.Element {\n return <AssistantRuntimeContext.Provider value={runtime}>{children}</AssistantRuntimeContext.Provider>\n}\n\nexport function useAssistantRuntimeContext(): AssistantRuntime {\n const runtime = useContext(AssistantRuntimeContext)\n if (!runtime) {\n throw new Error('useAssistantRuntimeContext must be used within AssistantRuntimeProvider')\n }\n return runtime\n}\n","import { AssistantRuntime } from '../../runtime/AssistantRuntime/AssistantRuntime'\nimport { useAssistantRuntimeContext } from '../providers/AssistantRuntimeProvider'\n\nexport function useAssistantRuntime(): AssistantRuntime {\n return useAssistantRuntimeContext()\n}\n","import { useEffect, useState } from 'react'\n\nimport { ThreadListState } from '../../runtime/ThreadListRuntime/ThreadListRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useThreadList() {\n const runtime = useAssistantRuntime()\n\n return {\n switchToThread: (threadId: string) => runtime.threads.switchToThread(threadId),\n switchToNewThread: () => runtime.threads.switchToNewThread(),\n loadThreads: (query?: string, reset?: boolean) => runtime.threads.loadThreads(query, reset),\n loadMoreThreads: () => runtime.threads.loadMoreThreads(),\n searchThreads: (query: string) => runtime.threads.searchThreads(query),\n renameThread: (threadId: string, title: string) => runtime.threads['renameThread']?.(threadId, title),\n deleteThread: (threadId: string) => runtime.threads['deleteThread']?.(threadId)\n }\n}\n\nexport function useThreadListState() {\n const runtime = useAssistantRuntime()\n const [state, setState] = useState<ThreadListState>(runtime.threads.getState())\n\n useEffect(() => {\n const unsubscribe = runtime.threads.subscribe(() => {\n setState(runtime.threads.getState())\n })\n return unsubscribe\n }, [runtime])\n\n return state\n}\n","import { ThreadRuntime } from '../../runtime/ThreadRuntime/ThreadRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCurrentThread(): ThreadRuntime {\n const mainThread = useAssistantRuntime().threads.getMainThread()\n return mainThread\n}\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","import { useSyncExternalStore } from 'use-sync-external-store/shim'\n\nimport { Message } from '../../types/message'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useMessages(): readonly Message[] {\n const runtime = useAssistantRuntime()\n\n return useSyncExternalStore(\n callback => {\n // Subscribe to runtime, which notifies when thread switches\n // or when the current thread's messages change\n return runtime.subscribe(() => {\n callback()\n })\n },\n\n () => {\n // Always get messages from the current main thread\n return runtime.thread.messages\n },\n () => runtime.thread.messages\n )\n}\n","import { useState } from 'react'\n\nimport { useCurrentThread } from './useCurrentThread'\n\nexport function useComposer() {\n const thread = useCurrentThread()\n const [text, setText] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n\n const send = async (e?: React.FormEvent) => {\n e?.preventDefault()\n\n if (!text.trim() || isSubmitting) return\n\n const messageText = text\n setText('')\n setIsSubmitting(true)\n\n try {\n await thread.send(messageText)\n } catch (error) {\n console.error('Failed to send message:', error)\n setText(messageText)\n } finally {\n setIsSubmitting(false)\n }\n }\n\n return {\n text,\n setText,\n isSubmitting,\n send,\n clear: () => setText(''),\n append: (value: string) => setText(prev => prev + value)\n }\n}\n","import { FocusContext } from '../../runtime/ContentFocusRuntime/ContentFocusRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useContentRenderer(contentType: string, context?: FocusContext) {\n const runtime = useAssistantRuntime()\n const renderer = runtime.pluginRegistry.getBestRendererForType(contentType)\n\n if (!renderer) {\n return {\n component: null,\n auxiliaryComponent: null,\n supportsFocus: false,\n supportsPreview: false,\n supportsFullscreen: false\n }\n }\n\n // Get auxiliary component for specific context\n const auxiliaryComponent = context ? renderer.auxiliary?.[context] : null\n\n return {\n component: renderer.component,\n auxiliaryComponent,\n supportsFocus: renderer.capabilities?.supportsFocus ?? false,\n supportsPreview: renderer.capabilities?.supportsPreview ?? false,\n supportsFullscreen: renderer.capabilities?.supportsFullscreen ?? false\n }\n}\n\nexport function useHasAuxiliaryView(contentType: string, context: FocusContext): boolean {\n const runtime = useAssistantRuntime()\n const renderer = runtime.pluginRegistry.getBestRendererForType(contentType)\n return !!renderer?.auxiliary?.[context]\n}\n\nexport function useSupportsFocus(contentType: string): boolean {\n const runtime = useAssistantRuntime()\n const renderer = runtime.pluginRegistry.getBestRendererForType(contentType)\n return renderer?.capabilities?.supportsFocus ?? false\n}\n","import { useEffect, useState } from 'react'\n\nimport { ContentFocusState, FocusContext } from '../../runtime/ContentFocusRuntime/ContentFocusRuntime'\nimport { Message, MessageContent } from '../../types/message'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useContentFocus() {\n const runtime = useAssistantRuntime()\n const [state, setState] = useState<ContentFocusState>(runtime.contentFocus.state)\n\n useEffect(() => {\n const unsubscribe = runtime.contentFocus.subscribe(() => {\n setState(runtime.contentFocus.state)\n })\n return unsubscribe\n }, [runtime])\n\n return {\n ...state,\n focus: (content: MessageContent, message: Message, contentIndex: number, context?: FocusContext) =>\n runtime.contentFocus.focus(content, message, contentIndex, context),\n blur: () => runtime.contentFocus.blur(),\n toggle: (content: MessageContent, message: Message, contentIndex: number, context?: FocusContext) =>\n runtime.contentFocus.toggle(content, message, contentIndex, context),\n switchContext: (context: FocusContext) => runtime.contentFocus.switchContext(context),\n focusNext: () => runtime.contentFocus.focusNext(runtime.thread.messages),\n focusPrevious: () => runtime.contentFocus.focusPrevious(runtime.thread.messages)\n }\n}\n\nexport function useContentFocusState() {\n const runtime = useAssistantRuntime()\n const [state, setState] = useState<ContentFocusState>(runtime.contentFocus.state)\n\n useEffect(() => {\n const unsubscribe = runtime.contentFocus.subscribe(() => {\n setState(runtime.contentFocus.state)\n })\n return unsubscribe\n }, [runtime])\n\n return state\n}\n","import { useEffect } from 'react'\n\nimport { CapabilityConfig } from '../../types/capability'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCapability<TArgs = any, TResult = any>(config: CapabilityConfig<TArgs, TResult>): void {\n const runtime = useAssistantRuntime()\n\n useEffect(() => {\n // Register handler\n if (config.execute) {\n runtime.capabilityRegistry.registerHandler(config.name, { execute: config.execute })\n }\n\n // Register renderer\n if (config.render) {\n runtime.capabilityRegistry.registerRenderer(config.name, {\n component: config.render\n })\n }\n\n // Cleanup on unmount\n return () => {\n runtime.capabilityRegistry.unregister(config.name)\n }\n }, [config.name, runtime])\n}\n","import { useEffect, useReducer, useState } from 'react'\n\nimport { CapabilityExecution } from '../../types/capability'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCapabilityExecution(capabilityId: string): CapabilityExecution | undefined {\n const runtime = useAssistantRuntime()\n const [execution, setExecution] = useState<CapabilityExecution | undefined>(() =>\n runtime.capabilityExecutionManager.getExecution(capabilityId)\n )\n const [, forceUpdate] = useReducer(x => x + 1, 0)\n\n useEffect(() => {\n // Get initial state\n const initialExecution = runtime.capabilityExecutionManager.getExecution(capabilityId)\n setExecution(initialExecution)\n\n // Subscribe to updates\n const unsubscribe = runtime.capabilityExecutionManager.subscribe(id => {\n if (id === capabilityId) {\n const updatedExecution = runtime.capabilityExecutionManager.getExecution(capabilityId)\n setExecution(updatedExecution)\n forceUpdate()\n }\n })\n\n return unsubscribe\n }, [capabilityId, runtime])\n\n return execution\n}\n","import { CapabilityContent } from '../../types/capability'\nimport { Message, MessageContent } from '../../types/message'\nimport { useAssistantRuntime } from '../hooks/useAssistantRuntime'\nimport { useCapabilityExecution } from '../hooks/useCapabilityExecution'\n\nexport interface CapabilityRendererProps {\n message: Message\n content: MessageContent\n}\n\nexport function CapabilityRendererComp({ message, content }: CapabilityRendererProps) {\n const runtime = useAssistantRuntime()\n const capabilityContent = content as CapabilityContent\n const execution = useCapabilityExecution(capabilityContent.capabilityId)\n\n const renderer = runtime.capabilityRegistry.getRenderer(capabilityContent.capabilityName)\n\n if (!renderer || !execution) {\n return null\n }\n\n const Component = renderer.component\n\n return (\n <Component\n capabilityName={execution.name}\n capabilityId={execution.id}\n args={execution.args}\n result={execution.result}\n status={execution.status}\n message={message}\n />\n )\n}\n","import { Message, MessageContent } from '../../types/message'\nimport { useContentRenderer } from '../hooks/useContentRenderer'\nimport { CapabilityRendererComp } from './CapabilityRenderer'\n\nexport function ContentRenderer({ message, content }: { message: Message; content: MessageContent }) {\n const { component } = useContentRenderer(content.type)\n\n if (content.type === 'capability') {\n return <CapabilityRendererComp message={message} content={content} />\n }\n\n if (!component) {\n return null\n }\n\n const Component = component\n return <Component content={content} message={message} />\n}\n","import { AuxiliaryRendererProps } from '../../types/plugin'\nimport { useContentRenderer } from '../hooks'\n\nexport function AuxiliaryRenderer({\n message,\n content,\n context,\n onClose,\n onNavigate,\n onSwitchContext\n}: AuxiliaryRendererProps) {\n const { auxiliaryComponent } = useContentRenderer(content.type, context)\n\n if (!auxiliaryComponent) {\n return null\n }\n\n const Component = auxiliaryComponent\n return (\n <Component\n content={content}\n message={message}\n context={context}\n onClose={onClose}\n onNavigate={onNavigate}\n onSwitchContext={onSwitchContext}\n />\n )\n}\n","import { FC } from 'react'\n\nimport { CapabilityConfig } from '../../types'\nimport { useCapability } from '../hooks/useCapability'\n\nexport function makeCapability<TArgs = any, TResult = any>(config: CapabilityConfig<TArgs, TResult>): FC {\n const Capability: FC = () => {\n useCapability(config)\n return null\n }\n\n Capability.displayName = `Capability(${config.name})`\n\n return Capability\n}\n","import { StreamAdapter, StreamChunk } from '../types/adapters'\nimport { Message } from '../types/message'\n\nexport interface SSEEvent {\n event: string\n data: any\n}\n\nexport abstract class BaseSSEStreamAdapter<TAllowedEvents extends readonly string[] = readonly string[]>\n implements StreamAdapter\n{\n protected abstract prepareRequest(params: { messages: Message[]; conversationId?: string; signal?: AbortSignal }): {\n url: string\n options: RequestInit\n }\n\n protected abstract convertEvent(event: SSEEvent & { event: TAllowedEvents[number] }): StreamChunk | null\n\n protected getAllowedEvents(): TAllowedEvents | null {\n return null\n }\n\n protected shouldProcessEvent(eventType: string): boolean {\n const allowedEvents = this.getAllowedEvents()\n if (!allowedEvents) return true\n return allowedEvents.includes(eventType)\n }\n\n async *stream(params: {\n messages: Message[]\n conversationId?: string\n signal?: AbortSignal\n }): AsyncGenerator<StreamChunk, void, unknown> {\n const { signal } = params\n const { url, options } = this.prepareRequest(params)\n\n const response = await fetch(url, { ...options, signal })\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`)\n }\n\n if (!response.body) {\n throw new Error('Response body is null')\n }\n\n yield* this.parseSSEStream(response.body, signal)\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk, void, unknown> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let currentEvent: string | null = null\n\n try {\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const { done, value } = await reader.read()\n\n if (done) break\n if (signal?.aborted) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n\n if (!trimmedLine) {\n currentEvent = null\n continue\n }\n\n if (trimmedLine === ': ping') {\n continue\n }\n\n if (trimmedLine.startsWith('event:')) {\n currentEvent = trimmedLine.substring(6).trim()\n continue\n }\n\n if (trimmedLine.startsWith('data:')) {\n const dataStr = trimmedLine.substring(5).trim()\n\n if (dataStr === 'eof' || trimmedLine === 'eof') {\n break\n }\n\n try {\n const data = JSON.parse(dataStr)\n\n if (currentEvent && this.shouldProcessEvent(currentEvent)) {\n const chunk = this.convertEvent({\n event: currentEvent as TAllowedEvents[number],\n data\n })\n if (chunk) {\n yield chunk\n }\n }\n } catch (e) {\n // handle error\n }\n\n currentEvent = null\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n }\n}\n"],"names":["PluginRegistry","__publicField","plugin","renderer","renderers","a","b","pluginId","filteredRenderers","r","type","CapabilityRegistry","name","handler","CapabilityExecutionManager","getHandler","id","args","messageId","strategy","execution","executionId","running","result","error","errorMessage","index","e","callback","BaseSubscribable","ContentFocusRuntime","content","message","contentIndex","context","messages","currentMsgIndex","m","currentMsg","currentContentIndex","nextContent","nextMsg","prevContent","prevMsg","lastIndex","messageIdCounter","threadIdCounter","generateMessageId","generateThreadId","ThreadListItemRuntime","config","state","newTitle","ComposerRuntime","text","isSubmitting","ThreadRuntime","_core","conversationId","title","ThreadRuntimeCore","_b","_a","newMessage","userMessage","assistantMessageId","assistantMessage","stream","event","messageIndex","metadataEvent","capabilityEvent","errorEvent","customEvent","updatedMessages","initialContent","status","ThreadListRuntime","mainCore","mainState","mainItem","mainThread","threads","threadItems","threadId","thread","oldMainState","newMainState","newThreadId","newCore","newThread","newState","newItem","createdState","query","reset","isNewSearch","shouldReset","pagination","threadCore","threadItem","currentState","otherThreadId","AssistantRuntime","lastMessage","i","j","getOwnPropertySymbols","hasOwnProperty","propIsEnumerable","toObject","val","shouldUseNative","test1","test2","order2","n","test3","letter","objectAssign","target","source","from","to","symbols","s","key","require$$0","f","require$$1","g","reactJsxRuntime_production_min","h","p","q","c","k","d","l","jsxRuntimeModule","AssistantRuntimeContext","createContext","AssistantRuntimeProvider","runtime","children","useAssistantRuntimeContext","useContext","useAssistantRuntime","useThreadList","useThreadListState","setState","useState","useEffect","useCurrentThread","React","is","x","y","objectIs","useLayoutEffect","useDebugValue","useSyncExternalStore$2","subscribe","getSnapshot","value","_useState","inst","forceUpdate","checkIfSnapshotChanged","latestGetSnapshot","nextValue","useSyncExternalStore$1","shim","useSyncExternalStoreShim_production","shimModule","useMessages","useSyncExternalStore","useComposer","setText","setIsSubmitting","messageText","prev","useContentRenderer","contentType","auxiliaryComponent","_c","_d","useContentFocus","useCapability","useCapabilityExecution","capabilityId","setExecution","useReducer","initialExecution","updatedExecution","CapabilityRendererComp","capabilityContent","Component","jsx","ContentRenderer","component","AuxiliaryRenderer","onClose","onNavigate","onSwitchContext","makeCapability","Capability","BaseSSEStreamAdapter","eventType","allowedEvents","params","signal","url","options","response","body","reader","decoder","buffer","currentEvent","done","lines","line","trimmedLine","dataStr","data","chunk"],"mappings":"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","x_google_ignoreList":[12,13,14,19,20]}
@@ -2,7 +2,9 @@ import { ThreadListState } from '../../runtime/ThreadListRuntime/ThreadListRunti
2
2
  export declare function useThreadList(): {
3
3
  switchToThread: (threadId: string) => Promise<void>;
4
4
  switchToNewThread: () => Promise<void>;
5
- loadThreads: () => Promise<void>;
5
+ loadThreads: (query?: string, reset?: boolean) => Promise<void>;
6
+ loadMoreThreads: () => Promise<void>;
7
+ searchThreads: (query: string) => Promise<void>;
6
8
  renameThread: (threadId: string, title: string) => Promise<void>;
7
9
  deleteThread: (threadId: string) => Promise<void>;
8
10
  };
@@ -7,7 +7,15 @@ export interface ThreadListState {
7
7
  mainThreadId: string;
8
8
  threads: readonly string[];
9
9
  isLoading: boolean;
10
+ isLoadingMore: boolean;
10
11
  threadItems: Record<string, ThreadListItemState>;
12
+ pagination?: {
13
+ currentPage: number;
14
+ totalPages: number;
15
+ totalCount: number;
16
+ hasMore: boolean;
17
+ };
18
+ searchQuery?: string;
11
19
  }
12
20
  export interface ThreadListRuntimeConfig {
13
21
  streamAdapter: StreamAdapter;
@@ -21,9 +29,17 @@ export declare class ThreadListRuntime extends BaseSubscribable {
21
29
  private _threadItems;
22
30
  private _threadStates;
23
31
  private _isLoading;
32
+ private _isLoadingMore;
33
+ private _currentPage;
34
+ private _totalPages;
35
+ private _totalCount;
36
+ private _hasMore;
37
+ private _searchQuery;
38
+ private _abortController;
24
39
  readonly main: ThreadRuntime;
25
40
  constructor(config: ThreadListRuntimeConfig);
26
41
  get isLoading(): boolean;
42
+ get isLoadingMore(): boolean;
27
43
  /**
28
44
  * Get the currently active main thread
29
45
  */
@@ -31,7 +47,13 @@ export declare class ThreadListRuntime extends BaseSubscribable {
31
47
  getState(): ThreadListState;
32
48
  switchToThread(threadId: string): Promise<void>;
33
49
  switchToNewThread(): Promise<void>;
34
- loadThreads(): Promise<void>;
50
+ loadThreads(query?: string, reset?: boolean): Promise<void>;
51
+ loadMoreThreads(): Promise<void>;
52
+ searchThreads(query: string): Promise<void>;
53
+ /**
54
+ * Syncs conversationId and title from thread runtime to thread state
55
+ */
56
+ private syncThreadStateFromRuntime;
35
57
  private renameThread;
36
58
  private deleteThread;
37
59
  }
@@ -46,9 +46,23 @@ export interface StreamRequest {
46
46
  export interface StreamChunk {
47
47
  event: StreamEvent;
48
48
  }
49
+ export interface ThreadListLoadOptions {
50
+ query?: string;
51
+ page?: number;
52
+ size?: number;
53
+ }
54
+ export interface ThreadListPaginatedResponse {
55
+ threads: ThreadListItemState[];
56
+ pagination?: {
57
+ total?: number;
58
+ pageSize?: number;
59
+ pageCount?: number;
60
+ pageNumber?: number;
61
+ };
62
+ }
49
63
  export interface ThreadListAdapter {
50
64
  listThreads(): Promise<ThreadListItemState[]>;
51
- loadThreads(): Promise<ThreadListItemState[]>;
65
+ loadThreads(options?: ThreadListLoadOptions): Promise<ThreadListItemState[] | ThreadListPaginatedResponse>;
52
66
  loadThread(threadId: string): Promise<Message[]>;
53
67
  createThread(initialMessage?: string): Promise<ThreadListItemState>;
54
68
  deleteThread(threadId: string): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  export type { Message, MessageContent, MessageRole, MessageStatus, AppendMessage, TextContent, ErrorContent, MetadataContent, AssistantThoughtContent, CustomContent } from './message';
2
2
  export type { ThreadListItemState, ThreadState, RuntimeCapabilities } from './thread';
3
3
  export type { ChatPlugin, MessageRenderer, MessageRendererProps, GroupRenderer, GroupRendererProps, PluginConfig } from './plugin';
4
- export type { StreamAdapter, ThreadListAdapter, StreamEvent, StreamRequest, StreamChunk } from './adapters';
4
+ export type { StreamAdapter, ThreadListAdapter, StreamEvent, StreamRequest, StreamChunk, ThreadListLoadOptions, ThreadListPaginatedResponse } from './adapters';
5
5
  export type { SSEEvent } from '../utils/BaseSSEStreamAdapter';
6
6
  export type { CapabilityStatus, CapabilityExecutionContext, CapabilityExecution, CapabilityHandler, CapabilityRendererProps, CapabilityRenderer, CapabilityConfig, CapabilityContent } from './capability';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@harnessio/ai-chat-core",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "private": false,