@assistant-ui/react 0.10.24 → 0.10.26

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 (267) hide show
  1. package/dist/api/{ContentPartRuntime.d.ts → MessagePartRuntime.d.ts} +14 -14
  2. package/dist/api/{ContentPartRuntime.d.ts.map → MessagePartRuntime.d.ts.map} +1 -1
  3. package/dist/api/{ContentPartRuntime.js → MessagePartRuntime.js} +6 -6
  4. package/dist/api/{ContentPartRuntime.js.map → MessagePartRuntime.js.map} +1 -1
  5. package/dist/api/MessageRuntime.d.ts +8 -8
  6. package/dist/api/MessageRuntime.js +17 -17
  7. package/dist/api/MessageRuntime.js.map +1 -1
  8. package/dist/api/RuntimePathTypes.d.ts +2 -2
  9. package/dist/api/ThreadListRuntime.d.ts +3 -0
  10. package/dist/api/ThreadListRuntime.d.ts.map +1 -1
  11. package/dist/api/ThreadListRuntime.js +5 -1
  12. package/dist/api/ThreadListRuntime.js.map +1 -1
  13. package/dist/api/ThreadRuntime.d.ts +5 -0
  14. package/dist/api/ThreadRuntime.d.ts.map +1 -1
  15. package/dist/api/ThreadRuntime.js +1 -0
  16. package/dist/api/ThreadRuntime.js.map +1 -1
  17. package/dist/api/index.d.ts +2 -1
  18. package/dist/api/index.d.ts.map +1 -1
  19. package/dist/cloud/auiV0.d.ts +2 -2
  20. package/dist/cloud/auiV0.js +1 -1
  21. package/dist/cloud/auiV0.js.map +1 -1
  22. package/dist/context/providers/MessagePartRuntimeProvider.d.ts +9 -0
  23. package/dist/context/providers/{ContentPartRuntimeProvider.d.ts.map → MessagePartRuntimeProvider.d.ts.map} +1 -1
  24. package/dist/context/providers/{ContentPartRuntimeProvider.js → MessagePartRuntimeProvider.js} +9 -9
  25. package/dist/context/providers/MessagePartRuntimeProvider.js.map +1 -0
  26. package/dist/context/providers/{TextContentPartProvider.d.ts → TextMessagePartProvider.d.ts} +3 -3
  27. package/dist/context/providers/{TextContentPartProvider.d.ts.map → TextMessagePartProvider.d.ts.map} +1 -1
  28. package/dist/context/providers/{TextContentPartProvider.js → TextMessagePartProvider.js} +19 -19
  29. package/dist/context/providers/{TextContentPartProvider.js.map → TextMessagePartProvider.js.map} +1 -1
  30. package/dist/context/providers/index.d.ts +2 -1
  31. package/dist/context/providers/index.d.ts.map +1 -1
  32. package/dist/context/providers/index.js +4 -2
  33. package/dist/context/providers/index.js.map +1 -1
  34. package/dist/context/react/AttachmentContext.d.ts +72 -72
  35. package/dist/context/react/MessagePartContext.d.ts +41 -0
  36. package/dist/context/react/{ContentPartContext.d.ts.map → MessagePartContext.d.ts.map} +1 -1
  37. package/dist/context/react/MessagePartContext.js +25 -0
  38. package/dist/context/react/MessagePartContext.js.map +1 -0
  39. package/dist/context/react/index.d.ts +1 -1
  40. package/dist/context/react/index.js +3 -3
  41. package/dist/context/react/index.js.map +1 -1
  42. package/dist/context/stores/AssistantToolUIs.d.ts +3 -3
  43. package/dist/context/stores/AssistantToolUIs.js.map +1 -1
  44. package/dist/model-context/useAssistantTool.d.ts +2 -2
  45. package/dist/model-context/useAssistantTool.js.map +1 -1
  46. package/dist/model-context/useAssistantToolUI.d.ts +2 -2
  47. package/dist/model-context/useAssistantToolUI.js.map +1 -1
  48. package/dist/model-context/useInlineRender.d.ts +2 -2
  49. package/dist/model-context/useInlineRender.js.map +1 -1
  50. package/dist/primitives/assistantModal/AssistantModalContent.d.ts +2 -0
  51. package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
  52. package/dist/primitives/assistantModal/AssistantModalContent.js +2 -1
  53. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  54. package/dist/primitives/index.d.ts +12 -6
  55. package/dist/primitives/index.d.ts.map +1 -1
  56. package/dist/primitives/index.js +23 -11
  57. package/dist/primitives/index.js.map +1 -1
  58. package/dist/primitives/message/MessageParts.d.ts +116 -0
  59. package/dist/primitives/message/MessageParts.d.ts.map +1 -0
  60. package/dist/primitives/message/MessageParts.js +208 -0
  61. package/dist/primitives/message/MessageParts.js.map +1 -0
  62. package/dist/primitives/message/index.d.ts +2 -1
  63. package/dist/primitives/message/index.d.ts.map +1 -1
  64. package/dist/primitives/message/index.js +4 -2
  65. package/dist/primitives/message/index.js.map +1 -1
  66. package/dist/primitives/{contentPart/ContentPartImage.d.ts → messagePart/MessagePartImage.d.ts} +8 -8
  67. package/dist/primitives/{contentPart/ContentPartImage.d.ts.map → messagePart/MessagePartImage.d.ts.map} +1 -1
  68. package/dist/primitives/messagePart/MessagePartImage.js +16 -0
  69. package/dist/primitives/messagePart/MessagePartImage.js.map +1 -0
  70. package/dist/primitives/messagePart/MessagePartInProgress.d.ts +6 -0
  71. package/dist/primitives/{contentPart/ContentPartInProgress.d.ts.map → messagePart/MessagePartInProgress.d.ts.map} +1 -1
  72. package/dist/primitives/messagePart/MessagePartInProgress.js +13 -0
  73. package/dist/primitives/messagePart/MessagePartInProgress.js.map +1 -0
  74. package/dist/primitives/{contentPart/ContentPartText.d.ts → messagePart/MessagePartText.d.ts} +6 -6
  75. package/dist/primitives/{contentPart/ContentPartText.d.ts.map → messagePart/MessagePartText.d.ts.map} +1 -1
  76. package/dist/primitives/messagePart/MessagePartText.js +18 -0
  77. package/dist/primitives/{contentPart/ContentPartText.js.map → messagePart/MessagePartText.js.map} +1 -1
  78. package/dist/primitives/messagePart/index.d.ts +4 -0
  79. package/dist/primitives/{contentPart → messagePart}/index.d.ts.map +1 -1
  80. package/dist/primitives/messagePart/index.js +10 -0
  81. package/dist/primitives/messagePart/index.js.map +1 -0
  82. package/dist/primitives/messagePart/useMessagePartFile.d.ts +5 -0
  83. package/dist/primitives/messagePart/useMessagePartFile.d.ts.map +1 -0
  84. package/dist/primitives/messagePart/useMessagePartFile.js +18 -0
  85. package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -0
  86. package/dist/primitives/messagePart/useMessagePartImage.d.ts +5 -0
  87. package/dist/primitives/messagePart/useMessagePartImage.d.ts.map +1 -0
  88. package/dist/primitives/messagePart/useMessagePartImage.js +18 -0
  89. package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -0
  90. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts +5 -0
  91. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts.map +1 -0
  92. package/dist/primitives/messagePart/useMessagePartReasoning.js +18 -0
  93. package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -0
  94. package/dist/primitives/messagePart/useMessagePartSource.d.ts +5 -0
  95. package/dist/primitives/messagePart/useMessagePartSource.d.ts.map +1 -0
  96. package/dist/primitives/messagePart/useMessagePartSource.js +18 -0
  97. package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -0
  98. package/dist/primitives/messagePart/useMessagePartText.d.ts +7 -0
  99. package/dist/primitives/messagePart/useMessagePartText.d.ts.map +1 -0
  100. package/dist/primitives/messagePart/useMessagePartText.js +18 -0
  101. package/dist/primitives/messagePart/useMessagePartText.js.map +1 -0
  102. package/dist/runtimes/core/BaseThreadRuntimeCore.d.ts +1 -0
  103. package/dist/runtimes/core/BaseThreadRuntimeCore.d.ts.map +1 -1
  104. package/dist/runtimes/core/BaseThreadRuntimeCore.js.map +1 -1
  105. package/dist/runtimes/core/ThreadListRuntimeCore.d.ts +1 -0
  106. package/dist/runtimes/core/ThreadListRuntimeCore.d.ts.map +1 -1
  107. package/dist/runtimes/core/ThreadRuntimeCore.d.ts +1 -0
  108. package/dist/runtimes/core/ThreadRuntimeCore.d.ts.map +1 -1
  109. package/dist/runtimes/external-store/ExternalStoreAdapter.d.ts +2 -0
  110. package/dist/runtimes/external-store/ExternalStoreAdapter.d.ts.map +1 -1
  111. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.d.ts +1 -0
  112. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.d.ts.map +1 -1
  113. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.js +3 -0
  114. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.js.map +1 -1
  115. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts +1 -0
  116. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts.map +1 -1
  117. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js +3 -8
  118. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js.map +1 -1
  119. package/dist/runtimes/external-store/ThreadMessageLike.d.ts +3 -3
  120. package/dist/runtimes/external-store/ThreadMessageLike.js +4 -4
  121. package/dist/runtimes/external-store/ThreadMessageLike.js.map +1 -1
  122. package/dist/runtimes/external-store/createMessageConverter.js +3 -3
  123. package/dist/runtimes/external-store/createMessageConverter.js.map +1 -1
  124. package/dist/runtimes/external-store/external-message-converter.js.map +1 -1
  125. package/dist/runtimes/local/ChatModelAdapter.d.ts +4 -4
  126. package/dist/runtimes/local/LocalThreadListRuntimeCore.d.ts +1 -0
  127. package/dist/runtimes/local/LocalThreadListRuntimeCore.d.ts.map +1 -1
  128. package/dist/runtimes/local/LocalThreadListRuntimeCore.js +3 -0
  129. package/dist/runtimes/local/LocalThreadListRuntimeCore.js.map +1 -1
  130. package/dist/runtimes/local/LocalThreadRuntimeCore.d.ts +2 -0
  131. package/dist/runtimes/local/LocalThreadRuntimeCore.d.ts.map +1 -1
  132. package/dist/runtimes/local/LocalThreadRuntimeCore.js +12 -1
  133. package/dist/runtimes/local/LocalThreadRuntimeCore.js.map +1 -1
  134. package/dist/runtimes/remote-thread-list/EMPTY_THREAD_CORE.d.ts.map +1 -1
  135. package/dist/runtimes/remote-thread-list/EMPTY_THREAD_CORE.js +1 -0
  136. package/dist/runtimes/remote-thread-list/EMPTY_THREAD_CORE.js.map +1 -1
  137. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts +2 -0
  138. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  139. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts +3 -0
  140. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  141. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js +3 -0
  142. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  143. package/dist/runtimes/utils/MessageRepository.js +1 -1
  144. package/dist/runtimes/utils/MessageRepository.js.map +1 -1
  145. package/dist/tests/setup.js +8 -8
  146. package/dist/tests/setup.js.map +1 -1
  147. package/dist/types/AssistantTypes.d.ts +15 -15
  148. package/dist/types/AttachmentTypes.d.ts +3 -3
  149. package/dist/types/MessagePartComponentTypes.d.ts +25 -0
  150. package/dist/types/{ContentPartComponentTypes.d.ts.map → MessagePartComponentTypes.d.ts.map} +1 -1
  151. package/dist/types/MessagePartComponentTypes.js +1 -0
  152. package/dist/types/index.d.ts +4 -2
  153. package/dist/types/index.d.ts.map +1 -1
  154. package/dist/utils/getThreadMessageText.js.map +1 -1
  155. package/dist/utils/smooth/SmoothContext.js +3 -3
  156. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  157. package/dist/utils/smooth/useSmooth.d.ts +3 -3
  158. package/dist/utils/smooth/useSmooth.js.map +1 -1
  159. package/dist/utils/useToolArgsFieldStatus.js +3 -3
  160. package/dist/utils/useToolArgsFieldStatus.js.map +1 -1
  161. package/package.json +8 -8
  162. package/src/api/{ContentPartRuntime.ts → MessagePartRuntime.ts} +20 -20
  163. package/src/api/MessageRuntime.ts +32 -32
  164. package/src/api/RuntimePathTypes.ts +2 -2
  165. package/src/api/ThreadListRuntime.ts +8 -0
  166. package/src/api/ThreadRuntime.ts +6 -0
  167. package/src/api/index.ts +11 -3
  168. package/src/cloud/auiV0.ts +3 -3
  169. package/src/context/providers/MessagePartRuntimeProvider.tsx +42 -0
  170. package/src/context/providers/{TextContentPartProvider.tsx → TextMessagePartProvider.tsx} +27 -27
  171. package/src/context/providers/index.ts +4 -1
  172. package/src/context/react/MessagePartContext.ts +37 -0
  173. package/src/context/react/index.ts +1 -1
  174. package/src/context/stores/AssistantToolUIs.ts +4 -4
  175. package/src/model-context/useAssistantTool.tsx +2 -2
  176. package/src/model-context/useAssistantToolUI.tsx +2 -2
  177. package/src/model-context/useInlineRender.tsx +3 -3
  178. package/src/primitives/assistantModal/AssistantModalContent.tsx +5 -1
  179. package/src/primitives/index.ts +14 -6
  180. package/src/primitives/message/MessageParts.tsx +423 -0
  181. package/src/primitives/message/index.ts +2 -1
  182. package/src/primitives/messagePart/MessagePartImage.tsx +39 -0
  183. package/src/primitives/messagePart/MessagePartInProgress.tsx +19 -0
  184. package/src/primitives/{contentPart/ContentPartText.tsx → messagePart/MessagePartText.tsx} +10 -10
  185. package/src/primitives/messagePart/index.ts +3 -0
  186. package/src/primitives/messagePart/useMessagePartFile.tsx +18 -0
  187. package/src/primitives/messagePart/useMessagePartImage.tsx +18 -0
  188. package/src/primitives/messagePart/useMessagePartReasoning.tsx +18 -0
  189. package/src/primitives/messagePart/useMessagePartSource.tsx +18 -0
  190. package/src/primitives/messagePart/useMessagePartText.tsx +18 -0
  191. package/src/runtimes/core/BaseThreadRuntimeCore.tsx +1 -0
  192. package/src/runtimes/core/ThreadListRuntimeCore.tsx +1 -0
  193. package/src/runtimes/core/ThreadRuntimeCore.tsx +1 -0
  194. package/src/runtimes/external-store/ExternalStoreAdapter.tsx +2 -0
  195. package/src/runtimes/external-store/ExternalStoreThreadListRuntimeCore.tsx +4 -0
  196. package/src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx +3 -8
  197. package/src/runtimes/external-store/ThreadMessageLike.tsx +21 -21
  198. package/src/runtimes/external-store/createMessageConverter.tsx +3 -3
  199. package/src/runtimes/external-store/external-message-converter.tsx +2 -2
  200. package/src/runtimes/local/ChatModelAdapter.tsx +13 -13
  201. package/src/runtimes/local/LocalThreadListRuntimeCore.tsx +4 -0
  202. package/src/runtimes/local/LocalThreadRuntimeCore.tsx +30 -15
  203. package/src/runtimes/remote-thread-list/EMPTY_THREAD_CORE.tsx +1 -0
  204. package/src/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.tsx +4 -0
  205. package/src/runtimes/utils/MessageRepository.tsx +1 -1
  206. package/src/tests/MessageRepository.test.ts +6 -6
  207. package/src/types/AssistantTypes.ts +24 -24
  208. package/src/types/AttachmentTypes.ts +3 -3
  209. package/src/types/MessagePartComponentTypes.tsx +52 -0
  210. package/src/types/index.ts +69 -28
  211. package/src/utils/getThreadMessageText.tsx +2 -2
  212. package/src/utils/smooth/SmoothContext.tsx +7 -7
  213. package/src/utils/smooth/useSmooth.tsx +7 -7
  214. package/src/utils/useToolArgsFieldStatus.tsx +3 -3
  215. package/dist/context/providers/ContentPartRuntimeProvider.d.ts +0 -9
  216. package/dist/context/providers/ContentPartRuntimeProvider.js.map +0 -1
  217. package/dist/context/react/ContentPartContext.d.ts +0 -41
  218. package/dist/context/react/ContentPartContext.js +0 -25
  219. package/dist/context/react/ContentPartContext.js.map +0 -1
  220. package/dist/primitives/contentPart/ContentPartImage.js +0 -16
  221. package/dist/primitives/contentPart/ContentPartImage.js.map +0 -1
  222. package/dist/primitives/contentPart/ContentPartInProgress.d.ts +0 -6
  223. package/dist/primitives/contentPart/ContentPartInProgress.js +0 -13
  224. package/dist/primitives/contentPart/ContentPartInProgress.js.map +0 -1
  225. package/dist/primitives/contentPart/ContentPartText.js +0 -18
  226. package/dist/primitives/contentPart/index.d.ts +0 -4
  227. package/dist/primitives/contentPart/index.js +0 -10
  228. package/dist/primitives/contentPart/index.js.map +0 -1
  229. package/dist/primitives/contentPart/useContentPartFile.d.ts +0 -5
  230. package/dist/primitives/contentPart/useContentPartFile.d.ts.map +0 -1
  231. package/dist/primitives/contentPart/useContentPartFile.js +0 -18
  232. package/dist/primitives/contentPart/useContentPartFile.js.map +0 -1
  233. package/dist/primitives/contentPart/useContentPartImage.d.ts +0 -5
  234. package/dist/primitives/contentPart/useContentPartImage.d.ts.map +0 -1
  235. package/dist/primitives/contentPart/useContentPartImage.js +0 -18
  236. package/dist/primitives/contentPart/useContentPartImage.js.map +0 -1
  237. package/dist/primitives/contentPart/useContentPartReasoning.d.ts +0 -5
  238. package/dist/primitives/contentPart/useContentPartReasoning.d.ts.map +0 -1
  239. package/dist/primitives/contentPart/useContentPartReasoning.js +0 -18
  240. package/dist/primitives/contentPart/useContentPartReasoning.js.map +0 -1
  241. package/dist/primitives/contentPart/useContentPartSource.d.ts +0 -5
  242. package/dist/primitives/contentPart/useContentPartSource.d.ts.map +0 -1
  243. package/dist/primitives/contentPart/useContentPartSource.js +0 -18
  244. package/dist/primitives/contentPart/useContentPartSource.js.map +0 -1
  245. package/dist/primitives/contentPart/useContentPartText.d.ts +0 -7
  246. package/dist/primitives/contentPart/useContentPartText.d.ts.map +0 -1
  247. package/dist/primitives/contentPart/useContentPartText.js +0 -18
  248. package/dist/primitives/contentPart/useContentPartText.js.map +0 -1
  249. package/dist/primitives/message/MessageContent.d.ts +0 -64
  250. package/dist/primitives/message/MessageContent.d.ts.map +0 -1
  251. package/dist/primitives/message/MessageContent.js +0 -141
  252. package/dist/primitives/message/MessageContent.js.map +0 -1
  253. package/dist/types/ContentPartComponentTypes.d.ts +0 -25
  254. package/dist/types/ContentPartComponentTypes.js +0 -1
  255. package/src/context/providers/ContentPartRuntimeProvider.tsx +0 -42
  256. package/src/context/react/ContentPartContext.ts +0 -37
  257. package/src/primitives/contentPart/ContentPartImage.tsx +0 -39
  258. package/src/primitives/contentPart/ContentPartInProgress.tsx +0 -19
  259. package/src/primitives/contentPart/index.ts +0 -3
  260. package/src/primitives/contentPart/useContentPartFile.tsx +0 -18
  261. package/src/primitives/contentPart/useContentPartImage.tsx +0 -18
  262. package/src/primitives/contentPart/useContentPartReasoning.tsx +0 -18
  263. package/src/primitives/contentPart/useContentPartSource.tsx +0 -18
  264. package/src/primitives/contentPart/useContentPartText.tsx +0 -18
  265. package/src/primitives/message/MessageContent.tsx +0 -277
  266. package/src/types/ContentPartComponentTypes.tsx +0 -52
  267. /package/dist/types/{ContentPartComponentTypes.js.map → MessagePartComponentTypes.js.map} +0 -0
