@assistant-ui/react 0.7.46 → 0.7.48

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. package/dist/api/AssistantRuntime.d.ts +1 -0
  2. package/dist/api/AssistantRuntime.d.ts.map +1 -1
  3. package/dist/api/AssistantRuntime.js +5 -0
  4. package/dist/api/AssistantRuntime.js.map +1 -1
  5. package/dist/api/AssistantRuntime.mjs +5 -0
  6. package/dist/api/AssistantRuntime.mjs.map +1 -1
  7. package/dist/api/AttachmentRuntime.d.ts +1 -0
  8. package/dist/api/AttachmentRuntime.d.ts.map +1 -1
  9. package/dist/api/AttachmentRuntime.js +5 -0
  10. package/dist/api/AttachmentRuntime.js.map +1 -1
  11. package/dist/api/AttachmentRuntime.mjs +5 -0
  12. package/dist/api/AttachmentRuntime.mjs.map +1 -1
  13. package/dist/api/ComposerRuntime.d.ts +2 -0
  14. package/dist/api/ComposerRuntime.d.ts.map +1 -1
  15. package/dist/api/ComposerRuntime.js +19 -0
  16. package/dist/api/ComposerRuntime.js.map +1 -1
  17. package/dist/api/ComposerRuntime.mjs +19 -0
  18. package/dist/api/ComposerRuntime.mjs.map +1 -1
  19. package/dist/api/ContentPartRuntime.d.ts +1 -0
  20. package/dist/api/ContentPartRuntime.d.ts.map +1 -1
  21. package/dist/api/ContentPartRuntime.js +5 -0
  22. package/dist/api/ContentPartRuntime.js.map +1 -1
  23. package/dist/api/ContentPartRuntime.mjs +5 -0
  24. package/dist/api/ContentPartRuntime.mjs.map +1 -1
  25. package/dist/api/MessageRuntime.d.ts +1 -0
  26. package/dist/api/MessageRuntime.d.ts.map +1 -1
  27. package/dist/api/MessageRuntime.js +13 -0
  28. package/dist/api/MessageRuntime.js.map +1 -1
  29. package/dist/api/MessageRuntime.mjs +13 -0
  30. package/dist/api/MessageRuntime.mjs.map +1 -1
  31. package/dist/api/ThreadListItemRuntime.d.ts +1 -0
  32. package/dist/api/ThreadListItemRuntime.d.ts.map +1 -1
  33. package/dist/api/ThreadListItemRuntime.js +11 -0
  34. package/dist/api/ThreadListItemRuntime.js.map +1 -1
  35. package/dist/api/ThreadListItemRuntime.mjs +11 -0
  36. package/dist/api/ThreadListItemRuntime.mjs.map +1 -1
  37. package/dist/api/ThreadListRuntime.d.ts +1 -0
  38. package/dist/api/ThreadListRuntime.d.ts.map +1 -1
  39. package/dist/api/ThreadListRuntime.js +10 -0
  40. package/dist/api/ThreadListRuntime.js.map +1 -1
  41. package/dist/api/ThreadListRuntime.mjs +10 -0
  42. package/dist/api/ThreadListRuntime.mjs.map +1 -1
  43. package/dist/api/ThreadRuntime.d.ts +1 -1
  44. package/dist/api/ThreadRuntime.d.ts.map +1 -1
  45. package/dist/api/ThreadRuntime.js +14 -3
  46. package/dist/api/ThreadRuntime.js.map +1 -1
  47. package/dist/api/ThreadRuntime.mjs +14 -3
  48. package/dist/api/ThreadRuntime.mjs.map +1 -1
  49. package/dist/context/providers/AssistantRuntimeProvider.d.ts.map +1 -1
  50. package/dist/context/providers/AssistantRuntimeProvider.js +6 -14
  51. package/dist/context/providers/AssistantRuntimeProvider.js.map +1 -1
  52. package/dist/context/providers/AssistantRuntimeProvider.mjs +6 -14
  53. package/dist/context/providers/AssistantRuntimeProvider.mjs.map +1 -1
  54. package/dist/context/providers/AttachmentRuntimeProvider.d.ts.map +1 -1
  55. package/dist/context/providers/AttachmentRuntimeProvider.js +5 -16
  56. package/dist/context/providers/AttachmentRuntimeProvider.js.map +1 -1
  57. package/dist/context/providers/AttachmentRuntimeProvider.mjs +6 -21
  58. package/dist/context/providers/AttachmentRuntimeProvider.mjs.map +1 -1
  59. package/dist/context/providers/ContentPartRuntimeProvider.d.ts +0 -1
  60. package/dist/context/providers/ContentPartRuntimeProvider.d.ts.map +1 -1
  61. package/dist/context/providers/ContentPartRuntimeProvider.js +5 -15
  62. package/dist/context/providers/ContentPartRuntimeProvider.js.map +1 -1
  63. package/dist/context/providers/ContentPartRuntimeProvider.mjs +4 -13
  64. package/dist/context/providers/ContentPartRuntimeProvider.mjs.map +1 -1
  65. package/dist/context/providers/MessageRuntimeProvider.d.ts.map +1 -1
  66. package/dist/context/providers/MessageRuntimeProvider.js +3 -22
  67. package/dist/context/providers/MessageRuntimeProvider.js.map +1 -1
  68. package/dist/context/providers/MessageRuntimeProvider.mjs +3 -22
  69. package/dist/context/providers/MessageRuntimeProvider.mjs.map +1 -1
  70. package/dist/context/providers/TextContentPartProvider.d.ts.map +1 -1
  71. package/dist/context/providers/TextContentPartProvider.js +13 -12
  72. package/dist/context/providers/TextContentPartProvider.js.map +1 -1
  73. package/dist/context/providers/TextContentPartProvider.mjs +13 -12
  74. package/dist/context/providers/TextContentPartProvider.mjs.map +1 -1
  75. package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts +0 -1
  76. package/dist/context/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  77. package/dist/context/providers/ThreadListItemRuntimeProvider.js +5 -15
  78. package/dist/context/providers/ThreadListItemRuntimeProvider.js.map +1 -1
  79. package/dist/context/providers/ThreadListItemRuntimeProvider.mjs +4 -13
  80. package/dist/context/providers/ThreadListItemRuntimeProvider.mjs.map +1 -1
  81. package/dist/context/providers/ThreadRuntimeProvider.d.ts.map +1 -1
  82. package/dist/context/providers/ThreadRuntimeProvider.js +5 -24
  83. package/dist/context/providers/ThreadRuntimeProvider.js.map +1 -1
  84. package/dist/context/providers/ThreadRuntimeProvider.mjs +6 -25
  85. package/dist/context/providers/ThreadRuntimeProvider.mjs.map +1 -1
  86. package/dist/context/react/AssistantContext.d.ts +26 -17
  87. package/dist/context/react/AssistantContext.d.ts.map +1 -1
  88. package/dist/context/react/AssistantContext.js +3 -4
  89. package/dist/context/react/AssistantContext.js.map +1 -1
  90. package/dist/context/react/AssistantContext.mjs +3 -4
  91. package/dist/context/react/AssistantContext.mjs.map +1 -1
  92. package/dist/context/react/AttachmentContext.d.ts +558 -30
  93. package/dist/context/react/AttachmentContext.d.ts.map +1 -1
  94. package/dist/context/react/AttachmentContext.js +32 -52
  95. package/dist/context/react/AttachmentContext.js.map +1 -1
  96. package/dist/context/react/AttachmentContext.mjs +33 -52
  97. package/dist/context/react/AttachmentContext.mjs.map +1 -1
  98. package/dist/context/react/ComposerContext.d.ts +28 -19
  99. package/dist/context/react/ComposerContext.d.ts.map +1 -1
  100. package/dist/context/react/ComposerContext.js +2 -19
  101. package/dist/context/react/ComposerContext.js.map +1 -1
  102. package/dist/context/react/ComposerContext.mjs +4 -20
  103. package/dist/context/react/ComposerContext.mjs.map +1 -1
  104. package/dist/context/react/ContentPartContext.d.ts +22 -16
  105. package/dist/context/react/ContentPartContext.d.ts.map +1 -1
  106. package/dist/context/react/ContentPartContext.js +2 -7
  107. package/dist/context/react/ContentPartContext.js.map +1 -1
  108. package/dist/context/react/ContentPartContext.mjs +2 -6
  109. package/dist/context/react/ContentPartContext.mjs.map +1 -1
  110. package/dist/context/react/MessageContext.d.ts +49 -29
  111. package/dist/context/react/MessageContext.d.ts.map +1 -1
  112. package/dist/context/react/MessageContext.js +5 -9
  113. package/dist/context/react/MessageContext.js.map +1 -1
  114. package/dist/context/react/MessageContext.mjs +5 -8
  115. package/dist/context/react/MessageContext.mjs.map +1 -1
  116. package/dist/context/react/ThreadContext.d.ts +44 -24
  117. package/dist/context/react/ThreadContext.d.ts.map +1 -1
  118. package/dist/context/react/ThreadContext.js +5 -9
  119. package/dist/context/react/ThreadContext.js.map +1 -1
  120. package/dist/context/react/ThreadContext.mjs +5 -8
  121. package/dist/context/react/ThreadContext.mjs.map +1 -1
  122. package/dist/context/react/ThreadListItemContext.d.ts +22 -16
  123. package/dist/context/react/ThreadListItemContext.d.ts.map +1 -1
  124. package/dist/context/react/ThreadListItemContext.js +3 -6
  125. package/dist/context/react/ThreadListItemContext.js.map +1 -1
  126. package/dist/context/react/ThreadListItemContext.mjs +3 -5
  127. package/dist/context/react/ThreadListItemContext.mjs.map +1 -1
  128. package/dist/context/react/index.d.ts +1 -0
  129. package/dist/context/react/index.d.ts.map +1 -1
  130. package/dist/context/react/index.js +3 -0
  131. package/dist/context/react/index.js.map +1 -1
  132. package/dist/context/react/index.mjs +2 -0
  133. package/dist/context/react/index.mjs.map +1 -1
  134. package/dist/context/react/utils/createContextHook.d.ts +3 -8
  135. package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
  136. package/dist/context/react/utils/createContextHook.js.map +1 -1
  137. package/dist/context/react/utils/createContextHook.mjs.map +1 -1
  138. package/dist/context/react/utils/createStateHookForRuntime.d.ts +31 -0
  139. package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -0
  140. package/dist/context/react/utils/createStateHookForRuntime.js +47 -0
  141. package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -0
  142. package/dist/context/react/utils/createStateHookForRuntime.mjs +24 -0
  143. package/dist/context/react/utils/createStateHookForRuntime.mjs.map +1 -0
  144. package/dist/context/react/utils/ensureBinding.d.ts +2 -0
  145. package/dist/context/react/utils/ensureBinding.d.ts.map +1 -0
  146. package/dist/context/react/utils/ensureBinding.js +36 -0
  147. package/dist/context/react/utils/ensureBinding.js.map +1 -0
  148. package/dist/context/react/utils/ensureBinding.mjs +11 -0
  149. package/dist/context/react/utils/ensureBinding.mjs.map +1 -0
  150. package/dist/context/react/utils/useRuntimeState.d.ts +10 -0
  151. package/dist/context/react/utils/useRuntimeState.d.ts.map +1 -0
  152. package/dist/context/react/utils/useRuntimeState.js +48 -0
  153. package/dist/context/react/utils/useRuntimeState.js.map +1 -0
  154. package/dist/context/react/utils/useRuntimeState.mjs +22 -0
  155. package/dist/context/react/utils/useRuntimeState.mjs.map +1 -0
  156. package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts +1 -1
  157. package/dist/runtimes/adapters/attachment/AttachmentAdapter.d.ts.map +1 -1
  158. package/dist/runtimes/adapters/attachment/AttachmentAdapter.js.map +1 -1
  159. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts +1 -1
  160. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.d.ts.map +1 -1
  161. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js +1 -1
  162. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.js.map +1 -1
  163. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs +1 -1
  164. package/dist/runtimes/adapters/attachment/CompositeAttachmentAdapter.mjs.map +1 -1
  165. package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.d.ts.map +1 -1
  166. package/dist/runtimes/adapters/thread-history/ThreadHistoryAdapter.js.map +1 -1
  167. package/dist/runtimes/composer/BaseComposerRuntimeCore.d.ts.map +1 -1
  168. package/dist/runtimes/composer/BaseComposerRuntimeCore.js +22 -2
  169. package/dist/runtimes/composer/BaseComposerRuntimeCore.js.map +1 -1
  170. package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs +22 -2
  171. package/dist/runtimes/composer/BaseComposerRuntimeCore.mjs.map +1 -1
  172. package/dist/runtimes/local/useLocalRuntime.d.ts.map +1 -1
  173. package/dist/runtimes/local/useLocalRuntime.js +4 -0
  174. package/dist/runtimes/local/useLocalRuntime.js.map +1 -1
  175. package/dist/runtimes/local/useLocalRuntime.mjs +4 -0
  176. package/dist/runtimes/local/useLocalRuntime.mjs.map +1 -1
  177. package/package.json +3 -3
  178. package/src/api/AssistantRuntime.ts +7 -0
  179. package/src/api/AttachmentRuntime.ts +6 -0
  180. package/src/api/ComposerRuntime.ts +21 -0
  181. package/src/api/ContentPartRuntime.ts +6 -0
  182. package/src/api/MessageRuntime.ts +15 -0
  183. package/src/api/ThreadListItemRuntime.ts +12 -0
  184. package/src/api/ThreadListRuntime.ts +11 -0
  185. package/src/api/ThreadRuntime.ts +15 -4
  186. package/src/context/providers/AssistantRuntimeProvider.tsx +6 -17
  187. package/src/context/providers/AttachmentRuntimeProvider.tsx +6 -24
  188. package/src/context/providers/ContentPartRuntimeProvider.tsx +4 -14
  189. package/src/context/providers/MessageRuntimeProvider.tsx +5 -31
  190. package/src/context/providers/TextContentPartProvider.tsx +26 -22
  191. package/src/context/providers/ThreadListItemRuntimeProvider.tsx +3 -14
  192. package/src/context/providers/ThreadRuntimeProvider.tsx +7 -33
  193. package/src/context/react/AssistantContext.ts +7 -7
  194. package/src/context/react/AttachmentContext.ts +45 -136
  195. package/src/context/react/ComposerContext.ts +6 -29
  196. package/src/context/react/ContentPartContext.ts +3 -8
  197. package/src/context/react/MessageContext.ts +10 -13
  198. package/src/context/react/ThreadContext.ts +9 -12
  199. package/src/context/react/ThreadListItemContext.ts +4 -7
  200. package/src/context/react/index.ts +2 -0
  201. package/src/context/react/utils/createContextHook.ts +1 -3
  202. package/src/context/react/utils/createStateHookForRuntime.ts +80 -0
  203. package/src/context/react/utils/ensureBinding.ts +45 -0
  204. package/src/context/react/utils/useRuntimeState.ts +46 -0
  205. package/src/runtimes/adapters/attachment/AttachmentAdapter.ts +3 -1
  206. package/src/runtimes/adapters/attachment/CompositeAttachmentAdapter.ts +1 -1
  207. package/src/runtimes/adapters/thread-history/ThreadHistoryAdapter.ts +1 -0
  208. package/src/runtimes/composer/BaseComposerRuntimeCore.tsx +24 -2
  209. package/src/runtimes/local/useLocalRuntime.tsx +5 -0
