@assistant-ui/core 0.2.12 → 0.2.14

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 (212) hide show
  1. package/dist/adapters/thread-history.d.ts +3 -1
  2. package/dist/adapters/thread-history.d.ts.map +1 -1
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/react/AssistantProvider.js +6 -1
  6. package/dist/react/AssistantProvider.js.map +1 -1
  7. package/dist/react/RuntimeAdapter.d.ts +1 -1
  8. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  9. package/dist/react/RuntimeAdapter.js +16 -6
  10. package/dist/react/RuntimeAdapter.js.map +1 -1
  11. package/dist/react/client/DataRenderers.d.ts +1 -8
  12. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  13. package/dist/react/client/DataRenderers.js +3 -2
  14. package/dist/react/client/DataRenderers.js.map +1 -1
  15. package/dist/react/client/Interactables.d.ts +1 -1
  16. package/dist/react/client/Interactables.d.ts.map +1 -1
  17. package/dist/react/client/Interactables.js +4 -3
  18. package/dist/react/client/Interactables.js.map +1 -1
  19. package/dist/react/client/Tools.d.ts +2 -13
  20. package/dist/react/client/Tools.d.ts.map +1 -1
  21. package/dist/react/client/Tools.js +4 -3
  22. package/dist/react/client/Tools.js.map +1 -1
  23. package/dist/react/primitives/message/MessageGroupedParts.d.ts +3 -2
  24. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  25. package/dist/react/primitives/message/MessageGroupedParts.js +4 -4
  26. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  27. package/dist/react/primitives/message/MessageParts.d.ts +28 -1
  28. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  29. package/dist/react/primitives/message/MessageParts.js +43 -9
  30. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  31. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  32. package/dist/react/providers/TextMessagePartProvider.js +3 -2
  33. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  34. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -0
  35. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  36. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +2 -0
  37. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  38. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -0
  39. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  40. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  41. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +6 -0
  42. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  43. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  44. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +2 -0
  45. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  46. package/dist/react/utils/groupParts.d.ts +13 -1
  47. package/dist/react/utils/groupParts.d.ts.map +1 -1
  48. package/dist/react/utils/groupParts.js +17 -5
  49. package/dist/react/utils/groupParts.js.map +1 -1
  50. package/dist/runtime/api/bindings.d.ts +1 -0
  51. package/dist/runtime/api/bindings.d.ts.map +1 -1
  52. package/dist/runtime/api/message-runtime.d.ts +2 -0
  53. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  54. package/dist/runtime/api/message-runtime.js +5 -0
  55. package/dist/runtime/api/message-runtime.js.map +1 -1
  56. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  57. package/dist/runtime/api/thread-list-runtime.js +1 -0
  58. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  59. package/dist/runtime/api/thread-runtime.d.ts +3 -0
  60. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  61. package/dist/runtime/api/thread-runtime.js +4 -0
  62. package/dist/runtime/api/thread-runtime.js.map +1 -1
  63. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  64. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  65. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  66. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +30 -0
  67. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -0
  68. package/dist/runtime/branch/external-thread-branch-adapter.js +0 -0
  69. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  70. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  71. package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -0
  72. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  73. package/dist/runtimes/external-store/external-store-adapter.d.ts +1 -0
  74. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  75. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
  76. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  77. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +13 -0
  78. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  79. package/dist/runtimes/local/local-runtime-options.d.ts +1 -1
  80. package/dist/runtimes/local/local-thread-runtime-core.d.ts +8 -1
  81. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  82. package/dist/runtimes/local/local-thread-runtime-core.js +63 -5
  83. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  84. package/dist/runtimes/local/should-continue.js +4 -2
  85. package/dist/runtimes/local/should-continue.js.map +1 -1
  86. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +2 -0
  87. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  88. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +4 -0
  89. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  90. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  91. package/dist/runtimes/remote-thread-list/empty-thread-core.js +4 -0
  92. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  93. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +1 -0
  94. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  95. package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -0
  96. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  97. package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
  98. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  99. package/dist/store/clients/chain-of-thought-client.d.ts +2 -7
  100. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  101. package/dist/store/clients/chain-of-thought-client.js +3 -2
  102. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  103. package/dist/store/clients/model-context-client.d.ts +1 -1
  104. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  105. package/dist/store/clients/model-context-client.js +3 -2
  106. package/dist/store/clients/model-context-client.js.map +1 -1
  107. package/dist/store/clients/no-op-composer-client.d.ts +2 -4
  108. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  109. package/dist/store/clients/no-op-composer-client.js +3 -2
  110. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  111. package/dist/store/clients/runtime-adapter.d.ts +1 -3
  112. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  113. package/dist/store/clients/runtime-adapter.js +2 -15
  114. package/dist/store/clients/runtime-adapter.js.map +1 -1
  115. package/dist/store/clients/suggestions.d.ts +1 -4
  116. package/dist/store/clients/suggestions.d.ts.map +1 -1
  117. package/dist/store/clients/suggestions.js +6 -4
  118. package/dist/store/clients/suggestions.js.map +1 -1
  119. package/dist/store/clients/thread-message-client.d.ts +1 -1
  120. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  121. package/dist/store/clients/thread-message-client.js +14 -10
  122. package/dist/store/clients/thread-message-client.js.map +1 -1
  123. package/dist/store/internal.d.ts +2 -2
  124. package/dist/store/internal.js +2 -2
  125. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -4
  126. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  127. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -2
  128. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  129. package/dist/store/runtime-clients/composer-runtime-client.d.ts +2 -10
  130. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  131. package/dist/store/runtime-clients/composer-runtime-client.js +9 -6
  132. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  133. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -4
  134. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  135. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -2
  136. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  137. package/dist/store/runtime-clients/message-runtime-client.d.ts +2 -7
  138. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  139. package/dist/store/runtime-clients/message-runtime-client.js +10 -6
  140. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  141. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +2 -4
  142. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  143. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +3 -2
  144. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  145. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +2 -5
  146. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  147. package/dist/store/runtime-clients/thread-list-runtime-client.js +6 -4
  148. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  149. package/dist/store/runtime-clients/thread-runtime-client.d.ts +2 -4
  150. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  151. package/dist/store/runtime-clients/thread-runtime-client.js +7 -4
  152. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  153. package/dist/store/scopes/message.d.ts +1 -0
  154. package/dist/store/scopes/message.d.ts.map +1 -1
  155. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  156. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  157. package/dist/store/scopes/thread.d.ts +1 -0
  158. package/dist/store/scopes/thread.d.ts.map +1 -1
  159. package/package.json +4 -4
  160. package/src/adapters/thread-history.ts +2 -0
  161. package/src/index.ts +1 -0
  162. package/src/react/AssistantProvider.tsx +3 -1
  163. package/src/react/RuntimeAdapter.ts +25 -8
  164. package/src/react/client/DataRenderers.ts +42 -45
  165. package/src/react/client/Interactables.ts +261 -261
  166. package/src/react/client/Tools.ts +6 -4
  167. package/src/react/primitives/message/MessageGroupedParts.tsx +19 -7
  168. package/src/react/primitives/message/MessageParts.tsx +64 -13
  169. package/src/react/providers/TextMessagePartProvider.tsx +5 -3
  170. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +1 -0
  171. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +11 -0
  172. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -0
  173. package/src/react/utils/groupParts.ts +27 -0
  174. package/src/runtime/api/bindings.ts +1 -0
  175. package/src/runtime/api/message-runtime.ts +7 -0
  176. package/src/runtime/api/thread-list-runtime.ts +1 -0
  177. package/src/runtime/api/thread-runtime.ts +7 -0
  178. package/src/runtime/base/base-thread-runtime-core.ts +1 -0
  179. package/src/runtime/branch/external-thread-branch-adapter.ts +26 -0
  180. package/src/runtime/interfaces/thread-list-runtime-core.ts +1 -0
  181. package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
  182. package/src/runtimes/external-store/external-store-adapter.ts +1 -0
  183. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +24 -0
  184. package/src/runtimes/local/local-runtime-options.ts +1 -1
  185. package/src/runtimes/local/local-thread-runtime-core.test.ts +311 -0
  186. package/src/runtimes/local/local-thread-runtime-core.ts +104 -7
  187. package/src/runtimes/local/should-continue.ts +23 -13
  188. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +5 -0
  189. package/src/runtimes/remote-thread-list/empty-thread-core.ts +5 -0
  190. package/src/runtimes/remote-thread-list/remote-thread-state.ts +2 -0
  191. package/src/runtimes/remote-thread-list/types.ts +1 -0
  192. package/src/store/clients/chain-of-thought-client.ts +5 -3
  193. package/src/store/clients/model-context-client.test.ts +5 -4
  194. package/src/store/clients/model-context-client.ts +21 -21
  195. package/src/store/clients/no-op-composer-client.ts +5 -3
  196. package/src/store/clients/runtime-adapter.ts +0 -24
  197. package/src/store/clients/suggestions.ts +9 -18
  198. package/src/store/clients/thread-message-client.ts +29 -26
  199. package/src/store/internal.ts +1 -4
  200. package/src/store/runtime-clients/attachment-runtime-client.ts +14 -14
  201. package/src/store/runtime-clients/composer-runtime-client.ts +30 -24
  202. package/src/store/runtime-clients/message-part-runtime-client.ts +5 -3
  203. package/src/store/runtime-clients/message-runtime-client.ts +26 -19
  204. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +5 -3
  205. package/src/store/runtime-clients/thread-list-runtime-client.ts +10 -6
  206. package/src/store/runtime-clients/thread-runtime-client.ts +11 -6
  207. package/src/store/scopes/message.ts +1 -0
  208. package/src/store/scopes/thread-list-item.ts +1 -0
  209. package/src/store/scopes/thread.ts +1 -0
  210. package/src/tests/external-store-thread-runtime-core.test.ts +57 -0
  211. package/src/tests/groupMessageParts.test.ts +84 -0
  212. package/src/tests/groupParts.test.ts +55 -0
