@assistant-ui/core 0.3.16 → 0.3.17

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 (305) hide show
  1. package/dist/index.d.ts +2 -2
  2. package/dist/index.js +2 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/internal.d.ts +2 -1
  5. package/dist/internal.js +2 -1
  6. package/dist/model-context/frame/provider.d.ts +3 -0
  7. package/dist/model-context/frame/provider.d.ts.map +1 -1
  8. package/dist/model-context/frame/provider.js +71 -21
  9. package/dist/model-context/frame/provider.js.map +1 -1
  10. package/dist/model-context/tool-call-text.d.ts +26 -0
  11. package/dist/model-context/tool-call-text.d.ts.map +1 -0
  12. package/dist/model-context/tool-call-text.js +18 -0
  13. package/dist/model-context/tool-call-text.js.map +1 -0
  14. package/dist/react/RuntimeAdapter.js +1 -1
  15. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  16. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  17. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  18. package/dist/react/client/AdaptedRemoteThread.js +1 -1
  19. package/dist/react/client/InMemoryThreadList.js +1 -1
  20. package/dist/react/client/Interactables.js +1 -1
  21. package/dist/react/client/RemoteThreadList.d.ts +15 -0
  22. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  23. package/dist/react/client/RemoteThreadList.js +240 -138
  24. package/dist/react/client/RemoteThreadList.js.map +1 -1
  25. package/dist/react/client/Tools.d.ts.map +1 -1
  26. package/dist/react/client/Tools.js +6 -2
  27. package/dist/react/client/Tools.js.map +1 -1
  28. package/dist/react/index.d.ts +2 -1
  29. package/dist/react/index.js +2 -1
  30. package/dist/react/interactables-legacy/Interactables.js +4 -4
  31. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  32. package/dist/react/model-context/toolbox.d.ts +2 -14
  33. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  34. package/dist/react/model-context/toolbox.js +1 -13
  35. package/dist/react/model-context/toolbox.js.map +1 -1
  36. package/dist/react/model-context/useAssistantContext.js +37 -7
  37. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  38. package/dist/react/model-context/useAuiToolOverrides.js +31 -5
  39. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  40. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  41. package/dist/react/model-context/useInlineRender.js +10 -36
  42. package/dist/react/model-context/useInlineRender.js.map +1 -1
  43. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  44. package/dist/react/primitive-hooks/useMessageError.js +2 -8
  45. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  46. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  47. package/dist/react/primitive-hooks/useThreadListLoadMore.js +2 -4
  48. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  49. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  50. package/dist/react/primitives/composer/ComposerAttachments.js +4 -3
  51. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  52. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  53. package/dist/react/primitives/composer/ComposerQueue.js +4 -3
  54. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  55. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  56. package/dist/react/primitives/message/MessageAttachments.js +7 -6
  57. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  58. package/dist/react/primitives/message/MessageGroupedParts.js +2 -2
  59. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  60. package/dist/react/primitives/message/MessageParts.js +3 -3
  61. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  62. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  63. package/dist/react/primitives/threadList/ThreadListItems.js +5 -4
  64. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  65. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +6 -4
  66. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  67. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +44 -22
  68. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  69. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +6 -5
  70. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  71. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +79 -62
  72. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  73. package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -6
  74. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  75. package/dist/react/runtimes/RemoteThreadResource.js +3 -3
  76. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  77. package/dist/react/runtimes/assistant-transport/useLatestRef.js +2 -2
  78. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -1
  79. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  80. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +23 -18
  81. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  82. package/dist/react/runtimes/cloud/auiV0.d.ts +5 -1
  83. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  84. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  85. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +29 -0
  86. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -0
  87. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +159 -0
  88. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -0
  89. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -9
  90. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  91. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +16 -153
  92. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  93. package/dist/react/runtimes/external-message-converter.js +1 -1
  94. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  95. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  96. package/dist/react/runtimes/useRemoteThreadListRuntime.js +14 -6
  97. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  98. package/dist/react/types/MessagePartComponentTypes.d.ts +7 -3
  99. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  100. package/dist/react/types/scopes/tools.d.ts +2 -0
  101. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  102. package/dist/runtime/api/message-part-runtime.d.ts +2 -2
  103. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  104. package/dist/runtime/api/message-part-runtime.js +1 -1
  105. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  106. package/dist/runtime/api/thread-list-runtime.d.ts +9 -1
  107. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  108. package/dist/runtime/api/thread-list-runtime.js +5 -0
  109. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  110. package/dist/runtime/api/thread-runtime.d.ts +1 -1
  111. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -2
  112. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  113. package/dist/runtime/base/base-thread-runtime-core.js +2 -2
  114. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  115. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +14 -2
  116. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  117. package/dist/runtime/interfaces/thread-runtime-core.d.ts +15 -1
  118. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  119. package/dist/runtime/utils/auto-status.d.ts +1 -1
  120. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  121. package/dist/runtime/utils/auto-status.js +6 -2
  122. package/dist/runtime/utils/auto-status.js.map +1 -1
  123. package/dist/runtime/utils/external-message-conversion.d.ts +3 -2
  124. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  125. package/dist/runtime/utils/external-message-conversion.js +4 -3
  126. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  127. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +6 -3
  128. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  129. package/dist/runtime/utils/resolveToolApprovalResponse.js +12 -3
  130. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -1
  131. package/dist/runtime/utils/thread-message-like.d.ts +2 -10
  132. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  133. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  134. package/dist/runtime/utils/tool-call-tree.d.ts +39 -0
  135. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -0
  136. package/dist/runtime/utils/tool-call-tree.js +85 -0
  137. package/dist/runtime/utils/tool-call-tree.js.map +1 -0
  138. package/dist/runtimes/external-store/external-store-adapter.d.ts +29 -2
  139. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  140. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +2 -1
  141. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  142. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +34 -28
  143. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  144. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +1 -1
  145. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  146. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  147. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  148. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  149. package/dist/runtimes/local/local-thread-runtime-core.js +3 -1
  150. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  151. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +1 -1
  152. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  153. package/dist/runtimes/remote-thread-list/remote-thread-state.js +30 -13
  154. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  155. package/dist/runtimes/remote-thread-list/title.d.ts +9 -0
  156. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -0
  157. package/dist/runtimes/remote-thread-list/title.js +6 -0
  158. package/dist/runtimes/remote-thread-list/title.js.map +1 -0
  159. package/dist/runtimes/remote-thread-list/types.d.ts +6 -5
  160. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  161. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +31 -8
  162. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  163. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +97 -60
  164. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  165. package/dist/store/clients/external-thread.d.ts +1 -1
  166. package/dist/store/clients/external-thread.d.ts.map +1 -1
  167. package/dist/store/clients/external-thread.js +11 -4
  168. package/dist/store/clients/external-thread.js.map +1 -1
  169. package/dist/store/clients/single-thread-list.js +1 -1
  170. package/dist/store/clients/suggestions.d.ts.map +1 -1
  171. package/dist/store/clients/suggestions.js +18 -6
  172. package/dist/store/clients/suggestions.js.map +1 -1
  173. package/dist/store/clients/thread-message-client.js +1 -1
  174. package/dist/store/clients/thread-selection-events.js +1 -1
  175. package/dist/store/index.d.ts +2 -1
  176. package/dist/store/index.js +2 -1
  177. package/dist/store/internal.d.ts +2 -2
  178. package/dist/store/internal.js +2 -2
  179. package/dist/store/primitive-predicates.d.ts +4 -1
  180. package/dist/store/primitive-predicates.d.ts.map +1 -1
  181. package/dist/store/primitive-predicates.js +9 -1
  182. package/dist/store/primitive-predicates.js.map +1 -1
  183. package/dist/store/runtime-clients/composer-runtime-client.js +1 -1
  184. package/dist/store/runtime-clients/message-runtime-client.js +1 -1
  185. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
  186. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  187. package/dist/store/runtime-clients/thread-list-runtime-client.js +124 -105
  188. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  189. package/dist/store/runtime-clients/thread-runtime-client.js +1 -1
  190. package/dist/store/runtime-clients/useSubscribable.d.ts +3 -1
  191. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  192. package/dist/store/runtime-clients/useSubscribable.js +1 -1
  193. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  194. package/dist/store/scopes/part.d.ts +6 -3
  195. package/dist/store/scopes/part.d.ts.map +1 -1
  196. package/dist/subscribable/subscribable.d.ts +8 -1
  197. package/dist/subscribable/subscribable.d.ts.map +1 -1
  198. package/dist/subscribable/subscribable.js +24 -16
  199. package/dist/subscribable/subscribable.js.map +1 -1
  200. package/dist/types/message.d.ts +40 -1
  201. package/dist/types/message.d.ts.map +1 -1
  202. package/dist/types/message.js +7 -1
  203. package/dist/types/message.js.map +1 -1
  204. package/package.json +12 -17
  205. package/src/index.ts +6 -1
  206. package/src/internal.ts +8 -0
  207. package/src/model-context/frame/provider.test.ts +217 -1
  208. package/src/model-context/frame/provider.ts +111 -23
  209. package/src/model-context/tool-call-text.test.ts +67 -0
  210. package/src/model-context/tool-call-text.ts +67 -0
  211. package/src/react/AssistantRuntimeProvider.test.tsx +66 -2
  212. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -3
  213. package/src/react/client/RemoteThreadList.background.test.ts +384 -0
  214. package/src/react/client/RemoteThreadList.concurrent.test.tsx +274 -0
  215. package/src/react/client/RemoteThreadList.test.ts +273 -1
  216. package/src/react/client/RemoteThreadList.ts +293 -83
  217. package/src/react/client/Tools.ts +7 -1
  218. package/src/react/index.ts +4 -0
  219. package/src/react/model-context/modelContextHooks.test.tsx +131 -0
  220. package/src/react/model-context/toolbox.test.ts +9 -9
  221. package/src/react/model-context/toolbox.ts +9 -36
  222. package/src/react/model-context/useAssistantContext.ts +4 -2
  223. package/src/react/model-context/useAuiToolOverrides.ts +4 -2
  224. package/src/react/model-context/useInlineRender.test.tsx +48 -0
  225. package/src/react/model-context/useInlineRender.ts +14 -10
  226. package/src/react/primitive-hooks/useMessageError.ts +2 -19
  227. package/src/react/primitive-hooks/useThreadListLoadMore.ts +2 -3
  228. package/src/react/primitives/composer/ComposerAttachments.test.tsx +76 -0
  229. package/src/react/primitives/composer/ComposerAttachments.tsx +9 -4
  230. package/src/react/primitives/composer/ComposerQueue.test.tsx +72 -0
  231. package/src/react/primitives/composer/ComposerQueue.tsx +7 -4
  232. package/src/react/primitives/message/MessageAttachments.test.tsx +107 -37
  233. package/src/react/primitives/message/MessageAttachments.tsx +10 -7
  234. package/src/react/primitives/message/MessageGroupedParts.tsx +2 -2
  235. package/src/react/primitives/message/MessageParts.tsx +3 -3
  236. package/src/react/primitives/threadList/ThreadListItems.test.tsx +99 -0
  237. package/src/react/primitives/threadList/ThreadListItems.tsx +8 -5
  238. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +94 -1
  239. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +72 -31
  240. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +169 -0
  241. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +114 -68
  242. package/src/react/runtimes/RemoteThreadResource.ts +1 -4
  243. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +51 -2
  244. package/src/react/runtimes/assistant-transport/useLatestRef.ts +2 -2
  245. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +45 -0
  246. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +65 -1
  247. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +42 -35
  248. package/src/react/runtimes/cloud/auiV0.ts +5 -0
  249. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +88 -0
  250. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +236 -0
  251. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +90 -1
  252. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +33 -238
  253. package/src/react/runtimes/external-message-converter.ts +1 -0
  254. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +216 -0
  255. package/src/react/runtimes/useRemoteThreadListRuntime.ts +24 -6
  256. package/src/react/types/MessagePartComponentTypes.ts +7 -3
  257. package/src/react/types/scopes/tools.ts +2 -0
  258. package/src/runtime/api/message-part-runtime.ts +3 -3
  259. package/src/runtime/api/thread-list-runtime.ts +25 -1
  260. package/src/runtime/base/base-thread-runtime-core.test.ts +94 -3
  261. package/src/runtime/base/base-thread-runtime-core.ts +10 -4
  262. package/src/runtime/interfaces/thread-list-runtime-core.ts +20 -1
  263. package/src/runtime/interfaces/thread-runtime-core.ts +17 -1
  264. package/src/runtime/utils/auto-status.test.ts +57 -0
  265. package/src/runtime/utils/auto-status.ts +13 -1
  266. package/src/runtime/utils/external-message-conversion.test.ts +97 -0
  267. package/src/runtime/utils/external-message-conversion.ts +17 -1
  268. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +73 -0
  269. package/src/runtime/utils/resolveToolApprovalResponse.ts +27 -6
  270. package/src/runtime/utils/thread-message-like.ts +2 -10
  271. package/src/runtime/utils/tool-call-tree.test.ts +191 -0
  272. package/src/runtime/utils/tool-call-tree.ts +97 -0
  273. package/src/runtimes/external-store/external-store-adapter.ts +38 -2
  274. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +56 -33
  275. package/src/runtimes/inert/InertThreadRuntimeCore.ts +1 -1
  276. package/src/runtimes/local/local-thread-runtime-core.test.ts +29 -3
  277. package/src/runtimes/local/local-thread-runtime-core.ts +5 -1
  278. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +112 -0
  279. package/src/runtimes/remote-thread-list/remote-thread-state.ts +55 -16
  280. package/src/runtimes/remote-thread-list/title.ts +3 -0
  281. package/src/runtimes/remote-thread-list/types.ts +6 -5
  282. package/src/runtimes/tool-invocations/EDGE_CASES.md +110 -5
  283. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +750 -136
  284. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +144 -91
  285. package/src/store/clients/external-thread.ts +14 -8
  286. package/src/store/clients/suggestions.test.ts +155 -1
  287. package/src/store/clients/suggestions.ts +42 -34
  288. package/src/store/index.ts +4 -0
  289. package/src/store/internal.ts +2 -0
  290. package/src/store/primitive-predicates.ts +35 -0
  291. package/src/store/runtime-clients/thread-list-runtime-client.ts +16 -2
  292. package/src/store/runtime-clients/useSubscribable.ts +8 -2
  293. package/src/store/scopes/part.ts +6 -3
  294. package/src/subscribable/subscribable.test.ts +50 -0
  295. package/src/subscribable/subscribable.ts +33 -21
  296. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +111 -0
  297. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +78 -0
  298. package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +52 -0
  299. package/src/tests/external-store-optimistic-id.test.ts +79 -0
  300. package/src/tests/external-store-repository-instance.test.ts +166 -0
  301. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +22 -16
  302. package/src/tests/external-thread-attachments.test.tsx +85 -1
  303. package/src/tests/remote-thread-list-adapter-switch.test.ts +66 -1
  304. package/src/tests/thread-switch-events.test.tsx +397 -2
  305. package/src/types/message.ts +50 -2