@@ -12,11 +12,9 @@ export function createContextHook<T>(
12
12
  context: Context<T | null>,
13
13
  providerName: string,
14
14
  ) {
15
- function useContextHook(options?: { optional?: false | undefined }): T;
16
15
  function useContextHook(options?: {
17
16
  optional?: boolean | undefined;
18
- }): T | null;
19
- function useContextHook(options?: { optional?: boolean | undefined }) {
17
+ }): T | null {
20
18
  const contextValue = useContext(context);
21
19
  if (!options?.optional && !contextValue) {
22
20
  throw new Error(`This component must be used within ${providerName}.`);
@@ -0,0 +1,80 @@
1
+ import {
2
+ SubscribableRuntime,
3
+ useRuntimeStateInternal,
4
+ } from "./useRuntimeState";
5
+
6
+ export function createStateHookForRuntime<TState>(
7
+ useRuntime: (options: {
8
+ optional: boolean | undefined;
9
+ }) => SubscribableRuntime<TState> | null,
10
+ ) {
11
+ // empty
12
+ function useStoreHook(): TState;
13
+
14
+ // selector
15
+ function useStoreHook<TSelected>(
16
+ selector: (state: TState) => TSelected,
17
+ ): TSelected;
18
+
19
+ // selector?
20
+ function useStoreHook<TSelected>(
21
+ selector: ((state: TState) => TSelected) | undefined,
22
+ ): TSelected | TState;
23
+
24
+ // optional=false
25
+ function useStoreHook(options: { optional?: false | undefined }): TState;
26
+
27
+ // optional?
28
+ function useStoreHook(options: {
29
+ optional?: boolean | undefined;
30
+ }): TState | null;
31
+
32
+ // optional=false, selector
33
+ function useStoreHook<TSelected>(options: {
34
+ optional?: false | undefined;
35
+ selector: (state: TState) => TSelected;
36
+ }): TSelected;
37
+
38
+ // optional=false, selector?
39
+ function useStoreHook<TSelected>(options: {
40
+ optional?: false | undefined;
41
+ selector: ((state: TState) => TSelected) | undefined;
42
+ }): TSelected | TState;
43
+
44
+ // optional?, selector
45
+ function useStoreHook<TSelected>(options: {
46
+ optional?: boolean | undefined;
47
+ selector: (state: TState) => TSelected;
48
+ }): TSelected | null;
49
+
50
+ // optional?, selector?
51
+ function useStoreHook<TSelected>(options: {
52
+ optional?: boolean | undefined;
53
+ selector: ((state: TState) => TSelected) | undefined;
54
+ }): TSelected | TState | null;
55
+
56
+ function useStoreHook<TSelected>(
57
+ param?:
58
+ | ((state: TState) => TSelected)
59
+ | {
60
+ optional?: boolean | undefined;
61
+ selector?: ((state: TState) => TSelected) | undefined;
62
+ },
63
+ ): TSelected | TState | null {
64
+ let optional = false;
65
+ let selector: ((state: TState) => TSelected) | undefined;
66
+
67
+ if (typeof param === "function") {
68
+ selector = param;
69
+ } else if (param) {
70
+ optional = !!param.optional;
71
+ selector = param.selector;
72
+ }
73
+
74
+ const store = useRuntime({ optional });
75
+ if (!store) return null;
76
+ return useRuntimeStateInternal(store, selector);
77
+ }
78
+
79
+ return useStoreHook;
80
+ }
@@ -0,0 +1,45 @@
1
+ type Bindable = {
2
+ __internal_bindMethods?: () => void;
3
+ __isBound?: boolean;
4
+ };
5
+ const debugVerifyPrototype = (
6
+ runtime: Record<string, unknown>,
7
+ prototype: any,
8
+ ) => {
9
+ const unboundMethods = Object.getOwnPropertyNames(prototype).filter(
10
+ (methodStr) => {
11
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, methodStr);
12
+ const isMethod = descriptor && typeof descriptor.value === "function";
13
+ if (!isMethod) return false;
14
+
15
+ const methodName = methodStr as keyof typeof runtime | "constructor";
16
+ return (
17
+ isMethod &&
18
+ !methodName.startsWith("_") &&
19
+ methodName !== "constructor" &&
20
+ prototype[methodName] === runtime[methodName]
21
+ );
22
+ },
23
+ );
24
+
25
+ if (unboundMethods.length > 0) {
26
+ throw new Error(
27
+ "The following methods are not bound: " + JSON.stringify(unboundMethods),
28
+ );
29
+ }
30
+
31
+ const prototypePrototype = Object.getPrototypeOf(prototype);
32
+ if (prototypePrototype && prototypePrototype !== Object.prototype) {
33
+ debugVerifyPrototype(runtime, prototypePrototype);
34
+ }
35
+ };
36
+ export const ensureBinding = (r: unknown) => {
37
+ const runtime = r as Bindable;
38
+ if (runtime.__isBound) return;
39
+
40
+ runtime.__internal_bindMethods?.();
41
+ runtime.__isBound = true;
42
+
43
+ // @ts-ignore - strip this out in production build
44
+ DEV: debugVerifyPrototype(runtime, Object.getPrototypeOf(runtime));
45
+ };
@@ -0,0 +1,46 @@
1
+ import { useDebugValue, useSyncExternalStore } from "react";
2
+ import { Unsubscribe } from "../../../types";
3
+ import { ensureBinding } from "./ensureBinding";
4
+
5
+ export type SubscribableRuntime<TState> = {
6
+ getState: () => TState;
7
+ subscribe: (callback: () => void) => Unsubscribe;
8
+ };
9
+
10
+ export function useRuntimeStateInternal<TState, TSelected>(
11
+ runtime: SubscribableRuntime<TState>,
12
+ selector: ((state: TState) => TSelected) | undefined = identity as any,
13
+ ): TSelected | TState {
14
+ // TODO move to useRuntimeState
15
+ ensureBinding(runtime);
16
+
17
+ const slice = useSyncExternalStore(
18
+ runtime.subscribe,
19
+ () => selector(runtime.getState()),
20
+ () => selector(runtime.getState()),
21
+ );
22
+ useDebugValue(slice);
23
+ return slice;
24
+ }
25
+
26
+ const identity = <T>(arg: T): T => arg;
27
+ export function useRuntimeState<TState>(
28
+ runtime: SubscribableRuntime<TState>,
29
+ ): TState;
30
+ export function useRuntimeState<TState, TSelected>(
31
+ runtime: SubscribableRuntime<TState>,
32
+ selector: (state: TState) => TSelected,
33
+ ): TSelected;
34
+ export function useRuntimeState<TState, TSelected>(
35
+ runtime: SubscribableRuntime<TState>,
36
+ selector: ((state: TState) => TSelected) | undefined,
37
+ ): TSelected | TState;
38
+ export function useRuntimeState<TState, TSelected>(
39
+ runtime: SubscribableRuntime<TState>,
40
+ selector?: ((state: TState) => TSelected) | undefined,
41
+ ): TSelected | TState {
42
+ // ensure that the runtime is bound
43
+ // ensureBinding(runtime);
44
+
45
+ return useRuntimeStateInternal(runtime, selector);
46
+ }
@@ -7,7 +7,9 @@ import {
7
7
  export type AttachmentAdapter = {
8
8
  accept: string;
9
9
 
10
- add(state: { file: File }): Promise<PendingAttachment>;
10
+ add(state: {
11
+ file: File;
12
+ }): Promise<PendingAttachment> | AsyncGenerator<PendingAttachment, void>;
11
13
  remove(attachment: Attachment): Promise<void>;
12
14
  send(attachment: PendingAttachment): Promise<CompleteAttachment>;
13
15
  };
@@ -65,7 +65,7 @@ export class CompositeAttachmentAdapter implements AttachmentAdapter {
65
65
  }
66
66
  }
67
67
 
68
- public async add(state: { file: File }) {
68
+ public add(state: { file: File }) {
69
69
  for (const adapter of this._adapters) {
70
70
  if (fileMatchesAccept(state.file, adapter.accept)) {
71
71
  return adapter.add(state);
@@ -3,6 +3,7 @@ import {
3
3
  ExportedMessageRepositoryItem,
4
4
  } from "../../utils/MessageRepository";
5
5
 
6
+ // TODO external store - which version to save? how to restore?
6
7
  export type ThreadHistoryAdapter = {
7
8
  load(): Promise<ExportedMessageRepository>;
8
9
  append(item: ExportedMessageRepositoryItem): Promise<void>;
@@ -158,9 +158,31 @@ export abstract class BaseComposerRuntimeCore
158
158
  const adapter = this.getAttachmentAdapter();
159
159
  if (!adapter) throw new Error("Attachments are not supported");
160
160
 
161
- const attachment = await adapter.add({ file });
161
+ const upsertAttachment = (a: PendingAttachment) => {
162
+ const idx = this._attachments.findIndex((attachment) => attachment.id === a.id);
163
+ if (idx !== -1)
164
+ this._attachments = [
165
+ ...this._attachments.slice(0, idx),
166
+ a,
167
+ ...this._attachments.slice(idx + 1),
168
+ ];
169
+ else {
170
+ this._attachments = [...this._attachments, a];
171
+ this._notifyEventSubscribers("attachment_add");
172
+ }
173
+
174
+ this._notifySubscribers();
175
+ };
176
+
177
+ const promiseOrGenerator = adapter.add({ file });
178
+ if (Symbol.asyncIterator in promiseOrGenerator) {
179
+ for await (const r of promiseOrGenerator) {
180
+ upsertAttachment(r);
181
+ }
182
+ } else {
183
+ upsertAttachment(await promiseOrGenerator);
184
+ }
162
185
 
163
- this._attachments = [...this._attachments, attachment as PendingAttachment];
164
186
  this._notifyEventSubscribers("attachment_add");
165
187
  this._notifySubscribers();
166
188
  }
@@ -19,6 +19,11 @@ class LocalRuntimeImpl extends AssistantRuntimeImpl implements LocalRuntime {
19
19
  super(core, ThreadRuntimeImpl);
20
20
  }
21
21
 
22
+ public override __internal_bindMethods() {
23
+ super.__internal_bindMethods();
24
+ this.reset = this.reset.bind(this);
25
+ }
26
+
22
27
  public reset(options?: Parameters<LocalRuntimeCore["reset"]>[0]) {
23
28
  this.core.reset(options);
24
29
  }