@assistant-ui/core 0.3.16 → 0.3.18

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 (474) 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/index.d.ts +3 -3
  5. package/dist/index.js +2 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal.d.ts +4 -2
  8. package/dist/internal.js +4 -2
  9. package/dist/model-context/frame/host.d.ts.map +1 -1
  10. package/dist/model-context/frame/host.js +10 -4
  11. package/dist/model-context/frame/host.js.map +1 -1
  12. package/dist/model-context/frame/provider.d.ts +5 -0
  13. package/dist/model-context/frame/provider.d.ts.map +1 -1
  14. package/dist/model-context/frame/provider.js +101 -28
  15. package/dist/model-context/frame/provider.js.map +1 -1
  16. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  17. package/dist/model-context/interactable-composer-metadata.js +16 -9
  18. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  19. package/dist/model-context/registry.d.ts.map +1 -1
  20. package/dist/model-context/registry.js +3 -5
  21. package/dist/model-context/registry.js.map +1 -1
  22. package/dist/model-context/tool-call-text.d.ts +26 -0
  23. package/dist/model-context/tool-call-text.d.ts.map +1 -0
  24. package/dist/model-context/tool-call-text.js +18 -0
  25. package/dist/model-context/tool-call-text.js.map +1 -0
  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/RuntimeAdapter.js +1 -1
  30. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  31. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  32. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  33. package/dist/react/client/AdaptedRemoteThread.js +1 -1
  34. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  35. package/dist/react/client/InMemoryThreadList.js +63 -57
  36. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  37. package/dist/react/client/Interactables.d.ts.map +1 -1
  38. package/dist/react/client/Interactables.js +25 -28
  39. package/dist/react/client/Interactables.js.map +1 -1
  40. package/dist/react/client/RemoteThreadList.d.ts +16 -0
  41. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  42. package/dist/react/client/RemoteThreadList.js +354 -242
  43. package/dist/react/client/RemoteThreadList.js.map +1 -1
  44. package/dist/react/client/Tools.d.ts.map +1 -1
  45. package/dist/react/client/Tools.js +24 -18
  46. package/dist/react/client/Tools.js.map +1 -1
  47. package/dist/react/index.d.ts +2 -1
  48. package/dist/react/index.js +2 -1
  49. package/dist/react/interactables-legacy/Interactables.js +246 -125
  50. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  51. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  52. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  53. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  54. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  55. package/dist/react/model-context/makeAssistantTool.js +1 -1
  56. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  57. package/dist/react/model-context/toolbox.d.ts +2 -14
  58. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  59. package/dist/react/model-context/toolbox.js +1 -13
  60. package/dist/react/model-context/toolbox.js.map +1 -1
  61. package/dist/react/model-context/useAssistantContext.js +37 -7
  62. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  63. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  64. package/dist/react/model-context/useAssistantTool.js +1 -1
  65. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  66. package/dist/react/model-context/useAuiToolOverrides.js +31 -5
  67. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  68. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  69. package/dist/react/model-context/useInlineRender.js +10 -36
  70. package/dist/react/model-context/useInlineRender.js.map +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/primitive-hooks/useMessageError.d.ts.map +1 -1
  75. package/dist/react/primitive-hooks/useMessageError.js +2 -8
  76. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  77. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  78. package/dist/react/primitive-hooks/useThreadListLoadMore.js +2 -4
  79. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  80. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  81. package/dist/react/primitives/composer/ComposerAttachments.js +4 -3
  82. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  83. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  84. package/dist/react/primitives/composer/ComposerQueue.js +4 -3
  85. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  86. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  87. package/dist/react/primitives/message/MessageAttachments.js +7 -6
  88. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  89. package/dist/react/primitives/message/MessageGroupedParts.js +2 -2
  90. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  91. package/dist/react/primitives/message/MessageParts.js +3 -3
  92. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  93. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  94. package/dist/react/primitives/threadList/ThreadListItems.js +5 -4
  95. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  96. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +6 -4
  97. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  98. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +59 -29
  99. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  100. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +11 -6
  101. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  102. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +160 -143
  103. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadResource.d.ts +2 -6
  105. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  106. package/dist/react/runtimes/RemoteThreadResource.js +15 -13
  107. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  108. package/dist/react/runtimes/assistant-transport/useLatestRef.js +2 -2
  109. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -1
  110. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +4 -1
  111. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  112. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +424 -52
  113. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  114. package/dist/react/runtimes/cloud/auiV0.d.ts +5 -1
  115. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  116. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  117. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +29 -0
  118. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -0
  119. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +160 -0
  120. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -0
  121. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -9
  122. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +16 -153
  124. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  125. package/dist/react/runtimes/external-message-converter.js +1 -1
  126. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  127. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  128. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  129. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  130. package/dist/react/runtimes/useRemoteThreadListRuntime.js +77 -29
  131. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  132. package/dist/react/types/MessagePartComponentTypes.d.ts +7 -3
  133. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  134. package/dist/react/types/scopes/tools.d.ts +2 -0
  135. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  136. package/dist/runtime/api/message-part-runtime.d.ts +2 -2
  137. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  138. package/dist/runtime/api/message-part-runtime.js +1 -1
  139. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  140. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  141. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  142. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  143. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  144. package/dist/runtime/api/thread-list-runtime.d.ts +12 -1
  145. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  146. package/dist/runtime/api/thread-list-runtime.js +23 -14
  147. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  148. package/dist/runtime/api/thread-runtime.d.ts +5 -1
  149. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  150. package/dist/runtime/api/thread-runtime.js +1 -1
  151. package/dist/runtime/api/thread-runtime.js.map +1 -1
  152. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  153. package/dist/runtime/base/base-composer-runtime-core.js +16 -12
  154. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  155. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -2
  156. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  157. package/dist/runtime/base/base-thread-runtime-core.js +8 -7
  158. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  159. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  160. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  161. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +18 -3
  162. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  163. package/dist/runtime/interfaces/thread-runtime-core.d.ts +15 -1
  164. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  165. package/dist/runtime/utils/auto-status.d.ts +1 -1
  166. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  167. package/dist/runtime/utils/auto-status.js +6 -2
  168. package/dist/runtime/utils/auto-status.js.map +1 -1
  169. package/dist/runtime/utils/external-message-conversion.d.ts +3 -2
  170. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  171. package/dist/runtime/utils/external-message-conversion.js +5 -4
  172. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  173. package/dist/runtime/utils/message-repository.d.ts +1 -0
  174. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  175. package/dist/runtime/utils/message-repository.js +15 -6
  176. package/dist/runtime/utils/message-repository.js.map +1 -1
  177. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +6 -3
  178. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  179. package/dist/runtime/utils/resolveToolApprovalResponse.js +12 -3
  180. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -1
  181. package/dist/runtime/utils/thread-message-like.d.ts +2 -10
  182. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  183. package/dist/runtime/utils/thread-message-like.js +1 -1
  184. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  185. package/dist/runtime/utils/tool-call-tree.d.ts +39 -0
  186. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -0
  187. package/dist/runtime/utils/tool-call-tree.js +85 -0
  188. package/dist/runtime/utils/tool-call-tree.js.map +1 -0
  189. package/dist/runtimes/external-store/external-store-adapter.d.ts +29 -2
  190. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  191. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  192. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  193. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  194. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +2 -1
  195. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  196. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +34 -28
  197. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  198. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +1 -1
  199. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  200. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  201. package/dist/runtimes/internal.d.ts +2 -2
  202. package/dist/runtimes/internal.js +2 -2
  203. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  204. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  205. package/dist/runtimes/local/local-thread-runtime-core.js +3 -1
  206. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  207. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  208. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  209. package/dist/runtimes/remote-thread-list/remote-thread-state.js +148 -43
  210. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  211. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  212. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  213. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  214. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  215. package/dist/runtimes/remote-thread-list/title.d.ts +11 -0
  216. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -0
  217. package/dist/runtimes/remote-thread-list/title.js +14 -0
  218. package/dist/runtimes/remote-thread-list/title.js.map +1 -0
  219. package/dist/runtimes/remote-thread-list/types.d.ts +16 -5
  220. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  221. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +31 -8
  222. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  223. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +97 -60
  224. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  225. package/dist/store/clients/external-thread.d.ts +1 -1
  226. package/dist/store/clients/external-thread.d.ts.map +1 -1
  227. package/dist/store/clients/external-thread.js +30 -7
  228. package/dist/store/clients/external-thread.js.map +1 -1
  229. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  230. package/dist/store/clients/model-context-client.js +2 -1
  231. package/dist/store/clients/model-context-client.js.map +1 -1
  232. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  233. package/dist/store/clients/single-thread-list.js +2 -1
  234. package/dist/store/clients/single-thread-list.js.map +1 -1
  235. package/dist/store/clients/suggestions.d.ts.map +1 -1
  236. package/dist/store/clients/suggestions.js +19 -6
  237. package/dist/store/clients/suggestions.js.map +1 -1
  238. package/dist/store/clients/thread-message-client.js +1 -1
  239. package/dist/store/clients/thread-selection-events.js +1 -1
  240. package/dist/store/index.d.ts +2 -1
  241. package/dist/store/index.js +2 -1
  242. package/dist/store/internal.d.ts +2 -2
  243. package/dist/store/internal.js +2 -2
  244. package/dist/store/primitive-predicates.d.ts +4 -1
  245. package/dist/store/primitive-predicates.d.ts.map +1 -1
  246. package/dist/store/primitive-predicates.js +9 -1
  247. package/dist/store/primitive-predicates.js.map +1 -1
  248. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  249. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  250. package/dist/store/runtime-clients/composer-runtime-client.js +98 -62
  251. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  252. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  253. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  254. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  255. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  256. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  257. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +2 -2
  258. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  259. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  260. package/dist/store/runtime-clients/thread-list-runtime-client.js +128 -107
  261. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  262. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/thread-runtime-client.js +194 -122
  264. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/useSubscribable.d.ts +3 -1
  266. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  267. package/dist/store/runtime-clients/useSubscribable.js +1 -1
  268. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  269. package/dist/store/scopes/composer.d.ts +10 -2
  270. package/dist/store/scopes/composer.d.ts.map +1 -1
  271. package/dist/store/scopes/message.d.ts +30 -1
  272. package/dist/store/scopes/message.d.ts.map +1 -1
  273. package/dist/store/scopes/part.d.ts +6 -3
  274. package/dist/store/scopes/part.d.ts.map +1 -1
  275. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  276. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  277. package/dist/store/scopes/thread.d.ts +8 -0
  278. package/dist/store/scopes/thread.d.ts.map +1 -1
  279. package/dist/store/scopes/threads.d.ts +1 -0
  280. package/dist/store/scopes/threads.d.ts.map +1 -1
  281. package/dist/subscribable/subscribable.d.ts +8 -1
  282. package/dist/subscribable/subscribable.d.ts.map +1 -1
  283. package/dist/subscribable/subscribable.js +24 -16
  284. package/dist/subscribable/subscribable.js.map +1 -1
  285. package/dist/types/attachment.d.ts +2 -1
  286. package/dist/types/attachment.d.ts.map +1 -1
  287. package/dist/types/attachment.js +2 -1
  288. package/dist/types/attachment.js.map +1 -1
  289. package/dist/types/message.d.ts +40 -1
  290. package/dist/types/message.d.ts.map +1 -1
  291. package/dist/types/message.js +7 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/abortable-iterable.d.ts +19 -0
  294. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  295. package/dist/utils/abortable-iterable.js +72 -0
  296. package/dist/utils/abortable-iterable.js.map +1 -0
  297. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  298. package/dist/utils/composite-context-provider.js +20 -2
  299. package/dist/utils/composite-context-provider.js.map +1 -1
  300. package/dist/utils/record.d.ts +11 -0
  301. package/dist/utils/record.d.ts.map +1 -0
  302. package/dist/utils/record.js +12 -0
  303. package/dist/utils/record.js.map +1 -0
  304. package/package.json +12 -17
  305. package/src/adapters/attachment.test.ts +50 -1
  306. package/src/adapters/attachment.ts +7 -4
  307. package/src/index.ts +7 -1
  308. package/src/internal.ts +12 -0
  309. package/src/model-context/frame/host.test.ts +24 -0
  310. package/src/model-context/frame/host.ts +10 -4
  311. package/src/model-context/frame/provider.test.ts +288 -1
  312. package/src/model-context/frame/provider.ts +148 -30
  313. package/src/model-context/interactable-composer-metadata.test.ts +28 -0
  314. package/src/model-context/interactable-composer-metadata.ts +9 -3
  315. package/src/model-context/registry.test.ts +12 -0
  316. package/src/model-context/registry.ts +3 -2
  317. package/src/model-context/tool-call-text.test.ts +67 -0
  318. package/src/model-context/tool-call-text.ts +67 -0
  319. package/src/model-context/types.test.ts +25 -0
  320. package/src/model-context/types.ts +9 -4
  321. package/src/react/AssistantRuntimeProvider.test.tsx +66 -2
  322. package/src/react/RuntimeAdapter.test.ts +34 -0
  323. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -3
  324. package/src/react/client/InMemoryThreadList.ts +1 -0
  325. package/src/react/client/Interactables.test.ts +28 -0
  326. package/src/react/client/Interactables.ts +15 -13
  327. package/src/react/client/RemoteThreadList.background.test.ts +526 -0
  328. package/src/react/client/RemoteThreadList.concurrent.test.tsx +315 -0
  329. package/src/react/client/RemoteThreadList.test.ts +617 -3
  330. package/src/react/client/RemoteThreadList.ts +433 -167
  331. package/src/react/client/Tools.ts +29 -12
  332. package/src/react/index.ts +4 -0
  333. package/src/react/interactables-legacy/Interactables.ts +16 -16
  334. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  335. package/src/react/model-context/makeAssistantTool.ts +2 -2
  336. package/src/react/model-context/modelContextHooks.test.tsx +131 -0
  337. package/src/react/model-context/toolbox.test.ts +9 -9
  338. package/src/react/model-context/toolbox.ts +9 -36
  339. package/src/react/model-context/useAssistantContext.ts +4 -2
  340. package/src/react/model-context/useAssistantTool.ts +2 -2
  341. package/src/react/model-context/useAuiToolOverrides.ts +4 -2
  342. package/src/react/model-context/useInlineRender.test.tsx +48 -0
  343. package/src/react/model-context/useInlineRender.ts +14 -10
  344. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  345. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  346. package/src/react/primitive-hooks/useMessageError.ts +2 -19
  347. package/src/react/primitive-hooks/useThreadListLoadMore.ts +2 -3
  348. package/src/react/primitives/composer/ComposerAttachments.test.tsx +76 -0
  349. package/src/react/primitives/composer/ComposerAttachments.tsx +9 -4
  350. package/src/react/primitives/composer/ComposerQueue.test.tsx +72 -0
  351. package/src/react/primitives/composer/ComposerQueue.tsx +7 -4
  352. package/src/react/primitives/message/MessageAttachments.test.tsx +107 -37
  353. package/src/react/primitives/message/MessageAttachments.tsx +10 -7
  354. package/src/react/primitives/message/MessageGroupedParts.tsx +2 -2
  355. package/src/react/primitives/message/MessageParts.tsx +3 -3
  356. package/src/react/primitives/threadList/ThreadListItems.test.tsx +99 -0
  357. package/src/react/primitives/threadList/ThreadListItems.tsx +8 -5
  358. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  359. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +127 -1
  360. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  361. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +99 -35
  362. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  363. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +274 -0
  364. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +223 -152
  365. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  366. package/src/react/runtimes/RemoteThreadResource.ts +20 -16
  367. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +51 -2
  368. package/src/react/runtimes/assistant-transport/useLatestRef.ts +2 -2
  369. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +45 -0
  370. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +546 -5
  371. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +546 -103
  372. package/src/react/runtimes/cloud/auiV0.ts +5 -0
  373. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +103 -0
  374. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +237 -0
  375. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +90 -1
  376. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +33 -238
  377. package/src/react/runtimes/external-message-converter.ts +1 -0
  378. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  379. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  380. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  381. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +216 -0
  382. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  383. package/src/react/runtimes/useRemoteThreadListRuntime.ts +57 -6
  384. package/src/react/types/MessagePartComponentTypes.ts +7 -3
  385. package/src/react/types/scopes/tools.ts +2 -0
  386. package/src/runtime/api/message-part-runtime.ts +3 -3
  387. package/src/runtime/api/message-runtime.test.ts +75 -0
  388. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  389. package/src/runtime/api/thread-list-runtime.ts +46 -12
  390. package/src/runtime/api/thread-runtime.test.ts +78 -0
  391. package/src/runtime/api/thread-runtime.ts +8 -1
  392. package/src/runtime/base/base-composer-runtime-core.ts +36 -8
  393. package/src/runtime/base/base-thread-runtime-core.test.ts +149 -4
  394. package/src/runtime/base/base-thread-runtime-core.ts +16 -8
  395. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  396. package/src/runtime/interfaces/thread-list-runtime-core.ts +25 -2
  397. package/src/runtime/interfaces/thread-runtime-core.ts +17 -1
  398. package/src/runtime/utils/auto-status.test.ts +57 -0
  399. package/src/runtime/utils/auto-status.ts +13 -1
  400. package/src/runtime/utils/external-message-conversion.test.ts +165 -0
  401. package/src/runtime/utils/external-message-conversion.ts +18 -2
  402. package/src/runtime/utils/message-repository.ts +29 -17
  403. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +73 -0
  404. package/src/runtime/utils/resolveToolApprovalResponse.ts +27 -6
  405. package/src/runtime/utils/thread-message-like.ts +3 -11
  406. package/src/runtime/utils/tool-call-tree.test.ts +191 -0
  407. package/src/runtime/utils/tool-call-tree.ts +97 -0
  408. package/src/runtimes/external-store/external-store-adapter.ts +38 -2
  409. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  410. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +56 -33
  411. package/src/runtimes/inert/InertThreadRuntimeCore.ts +1 -1
  412. package/src/runtimes/internal.ts +1 -0
  413. package/src/runtimes/local/local-thread-runtime-core.test.ts +29 -3
  414. package/src/runtimes/local/local-thread-runtime-core.ts +5 -1
  415. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +238 -0
  416. package/src/runtimes/remote-thread-list/remote-thread-state.ts +223 -44
  417. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  418. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  419. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  420. package/src/runtimes/remote-thread-list/title.ts +16 -0
  421. package/src/runtimes/remote-thread-list/types.ts +16 -5
  422. package/src/runtimes/tool-invocations/EDGE_CASES.md +110 -5
  423. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +750 -136
  424. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +144 -91
  425. package/src/store/clients/external-thread.ts +62 -11
  426. package/src/store/clients/model-context-client.ts +5 -1
  427. package/src/store/clients/single-thread-list.ts +1 -0
  428. package/src/store/clients/suggestions.test.ts +195 -1
  429. package/src/store/clients/suggestions.ts +45 -34
  430. package/src/store/index.ts +4 -0
  431. package/src/store/internal.ts +2 -0
  432. package/src/store/primitive-predicates.ts +35 -0
  433. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  434. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  435. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  436. package/src/store/runtime-clients/thread-list-runtime-client.ts +17 -2
  437. package/src/store/runtime-clients/thread-runtime-client.ts +58 -10
  438. package/src/store/runtime-clients/useSubscribable.ts +8 -2
  439. package/src/store/scopes/composer.ts +16 -4
  440. package/src/store/scopes/message.ts +14 -0
  441. package/src/store/scopes/part.ts +6 -3
  442. package/src/store/scopes/thread-list-item.ts +5 -2
  443. package/src/store/scopes/thread.ts +4 -0
  444. package/src/store/scopes/threads.ts +1 -0
  445. package/src/subscribable/subscribable.test.ts +50 -0
  446. package/src/subscribable/subscribable.ts +33 -21
  447. package/src/tests/MessageRepository.test.ts +116 -0
  448. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  449. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  450. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +158 -0
  451. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +78 -0
  452. package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +52 -0
  453. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  454. package/src/tests/attachment-adapters.test.ts +14 -0
  455. package/src/tests/base-composer-runtime-core.test.ts +39 -0
  456. package/src/tests/external-store-optimistic-id.test.ts +79 -0
  457. package/src/tests/external-store-repository-instance.test.ts +166 -0
  458. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  459. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +49 -34
  460. package/src/tests/external-thread-attachments.test.tsx +224 -1
  461. package/src/tests/external-thread-parity.test.tsx +23 -0
  462. package/src/tests/remote-thread-list-adapter-switch.test.ts +66 -1
  463. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  464. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  465. package/src/tests/thread-switch-events.test.tsx +475 -2
  466. package/src/tests/tools-scope-migration.test.tsx +28 -0
  467. package/src/types/attachment.ts +4 -0
  468. package/src/types/message.ts +50 -2
  469. package/src/utils/abortable-iterable.test.ts +213 -0
  470. package/src/utils/abortable-iterable.ts +93 -0
  471. package/src/utils/composite-context-provider.test.ts +25 -0
  472. package/src/utils/composite-context-provider.ts +23 -2
  473. package/src/utils/record.test.ts +48 -0
  474. package/src/utils/record.ts +11 -0