@@ -6,11 +6,12 @@ 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";
10
+ import { Derived, attachTransformScopes, useAssistantContextProvider, useAssistantContextValue, useClientLookup, useClientResource, useConfiguredAui } from "@assistant-ui/store/client";
9
11
  import { AssistantMessageStream } from "assistant-stream";
10
12
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
11
- import { useCallback, useEffect, useMemo, useState, useSyncExternalStore } from "@assistant-ui/tap/react-shim";
13
+ import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "@assistant-ui/tap/react-shim";
12
14
  import { resource, withKey } from "@assistant-ui/tap";
13
- import { attachTransformScopes, useClientLookup, useClientResource } from "@assistant-ui/store/client";
14
15
  //#region src/react/client/RemoteThreadList.ts
15
16
  const RESOLVED_PROMISE = Promise.resolve();
16
17
  const EMPTY_LIST = createEmptyRemoteThreadState();
@@ -115,98 +116,175 @@ const isSameThread = (listState, left, right) => {
115
116
  const data = getThreadData(listState, left);
116
117
  return data !== void 0 && itemMatchesId(data, listState, right);
117
118
  };
119
+ const useRemoteThreadBody = ({ id, status, remoteId, item, thread }) => {
120
+ const parent = useAssistantContextValue();
121
+ const [isRunning, setIsRunning] = useState(false);
122
+ const itemHandle = useClientResource(item(isRunning));
123
+ const { client } = useConfiguredAui(parent, { threadListItem: Derived({
124
+ source: "threads",
125
+ query: {
126
+ type: "id",
127
+ id
128
+ },
129
+ get: () => itemHandle.methods
130
+ }) });
131
+ const bornNewRef = useRef(status === "new");
132
+ const titleFiredRef = useRef(false);
133
+ return useAssistantContextProvider(client, function useBoundRemoteBody() {
134
+ const body = useClientResource(thread);
135
+ const bodyRunning = body.state.isRunning === true;
136
+ useEffect(() => {
137
+ setIsRunning(bodyRunning);
138
+ }, [bodyRunning]);
139
+ const hasTitleSource = bornNewRef.current && !titleFiredRef.current && remoteId !== void 0 && body.state.messages.some(isTitleSourceMessage);
140
+ useEffect(() => {
141
+ if (!hasTitleSource || titleFiredRef.current) return;
142
+ titleFiredRef.current = true;
143
+ client.threadListItem.generateTitle();
144
+ }, [hasTitleSource]);
145
+ return body.methods;
146
+ });
147
+ };
148
+ const RemoteThreadBody = resource(useRemoteThreadBody);
149
+ const useMainThreadFacade = (current) => {
150
+ const currentRef = useRef(current);
151
+ useEffect(() => {
152
+ currentRef.current = current;
153
+ }, [current]);
154
+ const [facade] = useState(() => new Proxy({}, {
155
+ get: (_, prop) => currentRef.current[prop],
156
+ has: (__0, prop_0) => prop_0 in currentRef.current,
157
+ ownKeys: () => Reflect.ownKeys(currentRef.current),
158
+ getOwnPropertyDescriptor: (__1, prop_1) => Reflect.getOwnPropertyDescriptor(currentRef.current, prop_1)
159
+ }));
160
+ return facade;
161
+ };
118
162
  const useRemoteThreadListView = (t0) => {
119
- const $ = c(39);
120
- const { listState, mainThreadId, threadFactory, useAdapters, onSwitchTo, onRename, onUpdateCustom, onArchive, onUnarchive, onDelete, onGenerateTitle, onInitialize, onDetach } = t0;
163
+ const $ = c(21);
164
+ const { listState, mainThreadId, startedIds, backgroundThreads, threadFactory, useAdapters, onSwitchTo, onRename, onUpdateCustom, onArchive, onUnarchive, onDelete, onGenerateTitle, onInitialize, onDetach } = t0;
121
165
  let t1;
122
- let t2;
123
- if ($[0] !== mainThreadId || $[1] !== threadFactory || $[2] !== useAdapters) {
124
- const thread = threadFactory(mainThreadId);
166
+ bb0: {
167
+ if (!backgroundThreads) {
168
+ let t2;
169
+ if ($[0] !== mainThreadId) {
170
+ t2 = [mainThreadId];
171
+ $[0] = mainThreadId;
172
+ $[1] = t2;
173
+ } else t2 = $[1];
174
+ t1 = t2;
175
+ break bb0;
176
+ }
177
+ let ids;
178
+ if ($[2] !== listState || $[3] !== startedIds) {
179
+ const seen = /* @__PURE__ */ new Set();
180
+ const seenRemoteIds = /* @__PURE__ */ new Set();
181
+ ids = [];
182
+ for (const id of startedIds) {
183
+ const data = getThreadData(listState, id);
184
+ if (!data || seen.has(data.id)) continue;
185
+ if (data.remoteId !== void 0 && seenRemoteIds.has(data.remoteId)) continue;
186
+ seen.add(data.id);
187
+ if (data.remoteId !== void 0) seenRemoteIds.add(data.remoteId);
188
+ ids.push(data.id);
189
+ }
190
+ $[2] = listState;
191
+ $[3] = startedIds;
192
+ $[4] = ids;
193
+ } else ids = $[4];
194
+ t1 = ids;
195
+ }
196
+ const bodyIds = t1;
197
+ const itemElementFor = (data_0, isRunning) => ThreadListItemClient({
198
+ data: data_0,
199
+ isRunning,
200
+ onSwitchTo: (options) => handleThreadListAction("switch", () => onSwitchTo(data_0.id, options)),
201
+ onRename: (title) => handleThreadListAction("rename", () => onRename(data_0.id, title)),
202
+ onUpdateCustom: (custom) => handleThreadListAction("update custom metadata", () => onUpdateCustom(data_0.id, custom)),
203
+ onArchive: () => handleThreadListAction("archive", () => onArchive(data_0.id)),
204
+ onUnarchive: () => handleThreadListAction("unarchive", () => onUnarchive(data_0.id)),
205
+ 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)),
207
+ onInitialize: () => onInitialize(data_0.id),
208
+ onDetach: () => handleThreadListAction("detach", () => onDetach(data_0.id))
209
+ });
210
+ const bodies = useClientLookup(bodyIds.map((id_0) => {
211
+ const made = threadFactory(id_0);
212
+ const thread = backgroundThreads && made.key === void 0 ? withKey(id_0, made) : made;
125
213
  const wrapped = useAdapters === void 0 ? thread : AdaptedRemoteThread({
126
214
  useAdapters,
127
215
  thread
128
216
  });
129
- t1 = useClientResource;
130
- t2 = thread.key === void 0 ? wrapped : withKey(thread.key, wrapped);
131
- $[0] = mainThreadId;
132
- $[1] = threadFactory;
133
- $[2] = useAdapters;
134
- $[3] = t1;
135
- $[4] = t2;
136
- } else {
137
- t1 = $[3];
138
- t2 = $[4];
139
- }
140
- const mainThreadClient = t1(t2);
217
+ const data_1 = getThreadData(listState, id_0);
218
+ const element = backgroundThreads && data_1 !== void 0 ? RemoteThreadBody({
219
+ id: id_0,
220
+ status: data_1.status,
221
+ remoteId: data_1.remoteId,
222
+ item: (isRunning_0) => itemElementFor(data_1, isRunning_0),
223
+ thread: wrapped
224
+ }) : wrapped;
225
+ return withKey(backgroundThreads ? id_0 : made.key ?? "main", element);
226
+ }));
227
+ let t2;
228
+ if ($[5] !== bodyIds || $[6] !== listState) {
229
+ t2 = (id_1) => {
230
+ const direct = bodyIds.indexOf(id_1);
231
+ if (direct !== -1) return direct;
232
+ return bodyIds.findIndex((bodyId) => isSameThread(listState, bodyId, id_1));
233
+ };
234
+ $[5] = bodyIds;
235
+ $[6] = listState;
236
+ $[7] = t2;
237
+ } else t2 = $[7];
238
+ const bodyIndexOf = t2;
239
+ const bodyStateOf = (id_2) => {
240
+ const index = bodyIndexOf(id_2);
241
+ return index === -1 ? void 0 : bodies.state[index];
242
+ };
141
243
  let t3;
