@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,15 @@
1
+ import { nullProtoRecord } from "../../utils/record.js";
1
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";
5
6
  import { useSubscribable } from "../../store/runtime-clients/useSubscribable.js";
6
7
  import { ThreadListAdapterChangedError } from "../../runtimes/remote-thread-list/adapter-changed.js";
7
8
  import { useStableRuntimeAdapters } from "./useRuntimeAdapters.js";
8
- 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";
9
11
  import { RuntimeAdapterProvider } from "./RuntimeAdapterProvider.js";
10
12
  import { RemoteThreadListHookInstanceManager } from "./RemoteThreadListHookInstanceManager.js";
11
- import { AssistantMessageStream } from "assistant-stream";
12
13
  import { Fragment, useEffect, useId } from "@assistant-ui/tap/react-shim";
13
14
  import { useAui } from "@assistant-ui/store";
14
15
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -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 }) => {
@@ -65,7 +67,8 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
65
67
  if (generation !== this._loadGeneration) return state;
66
68
  return {
67
69
  ...state,
68
- isLoading: true
70
+ isLoading: true,
71
+ loadError: void 0
69
72
  };
70
73
  },
71
74
  then: (state, l) => {
@@ -73,7 +76,10 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
73
76
  if (this._replaceListOnNextLoad) {
74
77
  this._replaceListOnNextLoad = false;
75
78
  replacedList = true;
76
- 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));
77
83
  }
78
84
  const fresh = classifyThreads(l.threads, {
79
85
  threadIds: [],
@@ -84,6 +90,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
84
90
  const merged = {
85
91
  ...state,
86
92
  isLoading: false,
93
+ loadError: void 0,
87
94
  cursor: normalizeCursor(l.nextCursor),
88
95
  threadIds: fresh.threadIds,
89
96
  archivedThreadIds: fresh.archivedThreadIds,
@@ -99,13 +106,17 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
99
106
  if (!this._replaceListOnNextLoad) {
100
107
  this._state.update({
101
108
  ...this._state.baseValue,
102
- isLoading: false
109
+ isLoading: false,
110
+ loadError: error
103
111
  });
104
112
  return;
105
113
  }
106
114
  this._replaceListOnNextLoad = false;
107
115
  replacedList = true;
108
- 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));
109
120
  }).then(() => {
110
121
  if (!replacedList) return;
111
122
  const threadId = this._options.threadId;
@@ -197,8 +208,10 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
197
208
  this._staleThreadIdsOnReplace = new Set(Object.values(this._state.baseValue.threadData).filter((item) => item.status !== "new").map((item) => item.id));
198
209
  this._state.update({
199
210
  ...this._state.baseValue,
200
- cursor: void 0
211
+ cursor: void 0,
212
+ loadError: void 0
201
213
  });
214
+ this._titleStates.clear();
202
215
  }
203
216
  if (controlledThreadIdChanged) this._switchToThreadFromProp(options.threadId).catch(() => {});
204
217
  }