@@ -1,17 +1,18 @@
1
- import { BaseSubscribable } from "../../subscribable/subscribable.js";
1
+ import { nullProtoRecord } from "../../utils/record.js";
2
+ import { BaseSubscribable, WritableSubscribable } from "../../subscribable/subscribable.js";
2
3
  import { OptimisticState } from "../../runtimes/remote-thread-list/optimistic-state.js";
3
4
  import { EMPTY_THREAD_CORE } from "../../runtimes/remote-thread-list/empty-thread-core.js";
4
- import { classifyThreads, createEmptyRemoteThreadState, createThreadMappingId, getThreadData, normalizeCursor, preserveMidLoadTransitions, seedNewThread, statusSnapshot, updateStatusReducer } from "../../runtimes/remote-thread-list/remote-thread-state.js";
5
+ import { classifyThreads, createEmptyRemoteThreadState, createThreadMappingId, getThreadData, normalizeCursor, preserveMidLoadTransitions, promoteNewThreadReducer, reconcileInitializedThread, seedNewThread, statusSnapshot, updateStatusReducer } from "../../runtimes/remote-thread-list/remote-thread-state.js";
6
+ import { useSubscribable } from "../../store/runtime-clients/useSubscribable.js";
5
7
  import { ThreadListAdapterChangedError } from "../../runtimes/remote-thread-list/adapter-changed.js";