142
- if ($[5] !== listState || $[6] !== mainThreadId) {
143
- t3 = collectItemOrder(listState, mainThreadId);
144
- $[5] = listState;
145
- $[6] = mainThreadId;
146
- $[7] = t3;
147
- } else t3 = $[7];
148
- const itemOrder = t3;
149
244
  let t4;
150
- if ($[8] !== itemOrder || $[9] !== listState || $[10] !== mainThreadClient || $[11] !== mainThreadId || $[12] !== onArchive || $[13] !== onDelete || $[14] !== onDetach || $[15] !== onGenerateTitle || $[16] !== onInitialize || $[17] !== onRename || $[18] !== onSwitchTo || $[19] !== onUnarchive || $[20] !== onUpdateCustom) {
151
- let t5;
152
- if ($[22] !== listState || $[23] !== mainThreadClient || $[24] !== mainThreadId || $[25] !== onArchive || $[26] !== onDelete || $[27] !== onDetach || $[28] !== onGenerateTitle || $[29] !== onInitialize || $[30] !== onRename || $[31] !== onSwitchTo || $[32] !== onUnarchive || $[33] !== onUpdateCustom) {
153
- t5 = (data) => withKey(data.id, ThreadListItemClient({
154
- data,
155
- isRunning: itemMatchesId(data, listState, mainThreadId) && mainThreadClient.state.isRunning,
156
- onSwitchTo: (options) => handleThreadListAction("switch", () => onSwitchTo(data.id, options)),
157
- onRename: (title) => handleThreadListAction("rename", () => onRename(data.id, title)),
158
- onUpdateCustom: (custom) => handleThreadListAction("update custom metadata", () => onUpdateCustom(data.id, custom)),
159
- onArchive: () => handleThreadListAction("archive", () => onArchive(data.id)),
160
- onUnarchive: () => handleThreadListAction("unarchive", () => onUnarchive(data.id)),
161
- onDelete: () => handleThreadListAction("delete", () => onDelete(data.id)),
162
- onGenerateTitle: () => handleThreadListAction("generate title", () => onGenerateTitle(data.id, mainThreadClient.state.messages)),
163
- onInitialize: () => onInitialize(data.id),
164
- onDetach: () => handleThreadListAction("detach", () => onDetach(data.id))
165
- }));
166
- $[22] = listState;
167
- $[23] = mainThreadClient;
168
- $[24] = mainThreadId;
169
- $[25] = onArchive;
170
- $[26] = onDelete;
171
- $[27] = onDetach;
172
- $[28] = onGenerateTitle;
173
- $[29] = onInitialize;
174
- $[30] = onRename;
175
- $[31] = onSwitchTo;
176
- $[32] = onUnarchive;
177
- $[33] = onUpdateCustom;
178
- $[34] = t5;
179
- } else t5 = $[34];
180
- t4 = itemOrder.map(t5);
181
- $[8] = itemOrder;
182
- $[9] = listState;
183
- $[10] = mainThreadClient;
184
- $[11] = mainThreadId;
185
- $[12] = onArchive;
186
- $[13] = onDelete;
187
- $[14] = onDetach;
188
- $[15] = onGenerateTitle;
189
- $[16] = onInitialize;
190
- $[17] = onRename;
191
- $[18] = onSwitchTo;
192
- $[19] = onUnarchive;
193
- $[20] = onUpdateCustom;
194
- $[21] = t4;
195
- } else t4 = $[21];
196
- const threadListItems = useClientLookup(t4);
197
245
  let t5;