@@ -211,8 +224,8 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
211
224
  _replaceWithThreads(state, threads, cursor) {
212
225
  const carried = [];
213
226
  if (state.newThreadId) {
214
- const mappingId = state.threadIdMap[state.newThreadId];
215
- const draft = mappingId ? state.threadData[mappingId] : void 0;
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;
216
229
  if (draft?.status === "new") carried.push(draft);
217
230
  }
218
231
  const stale = this._staleThreadIdsOnReplace;
@@ -225,12 +238,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
225
238
  const seed = {
226
239
  threadIds: [],
227
240
  archivedThreadIds: [],
228
- threadIdMap: {},
229
- threadData: {}
241
+ threadIdMap: nullProtoRecord(),
242
+ threadData: nullProtoRecord()
230
243
  };
231
244
  for (const item of carried) {
232
245
  const mappingId = createThreadMappingId(item.id);
233
- if (seed.threadData[mappingId]) continue;
246
+ if (Object.hasOwn(seed.threadData, mappingId)) continue;
234
247
  seed.threadIdMap[item.id] = mappingId;
235
248
  if (item.remoteId !== void 0) seed.threadIdMap[item.remoteId] = mappingId;
236
249
  seed.threadData[mappingId] = item;
@@ -238,7 +251,8 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
238
251
  const { threadIds, archivedThreadIds, threadIdMap, threadData } = classifyThreads(threads, seed);
239
252
  for (const item of carried) {
240
253
  if (item.remoteId === void 0) continue;
241
- const current = threadData[createThreadMappingId(item.id)];
254
+ const currentMappingId = createThreadMappingId(item.id);
255
+ const current = Object.hasOwn(threadData, currentMappingId) ? threadData[currentMappingId] : void 0;
242
256
  if (current === void 0) continue;
243
257
  if (current.status === "regular" && !threadIds.includes(current.id)) threadIds.push(current.id);
244
258
  else if (current.status === "archived" && !archivedThreadIds.includes(current.id)) archivedThreadIds.push(current.id);
@@ -251,7 +265,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
251
265
  archivedThreadIds,
252
266
  threadIdMap,
253
267
  threadData,
254
- 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
255
269
  };
256
270
  if (getThreadData(nextState, this._mainThreadId) === void 0) {
257
271
  const preservedDraft = nextState.newThreadId;
@@ -304,6 +318,9 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
304
318
  get isLoading() {
305
319
  return this._state.value.isLoading;
306
320
  }
321
+ get loadError() {
322
+ return this._state.value.loadError;
323
+ }
307
324
  get isLoadingMore() {
308
325
  return this._state.value.isLoadingMore;
309
326
  }
@@ -473,65 +490,28 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
473
490
  externalId
474
491
  };
475
492
  }
493
+ this._requireAdapterGeneration(adapterGeneration);
494
+ const initializeTask = adapter.initialize(threadId);
495
+ let removedMappingId;
476
496
  const { remoteId, externalId } = await this._state.optimisticUpdate({
477
- execute: () => {
478
- this._requireAdapterGeneration(adapterGeneration);
479
- return adapter.initialize(threadId);
480
- },
481
- optimistic: (state) => {
482
- return updateStatusReducer(state, threadId, "regular");
483
- },
484
- loading: (state, task) => {
485
- const mappingId = createThreadMappingId(threadId);
486
- return {
487
- ...state,
488
- threadData: {
489
- ...state.threadData,
490
- [mappingId]: {
491
- ...state.threadData[mappingId],
492
- initializeTask: task
493
- }
494
- }
495
- };
496
- },
497
+ execute: () => initializeTask,
498
+ optimistic: (state) => promoteNewThreadReducer(state, threadId, initializeTask),
497
499
  then: (state, { remoteId, externalId }) => {
498
500
  if (adapterGeneration !== this._adapterGeneration) return state;
499
- const data = getThreadData(state, threadId);
500
- if (!data) return state;
501
- const mappingId = createThreadMappingId(threadId);
502
- const listedMappingId = state.threadIdMap[remoteId];
503
- const orphan = listedMappingId !== void 0 && listedMappingId !== mappingId ? state.threadData[listedMappingId] : void 0;
504
- const threadData = { ...state.threadData };
505
- if (orphan !== void 0) delete threadData[listedMappingId];
506
- threadData[mappingId] = {
507
- ...data,
508
- initializeTask: Promise.resolve({
509
- remoteId,
510
- externalId
511
- }),
512
- remoteId,
513
- externalId
514
- };
515
- const rewire = (ids) => orphan === void 0 ? ids : ids.filter((id) => id !== orphan.id);
516
- return {
517
- ...state,
518
- threadIds: rewire(state.threadIds),
519
- archivedThreadIds: rewire(state.archivedThreadIds),
520
- threadIdMap: {
521
- ...state.threadIdMap,
522
- [remoteId]: mappingId
523
- },
524
- threadData
525
- };
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;
526
505
  }
527
506
  });
528
507
  this._requireAdapterGeneration(adapterGeneration);
508
+ if (removedMappingId !== void 0) this._hookManager.stopThreadRuntime(removedMappingId);
529
509
  return {
530
510
  remoteId,
531
511
  externalId
532
512
  };
533
513
  };
