@assistant-ui/core 0.2.22 → 0.2.23

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 (214) hide show
  1. package/dist/adapters/thread-history.d.ts +8 -0
  2. package/dist/adapters/thread-history.d.ts.map +1 -1
  3. package/dist/internal.d.ts +3 -2
  4. package/dist/internal.js +3 -2
  5. package/dist/model-context/frame/host.d.ts.map +1 -1
  6. package/dist/model-context/frame/host.js +36 -21
  7. package/dist/model-context/frame/host.js.map +1 -1
  8. package/dist/model-context/types.d.ts.map +1 -1
  9. package/dist/model-context/types.js +13 -4
  10. package/dist/model-context/types.js.map +1 -1
  11. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  12. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -0
  13. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  14. package/dist/react/client/interactable-model-context.js +1 -0
  15. package/dist/react/client/interactable-model-context.js.map +1 -1
  16. package/dist/react/interactables-legacy/useInteractableState.js +1 -0
  17. package/dist/react/interactables-legacy/useInteractableState.js.map +1 -1
  18. package/dist/react/model-context/useInteractableState.js +1 -0
  19. package/dist/react/model-context/useInteractableState.js.map +1 -1
  20. package/dist/react/model-context/useInteractableVersions.js +1 -0
  21. package/dist/react/model-context/useInteractableVersions.js.map +1 -1
  22. package/dist/react/model-context/useToolArgsStatus.js +1 -0
  23. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  24. package/dist/react/primitive-hooks/useActionBarCopy.js +1 -0
  25. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  26. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -0
  27. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  28. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -0
  29. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  30. package/dist/react/primitive-hooks/useActionBarReload.js +1 -0
  31. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  32. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -0
  33. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  34. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -0
  35. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  36. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -0
  37. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  38. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -0
  39. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  40. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -0
  41. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  42. package/dist/react/primitive-hooks/useComposerCancel.js +1 -0
  43. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  44. package/dist/react/primitive-hooks/useComposerDictate.js +1 -0
  45. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  46. package/dist/react/primitive-hooks/useComposerSend.js +1 -0
  47. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  48. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -0
  49. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  50. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -0
  51. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  52. package/dist/react/primitive-hooks/useMessageBranching.js +1 -0
  53. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  54. package/dist/react/primitive-hooks/useMessageReload.js +1 -0
  55. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  56. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -0
  57. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  58. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -0
  59. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  60. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -0
  61. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  62. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -0
  63. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  64. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -0
  65. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  66. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -0
  67. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  68. package/dist/react/primitive-hooks/useThreadListNew.js +1 -0
  69. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  70. package/dist/react/providers/TextMessagePartProvider.js +1 -0
  71. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  72. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  73. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +6 -4
  74. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  75. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +31 -1
  76. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  77. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +11 -1
  78. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  79. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -1
  80. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  81. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +1 -1
  82. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  83. package/dist/react/runtimes/cloud/auiV0.d.ts +12 -1
  84. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  85. package/dist/react/runtimes/cloud/auiV0.js +2 -1
  86. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  87. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +75 -73
  88. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  89. package/dist/react/runtimes/external-message-converter.js +1 -1
  90. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  91. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -0
  92. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  93. package/dist/react/runtimes/useLocalRuntime.d.ts +0 -1
  94. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  95. package/dist/runtime/api/assistant-runtime.d.ts +1 -1
  96. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  97. package/dist/runtime/api/assistant-runtime.js +1 -1
  98. package/dist/runtime/api/assistant-runtime.js.map +1 -1
  99. package/dist/runtime/api/attachment-runtime.d.ts +1 -1
  100. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  101. package/dist/runtime/api/attachment-runtime.js +1 -1
  102. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  103. package/dist/runtime/api/composer-runtime.d.ts +2 -2
  104. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  105. package/dist/runtime/api/composer-runtime.js +2 -2
  106. package/dist/runtime/api/composer-runtime.js.map +1 -1
  107. package/dist/runtime/api/message-part-runtime.d.ts +4 -4
  108. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  109. package/dist/runtime/api/message-part-runtime.js +3 -3
  110. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  111. package/dist/runtime/api/message-runtime.d.ts +1 -1
  112. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  113. package/dist/runtime/api/message-runtime.js +2 -2
  114. package/dist/runtime/api/message-runtime.js.map +1 -1
  115. package/dist/runtime/api/thread-list-item-runtime.d.ts +1 -1
  116. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  117. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  118. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  119. package/dist/runtime/api/thread-list-runtime.d.ts +1 -1
  120. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  121. package/dist/runtime/api/thread-list-runtime.js +1 -1
  122. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  123. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -1
  124. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  125. package/dist/runtime/base/base-thread-runtime-core.js +1 -1
  126. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  127. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +2 -2
  128. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  129. package/dist/runtime/base/default-edit-composer-runtime-core.js +2 -2
  130. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  131. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
  132. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  133. package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -1
  134. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  135. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  136. package/dist/runtime/utils/message-repository.js +4 -2
  137. package/dist/runtime/utils/message-repository.js.map +1 -1
  138. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -1
  139. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  140. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +1 -1
  141. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  142. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  143. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +12 -0
  144. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  145. package/dist/runtimes/internal.d.ts +2 -1
  146. package/dist/runtimes/internal.js +2 -1
  147. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  148. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  149. package/dist/runtimes/local/local-thread-runtime-core.js +44 -13
  150. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  151. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +32 -27
  152. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  153. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
  154. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  155. package/dist/store/clients/no-op-composer-client.js +1 -0
  156. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  157. package/dist/store/runtime-clients/thread-list-runtime-client.js +1 -0
  158. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  159. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  160. package/dist/store/runtime-clients/thread-runtime-client.js +17 -15
  161. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  162. package/dist/store/scopes/thread.d.ts +1 -0
  163. package/dist/store/scopes/thread.d.ts.map +1 -1
  164. package/dist/subscribable/subscribable.d.ts +3 -3
  165. package/dist/subscribable/subscribable.d.ts.map +1 -1
  166. package/dist/subscribable/subscribable.js +3 -3
  167. package/dist/subscribable/subscribable.js.map +1 -1
  168. package/package.json +7 -7
  169. package/src/adapters/thread-history.ts +8 -0
  170. package/src/internal.ts +1 -1
  171. package/src/model-context/frame/host.test.ts +47 -0
  172. package/src/model-context/frame/host.ts +46 -19
  173. package/src/model-context/types.ts +16 -6
  174. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +15 -5
  175. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +20 -6
  176. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +34 -0
  177. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +26 -5
  178. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +5 -1
  179. package/src/react/runtimes/cloud/auiV0.ts +14 -0
  180. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +90 -88
  181. package/src/react/runtimes/external-message-converter.test.ts +346 -0
  182. package/src/react/runtimes/external-message-converter.ts +1 -1
  183. package/src/react/runtimes/useLocalRuntime.test.tsx +43 -0
  184. package/src/runtime/api/assistant-runtime.ts +4 -1
  185. package/src/runtime/api/attachment-runtime.ts +8 -2
  186. package/src/runtime/api/composer-runtime.ts +9 -5
  187. package/src/runtime/api/message-part-runtime.ts +10 -3
  188. package/src/runtime/api/message-runtime.ts +7 -2
  189. package/src/runtime/api/thread-list-item-runtime.ts +7 -2
  190. package/src/runtime/api/thread-list-runtime.ts +10 -2
  191. package/src/runtime/base/base-thread-runtime-core.ts +5 -1
  192. package/src/runtime/base/default-edit-composer-runtime-core.ts +14 -2
  193. package/src/runtime/base/default-thread-composer-runtime-core.ts +11 -1
  194. package/src/runtime/utils/message-repository.ts +19 -13
  195. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  196. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +15 -0
  197. package/src/runtimes/internal.ts +3 -0
  198. package/src/runtimes/local/local-thread-runtime-core.test.ts +596 -0
  199. package/src/runtimes/local/local-thread-runtime-core.ts +85 -21
  200. package/src/runtimes/local/should-continue.test.ts +122 -0
  201. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +9 -10
  202. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +38 -32
  203. package/src/store/clients/model-context-client.test.ts +21 -1
  204. package/src/store/runtime-clients/thread-runtime-client.ts +2 -1
  205. package/src/store/scopes/thread.ts +1 -0
  206. package/src/subscribable/subscribable.ts +16 -8
  207. package/src/tests/MessageRepository.test.ts +12 -0
  208. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-position.test.ts +121 -0
  209. package/src/tests/auiV0Encode.test.ts +74 -0
  210. package/src/tests/base-composer-runtime-core.test.ts +422 -0
  211. package/src/tests/external-store-thread-list-runtime-core.test.ts +6 -6
  212. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +575 -0
  213. package/src/tests/external-store-thread-runtime-core.test.ts +55 -1
  214. package/src/tests/OptimisticState-delete-crash.test.ts +0 -208