198
- if ($[35] !== itemOrder || $[36] !== mainThreadClient || $[37] !== threadListItems) {
199
- t5 = {
246
+ if ($[8] !== bodies || $[9] !== bodyIndexOf || $[10] !== mainThreadId) {
247
+ const mainIndex = bodyIndexOf(mainThreadId);
248
+ t5 = bodies.state[mainIndex];
249
+ t3 = useMainThreadFacade;
250
+ t4 = bodies.get({ index: mainIndex });
251
+ $[8] = bodies;
252
+ $[9] = bodyIndexOf;
253
+ $[10] = mainThreadId;
254
+ $[11] = t3;
255
+ $[12] = t4;
256
+ $[13] = t5;
257
+ } else {
258
+ t3 = $[11];
259
+ t4 = $[12];
260
+ t5 = $[13];
261
+ }
262
+ const mainThreadClient = {
263
+ state: t5,
264
+ methods: t3(t4)
265
+ };
266
+ let t6;
267
+ if ($[14] !== listState || $[15] !== mainThreadId) {
268
+ t6 = collectItemOrder(listState, mainThreadId);
269
+ $[14] = listState;
270
+ $[15] = mainThreadId;
271
+ $[16] = t6;
272
+ } else t6 = $[16];
273
+ const itemOrder = t6;
274
+ const threadListItems = useClientLookup(itemOrder.map((data_2) => withKey(data_2.id, itemElementFor(data_2, backgroundThreads ? bodyStateOf(data_2.id)?.isRunning ?? false : itemMatchesId(data_2, listState, mainThreadId) && mainThreadClient.state.isRunning))));
275
+ let t7;
276
+ if ($[17] !== itemOrder || $[18] !== mainThreadClient || $[19] !== threadListItems) {
277
+ t7 = {
200
278
  mainThreadClient,
201
279
  itemOrder,
202
280
  threadListItems
203
281
  };
204
- $[35] = itemOrder;
205
- $[36] = mainThreadClient;
206
- $[37] = threadListItems;
207
- $[38] = t5;
208
- } else t5 = $[38];
209
- return t5;
282
+ $[17] = itemOrder;
283
+ $[18] = mainThreadClient;
284
+ $[19] = threadListItems;
285
+ $[20] = t7;
286
+ } else t7 = $[20];
287
+ return t7;
210
288
  };
