@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
@@ -30,6 +30,7 @@ export class ExternalStoreThreadListRuntimeCore
30
30
  private _archivedThreads: readonly string[] = EMPTY_ARRAY;
31
31
  private _threadData: Readonly<Record<string, ThreadListItemCoreState>> =
32
32
  DEFAULT_THREAD_DATA;
33
+ private adapter: ExternalStoreThreadListAdapter = {};
33
34
 
34
35
  public get isLoading() {
35
36
  return this.adapter.isLoading ?? false;
@@ -55,17 +56,16 @@ export class ExternalStoreThreadListRuntimeCore
55
56
  return RESOLVED_PROMISE;
56
57
  }
57
58
 
58
- private _mainThread: ExternalStoreThreadRuntimeCore;
59
+ private _mainThread!: ExternalStoreThreadRuntimeCore;
59
60
 
60
61
  public get mainThreadId() {
61
62
  return this._mainThreadId;
62
63
  }
63
64
 
64
65
  constructor(
65
- private adapter: ExternalStoreThreadListAdapter = {},
66
+ adapter: ExternalStoreThreadListAdapter = {},
66
67
  private threadFactory: ExternalStoreThreadFactory,
67
68
  ) {
68
- this._mainThread = this.threadFactory();
69
69
  this.__internal_setAdapter(adapter, true);
70
70
  }
71
71
 
@@ -113,31 +113,36 @@ export class ExternalStoreThreadListRuntimeCore
113
113
  return;
114
114
  }
115
115
 
116
- this._threadData = {
117
- ...DEFAULT_THREAD_DATA,
118
- ...Object.fromEntries(
119
- adapter.threads?.map((t) => [
120
- t.id,
121
- {
122
- ...t,
123
- remoteId: t.remoteId,
124
- externalId: t.externalId,
125
- status: "regular",
126
- },
127
- ]) ?? [],
128
- ),
129
- ...Object.fromEntries(
130
- adapter.archivedThreads?.map((t) => [
131
- t.id,
132
- {
133
- ...t,
134
- remoteId: t.remoteId,
135
- externalId: t.externalId,
136
- status: "archived",
137
- },
138
- ]) ?? [],
139
- ),
140
- };
116
+ if (
117
+ previousThreads !== newThreads ||
118
+ previousArchivedThreads !== newArchivedThreads
119
+ ) {
120
+ this._threadData = {
121
+ ...DEFAULT_THREAD_DATA,
122
+ ...Object.fromEntries(
123
+ adapter.threads?.map((t) => [
124
+ t.id,
125
+ {
126
+ ...t,
127
+ remoteId: t.remoteId,
128
+ externalId: t.externalId,
129
+ status: "regular",
130
+ },
131
+ ]) ?? [],
132
+ ),
133
+ ...Object.fromEntries(
134
+ adapter.archivedThreads?.map((t) => [
135
+ t.id,
136
+ {
137
+ ...t,
138
+ remoteId: t.remoteId,
139
+ externalId: t.externalId,
140
+ status: "archived",
141
+ },
142
+ ]) ?? [],
143
+ ),
144
+ };
145
+ }
141
146
 
142
147
  if (previousThreads !== newThreads) {
143
148
  this._threads = this.adapter.threads?.map((t) => t.id) ?? EMPTY_ARRAY;
@@ -148,7 +153,8 @@ export class ExternalStoreThreadListRuntimeCore
148
153
  this.adapter.archivedThreads?.map((t) => t.id) ?? EMPTY_ARRAY;
149
154
  }
150
155
 
