@assistant-ui/react 0.7.9 → 0.7.10

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.
Files changed (133) hide show
  1. package/dist/api/AssistantRuntime.d.ts +4 -5
  2. package/dist/api/AssistantRuntime.d.ts.map +1 -1
  3. package/dist/api/AssistantRuntime.js +16 -19
  4. package/dist/api/AssistantRuntime.js.map +1 -1
  5. package/dist/api/AssistantRuntime.mjs +16 -19
  6. package/dist/api/AssistantRuntime.mjs.map +1 -1
  7. package/dist/api/ThreadListItemRuntime.d.ts +11 -2
  8. package/dist/api/ThreadListItemRuntime.d.ts.map +1 -1
  9. package/dist/api/ThreadListItemRuntime.js +16 -5
  10. package/dist/api/ThreadListItemRuntime.js.map +1 -1
  11. package/dist/api/ThreadListItemRuntime.mjs +16 -5
  12. package/dist/api/ThreadListItemRuntime.mjs.map +1 -1
  13. package/dist/api/ThreadListRuntime.d.ts +3 -0
  14. package/dist/api/ThreadListRuntime.d.ts.map +1 -1
  15. package/dist/api/ThreadListRuntime.js +27 -8
  16. package/dist/api/ThreadListRuntime.js.map +1 -1
  17. package/dist/api/ThreadListRuntime.mjs +27 -8
  18. package/dist/api/ThreadListRuntime.mjs.map +1 -1
  19. package/dist/api/ThreadRuntime.d.ts +10 -7
  20. package/dist/api/ThreadRuntime.d.ts.map +1 -1
  21. package/dist/api/ThreadRuntime.js +16 -6
  22. package/dist/api/ThreadRuntime.js.map +1 -1
  23. package/dist/api/ThreadRuntime.mjs +16 -6
  24. package/dist/api/ThreadRuntime.mjs.map +1 -1
  25. package/dist/context/providers/AssistantRuntimeProvider.d.ts.map +1 -1
  26. package/dist/context/providers/AssistantRuntimeProvider.js +8 -1
  27. package/dist/context/providers/AssistantRuntimeProvider.js.map +1 -1
  28. package/dist/context/providers/AssistantRuntimeProvider.mjs +8 -1
  29. package/dist/context/providers/AssistantRuntimeProvider.mjs.map +1 -1
  30. package/dist/context/providers/ThreadRuntimeProvider.d.ts +2 -0
  31. package/dist/context/providers/ThreadRuntimeProvider.d.ts.map +1 -1
  32. package/dist/context/providers/ThreadRuntimeProvider.js +3 -2
  33. package/dist/context/providers/ThreadRuntimeProvider.js.map +1 -1
  34. package/dist/context/providers/ThreadRuntimeProvider.mjs +3 -2
  35. package/dist/context/providers/ThreadRuntimeProvider.mjs.map +1 -1
  36. package/dist/internal.d.ts +1 -2
  37. package/dist/internal.d.ts.map +1 -1
  38. package/dist/internal.js +0 -3
  39. package/dist/internal.js.map +1 -1
  40. package/dist/internal.mjs +0 -2
  41. package/dist/internal.mjs.map +1 -1
  42. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  43. package/dist/primitives/composer/ComposerInput.js +3 -1
  44. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  45. package/dist/primitives/composer/ComposerInput.mjs +3 -1
  46. package/dist/primitives/composer/ComposerInput.mjs.map +1 -1
  47. package/dist/runtimes/core/BaseThreadRuntimeCore.d.ts +2 -4
  48. package/dist/runtimes/core/BaseThreadRuntimeCore.d.ts.map +1 -1
  49. package/dist/runtimes/core/BaseThreadRuntimeCore.js +1 -5
  50. package/dist/runtimes/core/BaseThreadRuntimeCore.js.map +1 -1
  51. package/dist/runtimes/core/BaseThreadRuntimeCore.mjs +1 -5
  52. package/dist/runtimes/core/BaseThreadRuntimeCore.mjs.map +1 -1
  53. package/dist/runtimes/core/ThreadListRuntimeCore.d.ts +14 -6
  54. package/dist/runtimes/core/ThreadListRuntimeCore.d.ts.map +1 -1
  55. package/dist/runtimes/core/ThreadListRuntimeCore.js.map +1 -1
  56. package/dist/runtimes/core/ThreadRuntimeCore.d.ts +1 -15
  57. package/dist/runtimes/core/ThreadRuntimeCore.d.ts.map +1 -1
  58. package/dist/runtimes/core/ThreadRuntimeCore.js.map +1 -1
  59. package/dist/runtimes/core/index.d.ts +1 -1
  60. package/dist/runtimes/core/index.d.ts.map +1 -1
  61. package/dist/runtimes/core/index.js.map +1 -1
  62. package/dist/runtimes/external-store/ExternalStoreAdapter.d.ts +20 -3
  63. package/dist/runtimes/external-store/ExternalStoreAdapter.d.ts.map +1 -1
  64. package/dist/runtimes/external-store/ExternalStoreAdapter.js.map +1 -1
  65. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.d.ts +0 -1
  66. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.d.ts.map +1 -1
  67. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.js +3 -10
  68. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.js.map +1 -1
  69. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.mjs +3 -10
  70. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.mjs.map +1 -1
  71. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.d.ts +9 -11
  72. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.d.ts.map +1 -1
  73. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.js +19 -27
  74. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.js.map +1 -1
  75. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.mjs +19 -27
  76. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.mjs.map +1 -1
  77. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts +2 -2
  78. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts.map +1 -1
  79. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js +4 -7
  80. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js.map +1 -1
  81. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.mjs +4 -7
  82. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.mjs.map +1 -1
  83. package/dist/runtimes/local/LocalRuntimeCore.d.ts +0 -1
  84. package/dist/runtimes/local/LocalRuntimeCore.d.ts.map +1 -1
  85. package/dist/runtimes/local/LocalRuntimeCore.js +3 -12
  86. package/dist/runtimes/local/LocalRuntimeCore.js.map +1 -1
  87. package/dist/runtimes/local/LocalRuntimeCore.mjs +3 -12
  88. package/dist/runtimes/local/LocalRuntimeCore.mjs.map +1 -1
  89. package/dist/runtimes/local/LocalThreadListRuntimeCore.d.ts +17 -15
  90. package/dist/runtimes/local/LocalThreadListRuntimeCore.d.ts.map +1 -1
  91. package/dist/runtimes/local/LocalThreadListRuntimeCore.js +94 -92
  92. package/dist/runtimes/local/LocalThreadListRuntimeCore.js.map +1 -1
  93. package/dist/runtimes/local/LocalThreadListRuntimeCore.mjs +94 -92
  94. package/dist/runtimes/local/LocalThreadListRuntimeCore.mjs.map +1 -1
  95. package/dist/runtimes/local/LocalThreadRuntimeCore.d.ts +4 -3
  96. package/dist/runtimes/local/LocalThreadRuntimeCore.d.ts.map +1 -1
  97. package/dist/runtimes/local/LocalThreadRuntimeCore.js +11 -10
  98. package/dist/runtimes/local/LocalThreadRuntimeCore.js.map +1 -1
  99. package/dist/runtimes/local/LocalThreadRuntimeCore.mjs +11 -10
  100. package/dist/runtimes/local/LocalThreadRuntimeCore.mjs.map +1 -1
  101. package/dist/runtimes/local/useLocalRuntime.d.ts.map +1 -1
  102. package/dist/runtimes/local/useLocalRuntime.js +4 -7
  103. package/dist/runtimes/local/useLocalRuntime.js.map +1 -1
  104. package/dist/runtimes/local/useLocalRuntime.mjs +4 -7
  105. package/dist/runtimes/local/useLocalRuntime.mjs.map +1 -1
  106. package/package.json +1 -1
  107. package/src/api/AssistantRuntime.ts +21 -25
  108. package/src/api/ThreadListItemRuntime.ts +36 -7
  109. package/src/api/ThreadListRuntime.ts +31 -9
  110. package/src/api/ThreadRuntime.ts +38 -10
  111. package/src/context/providers/AssistantRuntimeProvider.tsx +4 -1
  112. package/src/context/providers/ThreadRuntimeProvider.tsx +9 -2
  113. package/src/internal.ts +1 -1
  114. package/src/primitives/composer/ComposerInput.tsx +3 -1
  115. package/src/runtimes/core/BaseThreadRuntimeCore.tsx +1 -9
  116. package/src/runtimes/core/ThreadListRuntimeCore.tsx +16 -7
  117. package/src/runtimes/core/ThreadRuntimeCore.tsx +1 -19
  118. package/src/runtimes/core/index.ts +0 -1
  119. package/src/runtimes/external-store/ExternalStoreAdapter.tsx +20 -3
  120. package/src/runtimes/external-store/ExternalStoreRuntimeCore.tsx +5 -12
  121. package/src/runtimes/external-store/ExternalStoreThreadListRuntimeCore.tsx +22 -35
  122. package/src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx +3 -7
  123. package/src/runtimes/local/LocalRuntimeCore.tsx +7 -14
  124. package/src/runtimes/local/LocalThreadListRuntimeCore.tsx +110 -103
  125. package/src/runtimes/local/LocalThreadRuntimeCore.tsx +11 -10
  126. package/src/runtimes/local/useLocalRuntime.tsx +5 -12
  127. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.d.ts +0 -19
  128. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.d.ts.map +0 -1
  129. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.js +0 -87
  130. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.js.map +0 -1
  131. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.mjs +0 -62
  132. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.mjs.map +0 -1
  133. package/src/runtimes/local/LocalThreadMetadataRuntimeCore.tsx +0 -79
