@assistant-ui/core 0.1.14 → 0.1.16

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 (345) hide show
  1. package/dist/adapters/attachment.d.ts +6 -0
  2. package/dist/adapters/attachment.d.ts.map +1 -1
  3. package/dist/adapters/attachment.js +54 -9
  4. package/dist/adapters/attachment.js.map +1 -1
  5. package/dist/adapters/{mention.d.ts → directive-formatter.d.ts} +2 -4
  6. package/dist/adapters/directive-formatter.d.ts.map +1 -0
  7. package/dist/adapters/{mention.js → directive-formatter.js} +4 -9
  8. package/dist/adapters/directive-formatter.js.map +1 -0
  9. package/dist/adapters/index.d.ts +1 -3
  10. package/dist/adapters/index.d.ts.map +1 -1
  11. package/dist/adapters/index.js +2 -1
  12. package/dist/adapters/index.js.map +1 -1
  13. package/dist/adapters/speech.d.ts.map +1 -1
  14. package/dist/adapters/speech.js +1 -3
  15. package/dist/adapters/speech.js.map +1 -1
  16. package/dist/adapters/thread-history.d.ts +1 -0
  17. package/dist/adapters/thread-history.d.ts.map +1 -1
  18. package/dist/adapters/trigger.d.ts +1 -18
  19. package/dist/adapters/trigger.d.ts.map +1 -1
  20. package/dist/index.d.ts +2 -4
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/model-context/frame/host.d.ts +1 -1
  25. package/dist/model-context/frame/host.d.ts.map +1 -1
  26. package/dist/model-context/frame/host.js +1 -0
  27. package/dist/model-context/frame/host.js.map +1 -1
  28. package/dist/model-context/frame/provider.d.ts +1 -1
  29. package/dist/model-context/frame/provider.d.ts.map +1 -1
  30. package/dist/model-context/frame/provider.js +1 -0
  31. package/dist/model-context/frame/provider.js.map +1 -1
  32. package/dist/model-context/registry.d.ts +2 -2
  33. package/dist/model-context/registry.d.ts.map +1 -1
  34. package/dist/model-context/tool.d.ts +1 -1
  35. package/dist/model-context/tool.d.ts.map +1 -1
  36. package/dist/model-context/types.d.ts +1 -1
  37. package/dist/model-context/types.d.ts.map +1 -1
  38. package/dist/model-context/types.js +0 -3
  39. package/dist/model-context/types.js.map +1 -1
  40. package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
  41. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  42. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  43. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  44. package/dist/react/client/DataRenderers.d.ts +1 -1
  45. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  46. package/dist/react/client/DataRenderers.js +14 -0
  47. package/dist/react/client/DataRenderers.js.map +1 -1
  48. package/dist/react/client/Tools.d.ts +1 -1
  49. package/dist/react/client/Tools.d.ts.map +1 -1
  50. package/dist/react/client/Tools.js +1 -0
  51. package/dist/react/client/Tools.js.map +1 -1
  52. package/dist/react/model-context/makeAssistantTool.d.ts +1 -1
  53. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  54. package/dist/react/model-context/makeAssistantToolUI.d.ts +1 -1
  55. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  56. package/dist/react/model-context/useInlineRender.d.ts +2 -2
  57. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  58. package/dist/react/model-context/useInlineRender.js +1 -0
  59. package/dist/react/model-context/useInlineRender.js.map +1 -1
  60. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  61. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -0
  62. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  63. package/dist/react/primitives/composer/ComposerAttachments.d.ts +1 -1
  64. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  65. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  66. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  67. package/dist/react/primitives/message/MessageAttachments.d.ts +1 -1
  68. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  69. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  70. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  71. package/dist/react/primitives/message/MessageParts.d.ts +7 -1
  72. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  73. package/dist/react/primitives/message/MessageParts.js +60 -44
  74. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  75. package/dist/react/primitives/part/PartMessages.d.ts +1 -1
  76. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  77. package/dist/react/primitives/thread/ThreadMessages.d.ts +1 -1
  78. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  79. package/dist/react/primitives/thread/ThreadMessages.js +2 -1
  80. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  81. package/dist/react/primitives/threadList/ThreadListItems.d.ts +1 -1
  82. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  83. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  84. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  85. package/dist/react/providers/AttachmentByIndexProvider.d.ts +1 -1
  86. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  87. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +1 -1
  88. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  89. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +1 -1
  90. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  91. package/dist/react/providers/MessageByIndexProvider.d.ts +1 -1
  92. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  93. package/dist/react/providers/PartByIndexProvider.d.ts +1 -1
  94. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  95. package/dist/react/providers/QueueItemByIndexProvider.d.ts +1 -1
  96. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  97. package/dist/react/providers/SuggestionByIndexProvider.d.ts +1 -1
  98. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  99. package/dist/react/providers/TextMessagePartProvider.d.ts +1 -1
  100. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  101. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +1 -1
  102. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  103. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +1 -1
  104. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  105. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +4 -2
  106. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  107. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +28 -6
  108. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  109. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
  110. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  111. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +27 -9
  112. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  113. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +1 -1
  114. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  115. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  116. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -2
  117. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  118. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  119. package/dist/react/runtimes/cloud/auiV0.d.ts +2 -2
  120. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  121. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  122. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +4 -1
  124. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  125. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  126. package/dist/react/runtimes/useLocalRuntime.js +10 -0
  127. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  128. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  129. package/dist/react/runtimes/useRemoteThreadListRuntime.js +6 -0
  130. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  131. package/dist/react/runtimes/useToolInvocations.d.ts.map +1 -1
  132. package/dist/react/runtimes/useToolInvocations.js +2 -0
  133. package/dist/react/runtimes/useToolInvocations.js.map +1 -1
  134. package/dist/react/types/MessagePartComponentTypes.d.ts +1 -1
  135. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  136. package/dist/react/types/scopes/dataRenderers.d.ts +2 -0
  137. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  138. package/dist/runtime/api/assistant-runtime.d.ts +1 -1
  139. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  140. package/dist/runtime/api/attachment-runtime.d.ts +0 -1
  141. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  142. package/dist/runtime/api/attachment-runtime.js +0 -3
  143. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  144. package/dist/runtime/api/bindings.d.ts +1 -0
  145. package/dist/runtime/api/bindings.d.ts.map +1 -1
  146. package/dist/runtime/api/composer-runtime.d.ts +4 -2
  147. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  148. package/dist/runtime/api/composer-runtime.js.map +1 -1
  149. package/dist/runtime/api/message-runtime.d.ts +6 -6
  150. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  151. package/dist/runtime/api/thread-list-runtime.d.ts +4 -2
  152. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  153. package/dist/runtime/api/thread-list-runtime.js +6 -0
  154. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  155. package/dist/runtime/api/thread-runtime.d.ts +10 -9
  156. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  157. package/dist/runtime/api/thread-runtime.js +4 -3
  158. package/dist/runtime/api/thread-runtime.js.map +1 -1
  159. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  160. package/dist/runtime/base/base-composer-runtime-core.js +22 -8
  161. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  162. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  163. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +2 -1
  164. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  165. package/dist/runtime/base/default-edit-composer-runtime-core.js +26 -5
  166. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  167. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +2 -0
  168. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  169. package/dist/runtime/interfaces/thread-runtime-core.d.ts +7 -0
  170. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  171. package/dist/runtime/internal.d.ts.map +1 -1
  172. package/dist/runtime/internal.js +1 -4
  173. package/dist/runtime/internal.js.map +1 -1
  174. package/dist/runtime/utils/auto-status.d.ts +1 -1
  175. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  176. package/dist/runtime/utils/chat-model-adapter.d.ts +1 -1
  177. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  178. package/dist/runtime/utils/thread-message-like.d.ts +1 -1
  179. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  180. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  181. package/dist/runtimes/assistant-transport/utils.d.ts +1 -1
  182. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  183. package/dist/runtimes/assistant-transport/utils.js +1 -1
  184. package/dist/runtimes/assistant-transport/utils.js.map +1 -1
  185. package/dist/runtimes/external-store/external-store-adapter.d.ts +8 -0
  186. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  187. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -1
  188. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  189. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +27 -25
  190. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  191. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
  192. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  193. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +4 -0
  194. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  195. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +2 -2
  196. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  197. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +3 -0
  198. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  199. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  200. package/dist/runtimes/remote-thread-list/types.d.ts +14 -2
  201. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  202. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -2
  203. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  204. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -1
  205. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  206. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -2
  207. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  208. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -1
  209. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  210. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +1 -1
  211. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  212. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +2 -2
  213. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  214. package/dist/store/runtime-clients/thread-list-runtime-client.js +1 -0
  215. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  216. package/dist/store/runtime-clients/thread-runtime-client.d.ts +1 -1
  217. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  218. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  219. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  220. package/dist/store/scopes/threads.d.ts +1 -0
  221. package/dist/store/scopes/threads.d.ts.map +1 -1
  222. package/dist/subscribable/subscribable.d.ts.map +1 -1
  223. package/dist/subscribable/subscribable.js +1 -15
  224. package/dist/subscribable/subscribable.js.map +1 -1
  225. package/dist/tests/remote-thread-list-test-helpers.d.ts +12 -0
  226. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -0
  227. package/dist/tests/remote-thread-list-test-helpers.js +48 -0
  228. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -0
  229. package/dist/types/directive.d.ts +19 -0
  230. package/dist/types/directive.d.ts.map +1 -0
  231. package/dist/types/directive.js +2 -0
  232. package/dist/types/directive.js.map +1 -0
  233. package/dist/types/index.d.ts +1 -1
  234. package/dist/types/index.d.ts.map +1 -1
  235. package/dist/types/message.d.ts.map +1 -1
  236. package/dist/types/trigger.d.ts +2 -2
  237. package/dist/types/trigger.d.ts.map +1 -1
  238. package/dist/utils/json/is-json.d.ts +1 -1
  239. package/dist/utils/json/is-json.d.ts.map +1 -1
  240. package/package.json +11 -11
  241. package/src/adapters/attachment.ts +68 -16
  242. package/src/adapters/{mention.ts → directive-formatter.ts} +8 -20
  243. package/src/adapters/index.ts +2 -9
  244. package/src/adapters/speech.ts +1 -16
  245. package/src/adapters/thread-history.ts +1 -8
  246. package/src/adapters/trigger.ts +1 -37
  247. package/src/index.ts +3 -24
  248. package/src/model-context/frame/host.ts +6 -5
  249. package/src/model-context/frame/provider.ts +6 -5
  250. package/src/model-context/registry.ts +6 -6
  251. package/src/model-context/tool.ts +1 -1
  252. package/src/model-context/types.ts +1 -17
  253. package/src/react/AssistantRuntimeProvider.tsx +1 -1
  254. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +3 -1
  255. package/src/react/client/DataRenderers.ts +19 -3
  256. package/src/react/client/Tools.ts +4 -3
  257. package/src/react/model-context/makeAssistantTool.ts +1 -1
  258. package/src/react/model-context/makeAssistantToolUI.ts +1 -1
  259. package/src/react/model-context/useInlineRender.ts +3 -2
  260. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -0
  261. package/src/react/primitives/composer/ComposerAttachments.tsx +7 -1
  262. package/src/react/primitives/message/MessageAttachments.tsx +7 -1
  263. package/src/react/primitives/message/MessageParts.tsx +94 -57
  264. package/src/react/primitives/part/PartMessages.tsx +1 -1
  265. package/src/react/primitives/thread/ThreadMessages.tsx +3 -2
  266. package/src/react/primitives/threadList/ThreadListItems.tsx +7 -1
  267. package/src/react/providers/AttachmentByIndexProvider.tsx +1 -1
  268. package/src/react/providers/ChainOfThoughtByIndicesProvider.tsx +1 -1
  269. package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +1 -1
  270. package/src/react/providers/MessageByIndexProvider.tsx +1 -1
  271. package/src/react/providers/PartByIndexProvider.tsx +1 -1
  272. package/src/react/providers/QueueItemByIndexProvider.tsx +1 -1
  273. package/src/react/providers/SuggestionByIndexProvider.tsx +1 -1
  274. package/src/react/providers/TextMessagePartProvider.tsx +1 -1
  275. package/src/react/providers/ThreadListItemByIndexProvider.tsx +1 -1
  276. package/src/react/providers/ThreadListItemRuntimeProvider.tsx +1 -1
  277. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +47 -15
  278. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +31 -17
  279. package/src/react/runtimes/RuntimeAdapterProvider.tsx +1 -1
  280. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +3 -3
  281. package/src/react/runtimes/cloud/auiV0.ts +5 -2
  282. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -3
  283. package/src/react/runtimes/useLocalRuntime.ts +10 -0
  284. package/src/react/runtimes/useRemoteThreadListRuntime.ts +6 -0
  285. package/src/react/runtimes/useToolInvocations.ts +2 -0
  286. package/src/react/types/MessagePartComponentTypes.ts +1 -1
  287. package/src/react/types/scopes/dataRenderers.ts +2 -0
  288. package/src/runtime/api/assistant-runtime.ts +1 -1
  289. package/src/runtime/api/attachment-runtime.ts +0 -4
  290. package/src/runtime/api/bindings.ts +1 -0
  291. package/src/runtime/api/composer-runtime.ts +4 -2
  292. package/src/runtime/api/message-runtime.ts +8 -8
  293. package/src/runtime/api/thread-list-runtime.ts +14 -5
  294. package/src/runtime/api/thread-runtime.ts +13 -12
  295. package/src/runtime/base/base-composer-runtime-core.ts +37 -16
  296. package/src/runtime/base/base-thread-runtime-core.ts +1 -1
  297. package/src/runtime/base/default-edit-composer-runtime-core.ts +35 -5
  298. package/src/runtime/interfaces/thread-list-runtime-core.ts +2 -0
  299. package/src/runtime/interfaces/thread-runtime-core.ts +7 -0
  300. package/src/runtime/internal.ts +1 -4
  301. package/src/runtime/utils/auto-status.ts +1 -1
  302. package/src/runtime/utils/chat-model-adapter.ts +1 -1
  303. package/src/runtime/utils/thread-message-like.ts +4 -1
  304. package/src/runtimes/assistant-transport/utils.ts +5 -1
  305. package/src/runtimes/external-store/external-store-adapter.ts +8 -0
  306. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +35 -29
  307. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +4 -0
  308. package/src/runtimes/remote-thread-list/adapter/in-memory.ts +2 -2
  309. package/src/runtimes/remote-thread-list/remote-thread-state.ts +3 -0
  310. package/src/runtimes/remote-thread-list/types.ts +14 -2
  311. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -2
  312. package/src/store/runtime-clients/composer-runtime-client.ts +2 -2
  313. package/src/store/runtime-clients/message-part-runtime-client.ts +2 -2
  314. package/src/store/runtime-clients/message-runtime-client.ts +2 -2
  315. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +1 -1
  316. package/src/store/runtime-clients/thread-list-runtime-client.ts +4 -3
  317. package/src/store/runtime-clients/thread-runtime-client.ts +3 -3
  318. package/src/store/scopes/thread-list-item.ts +1 -0
  319. package/src/store/scopes/threads.ts +1 -0
  320. package/src/subscribable/subscribable.ts +1 -24
  321. package/src/tests/OptimisticState-list-race.test.ts +5 -9
  322. package/src/tests/RemoteThreadListThreadListRuntimeCore-custom-metadata.test.ts +123 -0
  323. package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +209 -0
  324. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-dedupe.test.ts +139 -0
  325. package/src/tests/attachment.test.ts +180 -0
  326. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +154 -0
  327. package/src/tests/default-edit-composer-runtime-core.test.ts +312 -0
  328. package/src/tests/{mention-formatter.test.ts → directive-formatter.test.ts} +26 -1
  329. package/src/tests/external-store-thread-list-runtime-core.test.ts +212 -0
  330. package/src/tests/get-thread-state-isRunning.test.ts +93 -0
  331. package/src/tests/remote-thread-list-isLoading.test.ts +6 -10
  332. package/src/tests/remote-thread-list-test-helpers.ts +70 -0
  333. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +17 -1
  334. package/src/types/directive.ts +19 -0
  335. package/src/types/index.ts +1 -3
  336. package/src/types/message.ts +0 -12
  337. package/src/types/trigger.ts +2 -10
  338. package/src/utils/json/is-json.ts +1 -1
  339. package/dist/adapters/mention.d.ts.map +0 -1
  340. package/dist/adapters/mention.js.map +0 -1
  341. package/dist/types/mention.d.ts +0 -21
  342. package/dist/types/mention.d.ts.map +0 -1
  343. package/dist/types/mention.js +0 -2
  344. package/dist/types/mention.js.map +0 -1
  345. package/src/types/mention.ts +0 -39
