@assistant-ui/core 0.3.17 → 0.3.19

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 (470) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +5 -4
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/adapters/speech.d.ts.map +1 -1
  5. package/dist/adapters/speech.js +13 -3
  6. package/dist/adapters/speech.js.map +1 -1
  7. package/dist/adapters/thread-history.d.ts +4 -0
  8. package/dist/adapters/thread-history.d.ts.map +1 -1
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/internal.d.ts +4 -3
  12. package/dist/internal.js +3 -2
  13. package/dist/model-context/frame/host.d.ts.map +1 -1
  14. package/dist/model-context/frame/host.js +35 -14
  15. package/dist/model-context/frame/host.js.map +1 -1
  16. package/dist/model-context/frame/provider.d.ts +2 -0
  17. package/dist/model-context/frame/provider.d.ts.map +1 -1
  18. package/dist/model-context/frame/provider.js +30 -7
  19. package/dist/model-context/frame/provider.js.map +1 -1
  20. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  21. package/dist/model-context/interactable-composer-metadata.js +27 -18
  22. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  23. package/dist/model-context/registry.d.ts.map +1 -1
  24. package/dist/model-context/registry.js +3 -5
  25. package/dist/model-context/registry.js.map +1 -1
  26. package/dist/model-context/types.d.ts.map +1 -1
  27. package/dist/model-context/types.js +5 -4
  28. package/dist/model-context/types.js.map +1 -1
  29. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  30. package/dist/react/adapters/LocalStorageThreadListAdapter.js +45 -7
  31. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  32. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  33. package/dist/react/client/DataRenderers.js +20 -15
  34. package/dist/react/client/DataRenderers.js.map +1 -1
  35. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  36. package/dist/react/client/InMemoryThreadList.js +62 -56
  37. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  38. package/dist/react/client/Interactables.d.ts.map +1 -1
  39. package/dist/react/client/Interactables.js +35 -32
  40. package/dist/react/client/Interactables.js.map +1 -1
  41. package/dist/react/client/RemoteThreadList.d.ts +1 -0
  42. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  43. package/dist/react/client/RemoteThreadList.js +154 -143
  44. package/dist/react/client/RemoteThreadList.js.map +1 -1
  45. package/dist/react/client/Tools.d.ts.map +1 -1
  46. package/dist/react/client/Tools.js +18 -16
  47. package/dist/react/client/Tools.js.map +1 -1
  48. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  49. package/dist/react/client/interactable-model-context.js +3 -2
  50. package/dist/react/client/interactable-model-context.js.map +1 -1
  51. package/dist/react/index.d.ts +2 -2
  52. package/dist/react/index.js +2 -2
  53. package/dist/react/interactables-legacy/Interactables.js +242 -121
  54. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  55. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  56. package/dist/react/interactables-legacy/useAssistantInteractable.js +3 -0
  57. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  58. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  59. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  60. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  61. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  62. package/dist/react/model-context/makeAssistantTool.js +1 -1
  63. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  64. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  65. package/dist/react/model-context/useAssistantTool.js +1 -1
  66. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  67. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  68. package/dist/react/model-context/useInteractable.js +4 -1
  69. package/dist/react/model-context/useInteractable.js.map +1 -1
  70. package/dist/react/model-context/useInteractableVersions.js +1 -1
  71. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  72. package/dist/react/model-context/useToolArgsStatus.js +2 -1
  73. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  74. package/dist/react/primitives/message/MessageGroupedParts.d.ts +11 -2
  75. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  76. package/dist/react/primitives/message/MessageGroupedParts.js +3 -2
  77. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  78. package/dist/react/primitives/part/PartMessages.d.ts +1 -0
  79. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  80. package/dist/react/primitives/part/PartMessages.js +1 -0
  81. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  82. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  83. package/dist/react/primitives/thread/ThreadMessages.js +6 -5
  84. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  86. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +16 -8
  87. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  88. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
  89. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  90. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +105 -104
  91. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  92. package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -0
  93. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  94. package/dist/react/runtimes/RemoteThreadResource.js +13 -11
  95. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  96. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +5 -24
  97. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  98. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +354 -226
  99. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  100. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -0
  101. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  102. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +22 -2
  103. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  104. package/dist/react/runtimes/cloud/auiV0.d.ts +40 -15
  105. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  106. package/dist/react/runtimes/cloud/auiV0.js +62 -15
  107. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  108. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +2 -1
  109. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  110. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +6 -1
  111. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
  112. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +6 -0
  113. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -0
  114. package/dist/react/runtimes/cloud/sdkIdentity.js +9 -0
  115. package/dist/react/runtimes/cloud/sdkIdentity.js.map +1 -0
  116. package/dist/react/runtimes/external-message-converter.d.ts +12 -2
  117. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  118. package/dist/react/runtimes/external-message-converter.js +26 -61
  119. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  120. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  121. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  122. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  123. package/dist/react/runtimes/useRemoteThreadListRuntime.js +64 -24
  124. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  125. package/dist/react/utils/groupParts.d.ts +6 -1
  126. package/dist/react/utils/groupParts.d.ts.map +1 -1
  127. package/dist/react/utils/groupParts.js +6 -0
  128. package/dist/react/utils/groupParts.js.map +1 -1
  129. package/dist/react/utils/useJSONEqual.d.ts +3 -1
  130. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  131. package/dist/react/utils/useJSONEqual.js +6 -1
  132. package/dist/react/utils/useJSONEqual.js.map +1 -1
  133. package/dist/react/utils/useJSONSchemaDependency.d.ts +7 -0
  134. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -0
  135. package/dist/react/utils/useJSONSchemaDependency.js +20 -0
  136. package/dist/react/utils/useJSONSchemaDependency.js.map +1 -0
  137. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  138. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  139. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  140. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  141. package/dist/runtime/api/thread-list-runtime.d.ts +3 -0
  142. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  143. package/dist/runtime/api/thread-list-runtime.js +18 -14
  144. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  145. package/dist/runtime/api/thread-runtime.d.ts +4 -0
  146. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  147. package/dist/runtime/api/thread-runtime.js +3 -6
  148. package/dist/runtime/api/thread-runtime.js.map +1 -1
  149. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -0
  150. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  151. package/dist/runtime/base/base-composer-runtime-core.js +62 -22
  152. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  153. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -0
  154. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  155. package/dist/runtime/base/base-thread-runtime-core.js +161 -69
  156. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  157. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  158. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  159. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -1
  160. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  161. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  162. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  163. package/dist/runtime/queue/message-queue.d.ts +5 -0
  164. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  165. package/dist/runtime/queue/message-queue.js +61 -6
  166. package/dist/runtime/queue/message-queue.js.map +1 -1
  167. package/dist/runtime/utils/auto-status.d.ts +6 -2
  168. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  169. package/dist/runtime/utils/auto-status.js +12 -4
  170. package/dist/runtime/utils/auto-status.js.map +1 -1
  171. package/dist/runtime/utils/external-message-conversion.d.ts +16 -4
  172. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  173. package/dist/runtime/utils/external-message-conversion.js +49 -13
  174. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  175. package/dist/runtime/utils/message-repository.d.ts +1 -0
  176. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  177. package/dist/runtime/utils/message-repository.js +18 -9
  178. package/dist/runtime/utils/message-repository.js.map +1 -1
  179. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  180. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  181. package/dist/runtime/utils/thread-message-like.js +5 -3
  182. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  183. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  184. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  185. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  186. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  187. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +8 -1
  188. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  189. package/dist/runtimes/internal.d.ts +3 -3
  190. package/dist/runtimes/internal.js +2 -2
  191. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  192. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  193. package/dist/runtimes/local/local-thread-runtime-core.js +4 -1
  194. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  195. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  196. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  197. package/dist/runtimes/remote-thread-list/remote-thread-state.js +130 -42
  198. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  199. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  200. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  201. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  202. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  203. package/dist/runtimes/remote-thread-list/title.d.ts +3 -1
  204. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  205. package/dist/runtimes/remote-thread-list/title.js +9 -1
  206. package/dist/runtimes/remote-thread-list/title.js.map +1 -1
  207. package/dist/runtimes/remote-thread-list/types.d.ts +10 -0
  208. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  209. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  210. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -1
  211. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  212. package/dist/store/clients/external-thread.d.ts.map +1 -1
  213. package/dist/store/clients/external-thread.js +260 -203
  214. package/dist/store/clients/external-thread.js.map +1 -1
  215. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  216. package/dist/store/clients/model-context-client.js +2 -1
  217. package/dist/store/clients/model-context-client.js.map +1 -1
  218. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  219. package/dist/store/clients/single-thread-list.js +1 -0
  220. package/dist/store/clients/single-thread-list.js.map +1 -1
  221. package/dist/store/clients/suggestions.d.ts.map +1 -1
  222. package/dist/store/clients/suggestions.js +5 -4
  223. package/dist/store/clients/suggestions.js.map +1 -1
  224. package/dist/store/clients/thread-tasks.d.ts +13 -0
  225. package/dist/store/clients/thread-tasks.d.ts.map +1 -0
  226. package/dist/store/clients/thread-tasks.js +69 -0
  227. package/dist/store/clients/thread-tasks.js.map +1 -0
  228. package/dist/store/index.d.ts +3 -2
  229. package/dist/store/index.js +3 -3
  230. package/dist/store/primitive-predicates.d.ts.map +1 -1
  231. package/dist/store/primitive-predicates.js +4 -4
  232. package/dist/store/primitive-predicates.js.map +1 -1
  233. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  234. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  235. package/dist/store/runtime-clients/composer-runtime-client.js +97 -61
  236. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  237. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  238. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  239. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  240. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  241. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  242. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
  243. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  244. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  245. package/dist/store/runtime-clients/thread-list-runtime-client.js +54 -52
  246. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  247. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  248. package/dist/store/runtime-clients/thread-runtime-client.js +246 -126
  249. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  250. package/dist/store/scope-registration.d.ts +2 -0
  251. package/dist/store/scope-registration.d.ts.map +1 -1
  252. package/dist/store/scopes/composer.d.ts +10 -2
  253. package/dist/store/scopes/composer.d.ts.map +1 -1
  254. package/dist/store/scopes/message.d.ts +30 -1
  255. package/dist/store/scopes/message.d.ts.map +1 -1
  256. package/dist/store/scopes/task.d.ts +36 -0
  257. package/dist/store/scopes/task.d.ts.map +1 -0
  258. package/dist/store/scopes/task.js +0 -0
  259. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  260. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  261. package/dist/store/scopes/thread.d.ts +28 -0
  262. package/dist/store/scopes/thread.d.ts.map +1 -1
  263. package/dist/store/scopes/threads.d.ts +1 -0
  264. package/dist/store/scopes/threads.d.ts.map +1 -1
  265. package/dist/subscribable/subscribable.d.ts +2 -1
  266. package/dist/subscribable/subscribable.d.ts.map +1 -1
  267. package/dist/subscribable/subscribable.js +23 -15
  268. package/dist/subscribable/subscribable.js.map +1 -1
  269. package/dist/types/attachment.d.ts +2 -1
  270. package/dist/types/attachment.d.ts.map +1 -1
  271. package/dist/types/attachment.js +2 -1
  272. package/dist/types/attachment.js.map +1 -1
  273. package/dist/types/index.d.ts +2 -2
  274. package/dist/types/message.d.ts +8 -1
  275. package/dist/types/message.d.ts.map +1 -1
  276. package/dist/types/message.js.map +1 -1
  277. package/dist/utils/abortable-iterable.d.ts +19 -0
  278. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  279. package/dist/utils/abortable-iterable.js +88 -0
  280. package/dist/utils/abortable-iterable.js.map +1 -0
  281. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  282. package/dist/utils/composite-context-provider.js +20 -2
  283. package/dist/utils/composite-context-provider.js.map +1 -1
  284. package/dist/utils/getGroupStatus.d.ts +18 -2
  285. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  286. package/dist/utils/getGroupStatus.js +32 -7
  287. package/dist/utils/getGroupStatus.js.map +1 -1
  288. package/dist/utils/record.d.ts +11 -0
  289. package/dist/utils/record.d.ts.map +1 -0
  290. package/dist/utils/record.js +12 -0
  291. package/dist/utils/record.js.map +1 -0
  292. package/dist/utils/wire-media.d.ts.map +1 -1
  293. package/dist/utils/wire-media.js +2 -2
  294. package/dist/utils/wire-media.js.map +1 -1
  295. package/package.json +11 -11
  296. package/src/adapters/attachment.test.ts +50 -1
  297. package/src/adapters/attachment.ts +7 -4
  298. package/src/adapters/speech.test.ts +236 -0
  299. package/src/adapters/speech.ts +17 -10
  300. package/src/adapters/thread-history.ts +3 -0
  301. package/src/index.ts +2 -0
  302. package/src/internal.ts +4 -0
  303. package/src/model-context/frame/host.test.ts +137 -1
  304. package/src/model-context/frame/host.ts +49 -16
  305. package/src/model-context/frame/provider.test.ts +71 -0
  306. package/src/model-context/frame/provider.ts +37 -7
  307. package/src/model-context/interactable-composer-metadata.test.ts +58 -0
  308. package/src/model-context/interactable-composer-metadata.ts +19 -13
  309. package/src/model-context/registry.test.ts +12 -0
  310. package/src/model-context/registry.ts +3 -2
  311. package/src/model-context/types.test.ts +25 -0
  312. package/src/model-context/types.ts +9 -4
  313. package/src/react/RuntimeAdapter.test.ts +34 -0
  314. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +244 -0
  315. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +104 -7
  316. package/src/react/client/DataRenderers.test.tsx +45 -0
  317. package/src/react/client/DataRenderers.ts +13 -9
  318. package/src/react/client/InMemoryThreadList.ts +1 -0
  319. package/src/react/client/Interactables.test.ts +72 -1
  320. package/src/react/client/Interactables.ts +22 -14
  321. package/src/react/client/RemoteThreadList.background.test.ts +148 -6
  322. package/src/react/client/RemoteThreadList.concurrent.test.tsx +42 -1
  323. package/src/react/client/RemoteThreadList.test.ts +386 -4
  324. package/src/react/client/RemoteThreadList.ts +181 -112
  325. package/src/react/client/Tools.ts +22 -11
  326. package/src/react/client/interactable-model-context.test.ts +44 -0
  327. package/src/react/client/interactable-model-context.ts +3 -2
  328. package/src/react/index.ts +5 -1
  329. package/src/react/interactables-legacy/Interactables.ts +16 -16
  330. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +132 -0
  331. package/src/react/interactables-legacy/useAssistantInteractable.ts +10 -1
  332. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  333. package/src/react/model-context/makeAssistantTool.ts +2 -2
  334. package/src/react/model-context/useAssistantTool.ts +2 -2
  335. package/src/react/model-context/useInteractable.test.tsx +177 -0
  336. package/src/react/model-context/useInteractable.ts +3 -0
  337. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  338. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  339. package/src/react/primitive-hooks/useActionBarCopy.test.ts +0 -1
  340. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +0 -1
  341. package/src/react/primitives/message/MessageGroupedParts.test.tsx +96 -0
  342. package/src/react/primitives/message/MessageGroupedParts.tsx +15 -4
  343. package/src/react/primitives/part/PartMessages.test.tsx +104 -1
  344. package/src/react/primitives/part/PartMessages.tsx +1 -0
  345. package/src/react/primitives/thread/ThreadMessages.test.tsx +142 -0
  346. package/src/react/primitives/thread/ThreadMessages.tsx +8 -5
  347. package/src/react/providers/ReadonlyThreadProvider.test.tsx +56 -0
  348. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  349. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +33 -0
  350. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  351. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +28 -5
  352. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  353. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +105 -0
  354. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +143 -112
  355. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  356. package/src/react/runtimes/RemoteThreadResource.ts +19 -12
  357. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +20 -14
  358. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +703 -6
  359. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +492 -402
  360. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +77 -0
  361. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +27 -1
  362. package/src/react/runtimes/cloud/auiV0.ts +160 -25
  363. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +36 -0
  364. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +8 -1
  365. package/src/react/runtimes/cloud/sdkIdentity.ts +9 -0
  366. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +18 -4
  367. package/src/react/runtimes/external-message-converter.test.ts +136 -1
  368. package/src/react/runtimes/external-message-converter.ts +39 -93
  369. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  370. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  371. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  372. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  373. package/src/react/runtimes/useRemoteThreadListRuntime.ts +34 -1
  374. package/src/react/utils/groupParts.ts +12 -1
  375. package/src/react/utils/useJSONEqual.ts +9 -0
  376. package/src/react/utils/useJSONSchemaDependency.ts +22 -0
  377. package/src/runtime/api/message-runtime.test.ts +75 -0
  378. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  379. package/src/runtime/api/thread-list-runtime.ts +21 -11
  380. package/src/runtime/api/thread-runtime.test.ts +136 -0
  381. package/src/runtime/api/thread-runtime.ts +10 -5
  382. package/src/runtime/base/base-composer-runtime-core.ts +105 -24
  383. package/src/runtime/base/base-thread-runtime-core.test.ts +1063 -2
  384. package/src/runtime/base/base-thread-runtime-core.ts +228 -87
  385. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  386. package/src/runtime/interfaces/thread-list-runtime-core.ts +5 -1
  387. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  388. package/src/runtime/queue/message-queue.ts +68 -6
  389. package/src/runtime/utils/auto-status.test.ts +112 -1
  390. package/src/runtime/utils/auto-status.ts +31 -5
  391. package/src/runtime/utils/external-message-conversion.test.ts +202 -0
  392. package/src/runtime/utils/external-message-conversion.ts +123 -32
  393. package/src/runtime/utils/message-repository.test.ts +49 -0
  394. package/src/runtime/utils/message-repository.ts +32 -20
  395. package/src/runtime/utils/thread-message-like.test.ts +52 -0
  396. package/src/runtime/utils/thread-message-like.ts +5 -1
  397. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  398. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -1
  399. package/src/runtimes/internal.ts +1 -0
  400. package/src/runtimes/local/local-thread-runtime-core.test.ts +21 -0
  401. package/src/runtimes/local/local-thread-runtime-core.ts +11 -1
  402. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +128 -2
  403. package/src/runtimes/remote-thread-list/remote-thread-state.ts +182 -42
  404. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  405. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  406. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  407. package/src/runtimes/remote-thread-list/title.ts +13 -0
  408. package/src/runtimes/remote-thread-list/types.ts +10 -0
  409. package/src/runtimes/tool-invocations/EDGE_CASES.md +2 -6
  410. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +133 -0
  411. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +10 -6
  412. package/src/store/clients/external-thread.ts +67 -4
  413. package/src/store/clients/model-context-client.ts +5 -1
  414. package/src/store/clients/single-thread-list.ts +1 -0
  415. package/src/store/clients/suggestions.test.ts +40 -0
  416. package/src/store/clients/suggestions.ts +13 -10
  417. package/src/store/clients/thread-tasks.test.ts +274 -0
  418. package/src/store/clients/thread-tasks.ts +138 -0
  419. package/src/store/index.ts +8 -0
  420. package/src/store/primitive-predicates.test.ts +48 -5
  421. package/src/store/primitive-predicates.ts +7 -2
  422. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  423. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  424. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  425. package/src/store/runtime-clients/thread-list-runtime-client.ts +1 -0
  426. package/src/store/runtime-clients/thread-runtime-client.ts +89 -11
  427. package/src/store/scope-registration.ts +2 -0
  428. package/src/store/scopes/composer.ts +16 -4
  429. package/src/store/scopes/message.ts +14 -0
  430. package/src/store/scopes/task.ts +34 -0
  431. package/src/store/scopes/thread-list-item.ts +5 -2
  432. package/src/store/scopes/thread.ts +20 -0
  433. package/src/store/scopes/threads.ts +1 -0
  434. package/src/store/thread-tasks.test.tsx +209 -0
  435. package/src/subscribable/subscribable.test.ts +156 -1
  436. package/src/subscribable/subscribable.ts +25 -15
  437. package/src/tests/MessageRepository.test.ts +117 -5
  438. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  439. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  440. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +47 -0
  441. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  442. package/src/tests/attachment-adapters.test.ts +14 -0
  443. package/src/tests/auiV0Encode.test.ts +300 -0
  444. package/src/tests/base-composer-runtime-core-send.test.ts +51 -0
  445. package/src/tests/base-composer-runtime-core.test.ts +353 -2
  446. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  447. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +178 -18
  448. package/src/tests/external-thread-attachments.test.tsx +208 -0
  449. package/src/tests/external-thread-parity.test.tsx +57 -0
  450. package/src/tests/groupParts.test.ts +71 -0
  451. package/src/tests/message-queue.test.ts +253 -0
  452. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  453. package/src/tests/remote-thread-list-reactive-threadId.test.ts +51 -0
  454. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  455. package/src/tests/thread-switch-events.test.tsx +78 -0
  456. package/src/tests/tools-scope-migration.test.tsx +28 -0
  457. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +43 -0
  458. package/src/types/attachment.ts +4 -0
  459. package/src/types/index.ts +1 -0
  460. package/src/types/message.ts +8 -0
  461. package/src/utils/abortable-iterable.test.ts +328 -0
  462. package/src/utils/abortable-iterable.ts +104 -0
  463. package/src/utils/composite-context-provider.test.ts +25 -0
  464. package/src/utils/composite-context-provider.ts +23 -2
  465. package/src/utils/getGroupStatus.test.ts +70 -4
  466. package/src/utils/getGroupStatus.ts +35 -12
  467. package/src/utils/record.test.ts +48 -0
  468. package/src/utils/record.ts +11 -0
  469. package/src/utils/wire-media.test.ts +10 -0
  470. package/src/utils/wire-media.ts +6 -2
