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