@@ -21,6 +21,7 @@ export type ThreadListRuntime = {
21
21
 
22
22
  subscribe(callback: () => void): Unsubscribe;
23
23
 
24
+ readonly mainThreadListItem: ThreadListItemRuntime;
24
25
  getThreadListItemById(threadId: string): ThreadListItemRuntime;
25
26
  getThreadListItemByIndex(idx: number): ThreadListItemRuntime;
26
27
  getThreadListArchivedItemByIndex(idx: number): ThreadListItemRuntime;
@@ -30,10 +31,10 @@ const getThreadListState = (
30
31
  threadList: ThreadListRuntimeCore,
31
32
  ): ThreadListState => {
32
33
  return {
33
- mainThreadId: threadList.mainThread.metadata.threadId,
34
- newThread: threadList.newThread,
35
- threads: threadList.threads,
36
- archivedThreads: threadList.archivedThreads,
34
+ mainThreadId: threadList.mainThreadId,
35
+ newThread: threadList.newThreadId,
36
+ threads: threadList.threadIds,
37
+ archivedThreads: threadList.archivedThreadIds,
37
38
  };
38
39
  };
39
40
 
@@ -43,13 +44,14 @@ const getThreadListItemState = (
43
44
  ): ThreadListItemState | SKIP_UPDATE => {
44
45
  if (threadId === undefined) return SKIP_UPDATE;
45
46
 
46
- const threadData = threadList.getThreadMetadataById(threadId);
47
+ const threadData = threadList.getItemById(threadId);
47
48
  if (!threadData) return SKIP_UPDATE;
48
49
  return {
49
- threadId: threadData.threadId,
50
+ id: threadData.threadId,
51
+ threadId: threadData.threadId, // TODO remove in 0.8.0
50
52
  title: threadData.title,
51
53
  state: threadData.state,
52
- isMain: threadList.mainThread.metadata.threadId === threadId,
54
+ isMain: threadData.threadId === threadList.mainThreadId,
53
55
  };
54
56
  };
55
57
 
@@ -65,6 +67,20 @@ export class ThreadListRuntimeImpl implements ThreadListRuntime {
65
67
  });