@@ -1,14 +1,15 @@
1
+ import { invokeUserCallback } from "../../utils/invoke-user-callback.js";
1
2
  import { OptimisticState } from "../../runtimes/remote-thread-list/optimistic-state.js";
2
- import { classifyThreads, createEmptyRemoteThreadState, createThreadMappingId, getThreadData, normalizeCursor, preserveMidLoadTransitions, seedNewThread, statusSnapshot, updateStatusReducer } from "../../runtimes/remote-thread-list/remote-thread-state.js";
3
+ import { classifyThreads, createEmptyRemoteThreadState, createThreadMappingId, getThreadData, normalizeCursor, preserveMidLoadTransitions, promoteNewThreadReducer, reconcileInitializedThread, seedNewThread, statusSnapshot, updateStatusReducer } from "../../runtimes/remote-thread-list/remote-thread-state.js";
3
4
  import { handleThreadListAction } from "../../store/runtime-clients/handle-thread-list-action.js";
4
5
  import { useThreadSelectionEvents } from "../../store/clients/thread-selection-events.js";
5
6
  import { isDevelopment } from "../../store/env.js";
6
7
  import { inMemoryThreadListTransformScopes } from "./InMemoryThreadList.js";
7
8
  import { ThreadListAdapterChangedError } from "../../runtimes/remote-thread-list/adapter-changed.js";