@@ -40,11 +40,18 @@ export class MessagePartRuntimeImpl implements MessagePartRuntime {
40
40
  return this.contentBinding.path;
41
41
  }
42
42
 
43
+ private contentBinding: MessagePartSnapshotBinding;
44
+ private messageApi: MessageStateBinding | undefined;
45
+ private threadApi: ThreadRuntimeCoreBinding | undefined;
46
+
43
47
  constructor(
44
- private contentBinding: MessagePartSnapshotBinding,
45
- private messageApi?: MessageStateBinding,
46
- private threadApi?: ThreadRuntimeCoreBinding,
48
+ contentBinding: MessagePartSnapshotBinding,
49
+ messageApi?: MessageStateBinding,
50
+ threadApi?: ThreadRuntimeCoreBinding,
47
51
  ) {
52
+ this.contentBinding = contentBinding;
53
+ this.messageApi = messageApi;
54
+ this.threadApi = threadApi;
48
55
  this.__internal_bindMethods();
49
56
  }
50
57
 
@@ -134,10 +134,15 @@ export class MessageRuntimeImpl implements MessageRuntime {
134
134
  return this._core.path;
135
135
  }
136
136
 
137
+ private _core: MessageStateBinding;
138
+ private _threadBinding: ThreadRuntimeCoreBinding;
139
+
137
140
  constructor(
138
- private _core: MessageStateBinding,
139
- private _threadBinding: ThreadRuntimeCoreBinding,
141
+ _core: MessageStateBinding,
142
+ _threadBinding: ThreadRuntimeCoreBinding,
140
143
  ) {
144
+ this._core = _core;
145
+ this._threadBinding = _threadBinding;
141
146
  this.composer = new EditComposerRuntimeImpl(
142
147
  new NestedSubscriptionSubject({
143
148
  path: {
@@ -66,10 +66,15 @@ export class ThreadListItemRuntimeImpl implements ThreadListItemRuntime {
66
66
  return this._core.path;
67
67
  }
68
68
 
69
+ private _core: ThreadListItemStateBinding;
70
+ private _threadListBinding: ThreadListRuntimeCoreBinding;
71
+
69
72
  constructor(
70
- private _core: ThreadListItemStateBinding,
71
- private _threadListBinding: ThreadListRuntimeCoreBinding,
73
+ _core: ThreadListItemStateBinding,
74
+ _threadListBinding: ThreadListRuntimeCoreBinding,
72
75
  ) {
76
+ this._core = _core;
77
+ this._threadListBinding = _threadListBinding;
73
78
  this.__internal_bindMethods();
74
79
  }
75
80
 
@@ -98,13 +98,21 @@ export type ThreadListRuntimeCoreBinding = ThreadListRuntimeCore;
98
98
 
99
99
  export class ThreadListRuntimeImpl implements ThreadListRuntime {
100
100
  private _getState;
101
+ private _core: ThreadListRuntimeCoreBinding;
102
+ private _runtimeFactory: new (
103
+ binding: ThreadRuntimeCoreBinding,
104
+ threadListItemBinding: ThreadListItemRuntimeBinding,
105
+ ) => ThreadRuntime;
106
+
101
107
  constructor(
102
- private _core: ThreadListRuntimeCoreBinding,
103
- private _runtimeFactory: new (
108
+ _core: ThreadListRuntimeCoreBinding,
109
+ _runtimeFactory: new (
104
110
  binding: ThreadRuntimeCoreBinding,
105
111
  threadListItemBinding: ThreadListItemRuntimeBinding,
106
112
  ) => ThreadRuntime = ThreadRuntimeImpl,
107
113
  ) {
114
+ this._core = _core;
115
+ this._runtimeFactory = _runtimeFactory;
108
116
  const stateBinding = new LazyMemoizeSubject({
109
117
  path: {},
110
118
  getState: () => getThreadListState(_core),
@@ -113,7 +113,11 @@ export abstract class BaseThreadRuntimeCore implements ThreadRuntimeCore {
113
113
 
114
114
  public readonly composer = new DefaultThreadComposerRuntimeCore(this);
115
115
 
116
- constructor(private readonly _contextProvider: ModelContextProvider) {}
116
+ private readonly _contextProvider: ModelContextProvider;
117
+
118
+ constructor(_contextProvider: ModelContextProvider) {
119
+ this._contextProvider = _contextProvider;
120
+ }
117
121
 
118
122
  public getModelContext() {
119
123
  return this._contextProvider.getModelContext();
@@ -31,8 +31,18 @@ export class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {
31
31
  private _nonTextPassthrough: readonly ThreadMessage["content"][number][];
32
32
  private _parentId: string | null;
33
33
  private _sourceId: string | null;
34
+ private runtime: ThreadRuntimeCore & {
35
+ adapters?:
36
+ | {
37
+ attachments?: AttachmentAdapter | undefined;
38
+ dictation?: DictationAdapter | undefined;
39
+ }
40
+ | undefined;
41
+ };
42
+ private endEditCallback: () => void;
43
+
34
44
  constructor(
35
- private runtime: ThreadRuntimeCore & {
45
+ runtime: ThreadRuntimeCore & {
36
46
  adapters?:
37
47
  | {
38
48
  attachments?: AttachmentAdapter | undefined;
@@ -40,10 +50,12 @@ export class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {
40
50
  }
41
51
  | undefined;
42
52
  },
43
- private endEditCallback: () => void,
53
+ endEditCallback: () => void,
44
54
  { parentId, message }: { parentId: string | null; message: ThreadMessage },
45
55
  ) {
46
56
  super();
57
+ this.runtime = runtime;
58
+ this.endEditCallback = endEditCallback;
47
59
  this._parentId = parentId;
48
60
  this._sourceId = message.id;
49
61
  this._previousText = getThreadMessageText(message);
@@ -46,8 +46,17 @@ export class DefaultThreadComposerRuntimeCore
46
46
  return this.runtime.adapters?.dictation;
47
47
  }
48
48
 
49
+ private runtime: Omit<ThreadRuntimeCore, "composer"> & {
50
+ adapters?:
51
+ | {
52
+ attachments?: AttachmentAdapter | undefined;
53
+ dictation?: DictationAdapter | undefined;
54
+ }
55
+ | undefined;
56
+ };
57
+
49
58
  constructor(
50
- private runtime: Omit<ThreadRuntimeCore, "composer"> & {
59
+ runtime: Omit<ThreadRuntimeCore, "composer"> & {
51
60
  adapters?:
52
61
  | {
53
62
  attachments?: AttachmentAdapter | undefined;
@@ -57,6 +66,7 @@ export class DefaultThreadComposerRuntimeCore
57
66
  },
58
67
  ) {
59
68
  super();
69
+ this.runtime = runtime;
60
70
  this.connect();
61
71
  }
62
72
 
@@ -89,7 +89,11 @@ const findHead = (
89
89
  class CachedValue<T> {
90
90
  private _value: T | null = null;
91
91
 
92
- constructor(private func: () => T) {}
92
+ private func: () => T;
93
+
94
+ constructor(func: () => T) {
95
+ this.func = func;
96
+ }
93
97
 
94
98
  get value() {
95
99
  if (this._value === null) {
@@ -131,6 +135,20 @@ export class MessageRepository {
131
135
 
132
136
  if (operation === "relink" && parentOrRoot === newParentOrRoot) return;
133
137
 
138
+ if (operation !== "cut") {
139
+ for (
140
+ let current: RepositoryMessage | null = newParent;
141
+ current;
142
+ current = current.prev
143
+ ) {
144
+ if (current.current.id === child.current.id) {
145
+ throw new Error(
146
+ "MessageRepository(performOp/link): A message with the same id already exists in the parent tree. This error occurs if the same message id is found multiple times. This is likely an internal bug in assistant-ui.",
147
+ );
148
+ }
149
+ }
150
+ }
151
+
134
152
  if (operation !== "link") {
135
153
  parentOrRoot.children = parentOrRoot.children.filter(
136
154
  (m) => m !== child.current.id,
@@ -149,18 +167,6 @@ export class MessageRepository {
149
167
  }
150
168
 
151
169
  if (operation !== "cut") {
152
- for (
153
- let current: RepositoryMessage | null = newParent;
154
- current;
155
- current = current.prev
156
- ) {
157
- if (current.current.id === child.current.id) {
158
- throw new Error(
159
- "MessageRepository(performOp/link): A message with the same id already exists in the parent tree. This error occurs if the same message id is found multiple times. This is likely an internal bug in assistant-ui.",
160
- );
161
- }
162
- }
163
-
164
170
  newParentOrRoot.children = [
165
171
  ...newParentOrRoot.children,
166
172
  child.current.id,
@@ -60,10 +60,13 @@ export class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCore
60
60
  return this._mainThreadId;
61
61
  }
62
62
 
63
+ private threadFactory: ExternalStoreThreadFactory;
64
+
63
65
  constructor(
64
66
  adapter: ExternalStoreThreadListAdapter = {},
65
- private threadFactory: ExternalStoreThreadFactory,
67
+ threadFactory: ExternalStoreThreadFactory,
66
68
  ) {
69
+ this.threadFactory = threadFactory;
67
70
  this.__internal_setAdapter(adapter, true);
68
71
  }
69
72
 
@@ -251,6 +251,21 @@ export class ExternalStoreThreadRuntimeCore
251
251
  return newMessage;
252
252
  });
253
253
 
254
+ const seenIds = new Set<string>();
255
+ const deduped: ThreadMessage[] = [];
256
+ for (let i = messages.length - 1; i >= 0; i--) {
257
+ const message = messages[i]!;
258
+ if (seenIds.has(message.id)) {
259
+ console.warn(
260
+ `ExternalStoreThreadRuntimeCore: duplicate message id "${message.id}" in the provided messages array; keeping the last occurrence.`,
261
+ );
262
+ continue;
263
+ }
264
+ seenIds.add(message.id);
265
+ deduped.push(message);
266
+ }
267
+ if (deduped.length !== messages.length) messages = deduped.reverse();
268
+
254
269
  for (let i = 0; i < messages.length; i++) {
255
270
  const message = messages[i]!;
256
271
  const parent = messages[i - 1];
@@ -37,3 +37,6 @@ export type {
37
37
  RemoteThreadInitializeResponse,
38
38
  RemoteThreadListOptions,
39
39
  } from "./remote-thread-list/types";
40
+
41
+ // Tool Invocations
42
+ export { ToolInvocationTracker } from "./tool-invocations/ToolInvocationTracker";