@harnessio/ai-chat-core 0.0.20 → 0.0.21

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,7 +1,7 @@
1
1
  var H = Object.defineProperty;
2
2
  var J = (a, n, t) => n in a ? H(a, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[n] = t;
3
3
  var u = (a, n, t) => J(a, typeof n != "symbol" ? n + "" : n, t);
4
- import U, { createContext as B, useContext as q, useState as b, useEffect as w, useReducer as z, useCallback as C, useMemo as V } from "react";
4
+ import U, { createContext as B, useContext as W, useState as m, useEffect as w, useReducer as z, useCallback as C, useMemo as V } from "react";
5
5
  class G {
6
6
  constructor() {
7
7
  u(this, "plugins", /* @__PURE__ */ new Map());
@@ -154,7 +154,7 @@ class K {
154
154
  this.executions.clear(), this.executionQueue = [], this.runningByName.clear();
155
155
  }
156
156
  }
157
- class m {
157
+ class b {
158
158
  constructor() {
159
159
  u(this, "_subscriptions", /* @__PURE__ */ new Set());
160
160
  }
@@ -171,7 +171,7 @@ class m {
171
171
  return this._subscriptions.size;
172
172
  }
173
173
  }
174
- class X extends m {
174
+ class X extends b {
175
175
  constructor() {
176
176
  super(...arguments);
177
177
  u(this, "_state", {
@@ -274,7 +274,7 @@ function T() {
274
274
  function N() {
275
275
  return `thread-${Date.now()}-${++tt}`;
276
276
  }
277
- class v extends m {
277
+ class v extends b {
278
278
  constructor(t) {
279
279
  super();
280
280
  u(this, "_state");
@@ -302,7 +302,7 @@ class v extends m {
302
302
  return super.subscribe(t);
303
303
  }
304
304
  }
305
- class et extends m {
305
+ class et extends b {
306
306
  constructor() {
307
307
  super(...arguments);
308
308
  u(this, "_text", "");
@@ -330,7 +330,7 @@ class et extends m {
330
330
  this._isSubmitting = t, this.notifySubscribers();
331
331
  }
332
332
  }
333
- class R extends m {
333
+ class R extends b {
334
334
  constructor(t) {
335
335
  super();
336
336
  u(this, "composer");
@@ -395,11 +395,20 @@ class R extends m {
395
395
  }
396
396
  }
397
397
  }
398
+ /**
399
+ * Dispatches a system event (e.g. a user click on an elicitation card).
400
+ *
401
+ * Prior to this change, this method wrapped startSystemEventRun in a
402
+ * try/catch that silently swallowed the "A run is already in progress"
403
+ * error thrown by the core when _isRunning was still true — causing
404
+ * clicks fired during the tail of the previous run to disappear.
405
+ *
406
+ * Now we await waitForIdle() before dispatching so the event is
407
+ * reliably delivered as soon as the in-flight run completes. Callers
408
+ * do not need their own queueing primitive.
409
+ */
398
410
  async sendSystemEvent(t) {
399
- try {
400
- await this._core.startSystemEventRun(t);
401
- } catch {
402
- }
411
+ await this._core.waitForIdle(), await this._core.startSystemEventRun(t);
403
412
  }
404
413
  cancelRun() {
405
414
  this._core.cancelRun();
@@ -420,7 +429,7 @@ class R extends m {
420
429
  return super.subscribe(t);
421
430
  }
422
431
  }
423
- class E extends m {
432
+ class E extends b {
424
433
  constructor(t) {
425
434
  super();
426
435
  u(this, "_messages", []);
@@ -431,6 +440,11 @@ class E extends m {
431
440
  u(this, "_abortController", null);
432
441
  u(this, "_conversationId");
433
442
  u(this, "_title");
443
+ // Resolvers waiting for _isRunning to flip to false. Drained in the
444
+ // finally block of every run path so callers can serialize their
445
+ // dispatch against an in-progress run instead of having their error
446
+ // swallowed by the caller's try/catch.
447
+ u(this, "_idleWaiters", []);
434
448
  // Track current part being accumulated
435
449
  u(this, "_currentPart", null);
436
450
  this.config = t, t.initialMessages && (this._messages = [...t.initialMessages]);
@@ -482,6 +496,29 @@ class E extends m {
482
496
  };
483
497
  this.updateMessages([...this._messages, e]);
484
498
  }
499
+ /**
500
+ * Resolves when _isRunning flips to false. Use this to queue a
501
+ * follow-on dispatch (e.g. a system event from a card click that
502
+ * fires during the tail of the previous run) without racing the
503
+ * in-progress run's guard.
504
+ *
505
+ * Resolves immediately if nothing is running.
506
+ */
507
+ waitForIdle() {
508
+ return this._isRunning ? new Promise((t) => {
509
+ this._idleWaiters.push(t);
510
+ }) : Promise.resolve();
511
+ }
512
+ drainIdleWaiters() {
513
+ if (this._idleWaiters.length === 0) return;
514
+ const t = this._idleWaiters;
515
+ this._idleWaiters = [];
516
+ for (const e of t)
517
+ try {
518
+ e();
519
+ } catch {
520
+ }
521
+ }
485
522
  async startSystemEventRun(t) {
486
523
  if (this._isRunning)
487
524
  throw new Error("A run is already in progress");
@@ -518,7 +555,7 @@ class E extends m {
518
555
  });
519
556
  }
520
557
  } finally {
521
- this._isRunning = !1, this._abortController = null, this._currentPart = null, this.notifySubscribers();
558
+ this._isRunning = !1, this._abortController = null, this._currentPart = null, this.notifySubscribers(), this.drainIdleWaiters();
522
559
  }
523
560
  }
524
561
  async startRun(t) {
@@ -556,7 +593,7 @@ class E extends m {
556
593
  });
557
594
  }
558
595
  } finally {
559
- this._isRunning = !1, this._abortController = null, this._currentPart = null, this.notifySubscribers();
596
+ this._isRunning = !1, this._abortController = null, this._currentPart = null, this.notifySubscribers(), this.drainIdleWaiters();
560
597
  }
561
598
  }
562
599
  handleStreamEvent(t, e) {
@@ -741,7 +778,7 @@ class E extends m {
741
778
  this._title = t, this.notifySubscribers();
742
779
  }
743
780
  }
744
- class st extends m {
781
+ class st extends b {
745
782
  constructor(t) {
746
783
  super();
747
784
  u(this, "_mainThreadId");
@@ -925,7 +962,7 @@ class st extends m {
925
962
  this.notifySubscribers();
926
963
  }
927
964
  }
928
- class bt extends m {
965
+ class mt extends b {
929
966
  constructor(t) {
930
967
  super();
931
968
  u(this, "threads");
@@ -1083,12 +1120,12 @@ function it() {
1083
1120
  return O || (O = 1, M.exports = nt()), M.exports;
1084
1121
  }
1085
1122
  var S = it();
1086
- const W = B(null);
1087
- function mt({ runtime: a, children: n }) {
1088
- return /* @__PURE__ */ S.jsx(W.Provider, { value: a, children: n });
1123
+ const q = B(null);
1124
+ function bt({ runtime: a, children: n }) {
1125
+ return /* @__PURE__ */ S.jsx(q.Provider, { value: a, children: n });
1089
1126
  }
1090
1127
  function at() {
1091
- const a = q(W);
1128
+ const a = W(q);
1092
1129
  if (!a)
1093
1130
  throw new Error("useAssistantRuntimeContext must be used within AssistantRuntimeProvider");
1094
1131
  return a;
@@ -1113,13 +1150,13 @@ function _t() {
1113
1150
  };
1114
1151
  }
1115
1152
  function xt() {
1116
- const a = f(), [n, t] = b(a.threads.getState());
1153
+ const a = f(), [n, t] = m(a.threads.getState());
1117
1154
  return w(() => a.threads.subscribe(() => {
1118
1155
  t(a.threads.getState());
1119
1156
  }), [a]), n;
1120
1157
  }
1121
1158
  function ot() {
1122
- const n = f().threads.getMainThread(), [, t] = b({});
1159
+ const n = f().threads.getMainThread(), [, t] = m({});
1123
1160
  return w(() => n.subscribe(() => {
1124
1161
  t({});
1125
1162
  }), [n]), n;
@@ -1191,7 +1228,7 @@ function St() {
1191
1228
  );
1192
1229
  }
1193
1230
  function wt() {
1194
- const a = ot(), [n, t] = b(""), [e, s] = b(!1);
1231
+ const a = ot(), [n, t] = m(""), [e, s] = m(!1);
1195
1232
  return {
1196
1233
  text: n,
1197
1234
  setText: t,
@@ -1233,7 +1270,7 @@ function $(a, n) {
1233
1270
  };
1234
1271
  }
1235
1272
  function Ct() {
1236
- const a = f(), [n, t] = b(a.contentFocus.state);
1273
+ const a = f(), [n, t] = m(a.contentFocus.state);
1237
1274
  return w(() => a.contentFocus.subscribe(() => {
1238
1275
  t(a.contentFocus.state);
1239
1276
  }), [a]), {
@@ -1262,7 +1299,7 @@ function dt(a) {
1262
1299
  }, [a.name, n]);
1263
1300
  }
1264
1301
  function lt(a) {
1265
- const n = f(), [t, e] = b(
1302
+ const n = f(), [t, e] = m(
1266
1303
  () => n.capabilityExecutionManager.getExecution(a)
1267
1304
  ), [, s] = z((r) => r + 1, 0);
1268
1305
  return w(() => {
@@ -1277,7 +1314,7 @@ function lt(a) {
1277
1314
  }
1278
1315
  const Q = B(void 0);
1279
1316
  function It({ children: a }) {
1280
- const [n, t] = b({}), e = C((c, d) => {
1317
+ const [n, t] = m({}), e = C((c, d) => {
1281
1318
  t((l) => {
1282
1319
  if (d === null) {
1283
1320
  const { [c]: h, ...g } = l;
@@ -1320,7 +1357,7 @@ function It({ children: a }) {
1320
1357
  return /* @__PURE__ */ S.jsx(Q.Provider, { value: o, children: a });
1321
1358
  }
1322
1359
  function gt() {
1323
- const a = q(Q);
1360
+ const a = W(Q);
1324
1361
  if (!a)
1325
1362
  throw new Error("useChatContext must be used within a ChatContextProvider");
1326
1363
  return a;
@@ -1449,8 +1486,8 @@ class Mt {
1449
1486
  }
1450
1487
  }
1451
1488
  export {
1452
- bt as AssistantRuntime,
1453
- mt as AssistantRuntimeProvider,
1489
+ mt as AssistantRuntime,
1490
+ bt as AssistantRuntimeProvider,
1454
1491
  Rt as AuxiliaryRenderer,
1455
1492
  Mt as BaseSSEStreamAdapter,
1456
1493
  K as CapabilityExecutionManager,
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/providers/ChatContextProvider.tsx","../src/react/hooks/usePageContext.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\ninterface HandlerEntry {\n handler: CapabilityHandler\n priority: number\n}\n\ninterface RendererEntry {\n renderer: CapabilityRenderer\n priority: number\n}\n\nexport class CapabilityRegistry {\n private handlers = new Map<string, HandlerEntry[]>()\n private renderers = new Map<string, RendererEntry[]>()\n\n public registerHandler(name: string, handler: CapabilityHandler, priority = 0): void {\n const entries = this.handlers.get(name) || []\n const entry: HandlerEntry = { handler, priority }\n\n // Insert in sorted order (highest priority first)\n const insertIndex = entries.findIndex(e => e.priority < priority)\n if (insertIndex === -1) {\n entries.push(entry)\n } else {\n entries.splice(insertIndex, 0, entry)\n }\n\n this.handlers.set(name, entries)\n }\n\n public registerRenderer(name: string, renderer: CapabilityRenderer, priority = 0): void {\n const entries = this.renderers.get(name) || []\n const entry: RendererEntry = { renderer, priority }\n\n // Insert in sorted order (highest priority first)\n const insertIndex = entries.findIndex(e => e.priority < priority)\n if (insertIndex === -1) {\n entries.push(entry)\n } else {\n entries.splice(insertIndex, 0, entry)\n }\n\n this.renderers.set(name, entries)\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 const entries = this.handlers.get(name)\n return entries?.[0]?.handler\n }\n\n public getRenderer(name: string): CapabilityRenderer | undefined {\n const entries = this.renderers.get(name)\n return entries?.[0]?.renderer\n }\n\n public getStrategy() {\n return 'queue'\n }\n\n public hasHandler(name: string): boolean {\n const entries = this.handlers.get(name)\n return entries !== undefined && entries.length > 0\n }\n\n public hasRenderer(name: string): boolean {\n const entries = this.renderers.get(name)\n return entries !== undefined && entries.length > 0\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 { SystemEvent } from '../../types/adapters'\nimport { 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 isWaitingForUser(): boolean {\n return this._core.isWaitingForUser\n }\n\n public get pendingCapability(): { capabilityId: string; capabilityName: string } | null {\n return this._core.pendingCapability\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 isWaitingForUser: this._core.isWaitingForUser,\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 // If waiting for user action, auto-cancel the pending capability first\n if (this._core.isWaitingForUser && this._core.pendingCapability) {\n await this._core.startSystemEventRun({\n event_type: 'action_cancelled',\n capability_id: this._core.pendingCapability.capabilityName,\n result: { success: false }\n })\n }\n\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 async sendSystemEvent(systemEvent: SystemEvent): Promise<void> {\n try {\n await this._core.startSystemEventRun(systemEvent)\n } catch (e) {\n // TODO: Handle error\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, SystemEvent } 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 _isWaitingForUser = false\n private _pendingCapability: { capabilityId: string; capabilityName: string } | null = null\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 isWaitingForUser(): boolean {\n return this._isWaitingForUser\n }\n\n public get pendingCapability(): { capabilityId: string; capabilityName: string } | null {\n return this._pendingCapability\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 startSystemEventRun(systemEvent: SystemEvent): Promise<void> {\n if (this._isRunning) {\n throw new Error('A run is already in progress')\n }\n\n this._isWaitingForUser = false\n this._pendingCapability = null\n this._isRunning = true\n this._abortController = new AbortController()\n this._currentPart = null\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 systemEvent\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.completeStreamingContent(assistantMessageId)\n this.updateMessageStatus(assistantMessageId, { type: 'cancelled' })\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n this.completeStreamingContent(assistantMessageId)\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\n this.notifySubscribers()\n }\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._isWaitingForUser = false\n this._pendingCapability = null\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.completeStreamingContent(assistantMessageId)\n this.updateMessageStatus(assistantMessageId, { type: 'cancelled' })\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n this.completeStreamingContent(assistantMessageId)\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 const capabilityContent = {\n type: 'capability',\n capabilityId: capabilityEvent.capabilityId,\n capabilityName: capabilityEvent.capabilityName,\n args: capabilityEvent.args\n } as CapabilityContent\n\n message.content.push(capabilityContent)\n\n // Check if artifact field exists (from stream event)\n const artifact = (capabilityEvent as any).artifact\n if (artifact) {\n message.content.push({\n type: 'artifact',\n data: {\n capabilityName: capabilityEvent.capabilityName,\n originalArgs: capabilityEvent.args,\n displayData: {\n name: artifact.displayName,\n type: artifact.displayType\n }\n }\n })\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\n // Track waiting_for_user status so the UI can show a waiting indicator\n const capabilityStatus = (capabilityEvent as any).status\n if (capabilityStatus === 'waiting_for_user') {\n this._isWaitingForUser = true\n this._pendingCapability = {\n capabilityId: capabilityEvent.capabilityId,\n capabilityName: capabilityEvent.capabilityName\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 status: { type: 'streaming' }\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 status: { type: 'streaming' }\n } as any\n break\n\n default:\n initialContent = {\n type: event.part.type,\n parentId: event.part.parentId,\n status: { type: 'streaming' }\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 // Find the message and content\n const messageIndex = this._messages.findIndex(m => m.id === this._currentPart!.messageId)\n if (messageIndex !== -1) {\n const message = this._messages[messageIndex]\n const content = message.content[this._currentPart.contentIndex] as any\n\n if (content) {\n // Mark this content as complete\n content.status = { type: 'complete' }\n\n // Update message to trigger re-render\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n { ...message, timestamp: Date.now() },\n ...this._messages.slice(messageIndex + 1)\n ]\n this.updateMessages(updatedMessages)\n }\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 private completeStreamingContent(messageId: string): 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 // Check if any content is streaming\n const hasStreamingContent = message.content.some(content => content.status?.type === 'streaming')\n\n if (!hasStreamingContent) return\n\n // Update all streaming content to complete\n const updatedContent = message.content.map(content => {\n if (content.status?.type === 'streaming') {\n return { ...content, status: { type: 'complete' } as const }\n }\n return content\n })\n\n // Update the message with completed content\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n { ...message, content: updatedContent, timestamp: Date.now() },\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, ThreadListLoadOptions } 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 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 _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 /**\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 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(options?: ThreadListLoadOptions): Promise<ThreadListItemState[]> {\n if (!this.config.threadListAdapter) {\n console.warn('No threadListAdapter configured')\n return []\n }\n\n if (this._isLoading) {\n return []\n }\n\n if (this._abortController) {\n this._abortController.abort()\n }\n this._abortController = new AbortController()\n\n // Track search query for state\n if (options?.query !== undefined) {\n this._searchQuery = options.query\n }\n\n if (options?.replace) {\n const threadsToDelete = Array.from(this._threads.keys()).filter(id => id !== this._mainThreadId)\n for (const threadId of threadsToDelete) {\n this._threads.delete(threadId)\n this._threadItems.delete(threadId)\n this._threadStates.delete(threadId)\n }\n }\n\n this._isLoading = true\n this.notifySubscribers()\n\n try {\n const threads = await this.config.threadListAdapter.loadThreads(options)\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\n return threads\n } catch (error) {\n if (error instanceof Error && error.name !== 'AbortError') {\n console.error('Failed to load threads:', error)\n }\n return []\n } finally {\n this._isLoading = false\n this._abortController = null\n this.notifySubscribers()\n }\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 // Clear focus when switching threads (e.g., starting new conversation)\n this._contentFocusRuntime.blur()\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\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 // Check if we're already focusing this exact content\n const isAlreadyFocused =\n this._contentFocusRuntime.isActive &&\n this._contentFocusRuntime.focusedMessageId === message.id &&\n this._contentFocusRuntime.focusedContentIndex === j\n\n // Only focus if it's new content\n if (!isAlreadyFocused) {\n this._contentFocusRuntime.focus(content, message, j, 'detail')\n }\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 { ThreadListLoadOptions } from '../../types/adapters'\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: (options?: ThreadListLoadOptions) => runtime.threads.loadThreads(options),\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 { useEffect, useState } from 'react'\n\nimport { ThreadRuntime } from '../../runtime/ThreadRuntime/ThreadRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCurrentThread(): ThreadRuntime {\n const runtime = useAssistantRuntime()\n const thread = runtime.threads.getMainThread()\n\n const [, forceUpdate] = useState({})\n\n useEffect(() => {\n const unsubscribe = thread.subscribe(() => {\n forceUpdate({})\n })\n\n return unsubscribe\n }, [thread])\n\n return thread\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 const priority = config.priority ?? 0\n\n // Register handler\n if (config.execute) {\n runtime.capabilityRegistry.registerHandler(config.name, { execute: config.execute }, priority)\n }\n\n // Register renderer\n if (config.render) {\n runtime.capabilityRegistry.registerRenderer(\n config.name,\n {\n component: config.render\n },\n priority\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 { createContext, ReactNode, useCallback, useContext, useMemo, useState } from 'react'\n\nimport { ChatContextItem, ChatContextMap, ChatContextValue } from '../../types/context'\n\nconst ChatContext = createContext<ChatContextValue | undefined>(undefined)\n\nexport interface ChatContextProviderProps {\n children: ReactNode\n}\n\nexport function ChatContextProvider({ children }: ChatContextProviderProps): JSX.Element {\n const [contexts, setContexts] = useState<ChatContextMap>({})\n\n const setContext = useCallback((id: string, context: Omit<ChatContextItem, 'id'> | null) => {\n setContexts(prev => {\n if (context === null) {\n const { [id]: _, ...rest } = prev\n return rest\n }\n return {\n ...prev,\n [id]: { id, ...context }\n }\n })\n }, [])\n\n const removeContext = useCallback((id: string) => {\n setContexts(prev => {\n const { [id]: _, ...rest } = prev\n return rest\n })\n }, [])\n\n const getContextData = useCallback(() => {\n return Object.values(contexts).reduce(\n (acc, context) => {\n // Stringify non-string values for backend compatibility\n const stringifiedData = Object.entries(context.data).reduce(\n (dataAcc, [key, value]) => {\n return {\n ...dataAcc,\n [key]: typeof value === 'string' ? value : JSON.stringify(value)\n }\n },\n {} as Record<string, unknown>\n )\n return { ...acc, ...stringifiedData }\n },\n {} as Record<string, unknown>\n )\n }, [contexts])\n\n const clearContexts = useCallback(() => {\n setContexts({})\n }, [])\n\n const value = useMemo(\n () => ({\n contexts,\n setContext,\n removeContext,\n getContextData,\n clearContexts\n }),\n [contexts, setContext, removeContext, getContextData, clearContexts]\n )\n\n return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>\n}\n\nexport function useChatContext(): ChatContextValue {\n const context = useContext(ChatContext)\n if (!context) {\n throw new Error('useChatContext must be used within a ChatContextProvider')\n }\n return context\n}\n","import { useEffect } from 'react'\n\nimport { ChatContextItem } from '../../types/context'\nimport { useChatContext } from '../providers/ChatContextProvider'\n\nexport interface UsePageContextOptions extends Omit<ChatContextItem, 'id'> {\n /**\n * Optional ID for the context. Defaults to 'currentPage'.\n * Use a custom ID if you need multiple page contexts or want to namespace your context.\n */\n id?: string\n}\n\n/**\n * Hook for pages to easily register their context with the chat system.\n * Automatically cleans up the context when the component unmounts.\n *\n * @param options - Context configuration\n *\n * @example\n * ```tsx\n * function ConnectorListPage() {\n * usePageContext({\n * displayName: 'Connectors',\n * data: {\n * currentPage: { page_id: 'connectors' }\n * },\n * priority: 0\n * })\n *\n * // Rest of component...\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom ID\n * function PipelineStudio({ pipelineId, pipelineName }) {\n * usePageContext({\n * id: 'currentPipeline',\n * displayName: `Pipeline: ${pipelineName}`,\n * data: {\n * selectedPipeline: { id: pipelineId, name: pipelineName }\n * },\n * priority: 1\n * })\n * }\n * ```\n */\nexport function usePageContext(options: UsePageContextOptions): void {\n const { setContext, removeContext } = useChatContext()\n const { id = 'currentPage', ...contextData } = options\n\n useEffect(() => {\n setContext(id, contextData)\n\n return () => {\n removeContext(id)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, contextData.displayName, JSON.stringify(contextData.data), contextData.priority, contextData.icon])\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, StreamRequest } 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(\n params: StreamRequest & { messages: Message[]; conversationId?: string; signal?: AbortSignal }\n ): {\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: StreamRequest): 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","priority","entries","entry","insertIndex","e","_a","CapabilityExecutionManager","getHandler","id","args","messageId","strategy","execution","executionId","running","result","error","errorMessage","index","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","systemEvent","conversationId","title","ThreadRuntimeCore","_b","newMessage","assistantMessageId","assistantMessage","stream","event","userMessage","messageIndex","metadataEvent","capabilityEvent","capabilityContent","artifact","errorEvent","customEvent","updatedMessages","initialContent","status","updatedContent","ThreadListRuntime","mainCore","mainState","mainItem","mainThread","threads","threadItems","threadId","thread","oldMainState","newMainState","newThreadId","newCore","newThread","newState","newItem","createdState","options","threadsToDelete","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","forceUpdate","React","is","x","y","objectIs","useLayoutEffect","useDebugValue","useSyncExternalStore$2","subscribe","getSnapshot","value","_useState","inst","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","ChatContext","ChatContextProvider","contexts","setContexts","setContext","useCallback","_","rest","removeContext","getContextData","acc","stringifiedData","dataAcc","clearContexts","useMemo","jsx","useChatContext","usePageContext","contextData","CapabilityRendererComp","Component","ContentRenderer","component","AuxiliaryRenderer","onClose","onNavigate","onSwitchContext","makeCapability","Capability","BaseSSEStreamAdapter","eventType","allowedEvents","params","signal","url","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/providers/ChatContextProvider.tsx","../src/react/hooks/usePageContext.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\ninterface HandlerEntry {\n handler: CapabilityHandler\n priority: number\n}\n\ninterface RendererEntry {\n renderer: CapabilityRenderer\n priority: number\n}\n\nexport class CapabilityRegistry {\n private handlers = new Map<string, HandlerEntry[]>()\n private renderers = new Map<string, RendererEntry[]>()\n\n public registerHandler(name: string, handler: CapabilityHandler, priority = 0): void {\n const entries = this.handlers.get(name) || []\n const entry: HandlerEntry = { handler, priority }\n\n // Insert in sorted order (highest priority first)\n const insertIndex = entries.findIndex(e => e.priority < priority)\n if (insertIndex === -1) {\n entries.push(entry)\n } else {\n entries.splice(insertIndex, 0, entry)\n }\n\n this.handlers.set(name, entries)\n }\n\n public registerRenderer(name: string, renderer: CapabilityRenderer, priority = 0): void {\n const entries = this.renderers.get(name) || []\n const entry: RendererEntry = { renderer, priority }\n\n // Insert in sorted order (highest priority first)\n const insertIndex = entries.findIndex(e => e.priority < priority)\n if (insertIndex === -1) {\n entries.push(entry)\n } else {\n entries.splice(insertIndex, 0, entry)\n }\n\n this.renderers.set(name, entries)\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 const entries = this.handlers.get(name)\n return entries?.[0]?.handler\n }\n\n public getRenderer(name: string): CapabilityRenderer | undefined {\n const entries = this.renderers.get(name)\n return entries?.[0]?.renderer\n }\n\n public getStrategy() {\n return 'queue'\n }\n\n public hasHandler(name: string): boolean {\n const entries = this.handlers.get(name)\n return entries !== undefined && entries.length > 0\n }\n\n public hasRenderer(name: string): boolean {\n const entries = this.renderers.get(name)\n return entries !== undefined && entries.length > 0\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 { SystemEvent } from '../../types/adapters'\nimport { 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 isWaitingForUser(): boolean {\n return this._core.isWaitingForUser\n }\n\n public get pendingCapability(): { capabilityId: string; capabilityName: string } | null {\n return this._core.pendingCapability\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 isWaitingForUser: this._core.isWaitingForUser,\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 // If waiting for user action, auto-cancel the pending capability first\n if (this._core.isWaitingForUser && this._core.pendingCapability) {\n await this._core.startSystemEventRun({\n event_type: 'action_cancelled',\n capability_id: this._core.pendingCapability.capabilityName,\n result: { success: false }\n })\n }\n\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 /**\n * Dispatches a system event (e.g. a user click on an elicitation card).\n *\n * Prior to this change, this method wrapped startSystemEventRun in a\n * try/catch that silently swallowed the \"A run is already in progress\"\n * error thrown by the core when _isRunning was still true — causing\n * clicks fired during the tail of the previous run to disappear.\n *\n * Now we await waitForIdle() before dispatching so the event is\n * reliably delivered as soon as the in-flight run completes. Callers\n * do not need their own queueing primitive.\n */\n public async sendSystemEvent(systemEvent: SystemEvent): Promise<void> {\n await this._core.waitForIdle()\n await this._core.startSystemEventRun(systemEvent)\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, SystemEvent } 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 _isWaitingForUser = false\n private _pendingCapability: { capabilityId: string; capabilityName: string } | null = null\n private _abortController: AbortController | null = null\n private _conversationId?: string\n private _title?: string\n\n // Resolvers waiting for _isRunning to flip to false. Drained in the\n // finally block of every run path so callers can serialize their\n // dispatch against an in-progress run instead of having their error\n // swallowed by the caller's try/catch.\n private _idleWaiters: Array<() => void> = []\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 isWaitingForUser(): boolean {\n return this._isWaitingForUser\n }\n\n public get pendingCapability(): { capabilityId: string; capabilityName: string } | null {\n return this._pendingCapability\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 /**\n * Resolves when _isRunning flips to false. Use this to queue a\n * follow-on dispatch (e.g. a system event from a card click that\n * fires during the tail of the previous run) without racing the\n * in-progress run's guard.\n *\n * Resolves immediately if nothing is running.\n */\n public waitForIdle(): Promise<void> {\n if (!this._isRunning) return Promise.resolve()\n return new Promise<void>(resolve => {\n this._idleWaiters.push(resolve)\n })\n }\n\n private drainIdleWaiters(): void {\n if (this._idleWaiters.length === 0) return\n const waiters = this._idleWaiters\n this._idleWaiters = []\n for (const w of waiters) {\n try {\n w()\n } catch {\n // Resolver callbacks should not throw; swallow defensively so\n // a single bad waiter can't block the rest.\n }\n }\n }\n\n public async startSystemEventRun(systemEvent: SystemEvent): Promise<void> {\n if (this._isRunning) {\n throw new Error('A run is already in progress')\n }\n\n this._isWaitingForUser = false\n this._pendingCapability = null\n this._isRunning = true\n this._abortController = new AbortController()\n this._currentPart = null\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 systemEvent\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.completeStreamingContent(assistantMessageId)\n this.updateMessageStatus(assistantMessageId, { type: 'cancelled' })\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n this.completeStreamingContent(assistantMessageId)\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\n this.notifySubscribers()\n this.drainIdleWaiters()\n }\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._isWaitingForUser = false\n this._pendingCapability = null\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.completeStreamingContent(assistantMessageId)\n this.updateMessageStatus(assistantMessageId, { type: 'cancelled' })\n } else {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n this.completeStreamingContent(assistantMessageId)\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 this.drainIdleWaiters()\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 const capabilityContent = {\n type: 'capability',\n capabilityId: capabilityEvent.capabilityId,\n capabilityName: capabilityEvent.capabilityName,\n args: capabilityEvent.args\n } as CapabilityContent\n\n message.content.push(capabilityContent)\n\n // Check if artifact field exists (from stream event)\n const artifact = (capabilityEvent as any).artifact\n if (artifact) {\n message.content.push({\n type: 'artifact',\n data: {\n capabilityName: capabilityEvent.capabilityName,\n originalArgs: capabilityEvent.args,\n displayData: {\n name: artifact.displayName,\n type: artifact.displayType\n }\n }\n })\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\n // Track waiting_for_user status so the UI can show a waiting indicator\n const capabilityStatus = (capabilityEvent as any).status\n if (capabilityStatus === 'waiting_for_user') {\n this._isWaitingForUser = true\n this._pendingCapability = {\n capabilityId: capabilityEvent.capabilityId,\n capabilityName: capabilityEvent.capabilityName\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 status: { type: 'streaming' }\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 status: { type: 'streaming' }\n } as any\n break\n\n default:\n initialContent = {\n type: event.part.type,\n parentId: event.part.parentId,\n status: { type: 'streaming' }\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 // Find the message and content\n const messageIndex = this._messages.findIndex(m => m.id === this._currentPart!.messageId)\n if (messageIndex !== -1) {\n const message = this._messages[messageIndex]\n const content = message.content[this._currentPart.contentIndex] as any\n\n if (content) {\n // Mark this content as complete\n content.status = { type: 'complete' }\n\n // Update message to trigger re-render\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n { ...message, timestamp: Date.now() },\n ...this._messages.slice(messageIndex + 1)\n ]\n this.updateMessages(updatedMessages)\n }\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 private completeStreamingContent(messageId: string): 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 // Check if any content is streaming\n const hasStreamingContent = message.content.some(content => content.status?.type === 'streaming')\n\n if (!hasStreamingContent) return\n\n // Update all streaming content to complete\n const updatedContent = message.content.map(content => {\n if (content.status?.type === 'streaming') {\n return { ...content, status: { type: 'complete' } as const }\n }\n return content\n })\n\n // Update the message with completed content\n const updatedMessages = [\n ...this._messages.slice(0, messageIndex),\n { ...message, content: updatedContent, timestamp: Date.now() },\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, ThreadListLoadOptions } 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 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 _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 /**\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 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(options?: ThreadListLoadOptions): Promise<ThreadListItemState[]> {\n if (!this.config.threadListAdapter) {\n console.warn('No threadListAdapter configured')\n return []\n }\n\n if (this._isLoading) {\n return []\n }\n\n if (this._abortController) {\n this._abortController.abort()\n }\n this._abortController = new AbortController()\n\n // Track search query for state\n if (options?.query !== undefined) {\n this._searchQuery = options.query\n }\n\n if (options?.replace) {\n const threadsToDelete = Array.from(this._threads.keys()).filter(id => id !== this._mainThreadId)\n for (const threadId of threadsToDelete) {\n this._threads.delete(threadId)\n this._threadItems.delete(threadId)\n this._threadStates.delete(threadId)\n }\n }\n\n this._isLoading = true\n this.notifySubscribers()\n\n try {\n const threads = await this.config.threadListAdapter.loadThreads(options)\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\n return threads\n } catch (error) {\n if (error instanceof Error && error.name !== 'AbortError') {\n console.error('Failed to load threads:', error)\n }\n return []\n } finally {\n this._isLoading = false\n this._abortController = null\n this.notifySubscribers()\n }\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 // Clear focus when switching threads (e.g., starting new conversation)\n this._contentFocusRuntime.blur()\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\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 // Check if we're already focusing this exact content\n const isAlreadyFocused =\n this._contentFocusRuntime.isActive &&\n this._contentFocusRuntime.focusedMessageId === message.id &&\n this._contentFocusRuntime.focusedContentIndex === j\n\n // Only focus if it's new content\n if (!isAlreadyFocused) {\n this._contentFocusRuntime.focus(content, message, j, 'detail')\n }\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 { ThreadListLoadOptions } from '../../types/adapters'\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: (options?: ThreadListLoadOptions) => runtime.threads.loadThreads(options),\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 { useEffect, useState } from 'react'\n\nimport { ThreadRuntime } from '../../runtime/ThreadRuntime/ThreadRuntime'\nimport { useAssistantRuntime } from './useAssistantRuntime'\n\nexport function useCurrentThread(): ThreadRuntime {\n const runtime = useAssistantRuntime()\n const thread = runtime.threads.getMainThread()\n\n const [, forceUpdate] = useState({})\n\n useEffect(() => {\n const unsubscribe = thread.subscribe(() => {\n forceUpdate({})\n })\n\n return unsubscribe\n }, [thread])\n\n return thread\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 const priority = config.priority ?? 0\n\n // Register handler\n if (config.execute) {\n runtime.capabilityRegistry.registerHandler(config.name, { execute: config.execute }, priority)\n }\n\n // Register renderer\n if (config.render) {\n runtime.capabilityRegistry.registerRenderer(\n config.name,\n {\n component: config.render\n },\n priority\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 { createContext, ReactNode, useCallback, useContext, useMemo, useState } from 'react'\n\nimport { ChatContextItem, ChatContextMap, ChatContextValue } from '../../types/context'\n\nconst ChatContext = createContext<ChatContextValue | undefined>(undefined)\n\nexport interface ChatContextProviderProps {\n children: ReactNode\n}\n\nexport function ChatContextProvider({ children }: ChatContextProviderProps): JSX.Element {\n const [contexts, setContexts] = useState<ChatContextMap>({})\n\n const setContext = useCallback((id: string, context: Omit<ChatContextItem, 'id'> | null) => {\n setContexts(prev => {\n if (context === null) {\n const { [id]: _, ...rest } = prev\n return rest\n }\n return {\n ...prev,\n [id]: { id, ...context }\n }\n })\n }, [])\n\n const removeContext = useCallback((id: string) => {\n setContexts(prev => {\n const { [id]: _, ...rest } = prev\n return rest\n })\n }, [])\n\n const getContextData = useCallback(() => {\n return Object.values(contexts).reduce(\n (acc, context) => {\n // Stringify non-string values for backend compatibility\n const stringifiedData = Object.entries(context.data).reduce(\n (dataAcc, [key, value]) => {\n return {\n ...dataAcc,\n [key]: typeof value === 'string' ? value : JSON.stringify(value)\n }\n },\n {} as Record<string, unknown>\n )\n return { ...acc, ...stringifiedData }\n },\n {} as Record<string, unknown>\n )\n }, [contexts])\n\n const clearContexts = useCallback(() => {\n setContexts({})\n }, [])\n\n const value = useMemo(\n () => ({\n contexts,\n setContext,\n removeContext,\n getContextData,\n clearContexts\n }),\n [contexts, setContext, removeContext, getContextData, clearContexts]\n )\n\n return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>\n}\n\nexport function useChatContext(): ChatContextValue {\n const context = useContext(ChatContext)\n if (!context) {\n throw new Error('useChatContext must be used within a ChatContextProvider')\n }\n return context\n}\n","import { useEffect } from 'react'\n\nimport { ChatContextItem } from '../../types/context'\nimport { useChatContext } from '../providers/ChatContextProvider'\n\nexport interface UsePageContextOptions extends Omit<ChatContextItem, 'id'> {\n /**\n * Optional ID for the context. Defaults to 'currentPage'.\n * Use a custom ID if you need multiple page contexts or want to namespace your context.\n */\n id?: string\n}\n\n/**\n * Hook for pages to easily register their context with the chat system.\n * Automatically cleans up the context when the component unmounts.\n *\n * @param options - Context configuration\n *\n * @example\n * ```tsx\n * function ConnectorListPage() {\n * usePageContext({\n * displayName: 'Connectors',\n * data: {\n * currentPage: { page_id: 'connectors' }\n * },\n * priority: 0\n * })\n *\n * // Rest of component...\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom ID\n * function PipelineStudio({ pipelineId, pipelineName }) {\n * usePageContext({\n * id: 'currentPipeline',\n * displayName: `Pipeline: ${pipelineName}`,\n * data: {\n * selectedPipeline: { id: pipelineId, name: pipelineName }\n * },\n * priority: 1\n * })\n * }\n * ```\n */\nexport function usePageContext(options: UsePageContextOptions): void {\n const { setContext, removeContext } = useChatContext()\n const { id = 'currentPage', ...contextData } = options\n\n useEffect(() => {\n setContext(id, contextData)\n\n return () => {\n removeContext(id)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, contextData.displayName, JSON.stringify(contextData.data), contextData.priority, contextData.icon])\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, StreamRequest } 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(\n params: StreamRequest & { messages: Message[]; conversationId?: string; signal?: AbortSignal }\n ): {\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: StreamRequest): 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","priority","entries","entry","insertIndex","e","_a","CapabilityExecutionManager","getHandler","id","args","messageId","strategy","execution","executionId","running","result","error","errorMessage","index","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","systemEvent","conversationId","title","ThreadRuntimeCore","_b","newMessage","resolve","waiters","w","assistantMessageId","assistantMessage","stream","event","userMessage","messageIndex","metadataEvent","capabilityEvent","capabilityContent","artifact","errorEvent","customEvent","updatedMessages","initialContent","status","updatedContent","ThreadListRuntime","mainCore","mainState","mainItem","mainThread","threads","threadItems","threadId","thread","oldMainState","newMainState","newThreadId","newCore","newThread","newState","newItem","createdState","options","threadsToDelete","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","forceUpdate","React","is","x","y","objectIs","useLayoutEffect","useDebugValue","useSyncExternalStore$2","subscribe","getSnapshot","value","_useState","inst","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","ChatContext","ChatContextProvider","contexts","setContexts","setContext","useCallback","_","rest","removeContext","getContextData","acc","stringifiedData","dataAcc","clearContexts","useMemo","jsx","useChatContext","usePageContext","contextData","CapabilityRendererComp","Component","ContentRenderer","component","AuxiliaryRenderer","onClose","onNavigate","onSwitchContext","makeCapability","Capability","BaseSSEStreamAdapter","eventType","allowedEvents","params","signal","url","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]}
@@ -22,6 +22,18 @@ export declare class ThreadRuntime extends BaseSubscribable {
22
22
  getState(): ThreadState;
23
23
  append(message: AppendMessage): void;
24
24
  send(text: string): Promise<void>;
25
+ /**
26
+ * Dispatches a system event (e.g. a user click on an elicitation card).
27
+ *
28
+ * Prior to this change, this method wrapped startSystemEventRun in a
29
+ * try/catch that silently swallowed the "A run is already in progress"
30
+ * error thrown by the core when _isRunning was still true — causing
31
+ * clicks fired during the tail of the previous run to disappear.
32
+ *
33
+ * Now we await waitForIdle() before dispatching so the event is
34
+ * reliably delivered as soon as the in-flight run completes. Callers
35
+ * do not need their own queueing primitive.
36
+ */
25
37
  sendSystemEvent(systemEvent: SystemEvent): Promise<void>;
26
38
  cancelRun(): void;
27
39
  clear(): void;
@@ -19,6 +19,7 @@ export declare class ThreadRuntimeCore extends BaseSubscribable {
19
19
  private _abortController;
20
20
  private _conversationId?;
21
21
  private _title?;
22
+ private _idleWaiters;
22
23
  private _currentPart;
23
24
  constructor(config: ThreadRuntimeCoreConfig);
24
25
  get messages(): readonly Message[];
@@ -34,6 +35,16 @@ export declare class ThreadRuntimeCore extends BaseSubscribable {
34
35
  get capabilities(): RuntimeCapabilities;
35
36
  private updateMessages;
36
37
  append(message: AppendMessage): void;
38
+ /**
39
+ * Resolves when _isRunning flips to false. Use this to queue a
40
+ * follow-on dispatch (e.g. a system event from a card click that
41
+ * fires during the tail of the previous run) without racing the
42
+ * in-progress run's guard.
43
+ *
44
+ * Resolves immediately if nothing is running.
45
+ */
46
+ waitForIdle(): Promise<void>;
47
+ private drainIdleWaiters;
37
48
  startSystemEventRun(systemEvent: SystemEvent): Promise<void>;
38
49
  startRun(userMessage: AppendMessage): Promise<void>;
39
50
  private handleStreamEvent;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@harnessio/ai-chat-core",
3
- "version": "0.0.20",
3
+ "version": "0.0.21",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "private": false,
@@ -52,6 +52,7 @@
52
52
  "build": "vite build",
53
53
  "build:ci": "vite build",
54
54
  "build:watch": "vite build --watch",
55
+ "test": "jest",
55
56
  "pretty": "prettier --check ./src",
56
57
  "pre-commit": "lint-staged"
57
58
  }