66
68
 
67
69
  this._getState = stateBinding.getState.bind(stateBinding);
70
+
71
+ this._mainThreadListItemRuntime = new ThreadListItemRuntimeImpl(
72
+ new ShallowMemoizeSubject({
73
+ path: {
74
+ ref: `threadItems[main]`,
75
+ threadSelector: { type: "main" },
76
+ },
77
+ getState: () => {
78
+ return getThreadListItemState(this._core, this._core.mainThreadId);
79
+ },
80
+ subscribe: (callback) => this._core.subscribe(callback),
81
+ }),
82
+ this._core,
83
+ );
68
84
  }
69
85
 
70
86
  public getState(): ThreadListState {
@@ -75,6 +91,12 @@ export class ThreadListRuntimeImpl implements ThreadListRuntime {
75
91
  return this._core.subscribe(callback);
76
92
  }
77
93
 
94
+ private _mainThreadListItemRuntime;
95
+
96
+ public get mainThreadListItem() {
97
+ return this._mainThreadListItemRuntime;
98
+ }
99
+
78
100
  public getThreadListItemByIndex(idx: number) {
79
101
  return new ThreadListItemRuntimeImpl(
80
102
  new ShallowMemoizeSubject({
@@ -83,7 +105,7 @@ export class ThreadListRuntimeImpl implements ThreadListRuntime {
83
105
  threadSelector: { type: "index", index: idx },
84
106
  },
85
107
  getState: () => {
86
- return getThreadListItemState(this._core, this._core.threads[idx]);
108
+ return getThreadListItemState(this._core, this._core.threadIds[idx]);
87
109
  },
88
110
  subscribe: (callback) => this._core.subscribe(callback),
89
111
  }),
@@ -101,7 +123,7 @@ export class ThreadListRuntimeImpl implements ThreadListRuntime {
101
123
  getState: () => {
102
124
  return getThreadListItemState(
103
125
  this._core,
104
- this._core.archivedThreads[idx],
126
+ this._core.archivedThreadIds[idx],
105
127
  );
106
128
  },
107
129
  subscribe: (callback) => this._core.subscribe(callback),
@@ -4,7 +4,6 @@ import {
4
4
  ThreadRuntimeCore,
5
5
  SpeechState,
6
6
  ThreadRuntimeEventType,
7
- ThreadMetadata,
8
7
  } from "../runtimes/core/ThreadRuntimeCore";
9
8
  import { ExportedMessageRepository } from "../runtimes/utils/MessageRepository";
10
9
  import {
@@ -30,7 +29,12 @@ import {
30
29
  } from "./ComposerRuntime";
31
30
  import { LazyMemoizeSubject } from "./subscribable/LazyMemoizeSubject";
32
31
  import { SKIP_UPDATE } from "./subscribable/SKIP_UPDATE";
33
- import { MessageRuntimePath, ThreadRuntimePath } from "./RuntimePathTypes";
32
+ import {
33
+ MessageRuntimePath,
34
+ ThreadListItemRuntimePath,
35
+ ThreadRuntimePath,
36
+ } from "./RuntimePathTypes";
37
+ import { ThreadListItemState } from "./ThreadListItemRuntime";
34
38
 
35
39
  export type CreateAppendMessage =
36
40
  | string
@@ -74,17 +78,24 @@ export type ThreadRuntimeCoreBinding = SubscribableWithState<
74
78
  outerSubscribe(callback: () => void): Unsubscribe;
75
79
  };
76
80
 
81
+ export type ThreadListItemRuntimeBinding = SubscribableWithState<
82
+ ThreadListItemState,
83
+ ThreadListItemRuntimePath
84
+ >;
85
+
77
86
  export type ThreadState = {
78
87
  /**
79
88
  * The thread ID.
80
- * @deprecated This field is deprecated and will be removed in 0.8.0. Use `metadata.threadId` instead.
89
+ * @deprecated This field is deprecated and will be removed in 0.8.0. Use `useThreadListItem().id` instead.
81
90
  */
82
91
  readonly threadId: string;
83
92
 
84
93
  /**
85
94
  * The thread metadata.
95
+ *
96
+ * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.8.0.
86
97
  */
87
- readonly metadata: ThreadMetadata;
98
+ readonly metadata: ThreadListItemState;
88
99
 
89
100
  /**
90
101
  * Whether the thread is disabled. Disabled threads cannot receive new messages.
@@ -122,11 +133,14 @@ export type ThreadState = {
122
133
  readonly speech: SpeechState | undefined;
123
134
  };
124
135
 
125
- export const getThreadState = (runtime: ThreadRuntimeCore): ThreadState => {
136
+ export const getThreadState = (
137
+ runtime: ThreadRuntimeCore,
138
+ threadListItemState: ThreadListItemState,
139
+ ): ThreadState => {
126
140
  const lastMessage = runtime.messages.at(-1);
127
141
  return Object.freeze({
128
- threadId: runtime.metadata.threadId,
129
- metadata: runtime.metadata,
142
+ threadId: threadListItemState.id,
143
+ metadata: threadListItemState,
130
144
  capabilities: runtime.capabilities,
131
145
  isDisabled: runtime.isDisabled,
132
146
  isRunning:
@@ -208,11 +222,25 @@ export class ThreadRuntimeImpl implements ThreadRuntime {
208
222
  getStateState(): ThreadState;
209
223
  };
210
224
 
211
- constructor(threadBinding: ThreadRuntimeCoreBinding) {
225
+ constructor(
226
+ threadBinding: ThreadRuntimeCoreBinding,
227
+ threadListItemBinding: ThreadListItemRuntimeBinding,
228
+ ) {
212
229
  const stateBinding = new LazyMemoizeSubject({
213
230
  path: threadBinding.path,
214
- getState: () => getThreadState(threadBinding.getState()),
215
- subscribe: (callback) => threadBinding.subscribe(callback),
231
+ getState: () =>
232
+ getThreadState(
233
+ threadBinding.getState(),
234
+ threadListItemBinding.getState(),
235
+ ),
236
+ subscribe: (callback) => {
237
+ const sub1 = threadBinding.subscribe(callback);
238
+ const sub2 = threadListItemBinding.subscribe(callback);
239
+ return () => {
240
+ sub1();
241
+ sub2();
242
+ };
243
+ },
216
244
  });
217
245
 
218
246
  this._threadBinding = {
@@ -61,7 +61,10 @@ export const AssistantRuntimeProviderImpl: FC<
61
61
 
62
62
  return (
63
63
  <AssistantContext.Provider value={context}>
64
- <ThreadRuntimeProvider runtime={runtime.thread}>
64
+ <ThreadRuntimeProvider
65
+ runtime={runtime.thread}
66
+ listItemRuntime={runtime.threadList.mainThreadListItem}
67
+ >
65
68
  {children}
66
69
  </ThreadRuntimeProvider>
67
70
  </AssistantContext.Provider>
@@ -7,8 +7,11 @@ import { writableStore } from "../ReadonlyStore";
7
7
  import { ThreadRuntime } from "../../api/ThreadRuntime";
8
8
  import { create } from "zustand";
9
9
  import { ThreadComposerRuntime } from "../../api/ComposerRuntime";
10
+ import { ThreadListItemRuntime } from "../../api/ThreadListItemRuntime";
11
+ import { ThreadListItemRuntimeProvider } from "./ThreadListItemRuntimeProvider";
10
12
 
11
13
  type ThreadProviderProps = {
14
+ listItemRuntime: ThreadListItemRuntime;
12
15
  runtime: ThreadRuntime;
13
16
  };
14
17
 
@@ -49,7 +52,7 @@ const useThreadComposerStore = (runtime: ThreadComposerRuntime) => {
49
52
 
50
53
  export const ThreadRuntimeProvider: FC<
51
54
  PropsWithChildren<ThreadProviderProps>
52
- > = ({ children, runtime }) => {
55
+ > = ({ children, listItemRuntime: threadListItemRuntime, runtime }) => {
53
56
  const useThreadRuntime = useThreadRuntimeStore(runtime);
54
57
  const useThread = useThreadStore(runtime);
55
58
  const useThreadComposer = useThreadComposerStore(runtime.composer);
@@ -66,6 +69,10 @@ export const ThreadRuntimeProvider: FC<
66
69
  }, [useThread, useThreadRuntime, useThreadComposer]);
67
70
 
68
71
  return (
69
- <ThreadContext.Provider value={context}>{children}</ThreadContext.Provider>
72
+ <ThreadListItemRuntimeProvider runtime={threadListItemRuntime}>
73
+ <ThreadContext.Provider value={context}>
74
+ {children}
75
+ </ThreadContext.Provider>
76
+ </ThreadListItemRuntimeProvider>
70
77
  );
71
78
  };
package/src/internal.ts CHANGED
@@ -10,7 +10,7 @@ export { AssistantRuntimeImpl } from "./api/AssistantRuntime";
10
10
  export {
11
11
  ThreadRuntimeImpl,
12
12
  type ThreadRuntimeCoreBinding,
13
+ type ThreadListItemRuntimeBinding,
13
14
  } from "./api/ThreadRuntime";
14
- export { LocalThreadMetadataRuntimeCore } from "./runtimes/local/LocalThreadMetadataRuntimeCore";
15
15
 
16
16
  export * from "./utils/smooth";
@@ -20,6 +20,7 @@ import {
20
20
  import { useThread, useThreadRuntime } from "../../context/react/ThreadContext";
21
21
  import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
22
22
  import { useOnScrollToBottom } from "../../utils/hooks/useOnScrollToBottom";
23
+ import { useThreadListItemRuntime } from "../../context/react/ThreadListItemContext";
23
24
 
24
25
  export namespace ComposerPrimitiveInput {
25
26
  export type Element = HTMLTextAreaElement;
@@ -53,6 +54,7 @@ export const ComposerPrimitiveInput = forwardRef<
53
54
  },
54
55
  forwardedRef,
55
56
  ) => {
57
+ const threadListItemRuntime = useThreadListItemRuntime();
56
58
  const threadRuntime = useThreadRuntime();
57
59
  const composerRuntime = useComposerRuntime();
58
60
 
@@ -124,7 +126,7 @@ export const ComposerPrimitiveInput = forwardRef<
124
126
  if (composerRuntime.type !== "thread" || !unstable_focusOnThreadSwitched)
125
127
  return undefined;
126
128
 
127
- return threadRuntime.unstable_on("switched-to", focus);
129
+ return threadListItemRuntime.unstable_on("switched-to", focus);
128
130
  }, [unstable_focusOnThreadSwitched]);
129
131
 
130
132
  return (
@@ -17,7 +17,6 @@ import {
17
17
  RuntimeCapabilities,
18
18
  SubmittedFeedback,
19
19
  ThreadRuntimeEventType,
20
- ThreadMetadataRuntimeCore,
21
20
  } from "../core/ThreadRuntimeCore";
22
21
  import { DefaultEditComposerRuntimeCore } from "../composer/DefaultEditComposerRuntimeCore";
23
22
  import { SpeechSynthesisAdapter } from "../speech/SpeechAdapterTypes";
@@ -46,20 +45,13 @@ export abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {
46
45
  public abstract addToolResult(options: AddToolResultOptions): void;
47
46
  public abstract cancelRun(): void;
48
47
 
49
- public get metadata() {
50
- return this._metadata;
51
- }
52
-
53
48
  public get messages() {
54
49
  return this.repository.getMessages();
55
50
  }
56
51
 
57
52
  public readonly composer = new DefaultThreadComposerRuntimeCore(this);
58
53
 
59
- constructor(
60
- private readonly _configProvider: ModelConfigProvider,
61
- private readonly _metadata: ThreadMetadataRuntimeCore,
62
- ) {}
54
+ constructor(private readonly _configProvider: ModelConfigProvider) {}
63
55
 
64
56
  public getModelConfig() {
65
57
  return this._configProvider.getModelConfig();
@@ -1,21 +1,30 @@
1
1
  import { Unsubscribe } from "../../types";
2
- import { ThreadMetadata, ThreadRuntimeCore } from "./ThreadRuntimeCore";
2
+ import { ThreadRuntimeCore } from "./ThreadRuntimeCore";
3
+
4
+ type ThreadListItemCoreState = {
5
+ readonly threadId: string;
6
+ readonly state: "archived" | "regular" | "new" | "deleted";
7
+ readonly title?: string | undefined;
8
+
9
+ readonly runtime?: ThreadRuntimeCore | undefined;
10
+ };
3
11
 
4
12
  export type ThreadListRuntimeCore = {
5
- mainThread: ThreadRuntimeCore;
13
+ mainThreadId: string;
14
+ newThreadId: string | undefined;
6
15
 
7
- newThread: string | undefined;
8
- threads: readonly string[];
9
- archivedThreads: readonly string[];
16
+ threadIds: readonly string[];
17
+ archivedThreadIds: readonly string[];
10
18
 
11
- getThreadMetadataById(threadId: string): ThreadMetadata | undefined;
19
+ getMainThreadRuntimeCore(): ThreadRuntimeCore;
20
+ getItemById(threadId: string): ThreadListItemCoreState | undefined;
12
21
 
13
22
  switchToThread(threadId: string): Promise<void>;
14
23
  switchToNewThread(): Promise<void>;
15
24
 
16
25
  // getLoadThreadsPromise(): Promise<void>;
17
26
  // getLoadArchivedThreadsPromise(): Promise<void>;
18
- // create(): Promise<ThreadMetadata>;
27
+
19
28
  rename(threadId: string, newTitle: string): Promise<void>;
20
29
  archive(threadId: string): Promise<void>;
21
30
  unarchive(threadId: string): Promise<void>;
@@ -43,30 +43,12 @@ export type SubmittedFeedback = {
43
43
  readonly type: "negative" | "positive";
44
44
  };
45
45
 
46
- export type ThreadMetadata = Readonly<{
47
- readonly threadId: string;
48
- readonly state: "archived" | "regular" | "new" | "deleted";
49
- readonly title?: string | undefined;
50
- }>;
51
-
52
46
  export type ThreadRuntimeEventType =
53
- | "switched-to"
54
- | "switched-away"
55
47
  | "run-start"
48
+ | "initialize"
56
49
  | "model-config-update";
57
50
 
58
- export type ThreadMetadataRuntimeCore = ThreadMetadata & {
59
- create(title?: string): Promise<void>;
60
- rename(newTitle: string): Promise<void>;
61
- archive(): Promise<void>;
62
- unarchive(): Promise<void>;
63
- delete(): Promise<void>;
64
- subscribe(callback: () => void): Unsubscribe;
65
- };
66
-
67
51
  export type ThreadRuntimeCore = Readonly<{
68
- metadata: ThreadMetadataRuntimeCore;
69
-
70
52
  getMessageById: (messageId: string) =>
71
53
  | {
72
54
  parentId: string | null;
@@ -2,5 +2,4 @@ export type {
2
2
  AddToolResultOptions,
3
3
  SubmitFeedbackOptions,
4
4
  ThreadSuggestion,
5
- ThreadMetadataRuntimeCore,
6
5
  } from "./ThreadRuntimeCore";
@@ -2,18 +2,32 @@ import { AppendMessage, ThreadMessage } from "../../types";
2
2
  import { AttachmentAdapter } from "../attachment";
3
3
  import {
4
4
  AddToolResultOptions,
5
- ThreadMetadata,
6
5
  ThreadSuggestion,
7
6
  } from "../core/ThreadRuntimeCore";
8
7
  import { FeedbackAdapter } from "../feedback/FeedbackAdapter";
9
8
  import { SpeechSynthesisAdapter } from "../speech/SpeechAdapterTypes";
10
9
  import { ThreadMessageLike } from "./ThreadMessageLike";
11
10
 
11
+ export type ExternalStoreThreadData<TState extends "regular" | "archived"> = {
12
+ state: TState;
13
+ threadId: string;
14
+ title?: string | undefined;
15
+ };
16
+
12
17
  export type ExternalStoreThreadListAdapter = {
18
+ /**
19
+ * @deprecated This API is still under active development and might change without notice.
20
+ */
13
21
  threadId?: string | undefined;
14
- threads?: readonly ThreadMetadata[] | undefined;
15
- archivedThreads?: readonly ThreadMetadata[] | undefined;
22
+ threads?: readonly ExternalStoreThreadData<"regular">[] | undefined;
23
+ archivedThreads?: readonly ExternalStoreThreadData<"archived">[] | undefined;
24
+ /**
25
+ * @deprecated This API is still under active development and might change without notice.
26
+ */
16
27
  onSwitchToNewThread?: (() => Promise<void> | void) | undefined;
28
+ /**
29
+ * @deprecated This API is still under active development and might change without notice.
30
+ */
17
31
  onSwitchToThread?: ((threadId: string) => Promise<void> | void) | undefined;
18
32
  onRename?: (
19
33
  threadId: string,
@@ -54,6 +68,9 @@ type ExternalStoreAdapterBase<T> = {
54
68
  attachments?: AttachmentAdapter | undefined;
55
69
  speech?: SpeechSynthesisAdapter | undefined;
56
70
  feedback?: FeedbackAdapter | undefined;
71
+ /**
72
+ * @deprecated This API is still under active development and might change without notice.
73
+ */
57
74
  threadList?: ExternalStoreThreadListAdapter | undefined;
58
75
  }
59
76
  | undefined;
@@ -12,25 +12,18 @@ const getThreadListAdapter = (store: ExternalStoreAdapter<any>) => {
12
12
  export class ExternalStoreRuntimeCore extends BaseAssistantRuntimeCore {
13
13
  public readonly threadList;
14
14
 
15
- private _store: ExternalStoreAdapter<any>;
16
-
17
15
  constructor(store: ExternalStoreAdapter<any>) {
18
16
  super();
19
- this._store = store;
20
17
  this.threadList = new ExternalStoreThreadListRuntimeCore(
21
18
  getThreadListAdapter(store),
22
- (threadId) =>
23
- new ExternalStoreThreadRuntimeCore(
24
- this._proxyConfigProvider,
25
- threadId,
26
- this._store,
27
- ),
19
+ () =>
20
+ new ExternalStoreThreadRuntimeCore(this._proxyConfigProvider, store),
28
21
  );
29
22
  }
30
23
 
31
24
  public setStore(store: ExternalStoreAdapter<any>) {
32
- this._store = store;
33
- this.threadList.setAdapter(getThreadListAdapter(store));
34
- this.threadList.mainThread.setStore(store);
25
+ // Update the thread list adapter and propagate store changes to the main thread
26
+ this.threadList.__internal_setAdapter(getThreadListAdapter(store));
27
+ this.threadList.getMainThreadRuntimeCore().__internal_setStore(store);
35
28
  }
36
29
  }
@@ -3,9 +3,7 @@ import { ExternalStoreThreadRuntimeCore } from "./ExternalStoreThreadRuntimeCore
3
3
  import { ThreadListRuntimeCore } from "../core/ThreadListRuntimeCore";
4
4
  import { ExternalStoreThreadListAdapter } from "./ExternalStoreAdapter";
5
5
 
6
- export type ExternalStoreThreadFactory = (
7
- threadId: string,
8
- ) => ExternalStoreThreadRuntimeCore;
6
+ export type ExternalStoreThreadFactory = () => ExternalStoreThreadRuntimeCore;
9
7
 
10
8
  const EMPTY_ARRAY = Object.freeze([]);
11
9
  const DEFAULT_THREAD_ID = "DEFAULT_THREAD_ID";
@@ -13,35 +11,40 @@ const DEFAULT_THREAD_ID = "DEFAULT_THREAD_ID";
13
11
  export class ExternalStoreThreadListRuntimeCore
14
12
  implements ThreadListRuntimeCore
15
13
  {
16
- private _threads: readonly string[] = [];
17
- private _archivedThreads: readonly string[] = [];
14
+ private _mainThreadId: string = DEFAULT_THREAD_ID;
15
+ private _threads: readonly string[] = EMPTY_ARRAY;
16
+ private _archivedThreads: readonly string[] = EMPTY_ARRAY;
18
17
 
19
- public get newThread() {
18
+ public get newThreadId() {
20
19
  return undefined;
21
20
  }
22
21
 
23
- public get threads() {
22
+ public get threadIds() {
24
23
  return this._threads;
25
24
  }
26
25
 
27
- public get archivedThreads() {
26
+ public get archivedThreadIds() {
28
27
  return this._archivedThreads;
29
28
  }
30
29
 
31
30
  private _mainThread: ExternalStoreThreadRuntimeCore;
32
31
 
33
- public get mainThread() {
34
- return this._mainThread;
32
+ public get mainThreadId() {
33
+ return this._mainThreadId;
35
34
  }
36
35
 
37
36
  constructor(
38
37
  private adapter: ExternalStoreThreadListAdapter = {},
39
38
  private threadFactory: ExternalStoreThreadFactory,
40
39
  ) {
41
- this._mainThread = this.threadFactory(DEFAULT_THREAD_ID);
40
+ this._mainThread = this.threadFactory();
41
+ }
42
+
43
+ public getMainThreadRuntimeCore() {
44
+ return this._mainThread;
42
45
  }
43
46
 
44
- public getThreadMetadataById(threadId: string) {
47
+ public getItemById(threadId: string) {
45
48
  for (const thread of this.adapter.threads ?? []) {
46
49
  if (thread.threadId === threadId) return thread;
47
50
  }
@@ -51,7 +54,7 @@ export class ExternalStoreThreadListRuntimeCore
51
54
  return undefined;
52
55
  }
53
56
 
54
- public setAdapter(adapter: ExternalStoreThreadListAdapter) {
57
+ public __internal_setAdapter(adapter: ExternalStoreThreadListAdapter) {
55
58
  const previousAdapter = this.adapter;
56
59
  this.adapter = adapter;
57
60
 
@@ -72,42 +75,26 @@ export class ExternalStoreThreadListRuntimeCore
72
75
  return;
73
76
  }
74
77
 
75
- if (previousAdapter.threads !== newThreads) {
78
+ if (previousThreads !== newThreads) {
76
79
  this._threads =
77
80
  this.adapter.threads?.map((t) => t.threadId) ?? EMPTY_ARRAY;
78
81
  }
79
82
 
80
- if (previousAdapter.archivedThreads !== newArchivedThreads) {
83
+ if (previousArchivedThreads !== newArchivedThreads) {
81
84
  this._archivedThreads =
82
85
  this.adapter.archivedThreads?.map((t) => t.threadId) ?? EMPTY_ARRAY;
83
86
  }
84
87
 
85
- if (previousAdapter.threadId !== newThreadId) {
86
- this._mainThread._notifyEventSubscribers("switched-away");
87
- this._mainThread = this.threadFactory(newThreadId);
88
- this._mainThread._notifyEventSubscribers("switched-to");
89
- }
90
-
91
- const previousMainState = this._mainThread.metadata.state;
92
- const mainState = this.archivedThreads.includes(
93
- this._mainThread.metadata.threadId,
94
- )
95
- ? "archived"
96
- : "regular";
97
-
98
- if (previousMainState !== mainState) {
99
- if (mainState === "archived") {
100
- this._mainThread.metadata.archive();
101
- } else {
102
- this._mainThread.metadata.unarchive();
103
- }
88
+ if (previousThreadId !== newThreadId) {
89
+ this._mainThreadId = newThreadId;
90
+ this._mainThread = this.threadFactory();
104
91
  }
105
92
 
106
93
  this._notifySubscribers();
107
94
  }
108
95
 
109
96
  public async switchToThread(threadId: string): Promise<void> {
110
- if (this._mainThread?.metadata.threadId === threadId) return;
97
+ if (this._mainThreadId === threadId) return;
111
98
  const onSwitchToThread = this.adapter.onSwitchToThread;
112
99
  if (!onSwitchToThread)
113
100
  throw new Error(
@@ -18,7 +18,6 @@ import {
18
18
  ThreadRuntimeCore,
19
19
  } from "../core/ThreadRuntimeCore";
20
20
  import { BaseThreadRuntimeCore } from "../core/BaseThreadRuntimeCore";
21
- import { LocalThreadMetadataRuntimeCore } from "../local/LocalThreadMetadataRuntimeCore";
22
21
 
23
22
  const EMPTY_ARRAY = Object.freeze([]);
24
23
 
@@ -77,16 +76,13 @@ export class ExternalStoreThreadRuntimeCore
77
76
 
78
77
  constructor(
79
78
  configProvider: ModelConfigProvider,
80
- threadId: string,
81
79
  store: ExternalStoreAdapter<any>,
82
80
  ) {
83
- const metadata = new LocalThreadMetadataRuntimeCore(threadId);
84
- metadata.create();
85
- super(configProvider, metadata);
86
- this.setStore(store);
81
+ super(configProvider);
82
+ this.__internal_setStore(store);
87
83
  }
88
84
 
89
- public setStore(store: ExternalStoreAdapter<any>) {
85
+ public __internal_setStore(store: ExternalStoreAdapter<any>) {
90
86
  if (this._store === store) return;
91
87
 
92
88
  const isRunning = store.isRunning ?? false;
@@ -31,10 +31,9 @@ export class LocalRuntimeCore extends BaseAssistantRuntimeCore {
31
31
 
32
32
  this._options = options;
33
33
 
34
- this.threadList = new LocalThreadListRuntimeCore((threadId, data) => {
34
+ this.threadList = new LocalThreadListRuntimeCore((data) => {
35
35
  const thread = new LocalThreadRuntimeCore(
36
36
  this._proxyConfigProvider,
37
- threadId,
38
37
  this._options,
39
38
  );
40
39
  thread.import(data);
@@ -42,18 +41,12 @@ export class LocalRuntimeCore extends BaseAssistantRuntimeCore {
42
41
  });
43
42
 
44
43
  if (initialMessages) {
45
- this.threadList.mainThread.import(
46
- getExportFromInitialMessages(initialMessages),
47
- );
44
+ this.threadList
45
+ .getMainThreadRuntimeCore()
46
+ .import(getExportFromInitialMessages(initialMessages));
48
47
  }
49
48
  }
50
49
 
51
- public setOptions(options: LocalRuntimeOptionsBase) {
52
- this._options = options;
53
-
54
- this.threadList.mainThread.setOptions(options);
55
- }
56
-
57
50
  public reset({
58
51
  initialMessages,
59
52
  }: {
@@ -62,8 +55,8 @@ export class LocalRuntimeCore extends BaseAssistantRuntimeCore {
62
55
  this.threadList.switchToNewThread();
63
56
  if (!initialMessages) return;
64
57
 
65
- this.threadList.mainThread.import(
66
- getExportFromInitialMessages(initialMessages),
67
- );
58
+ this.threadList
59
+ .getMainThreadRuntimeCore()
60
+ .import(getExportFromInitialMessages(initialMessages));
68
61
  }
69
62
  }