211
289
  const useRemoteThreadList = (props) => {
212
290
  const { adapter, thread: threadFactory, threadId, onThreadIdChange, onSwitchToThread, onSwitchToNewThread, onDelete } = props;
@@ -234,12 +312,14 @@ const useRemoteThreadList = (props) => {
234
312
  }
235
313
  };
236
314
  });
237
- session.adapter = adapter;
238
315
  const listState = useSyncExternalStore((onStoreChange) => store.subscribe(onStoreChange), () => store.value, () => store.value);
239
316
  const [mainThreadId, setMainThreadId] = useState(initialMainId);
317
+ const [startedIds, setStartedIds] = useState([initialMainId]);
318
+ const [backgroundThreads] = useState(props.backgroundThreads === true);
240
319
  const assignMainThreadId = useCallback((id) => {
241
320
  session.mainThreadId = id;
242
321
  setMainThreadId(id);
322
+ setStartedIds((prev) => prev.includes(id) ? prev : [...prev, id]);
243
323
  }, [session]);
244
324
  useThreadSelectionEvents(mainThreadId);
245
325
  useEffect(() => {
@@ -268,18 +348,21 @@ const useRemoteThreadList = (props) => {
268
348
  const statusAtRequest = statusSnapshot(store.baseValue);
269
349
  session.loadPromise = store.optimisticUpdate({
270
350
  execute: () => adapter_0.list(),
271
- loading: (state) => ({
272
- ...state,
273
- isLoading: true
274
- }),
351
+ loading: (state) => {
352
+ if (generation !== session.loadGeneration) return state;
353
+ return {
354
+ ...state,
355
+ isLoading: true
356
+ };
357
+ },
275
358
  then: (state_0, page) => {
276
359
  if (generation !== session.loadGeneration) return state_0;
277
360
  session.adapterAtLoad = adapter_0;
278
361
  const fresh = classifyThreads(page.threads, {
279
362
  threadIds: [],
280
363
  archivedThreadIds: [],
281
- threadIdMap: {},
282
- threadData: {}
364
+ threadIdMap: { ...state_0.threadIdMap },
365
+ threadData: { ...state_0.threadData }
283
366
  });
284
367
  const merged = {
285
368
  ...state_0,
@@ -287,14 +370,8 @@ const useRemoteThreadList = (props) => {
287
370
  cursor: normalizeCursor(page.nextCursor),
288
371
  threadIds: fresh.threadIds,
289
372
  archivedThreadIds: fresh.archivedThreadIds,
290
- threadIdMap: {
291
- ...state_0.threadIdMap,
292
- ...fresh.threadIdMap
293
- },
294
- threadData: {
295
- ...state_0.threadData,
296
- ...fresh.threadData
297
- }
373
+ threadIdMap: fresh.threadIdMap,
374
+ threadData: fresh.threadData
298
375
  };
299
376
  return preserveMidLoadTransitions(merged, state_0, statusAtRequest);
300
377
  }
@@ -325,6 +402,7 @@ const useRemoteThreadList = (props) => {
325
402
  isLoading: true
326
403
  });
327
404
  assignMainThreadId(seeded_0.id);
405
+ setStartedIds([seeded_0.id]);
328
406
  notifyRemoteId(void 0, true);
329
407
  } else store.update({
330
408
  ...store.baseValue,
@@ -357,10 +435,13 @@ const useRemoteThreadList = (props) => {
357
435
  const currentAdapter = session.adapter;
358
436
  const task = store.optimisticUpdate({
359
437
  execute: () => currentAdapter.list({ after: cursor }),
360
- loading: (state_1) => ({
361
- ...state_1,
362
- isLoadingMore: true
363
- }),
438
+ loading: (state_1) => {
439
+ if (generation_0 !== session.loadGeneration) return state_1;
440
+ return {
441
+ ...state_1,
442
+ isLoadingMore: true
443
+ };
444
+ },
364
445
  then: (state_2, page_0) => {
365
446
  if (generation_0 !== session.loadGeneration) return state_2;
366
447
  const appended = classifyThreads(page_0.threads, {
@@ -440,21 +521,27 @@ const useRemoteThreadList = (props) => {
440
521
  }
441
522
  if (!data) throw threadNotFoundError(threadIdOrRemoteId, "switching to it");
442
523
  if (isSameThread(store.value, data.id, session.mainThreadId)) return;
443
- if (data.status === "archived" && options?.unarchive !== false) {
444
- const current = data;
524
+ const targetId = data.id;
525
+ let current = data;
526
+ if (current.status === "archived" && options?.unarchive !== false) {
445
527
  const { remoteId: remoteId_0 } = await current.initializeTask;
446
528
  if (generation_2 !== session.switchGeneration) return;
447
- await store.optimisticUpdate({
448
- execute: () => session.adapter.unarchive(remoteId_0),
449
- optimistic: (state_4) => updateStatusReducer(state_4, current.id, "regular")
450
- });
451
- if (generation_2 !== session.switchGeneration) return;
452
- data = getThreadData(store.value, current.id) ?? current;
529
+ current = getThreadData(store.value, targetId);
530
+ if (current?.id !== targetId) return;
531
+ if (current.status === "archived") {
532
+ await store.optimisticUpdate({
533
+ execute: () => session.adapter.unarchive(remoteId_0),
534
+ optimistic: (state_4) => updateStatusReducer(state_4, targetId, "regular")
535
+ });
536
+ if (generation_2 !== session.switchGeneration) return;
537
+ current = getThreadData(store.value, targetId);
538
+ if (current?.id !== targetId) return;
539
+ }
453
540
  }
454
541
  if (generation_2 !== session.switchGeneration) return;
455
- assignMainThreadId(data.id);
456
- notifyRemoteId(data.remoteId, emitThreadIdChange);
457
- session.onSwitchToThread?.(data.id);
542
+ assignMainThreadId(current.id);
543
+ notifyRemoteId(current.remoteId, emitThreadIdChange);
544
+ session.onSwitchToThread?.(current.id);
458
545
  }), [
459
546
  assignMainThreadId,
460
547
  notifyRemoteId,
@@ -546,24 +633,29 @@ const useRemoteThreadList = (props) => {
546
633
  const data_1 = getThreadData(state_7, threadId_1);
547
634
  if (!data_1) return state_7;
548
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);
549
650
  return {
550
651
  ...state_7,
652
+ threadIds: rewire(state_7.threadIds),
653
+ archivedThreadIds: rewire(state_7.archivedThreadIds),
551
654
  threadIdMap: {
552
655
  ...state_7.threadIdMap,
553
656
  [remoteId_1]: mappingId_1
554
657
  },
555
- threadData: {
556
- ...state_7.threadData,
557
- [mappingId_1]: {
558
- ...data_1,
559
- initializeTask: Promise.resolve({
560
- remoteId: remoteId_1,
561
- externalId
562
- }),
563
- remoteId: remoteId_1,
564
- externalId
565
- }
566
- }
658
+ threadData
567
659
  };
568
660
  }
569
661
  });
@@ -721,7 +813,7 @@ const useRemoteThreadList = (props) => {
721
813
  if (data_7.status === "new") throw threadStatusError(threadIdOrRemoteId_5, data_7.status, "generate a title");
722
814
  const { remoteId: remoteId_7 } = await data_7.initializeTask;
723
815
  requireAdapterGeneration(adapterGeneration_5);
724
- if (!isSameThread(store.value, data_7.id, session.mainThreadId)) return;
816
+ if (!backgroundThreads && !isSameThread(store.value, data_7.id, session.mainThreadId)) return;
725
817
  if (!messages) return;
726
818
  const stream = await currentAdapter_6.generateTitle(remoteId_7, messages);
727
819
  requireAdapterGeneration(adapterGeneration_5);
@@ -746,24 +838,31 @@ const useRemoteThreadList = (props) => {
746
838
  });
747
839
  });
748
840
  }, [
841
+ backgroundThreads,
749
842
  requireAdapterGeneration,
750
843
  session,
751
844
  store
752
845
  ]);
846
+ const detach = useCallback(async (threadId_2) => {
847
+ await ensureNotMain(threadId_2);
848
+ setStartedIds((prev_0) => prev_0.filter((id_3) => id_3 !== threadId_2));
849
+ }, [ensureNotMain]);
753
850
  const { mainThreadClient, itemOrder, threadListItems } = useRemoteThreadListView({
754
851
  listState,
755
852
  mainThreadId,
853
+ startedIds,
854
+ backgroundThreads,
756
855
  threadFactory,
757
856
  useAdapters: adapter.unstable_useAdapters,
758
- onSwitchTo: (id_2, options_0) => switchToThread(id_2, options_0),
759
- onRename: (id_3, title) => rename(id_3, title),
760
- onUpdateCustom: (id_4, custom_0) => updateCustom(id_4, custom_0),
761
- onArchive: (id_5) => archive(id_5),
762
- onUnarchive: (id_6) => unarchive(id_6),
763
- onDelete: (id_7) => deleteThread(id_7),
764
- onGenerateTitle: (id_8, messages_0) => generateTitle(id_8, messages_0),
765
- onInitialize: async (id_9) => toInitializeResult(await initialize(id_9)),
766
- onDetach: (id_10) => ensureNotMain(id_10)
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)
767
866
  });
768
867
  const mainRemoteId = getThreadData(listState, mainThreadId)?.remoteId;
769
868
  useEffect(() => {
@@ -819,8 +918,8 @@ const useRemoteThreadList = (props) => {
819
918
  ]);
820
919
  return {
821
920
  getState: () => state_14,
822
- switchToThread: (id_11, options_1) => {
823
- handleThreadListAction("switch", () => switchToThread(id_11, options_1));
921
+ switchToThread: (id_13, options_1) => {
922
+ handleThreadListAction("switch", () => switchToThread(id_13, options_1));
824
923
  },
825
924
  switchToNewThread: () => {
826
925
  handleThreadListAction("create", () => switchToNewThread());
@@ -841,9 +940,9 @@ const useRemoteThreadList = (props) => {
841
940
  const index_0 = itemOrder.findIndex((item_0) => itemMatchesId(item_0, listState, selector.id));
842
941
  return threadListItems.get({ index: index_0 });
843
942
  }
844
- const id_12 = (selector.archived ? listState.archivedThreadIds : listState.threadIds)[selector.index];
845
- if (id_12 === void 0) return threadListItems.get({ index: -1 });
846
- const index_1 = itemOrder.findIndex((item_1) => itemMatchesId(item_1, listState, id_12));
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));
847
946
  return threadListItems.get({ index: index_1 });
848
947
  },
849
948
  thread: () => mainThreadClient.methods
@@ -856,6 +955,9 @@ const useRemoteThreadList = (props) => {
856
955
  * and attachments come from `unstable_useAdapters`. `useRemoteThreadListRuntime`
857
956
  * uses the same hook when `unstable_Provider` is omitted. Key the factory
858
957
  * with `withKey` so history reloads when the visible thread changes.
958
+ * With `backgroundThreads`, every visited thread stays mounted: runs continue
959
+ * across switches, per-item `isRunning` is live, and freshly initialized
960
+ * threads title themselves.
859
961
  */
860
962
  const RemoteThreadList = resource(useRemoteThreadList);
861
963
  attachTransformScopes(useRemoteThreadList, inMemoryThreadListTransformScopes);