@assistant-ui/core 0.1.14 → 0.1.15

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 (324) 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.js.map +1 -1
  43. package/dist/react/client/DataRenderers.d.ts +1 -1
  44. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  45. package/dist/react/client/DataRenderers.js +14 -0
  46. package/dist/react/client/DataRenderers.js.map +1 -1
  47. package/dist/react/client/Tools.d.ts +1 -1
  48. package/dist/react/client/Tools.d.ts.map +1 -1
  49. package/dist/react/client/Tools.js +1 -0
  50. package/dist/react/client/Tools.js.map +1 -1
  51. package/dist/react/model-context/makeAssistantTool.d.ts +1 -1
  52. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  53. package/dist/react/model-context/makeAssistantToolUI.d.ts +1 -1
  54. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  55. package/dist/react/model-context/useInlineRender.d.ts +2 -2
  56. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  57. package/dist/react/model-context/useInlineRender.js +1 -0
  58. package/dist/react/model-context/useInlineRender.js.map +1 -1
  59. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  60. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -0
  61. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  62. package/dist/react/primitives/composer/ComposerAttachments.d.ts +1 -1
  63. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  64. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  65. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  66. package/dist/react/primitives/message/MessageAttachments.d.ts +1 -1
  67. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  68. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  69. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  70. package/dist/react/primitives/message/MessageParts.d.ts +1 -1
  71. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  72. package/dist/react/primitives/message/MessageParts.js +16 -17
  73. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  74. package/dist/react/primitives/part/PartMessages.d.ts +1 -1
  75. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  76. package/dist/react/primitives/thread/ThreadMessages.d.ts +1 -1
  77. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  78. package/dist/react/primitives/thread/ThreadMessages.js +2 -1
  79. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  80. package/dist/react/primitives/threadList/ThreadListItems.d.ts +1 -1
  81. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  82. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  83. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  84. package/dist/react/providers/AttachmentByIndexProvider.d.ts +1 -1
  85. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  86. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +1 -1
  87. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  88. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +1 -1
  89. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  90. package/dist/react/providers/MessageByIndexProvider.d.ts +1 -1
  91. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  92. package/dist/react/providers/PartByIndexProvider.d.ts +1 -1
  93. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  94. package/dist/react/providers/QueueItemByIndexProvider.d.ts +1 -1
  95. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  96. package/dist/react/providers/SuggestionByIndexProvider.d.ts +1 -1
  97. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  98. package/dist/react/providers/TextMessagePartProvider.d.ts +1 -1
  99. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  100. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +1 -1
  101. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  102. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +1 -1
  103. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -1
  105. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  106. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +2 -1
  107. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  108. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
  109. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  110. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +21 -4
  111. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  112. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +1 -1
  113. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  114. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  115. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -2
  116. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  117. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  118. package/dist/react/runtimes/cloud/auiV0.d.ts +2 -2
  119. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  120. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  121. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  122. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +4 -1
  123. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  124. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  125. package/dist/react/runtimes/useLocalRuntime.js +10 -0
  126. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  127. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  128. package/dist/react/runtimes/useRemoteThreadListRuntime.js +6 -0
  129. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  130. package/dist/react/runtimes/useToolInvocations.d.ts.map +1 -1
  131. package/dist/react/runtimes/useToolInvocations.js +2 -0
  132. package/dist/react/runtimes/useToolInvocations.js.map +1 -1
  133. package/dist/react/types/MessagePartComponentTypes.d.ts +1 -1
  134. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  135. package/dist/react/types/scopes/dataRenderers.d.ts +2 -0
  136. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  137. package/dist/runtime/api/assistant-runtime.d.ts +1 -1
  138. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  139. package/dist/runtime/api/attachment-runtime.d.ts +0 -1
  140. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  141. package/dist/runtime/api/attachment-runtime.js +0 -3
  142. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  143. package/dist/runtime/api/message-runtime.d.ts +6 -6
  144. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  145. package/dist/runtime/api/thread-list-runtime.d.ts +4 -2
  146. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  147. package/dist/runtime/api/thread-list-runtime.js +5 -0
  148. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  149. package/dist/runtime/api/thread-runtime.d.ts +10 -9
  150. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  151. package/dist/runtime/api/thread-runtime.js +4 -3
  152. package/dist/runtime/api/thread-runtime.js.map +1 -1
  153. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  154. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +2 -1
  155. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  156. package/dist/runtime/base/default-edit-composer-runtime-core.js +26 -5
  157. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  158. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  159. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  160. package/dist/runtime/interfaces/thread-runtime-core.d.ts +7 -0
  161. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  162. package/dist/runtime/internal.d.ts.map +1 -1
  163. package/dist/runtime/internal.js +1 -4
  164. package/dist/runtime/internal.js.map +1 -1
  165. package/dist/runtime/utils/auto-status.d.ts +1 -1
  166. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  167. package/dist/runtime/utils/chat-model-adapter.d.ts +1 -1
  168. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  169. package/dist/runtime/utils/thread-message-like.d.ts +1 -1
  170. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  171. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  172. package/dist/runtimes/assistant-transport/utils.d.ts +1 -1
  173. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  174. package/dist/runtimes/assistant-transport/utils.js +1 -1
  175. package/dist/runtimes/assistant-transport/utils.js.map +1 -1
  176. package/dist/runtimes/external-store/external-store-adapter.d.ts +8 -0
  177. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  178. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -1
  179. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  180. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +27 -25
  181. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  182. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
  183. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  184. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +4 -0
  185. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  186. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +2 -2
  187. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  188. package/dist/runtimes/remote-thread-list/types.d.ts +1 -1
  189. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  190. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +2 -2
  191. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  192. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -1
  193. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  194. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +2 -2
  195. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  196. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -1
  197. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  198. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +1 -1
  199. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  200. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +2 -2
  201. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  202. package/dist/store/runtime-clients/thread-list-runtime-client.js +1 -0
  203. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  204. package/dist/store/runtime-clients/thread-runtime-client.d.ts +1 -1
  205. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  206. package/dist/store/scopes/threads.d.ts +1 -0
  207. package/dist/store/scopes/threads.d.ts.map +1 -1
  208. package/dist/subscribable/subscribable.d.ts.map +1 -1
  209. package/dist/subscribable/subscribable.js +1 -15
  210. package/dist/subscribable/subscribable.js.map +1 -1
  211. package/dist/tests/remote-thread-list-test-helpers.d.ts +12 -0
  212. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -0
  213. package/dist/tests/remote-thread-list-test-helpers.js +48 -0
  214. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -0
  215. package/dist/types/directive.d.ts +19 -0
  216. package/dist/types/directive.d.ts.map +1 -0
  217. package/dist/types/directive.js +2 -0
  218. package/dist/types/directive.js.map +1 -0
  219. package/dist/types/index.d.ts +1 -1
  220. package/dist/types/index.d.ts.map +1 -1
  221. package/dist/types/message.d.ts.map +1 -1
  222. package/dist/types/trigger.d.ts +2 -2
  223. package/dist/types/trigger.d.ts.map +1 -1
  224. package/dist/utils/json/is-json.d.ts +1 -1
  225. package/dist/utils/json/is-json.d.ts.map +1 -1
  226. package/package.json +11 -11
  227. package/src/adapters/attachment.ts +68 -16
  228. package/src/adapters/{mention.ts → directive-formatter.ts} +8 -20
  229. package/src/adapters/index.ts +2 -9
  230. package/src/adapters/speech.ts +1 -16
  231. package/src/adapters/thread-history.ts +1 -8
  232. package/src/adapters/trigger.ts +1 -37
  233. package/src/index.ts +3 -24
  234. package/src/model-context/frame/host.ts +6 -5
  235. package/src/model-context/frame/provider.ts +6 -5
  236. package/src/model-context/registry.ts +6 -6
  237. package/src/model-context/tool.ts +1 -1
  238. package/src/model-context/types.ts +1 -17
  239. package/src/react/AssistantRuntimeProvider.tsx +1 -1
  240. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -1
  241. package/src/react/client/DataRenderers.ts +19 -3
  242. package/src/react/client/Tools.ts +4 -3
  243. package/src/react/model-context/makeAssistantTool.ts +1 -1
  244. package/src/react/model-context/makeAssistantToolUI.ts +1 -1
  245. package/src/react/model-context/useInlineRender.ts +3 -2
  246. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -0
  247. package/src/react/primitives/composer/ComposerAttachments.tsx +7 -1
  248. package/src/react/primitives/message/MessageAttachments.tsx +7 -1
  249. package/src/react/primitives/message/MessageParts.tsx +27 -17
  250. package/src/react/primitives/part/PartMessages.tsx +1 -1
  251. package/src/react/primitives/thread/ThreadMessages.tsx +3 -2
  252. package/src/react/primitives/threadList/ThreadListItems.tsx +7 -1
  253. package/src/react/providers/AttachmentByIndexProvider.tsx +1 -1
  254. package/src/react/providers/ChainOfThoughtByIndicesProvider.tsx +1 -1
  255. package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +1 -1
  256. package/src/react/providers/MessageByIndexProvider.tsx +1 -1
  257. package/src/react/providers/PartByIndexProvider.tsx +1 -1
  258. package/src/react/providers/QueueItemByIndexProvider.tsx +1 -1
  259. package/src/react/providers/SuggestionByIndexProvider.tsx +1 -1
  260. package/src/react/providers/TextMessagePartProvider.tsx +1 -1
  261. package/src/react/providers/ThreadListItemByIndexProvider.tsx +1 -1
  262. package/src/react/providers/ThreadListItemRuntimeProvider.tsx +1 -1
  263. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +7 -8
  264. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +28 -8
  265. package/src/react/runtimes/RuntimeAdapterProvider.tsx +1 -1
  266. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +3 -3
  267. package/src/react/runtimes/cloud/auiV0.ts +5 -2
  268. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +6 -3
  269. package/src/react/runtimes/useLocalRuntime.ts +10 -0
  270. package/src/react/runtimes/useRemoteThreadListRuntime.ts +6 -0
  271. package/src/react/runtimes/useToolInvocations.ts +2 -0
  272. package/src/react/types/MessagePartComponentTypes.ts +1 -1
  273. package/src/react/types/scopes/dataRenderers.ts +2 -0
  274. package/src/runtime/api/assistant-runtime.ts +1 -1
  275. package/src/runtime/api/attachment-runtime.ts +0 -4
  276. package/src/runtime/api/message-runtime.ts +8 -8
  277. package/src/runtime/api/thread-list-runtime.ts +13 -5
  278. package/src/runtime/api/thread-runtime.ts +13 -12
  279. package/src/runtime/base/base-thread-runtime-core.ts +1 -1
  280. package/src/runtime/base/default-edit-composer-runtime-core.ts +35 -5
  281. package/src/runtime/interfaces/thread-list-runtime-core.ts +1 -0
  282. package/src/runtime/interfaces/thread-runtime-core.ts +7 -0
  283. package/src/runtime/internal.ts +1 -4
  284. package/src/runtime/utils/auto-status.ts +1 -1
  285. package/src/runtime/utils/chat-model-adapter.ts +1 -1
  286. package/src/runtime/utils/thread-message-like.ts +4 -1
  287. package/src/runtimes/assistant-transport/utils.ts +5 -1
  288. package/src/runtimes/external-store/external-store-adapter.ts +8 -0
  289. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +35 -29
  290. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +4 -0
  291. package/src/runtimes/remote-thread-list/adapter/in-memory.ts +2 -2
  292. package/src/runtimes/remote-thread-list/types.ts +1 -1
  293. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -2
  294. package/src/store/runtime-clients/composer-runtime-client.ts +2 -2
  295. package/src/store/runtime-clients/message-part-runtime-client.ts +2 -2
  296. package/src/store/runtime-clients/message-runtime-client.ts +2 -2
  297. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +1 -1
  298. package/src/store/runtime-clients/thread-list-runtime-client.ts +4 -3
  299. package/src/store/runtime-clients/thread-runtime-client.ts +3 -3
  300. package/src/store/scopes/threads.ts +1 -0
  301. package/src/subscribable/subscribable.ts +1 -24
  302. package/src/tests/OptimisticState-list-race.test.ts +5 -9
  303. package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +209 -0
  304. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-dedupe.test.ts +139 -0
  305. package/src/tests/attachment.test.ts +180 -0
  306. package/src/tests/default-edit-composer-runtime-core.test.ts +312 -0
  307. package/src/tests/{mention-formatter.test.ts → directive-formatter.test.ts} +26 -1
  308. package/src/tests/external-store-thread-list-runtime-core.test.ts +212 -0
  309. package/src/tests/get-thread-state-isRunning.test.ts +93 -0
  310. package/src/tests/remote-thread-list-isLoading.test.ts +6 -10
  311. package/src/tests/remote-thread-list-test-helpers.ts +70 -0
  312. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +17 -1
  313. package/src/types/directive.ts +19 -0
  314. package/src/types/index.ts +1 -3
  315. package/src/types/message.ts +0 -12
  316. package/src/types/trigger.ts +2 -10
  317. package/src/utils/json/is-json.ts +1 -1
  318. package/dist/adapters/mention.d.ts.map +0 -1
  319. package/dist/adapters/mention.js.map +0 -1
  320. package/dist/types/mention.d.ts +0 -21
  321. package/dist/types/mention.d.ts.map +0 -1
  322. package/dist/types/mention.js +0 -2
  323. package/dist/types/mention.js.map +0 -1
  324. package/src/types/mention.ts +0 -39