6
8
  import { useStableRuntimeAdapters } from "./useRuntimeAdapters.js";
9
+ import { applyTitleStream, isTitleSourceMessage } from "../../runtimes/remote-thread-list/title.js";
10
+ import { clearThreadTitleState, finishThreadTitleRename, runThreadTitleGeneration, startThreadTitleRename } from "../../runtimes/remote-thread-list/title-generation.js";
7
11
  import { RuntimeAdapterProvider } from "./RuntimeAdapterProvider.js";
8
- import { isTitleSourceMessage } from "./RemoteThreadResource.js";
9
12
  import { RemoteThreadListHookInstanceManager } from "./RemoteThreadListHookInstanceManager.js";
10
- import { AssistantMessageStream } from "assistant-stream";
11
13
  import { Fragment, useEffect, useId } from "@assistant-ui/tap/react-shim";
12
14
  import { useAui } from "@assistant-ui/store";
13
15
  import { jsx, jsxs } from "react/jsx-runtime";
14
- import { create } from "zustand";
15
16
  //#region src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx
16
17
  const threadNotFoundError = (threadIdOrRemoteId, action) => /* @__PURE__ */ new Error(`Thread "${threadIdOrRemoteId}" not found while ${action}.`);
17
18
  const threadStatusError = (threadIdOrRemoteId, status, action) => /* @__PURE__ */ new Error(`Thread "${threadIdOrRemoteId}" has status "${status}", so it cannot ${action}.`);