@@ -3,11 +3,11 @@ import { resource } from "@assistant-ui/tap";
3
3
  import type { ClientOutput } from "@assistant-ui/store";
4
4
  import type { ComposerState } from "../scopes/composer";
5
5
 
6
- export const NoOpComposerClient = resource(function NoOpComposerClient({
6
+ const useNoOpComposerClient = ({
7
7
  type,
8
8
  }: {
9
9
  type: "edit" | "thread";
10
- }): ClientOutput<"composer"> {
10
+ }): ClientOutput<"composer"> => {
11
11
  const state = useMemo<ComposerState>(() => {
12
12
  return {
13
13
  isEditing: false,
@@ -71,4 +71,6 @@ export const NoOpComposerClient = resource(function NoOpComposerClient({
71
71
  throw new Error("Not supported");
72
72
  },
73
73
  };
74
- });
74
+ };
75
+
76
+ export const NoOpComposerClient = resource(useNoOpComposerClient);
@@ -1,9 +1,4 @@
1
- import { useEffect } from "react";
2
- import { useResource, resource } from "@assistant-ui/tap";
3
- import type { AssistantRuntime } from "../../runtime/api/assistant-runtime";
4
- import { ThreadListClient } from "../runtime-clients/thread-list-runtime-client";
5
1
  import {
6
- useAssistantClientRef,
7
2
  Derived,
8
3
  type ScopesConfig,
9
4
  type AssistantClient,
@@ -11,25 +6,6 @@ import {
11
6
  import { ModelContext } from "./model-context-client";
12
7
  import { Suggestions } from "./suggestions";
13
8
 
14
- export const RuntimeAdapterResource = resource(function RuntimeAdapterResource(
15
- runtime: AssistantRuntime,
16
- ) {
17
- const clientRef = useAssistantClientRef();
18
-
19
- useEffect(() => {
20
- return runtime.registerModelContextProvider(
21
- clientRef.current!.modelContext(),
22
- );
23
- }, [runtime, clientRef]);
24
-
25
- return useResource(
26
- ThreadListClient({
27
- runtime: runtime.threads,
28
- __internal_assistantRuntime: runtime,
29
- }),
30
- );
31
- });
32
-
33
9
  export const baseRuntimeAdapterTransformScopes = (
34
10
  scopes: ScopesConfig,
35
11
  parent: AssistantClient,
@@ -9,17 +9,19 @@ export type SuggestionConfig =
9
9
  | string
10
10
  | { title: string; label: string; prompt: string };
11
11
 
12
- const SuggestionClient = resource(function SuggestionClient(
12
+ const useSuggestionClient = (
13
13
  state: SuggestionState,
14
- ): ClientOutput<"suggestion"> {
14
+ ): ClientOutput<"suggestion"> => {
15
15
  return {
16
16
  getState: () => state,
17
17
  };
18
- });
18
+ };
19
19
 
20
- const SuggestionsResource = resource(function SuggestionsResource(
20
+ const SuggestionClient = resource(useSuggestionClient);
21
+
22
+ const useSuggestionsResource = (
21
23
  suggestions?: SuggestionConfig[],
22
- ): ClientOutput<"suggestions"> {
24
+ ): ClientOutput<"suggestions"> => {
23
25
  const [state] = useState<SuggestionsState>(() => {
24
26
  const normalizedSuggestions = (suggestions ?? []).map((s) => {
25
27
  if (typeof s === "string") {
@@ -55,17 +57,6 @@ const SuggestionsResource = resource(function SuggestionsResource(
55
57
  return suggestionClients.get({ index });
56
58
  },
57
59
  };
58
- });
60
+ };
59
61
 
60
- export const Suggestions: {
61
- (): import("@assistant-ui/tap").ResourceElement<
62
- ClientOutput<"suggestions">,
63
- undefined
64
- >;
65
- (
66
- suggestions: SuggestionConfig[],
67
- ): import("@assistant-ui/tap").ResourceElement<
68
- ClientOutput<"suggestions">,
69
- SuggestionConfig[]
70
- >;
71
- } = SuggestionsResource as any;
62
+ export const Suggestions = resource(useSuggestionsResource);
@@ -11,12 +11,13 @@ import { useClientLookup } from "@assistant-ui/store";
11
11
  import type { MessageState } from "../scopes/message";
12
12
  import type { PartState } from "../scopes/part";
13
13
  import { NoOpComposerClient } from "./no-op-composer-client";
14
+ import { getThreadMessageText } from "../../utils/text";
14
15
 
15
- const ThreadMessagePartClient = resource(function ThreadMessagePartClient({
16
+ const useThreadMessagePartClient = ({
16
17
  part,
17
18
  }: {
18
19
  part: ThreadAssistantMessagePart | ThreadUserMessagePart;
19
- }): ClientOutput<"part"> {
20
+ }): ClientOutput<"part"> => {
20
21
  const state = useMemo<PartState>(() => {
21
22
  return {
22
23
  ...part,
@@ -36,21 +37,25 @@ const ThreadMessagePartClient = resource(function ThreadMessagePartClient({
36
37
  throw new Error("Not supported");
37
38
  },
38
39
  };
39
- });
40
+ };
41
+
42
+ const ThreadMessagePartClient = resource(useThreadMessagePartClient);
43
+
44
+ const useThreadMessageAttachmentClient = ({
45
+ attachment,
46
+ }: {
47
+ attachment: Attachment;
48
+ }): ClientOutput<"attachment"> => {
49
+ return {
50
+ getState: () => attachment,
51
+ remove: () => {
52
+ throw new Error("Not supported");
53
+ },
54
+ };
55
+ };
40
56
 
41
57
  const ThreadMessageAttachmentClient = resource(
42
- function ThreadMessageAttachmentClient({
43
- attachment,
44
- }: {
45
- attachment: Attachment;
46
- }): ClientOutput<"attachment"> {
47
- return {
48
- getState: () => attachment,
49
- remove: () => {
50
- throw new Error("Not supported");
51
- },
52
- };
53
- },
58
+ useThreadMessageAttachmentClient,
54
59
  );
55
60
  export type ThreadMessageClientProps = {
56
61
  message: ThreadMessage;
@@ -60,13 +65,13 @@ export type ThreadMessageClientProps = {
60
65
  branchCount?: number;
61
66
  };
62
67
 
63
- export const ThreadMessageClient = resource(function ThreadMessageClient({
68
+ const useThreadMessageClient = ({
64
69
  message,
65
70
  index,
66
71
  isLast = true,
67
72
  branchNumber = 1,
68
73
  branchCount = 1,
69
- }: ThreadMessageClientProps): ClientOutput<"message"> {
74
+ }: ThreadMessageClientProps): ClientOutput<"message"> => {
70
75
  const [isCopiedState, setIsCopied] = useState(false);
71
76
  const [isHoveringState, setIsHovering] = useState(false);
72
77
 
@@ -137,6 +142,9 @@ export const ThreadMessageClient = resource(function ThreadMessageClient({
137
142
  return attachments.get(selector);
138
143
  }
139
144
  },
145
+ delete: () => {
146
+ throw new Error("Not supported in ThreadMessageProvider");
147
+ },
140
148
  reload: () => {
141
149
  throw new Error("Not supported in ThreadMessageProvider");
142
150
  },
@@ -153,16 +161,11 @@ export const ThreadMessageClient = resource(function ThreadMessageClient({
153
161
  throw new Error("Not supported in ThreadMessageProvider");
154
162
  },
155
163
  getCopyText: () => {
156
- return message.content
157
- .map((part) => {
158
- if ("text" in part && typeof part.text === "string") {
159
- return part.text;
160
- }
161
- return "";
162
- })
163
- .join("\n");
164
+ return getThreadMessageText(message);
164
165
  },
165
166
  setIsCopied,
166
167
  setIsHovering,
167
168
  };
168
- });
169
+ };
170
+
171
+ export const ThreadMessageClient = resource(useThreadMessageClient);
@@ -5,7 +5,4 @@ export { MessageClient } from "./runtime-clients/message-runtime-client";
5
5
  export { ThreadClient } from "./runtime-clients/thread-runtime-client";
6
6
  export { ThreadListItemClient } from "./runtime-clients/thread-list-item-runtime-client";
7
7
  export { ThreadListClient } from "./runtime-clients/thread-list-runtime-client";
8
- export {
9
- RuntimeAdapterResource,
10
- baseRuntimeAdapterTransformScopes,
11
- } from "./clients/runtime-adapter";
8
+ export { baseRuntimeAdapterTransformScopes } from "./clients/runtime-adapter";
@@ -3,18 +3,18 @@ import type { ClientOutput } from "@assistant-ui/store";
3
3
  import type { AttachmentRuntime } from "../../runtime/api/attachment-runtime";
4
4
  import { useSubscribable } from "./useSubscribable";
5
5
 
6
- export const AttachmentRuntimeClient = resource(
7
- function AttachmentRuntimeClient({
8
- runtime,
9
- }: {
10
- runtime: AttachmentRuntime;
11
- }): ClientOutput<"attachment"> {
12
- const state = useSubscribable(runtime);
6
+ const useAttachmentRuntimeClient = ({
7
+ runtime,
8
+ }: {
9
+ runtime: AttachmentRuntime;
10
+ }): ClientOutput<"attachment"> => {
11
+ const state = useSubscribable(runtime);
13
12
 
14
- return {
15
- getState: () => state,
16
- remove: runtime.remove,
17
- __internal_getRuntime: () => runtime,
18
- };
19
- },
20
- );
13
+ return {
14
+ getState: () => state,
15
+ remove: runtime.remove,
16
+ __internal_getRuntime: () => runtime,
17
+ };
18
+ };
19
+
20
+ export const AttachmentRuntimeClient = resource(useAttachmentRuntimeClient);
@@ -15,28 +15,30 @@ import type { QueueItemState } from "../scopes/queue-item";
15
15
  import { AttachmentRuntimeClient } from "./attachment-runtime-client";
16
16
  import { useSubscribable } from "./useSubscribable";
17
17
 
18
- const ComposerAttachmentClientByIndex = resource(
19
- function ComposerAttachmentClientByIndex({
20
- runtime,
21
- index,
22
- }: {
23
- runtime: ComposerRuntime;
24
- index: number;
25
- }) {
26
- const attachmentRuntime = useMemo(
27
- () => runtime.getAttachmentByIndex(index),
28
- [runtime, index],
29
- );
18
+ const useComposerAttachmentClientByIndex = ({
19
+ runtime,
20
+ index,
21
+ }: {
22
+ runtime: ComposerRuntime;
23
+ index: number;
24
+ }) => {
25
+ const attachmentRuntime = useMemo(
26
+ () => runtime.getAttachmentByIndex(index),
27
+ [runtime, index],
28
+ );
30
29
 
31
- return useResource(
32
- AttachmentRuntimeClient({
33
- runtime: attachmentRuntime,
34
- }),
35
- );
36
- },
30
+ return useResource(
31
+ AttachmentRuntimeClient({
32
+ runtime: attachmentRuntime,
33
+ }),
34
+ );
35
+ };
36
+
37
+ const ComposerAttachmentClientByIndex = resource(
38
+ useComposerAttachmentClientByIndex,
37
39
  );
38
40
 
39
- const QueueItemClient = resource(function QueueItemClient({
41
+ const useQueueItemClient = ({
40
42
  item,
41
43
  onSteer,
42
44
  onRemove,
@@ -44,15 +46,17 @@ const QueueItemClient = resource(function QueueItemClient({
44
46
  item: QueueItemState;
45
47
  onSteer: () => void;
46
48
  onRemove: () => void;
47
- }): ClientOutput<"queueItem"> {
49
+ }): ClientOutput<"queueItem"> => {
48
50
  return {
49
51
  getState: () => item,
50
52
  steer: onSteer,
51
53
  remove: onRemove,
52
54
  };
53
- });
55
+ };
56
+
57
+ const QueueItemClient = resource(useQueueItemClient);
54
58
 
55
- export const ComposerClient = resource(function ComposerClient({
59
+ const useComposerClient = ({
56
60
  threadIdRef,
57
61
  messageIdRef,
58
62
  runtime,
@@ -60,7 +64,7 @@ export const ComposerClient = resource(function ComposerClient({
60
64
  threadIdRef: { current: string };
61
65
  messageIdRef?: { current: string };
62
66
  runtime: ComposerRuntime;
63
- }): ClientOutput<"composer"> {
67
+ }): ClientOutput<"composer"> => {
64
68
  const runtimeState = useSubscribable(runtime);
65
69
  const emit = useAssistantEmit();
66
70
 
@@ -173,4 +177,6 @@ export const ComposerClient = resource(function ComposerClient({
173
177
  queueItem: (selector) => queueItems.get(selector),
174
178
  __internal_getRuntime: () => runtime,
175
179
  };
176
- });
180
+ };
181
+
182
+ export const ComposerClient = resource(useComposerClient);
@@ -3,11 +3,11 @@ import type { ClientOutput } from "@assistant-ui/store";
3
3
  import type { MessagePartRuntime } from "../../runtime/api/message-part-runtime";
4
4
  import { useSubscribable } from "./useSubscribable";
5
5
 
6
- export const MessagePartClient = resource(function MessagePartClient({
6
+ const useMessagePartClient = ({
7
7
  runtime,
8
8
  }: {
9
9
  runtime: MessagePartRuntime;
10
- }): ClientOutput<"part"> {
10
+ }): ClientOutput<"part"> => {
11
11
  const state = useSubscribable(runtime);
12
12
 
13
13
  return {
@@ -18,4 +18,6 @@ export const MessagePartClient = resource(function MessagePartClient({
18
18
  runtime.respondToToolApproval(response),
19
19
  __internal_getRuntime: () => runtime,
20
20
  };
21
- });
21
+ };
22
+
23
+ export const MessagePartClient = resource(useMessagePartClient);
@@ -12,43 +12,47 @@ import { MessagePartClient } from "./message-part-runtime-client";
12
12
  import type { MessageState } from "../scopes/message";
13
13
  import { AttachmentRuntimeClient } from "./attachment-runtime-client";
14
14
 
15
+ const useMessageAttachmentClientByIndex = ({
16
+ runtime,
17
+ index,
18
+ }: {
19
+ runtime: MessageRuntime;
20
+ index: number;
21
+ }) => {
22
+ const attachmentRuntime = useMemo(
23
+ () => runtime.getAttachmentByIndex(index),
24
+ [runtime, index],
25
+ );
26
+ return useResource(AttachmentRuntimeClient({ runtime: attachmentRuntime }));
27
+ };
28
+
15
29
  const MessageAttachmentClientByIndex = resource(
16
- function MessageAttachmentClientByIndex({
17
- runtime,
18
- index,
19
- }: {
20
- runtime: MessageRuntime;
21
- index: number;
22
- }) {
23
- const attachmentRuntime = useMemo(
24
- () => runtime.getAttachmentByIndex(index),
25
- [runtime, index],
26
- );
27
- return useResource(AttachmentRuntimeClient({ runtime: attachmentRuntime }));
28
- },
30
+ useMessageAttachmentClientByIndex,
29
31
  );
30
32
 
31
- const MessagePartByIndex = resource(function MessagePartByIndex({
33
+ const useMessagePartByIndex = ({
32
34
  runtime,
33
35
  index,
34
36
  }: {
35
37
  runtime: MessageRuntime;
36
38
  index: number;
37
- }) {
39
+ }) => {
38
40
  const partRuntime = useMemo(
39
41
  () => runtime.getMessagePartByIndex(index),
40
42
  [runtime, index],
41
43
  );
42
44
  return useResource(MessagePartClient({ runtime: partRuntime }));
43
- });
45
+ };
44
46
 
45
- export const MessageClient = resource(function MessageClient({
47
+ const MessagePartByIndex = resource(useMessagePartByIndex);
48
+
49
+ const useMessageClient = ({
46
50
  runtime,
47
51
  threadIdRef,
48
52
  }: {
49
53
  runtime: MessageRuntime;
50
54
  threadIdRef: { current: string };
51
- }): ClientOutput<"message"> {
55
+ }): ClientOutput<"message"> => {
52
56
  const runtimeState = useSubscribable(runtime);
53
57
 
54
58
  const [isCopiedState, setIsCopied] = useState(false);
@@ -117,6 +121,7 @@ export const MessageClient = resource(function MessageClient({
117
121
 
118
122
  composer: () => composer.methods,
119
123
 
124
+ delete: () => runtime.delete(),
120
125
  reload: (config) => runtime.reload(config),
121
126
  speak: () => runtime.speak(),
122
127
  stopSpeaking: () => runtime.stopSpeaking(),
@@ -144,4 +149,6 @@ export const MessageClient = resource(function MessageClient({
144
149
 
145
150
  __internal_getRuntime: () => runtime,
146
151
  };
147
- });
152
+ };
153
+
154
+ export const MessageClient = resource(useMessageClient);
@@ -8,11 +8,11 @@ import type {
8
8
  } from "../../runtime/api/thread-list-item-runtime";
9
9
  import { useSubscribable } from "./useSubscribable";
10
10
 
11
- export const ThreadListItemClient = resource(function ThreadListItemClient({
11
+ const useThreadListItemClient = ({
12
12
  runtime,
13
13
  }: {
14
14
  runtime: ThreadListItemRuntime;
15
- }): ClientOutput<"threadListItem"> {
15
+ }): ClientOutput<"threadListItem"> => {
16
16
  const state = useSubscribable(runtime);
17
17
  const emit = useAssistantEmit();
18
18
 
@@ -53,4 +53,6 @@ export const ThreadListItemClient = resource(function ThreadListItemClient({
53
53
  detach: runtime.detach,
54
54
  __internal_getRuntime: () => runtime,
55
55
  };
56
- });
56
+ };
57
+
58
+ export const ThreadListItemClient = resource(useThreadListItemClient);
@@ -12,13 +12,13 @@ import { ThreadListItemClient } from "./thread-list-item-runtime-client";
12
12
  import { ThreadClient } from "./thread-runtime-client";
13
13
  import type { ThreadsState } from "../scopes/threads";
14
14
 
15
- const ThreadListItemClientById = resource(function ThreadListItemClientById({
15
+ const useThreadListItemClientById = ({
16
16
  runtime,
17
17
  id,
18
18
  }: {
19
19
  runtime: ThreadListRuntime;
20
20
  id: string;
21
- }) {
21
+ }) => {
22
22
  const threadListItemRuntime = useMemo(
23
23
  () => runtime.getItemById(id),
24
24
  [runtime, id],
@@ -28,15 +28,17 @@ const ThreadListItemClientById = resource(function ThreadListItemClientById({
28
28
  runtime: threadListItemRuntime,
29
29
  }),
30
30
  );
31
- });
31
+ };
32
32
 
33
- export const ThreadListClient = resource(function ThreadListClient({
33
+ const ThreadListItemClientById = resource(useThreadListItemClientById);
34
+
35
+ const useThreadListClient = ({
34
36
  runtime,
35
37
  __internal_assistantRuntime,
36
38
  }: {
37
39
  runtime: ThreadListRuntime;
38
40
  __internal_assistantRuntime: AssistantRuntime;
39
- }): ClientOutput<"threads"> {
41
+ }): ClientOutput<"threads"> => {
40
42
  const runtimeState = useSubscribable(runtime);
41
43
 
42
44
  const main = useClientResource(
@@ -96,4 +98,6 @@ export const ThreadListClient = resource(function ThreadListClient({
96
98
  loadMore: () => runtime.loadMore(),
97
99
  __internal_getAssistantRuntime: () => __internal_assistantRuntime,
98
100
  };
99
- });
101
+ };
102
+
103
+ export const ThreadListClient = resource(useThreadListClient);
@@ -14,7 +14,7 @@ import { MessageClient } from "./message-runtime-client";
14
14
  import { useSubscribable } from "./useSubscribable";
15
15
  import type { ThreadState } from "../scopes/thread";
16
16
 
17
- const MessageClientById = resource(function MessageClientById({
17
+ const useMessageClientById = ({
18
18
  runtime,
19
19
  id,
20
20
  threadIdRef,
@@ -22,20 +22,22 @@ const MessageClientById = resource(function MessageClientById({
22
22
  runtime: ThreadRuntime;
23
23
  id: string;
24
24
  threadIdRef: RefObject<string>;
25
- }) {
25
+ }) => {
26
26
  const messageRuntime = useMemo(
27
27
  () => runtime.getMessageById(id),
28
28
  [runtime, id],
29
29
  );
30
30
 
31
31
  return useResource(MessageClient({ runtime: messageRuntime, threadIdRef }));
32
- });
32
+ };
33
33
 
34
- export const ThreadClient = resource(function ThreadClient({
34
+ const MessageClientById = resource(useMessageClientById);
35
+
36
+ const useThreadClient = ({
35
37
  runtime,
36
38
  }: {
37
39
  runtime: ThreadRuntime;
38
- }): ClientOutput<"thread"> {
40
+ }): ClientOutput<"thread"> => {
39
41
  const runtimeState = useSubscribable(runtime);
40
42
  const emit = useAssistantEmit();
41
43
 
@@ -109,6 +111,7 @@ export const ThreadClient = resource(function ThreadClient({
109
111
  getState: () => state,
110
112
  composer: () => composer.methods,
111
113
  append: runtime.append,
114
+ deleteMessage: runtime.deleteMessage,
112
115
  startRun: runtime.startRun,
113
116
  resumeRun: runtime.resumeRun,
114
117
  cancelRun: runtime.cancelRun,
@@ -132,4 +135,6 @@ export const ThreadClient = resource(function ThreadClient({
132
135
  },
133
136
  __internal_getRuntime: () => runtime,
134
137
  };
135
- });
138
+ };
139
+
140
+ export const ThreadClient = resource(useThreadClient);
@@ -42,6 +42,7 @@ export type MessageMethods = {
42
42
  */
43
43
  getState(): MessageState;
44
44
  composer(): ComposerMethods;
45
+ delete(): void | Promise<void>;
45
46
  reload(config?: { runConfig?: RunConfig }): void;
46
47
  /** @deprecated This API is still under active development and might change without notice. */
47
48
  speak(): void;
@@ -6,6 +6,7 @@ export type ThreadListItemState = {
6
6
  readonly remoteId: string | undefined;
7
7
  readonly externalId: string | undefined;
8
8
  readonly title?: string | undefined;
9
+ readonly lastMessageAt?: Date | undefined;
9
10
  readonly status: ThreadListItemStatus;
10
11
  readonly custom?: Record<string, unknown> | undefined;
11
12
  };
@@ -88,6 +88,7 @@ export type ThreadMethods = {
88
88
  * ```
89
89
  */
90
90
  append(message: CreateAppendMessage): void;
91
+ deleteMessage(messageId: string): void | Promise<void>;
91
92
  /**
92
93
  * Start a new run with the given configuration.
93
94
  * @param config The configuration for starting the run
@@ -49,6 +49,15 @@ describe("ExternalStoreThreadRuntimeCore - state reference stability", () => {
49
49
  expect(runtime.capabilities).not.toBe(capsBefore);
50
50
  });
51
51
 
52
+ it("enables delete when setMessages is provided", () => {
53
+ const runtime = new ExternalStoreThreadRuntimeCore(
54
+ mockContextProvider,
55
+ makeStore({ setMessages: vi.fn() }),
56
+ );
57
+
58
+ expect(runtime.capabilities.delete).toBe(true);
59
+ });
60
+
52
61
  it("should maintain stable reference across repeated setAdapter calls", () => {
53
62
  const runtime = new ExternalStoreThreadRuntimeCore(
54
63
  mockContextProvider,
@@ -152,6 +161,54 @@ describe("ExternalStoreThreadRuntimeCore - state reference stability", () => {
152
161
 
153
162
  expect(runtime.capabilities).toBe(capsBefore);
154
163
  });
164
+
165
+ describe("deleteMessage", () => {
166
+ it("removes only the selected message", async () => {
167
+ const setMessages = vi.fn();
168
+ const runtime = new ExternalStoreThreadRuntimeCore(
169
+ mockContextProvider,
170
+ makeStore({
171
+ messages: [
172
+ {
173
+ id: "u1",
174
+ role: "user",
175
+ content: [{ type: "text", text: "first" }],
176
+ },
177
+ {
178
+ id: "a1",
179
+ role: "assistant",
180
+ content: [{ type: "text", text: "answer" }],
181
+ },
182
+ {
183
+ id: "u2",
184
+ role: "user",
185
+ content: [{ type: "text", text: "second" }],
186
+ },
187
+ ],
188
+ setMessages,
189
+ }),
190
+ );
191
+
192
+ await runtime.deleteMessage("a1");
193
+
194
+ expect(setMessages).toHaveBeenCalledWith([
195
+ expect.objectContaining({ id: "u1" }),
196
+ expect.objectContaining({ id: "u2" }),
197
+ ]);
198
+ });
199
+
200
+ it("delegates to onDelete when provided", async () => {
201
+ const onDelete = vi.fn();
202
+ const runtime = new ExternalStoreThreadRuntimeCore(
203
+ mockContextProvider,
204
+ makeStore({ onDelete }),
205
+ );
206
+
207
+ await runtime.deleteMessage("m1");
208
+
209
+ expect(onDelete).toHaveBeenCalledWith("m1");
210
+ });
211
+ });
155
212
  });
156
213
  describe("ExternalStoreThreadRuntimeCore - optimistic message reconciliation", () => {
157
214
  type Raw = {