@@ -24,6 +24,10 @@ export class ExternalStoreThreadListRuntimeCore
24
24
  private _threads: readonly string[] = DEFAULT_THREADS;
25
25
  private _archivedThreads: readonly string[] = EMPTY_ARRAY;
26
26
 
27
+ public get isLoading() {
28
+ return this.adapter.isLoading ?? false;
29
+ }
30
+
27
31
  public get newThreadId() {
28
32
  return undefined;
29
33
  }
@@ -53,6 +53,9 @@ export class ExternalStoreThreadRuntimeCore
53
53
 
54
54
  private _messages!: readonly ThreadMessage[];
55
55
  public isDisabled!: boolean;
56
+ public get isLoading() {
57
+ return this._store.isLoading ?? false;
58
+ }
56
59
 
57
60
  public override get messages() {
58
61
  return this._messages;
@@ -249,14 +252,6 @@ export class ExternalStoreThreadRuntimeCore
249
252
  public addToolResult(options: AddToolResultOptions) {
250
253
  if (!this._store.onAddToolResult && !this._store.onAddToolResult)
251
254
  throw new Error("Runtime does not support tool results.");
252
- this._store.onAddToolResult?.({
253
- messageId: options.messageId,
254
- toolName: options.toolName,
255
- toolCallId: options.toolCallId,
256
- result: options.result,
257
- isError: options.isError,
258
- artifact: options.artifact,
259
- });
260
255
  this._store.onAddToolResult?.(options);
261
256
  }
262
257
 
@@ -1,22 +1,22 @@
1
1
  import { parsePartialJsonObject } from "assistant-stream/utils";
2
- import { generateId } from "../../internal";
2
+ import { generateId } from "../../utils/idUtils";
3
3
  import {
4
4
  MessageStatus,
5
- TextContentPart,
6
- ImageContentPart,
5
+ TextMessagePart,
6
+ ImageMessagePart,
7
7
  ThreadMessage,
8
- ThreadAssistantContentPart,
8
+ ThreadAssistantMessagePart,
9
9
  ThreadAssistantMessage,
10
- ThreadUserContentPart,
10
+ ThreadUserMessagePart,
11
11
  ThreadUserMessage,
12
12
  ThreadSystemMessage,
13
13
  CompleteAttachment,
14
- FileContentPart,
15
- Unstable_AudioContentPart,
14
+ FileMessagePart,
15
+ Unstable_AudioMessagePart,
16
16
  } from "../../types";
17
17
  import {
18
- ReasoningContentPart,
19
- SourceContentPart,
18
+ ReasoningMessagePart,
19
+ SourceMessagePart,
20
20
  ThreadStep,
21
21
  } from "../../types/AssistantTypes";
22
22
  import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
@@ -26,12 +26,12 @@ export type ThreadMessageLike = {
26
26
  readonly content:
27
27
  | string
28
28
  | readonly (
29
- | TextContentPart
30
- | ReasoningContentPart
31
- | SourceContentPart
32
- | ImageContentPart
33
- | FileContentPart
34
- | Unstable_AudioContentPart
29
+ | TextMessagePart
30
+ | ReasoningMessagePart
31
+ | SourceMessagePart
32
+ | ImageMessagePart
33
+ | FileMessagePart
34
+ | Unstable_AudioMessagePart
35
35
  | {
36
36
  readonly type: "tool-call";
37
37
  readonly toolCallId?: string;
@@ -91,7 +91,7 @@ export const fromThreadMessageLike = (
91
91
  ...common,
92
92
  role,
93
93
  content: content
94
- .map((part): ThreadAssistantContentPart | null => {
94
+ .map((part): ThreadAssistantMessagePart | null => {
95
95
  const type = part.type;
96
96
  switch (type) {
97
97
  case "text":
@@ -126,7 +126,7 @@ export const fromThreadMessageLike = (
126
126
  default: {
127
127
  const unhandledType: "image" | "audio" = type;
128
128
  throw new Error(
129
- `Unsupported assistant content part type: ${unhandledType}`,
129
+ `Unsupported assistant message part type: ${unhandledType}`,
130
130
  );
131
131
  }
132
132
  }
@@ -146,7 +146,7 @@ export const fromThreadMessageLike = (
146
146
  return {
147
147
  ...common,
148
148
  role,
149
- content: content.map((part): ThreadUserContentPart => {
149
+ content: content.map((part): ThreadUserMessagePart => {
150
150
  const type = part.type;
151
151
  switch (type) {
152
152
  case "text":
@@ -158,7 +158,7 @@ export const fromThreadMessageLike = (
158
158
  default: {
159
159
  const unhandledType: "tool-call" | "reasoning" | "source" = type;
160
160
  throw new Error(
161
- `Unsupported user content part type: ${unhandledType}`,
161
+ `Unsupported user message part type: ${unhandledType}`,
162
162
  );
163
163
  }
164
164
  }
@@ -172,13 +172,13 @@ export const fromThreadMessageLike = (
172
172
  case "system":
173
173
  if (content.length !== 1 || content[0]!.type !== "text")
174
174
  throw new Error(
175
- "System messages must have exactly one text content part.",
175
+ "System messages must have exactly one text message part.",
176
176
  );
177
177
 
178
178
  return {
179
179
  ...common,
180
180
  role,
181
- content: content as [TextContentPart],
181
+ content: content as [TextMessagePart],
182
182
  metadata: {
183
183
  custom: metadata?.custom ?? {},
184
184
  },
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { ThreadState } from "../../api";
3
- import { useContentPart, useMessage } from "../../context";
3
+ import { useMessagePart, useMessage } from "../../context";
4
4
  import { ThreadMessage } from "../../types";
5
5
  import {
6
6
  useExternalMessageConverter,
@@ -50,13 +50,13 @@ export const createMessageConverter = <T extends object>(
50
50
  return first;
51
51
  },
52
52
  useOriginalMessages: () => {
53
- const contentPartMessages = useContentPart<T[]>({
53
+ const MessagePartMessages = useMessagePart<T[]>({
54
54
  optional: true,
55
55
  selector: getExternalStoreMessages,
56
56
  });
57
57
 
58
58
  const messageMessages = useMessage<T[]>(getExternalStoreMessages);
59
- const messages = contentPartMessages ?? messageMessages;
59
+ const messages = MessagePartMessages ?? messageMessages;
60
60
  if (messages.length === 0) throw new Error("No original messages found");
61
61
  return messages;
62
62
  },
@@ -8,7 +8,7 @@ import {
8
8
  } from "./getExternalStoreMessage";
9
9
  import { fromThreadMessageLike, ThreadMessageLike } from "./ThreadMessageLike";
10
10
  import { getAutoStatus, isAutoStatus } from "./auto-status";
11
- import { ToolCallContentPart } from "../../types";
11
+ import { ToolCallMessagePart } from "../../types";
12
12
 
13
13
  export namespace useExternalMessageConverter {
14
14
  export type Message =
@@ -61,7 +61,7 @@ const joinExternalMessages = (
61
61
  if (toolCallIdx !== -1) {
62
62
  const toolCall = assistantMessage.content[
63
63
  toolCallIdx
64
- ]! as ToolCallContentPart;
64
+ ]! as ToolCallMessagePart;
65
65
  if (output.toolName) {
66
66
  if (toolCall.toolName !== output.toolName)
67
67
  throw new Error(
@@ -1,25 +1,25 @@
1
1
  import type {
2
- FileContentPart,
2
+ FileMessagePart,
3
3
  MessageStatus,
4
- ReasoningContentPart,
4
+ ReasoningMessagePart,
5
5
  RunConfig,
6
- SourceContentPart,
7
- TextContentPart,
8
- ThreadAssistantContentPart,
6
+ SourceMessagePart,
7
+ TextMessagePart,
8
+ ThreadAssistantMessagePart,
9
9
  ThreadMessage,
10
10
  ThreadStep,
11
- ToolCallContentPart,
11
+ ToolCallMessagePart,
12
12
  } from "../../types/AssistantTypes";
13
13
  import type { ModelContext } from "../../model-context/ModelContextTypes";
14
14
  import { ReadonlyJSONValue } from "assistant-stream/utils";
15
15
 
16
16
  export type ChatModelRunUpdate = {
17
- readonly content: readonly ThreadAssistantContentPart[];
17
+ readonly content: readonly ThreadAssistantMessagePart[];
18
18
  readonly metadata?: Record<string, unknown>;
19
19
  };
20
20
 
21
21
  export type ChatModelRunResult = {
22
- readonly content?: readonly ThreadAssistantContentPart[] | undefined;
22
+ readonly content?: readonly ThreadAssistantMessagePart[] | undefined;
23
23
  readonly status?: MessageStatus | undefined;
24
24
  readonly metadata?: {
25
25
  readonly unstable_state?: ReadonlyJSONValue;
@@ -32,11 +32,11 @@ export type ChatModelRunResult = {
32
32
 
33
33
  export type CoreChatModelRunResult = Omit<ChatModelRunResult, "content"> & {
34
34
  readonly content: readonly (
35
- | TextContentPart
36
- | ReasoningContentPart
37
- | ToolCallContentPart
38
- | SourceContentPart
39
- | FileContentPart
35
+ | TextMessagePart
36
+ | ReasoningMessagePart
37
+ | ToolCallMessagePart
38
+ | SourceMessagePart
39
+ | FileMessagePart
40
40
  )[];
41
41
  };
42
42
 
@@ -16,6 +16,10 @@ export class LocalThreadListRuntimeCore
16
16
  this._mainThread = _threadFactory();
17
17
  }
18
18
 
19
+ public get isLoading() {
20
+ return false;
21
+ }
22
+
19
23
  public getMainThreadRuntimeCore() {
20
24
  return this._mainThread;
21
25
  }
@@ -33,6 +33,11 @@ export class LocalThreadRuntimeCore
33
33
 
34
34
  public readonly isDisabled = false;
35
35
 
36
+ private _isLoading = false;
37
+ public get isLoading() {
38
+ return this._isLoading;
39
+ }
40
+
36
41
  private _suggestions: readonly ThreadSuggestion[] = [];
37
42
  private _suggestionsController: AbortController | null = null;
38
43
  public get suggestions(): readonly ThreadSuggestion[] {
@@ -93,23 +98,33 @@ export class LocalThreadRuntimeCore
93
98
 
94
99
  const promise = this.adapters.history?.load() ?? Promise.resolve(null);
95
100
 
96
- this._loadPromise = promise.then((repo) => {
97
- if (!repo) return;
98
- this.repository.import(repo);
99
- this._notifySubscribers();
101
+ this._isLoading = true;
102
+ this._notifySubscribers();
100
103
 
101
- const resume = this.adapters.history?.resume?.bind(this.adapters.history);
102
- if (repo.unstable_resume && resume) {
103
- this.startRun(
104
- {
105
- parentId: this.repository.headId,
106
- sourceId: this.repository.headId,
107
- runConfig: this._lastRunConfig,
108
- },
109
- resume,
104
+ this._loadPromise = promise
105
+ .then((repo) => {
106
+ if (!repo) return;
107
+ this.repository.import(repo);
108
+ this._notifySubscribers();
109
+
110
+ const resume = this.adapters.history?.resume?.bind(
111
+ this.adapters.history,
110
112
  );
111
- }
112
- });
113
+ if (repo.unstable_resume && resume) {
114
+ this.startRun(
115
+ {
116
+ parentId: this.repository.headId,
117
+ sourceId: this.repository.headId,
118
+ runConfig: this._lastRunConfig,
119
+ },
120
+ resume,
121
+ );
122
+ }
123
+ })
124
+ .finally(() => {
125
+ this._isLoading = false;
126
+ this._notifySubscribers();
127
+ });
113
128
 
114
129
  return this._loadPromise;
115
130
  }
@@ -141,6 +141,7 @@ export const EMPTY_THREAD_CORE: ThreadRuntimeCore = {
141
141
  },
142
142
 
143
143
  isDisabled: true,
144
+ isLoading: false,
144
145
 
145
146
  messages: [],
146
147
 
@@ -264,6 +264,10 @@ export class RemoteThreadListThreadListRuntimeCore
264
264
  this.getLoadThreadsPromise(); // begin loading on initial bind
265
265
  }
266
266
 
267
+ public get isLoading() {
268
+ return this._state.value.isLoading;
269
+ }
270
+
267
271
  public get threadIds() {
268
272
  return this._state.value.threadIds;
269
273
  }
@@ -330,7 +330,7 @@ export class MessageRepository {
330
330
 
331
331
  if (!message)
332
332
  throw new Error(
333
- "MessageRepository(deleteMessage): Optimistic message not found. This is likely an internal bug in assistant-ui.",
333
+ "MessageRepository(deleteMessage): Message not found. This is likely an internal bug in assistant-ui.",
334
334
  );
335
335
 
336
336
  const replacement =
@@ -3,7 +3,7 @@ import {
3
3
  MessageRepository,
4
4
  ExportedMessageRepository,
5
5
  } from "../runtimes/utils/MessageRepository";
6
- import type { ThreadMessage, TextContentPart } from "../types/AssistantTypes";
6
+ import type { ThreadMessage, TextMessagePart } from "../types/AssistantTypes";
7
7
  import { ThreadMessageLike } from "../runtimes";
8
8
 
9
9
  // Mock generateId and generateOptimisticId to make tests deterministic
@@ -501,13 +501,13 @@ describe("MessageRepository", () => {
501
501
  role: "user" as const,
502
502
  content: [
503
503
  { type: "text" as const, text: "Hello" },
504
- ] as TextContentPart[],
504
+ ] as TextMessagePart[],
505
505
  },
506
506
  {
507
507
  role: "assistant" as const,
508
508
  content: [
509
509
  { type: "text" as const, text: "Hi there" },
510
- ] as TextContentPart[],
510
+ ] as TextMessagePart[],
511
511
  },
512
512
  ];
513
513
 
@@ -680,9 +680,9 @@ describe("MessageRepository", () => {
680
680
  ]);
681
681
 
682
682
  // Verify content was updated
683
- const contentPart = messages[1]!.content[0];
684
- expect(contentPart.type).toBe("text");
685
- expect((contentPart as TextContentPart).text).toBe("Updated content");
683
+ const MessagePart = messages[1]!.content[0];
684
+ expect(MessagePart.type).toBe("text");
685
+ expect((MessagePart as TextMessagePart).text).toBe("Updated content");
686
686
  });
687
687
  });
688
688
  });
@@ -3,17 +3,17 @@ import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
3
3
 
4
4
  export type MessageRole = ThreadMessage["role"];
5
5
 
6
- export type TextContentPart = {
6
+ export type TextMessagePart = {
7
7
  readonly type: "text";
8
8
  readonly text: string;
9
9
  };
10
10
 
11
- export type ReasoningContentPart = {
11
+ export type ReasoningMessagePart = {
12
12
  readonly type: "reasoning";
13
13
  readonly text: string;
14
14
  };
15
15
 
16
- export type SourceContentPart = {
16
+ export type SourceMessagePart = {
17
17
  readonly type: "source";
18
18
  readonly sourceType: "url";
19
19
  readonly id: string;
@@ -21,18 +21,18 @@ export type SourceContentPart = {
21
21
  readonly title?: string;
22
22
  };
23
23
 
24
- export type ImageContentPart = {
24
+ export type ImageMessagePart = {
25
25
  readonly type: "image";
26
26
  readonly image: string;
27
27
  };
28
28
 
29
- export type FileContentPart = {
29
+ export type FileMessagePart = {
30
30
  readonly type: "file";
31
31
  readonly data: string;
32
32
  readonly mimeType: string;
33
33
  };
34
34
 
35
- export type Unstable_AudioContentPart = {
35
+ export type Unstable_AudioMessagePart = {
36
36
  readonly type: "audio";
37
37
  readonly audio: {
38
38
  readonly data: string;
@@ -40,7 +40,7 @@ export type Unstable_AudioContentPart = {
40
40
  };
41
41
  };
42
42
 
43
- export type ToolCallContentPart<
43
+ export type ToolCallMessagePart<
44
44
  TArgs = ReadonlyJSONObject,
45
45
  TResult = unknown,
46
46
  > = {
@@ -54,18 +54,18 @@ export type ToolCallContentPart<
54
54
  readonly artifact?: unknown;
55
55
  };
56
56
 
57
- export type ThreadUserContentPart =
58
- | TextContentPart
59
- | ImageContentPart
60
- | FileContentPart
61
- | Unstable_AudioContentPart;
57
+ export type ThreadUserMessagePart =
58
+ | TextMessagePart
59
+ | ImageMessagePart
60
+ | FileMessagePart
61
+ | Unstable_AudioMessagePart;
62
62
 
63
- export type ThreadAssistantContentPart =
64
- | TextContentPart
65
- | ReasoningContentPart
66
- | ToolCallContentPart
67
- | SourceContentPart
68
- | FileContentPart;
63
+ export type ThreadAssistantMessagePart =
64
+ | TextMessagePart
65
+ | ReasoningMessagePart
66
+ | ToolCallMessagePart
67
+ | SourceMessagePart
68
+ | FileMessagePart;
69
69
 
70
70
  type MessageCommonProps = {
71
71
  readonly id: string;
@@ -82,7 +82,7 @@ export type ThreadStep = {
82
82
  | undefined;
83
83
  };
84
84
 
85
- export type ContentPartStatus =
85
+ export type MessagePartStatus =
86
86
  | {
87
87
  readonly type: "running";
88
88
  }
@@ -100,12 +100,12 @@ export type ContentPartStatus =
100
100
  readonly error?: unknown;
101
101
  };
102
102
 
103
- export type ToolCallContentPartStatus =
103
+ export type ToolCallMessagePartStatus =
104
104
  | {
105
105
  readonly type: "requires-action";
106
106
  readonly reason: "tool-calls";
107
107
  }
108
- | ContentPartStatus;
108
+ | MessagePartStatus;
109
109
 
110
110
  export type MessageStatus =
111
111
  | {
@@ -133,7 +133,7 @@ export type MessageStatus =
133
133
 
134
134
  export type ThreadSystemMessage = MessageCommonProps & {
135
135
  readonly role: "system";
136
- readonly content: readonly [TextContentPart];
136
+ readonly content: readonly [TextMessagePart];
137
137
  readonly metadata: {
138
138
  readonly custom: Record<string, unknown>;
139
139
  };
@@ -141,7 +141,7 @@ export type ThreadSystemMessage = MessageCommonProps & {
141
141
 
142
142
  export type ThreadUserMessage = MessageCommonProps & {
143
143
  readonly role: "user";
144
- readonly content: readonly ThreadUserContentPart[];
144
+ readonly content: readonly ThreadUserMessagePart[];
145
145
  readonly attachments: readonly CompleteAttachment[];
146
146
  readonly metadata: {
147
147
  readonly custom: Record<string, unknown>;
@@ -150,7 +150,7 @@ export type ThreadUserMessage = MessageCommonProps & {
150
150
 
151
151
  export type ThreadAssistantMessage = MessageCommonProps & {
152
152
  readonly role: "assistant";
153
- readonly content: readonly ThreadAssistantContentPart[];
153
+ readonly content: readonly ThreadAssistantMessagePart[];
154
154
  readonly status: MessageStatus;
155
155
  readonly metadata: {
156
156
  readonly unstable_state: ReadonlyJSONValue;
@@ -1,4 +1,4 @@
1
- import { ThreadUserContentPart } from "./AssistantTypes";
1
+ import { ThreadUserMessagePart } from "./AssistantTypes";
2
2
 
3
3
  export type PendingAttachmentStatus =
4
4
  | {
@@ -29,7 +29,7 @@ type BaseAttachment = {
29
29
  name: string;
30
30
  contentType: string;
31
31
  file?: File;
32
- content?: ThreadUserContentPart[];
32
+ content?: ThreadUserMessagePart[];
33
33
  };
34
34
 
35
35
  export type PendingAttachment = BaseAttachment & {
@@ -39,7 +39,7 @@ export type PendingAttachment = BaseAttachment & {
39
39
 
40
40
  export type CompleteAttachment = BaseAttachment & {
41
41
  status: CompleteAttachmentStatus;
42
- content: ThreadUserContentPart[];
42
+ content: ThreadUserMessagePart[];
43
43
  };
44
44
 
45
45
  export type Attachment = PendingAttachment | CompleteAttachment;
@@ -0,0 +1,52 @@
1
+ import type { ComponentType } from "react";
2
+ import type {
3
+ MessagePartStatus,
4
+ FileMessagePart,
5
+ ImageMessagePart,
6
+ ReasoningMessagePart,
7
+ SourceMessagePart,
8
+ TextMessagePart,
9
+ ToolCallMessagePart,
10
+ Unstable_AudioMessagePart,
11
+ } from "./AssistantTypes";
12
+ import { MessagePartState } from "../api/MessagePartRuntime";
13
+ import { ToolResponse } from "assistant-stream";
14
+
15
+ export type EmptyMessagePartProps = {
16
+ status: MessagePartStatus;
17
+ };
18
+ export type EmptyMessagePartComponent = ComponentType<EmptyMessagePartProps>;
19
+
20
+ export type TextMessagePartProps = MessagePartState & TextMessagePart;
21
+ export type TextMessagePartComponent = ComponentType<TextMessagePartProps>;
22
+
23
+ export type ReasoningMessagePartProps = MessagePartState & ReasoningMessagePart;
24
+ export type ReasoningMessagePartComponent =
25
+ ComponentType<ReasoningMessagePartProps>;
26
+
27
+ export type SourceMessagePartProps = MessagePartState & SourceMessagePart;
28
+ export type SourceMessagePartComponent = ComponentType<SourceMessagePartProps>;
29
+
30
+ export type ImageMessagePartProps = MessagePartState & ImageMessagePart;
31
+ export type ImageMessagePartComponent = ComponentType<ImageMessagePartProps>;
32
+
33
+ export type FileMessagePartProps = MessagePartState & FileMessagePart;
34
+ export type FileMessagePartComponent = ComponentType<FileMessagePartProps>;
35
+
36
+ export type Unstable_AudioMessagePartProps = MessagePartState &
37
+ Unstable_AudioMessagePart;
38
+ export type Unstable_AudioMessagePartComponent =
39
+ ComponentType<Unstable_AudioMessagePartProps>;
40
+
41
+ export type ToolCallMessagePartProps<
42
+ TArgs = any,
43
+ TResult = unknown,
44
+ > = MessagePartState &
45
+ ToolCallMessagePart<TArgs, TResult> & {
46
+ addResult: (result: TResult | ToolResponse<TResult>) => void;
47
+ };
48
+
49
+ export type ToolCallMessagePartComponent<
50
+ TArgs = any,
51
+ TResult = any,
52
+ > = ComponentType<ToolCallMessagePartProps<TArgs, TResult>>;