@@ -28,6 +29,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
28
29
  _staleThreadIdsOnReplace;
29
30
  _switchGeneration = 0;
30
31
  _switchTask;
32
+ _titleStates = /* @__PURE__ */ new Map();
31
33
  _mainThreadId;
32
34
  _state = new OptimisticState(EMPTY_REMOTE_STATE);
33
35
  _useAdaptersProvider = ({ children }) => {
@@ -62,9 +64,11 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
62
64
  this._loadThreadsPromise = this._state.optimisticUpdate({
63
65
  execute: () => this._options.adapter.list(),
64
66
  loading: (state) => {
67
+ if (generation !== this._loadGeneration) return state;
65
68
  return {
66
69
  ...state,
67
- isLoading: true
70
+ isLoading: true,
71
+ loadError: void 0
68
72
  };
69
73
  },
70
74
  then: (state, l) => {
@@ -72,28 +76,26 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
72
76
  if (this._replaceListOnNextLoad) {
73
77
  this._replaceListOnNextLoad = false;
74
78
  replacedList = true;
75
- return this._replaceWithThreads(state, l.threads, normalizeCursor(l.nextCursor));
79
+ return this._replaceWithThreads({
80
+ ...state,
81
+ loadError: void 0
82
+ }, l.threads, normalizeCursor(l.nextCursor));
76
83
  }
77
84
  const fresh = classifyThreads(l.threads, {
78
85
  threadIds: [],
79
86
  archivedThreadIds: [],
80
- threadIdMap: {},
81
- threadData: {}
87
+ threadIdMap: { ...state.threadIdMap },
88
+ threadData: { ...state.threadData }
82
89
  });
83
90
  const merged = {
84
91
  ...state,
85
92
  isLoading: false,
93
+ loadError: void 0,
86
94
  cursor: normalizeCursor(l.nextCursor),
87
95
  threadIds: fresh.threadIds,
88
96
  archivedThreadIds: fresh.archivedThreadIds,
89
- threadIdMap: {
90
- ...state.threadIdMap,
91
- ...fresh.threadIdMap
92
- },
93
- threadData: {
94
- ...state.threadData,
95
- ...fresh.threadData
96
- }
97
+ threadIdMap: fresh.threadIdMap,
98
+ threadData: fresh.threadData
97
99
  };
98
100
  return preserveMidLoadTransitions(merged, state, statusAtRequest);
99
101
  }
@@ -104,13 +106,17 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
104
106
  if (!this._replaceListOnNextLoad) {
105
107
  this._state.update({
106
108
  ...this._state.baseValue,
107
- isLoading: false
109
+ isLoading: false,
110
+ loadError: error
108
111
  });
109
112
  return;
110
113
  }
111
114
  this._replaceListOnNextLoad = false;
112
115
  replacedList = true;
113
- this._state.update(this._replaceWithThreads(this._state.baseValue, [], void 0));
116
+ this._state.update(this._replaceWithThreads({
117
+ ...this._state.baseValue,
118
+ loadError: error
119
+ }, [], void 0));
114
120
  }).then(() => {
115
121
  if (!replacedList) return;
116
122
  const threadId = this._options.threadId;
@@ -130,10 +136,13 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
130
136
  const cursor = initialState.cursor;
131
137
  const dedup = this._state.optimisticUpdate({
132
138
  execute: () => adapter.list({ after: cursor }),
133
- loading: (state) => ({
134
- ...state,
135
- isLoadingMore: true
136
- }),
139
+ loading: (state) => {
140
+ if (generation !== this._loadGeneration) return state;
141
+ return {
142
+ ...state,
143
+ isLoadingMore: true
144
+ };
145
+ },
137
146
  then: (state, l) => {
138
147
  if (generation !== this._loadGeneration) return state;
139
148
  if (adapter !== this._options.adapter) return state;
@@ -175,19 +184,18 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
175
184
  this._hookManager.__internal_subscribeRuntimeReplaced(() => {
176
185
  queueMicrotask(() => this._notifySubscribers());
177
186
  });
178
- this.useProvider = create(() => ({ Provider: this.resolveProvider(options.adapter) }));
187
+ this.providerStore = new WritableSubscribable(this.resolveProvider(options.adapter));
179
188
  this.__internal_setOptions(options);
180
189
  this.switchToNewThread();
181
190
  }
182
191
  _initialThreadLoaded = false;
183
- useProvider;
192
+ providerStore;
184
193
  __internal_setOptions(options) {
185
194
  if (this._options === options) return;
186
195
  const adapterChanged = this._options !== void 0 && this._options.adapter !== options.adapter;
187
196
  const controlledThreadIdChanged = this._initialThreadLoaded && this._options !== void 0 && this._options.threadId !== options.threadId;
188
197
  this._options = options;
189
- const Provider = this.resolveProvider(options.adapter);
190
- if (Provider !== this.useProvider.getState().Provider) this.useProvider.setState({ Provider }, true);
198
+ this.providerStore.setState(this.resolveProvider(options.adapter));
191
199
  this._hookManager.setRuntimeHook(options.runtimeHook);
192
200
  if (adapterChanged) {
193
201
  this._loadGeneration++;
@@ -200,8 +208,10 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
200
208
  this._staleThreadIdsOnReplace = new Set(Object.values(this._state.baseValue.threadData).filter((item) => item.status !== "new").map((item) => item.id));
201
209
  this._state.update({
202
210
  ...this._state.baseValue,
203
- cursor: void 0
211
+ cursor: void 0,
212
+ loadError: void 0
204
213
  });
214
+ this._titleStates.clear();
205
215
  }
206
216
  if (controlledThreadIdChanged) this._switchToThreadFromProp(options.threadId).catch(() => {});
207
217
  }
@@ -212,38 +222,41 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
212
222
  if (this._replaceListOnNextLoad) throw new ThreadListAdapterChangedError();
213
223
  }
214
224
  _replaceWithThreads(state, threads, cursor) {
215
- const fresh = classifyThreads(threads, {
216
- threadIds: [],
217
- archivedThreadIds: [],
218
- threadIdMap: {},
219
- threadData: {}
220
- });
221
- const threadIdMap = { ...fresh.threadIdMap };
222
- const threadData = { ...fresh.threadData };
223
- const threadIds = [...fresh.threadIds];
224
- const archivedThreadIds = [...fresh.archivedThreadIds];
225
+ const carried = [];
225
226
  if (state.newThreadId) {
226
- const mappingId = state.threadIdMap[state.newThreadId];
227
- const draft = mappingId ? state.threadData[mappingId] : void 0;
228
- if (draft?.status === "new") {
229
- threadIdMap[state.newThreadId] = mappingId;
230
- threadData[mappingId] = draft;
231
- }
227
+ const mappingId = Object.hasOwn(state.threadIdMap, state.newThreadId) ? state.threadIdMap[state.newThreadId] : void 0;
228
+ const draft = mappingId && Object.hasOwn(state.threadData, mappingId) ? state.threadData[mappingId] : void 0;
229
+ if (draft?.status === "new") carried.push(draft);
232
230
  }
233
231
  const stale = this._staleThreadIdsOnReplace;
234
232
  if (stale) for (const item of Object.values(state.threadData)) {
235
233
  if (stale.has(item.id)) continue;
236
234
  if (item.status !== "new" && item.remoteId === void 0) continue;
235
+ carried.push(item);
236
+ }
237
+ this._staleThreadIdsOnReplace = void 0;
238
+ const seed = {
239
+ threadIds: [],
240
+ archivedThreadIds: [],
241
+ threadIdMap: nullProtoRecord(),
242
+ threadData: nullProtoRecord()
243
+ };
244
+ for (const item of carried) {
237
245
  const mappingId = createThreadMappingId(item.id);
238
- if (threadData[mappingId]) continue;
239
- threadIdMap[item.id] = mappingId;
240
- if (item.remoteId !== void 0) threadIdMap[item.remoteId] = mappingId;
241
- threadData[mappingId] = item;
246
+ if (Object.hasOwn(seed.threadData, mappingId)) continue;
247
+ seed.threadIdMap[item.id] = mappingId;
248
+ if (item.remoteId !== void 0) seed.threadIdMap[item.remoteId] = mappingId;
249
+ seed.threadData[mappingId] = item;
250
+ }
251
+ const { threadIds, archivedThreadIds, threadIdMap, threadData } = classifyThreads(threads, seed);
252
+ for (const item of carried) {
242
253
  if (item.remoteId === void 0) continue;
243
- if (item.status === "regular" && !threadIds.includes(item.remoteId)) threadIds.push(item.remoteId);
244
- else if (item.status === "archived" && !archivedThreadIds.includes(item.remoteId)) archivedThreadIds.push(item.remoteId);
254
+ const currentMappingId = createThreadMappingId(item.id);
255
+ const current = Object.hasOwn(threadData, currentMappingId) ? threadData[currentMappingId] : void 0;
256
+ if (current === void 0) continue;
257
+ if (current.status === "regular" && !threadIds.includes(current.id)) threadIds.push(current.id);
258
+ else if (current.status === "archived" && !archivedThreadIds.includes(current.id)) archivedThreadIds.push(current.id);
245
259
  }
246
- this._staleThreadIdsOnReplace = void 0;
247
260
  let nextState = {
248
261
  ...state,
249
262
  isLoading: false,
@@ -252,7 +265,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
252
265
  archivedThreadIds,
253
266
  threadIdMap,
254
267
  threadData,
255
- newThreadId: state.newThreadId !== void 0 && threadIdMap[state.newThreadId] === void 0 ? void 0 : state.newThreadId
268
+ newThreadId: state.newThreadId !== void 0 && !Object.hasOwn(threadIdMap, state.newThreadId) ? void 0 : state.newThreadId
256
269
  };
257
270
  if (getThreadData(nextState, this._mainThreadId) === void 0) {
258
271
  const preservedDraft = nextState.newThreadId;
@@ -305,6 +318,9 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
305
318
  get isLoading() {
306
319
  return this._state.value.isLoading;
307
320
  }
321
+ get loadError() {
322
+ return this._state.value.loadError;
323
+ }
308
324
  get isLoadingMore() {
309
325
  return this._state.value.isLoadingMore;
310
326
  }
@@ -351,6 +367,9 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
351
367
  if (!data) return false;
352
368
  return this._hookManager.__internal_isThreadRunning(data.id);
353
369
  }
370
+ unstable_subscribeThreadEvents(callback) {
371
+ return this._hookManager.__internal_subscribeThreadEvents(callback);
372
+ }
354
373
  getItemById(threadIdOrRemoteId) {
355
374
  return getThreadData(this._state.value, threadIdOrRemoteId);
356
375
  }
@@ -412,11 +431,21 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
412
431
  if (this.mainThreadId !== void 0) await task;
413
432
  else task.then(() => this._notifySubscribers(), () => void 0);
414
433
  if (generation !== this._switchGeneration) return;
415
- if (data.status === "archived" && options?.unarchive !== false) {
416
- await this.unarchive(data.id);
434
+ let current = this.getItemById(data.id);
435
+ if (current?.id !== data.id) return;
436
+ if (current.status === "archived" && options?.unarchive !== false) {
437
+ await current.initializeTask;
417
438
  if (generation !== this._switchGeneration) return;
439
+ current = this.getItemById(data.id);
440
+ if (current?.id !== data.id) return;
441
+ if (current.status === "archived") {
442
+ await this.unarchive(current.id);
443
+ if (generation !== this._switchGeneration) return;
444
+ current = this.getItemById(data.id);
445
+ if (current?.id !== data.id) return;
446
+ }
418
447
  }
419
- this._mainThreadId = data.id;
448
+ this._mainThreadId = current.id;
420
449
  this._notifySubscribers();
421
450
  this._notifyThreadIdChange(emitThreadIdChange);
422
451
  }
@@ -461,60 +490,28 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
461
490
  externalId
462
491
  };
463
492
  }
493
+ this._requireAdapterGeneration(adapterGeneration);
494
+ const initializeTask = adapter.initialize(threadId);
495
+ let removedMappingId;
464
496
  const { remoteId, externalId } = await this._state.optimisticUpdate({
465
- execute: () => {
466
- this._requireAdapterGeneration(adapterGeneration);
467
- return adapter.initialize(threadId);
468
- },
469
- optimistic: (state) => {
470
- return updateStatusReducer(state, threadId, "regular");
471
- },
472
- loading: (state, task) => {
473
- const mappingId = createThreadMappingId(threadId);
474
- return {
475
- ...state,
476
- threadData: {
477
- ...state.threadData,
478
- [mappingId]: {
479
- ...state.threadData[mappingId],
480
- initializeTask: task
481
- }
482
- }
483
- };
484
- },
497
+ execute: () => initializeTask,
498
+ optimistic: (state) => promoteNewThreadReducer(state, threadId, initializeTask),
485
499
  then: (state, { remoteId, externalId }) => {
486
500
  if (adapterGeneration !== this._adapterGeneration) return state;
487
- const data = getThreadData(state, threadId);
488
- if (!data) return state;
489
- const mappingId = createThreadMappingId(threadId);
490
- return {
491
- ...state,
492
- threadIdMap: {
493
- ...state.threadIdMap,
494
- [remoteId]: mappingId
495
- },
496
- threadData: {
497
- ...state.threadData,
498
- [mappingId]: {
499
- ...data,
500
- initializeTask: Promise.resolve({
501
- remoteId,
502
- externalId
503
- }),
504
- remoteId,
505
- externalId
506
- }
507
- }
508
- };
501
+ const reconciliation = reconcileInitializedThread(state, threadId, remoteId, externalId, threadId);
502
+ removedMappingId = reconciliation.removedMappingId;
503
+ if (removedMappingId === this._mainThreadId) this._mainThreadId = reconciliation.survivorMappingId;
504
+ return reconciliation.state;
509
505
  }
510
506
  });
511
507
  this._requireAdapterGeneration(adapterGeneration);
508
+ if (removedMappingId !== void 0) this._hookManager.stopThreadRuntime(removedMappingId);
512
509
  return {
513
510
  remoteId,
514
511
  externalId
515
512
  };
516
513
  };
517
- generateTitle = async (threadId) => {
514
+ generateTitle = async (threadId, options) => {
518
515
  this._requireAdapterSettled();
519
516
  const adapter = this._options.adapter;
520
517
  const adapterGeneration = this._adapterGeneration;
@@ -526,16 +523,58 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
526
523
  const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);
527
524
  if (!runtimeCore) return;
528
525
  const messages = runtimeCore.messages.filter(isTitleSourceMessage);
529
- const stream = await adapter.generateTitle(remoteId, messages);
530
- const messageStream = AssistantMessageStream.fromAssistantStream(stream);
531
- for await (const result of messageStream) {
532
- if (adapterGeneration !== this._adapterGeneration) return;
533
- const newTitle = result.parts.filter((c) => c.type === "text")[0]?.text;
534
- await this._state.optimisticUpdate({
535
- execute: async () => {},
526
+ await runThreadTitleGeneration({
527
+ states: this._titleStates,
528
+ threadId: data.id,
529
+ automatic: options?.automatic === true,
530
+ generate: async (onTitle) => {
531
+ const stream = await adapter.generateTitle(remoteId, messages);
532
+ this._requireAdapterGeneration(adapterGeneration);
533
+ await applyTitleStream(stream, onTitle);
534
+ },
535
+ rename: async (title) => {
536
+ this._requireAdapterGeneration(adapterGeneration);
537
+ await adapter.rename(remoteId, title);
538
+ },
539
+ applyTitle: async (title) => {
540
+ await this._state.optimisticUpdate({
541
+ execute: async () => {},
542
+ optimistic: (state) => {
543
+ if (adapterGeneration !== this._adapterGeneration) return state;
544
+ const currentData = getThreadData(state, data.id);
545
+ if (!currentData) return state;
546
+ return {
547
+ ...state,
548
+ threadData: {
549
+ ...state.threadData,
550
+ [currentData.id]: {
551
+ ...currentData,
552
+ title
553
+ }
554
+ }
555
+ };
556
+ }
557
+ });
558
+ }
559
+ });
560
+ };
561
+ async rename(threadIdOrRemoteId, newTitle) {
562
+ this._requireAdapterSettled();
563
+ const adapter = this._options.adapter;
564
+ const adapterGeneration = this._adapterGeneration;
565
+ const data = this.getItemById(threadIdOrRemoteId);
566
+ if (!data) throw threadNotFoundError(threadIdOrRemoteId, "renaming it");
567
+ if (data.status === "new") throw threadStatusError(threadIdOrRemoteId, data.status, "be renamed");
568
+ const claim = startThreadTitleRename(this._titleStates, data.id, newTitle);
569
+ try {
570
+ const result = await this._state.optimisticUpdate({
571
+ execute: async () => {
572
+ const { remoteId } = await data.initializeTask;
573
+ this._requireAdapterGeneration(adapterGeneration);
574
+ return adapter.rename(remoteId, newTitle);
575
+ },
536
576
  optimistic: (state) => {
537
- if (adapterGeneration !== this._adapterGeneration) return state;
538
- const currentData = getThreadData(state, data.id);
577
+ const currentData = getThreadData(state, threadIdOrRemoteId);
539
578
  if (!currentData) return state;
540
579
  return {
541
580
  ...state,
@@ -549,36 +588,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
549
588
  };
550
589
  }
551
590
  });
591
+ finishThreadTitleRename(this._titleStates, data.id, claim, true);
592
+ return result;
593
+ } catch (error) {
594
+ finishThreadTitleRename(this._titleStates, data.id, claim, false);
595
+ throw error;
552
596
  }
553
- };
554
- async rename(threadIdOrRemoteId, newTitle) {
555
- this._requireAdapterSettled();
556
- const adapter = this._options.adapter;
557
- const adapterGeneration = this._adapterGeneration;
558
- const data = this.getItemById(threadIdOrRemoteId);
559
- if (!data) throw threadNotFoundError(threadIdOrRemoteId, "renaming it");
560
- if (data.status === "new") throw threadStatusError(threadIdOrRemoteId, data.status, "be renamed");
561
- return this._state.optimisticUpdate({
562
- execute: async () => {
563
- const { remoteId } = await data.initializeTask;
564
- this._requireAdapterGeneration(adapterGeneration);
565
- return adapter.rename(remoteId, newTitle);
566
- },
567
- optimistic: (state) => {
568
- const data = getThreadData(state, threadIdOrRemoteId);
569
- if (!data) return state;
570
- return {
571
- ...state,
572
- threadData: {
573
- ...state.threadData,
574
- [data.id]: {
575
- ...data,
576
- title: newTitle
577
- }
578
- }
579
- };
580
- }
581
- });
582
597
  }
583
598
  async updateCustom(threadIdOrRemoteId, custom) {
584
599
  this._requireAdapterSettled();
@@ -678,8 +693,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
678
693
  if (data.status !== "regular" && data.status !== "archived") throw threadStatusError(threadIdOrRemoteId, data.status, "be deleted");
679
694
  await this._ensureThreadIsNotMain(data.id);
680
695
  this._requireAdapterGeneration(adapterGeneration);
681
- this._hookManager.stopThreadRuntime(data.id);
682
- return this._state.optimisticUpdate({
696
+ const result = await this._state.optimisticUpdate({
683
697
  execute: async () => {
684
698
  const { remoteId } = await data.initializeTask;
685
699
  this._requireAdapterGeneration(adapterGeneration);
@@ -689,6 +703,9 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
689
703
  return updateStatusReducer(state, data.id, "deleted");
690
704
  }
691
705
  });
706
+ this._hookManager.stopThreadRuntime(data.id);
707
+ clearThreadTitleState(this._titleStates, data.id);
708
+ return result;
692
709
  }
693
710
  __internal_dispose() {
694
711
  this._hookManager.__internal_dispose();
@@ -702,17 +719,17 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
702
719
  this._requireAdapterGeneration(adapterGeneration);
703
720
  this._hookManager.stopThreadRuntime(data.id);
704
721
  }
705
- useBoundIds = create(() => []);
722
+ boundIdsStore = new WritableSubscribable([]);
706
723
  __internal_RenderComponent = () => {
707
724
  const id = useId();
708
725
  useEffect(() => {
709
- this.useBoundIds.setState((s) => [...s, id], true);
726
+ this.boundIdsStore.setState([...this.boundIdsStore.getState(), id]);
710
727
  return () => {
711
- this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);
728
+ this.boundIdsStore.setState(this.boundIdsStore.getState().filter((i) => i !== id));
712
729
  };
713
730
  }, [id]);
714
- const boundIds = this.useBoundIds();
715
- const { Provider } = this.useProvider();
731
+ const boundIds = useSubscribable(this.boundIdsStore);
732
+ const Provider = useSubscribable(this.providerStore);
716
733
  const aui = useAui();
717
734
  return (boundIds.length === 0 || boundIds[0] === id) && /* @__PURE__ */ jsxs(RuntimeAdapterProvider, {
718
735
  adapters: this._runtimeAdapters,