534
- generateTitle = async (threadId) => {
514
+ generateTitle = async (threadId, options) => {
535
515
  this._requireAdapterSettled();
536
516
  const adapter = this._options.adapter;
537
517
  const adapterGeneration = this._adapterGeneration;
@@ -543,16 +523,58 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
543
523
  const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);
544
524
  if (!runtimeCore) return;
545
525
  const messages = runtimeCore.messages.filter(isTitleSourceMessage);
546
- const stream = await adapter.generateTitle(remoteId, messages);
547
- const messageStream = AssistantMessageStream.fromAssistantStream(stream);
548
- for await (const result of messageStream) {
549
- if (adapterGeneration !== this._adapterGeneration) return;
550
- const newTitle = result.parts.filter((c) => c.type === "text")[0]?.text;
551
- await this._state.optimisticUpdate({
552
- 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
+ },
553
576
  optimistic: (state) => {
554
- if (adapterGeneration !== this._adapterGeneration) return state;
555
- const currentData = getThreadData(state, data.id);
577
+ const currentData = getThreadData(state, threadIdOrRemoteId);
556
578
  if (!currentData) return state;
557
579
  return {
558
580
  ...state,
@@ -566,36 +588,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
566
588
  };
567
589
  }
568
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;
569
596
  }
570
- };
571
- async rename(threadIdOrRemoteId, newTitle) {
572
- this._requireAdapterSettled();
573
- const adapter = this._options.adapter;
574
- const adapterGeneration = this._adapterGeneration;
575
- const data = this.getItemById(threadIdOrRemoteId);
576
- if (!data) throw threadNotFoundError(threadIdOrRemoteId, "renaming it");
577
- if (data.status === "new") throw threadStatusError(threadIdOrRemoteId, data.status, "be renamed");
578
- return this._state.optimisticUpdate({
579
- execute: async () => {
580
- const { remoteId } = await data.initializeTask;
581
- this._requireAdapterGeneration(adapterGeneration);
582
- return adapter.rename(remoteId, newTitle);
583
- },
584
- optimistic: (state) => {
585
- const data = getThreadData(state, threadIdOrRemoteId);
586
- if (!data) return state;
587
- return {
588
- ...state,
589
- threadData: {
590
- ...state.threadData,
591
- [data.id]: {
592
- ...data,
593
- title: newTitle
594
- }
595
- }
596
- };
597
- }
598
- });
599
597
  }
600
598
  async updateCustom(threadIdOrRemoteId, custom) {
601
599
  this._requireAdapterSettled();
@@ -695,8 +693,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
695
693
  if (data.status !== "regular" && data.status !== "archived") throw threadStatusError(threadIdOrRemoteId, data.status, "be deleted");
696
694
  await this._ensureThreadIsNotMain(data.id);
697
695
  this._requireAdapterGeneration(adapterGeneration);
698
- this._hookManager.stopThreadRuntime(data.id);
699
- return this._state.optimisticUpdate({
696
+ const result = await this._state.optimisticUpdate({
700
697
  execute: async () => {
701
698
  const { remoteId } = await data.initializeTask;
702
699
  this._requireAdapterGeneration(adapterGeneration);
@@ -706,6 +703,9 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
706
703
  return updateStatusReducer(state, data.id, "deleted");
707
704
  }
708
705
  });
706
+ this._hookManager.stopThreadRuntime(data.id);
707
+ clearThreadTitleState(this._titleStates, data.id);
708
+ return result;
709
709
  }
710
710
  __internal_dispose() {
711
711
  this._hookManager.__internal_dispose();