8
9
  import { AdaptedRemoteThread } from "./AdaptedRemoteThread.js";
9
- import { isTitleSourceMessage } from "../../runtimes/remote-thread-list/title.js";
10
+ import { applyTitleStream, isTitleSourceMessage } from "../../runtimes/remote-thread-list/title.js";
11
+ import { clearThreadTitleState, finishThreadTitleRename, runThreadTitleGeneration, startThreadTitleRename } from "../../runtimes/remote-thread-list/title-generation.js";
10
12
  import { Derived, attachTransformScopes, useAssistantContextProvider, useAssistantContextValue, useClientLookup, useClientResource, useConfiguredAui } from "@assistant-ui/store/client";
11
- import { AssistantMessageStream } from "assistant-stream";
12
13
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
13
14
  import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "@assistant-ui/tap/react-shim";
14
15
  import { resource, withKey } from "@assistant-ui/tap";
@@ -21,10 +22,6 @@ const toInitializeResult = (result) => ({
21
22
  remoteId: result.remoteId,
22
23
  externalId: result.externalId
23
24
  });
24
- const applyTitleStream = async (stream, onTitle) => {
25
- const messageStream = AssistantMessageStream.fromAssistantStream(stream);
26
- for await (const result of messageStream) await onTitle(result.parts.filter((part) => part.type === "text")[0]?.text);
27
- };
28
25
  const useThreadListItemClient = (props) => {
29
26
  const $ = c(22);
30
27
  const { data, isRunning, onSwitchTo, onRename, onUpdateCustom, onArchive, onUnarchive, onDelete, onGenerateTitle, onInitialize, onDetach } = props;
@@ -140,7 +137,7 @@ const useRemoteThreadBody = ({ id, status, remoteId, item, thread }) => {
140
137
  useEffect(() => {
141
138
  if (!hasTitleSource || titleFiredRef.current) return;
142
139
  titleFiredRef.current = true;
143
- client.threadListItem.generateTitle();
140
+ client.threadListItem.generateTitle({ automatic: true });
144
141
  }, [hasTitleSource]);
145
142
  return body.methods;
146
143
  });