151
- if (previousThreadId !== newThreadId) {
156
+ // `initialLoad ||`: `_mainThread!` must be assigned on construction.
157
+ if (initialLoad || previousThreadId !== newThreadId) {
152
158
  this._mainThreadId = newThreadId;
153
159
  this._mainThread = this.threadFactory();
154
160
  }
@@ -78,6 +78,10 @@ export class ExternalStoreThreadRuntimeCore
78
78
  public get isLoading() {
79
79
  return this._store.isLoading ?? false;
80
80
  }
81
+ // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.
82
+ public get isRunning(): boolean | undefined {
83
+ return this._store.isRunning;
84
+ }
81
85
 
82
86
  protected override _getBaseMessages(): readonly ThreadMessage[] {
83
87
  return this._messages;
@@ -1,5 +1,5 @@
1
- import { AssistantStream, AssistantStreamChunk } from "assistant-stream";
2
- import {
1
+ import type { AssistantStream, AssistantStreamChunk } from "assistant-stream";
2
+ import type {
3
3
  RemoteThreadInitializeResponse,
4
4
  RemoteThreadListAdapter,
5
5
  RemoteThreadListResponse,
@@ -7,6 +7,7 @@ export type RemoteThreadData =
7
7
  readonly externalId: undefined;
8
8
  readonly status: "new";
9
9
  readonly title: undefined;
10
+ readonly custom: undefined;
10
11
  }
11
12
  | {
12
13
  readonly id: string;
@@ -15,6 +16,7 @@ export type RemoteThreadData =
15
16
  readonly externalId: undefined;
16
17
  readonly status: "regular" | "archived";
17
18
  readonly title?: string | undefined;
19
+ readonly custom: undefined;
18
20
  }
19
21
  | {
20
22
  readonly id: string;
@@ -23,6 +25,7 @@ export type RemoteThreadData =
23
25
  readonly externalId: string | undefined;
24
26
  readonly status: "regular" | "archived";
25
27
  readonly title?: string | undefined;
28
+ readonly custom?: Record<string, unknown> | undefined;
26
29
  };
27
30
 
28
31
  export type THREAD_MAPPING_ID = string & { __brand: "THREAD_MAPPING_ID" };
@@ -1,6 +1,7 @@
1
+ import type { ComponentType, PropsWithChildren } from "react";
1
2
  import type { ThreadMessage } from "../../types/message";
2
3
  import type { AssistantRuntime } from "../../runtime/api/assistant-runtime";
3
- import { AssistantStream } from "assistant-stream";
4
+ import type { AssistantStream } from "assistant-stream";
4
5
 
5
6
  export type RemoteThreadInitializeResponse = {
6
7
  remoteId: string;
@@ -12,6 +13,7 @@ export type RemoteThreadMetadata = {
12
13
  readonly remoteId: string;
13
14
  readonly externalId?: string | undefined;
14
15
  readonly title?: string | undefined;
16
+ readonly custom?: Record<string, unknown> | undefined;
15
17
  };
16
18
 
17
19
  export type RemoteThreadListResponse = {
@@ -32,7 +34,17 @@ export type RemoteThreadListAdapter = {
32
34
  ): Promise<AssistantStream>;
33
35
  fetch(threadId: string): Promise<RemoteThreadMetadata>;
34
36
 
35
- unstable_Provider?: ((...args: any[]) => unknown) | undefined;
37
+ /**
38
+ * Optional React component wrapped around each active thread. Use it to
39
+ * inject per-thread context such as a history or attachments adapter (see
40
+ * `useCloudThreadListAdapter` for the canonical shape).
41
+ *
42
+ * The Provider must render `children` on its first commit; deferring them
43
+ * behind a loading state, a Suspense boundary, or a `useEffect`-gated render
44
+ * is unsupported and leaves thread context unavailable to downstream
45
+ * consumers. Load data inside an always-mounted child instead.
46
+ */
47
+ unstable_Provider?: ComponentType<PropsWithChildren> | undefined;
36
48
  };
37
49
 
38
50
  export type RemoteThreadListOptions = {
@@ -1,6 +1,6 @@
1
1
  import { resource } from "@assistant-ui/tap";
2
- import { type ClientOutput } from "@assistant-ui/store";
3
- import { AttachmentRuntime } from "../../runtime/api/attachment-runtime";
2
+ import type { ClientOutput } from "@assistant-ui/store";
3
+ import type { AttachmentRuntime } from "../../runtime/api/attachment-runtime";
4
4
  import { tapSubscribable } from "./tap-subscribable";
5
5
 
6
6
  export const AttachmentRuntimeClient = resource(
@@ -12,11 +12,11 @@ import {
12
12
  tapAssistantEmit,
13
13
  tapClientLookup,
14
14
  } from "@assistant-ui/store";
15
- import {
15
+ import type {
16
16
  ComposerRuntime,
17
17
  EditComposerRuntime,
18
18
  } from "../../runtime/api/composer-runtime";
19
- import { ComposerState } from "../scopes/composer";
19
+ import type { ComposerState } from "../scopes/composer";
20
20
  import { AttachmentRuntimeClient } from "./attachment-runtime-client";
21
21
  import { tapSubscribable } from "./tap-subscribable";
22
22
 
@@ -1,6 +1,6 @@
1
1
  import { resource } from "@assistant-ui/tap";
2
- import { type ClientOutput } from "@assistant-ui/store";
3
- import { MessagePartRuntime } from "../../runtime/api/message-part-runtime";
2
+ import type { ClientOutput } from "@assistant-ui/store";
3
+ import type { MessagePartRuntime } from "../../runtime/api/message-part-runtime";
4
4
  import { tapSubscribable } from "./tap-subscribable";
5
5
 
6
6
  export const MessagePartClient = resource(
@@ -11,11 +11,11 @@ import {
11
11
  tapClientLookup,
12
12
  tapClientResource,
13
13
  } from "@assistant-ui/store";
14
- import { MessageRuntime } from "../../runtime/api/message-runtime";
14
+ import type { MessageRuntime } from "../../runtime/api/message-runtime";
15
15
  import { tapSubscribable } from "./tap-subscribable";
16
16
  import { ComposerClient } from "./composer-runtime-client";
17
17
  import { MessagePartClient } from "./message-part-runtime-client";
18
- import { MessageState } from "../scopes/message";
18
+ import type { MessageState } from "../scopes/message";
19
19
  import { AttachmentRuntimeClient } from "./attachment-runtime-client";
20
20
 
21
21
  const MessageAttachmentClientByIndex = resource(
@@ -1,7 +1,7 @@
1
1
  import type { Unsubscribe } from "../../types/unsubscribe";
2
2
  import { resource, tapEffect } from "@assistant-ui/tap";
3
3
  import { type ClientOutput, tapAssistantEmit } from "@assistant-ui/store";
4
- import {
4
+ import type {
5
5
  ThreadListItemEventType,
6
6
  ThreadListItemRuntime,
7
7
  } from "../../runtime/api/thread-list-item-runtime";
@@ -4,12 +4,12 @@ import {
4
4
  tapClientLookup,
5
5
  tapClientResource,
6
6
  } from "@assistant-ui/store";
7
- import { ThreadListRuntime } from "../../runtime/api/thread-list-runtime";
8
- import { AssistantRuntime } from "../../runtime/api/assistant-runtime";
7
+ import type { ThreadListRuntime } from "../../runtime/api/thread-list-runtime";
8
+ import type { AssistantRuntime } from "../../runtime/api/assistant-runtime";
9
9
  import { tapSubscribable } from "./tap-subscribable";
10
10
  import { ThreadListItemClient } from "./thread-list-item-runtime-client";
11
11
  import { ThreadClient } from "./thread-runtime-client";
12
- import { ThreadsState } from "../scopes/threads";
12
+ import type { ThreadsState } from "../scopes/threads";
13
13
 
14
14
  const ThreadListItemClientById = resource(
15
15
  ({ runtime, id }: { runtime: ThreadListRuntime; id: string }) => {
@@ -86,6 +86,7 @@ export const ThreadListClient = resource(
86
86
  await runtime.switchToNewThread();
87
87
  },
88
88
  getLoadThreadsPromise: () => runtime.getLoadThreadsPromise(),
89
+ reload: () => runtime.reload(),
89
90
  __internal_getAssistantRuntime: () => __internal_assistantRuntime,
90
91
  };
91
92
  },
@@ -1,6 +1,6 @@
1
1
  import type { Unsubscribe } from "../../types/unsubscribe";
2
- import { ThreadRuntimeEventType } from "../../runtime/interfaces/thread-runtime-core";
3
- import { ThreadRuntime } from "../../runtime/api/thread-runtime";
2
+ import type { ThreadRuntimeEventType } from "../../runtime/interfaces/thread-runtime-core";
3
+ import type { ThreadRuntime } from "../../runtime/api/thread-runtime";
4
4
  import {
5
5
  resource,
6
6
  tapResource,
@@ -18,7 +18,7 @@ import {
18
18
  import { ComposerClient } from "./composer-runtime-client";
19
19
  import { MessageClient } from "./message-runtime-client";
20
20
  import { tapSubscribable } from "./tap-subscribable";
21
- import { ThreadState } from "../scopes/thread";
21
+ import type { ThreadState } from "../scopes/thread";
22
22
 
23
23
  const MessageClientById = resource(
24
24
  ({
@@ -7,6 +7,7 @@ export type ThreadListItemState = {
7
7
  readonly externalId: string | undefined;
8
8
  readonly title?: string | undefined;
9
9
  readonly status: ThreadListItemStatus;
10
+ readonly custom?: Record<string, unknown> | undefined;
10
11
  };
11
12
 
12
13
  export type ThreadListItemMethods = {
@@ -27,6 +27,7 @@ export type ThreadsMethods = {
27
27
  ): ThreadListItemMethods;
28
28
  thread(selector: "main"): ThreadMethods;
29
29
  getLoadThreadsPromise(): Promise<void>;
30
+ reload(): Promise<void>;
30
31
  __internal_getAssistantRuntime?(): AssistantRuntime;
31
32
  };
32
33
 
@@ -1,16 +1,8 @@
1
1
  import type { Unsubscribe } from "../types/unsubscribe";
2
2
 
3
- // =============================================================================
4
- // Sentinel
5
- // =============================================================================
6
-
7
3
  export const SKIP_UPDATE = Symbol("skip-update");
8
4
  export type SKIP_UPDATE = typeof SKIP_UPDATE;
9
5
 
10
- // =============================================================================
11
- // Types
12
- // =============================================================================
13
-
14
6
  export type Subscribable = {
15
7
  subscribe: (callback: () => void) => Unsubscribe;
16
8
  };
@@ -36,10 +28,6 @@ export type EventSubscribable<TEvent extends string> = {
36
28
  >;
37
29
  };
38
30
 
39
- // =============================================================================
40
- // Utilities
41
- // =============================================================================
42
-
43
31
  function shallowEqual<T extends object>(
44
32
  objA: T | undefined,
45
33
  objB: T | undefined,
@@ -57,10 +45,6 @@ function shallowEqual<T extends object>(
57
45
  return true;
58
46
  }
59
47
 
60
- // =============================================================================
61
- // Base Subscribable (simple pub-sub)
62
- // =============================================================================
63
-
64
48
  export class BaseSubscribable {
65
49
  private _subscribers = new Set<() => void>();
66
50
 
@@ -101,10 +85,7 @@ export class BaseSubscribable {
101
85
  }
102
86
  }
103
87
 
104
- // =============================================================================
105
- // Base Subject (lazy connect/disconnect)
106
- // =============================================================================
107
-
88
+ // lazy connect/disconnect: only opens upstream subscription while it has subscribers
108
89
  export abstract class BaseSubject {
109
90
  private _subscriptions = new Set<() => void>();
110
91
  private _connection: Unsubscribe | undefined;
@@ -140,10 +121,6 @@ export abstract class BaseSubject {
140
121
  }
141
122
  }
142
123
 
143
- // =============================================================================
144
- // Subject Implementations
145
- // =============================================================================
146
-
147
124
  export class ShallowMemoizeSubject<TState extends object, TPath>
148
125
  extends BaseSubject
149
126
  implements SubscribableWithState<TState, TPath>
@@ -7,6 +7,7 @@ import {
7
7
  createThreadMappingId,
8
8
  updateStatusReducer,
9
9
  } from "../runtimes/remote-thread-list/remote-thread-state";
10
+ import { deferred } from "./remote-thread-list-test-helpers";
10
11
 
11
12
  /**
12
13
  * Reproduces the race condition where a stale list() response
@@ -75,15 +76,6 @@ const applyListResult = (
75
76
  };
76
77
  };
77
78
 
78
- /** Creates a deferred promise for controlling resolution order. */
79
- function deferred<T>() {
80
- let resolve!: (v: T) => void;
81
- const promise = new Promise<T>((r) => {
82
- resolve = r;
83
- });
84
- return { promise, resolve };
85
- }
86
-
87
79
  describe("list + delete race condition", () => {
88
80
  it("stale list() does not re-add a thread deleted while list was in flight", async () => {
89
81
  const state = new OptimisticState<RemoteThreadState>(EMPTY_STATE);
@@ -95,6 +87,7 @@ describe("list + delete race condition", () => {
95
87
  const listPromise = state.optimisticUpdate({
96
88
  execute: () => listDeferred.promise,
97
89
  loading: (s) => ({ ...s, isLoading: true }),
90
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
98
91
  then: applyListResult,
99
92
  });
100
93
 
@@ -152,6 +145,7 @@ describe("list + delete race condition", () => {
152
145
  const listPromise = state.optimisticUpdate({
153
146
  execute: () => listDeferred.promise,
154
147
  loading: (s) => ({ ...s, isLoading: true }),
148
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
155
149
  then: applyListResult,
156
150
  });
157
151
 
@@ -189,6 +183,7 @@ describe("list + delete race condition", () => {
189
183
  const listPromise = state.optimisticUpdate({
190
184
  execute: () => listDeferred.promise,
191
185
  loading: (s) => ({ ...s, isLoading: true }),
186
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
192
187
  then: applyListResult,
193
188
  });
194
189
 
@@ -226,6 +221,7 @@ describe("list + delete race condition", () => {
226
221
  const listPromise = state.optimisticUpdate({
227
222
  execute: () => listDeferred.promise,
228
223
  loading: (s) => ({ ...s, isLoading: true }),
224
+ // biome-ignore lint/suspicious/noThenProperty: OptimisticState reducer pattern
229
225
  then: applyListResult,
230
226
  });
231
227
 
@@ -0,0 +1,123 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { createCore, makeAdapter } from "./remote-thread-list-test-helpers";
3
+
4
+ describe("RemoteThreadListThreadListRuntimeCore custom metadata", () => {
5
+ it("preserves custom field from list() through to threadItems", async () => {
6
+ const adapter = makeAdapter({
7
+ list: vi.fn(async () => ({
8
+ threads: [
9
+ {
10
+ status: "regular" as const,
11
+ remoteId: "thread-1",
12
+ externalId: "ext-1",
13
+ title: "Test",
14
+ custom: { workspaceId: "ws-1", createdAt: "2026-04-26" },
15
+ },
16
+ ],
17
+ })),
18
+ });
19
+
20
+ const core = createCore(adapter);
21
+ await core.getLoadThreadsPromise();
22
+
23
+ const item = core.getItemById("thread-1");
24
+ expect(item?.custom).toEqual({
25
+ workspaceId: "ws-1",
26
+ createdAt: "2026-04-26",
27
+ });
28
+ });
29
+
30
+ it("preserves custom field from fetch() through switchToThread", async () => {
31
+ const adapter = makeAdapter({
32
+ fetch: vi.fn(async (id: string) => ({
33
+ status: "regular" as const,
34
+ remoteId: id,
35
+ externalId: id,
36
+ title: "Test",
37
+ custom: { ownerId: "user-42" },
38
+ })),
39
+ });
40
+
41
+ const core = createCore(adapter);
42
+ await core.switchToThread("thread-2");
43
+
44
+ const item = core.getItemById("thread-2");
45
+ expect(item?.custom).toEqual({ ownerId: "user-42" });
46
+ });
47
+
48
+ it("leaves custom undefined when adapter omits it", async () => {
49
+ const adapter = makeAdapter({
50
+ list: vi.fn(async () => ({
51
+ threads: [
52
+ {
53
+ status: "regular" as const,
54
+ remoteId: "thread-3",
55
+ externalId: "ext-3",
56
+ title: "Test",
57
+ },
58
+ ],
59
+ })),
60
+ });
61
+
62
+ const core = createCore(adapter);
63
+ await core.getLoadThreadsPromise();
64
+
65
+ const item = core.getItemById("thread-3");
66
+ expect(item?.custom).toBeUndefined();
67
+ });
68
+
69
+ it("preserves custom across rename optimistic update", async () => {
70
+ const adapter = makeAdapter({
71
+ list: vi.fn(async () => ({
72
+ threads: [
73
+ {
74
+ status: "regular" as const,
75
+ remoteId: "thread-4",
76
+ externalId: "ext-4",
77
+ title: "Old",
78
+ custom: { tag: "important" },
79
+ },
80
+ ],
81
+ })),
82
+ });
83
+
84
+ const core = createCore(adapter);
85
+ await core.getLoadThreadsPromise();
86
+ await core.rename("thread-4", "New");
87
+
88
+ const item = core.getItemById("thread-4");
89
+ expect(item?.title).toBe("New");
90
+ expect(item?.custom).toEqual({ tag: "important" });
91
+ });
92
+
93
+ it("preserves custom across archive and unarchive optimistic updates", async () => {
94
+ const adapter = makeAdapter({
95
+ list: vi.fn(async () => ({
96
+ threads: [
97
+ {
98
+ status: "regular" as const,
99
+ remoteId: "thread-5",
100
+ externalId: "ext-5",
101
+ title: "Test",
102
+ custom: { workspaceId: "ws-1" },
103
+ },
104
+ ],
105
+ })),
106
+ });
107
+
108
+ const core = createCore(adapter);
109
+ await core.getLoadThreadsPromise();
110
+
111
+ await core.archive("thread-5");
112
+ expect(core.getItemById("thread-5")?.status).toBe("archived");
113
+ expect(core.getItemById("thread-5")?.custom).toEqual({
114
+ workspaceId: "ws-1",
115
+ });
116
+
117
+ await core.unarchive("thread-5");
118
+ expect(core.getItemById("thread-5")?.status).toBe("regular");
119
+ expect(core.getItemById("thread-5")?.custom).toEqual({
120
+ workspaceId: "ws-1",
121
+ });
122
+ });
123
+ });