@@ -1,5 +1,11 @@
1
1
  import type { CompleteAttachment } from "../../../types/attachment";
2
- import { ComponentType, type FC, type ReactNode, memo, useMemo } from "react";
2
+ import {
3
+ type ComponentType,
4
+ type FC,
5
+ type ReactNode,
6
+ memo,
7
+ useMemo,
8
+ } from "react";
3
9
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
4
10
  import { MessageAttachmentByIndexProvider } from "../../providers/AttachmentByIndexProvider";
5
11
 
@@ -3,7 +3,7 @@ import {
3
3
  type FC,
4
4
  type ReactNode,
5
5
  memo,
6
- PropsWithChildren,
6
+ type PropsWithChildren,
7
7
  useMemo,
8
8
  } from "react";
9
9
  import {
@@ -32,6 +32,7 @@ import type {
32
32
  QuoteMessagePartComponent,
33
33
  } from "../../types/MessagePartComponentTypes";
34
34
  import type { MessagePartStatus } from "../../../types/message";
35
+ import type { DataRenderersState } from "../../types/scopes/dataRenderers";
35
36
  import { useShallow } from "zustand/shallow";
36
37
 
37
38
  type MessagePartRange =
@@ -284,17 +285,25 @@ const ToolUIDisplay = ({
284
285
  return <Render {...props} />;
285
286
  };
286
287
 
288
+ const getDataRenderer = (
289
+ dataRenderers: DataRenderersState,
290
+ name: string,
291
+ inlineFallback: DataMessagePartComponent | undefined,
292
+ ): DataMessagePartComponent | undefined => {
293
+ const named = dataRenderers.renderers[name]?.[0];
294
+ if (named) return named;
295
+ return dataRenderers.fallbacks[0] ?? inlineFallback;
296
+ };
297
+
287
298
  const DataUIDisplay = ({
288
299
  Fallback,
289
300
  ...props
290
301
  }: {
291
302
  Fallback: DataMessagePartComponent | undefined;
292
303
  } & DataMessagePartProps) => {
293
- const Render = useAuiState((s) => {
294
- const Render = s.dataRenderers.renderers[props.name] ?? Fallback;
295
- if (Array.isArray(Render)) return Render[0] ?? Fallback;
296
- return Render;
297
- });
304
+ const Render = useAuiState((s) =>
305
+ getDataRenderer(s.dataRenderers, props.name, Fallback),
306
+ );
298
307
  if (!Render) return null;
299
308
  return <Render {...props} />;
300
309
  };
@@ -433,6 +442,10 @@ const COMPLETE_STATUS: MessagePartStatus = Object.freeze({
433
442
  type: "complete",
434
443
  });
435
444
 
445
+ const RUNNING_STATUS: MessagePartStatus = Object.freeze({
446
+ type: "running",
447
+ });
448
+
436
449
  const EmptyPartsImpl: FC<MessagePartComponentProps> = ({ components }) => {
437
450
  const status = useAuiState(
438
451
  (s) => (s.message.status ?? COMPLETE_STATUS) as MessagePartStatus,
@@ -522,12 +535,11 @@ const RegisteredToolUI: FC = () => {
522
535
  */
523
536
  const RegisteredDataRendererUI: FC = () => {
524
537
  const part = useAuiState((s) => s.part);
525
- const Render = useAuiState((s) => {
526
- if (s.part.type !== "data") return null;
527
- const entry = s.dataRenderers.renderers[s.part.name];
528
- if (Array.isArray(entry)) return entry[0] ?? null;
529
- return entry ?? null;
530
- });
538
+ const Render = useAuiState((s) =>
539
+ s.part.type === "data"
540
+ ? (getDataRenderer(s.dataRenderers, s.part.name, undefined) ?? null)
541
+ : null,
542
+ );
531
543
 
532
544
  if (!Render || part.type !== "data") return null;
533
545
 
@@ -563,6 +575,12 @@ export type { PartState };
563
575
  *
564
576
  * For tool-call parts, adds `toolUI`, `addResult`, and `resume`.
565
577
  * For data parts, adds `dataRendererUI`.
578
+ *
579
+ * The render function is also invoked once with a synthetic empty text part
580
+ * (`{ type: "text", text: "", status: { type: "running" } }`) when the
581
+ * assistant message has no parts yet but is in the running state, so a
582
+ * loading indicator can render. Differentiate this from a real empty text
583
+ * via `part.status?.type === "running" && part.text === ""`.
566
584
  */
567
585
  export type EnrichedPartState =
568
586
  | (Extract<PartState, { type: "tool-call" }> & {
@@ -579,58 +597,77 @@ export type EnrichedPartState =
579
597
  })
580
598
  | Exclude<PartState, { type: "tool-call" } | { type: "data" }>;
581
599
 
600
+ const EMPTY_RUNNING_TEXT_PART: Extract<EnrichedPartState, { type: "text" }> =
601
+ Object.freeze({
602
+ type: "text",
603
+ text: "",
604
+ status: RUNNING_STATUS,
605
+ });
606
+
582
607
  const MessagePrimitivePartsInner: FC<{
583
608
  children: (value: { part: EnrichedPartState }) => ReactNode;
584
609
  }> = ({ children }) => {
585
610
  const aui = useAui();
586
611
  const contentLength = useAuiState((s) => s.message.parts.length);
612
+ const isRunning = useAuiState(
613
+ (s) => (s.message.status?.type ?? "complete") === "running",
614
+ );
615
+ const isEmptyRunning = contentLength === 0 && isRunning;
616
+ // Subscribed (not snapshotted like `tools`) so fallbacks registered after
617
+ // the first render trigger a re-render and `hasUI` re-evaluates.
618
+ const dataRenderers = useAuiState((s) => s.dataRenderers);
587
619
 
588
620
  // biome-ignore lint/correctness/useExhaustiveDependencies: aui accessors are stable refs
589
- return useMemo(
590
- () =>
591
- Array.from({ length: contentLength }, (_, index) => (
592
- <PartByIndexProvider key={index} index={index}>
593
- <RenderChildrenWithAccessor
594
- getItemState={(aui) => aui.message().part({ index }).getState()}
595
- >
596
- {(getItem) => {
597
- const result = children({
598
- get part() {
599
- const state = getItem();
600
- if (state.type === "tool-call") {
601
- const entry = aui.tools().getState().tools[state.toolName];
602
- const hasUI = Array.isArray(entry) ? !!entry[0] : !!entry;
603
- const partMethods = aui.message().part({ index });
604
- return {
605
- ...state,
606
- toolUI: hasUI ? <RegisteredToolUI /> : null,
607
- addResult: partMethods.addToolResult,
608
- resume: partMethods.resumeToolCall,
609
- };
610
- }
611
- if (state.type === "data") {
612
- const entry = aui.dataRenderers().getState().renderers[
613
- state.name
614
- ];
615
- const hasUI = Array.isArray(entry) ? !!entry[0] : !!entry;
616
- return {
617
- ...state,
618
- dataRendererUI: hasUI ? (
619
- <RegisteredDataRendererUI />
620
- ) : null,
621
- };
622
- }
623
- return state;
624
- },
625
- });
626
- if (result !== null) return result;
627
- return <DefaultPartFallback />;
628
- }}
629
- </RenderChildrenWithAccessor>
630
- </PartByIndexProvider>
631
- )),
632
- [contentLength, children],
633
- );
621
+ return useMemo(() => {
622
+ if (contentLength === 0) {
623
+ if (!isEmptyRunning) return null;
624
+
625
+ return (
626
+ <TextMessagePartProvider text="" isRunning>
627
+ {children({ part: EMPTY_RUNNING_TEXT_PART })}
628
+ </TextMessagePartProvider>
629
+ );
630
+ }
631
+
632
+ return Array.from({ length: contentLength }, (_, index) => (
633
+ <PartByIndexProvider key={index} index={index}>
634
+ <RenderChildrenWithAccessor
635
+ getItemState={(aui) => aui.message().part({ index }).getState()}
636
+ >
637
+ {(getItem) => {
638
+ const result = children({
639
+ get part() {
640
+ const state = getItem();
641
+ if (state.type === "tool-call") {
642
+ const entry = aui.tools().getState().tools[state.toolName];
643
+ const hasUI = Array.isArray(entry) ? !!entry[0] : !!entry;
644
+ const partMethods = aui.message().part({ index });
645
+ return {
646
+ ...state,
647
+ toolUI: hasUI ? <RegisteredToolUI /> : null,
648
+ addResult: partMethods.addToolResult,
649
+ resume: partMethods.resumeToolCall,
650
+ };
651
+ }
652
+ if (state.type === "data") {
653
+ const hasUI =
654
+ getDataRenderer(dataRenderers, state.name, undefined) !==
655
+ undefined;
656
+ return {
657
+ ...state,
658
+ dataRendererUI: hasUI ? <RegisteredDataRendererUI /> : null,
659
+ };
660
+ }
661
+ return state;
662
+ },
663
+ });
664
+ if (result !== null) return result;
665
+ return <DefaultPartFallback />;
666
+ }}
667
+ </RenderChildrenWithAccessor>
668
+ </PartByIndexProvider>
669
+ ));
670
+ }, [contentLength, children, isEmptyRunning, dataRenderers]);
634
671
  };
635
672
 
636
673
  /**
@@ -3,7 +3,7 @@ import { useAuiState } from "@assistant-ui/store";
3
3
  import type { ThreadMessage } from "../../../types/message";
4
4
  import { ReadonlyThreadProvider } from "../../providers/ReadonlyThreadProvider";
5
5
  import {
6
- ThreadPrimitiveMessages,
6
+ type ThreadPrimitiveMessages,
7
7
  ThreadPrimitiveMessagesImpl,
8
8
  } from "../thread/ThreadMessages";
9
9
 
@@ -7,7 +7,7 @@ import {
7
7
  } from "react";
8
8
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
9
9
  import { MessageByIndexProvider } from "../../providers/MessageByIndexProvider";
10
- import { MessageState } from "../../../store";
10
+ import type { MessageState } from "../../../store";
11
11
 
12
12
  type MessagesComponentConfig =
13
13
  | {
@@ -124,9 +124,10 @@ const getComponent = (
124
124
  DEFAULT_SYSTEM_MESSAGE
125
125
  );
126
126
  }
127
- default:
127
+ default: {
128
128
  const _exhaustiveCheck: never = role;
129
129
  throw new Error(`Unknown message role: ${_exhaustiveCheck}`);
130
+ }
130
131
  }
131
132
  };
132
133
 
@@ -1,4 +1,10 @@
1
- import { ComponentType, FC, ReactNode, memo, useMemo } from "react";
1
+ import {
2
+ type ComponentType,
3
+ type FC,
4
+ type ReactNode,
5
+ memo,
6
+ useMemo,
7
+ } from "react";
2
8
  import { RenderChildrenWithAccessor, useAuiState } from "@assistant-ui/store";
3
9
  import type { ThreadListItemState } from "../../../store/scopes/thread-list-item";
4
10
  import { ThreadListItemByIndexProvider } from "../../providers/ThreadListItemByIndexProvider";
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, AuiProvider, Derived } from "@assistant-ui/store";
3
3
 
4
4
  export const MessageAttachmentByIndexProvider: FC<
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, useAuiState, AuiProvider } from "@assistant-ui/store";
3
3
  import { ChainOfThoughtClient } from "../../store/clients/chain-of-thought-client";
4
4
  import type { ChainOfThoughtPart } from "../../store/scopes/chain-of-thought";
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, AuiProvider, Derived } from "@assistant-ui/store";
3
3
 
4
4
  export const ChainOfThoughtPartByIndexProvider: FC<
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, AuiProvider, Derived } from "@assistant-ui/store";
3
3
 
4
4
  export const MessageByIndexProvider: FC<
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, AuiProvider, Derived } from "@assistant-ui/store";
3
3
 
4
4
  export const PartByIndexProvider: FC<
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { AuiProvider, Derived, useAui } from "@assistant-ui/store";
3
3
 
4
4
  export type QueueItemByIndexProviderProps = PropsWithChildren<{
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { AuiProvider, Derived, useAui } from "@assistant-ui/store";
3
3
 
4
4
  export type SuggestionByIndexProviderProps = PropsWithChildren<{
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, AuiProvider, type ClientOutput } from "@assistant-ui/store";
3
3
  import type { PartState } from "../../store/scopes/part";
4
4
  import { resource, tapMemo } from "@assistant-ui/tap";
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, AuiProvider, Derived } from "@assistant-ui/store";
3
3
 
4
4
  export const ThreadListItemByIndexProvider: FC<
@@ -1,4 +1,4 @@
1
- import { type FC, type PropsWithChildren } from "react";
1
+ import type { FC, PropsWithChildren } from "react";
2
2
  import { useAui, AuiProvider } from "@assistant-ui/store";
3
3
  import type { ThreadListItemRuntime } from "../..";
4
4
  import { ThreadListItemClient } from "../../store/internal";
@@ -1,21 +1,24 @@
1
1
  import {
2
- FC,
2
+ type FC,
3
+ type RefObject,
3
4
  useCallback,
4
5
  useRef,
5
6
  useEffect,
7
+ useLayoutEffect,
6
8
  memo,
7
- PropsWithChildren,
8
- ComponentType,
9
+ type PropsWithChildren,
10
+ type ComponentType,
9
11
  useMemo,
12
+ Fragment,
10
13
  } from "react";
11
- import { UseBoundStore, StoreApi, create } from "zustand";
14
+ import { type UseBoundStore, type StoreApi, create } from "zustand";
12
15
  import { useAui } from "@assistant-ui/store";
13
16
  import { ThreadListItemRuntimeProvider } from "../providers/ThreadListItemRuntimeProvider";
14
17
  import type { ThreadRuntimeCore } from "../../runtime/interfaces/thread-runtime-core";
15
18
  import type { ThreadListRuntimeCore } from "../../runtime/interfaces/thread-list-runtime-core";
16
19
  import type { AssistantRuntime } from "../../runtime/api/assistant-runtime";
17
20
  import { BaseSubscribable } from "../../subscribable/subscribable";
18
- import { ThreadRuntimeImpl } from "../../runtime/api/thread-runtime";
21
+ import type { ThreadRuntimeImpl } from "../../runtime/api/thread-runtime";
19
22
  import { ThreadListRuntimeImpl } from "../../runtime/api/thread-list-runtime";
20
23
 
21
24
  type RemoteThreadListHook = () => AssistantRuntime;
@@ -23,6 +26,15 @@ type RemoteThreadListHook = () => AssistantRuntime;
23
26
  type RemoteThreadListHookInstance = {
24
27
  runtime?: ThreadRuntimeCore;
25
28
  };
29
+
30
+ const ProviderRenderDetector: FC<{
31
+ detectorRef: RefObject<boolean>;
32
+ }> = ({ detectorRef }) => {
33
+ useLayoutEffect(() => {
34
+ detectorRef.current = true;
35
+ }, [detectorRef]);
36
+ return null;
37
+ };
26
38
  export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
27
39
  private useRuntimeHook: UseBoundStore<
28
40
  StoreApi<{ useRuntime: RemoteThreadListHook }>
@@ -82,9 +94,11 @@ export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
82
94
  }
83
95
  }
84
96
 
85
- private _InnerActiveThreadProvider: FC<{
86
- threadId: string;
87
- }> = ({ threadId }) => {
97
+ // Rendered outside the user's Provider so deferred `children` cannot strand the binding.
98
+ private _RuntimeBinder: FC<PropsWithChildren<{ threadId: string }>> = ({
99
+ threadId,
100
+ children,
101
+ }) => {
88
102
  const { useRuntime } = this.useRuntimeHook();
89
103
  const runtime = useRuntime();
90
104
 
@@ -116,9 +130,8 @@ export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
116
130
 
117
131
  useEffect(() => {
118
132
  const runtimeCore = threadBinding.getState();
119
- const setGetInitializePromise = (runtimeCore as Record<string, unknown>)[
120
- "__internal_setGetInitializePromise"
121
- ];
133
+ const setGetInitializePromise = (runtimeCore as Record<string, unknown>)
134
+ .__internal_setGetInitializePromise;
122
135
  if (typeof setGetInitializePromise === "function") {
123
136
  setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);
124
137
  }
@@ -139,7 +152,7 @@ export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
139
152
  });
140
153
  }, [runtime, aui]);
141
154
 
142
- return null;
155
+ return <>{children}</>;
143
156
  };
144
157
 
145
158
  private _OuterActiveThreadProvider: FC<{
@@ -151,11 +164,30 @@ export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
151
164
  [threadId],
152
165
  );
153
166
 
167
+ const detectorRef = useRef(false);
168
+ useEffect(() => {
169
+ if (process.env.NODE_ENV !== "production" && Provider !== Fragment) {
170
+ const id = setTimeout(() => {
171
+ if (!detectorRef.current) {
172
+ console.warn(
173
+ "RemoteThreadListAdapter.unstable_Provider did not render its `children` synchronously. " +
174
+ "Render `children` on first commit; deferring them behind a loading state, Suspense boundary, " +
175
+ "or `useEffect` gate leaves thread context unavailable to downstream consumers.",
176
+ );
177
+ }
178
+ }, 100);
179
+ return () => clearTimeout(id);
180
+ }
181
+ return undefined;
182
+ }, [Provider]);
183
+
154
184
  return (
155
185
  <ThreadListItemRuntimeProvider runtime={runtime}>
156
- <Provider>
157
- <this._InnerActiveThreadProvider threadId={threadId} />
158
- </Provider>
186
+ <this._RuntimeBinder threadId={threadId}>
187
+ <Provider>
188
+ <ProviderRenderDetector detectorRef={detectorRef} />
189
+ </Provider>
190
+ </this._RuntimeBinder>
159
191
  </ThreadListItemRuntimeProvider>
160
192
  );
161
193
  });
@@ -15,14 +15,7 @@ import {
15
15
  } from "../../runtimes/remote-thread-list/remote-thread-state";
16
16
  import type { RemoteThreadListOptions } from "../../runtimes/remote-thread-list/types";
17
17
  import { RemoteThreadListHookInstanceManager } from "./RemoteThreadListHookInstanceManager";
18
- import {
19
- ComponentType,
20
- FC,
21
- Fragment,
22
- PropsWithChildren,
23
- useEffect,
24
- useId,
25
- } from "react";
18
+ import { type FC, Fragment, useEffect, useId } from "react";
26
19
  import { create } from "zustand";
27
20
  import { AssistantMessageStream } from "assistant-stream";
28
21
  import type { ModelContextProvider } from "../../model-context/types";
@@ -36,6 +29,7 @@ export class RemoteThreadListThreadListRuntimeCore
36
29
  private readonly _hookManager: RemoteThreadListHookInstanceManager;
37
30
 
38
31
  private _loadThreadsPromise: Promise<void> | undefined;
32
+ private _loadGeneration = 0;
39
33
 
40
34
  private _mainThreadId!: string;
41
35
  private readonly _state = new OptimisticState<RemoteThreadState>({
@@ -54,6 +48,7 @@ export class RemoteThreadListThreadListRuntimeCore
54
48
  public getLoadThreadsPromise() {
55
49
  // TODO this needs to be cached in case this promise is loaded during suspense
56
50
  if (!this._loadThreadsPromise) {
51
+ const generation = this._loadGeneration;
57
52
  this._loadThreadsPromise = this._state
58
53
  .optimisticUpdate({
59
54
  execute: () => this._options.adapter.list(),
@@ -63,7 +58,9 @@ export class RemoteThreadListThreadListRuntimeCore
63
58
  isLoading: true,
64
59
  };
65
60
  },
61
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
66
62
  then: (state, l) => {
63
+ if (generation !== this._loadGeneration) return state;
67
64
  const newThreadIds = [];
68
65
  const newArchivedThreadIds = [];
69
66
  const newThreadIdMap = {} as Record<string, THREAD_MAPPING_ID>;
@@ -94,6 +91,7 @@ export class RemoteThreadListThreadListRuntimeCore
94
91
  externalId: thread.externalId,
95
92
  status: thread.status,
96
93
  title: thread.title,
94
+ custom: thread.custom,
97
95
  initializeTask: Promise.resolve({
98
96
  remoteId: thread.remoteId,
99
97
  externalId: thread.externalId,
@@ -118,6 +116,7 @@ export class RemoteThreadListThreadListRuntimeCore
118
116
  },
119
117
  })
120
118
  .catch(() => {
119
+ if (generation !== this._loadGeneration) return;
121
120
  this._loadThreadsPromise = undefined;
122
121
  this._state.update({
123
122
  ...this._state.baseValue,
@@ -145,8 +144,7 @@ export class RemoteThreadListThreadListRuntimeCore
145
144
  this,
146
145
  );
147
146
  this.useProvider = create(() => ({
148
- Provider: (options.adapter.unstable_Provider ??
149
- Fragment) as ComponentType<PropsWithChildren>,
147
+ Provider: options.adapter.unstable_Provider ?? Fragment,
150
148
  }));
151
149
  this.__internal_setOptions(options);
152
150
  this.switchToNewThread();
@@ -160,8 +158,7 @@ export class RemoteThreadListThreadListRuntimeCore
160
158
 
161
159
  this._options = options;
162
160
 
163
- const Provider = (options.adapter.unstable_Provider ??
164
- Fragment) as ComponentType<PropsWithChildren>;
161
+ const Provider = options.adapter.unstable_Provider ?? Fragment;
165
162
  if (Provider !== this.useProvider.getState().Provider) {
166
163
  this.useProvider.setState({ Provider }, true);
167
164
  }
@@ -179,6 +176,12 @@ export class RemoteThreadListThreadListRuntimeCore
179
176
  }
180
177
  }
181
178
 
179
+ public reload() {
180
+ this._loadGeneration++;
181
+ this._loadThreadsPromise = undefined;
182
+ return this.getLoadThreadsPromise();
183
+ }
184
+
182
185
  public get isLoading() {
183
186
  return this._state.value.isLoading;
184
187
  }
@@ -239,6 +242,7 @@ export class RemoteThreadListThreadListRuntimeCore
239
242
  externalId: remoteMetadata.externalId,
240
243
  status: remoteMetadata.status,
241
244
  title: remoteMetadata.title,
245
+ custom: remoteMetadata.custom,
242
246
  } as RemoteThreadData,
243
247
  };
244
248
 
@@ -247,15 +251,23 @@ export class RemoteThreadListThreadListRuntimeCore
247
251
  [remoteMetadata.remoteId]: mappingId,
248
252
  };
249
253
 
254
+ // Filter both arrays first so a concurrent `list()` can't leave the id
255
+ // duplicated or under the wrong status.
256
+ const threadIdsWithoutRemote = state.threadIds.filter(
257
+ (id) => id !== remoteMetadata.remoteId,
258
+ );
259
+ const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(
260
+ (id) => id !== remoteMetadata.remoteId,
261
+ );
262
+
250
263
  const newThreadIds =
251
264
  remoteMetadata.status === "regular"
252
- ? [...state.threadIds, remoteMetadata.remoteId]
253
- : state.threadIds;
254
-
265
+ ? [...threadIdsWithoutRemote, remoteMetadata.remoteId]
266
+ : threadIdsWithoutRemote;
255
267
  const newArchivedThreadIds =
256
268
  remoteMetadata.status === "archived"
257
- ? [...state.archivedThreadIds, remoteMetadata.remoteId]
258
- : state.archivedThreadIds;
269
+ ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]
270
+ : archivedThreadIdsWithoutRemote;
259
271
 
260
272
  this._state.update({
261
273
  ...state,
@@ -316,6 +328,7 @@ export class RemoteThreadListThreadListRuntimeCore
316
328
  remoteId: undefined,
317
329
  externalId: undefined,
318
330
  title: undefined,
331
+ custom: undefined,
319
332
  } satisfies RemoteThreadData,
320
333
  },
321
334
  });
@@ -352,6 +365,7 @@ export class RemoteThreadListThreadListRuntimeCore
352
365
  },
353
366
  };
354
367
  },
368
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
355
369
  then: (state, { remoteId, externalId }) => {
356
370
  const data = getThreadData(state, threadId);
357
371
  if (!data) return state;
@@ -1,4 +1,4 @@
1
- import { createContext, FC, ReactNode, useContext } from "react";
1
+ import { createContext, type FC, type ReactNode, useContext } from "react";
2
2
  import type { ThreadHistoryAdapter } from "../../adapters/thread-history";
3
3
  import type { AttachmentAdapter } from "../../adapters/attachment";
4
4
  import type { ModelContextProvider } from "../../model-context/types";
@@ -1,4 +1,4 @@
1
- import { RefObject, useState } from "react";
1
+ import { type RefObject, useState } from "react";
2
2
  import type {
3
3
  GenericThreadHistoryAdapter,
4
4
  ThreadHistoryAdapter,
@@ -8,12 +8,12 @@ import type {
8
8
  } from "../../../adapters/thread-history";
9
9
  import type { ExportedMessageRepositoryItem } from "../../../runtime/utils/message-repository";
10
10
  import {
11
- AssistantCloud,
11
+ type AssistantCloud,
12
12
  CloudMessagePersistence,
13
13
  createFormattedPersistence,
14
14
  } from "assistant-cloud";
15
15
  import { auiV0Decode, auiV0Encode } from "./auiV0";
16
- import { AssistantClient, useAui } from "@assistant-ui/store";
16
+ import { type AssistantClient, useAui } from "@assistant-ui/store";
17
17
  import type { ThreadListItemMethods } from "../../../store/scopes/thread-list-item";
18
18
 
19
19
  const globalPersistence = new WeakMap<
@@ -1,8 +1,11 @@
1
1
  import type { MessageStatus, ThreadMessage } from "../../../types/message";
2
2
  import { fromThreadMessageLike } from "../../../runtime/utils/thread-message-like";
3
- import { CloudMessage } from "assistant-cloud";
3
+ import type { CloudMessage } from "assistant-cloud";
4
4
  import { isJSONValue } from "../../../utils/json/is-json";
5
- import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
5
+ import type {
6
+ ReadonlyJSONObject,
7
+ ReadonlyJSONValue,
8
+ } from "assistant-stream/utils";
6
9
  import type { ExportedMessageRepositoryItem } from "../../../runtime/utils/message-repository";
7
10
 
8
11
  type AuiV0MessagePart =