@@ -203,7 +200,7 @@ const useRemoteThreadListView = (t0) => {
203
200
  onArchive: () => handleThreadListAction("archive", () => onArchive(data_0.id)),
204
201
  onUnarchive: () => handleThreadListAction("unarchive", () => onUnarchive(data_0.id)),
205
202
  onDelete: () => handleThreadListAction("delete", () => onDelete(data_0.id)),
206
- onGenerateTitle: () => handleThreadListAction("generate title", () => onGenerateTitle(data_0.id, backgroundThreads ? bodyStateOf(data_0.id)?.messages : mainThreadClient.state.messages)),
203
+ onGenerateTitle: (options_0) => handleThreadListAction("generate title", () => onGenerateTitle(data_0.id, backgroundThreads ? bodyStateOf(data_0.id)?.messages : mainThreadClient.state.messages, options_0)),
207
204
  onInitialize: () => onInitialize(data_0.id),
208
205
  onDetach: () => handleThreadListAction("detach", () => onDetach(data_0.id))
209
206
  });
@@ -297,6 +294,7 @@ const useRemoteThreadList = (props) => {
297
294
  adapter,
298
295
  adapterAtLoad: adapter,
299
296
  adapterGeneration: 0,
297
+ titleStates: /* @__PURE__ */ new Map(),
300
298
  loadGeneration: 0,
301
299
  switchGeneration: 0,
302
300
  loadPromise: void 0,
@@ -339,7 +337,7 @@ const useRemoteThreadList = (props) => {
339
337
  const notifyRemoteId = useCallback((remoteId, emit) => {
340
338
  if (session.lastNotifiedRemoteId === remoteId) return;
341
339
  session.lastNotifiedRemoteId = remoteId;
342
- if (emit) session.onThreadIdChange?.(remoteId);
340
+ if (emit) invokeUserCallback("assistant-ui", "onThreadIdChange", session.onThreadIdChange, remoteId);
343
341
  }, [session]);
344
342
  const getLoadThreadsPromise = useCallback(() => {
345
343
  if (session.loadPromise) return session.loadPromise;
@@ -352,7 +350,8 @@ const useRemoteThreadList = (props) => {
352
350
  if (generation !== session.loadGeneration) return state;
353
351
  return {
354
352
  ...state,
355
- isLoading: true
353
+ isLoading: true,
354
+ loadError: void 0
356
355
  };
357
356
  },
358
357
  then: (state_0, page) => {
@@ -367,6 +366,7 @@ const useRemoteThreadList = (props) => {
367
366
  const merged = {
368
367
  ...state_0,
369
368
  isLoading: false,
369
+ loadError: void 0,
370
370
  cursor: normalizeCursor(page.nextCursor),
371
371
  threadIds: fresh.threadIds,
372
372
  archivedThreadIds: fresh.archivedThreadIds,
@@ -381,7 +381,8 @@ const useRemoteThreadList = (props) => {
381
381
  session.loadPromise = void 0;
382
382
  store.update({
383
383
  ...store.baseValue,
384
- isLoading: false
384
+ isLoading: false,
385
+ loadError: error
385
386
  });
386
387
  }).then(() => {});
387
388
  return session.loadPromise;
@@ -393,6 +394,7 @@ const useRemoteThreadList = (props) => {
393
394
  session.loadMorePromise = void 0;
394
395
  if (adapterChanged) {
395
396
  session.adapterGeneration++;
397
+ session.titleStates.clear();
396
398
  session.switchGeneration++;
397
399
  session.switchTask = void 0;
398
400
  session.adapterAtLoad = adapter;
@@ -417,6 +419,21 @@ const useRemoteThreadList = (props) => {
417
419
  session,
418
420
  store
419
421
  ]);
422
+ useEffect(() => {
423
+ if (typeof window === "undefined" || typeof document === "undefined") return;
424
+ const retryAfterError = () => {
425
+ if (store.value.loadError !== void 0) getLoadThreadsPromise();
426
+ };
427
+ const retryAfterVisible = () => {
428
+ if (document.visibilityState === "visible") retryAfterError();
429
+ };
430
+ window.addEventListener("online", retryAfterError);
431
+ document.addEventListener("visibilitychange", retryAfterVisible);
432
+ return () => {
433
+ window.removeEventListener("online", retryAfterError);
434
+ document.removeEventListener("visibilitychange", retryAfterVisible);
435
+ };
436
+ }, [getLoadThreadsPromise, store]);
420
437
  useEffect(() => {
421
438
  getLoadThreadsPromise();
422
439
  }, [getLoadThreadsPromise]);
@@ -609,60 +626,30 @@ const useRemoteThreadList = (props) => {
609
626
  requireAdapterGeneration(adapterGeneration);
610
627
  return result;
611
628
  }
629
+ requireAdapterGeneration(adapterGeneration);
630
+ const initializeTask = currentAdapter_0.initialize(threadId_1);
631
+ let removedMappingId;
632
+ let replacementMainThreadId;
612
633
  const result_0 = await store.optimisticUpdate({
613
- execute: () => {
614
- requireAdapterGeneration(adapterGeneration);
615
- return currentAdapter_0.initialize(threadId_1);
616
- },
617
- optimistic: (state_5) => updateStatusReducer(state_5, threadId_1, "regular"),
618
- loading: (state_6, task_1) => {
619
- const mappingId_0 = createThreadMappingId(threadId_1);
620
- return {
621
- ...state_6,
622
- threadData: {
623
- ...state_6.threadData,
624
- [mappingId_0]: {
625
- ...state_6.threadData[mappingId_0],
626
- initializeTask: task_1
627
- }
628
- }
629
- };
630
- },
631
- then: (state_7, { remoteId: remoteId_1, externalId }) => {
632
- if (adapterGeneration !== session.adapterGeneration) return state_7;
633
- const data_1 = getThreadData(state_7, threadId_1);
634
- if (!data_1) return state_7;
635
- const mappingId_1 = createThreadMappingId(threadId_1);
636
- const listedMappingId = state_7.threadIdMap[remoteId_1];
637
- const orphan = listedMappingId !== void 0 && listedMappingId !== mappingId_1 ? state_7.threadData[listedMappingId] : void 0;
638
- const threadData = { ...state_7.threadData };
639
- if (orphan !== void 0) delete threadData[listedMappingId];
640
- threadData[mappingId_1] = {
641
- ...data_1,
642
- initializeTask: Promise.resolve({
643
- remoteId: remoteId_1,
644
- externalId
645
- }),
646
- remoteId: remoteId_1,
647
- externalId
648
- };
649
- const rewire = (ids) => orphan === void 0 ? ids : ids.filter((id_2) => id_2 !== orphan.id);
650
- return {
651
- ...state_7,
652
- threadIds: rewire(state_7.threadIds),
653
- archivedThreadIds: rewire(state_7.archivedThreadIds),
654
- threadIdMap: {
655
- ...state_7.threadIdMap,
656
- [remoteId_1]: mappingId_1
657
- },
658
- threadData
659
- };
634
+ execute: () => initializeTask,
635
+ optimistic: (state_5) => promoteNewThreadReducer(state_5, threadId_1, initializeTask),
636
+ then: (state_6, { remoteId: remoteId_1, externalId }) => {
637
+ if (adapterGeneration !== session.adapterGeneration) return state_6;
638
+ const retainedThreadId = backgroundThreads ? threadId_1 : session.mainThreadId;
639
+ const reconciliation = reconcileInitializedThread(state_6, threadId_1, remoteId_1, externalId, retainedThreadId);
640
+ removedMappingId = reconciliation.removedMappingId;
641
+ if (removedMappingId === session.mainThreadId) replacementMainThreadId = reconciliation.survivorMappingId;
642
+ return reconciliation.state;
660
643
  }
661
644
  });
662
645
  requireAdapterGeneration(adapterGeneration);
646
+ if (removedMappingId !== void 0) setStartedIds((prev_0) => prev_0.filter((startedId) => startedId !== removedMappingId));
647
+ if (replacementMainThreadId !== void 0 && session.mainThreadId === removedMappingId) assignMainThreadId(replacementMainThreadId);
663
648
  if (threadId_1 === session.mainThreadId) notifyRemoteId(result_0.remoteId, true);
664
649
  return toInitializeResult(result_0);
665
650
  }, [
651
+ assignMainThreadId,
652
+ backgroundThreads,
666
653
  notifyRemoteId,
667
654
  requireAdapterGeneration,
668
655
  session,
@@ -671,22 +658,23 @@ const useRemoteThreadList = (props) => {
671
658
  const rename = useCallback((threadIdOrRemoteId_0, newTitle) => {
672
659
  const currentAdapter_1 = session.adapter;
673
660
  const adapterGeneration_0 = session.adapterGeneration;
674
- const data_2 = getThreadData(store.value, threadIdOrRemoteId_0);
675
- if (!data_2) throw threadNotFoundError(threadIdOrRemoteId_0, "renaming it");
676
- if (data_2.status === "new") throw threadStatusError(threadIdOrRemoteId_0, data_2.status, "be renamed");
661
+ const data_1 = getThreadData(store.value, threadIdOrRemoteId_0);
662
+ if (!data_1) throw threadNotFoundError(threadIdOrRemoteId_0, "renaming it");
663
+ if (data_1.status === "new") throw threadStatusError(threadIdOrRemoteId_0, data_1.status, "be renamed");
664
+ const claim = startThreadTitleRename(session.titleStates, data_1.id, newTitle);
677
665
  return store.optimisticUpdate({
678
666
  execute: async () => {
679
- const { remoteId: remoteId_2 } = await data_2.initializeTask;
667
+ const { remoteId: remoteId_2 } = await data_1.initializeTask;
680
668
  requireAdapterGeneration(adapterGeneration_0);
681
669
  return currentAdapter_1.rename(remoteId_2, newTitle);
682
670
  },
683
- optimistic: (state_8) => {
684
- const current_0 = getThreadData(state_8, threadIdOrRemoteId_0);
685
- if (!current_0) return state_8;
671
+ optimistic: (state_7) => {
672
+ const current_0 = getThreadData(state_7, threadIdOrRemoteId_0);
673
+ if (!current_0) return state_7;
686
674
  return {
687
- ...state_8,
675
+ ...state_7,
688
676
  threadData: {
689
- ...state_8.threadData,
677
+ ...state_7.threadData,
690
678
  [current_0.id]: {
691
679
  ...current_0,
692
680
  title: newTitle
@@ -694,6 +682,12 @@ const useRemoteThreadList = (props) => {
694
682
  }
695
683
  };
696
684
  }
685
+ }).then((result_1) => {
686
+ finishThreadTitleRename(session.titleStates, data_1.id, claim, true);
687
+ return result_1;
688
+ }, (error_4) => {
689
+ finishThreadTitleRename(session.titleStates, data_1.id, claim, false);
690
+ throw error_4;
697
691
  });
698
692
  }, [
699
693
  requireAdapterGeneration,
@@ -703,24 +697,24 @@ const useRemoteThreadList = (props) => {
703
697
  const updateCustom = useCallback((threadIdOrRemoteId_1, custom) => {
704
698
  const currentAdapter_2 = session.adapter;
705
699
  const adapterGeneration_1 = session.adapterGeneration;
706
- const data_3 = getThreadData(store.value, threadIdOrRemoteId_1);
707
- if (!data_3) throw threadNotFoundError(threadIdOrRemoteId_1, "updating its custom metadata");
708
- if (data_3.status === "new") throw threadStatusError(threadIdOrRemoteId_1, data_3.status, "update custom metadata");
700
+ const data_2 = getThreadData(store.value, threadIdOrRemoteId_1);
701
+ if (!data_2) throw threadNotFoundError(threadIdOrRemoteId_1, "updating its custom metadata");
702
+ if (data_2.status === "new") throw threadStatusError(threadIdOrRemoteId_1, data_2.status, "update custom metadata");
709
703
  if (!currentAdapter_2.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
710
704
  return store.optimisticUpdate({
711
705
  execute: async () => {
712
- const { remoteId: remoteId_3 } = await data_3.initializeTask;
706
+ const { remoteId: remoteId_3 } = await data_2.initializeTask;
713
707
  requireAdapterGeneration(adapterGeneration_1);
714
708
  if (!currentAdapter_2.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
715
709
  return currentAdapter_2.updateCustom(remoteId_3, custom);
716
710
  },
717
- optimistic: (state_9) => {
718
- const current_1 = getThreadData(state_9, threadIdOrRemoteId_1);
719
- if (!current_1) return state_9;
711
+ optimistic: (state_8) => {
712
+ const current_1 = getThreadData(state_8, threadIdOrRemoteId_1);
713
+ if (!current_1) return state_8;
720
714
  return {
721
- ...state_9,
715
+ ...state_8,
722
716
  threadData: {
723
- ...state_9.threadData,
717
+ ...state_8.threadData,
724
718
  [current_1.id]: {
725
719
  ...current_1,
726
720
  custom
@@ -737,18 +731,18 @@ const useRemoteThreadList = (props) => {
737
731
  const archive = useCallback(async (threadIdOrRemoteId_2) => {
738
732
  const currentAdapter_3 = session.adapter;
739
733
  const adapterGeneration_2 = session.adapterGeneration;
740
- const data_4 = getThreadData(store.value, threadIdOrRemoteId_2);
741
- if (!data_4) throw threadNotFoundError(threadIdOrRemoteId_2, "archiving it");
742
- if (data_4.status !== "regular") throw threadStatusError(threadIdOrRemoteId_2, data_4.status, "be archived");
743
- await ensureNotMain(data_4.id);
734
+ const data_3 = getThreadData(store.value, threadIdOrRemoteId_2);
735
+ if (!data_3) throw threadNotFoundError(threadIdOrRemoteId_2, "archiving it");
736
+ if (data_3.status !== "regular") throw threadStatusError(threadIdOrRemoteId_2, data_3.status, "be archived");
737
+ await ensureNotMain(data_3.id);
744
738
  requireAdapterGeneration(adapterGeneration_2);
745
739
  return store.optimisticUpdate({
746
740
  execute: async () => {
747
- const { remoteId: remoteId_4 } = await data_4.initializeTask;
741
+ const { remoteId: remoteId_4 } = await data_3.initializeTask;
748
742
  requireAdapterGeneration(adapterGeneration_2);
749
743
  return currentAdapter_3.archive(remoteId_4);
750
744
  },
751
- optimistic: (state_10) => updateStatusReducer(state_10, data_4.id, "archived")
745
+ optimistic: (state_9) => updateStatusReducer(state_9, data_3.id, "archived")
752
746
  });
753
747
  }, [
754
748
  ensureNotMain,
@@ -759,21 +753,21 @@ const useRemoteThreadList = (props) => {
759
753
  const unarchive = useCallback((threadIdOrRemoteId_3) => {
760
754
  const currentAdapter_4 = session.adapter;
761
755
  const adapterGeneration_3 = session.adapterGeneration;
762
- const data_5 = getThreadData(store.value, threadIdOrRemoteId_3);
763
- if (!data_5) throw threadNotFoundError(threadIdOrRemoteId_3, "unarchiving it");
764
- if (data_5.status !== "archived") throw threadStatusError(threadIdOrRemoteId_3, data_5.status, "be unarchived");
756
+ const data_4 = getThreadData(store.value, threadIdOrRemoteId_3);
757
+ if (!data_4) throw threadNotFoundError(threadIdOrRemoteId_3, "unarchiving it");
758
+ if (data_4.status !== "archived") throw threadStatusError(threadIdOrRemoteId_3, data_4.status, "be unarchived");
765
759
  return store.optimisticUpdate({
766
760
  execute: async () => {
767
761
  try {
768
- const { remoteId: remoteId_5 } = await data_5.initializeTask;
762
+ const { remoteId: remoteId_5 } = await data_4.initializeTask;
769
763
  requireAdapterGeneration(adapterGeneration_3);
770
764
  return await currentAdapter_4.unarchive(remoteId_5);
771
- } catch (error_4) {
772
- if (adapterGeneration_3 === session.adapterGeneration) await ensureNotMain(data_5.id);
773
- throw error_4;
765
+ } catch (error_5) {
766
+ if (adapterGeneration_3 === session.adapterGeneration) await ensureNotMain(data_4.id);
767
+ throw error_5;
774
768
  }
775
769
  },
776
- optimistic: (state_11) => updateStatusReducer(state_11, data_5.id, "regular")
770
+ optimistic: (state_10) => updateStatusReducer(state_10, data_4.id, "regular")
777
771
  });
778
772
  }, [
779
773
  ensureNotMain,
@@ -784,20 +778,23 @@ const useRemoteThreadList = (props) => {
784
778
  const deleteThread = useCallback(async (threadIdOrRemoteId_4) => {
785
779
  const currentAdapter_5 = session.adapter;
786
780
  const adapterGeneration_4 = session.adapterGeneration;
787
- const data_6 = getThreadData(store.value, threadIdOrRemoteId_4);
788
- if (!data_6) throw threadNotFoundError(threadIdOrRemoteId_4, "deleting it");
789
- if (data_6.status !== "regular" && data_6.status !== "archived") throw threadStatusError(threadIdOrRemoteId_4, data_6.status, "be deleted");
790
- await ensureNotMain(data_6.id);
781
+ const data_5 = getThreadData(store.value, threadIdOrRemoteId_4);
782
+ if (!data_5) throw threadNotFoundError(threadIdOrRemoteId_4, "deleting it");
783
+ if (data_5.status !== "regular" && data_5.status !== "archived") throw threadStatusError(threadIdOrRemoteId_4, data_5.status, "be deleted");
784
+ await ensureNotMain(data_5.id);
791
785
  requireAdapterGeneration(adapterGeneration_4);
792
- onDelete?.(data_6.id);
793
- return store.optimisticUpdate({
786
+ const result_2 = await store.optimisticUpdate({
794
787
  execute: async () => {
795
- const { remoteId: remoteId_6 } = await data_6.initializeTask;
788
+ const { remoteId: remoteId_6 } = await data_5.initializeTask;
796
789
  requireAdapterGeneration(adapterGeneration_4);
797
790
  return currentAdapter_5.delete(remoteId_6);
798
791
  },
799
- optimistic: (state_12) => updateStatusReducer(state_12, data_6.id, "deleted")
792
+ optimistic: (state_11) => updateStatusReducer(state_11, data_5.id, "deleted")
800
793
  });
794
+ if (getThreadData(store.value, data_5.id) !== void 0) return result_2;
795
+ clearThreadTitleState(session.titleStates, data_5.id);
796
+ onDelete?.(data_5.id);
797
+ return result_2;
801
798
  }, [
802
799
  ensureNotMain,
803
800
  onDelete,
@@ -805,37 +802,49 @@ const useRemoteThreadList = (props) => {
805
802
  session,
806
803
  store
807
804
  ]);
808
- const generateTitle = useCallback(async (threadIdOrRemoteId_5, messages) => {
805
+ const generateTitle = useCallback(async (threadIdOrRemoteId_5, messages, options_0) => {
809
806
  const currentAdapter_6 = session.adapter;
810
807
  const adapterGeneration_5 = session.adapterGeneration;
811
- const data_7 = getThreadData(store.value, threadIdOrRemoteId_5);
812
- if (!data_7) throw threadNotFoundError(threadIdOrRemoteId_5, "generating its title");
813
- if (data_7.status === "new") throw threadStatusError(threadIdOrRemoteId_5, data_7.status, "generate a title");
814
- const { remoteId: remoteId_7 } = await data_7.initializeTask;
808
+ const data_6 = getThreadData(store.value, threadIdOrRemoteId_5);
809
+ if (!data_6) throw threadNotFoundError(threadIdOrRemoteId_5, "generating its title");
810
+ if (data_6.status === "new") throw threadStatusError(threadIdOrRemoteId_5, data_6.status, "generate a title");
811
+ const { remoteId: remoteId_7 } = await data_6.initializeTask;
815
812
  requireAdapterGeneration(adapterGeneration_5);
816
- if (!backgroundThreads && !isSameThread(store.value, data_7.id, session.mainThreadId)) return;
813
+ if (!backgroundThreads && !isSameThread(store.value, data_6.id, session.mainThreadId)) return;
817
814
  if (!messages) return;
818
- const stream = await currentAdapter_6.generateTitle(remoteId_7, messages);
819
- requireAdapterGeneration(adapterGeneration_5);
820
- await applyTitleStream(stream, async (newTitle_0) => {
821
- await store.optimisticUpdate({
822
- execute: async () => {},
823
- optimistic: (state_13) => {
824
- if (adapterGeneration_5 !== session.adapterGeneration) return state_13;
825
- const current_2 = getThreadData(state_13, data_7.id);
826
- if (!current_2) return state_13;
827
- return {
828
- ...state_13,
829
- threadData: {
830
- ...state_13.threadData,
831
- [current_2.id]: {
832
- ...current_2,
833
- title: newTitle_0
815
+ await runThreadTitleGeneration({
816
+ states: session.titleStates,
817
+ threadId: data_6.id,
818
+ automatic: options_0?.automatic === true,
819
+ generate: async (onTitle) => {
820
+ const stream = await currentAdapter_6.generateTitle(remoteId_7, messages);
821
+ requireAdapterGeneration(adapterGeneration_5);
822
+ await applyTitleStream(stream, onTitle);
823
+ },
824
+ rename: async (title) => {
825
+ requireAdapterGeneration(adapterGeneration_5);
826
+ await currentAdapter_6.rename(remoteId_7, title);
827
+ },
828
+ applyTitle: async (title_0) => {
829
+ await store.optimisticUpdate({
830
+ execute: async () => {},
831
+ optimistic: (state_12) => {
832
+ if (adapterGeneration_5 !== session.adapterGeneration) return state_12;
833
+ const current_2 = getThreadData(state_12, data_6.id);
834
+ if (!current_2) return state_12;
835
+ return {
836
+ ...state_12,
837
+ threadData: {
838
+ ...state_12.threadData,
839
+ [current_2.id]: {
840
+ ...current_2,
841
+ title: title_0
842
+ }
834
843
  }
835
- }
836
- };
837
- }
838
- });
844
+ };
845
+ }
846
+ });
847
+ }
839
848
  });
840
849
  }, [
841
850
  backgroundThreads,
@@ -845,7 +854,7 @@ const useRemoteThreadList = (props) => {
845
854
  ]);
846
855
  const detach = useCallback(async (threadId_2) => {
847
856
  await ensureNotMain(threadId_2);
848
- setStartedIds((prev_0) => prev_0.filter((id_3) => id_3 !== threadId_2));
857
+ setStartedIds((prev_1) => prev_1.filter((id_2) => id_2 !== threadId_2));
849
858
  }, [ensureNotMain]);
850
859
  const { mainThreadClient, itemOrder, threadListItems } = useRemoteThreadListView({
851
860
  listState,
@@ -854,21 +863,21 @@ const useRemoteThreadList = (props) => {
854
863
  backgroundThreads,
855
864
  threadFactory,
856
865
  useAdapters: adapter.unstable_useAdapters,
857
- onSwitchTo: (id_4, options_0) => switchToThread(id_4, options_0),
858
- onRename: (id_5, title) => rename(id_5, title),
859
- onUpdateCustom: (id_6, custom_0) => updateCustom(id_6, custom_0),
860
- onArchive: (id_7) => archive(id_7),
861
- onUnarchive: (id_8) => unarchive(id_8),
862
- onDelete: (id_9) => deleteThread(id_9),
863
- onGenerateTitle: (id_10, messages_0) => generateTitle(id_10, messages_0),
864
- onInitialize: async (id_11) => toInitializeResult(await initialize(id_11)),
865
- onDetach: (id_12) => detach(id_12)
866
+ onSwitchTo: (id_3, options_1) => switchToThread(id_3, options_1),
867
+ onRename: (id_4, title_1) => rename(id_4, title_1),
868
+ onUpdateCustom: (id_5, custom_0) => updateCustom(id_5, custom_0),
869
+ onArchive: (id_6) => archive(id_6),
870
+ onUnarchive: (id_7) => unarchive(id_7),
871
+ onDelete: (id_8) => deleteThread(id_8),
872
+ onGenerateTitle: (id_9, messages_0, options_2) => generateTitle(id_9, messages_0, options_2),
873
+ onInitialize: async (id_10) => toInitializeResult(await initialize(id_10)),
874
+ onDetach: (id_11) => detach(id_11)
866
875
  });
867
876
  const mainRemoteId = getThreadData(listState, mainThreadId)?.remoteId;
868
877
  useEffect(() => {
869
878
  if (session.lastNotifiedRemoteId === mainRemoteId) return;
870
879
  session.lastNotifiedRemoteId = mainRemoteId;
871
- onThreadIdChange?.(mainRemoteId);
880
+ invokeUserCallback("assistant-ui", "onThreadIdChange", onThreadIdChange, mainRemoteId);
872
881
  }, [
873
882
  mainRemoteId,
874
883
  onThreadIdChange,
@@ -895,10 +904,11 @@ const useRemoteThreadList = (props) => {
895
904
  switchToThread,
896
905
  threadId
897
906
  ]);
898
- const state_14 = useMemo(() => ({
907
+ const state_13 = useMemo(() => ({
899
908
  mainThreadId,
900
909
  newThreadId: listState.newThreadId ?? null,
901
910
  isLoading: listState.isLoading,
911
+ loadError: listState.loadError,
902
912
  isLoadingMore: listState.isLoadingMore,
903
913
  hasMore: listState.cursor !== void 0,
904
914
  threadIds: listState.threadIds,
@@ -909,6 +919,7 @@ const useRemoteThreadList = (props) => {
909
919
  listState.archivedThreadIds,
910
920
  listState.cursor,
911
921
  listState.isLoading,
922
+ listState.loadError,
912
923
  listState.isLoadingMore,
913
924
  listState.newThreadId,
914
925
  listState.threadIds,
@@ -917,9 +928,9 @@ const useRemoteThreadList = (props) => {
917
928
  threadListItems.state
918
929
  ]);
919
930
  return {
920
- getState: () => state_14,
921
- switchToThread: (id_13, options_1) => {
922
- handleThreadListAction("switch", () => switchToThread(id_13, options_1));
931
+ getState: () => state_13,
932
+ switchToThread: (id_12, options_3) => {
933
+ handleThreadListAction("switch", () => switchToThread(id_12, options_3));
923
934
  },
924
935
  switchToNewThread: () => {
925
936
  handleThreadListAction("create", () => switchToNewThread());
@@ -940,9 +951,9 @@ const useRemoteThreadList = (props) => {
940
951
  const index_0 = itemOrder.findIndex((item_0) => itemMatchesId(item_0, listState, selector.id));
941
952
  return threadListItems.get({ index: index_0 });
942
953
  }
943
- const id_14 = (selector.archived ? listState.archivedThreadIds : listState.threadIds)[selector.index];
944
- if (id_14 === void 0) return threadListItems.get({ index: -1 });
945
- const index_1 = itemOrder.findIndex((item_1) => itemMatchesId(item_1, listState, id_14));
954
+ const id_13 = (selector.archived ? listState.archivedThreadIds : listState.threadIds)[selector.index];
955
+ if (id_13 === void 0) return threadListItems.get({ index: -1 });
956
+ const index_1 = itemOrder.findIndex((item_1) => itemMatchesId(item_1, listState, id_13));
946
957
  return threadListItems.get({ index: index_1 });
947
958
  },
948
959
  thread: () => mainThreadClient.methods