@@ -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
  };
@@ -522,12 +531,11 @@ const RegisteredToolUI: FC = () => {
522
531
  */
523
532
  const RegisteredDataRendererUI: FC = () => {
524
533
  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
- });
534
+ const Render = useAuiState((s) =>
535
+ s.part.type === "data"
536
+ ? (getDataRenderer(s.dataRenderers, s.part.name, undefined) ?? null)
537
+ : null,
538
+ );
531
539
 
532
540
  if (!Render || part.type !== "data") return null;
533
541
 
@@ -584,6 +592,9 @@ const MessagePrimitivePartsInner: FC<{
584
592
  }> = ({ children }) => {
585
593
  const aui = useAui();
586
594
  const contentLength = useAuiState((s) => s.message.parts.length);
595
+ // Subscribed (not snapshotted like `tools`) so fallbacks registered after
596
+ // the first render trigger a re-render and `hasUI` re-evaluates.
597
+ const dataRenderers = useAuiState((s) => s.dataRenderers);
587
598
 
588
599
  // biome-ignore lint/correctness/useExhaustiveDependencies: aui accessors are stable refs
589
600
  return useMemo(
@@ -609,10 +620,9 @@ const MessagePrimitivePartsInner: FC<{
609
620
  };
610
621
  }
611
622
  if (state.type === "data") {
612
- const entry = aui.dataRenderers().getState().renderers[
613
- state.name
614
- ];
615
- const hasUI = Array.isArray(entry) ? !!entry[0] : !!entry;
623
+ const hasUI =
624
+ getDataRenderer(dataRenderers, state.name, undefined) !==
625
+ undefined;
616
626
  return {
617
627
  ...state,
618
628
  dataRendererUI: hasUI ? (
@@ -629,7 +639,7 @@ const MessagePrimitivePartsInner: FC<{
629
639
  </RenderChildrenWithAccessor>
630
640
  </PartByIndexProvider>
631
641
  )),
632
- [contentLength, children],
642
+ [contentLength, children, dataRenderers],
633
643
  );
634
644
  };
635
645
 
@@ -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,21 @@
1
1
  import {
2
- FC,
2
+ type FC,
3
3
  useCallback,
4
4
  useRef,
5
5
  useEffect,
6
6
  memo,
7
- PropsWithChildren,
8
- ComponentType,
7
+ type PropsWithChildren,
8
+ type ComponentType,
9
9
  useMemo,
10
10
  } from "react";
11
- import { UseBoundStore, StoreApi, create } from "zustand";
11
+ import { type UseBoundStore, type StoreApi, create } from "zustand";
12
12
  import { useAui } from "@assistant-ui/store";
13
13
  import { ThreadListItemRuntimeProvider } from "../providers/ThreadListItemRuntimeProvider";
14
14
  import type { ThreadRuntimeCore } from "../../runtime/interfaces/thread-runtime-core";
15
15
  import type { ThreadListRuntimeCore } from "../../runtime/interfaces/thread-list-runtime-core";
16
16
  import type { AssistantRuntime } from "../../runtime/api/assistant-runtime";
17
17
  import { BaseSubscribable } from "../../subscribable/subscribable";
18
- import { ThreadRuntimeImpl } from "../../runtime/api/thread-runtime";
18
+ import type { ThreadRuntimeImpl } from "../../runtime/api/thread-runtime";
19
19
  import { ThreadListRuntimeImpl } from "../../runtime/api/thread-list-runtime";
20
20
 
21
21
  type RemoteThreadListHook = () => AssistantRuntime;
@@ -116,9 +116,8 @@ export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
116
116
 
117
117
  useEffect(() => {
118
118
  const runtimeCore = threadBinding.getState();
119
- const setGetInitializePromise = (runtimeCore as Record<string, unknown>)[
120
- "__internal_setGetInitializePromise"
121
- ];
119
+ const setGetInitializePromise = (runtimeCore as Record<string, unknown>)
120
+ .__internal_setGetInitializePromise;
122
121
  if (typeof setGetInitializePromise === "function") {
123
122
  setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);
124
123
  }
@@ -16,10 +16,10 @@ import {
16
16
  import type { RemoteThreadListOptions } from "../../runtimes/remote-thread-list/types";
17
17
  import { RemoteThreadListHookInstanceManager } from "./RemoteThreadListHookInstanceManager";
18
18
  import {
19
- ComponentType,
20
- FC,
19
+ type ComponentType,
20
+ type FC,
21
21
  Fragment,
22
- PropsWithChildren,
22
+ type PropsWithChildren,
23
23
  useEffect,
24
24
  useId,
25
25
  } from "react";
@@ -36,6 +36,7 @@ export class RemoteThreadListThreadListRuntimeCore
36
36
  private readonly _hookManager: RemoteThreadListHookInstanceManager;
37
37
 
38
38
  private _loadThreadsPromise: Promise<void> | undefined;
39
+ private _loadGeneration = 0;
39
40
 
40
41
  private _mainThreadId!: string;
41
42
  private readonly _state = new OptimisticState<RemoteThreadState>({
@@ -54,6 +55,7 @@ export class RemoteThreadListThreadListRuntimeCore
54
55
  public getLoadThreadsPromise() {
55
56
  // TODO this needs to be cached in case this promise is loaded during suspense
56
57
  if (!this._loadThreadsPromise) {
58
+ const generation = this._loadGeneration;
57
59
  this._loadThreadsPromise = this._state
58
60
  .optimisticUpdate({
59
61
  execute: () => this._options.adapter.list(),
@@ -63,7 +65,9 @@ export class RemoteThreadListThreadListRuntimeCore
63
65
  isLoading: true,
64
66
  };
65
67
  },
68
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
66
69
  then: (state, l) => {
70
+ if (generation !== this._loadGeneration) return state;
67
71
  const newThreadIds = [];
68
72
  const newArchivedThreadIds = [];
69
73
  const newThreadIdMap = {} as Record<string, THREAD_MAPPING_ID>;
@@ -118,6 +122,7 @@ export class RemoteThreadListThreadListRuntimeCore
118
122
  },
119
123
  })
120
124
  .catch(() => {
125
+ if (generation !== this._loadGeneration) return;
121
126
  this._loadThreadsPromise = undefined;
122
127
  this._state.update({
123
128
  ...this._state.baseValue,
@@ -179,6 +184,12 @@ export class RemoteThreadListThreadListRuntimeCore
179
184
  }
180
185
  }
181
186
 
187
+ public reload() {
188
+ this._loadGeneration++;
189
+ this._loadThreadsPromise = undefined;
190
+ return this.getLoadThreadsPromise();
191
+ }
192
+
182
193
  public get isLoading() {
183
194
  return this._state.value.isLoading;
184
195
  }
@@ -247,15 +258,23 @@ export class RemoteThreadListThreadListRuntimeCore
247
258
  [remoteMetadata.remoteId]: mappingId,
248
259
  };
249
260
 
261
+ // Filter both arrays first so a concurrent `list()` can't leave the id
262
+ // duplicated or under the wrong status.
263
+ const threadIdsWithoutRemote = state.threadIds.filter(
264
+ (id) => id !== remoteMetadata.remoteId,
265
+ );
266
+ const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(
267
+ (id) => id !== remoteMetadata.remoteId,
268
+ );
269
+
250
270
  const newThreadIds =
251
271
  remoteMetadata.status === "regular"
252
- ? [...state.threadIds, remoteMetadata.remoteId]
253
- : state.threadIds;
254
-
272
+ ? [...threadIdsWithoutRemote, remoteMetadata.remoteId]
273
+ : threadIdsWithoutRemote;
255
274
  const newArchivedThreadIds =
256
275
  remoteMetadata.status === "archived"
257
- ? [...state.archivedThreadIds, remoteMetadata.remoteId]
258
- : state.archivedThreadIds;
276
+ ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]
277
+ : archivedThreadIdsWithoutRemote;
259
278
 
260
279
  this._state.update({
261
280
  ...state,
@@ -352,6 +371,7 @@ export class RemoteThreadListThreadListRuntimeCore
352
371
  },
353
372
  };
354
373
  },
374
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
355
375
  then: (state, { remoteId, externalId }) => {
356
376
  const data = getThreadData(state, threadId);
357
377
  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 =
@@ -1,8 +1,8 @@
1
1
  declare const process: { env: Record<string, string | undefined> };
2
2
 
3
3
  import {
4
- FC,
5
- PropsWithChildren,
4
+ type FC,
5
+ type PropsWithChildren,
6
6
  useCallback,
7
7
  useEffect,
8
8
  useMemo,
@@ -28,7 +28,7 @@ type CloudThreadListAdapterOptions = {
28
28
 
29
29
  const baseUrl =
30
30
  typeof process !== "undefined" &&
31
- process?.env?.["NEXT_PUBLIC_ASSISTANT_BASE_URL"];
31
+ process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;
32
32
  const autoCloud = baseUrl
33
33
  ? new AssistantCloud({ baseUrl, anonymous: true })
34
34
  : undefined;
@@ -43,17 +43,20 @@ export const useCloudThreadListAdapter = (
43
43
 
44
44
  const unstable_Provider = useCallback<FC<PropsWithChildren>>(
45
45
  function Provider({ children }) {
46
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
46
47
  const history = useAssistantCloudThreadHistoryAdapter({
47
48
  get current() {
48
49
  return adapterRef.current.cloud ?? autoCloud!;
49
50
  },
50
51
  });
51
52
  const cloudInstance = adapterRef.current.cloud ?? autoCloud!;
53
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
52
54
  const attachments = useMemo(
53
55
  () => new CloudFileAttachmentAdapter(cloudInstance),
54
56
  [cloudInstance],
55
57
  );
56
58
 
59
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
57
60
  const adapters = useMemo(
58
61
  () => ({
59
62
  history,
@@ -22,6 +22,7 @@ const useLocalThreadRuntime = (
22
22
  chatModel: ChatModelAdapter,
23
23
  { initialMessages, ...options }: LocalRuntimeOptions,
24
24
  ): AssistantRuntime => {
25
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
25
26
  const { modelContext, ...threadListAdapters } = useRuntimeAdapters() ?? {};
26
27
  const opt = {
27
28
  ...options,
@@ -32,33 +33,41 @@ const useLocalThreadRuntime = (
32
33
  },
33
34
  };
34
35
 
36
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
35
37
  const [runtime] = useState(() => new LocalRuntimeCore(opt, initialMessages));
36
38
 
39
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
37
40
  const threadIdRef = useRef<string | undefined>(undefined);
41
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
38
42
  threadIdRef.current = useAuiState((s) => s.threadListItem.remoteId);
39
43
 
44
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
40
45
  useEffect(() => {
41
46
  runtime.threads
42
47
  .getMainThreadRuntimeCore()
43
48
  .__internal_setGetThreadId(() => threadIdRef.current);
44
49
  }, [runtime]);
45
50
 
51
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
46
52
  useEffect(() => {
47
53
  return () => {
48
54
  runtime.threads.getMainThreadRuntimeCore().detach();
49
55
  };
50
56
  }, [runtime]);
51
57
 
58
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
52
59
  useEffect(() => {
53
60
  runtime.threads.getMainThreadRuntimeCore().__internal_setOptions(opt);
54
61
  runtime.threads.getMainThreadRuntimeCore().__internal_load();
55
62
  });
56
63
 
64
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
57
65
  useEffect(() => {
58
66
  if (!modelContext) return undefined;
59
67
  return runtime.registerModelContextProvider(modelContext);
60
68
  }, [modelContext, runtime]);
61
69
 
70
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
62
71
  return useMemo(() => new AssistantRuntimeImpl(runtime), [runtime]);
63
72
  };
64
73
 
@@ -93,6 +102,7 @@ export const useLocalRuntime = (
93
102
  const cloudAdapter = useCloudThreadListAdapter({ cloud });
94
103
  return useRemoteThreadListRuntime({
95
104
  runtimeHook: function RuntimeHook() {
105
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
96
106
  return useLocalThreadRuntime(chatModel, options);
97
107
  },
98
108
  adapter: cloudAdapter,
@@ -29,12 +29,15 @@ class RemoteThreadListRuntimeCore
29
29
  const useRemoteThreadListRuntimeImpl = (
30
30
  options: RemoteThreadListOptions,
31
31
  ): AssistantRuntime => {
32
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
32
33
  const [runtime] = useState(() => new RemoteThreadListRuntimeCore(options));
34
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
33
35
  useEffect(() => {
34
36
  runtime.threads.__internal_setOptions(options);
35
37
  runtime.threads.__internal_load();
36
38
  }, [runtime, options]);
37
39
 
40
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
38
41
  return useMemo(() => new AssistantRuntimeImpl(runtime), [runtime]);
39
42
  };
40
43
 
@@ -77,9 +80,12 @@ export const useRemoteThreadListRuntime = (
77
80
  return stableRuntimeHook();
78
81
  }
79
82
 
83
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
80
84
  const runtime = useRemoteThreadListRuntimeImpl(stableOptions);
81
85
 
86
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
82
87
  const prevThreadIdRef = useRef(options.threadId);
88
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
83
89
  useEffect(() => {
84
90
  if (options.threadId === prevThreadIdRef.current) return;
85
91
  prevThreadIdRef.current = options.threadId;
@@ -197,6 +197,7 @@ export function useToolInvocations({
197
197
  if (wasStarted) {
198
198
  executingCountRef.current--;
199
199
  if (executingCountRef.current === 0) {
200
+ // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return
200
201
  settledResolversRef.current.forEach((resolve) => resolve());
201
202
  settledResolversRef.current = [];
202
203
  }
@@ -215,6 +216,7 @@ export function useToolInvocations({
215
216
  });
216
217
  // Resolve any waiting abort promises when all tools have settled
217
218
  if (executingCountRef.current === 0) {
219
+ // biome-ignore lint/suspicious/useIterableCallbackReturn: forEach callback intentionally has no return
218
220
  settledResolversRef.current.forEach((resolve) => resolve());
219
221
  settledResolversRef.current = [];
220
222
  }
@@ -12,7 +12,7 @@ import type {
12
12
  QuoteInfo,
13
13
  } from "../..";
14
14
  import type { MessagePartState } from "../..";
15
- import { ToolResponse } from "assistant-stream";
15
+ import type { ToolResponse } from "assistant-stream";
16
16
 
17
17
  export type EmptyMessagePartProps = {
18
18
  status: MessagePartStatus;
@@ -3,11 +3,13 @@ import type { Unsubscribe } from "../../..";
3
3
 
4
4
  export type DataRenderersState = {
5
5
  renderers: Record<string, DataMessagePartComponent[]>;
6
+ fallbacks: DataMessagePartComponent[];
6
7
  };
7
8
 
8
9
  export type DataRenderersMethods = {
9
10
  getState(): DataRenderersState;
10
11
  setDataUI(name: string, render: DataMessagePartComponent): Unsubscribe;
12
+ setFallbackDataUI(render: DataMessagePartComponent): Unsubscribe;
11
13
  };
12
14
 
13
15
  export type DataRenderersClientSchema = {
@@ -3,7 +3,7 @@ import type { ModelContextProvider } from "../../model-context/types";
3
3
  import type { AssistantRuntimeCore } from "../interfaces/assistant-runtime-core";
4
4
  import type { ThreadRuntime } from "./thread-runtime";
5
5
  import {
6
- ThreadListRuntime,
6
+ type ThreadListRuntime,
7
7
  ThreadListRuntimeImpl,
8
8
  } from "./thread-list-runtime";
9
9
  import { ExportedMessageRepository } from "../utils/message-repository";
@@ -105,10 +105,6 @@ export class MessageAttachmentRuntimeImpl extends AttachmentRuntimeImpl<"message
105
105
  return "message";
106
106
  }
107
107
 
108
- constructor(core: AttachmentSnapshotBinding<"message">) {
109
- super(core);
110
- }
111
-
112
108
  public remove(): never {
113
109
  throw new Error("Message attachments cannot be removed");
114
110
  }
@@ -1,4 +1,4 @@
1
- import {
1
+ import type {
2
2
  SpeechState,
3
3
  SubmittedFeedback,
4
4
  } from "../interfaces/thread-runtime-core";
@@ -18,21 +18,21 @@ import {
18
18
  ShallowMemoizeSubject,
19
19
  } from "../../subscribable/subscribable";
20
20
  import {
21
- AttachmentRuntime,
22
- AttachmentState,
21
+ type AttachmentRuntime,
22
+ type AttachmentState,
23
23
  MessageAttachmentRuntimeImpl,
24
24
  } from "./attachment-runtime";
25
25
  import {
26
- EditComposerRuntime,
26
+ type EditComposerRuntime,
27
27
  EditComposerRuntimeImpl,
28
28
  } from "./composer-runtime";
29
29
  import {
30
- MessagePartRuntime,
30
+ type MessagePartRuntime,
31
31
  MessagePartRuntimeImpl,
32
- MessagePartState,
32
+ type MessagePartState,
33
33
  } from "./message-part-runtime";
34
- import { MessageRuntimePath } from "./paths";
35
- import { ThreadRuntimeCoreBinding } from "./thread-runtime";
34
+ import type { MessageRuntimePath } from "./paths";
35
+ import type { ThreadRuntimeCoreBinding } from "./thread-runtime";
36
36
  import type { MessageStateBinding } from "./bindings";
37
37
 
38
38
  const COMPLETE_STATUS: MessagePartStatus = Object.freeze({