@assistant-ui/core 0.3.13 → 0.3.14

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 (396) hide show
  1. package/dist/adapters/speech.d.ts.map +1 -1
  2. package/dist/adapters/speech.js +9 -15
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +2 -0
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/adapters/voice.d.ts.map +1 -1
  7. package/dist/adapters/voice.js +27 -15
  8. package/dist/adapters/voice.js.map +1 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/internal.d.ts +1 -1
  12. package/dist/internal.js +6 -6
  13. package/dist/model-context/frame/host.d.ts.map +1 -1
  14. package/dist/model-context/frame/host.js +2 -1
  15. package/dist/model-context/frame/host.js.map +1 -1
  16. package/dist/model-context/registry.d.ts.map +1 -1
  17. package/dist/model-context/registry.js +16 -4
  18. package/dist/model-context/registry.js.map +1 -1
  19. package/dist/react/RuntimeAdapter.d.ts +8 -1
  20. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  21. package/dist/react/RuntimeAdapter.js +23 -18
  22. package/dist/react/RuntimeAdapter.js.map +1 -1
  23. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  26. package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
  27. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
  28. package/dist/react/client/AdaptedRemoteThread.js +27 -0
  29. package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
  30. package/dist/react/client/InMemoryThreadList.d.ts +19 -0
  31. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
  32. package/dist/react/client/InMemoryThreadList.js +418 -0
  33. package/dist/react/client/InMemoryThreadList.js.map +1 -0
  34. package/dist/react/client/Interactables.d.ts.map +1 -1
  35. package/dist/react/client/Interactables.js +159 -102
  36. package/dist/react/client/Interactables.js.map +1 -1
  37. package/dist/react/client/RemoteThreadList.d.ts +34 -0
  38. package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
  39. package/dist/react/client/RemoteThreadList.js +826 -0
  40. package/dist/react/client/RemoteThreadList.js.map +1 -0
  41. package/dist/react/client/Tools.d.ts.map +1 -1
  42. package/dist/react/client/Tools.js +38 -27
  43. package/dist/react/client/Tools.js.map +1 -1
  44. package/dist/react/index.d.ts +7 -2
  45. package/dist/react/index.js +5 -2
  46. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  47. package/dist/react/interactables-legacy/Interactables.js +145 -110
  48. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  49. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  50. package/dist/react/primitive-hooks/useActionBarCopy.js +13 -18
  51. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  52. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  53. package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
  54. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  55. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  56. package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
  57. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  58. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  59. package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
  60. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  61. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  62. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
  63. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  64. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  65. package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
  66. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  67. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  68. package/dist/react/primitive-hooks/useComposerSend.js +2 -4
  69. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  70. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  71. package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
  72. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  73. package/dist/react/primitives/message/MessageParts.d.ts +13 -0
  74. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  75. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  76. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  77. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  78. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  79. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +22 -10
  80. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  81. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +109 -71
  82. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  83. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -2
  84. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +40 -13
  86. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  87. package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
  88. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
  89. package/dist/react/runtimes/RemoteThreadResource.js +134 -0
  90. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
  91. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
  92. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  93. package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
  94. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  95. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
  96. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
  97. package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
  98. package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
  99. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
  100. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  101. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
  102. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
  103. package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
  104. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
  105. package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
  106. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
  107. package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
  108. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
  109. package/dist/react/runtimes/assistant-transport/types.js +0 -0
  110. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
  111. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
  112. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
  113. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
  114. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
  115. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
  116. package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
  117. package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
  118. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
  119. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
  120. package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
  121. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
  122. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
  124. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  125. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
  126. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  127. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
  128. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  129. package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
  130. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  131. package/dist/react/runtimes/cloud/auiV0.js +7 -0
  132. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  133. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  134. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +22 -12
  135. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  136. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
  137. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
  138. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
  139. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
  140. package/dist/react/runtimes/external-message-converter.js +14 -14
  141. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  142. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  143. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
  144. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  145. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  146. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  147. package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
  148. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
  149. package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
  150. package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
  151. package/dist/runtime/api/composer-runtime.d.ts +5 -0
  152. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  153. package/dist/runtime/api/composer-runtime.js.map +1 -1
  154. package/dist/runtime/api/message-runtime.js +1 -1
  155. package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
  156. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  157. package/dist/runtime/api/thread-list-runtime.js +4 -2
  158. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  159. package/dist/runtime/api/thread-runtime.d.ts +12 -2
  160. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  161. package/dist/runtime/api/thread-runtime.js +8 -2
  162. package/dist/runtime/api/thread-runtime.js.map +1 -1
  163. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  164. package/dist/runtime/base/base-composer-runtime-core.js +8 -7
  165. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  166. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  167. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  168. package/dist/runtime/base/base-thread-runtime-core.js +3 -3
  169. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  170. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
  171. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  172. package/dist/runtime/base/default-thread-composer-runtime-core.js +10 -4
  173. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  174. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  175. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  176. package/dist/runtime/internal.js +5 -5
  177. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  178. package/dist/runtime/queue/message-queue.js +2 -1
  179. package/dist/runtime/queue/message-queue.js.map +1 -1
  180. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
  181. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
  182. package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
  183. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
  184. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  185. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  186. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
  187. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  188. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +8 -0
  189. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  190. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +35 -13
  191. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  192. package/dist/runtimes/internal.d.ts +1 -1
  193. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  194. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  195. package/dist/runtimes/local/local-thread-runtime-core.js +53 -13
  196. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  197. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -0
  198. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  199. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  200. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  201. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  202. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  203. package/dist/runtimes/remote-thread-list/types.d.ts +29 -1
  204. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  205. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
  206. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  207. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
  208. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  209. package/dist/store/clients/suggestions.js +2 -2
  210. package/dist/store/clients/suggestions.js.map +1 -1
  211. package/dist/store/clients/thread-selection-events.d.ts +10 -0
  212. package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
  213. package/dist/store/clients/thread-selection-events.js +40 -0
  214. package/dist/store/clients/thread-selection-events.js.map +1 -0
  215. package/dist/store/env.d.ts +5 -0
  216. package/dist/store/env.d.ts.map +1 -0
  217. package/dist/store/env.js +12 -0
  218. package/dist/store/env.js.map +1 -0
  219. package/dist/store/index.d.ts +5 -3
  220. package/dist/store/index.js +4 -2
  221. package/dist/store/internal.d.ts +4 -1
  222. package/dist/store/internal.js +4 -1
  223. package/dist/store/primitive-predicates.d.ts +19 -0
  224. package/dist/store/primitive-predicates.d.ts.map +1 -0
  225. package/dist/store/primitive-predicates.js +19 -0
  226. package/dist/store/primitive-predicates.js.map +1 -0
  227. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  228. package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
  229. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  230. package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
  231. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
  232. package/dist/store/runtime-clients/handle-runtime-action.js +12 -0
  233. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
  234. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
  235. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
  236. package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
  237. package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
  238. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  239. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +62 -29
  240. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  241. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  242. package/dist/store/runtime-clients/thread-list-runtime-client.js +5 -6
  243. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  244. package/dist/store/scopes/composer.d.ts +9 -4
  245. package/dist/store/scopes/composer.d.ts.map +1 -1
  246. package/dist/store/scopes/thread-list-item.d.ts +7 -6
  247. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  248. package/dist/store/scopes/thread.d.ts +8 -7
  249. package/dist/store/scopes/thread.d.ts.map +1 -1
  250. package/dist/store/scopes/threads.d.ts +17 -1
  251. package/dist/store/scopes/threads.d.ts.map +1 -1
  252. package/dist/subscribable/subscribable.d.ts +2 -1
  253. package/dist/subscribable/subscribable.d.ts.map +1 -1
  254. package/dist/subscribable/subscribable.js +23 -18
  255. package/dist/subscribable/subscribable.js.map +1 -1
  256. package/dist/utils/composite-context-provider.d.ts +1 -0
  257. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  258. package/dist/utils/composite-context-provider.js +25 -9
  259. package/dist/utils/composite-context-provider.js.map +1 -1
  260. package/dist/utils/notify-event-listeners.d.ts +2 -2
  261. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  262. package/dist/utils/notify-event-listeners.js +2 -2
  263. package/dist/utils/notify-event-listeners.js.map +1 -1
  264. package/package.json +7 -7
  265. package/src/adapters/speech.test.ts +118 -1
  266. package/src/adapters/speech.ts +21 -22
  267. package/src/adapters/thread-history.ts +2 -0
  268. package/src/adapters/voice.test.ts +69 -0
  269. package/src/adapters/voice.ts +27 -27
  270. package/src/index.ts +1 -0
  271. package/src/model-context/frame/host.test.ts +23 -0
  272. package/src/model-context/frame/host.ts +2 -1
  273. package/src/model-context/registry.test.ts +131 -0
  274. package/src/model-context/registry.ts +16 -6
  275. package/src/react/RuntimeAdapter.test.ts +2 -0
  276. package/src/react/RuntimeAdapter.ts +20 -8
  277. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
  278. package/src/react/client/AdaptedRemoteThread.ts +41 -0
  279. package/src/react/client/InMemoryThreadList.test.tsx +148 -0
  280. package/src/react/client/InMemoryThreadList.ts +290 -0
  281. package/src/react/client/Interactables.test.ts +326 -2
  282. package/src/react/client/Interactables.ts +227 -110
  283. package/src/react/client/RemoteThreadList.test.ts +1026 -0
  284. package/src/react/client/RemoteThreadList.ts +1067 -0
  285. package/src/react/client/Tools.ts +36 -29
  286. package/src/react/index.ts +13 -0
  287. package/src/react/interactables-legacy/Interactables.test.ts +317 -0
  288. package/src/react/interactables-legacy/Interactables.ts +204 -128
  289. package/src/react/primitive-hooks/useActionBarCopy.ts +2 -7
  290. package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
  291. package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
  292. package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
  293. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
  294. package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
  295. package/src/react/primitive-hooks/useComposerSend.ts +2 -5
  296. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
  297. package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
  298. package/src/react/primitives/message/MessageParts.tsx +0 -1
  299. package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
  300. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
  301. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
  302. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
  303. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
  304. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +159 -124
  305. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +59 -20
  306. package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
  307. package/src/react/runtimes/RemoteThreadResource.ts +231 -0
  308. package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
  309. package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
  310. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
  311. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
  312. package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
  313. package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
  314. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
  315. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
  316. package/src/react/runtimes/assistant-transport/types.ts +170 -0
  317. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
  318. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +625 -0
  319. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +481 -0
  320. package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
  321. package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
  322. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
  323. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
  324. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
  325. package/src/react/runtimes/cloud/auiV0.ts +17 -1
  326. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +36 -21
  327. package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
  328. package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
  329. package/src/react/runtimes/external-message-converter.test.ts +143 -0
  330. package/src/react/runtimes/external-message-converter.ts +41 -41
  331. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
  332. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
  333. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +13 -3
  334. package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
  335. package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
  336. package/src/react/runtimes/useLocalRuntime.test.tsx +130 -4
  337. package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
  338. package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
  339. package/src/runtime/api/composer-runtime.ts +5 -0
  340. package/src/runtime/api/thread-list-runtime.ts +3 -1
  341. package/src/runtime/api/thread-runtime.ts +20 -2
  342. package/src/runtime/base/base-composer-runtime-core.ts +6 -5
  343. package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
  344. package/src/runtime/base/base-thread-runtime-core.ts +11 -2
  345. package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -4
  346. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  347. package/src/runtime/queue/message-queue.ts +2 -1
  348. package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
  349. package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
  350. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  351. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +99 -34
  352. package/src/runtimes/local/local-thread-runtime-core.test.ts +373 -4
  353. package/src/runtimes/local/local-thread-runtime-core.ts +79 -14
  354. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  355. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  356. package/src/runtimes/remote-thread-list/types.ts +30 -0
  357. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
  358. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
  359. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
  360. package/src/store/clients/model-context-client.test.ts +16 -8
  361. package/src/store/clients/suggestions.ts +2 -2
  362. package/src/store/clients/thread-selection-events.ts +21 -0
  363. package/src/store/env.ts +11 -0
  364. package/src/store/index.ts +14 -1
  365. package/src/store/internal.ts +13 -0
  366. package/src/store/primitive-predicates.test.ts +184 -0
  367. package/src/store/primitive-predicates.ts +43 -0
  368. package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
  369. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
  370. package/src/store/runtime-clients/handle-runtime-action.ts +11 -0
  371. package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
  372. package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
  373. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +15 -7
  374. package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
  375. package/src/store/scopes/composer.ts +9 -4
  376. package/src/store/scopes/thread-list-item.ts +7 -6
  377. package/src/store/scopes/thread.ts +8 -7
  378. package/src/store/scopes/threads.ts +14 -0
  379. package/src/subscribable/subscribable.test.ts +77 -1
  380. package/src/subscribable/subscribable.ts +38 -23
  381. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
  382. package/src/tests/auiV0Encode.test.ts +66 -0
  383. package/src/tests/base-composer-runtime-core-send.test.ts +30 -0
  384. package/src/tests/base-composer-runtime-core.test.ts +28 -0
  385. package/src/tests/composer-can-cancel.test.ts +101 -0
  386. package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
  387. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +191 -1
  388. package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
  389. package/src/tests/interactables-toolui-migration.test.tsx +66 -0
  390. package/src/tests/message-queue.test.ts +28 -0
  391. package/src/tests/session-reset-notification.test.ts +145 -0
  392. package/src/tests/thread-switch-events.test.tsx +99 -1
  393. package/src/tests/tools-scope-migration.test.tsx +58 -0
  394. package/src/utils/composite-context-provider.test.ts +139 -0
  395. package/src/utils/composite-context-provider.ts +26 -8
  396. package/src/utils/notify-event-listeners.ts +10 -5
@@ -1,21 +1,24 @@
1
- import { generateId } from "../../utils/id.js";
2
1
  import { BaseSubscribable } from "../../subscribable/subscribable.js";
2
+ import { generateId } from "../../utils/id.js";
3
3
  import { OptimisticState } from "../../runtimes/remote-thread-list/optimistic-state.js";
4
4
  import { EMPTY_THREAD_CORE } from "../../runtimes/remote-thread-list/empty-thread-core.js";
5
5
  import { classifyThreads, createThreadMappingId, getThreadData, normalizeCursor, updateStatusReducer } from "../../runtimes/remote-thread-list/remote-thread-state.js";
6
+ import { useStableRuntimeAdapters } from "./useRuntimeAdapters.js";
6
7
  import { RuntimeAdapterProvider } from "./RuntimeAdapterProvider.js";
8
+ import { isTitleSourceMessage } from "./RemoteThreadResource.js";
7
9
  import { RemoteThreadListHookInstanceManager } from "./RemoteThreadListHookInstanceManager.js";
8
10
  import { AssistantMessageStream } from "assistant-stream";
9
11
  import { Fragment, useEffect, useId } from "@assistant-ui/tap/react-shim";
10
- import { jsx } from "react/jsx-runtime";
12
+ import { useAui } from "@assistant-ui/store";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
11
14
  import { create } from "zustand";
12
15
  //#region src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx
13
- const asProviderComponent = (provider) => provider ?? Fragment;
14
16
  const threadNotFoundError = (threadIdOrRemoteId, action) => /* @__PURE__ */ new Error(`Thread "${threadIdOrRemoteId}" not found while ${action}.`);
15
17
  const threadStatusError = (threadIdOrRemoteId, status, action) => /* @__PURE__ */ new Error(`Thread "${threadIdOrRemoteId}" has status "${status}", so it cannot ${action}.`);
16
18
  var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
17
19
  _options;
18
20
  _hookManager;
21
+ _runtimeAdapters;
19
22
  _loadThreadsPromise;
20
23
  _loadMorePromise;
21
24
  _loadGeneration = 0;
@@ -32,6 +35,27 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
32
35
  threadIdMap: {},
33
36
  threadData: {}
34
37
  });
38
+ _useAdaptersProvider = ({ children }) => {
39
+ const useAdapters = this._options.adapter.unstable_useAdapters;
40
+ if (useAdapters === void 0) return children;
41
+ return /* @__PURE__ */ jsx(this._SynthesizedAdapters, {
42
+ useAdapters,
43
+ children
44
+ });
45
+ };
46
+ _SynthesizedAdapters = ({ useAdapters, children }) => {
47
+ const adapters = useStableRuntimeAdapters(useAdapters());
48
+ if (adapters == null) return children;
49
+ return /* @__PURE__ */ jsx(RuntimeAdapterProvider, {
50
+ adapters,
51
+ children
52
+ });
53
+ };
54
+ resolveProvider(adapter) {
55
+ if (adapter.unstable_Provider !== void 0) return adapter.unstable_Provider;
56
+ if (adapter.unstable_useAdapters === void 0) return Fragment;
57
+ return this._useAdaptersProvider;
58
+ }
35
59
  get threadItems() {
36
60
  return this._state.value.threadData;
37
61
  }
@@ -122,17 +146,17 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
122
146
  this._loadMorePromise = dedup;
123
147
  return dedup;
124
148
  }
125
- contextProvider;
126
149
  constructor(options, contextProvider) {
127
150
  super();
128
- this.contextProvider = contextProvider;
129
151
  this._state.subscribe(() => {
130
152
  this._notifySubscribers();
131
153
  this._notifyThreadIdChange();
132
154
  });
155
+ this._runtimeAdapters = { modelContext: contextProvider };
133
156
  this._hookManager = new RemoteThreadListHookInstanceManager(options.runtimeHook, this);
157
+ this._hookManager.__internal_setDefaultAdapters(this._runtimeAdapters);
134
158
  this._hookManager.__internal_subscribeRunningChanged(() => this._notifySubscribers());
135
- this.useProvider = create(() => ({ Provider: asProviderComponent(options.adapter.unstable_Provider) }));
159
+ this.useProvider = create(() => ({ Provider: this.resolveProvider(options.adapter) }));
136
160
  this.__internal_setOptions(options);
137
161
  this.switchToNewThread();
138
162
  }
@@ -143,7 +167,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
143
167
  const adapterChanged = this._options !== void 0 && this._options.adapter !== options.adapter;
144
168
  const controlledThreadIdChanged = this._initialThreadLoaded && this._options !== void 0 && this._options.threadId !== options.threadId;
145
169
  this._options = options;
146
- const Provider = asProviderComponent(options.adapter.unstable_Provider);
170
+ const Provider = this.resolveProvider(options.adapter);
147
171
  if (Provider !== this.useProvider.getState().Provider) this.useProvider.setState({ Provider }, true);
148
172
  this._hookManager.setRuntimeHook(options.runtimeHook);
149
173
  if (adapterChanged) {
@@ -323,7 +347,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
323
347
  await this._state.waitForUpdate();
324
348
  if (generation !== this._switchGeneration) return;
325
349
  }
326
- const state = this._state.value;
350
+ const state = this._state.baseValue;
327
351
  let id = this._state.value.newThreadId;
328
352
  if (id === void 0) {
329
353
  do
@@ -420,7 +444,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
420
444
  const { remoteId } = await data.initializeTask;
421
445
  const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);
422
446
  if (!runtimeCore) return;
423
- const messages = runtimeCore.messages;
447
+ const messages = runtimeCore.messages.filter(isTitleSourceMessage);
424
448
  const stream = await this._options.adapter.generateTitle(remoteId, messages);
425
449
  const messageStream = AssistantMessageStream.fromAssistantStream(stream);
426
450
  for await (const result of messageStream) {
@@ -558,6 +582,9 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
558
582
  }
559
583
  });
560
584
  }
585
+ __internal_dispose() {
586
+ this._hookManager.__internal_dispose();
587
+ }
561
588
  async detach(threadIdOrRemoteId) {
562
589
  const data = this.getItemById(threadIdOrRemoteId);
563
590
  if (!data) throw threadNotFoundError(threadIdOrRemoteId, "detaching it");
@@ -576,10 +603,10 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
576
603
  }, [id]);
577
604
  const boundIds = this.useBoundIds();
578
605
  const { Provider } = this.useProvider();
579
- const adapters = { modelContext: this.contextProvider };
580
- return (boundIds.length === 0 || boundIds[0] === id) && /* @__PURE__ */ jsx(RuntimeAdapterProvider, {
581
- adapters,
582
- children: /* @__PURE__ */ jsx(this._hookManager.__internal_RenderThreadRuntimes, { provider: Provider })
606
+ const aui = useAui();
607
+ return (boundIds.length === 0 || boundIds[0] === id) && /* @__PURE__ */ jsxs(RuntimeAdapterProvider, {
608
+ adapters: this._runtimeAdapters,
609
+ children: [/* @__PURE__ */ jsx(this._hookManager.__internal_RenderThreadRuntimes, { provider: Provider }), /* @__PURE__ */ jsx(this._hookManager.__internal_Host, { parentClient: aui })]
583
610
  });
584
611
  };
585
612
  };
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","generateId","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadListOptions","RemoteThreadListProviderComponent","RemoteThreadListHookInstanceManager","ComponentType","FC","Fragment","PropsWithChildren","useEffect","useId","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","asProviderComponent","provider","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_switchGeneration","_switchTask","_mainThreadId","_state","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","threadItems","value","getLoadThreadsPromise","generation","optimisticUpdate","execute","adapter","list","loading","state","then","l","fresh","threads","nextCursor","catch","error","console","update","baseValue","loadMore","initialState","resolve","dedup","after","appended","contextProvider","constructor","options","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","__internal_subscribeRunningChanged","useProvider","Provider","unstable_Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","controlledThreadIdChanged","threadId","getState","setState","setRuntimeHook","_switchToThreadFromProp","__internal_load","startThreadId","initialThreadId","switchTask","switchToThread","reloadMainThread","getItemById","runtimeCore","getThreadRuntimeCore","unstable_refetchThread","__internal_restartThreadRuntime","reload","hasMore","mainThreadId","_mainThreadRemoteId","remoteId","_lastNotifiedThreadId","emit","onThreadIdChange","getMainThreadRuntimeCore","result","data","id","unstable_isThreadRunning","__internal_isThreadRunning","unarchive","_startSwitchToThread","emitThreadIdChange","task","_switchToThread","remoteMetadata","fetch","mappingId","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","wasInTarget","includes","threadIdsWithoutRemote","filter","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","startThreadRuntime","_startSwitchToNewThread","_switchToNewThread","waitForUpdate","initialize","optimistic","generateTitle","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","startedFallback","archive","delete","stopThreadRuntime","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","adapters","modelContext","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadListOptions,\n RemoteThreadListProviderComponent,\n} from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport {\n type ComponentType,\n type FC,\n Fragment,\n type PropsWithChildren,\n useEffect,\n useId,\n} from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nconst asProviderComponent = (\n provider: RemoteThreadListProviderComponent | undefined,\n): ComponentType<PropsWithChildren> =>\n (provider ?? Fragment) as ComponentType<PropsWithChildren>;\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this._hookManager.__internal_subscribeRunningChanged(() =>\n this._notifySubscribers(),\n );\n this.useProvider = create(() => ({\n Provider: asProviderComponent(options.adapter.unstable_Provider),\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n const controlledThreadIdChanged =\n this._initialThreadLoaded &&\n this._options !== undefined &&\n this._options.threadId !== options.threadId;\n\n this._options = options;\n\n const Provider = asProviderComponent(options.adapter.unstable_Provider);\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n\n if (controlledThreadIdChanged) {\n this._switchToThreadFromProp(options.threadId).catch(() => {});\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n if (this._initialThreadLoaded) return;\n this._initialThreadLoaded = true;\n\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (startThreadId !== undefined) {\n const switchTask =\n this._options.threadId !== undefined\n ? this._switchToThreadFromProp(startThreadId)\n : this.switchToThread(startThreadId);\n switchTask.catch(() => {});\n }\n }\n\n public async reloadMainThread(): Promise<void> {\n const threadId = this._mainThreadId;\n if (threadId === undefined) return;\n\n // An unsent thread holds no remote state, so a refetch would only discard\n // what the user has typed.\n if (this.getItemById(threadId)?.status === \"new\") return;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(threadId);\n\n try {\n if (runtimeCore?.unstable_refetchThread) {\n // Called on the core so class-method implementations keep `this`.\n await runtimeCore.unstable_refetchThread();\n } else {\n await this._hookManager.__internal_restartThreadRuntime(threadId);\n }\n } catch (error) {\n // delete and detach switch the main thread away before stopping the\n // runtime, so a rejection once that has happened belongs to them.\n if (threadId !== this._mainThreadId) return;\n throw error;\n }\n\n if (threadId !== this._mainThreadId) return;\n this._notifySubscribers();\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange(emit = true) {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n if (emit) {\n this._options.onThreadIdChange?.(threadId);\n }\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public unstable_isThreadRunning(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) return false;\n return this._hookManager.__internal_isThreadRunning(data.id);\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._startSwitchToThread(threadIdOrRemoteId, options, true);\n }\n\n private _startSwitchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(\n threadIdOrRemoteId,\n options,\n generation,\n emitThreadIdChange,\n );\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // A concurrent `list()` may already have placed this thread; keep that\n // position and only merge metadata. A genuinely absent thread stays\n // appended: it may live on an unloaded page, and a prepend would pin it\n // above newer threads permanently since `classifyThreads` skips ids it\n // has already seen. Filtering both arrays first still prevents\n // duplication or a wrong-status entry from `list()`.\n const remoteId = remoteMetadata.remoteId;\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteId)\n : state.archivedThreadIds.includes(remoteId);\n\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n void task.then(\n () => this._notifySubscribers(),\n () => undefined,\n );\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange(emitThreadIdChange);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._startSwitchToNewThread(true);\n }\n\n private _switchToThreadFromProp(threadId: string | undefined): Promise<void> {\n return threadId !== undefined\n ? this._startSwitchToThread(threadId, undefined, false)\n : this._startSwitchToNewThread(false);\n }\n\n private _startSwitchToNewThread(emitThreadIdChange: boolean): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation, emitThreadIdChange);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this._switchToThread(id, undefined, generation, emitThreadIdChange);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","generateId","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadListAdapter","RemoteThreadListOptions","RemoteThreadListHookInstanceManager","isTitleSourceMessage","ComponentType","FC","Fragment","PropsWithChildren","useEffect","useId","useAui","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","useStableRuntimeAdapters","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_runtimeAdapters","modelContext","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_switchGeneration","_switchTask","_mainThreadId","_state","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","_useAdaptersProvider","children","useAdapters","adapter","unstable_useAdapters","_SynthesizedAdapters","NonNullable","adapters","resolveProvider","unstable_Provider","threadItems","value","getLoadThreadsPromise","generation","optimisticUpdate","execute","list","loading","state","then","l","fresh","threads","nextCursor","catch","error","console","update","baseValue","loadMore","initialState","resolve","dedup","after","appended","constructor","options","contextProvider","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","__internal_setDefaultAdapters","__internal_subscribeRunningChanged","useProvider","Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","controlledThreadIdChanged","threadId","getState","setState","setRuntimeHook","_switchToThreadFromProp","__internal_load","startThreadId","initialThreadId","switchTask","switchToThread","reloadMainThread","getItemById","runtimeCore","getThreadRuntimeCore","unstable_refetchThread","__internal_restartThreadRuntime","reload","hasMore","mainThreadId","_mainThreadRemoteId","remoteId","_lastNotifiedThreadId","emit","onThreadIdChange","getMainThreadRuntimeCore","result","data","id","unstable_isThreadRunning","__internal_isThreadRunning","unarchive","_startSwitchToThread","emitThreadIdChange","task","_switchToThread","remoteMetadata","fetch","mappingId","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","wasInTarget","includes","threadIdsWithoutRemote","filter","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","startThreadRuntime","_startSwitchToNewThread","_switchToNewThread","waitForUpdate","initialize","optimistic","generateTitle","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","startedFallback","archive","delete","stopThreadRuntime","__internal_dispose","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","aui","enabled","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadListAdapter,\n RemoteThreadListOptions,\n} from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { isTitleSourceMessage } from \"./RemoteThreadResource\";\nimport {\n type ComponentType,\n type FC,\n Fragment,\n type PropsWithChildren,\n useEffect,\n useId,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\nimport { useStableRuntimeAdapters } from \"./useRuntimeAdapters\";\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n private readonly _runtimeAdapters: { modelContext: ModelContextProvider };\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n private readonly _useAdaptersProvider: FC<PropsWithChildren> = ({\n children,\n }) => {\n const useAdapters = this._options.adapter.unstable_useAdapters;\n if (useAdapters === undefined) return children;\n return (\n <this._SynthesizedAdapters useAdapters={useAdapters}>\n {children}\n </this._SynthesizedAdapters>\n );\n };\n\n private readonly _SynthesizedAdapters: FC<\n PropsWithChildren<{\n useAdapters: NonNullable<RemoteThreadListAdapter[\"unstable_useAdapters\"]>;\n }>\n > = ({ useAdapters, children }) => {\n const adapters = useStableRuntimeAdapters(useAdapters());\n if (adapters == null) return children;\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n\n private resolveProvider(\n adapter: RemoteThreadListAdapter,\n ): ComponentType<PropsWithChildren> {\n if (adapter.unstable_Provider !== undefined) {\n return adapter.unstable_Provider as ComponentType<PropsWithChildren>;\n }\n if (adapter.unstable_useAdapters === undefined) return Fragment;\n return this._useAdaptersProvider;\n }\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._runtimeAdapters = { modelContext: contextProvider };\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this._hookManager.__internal_setDefaultAdapters(this._runtimeAdapters);\n this._hookManager.__internal_subscribeRunningChanged(() =>\n this._notifySubscribers(),\n );\n this.useProvider = create(() => ({\n Provider: this.resolveProvider(options.adapter),\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n const controlledThreadIdChanged =\n this._initialThreadLoaded &&\n this._options !== undefined &&\n this._options.threadId !== options.threadId;\n\n this._options = options;\n\n const Provider = this.resolveProvider(options.adapter);\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n\n if (controlledThreadIdChanged) {\n this._switchToThreadFromProp(options.threadId).catch(() => {});\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n if (this._initialThreadLoaded) return;\n this._initialThreadLoaded = true;\n\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (startThreadId !== undefined) {\n const switchTask =\n this._options.threadId !== undefined\n ? this._switchToThreadFromProp(startThreadId)\n : this.switchToThread(startThreadId);\n switchTask.catch(() => {});\n }\n }\n\n public async reloadMainThread(): Promise<void> {\n const threadId = this._mainThreadId;\n if (threadId === undefined) return;\n\n // An unsent thread holds no remote state, so a refetch would only discard\n // what the user has typed.\n if (this.getItemById(threadId)?.status === \"new\") return;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(threadId);\n\n try {\n if (runtimeCore?.unstable_refetchThread) {\n // Called on the core so class-method implementations keep `this`.\n await runtimeCore.unstable_refetchThread();\n } else {\n await this._hookManager.__internal_restartThreadRuntime(threadId);\n }\n } catch (error) {\n // delete and detach switch the main thread away before stopping the\n // runtime, so a rejection once that has happened belongs to them.\n if (threadId !== this._mainThreadId) return;\n throw error;\n }\n\n if (threadId !== this._mainThreadId) return;\n this._notifySubscribers();\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange(emit = true) {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n if (emit) {\n this._options.onThreadIdChange?.(threadId);\n }\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public unstable_isThreadRunning(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) return false;\n return this._hookManager.__internal_isThreadRunning(data.id);\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._startSwitchToThread(threadIdOrRemoteId, options, true);\n }\n\n private _startSwitchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(\n threadIdOrRemoteId,\n options,\n generation,\n emitThreadIdChange,\n );\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // A concurrent `list()` may already have placed this thread; keep that\n // position and only merge metadata. A genuinely absent thread stays\n // appended: it may live on an unloaded page, and a prepend would pin it\n // above newer threads permanently since `classifyThreads` skips ids it\n // has already seen. Filtering both arrays first still prevents\n // duplication or a wrong-status entry from `list()`.\n const remoteId = remoteMetadata.remoteId;\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteId)\n : state.archivedThreadIds.includes(remoteId);\n\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n void task.then(\n () => this._notifySubscribers(),\n () => undefined,\n );\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange(emitThreadIdChange);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._startSwitchToNewThread(true);\n }\n\n private _switchToThreadFromProp(threadId: string | undefined): Promise<void> {\n return threadId !== undefined\n ? this._startSwitchToThread(threadId, undefined, false)\n : this._startSwitchToNewThread(false);\n }\n\n private _startSwitchToNewThread(emitThreadIdChange: boolean): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation, emitThreadIdChange);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.baseValue;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this._switchToThread(id, undefined, generation, emitThreadIdChange);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n // Incomplete assistant turns (running status, possibly empty content)\n // would make the payload race-dependent; the title reads settled\n // messages only, matching the trigger's readiness gate.\n const messages = runtimeCore.messages.filter(isTitleSourceMessage);\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public __internal_dispose() {\n this._hookManager.__internal_dispose();\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n const aui = useAui();\n const enabled = boundIds.length === 0 || boundIds[0] === id;\n\n return (\n enabled && (\n <RuntimeAdapterProvider adapters={this._runtimeAdapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n <this._hookManager.__internal_Host parentClient={aui} />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Unsubscribe } from "../../types/unsubscribe.js";
2
+ import { ThreadRuntimeCore } from "../../runtime/interfaces/thread-runtime-core.js";
3
+ import { ThreadListRuntimeCore } from "../../runtime/interfaces/thread-list-runtime-core.js";
4
+ import { ThreadListItemRuntime } from "../../runtime/api/thread-list-item-runtime.js";
5
+ import { RuntimeAdapters } from "../../runtimes/remote-thread-list/types.js";
6
+ import { AssistantRuntime } from "../../runtime/api/assistant-runtime.js";
7
+ import "../../index.js";
8
+ import "./RuntimeAdapterProvider.js";
9
+ import { useConfiguredAui } from "@assistant-ui/store/client";
10
+ //#region src/react/runtimes/RemoteThreadResource.d.ts
11
+ type RemoteThreadListHook = () => AssistantRuntime;
12
+ type RemoteThreadResourceProps = {
13
+ threadId: string;
14
+ generation: number;
15
+ parentList: ThreadListRuntimeCore;
16
+ runtimeHook: RemoteThreadListHook;
17
+ parentClient: Parameters<typeof useConfiguredAui>[0];
18
+ adapters: RuntimeAdapters | null;
19
+ publish: (threadId: string, runtime: ThreadRuntimeCore, generation: number) => void;
20
+ };
21
+ declare const isTitleSourceMessage: (message: {
22
+ status?: {
23
+ type: string;
24
+ } | undefined;
25
+ }) => boolean;
26
+ declare const subscribeToTitleGeneration: (threadRuntime: AssistantRuntime["thread"], itemRuntime: ThreadListItemRuntime) => Unsubscribe;
27
+ declare const RemoteThreadResource: import("@assistant-ui/tap").Resource<AssistantRuntime, [RemoteThreadResourceProps]>;
28
+ //#endregion
29
+ export { RemoteThreadListHook, RemoteThreadResource, RemoteThreadResourceProps, isTitleSourceMessage, subscribeToTitleGeneration };
30
+ //# sourceMappingURL=RemoteThreadResource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteThreadResource.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadResource.ts"],"mappings":";;;;;;;;;;KAwBY,6BAA6B;KAE7B;EACV;EACA;EACA,YAAY;EACZ,aAAa;EACb,cAAc,kBAAkB;EAChC,UAAU;EACV,UACE,kBACA,SAAS,mBACT;;cAIS,uBAAwB;EACnC;IAAW;;;cAGA,6BACX,eAAe,4BACf,aAAa,0BAAA;cAwLF,kDAAoB,SAAA,mBAAA"}
@@ -0,0 +1,134 @@
1
+ import { SKIP_UPDATE, ShallowMemoizeSubject } from "../../subscribable/subscribable.js";
2
+ import { ThreadListItemRuntimeImpl } from "../../runtime/api/thread-list-item-runtime.js";
3
+ import { ThreadListItemClient } from "../../store/runtime-clients/thread-list-item-runtime-client.js";
4
+ import { useRuntimeAdaptersProvider } from "./useRuntimeAdapters.js";
5
+ import { useCallback, useEffect, useEffectEvent, useMemo, useRef } from "@assistant-ui/tap/react-shim";
6
+ import { resource } from "@assistant-ui/tap";
7
+ import { useAssistantContextProvider, useConfiguredAui } from "@assistant-ui/store/client";
8
+ //#region src/react/runtimes/RemoteThreadResource.ts
9
+ const isTitleSourceMessage = (message) => message.status?.type !== "running";
10
+ const subscribeToTitleGeneration = (threadRuntime, itemRuntime) => {
11
+ const generate = () => void itemRuntime.generateTitle().catch((error) => {
12
+ console.error("[assistant-ui] Thread title generation failed", error);
13
+ });
14
+ const hasTitleSource = () => threadRuntime.getState().messages.some(isTitleSourceMessage);
15
+ if (hasTitleSource()) {
16
+ generate();
17
+ return () => {};
18
+ }
19
+ const unsubscribe = threadRuntime.subscribe(() => {
20
+ if (!hasTitleSource()) return;
21
+ unsubscribe();
22
+ generate();
23
+ });
24
+ return unsubscribe;
25
+ };
26
+ const useRemoteThreadBinder = ({ threadId, generation, runtimeHook, publish, itemRuntime }) => {
27
+ const runtime = runtimeHook();
28
+ const threadBinding = (runtime?.thread)?.__internal_threadBinding;
29
+ const updateRuntime = useCallback(() => {
30
+ if (!threadBinding) return;
31
+ publish(threadId, threadBinding.getState(), generation);
32
+ }, [
33
+ threadId,
34
+ generation,
35
+ threadBinding,
36
+ publish
37
+ ]);
38
+ const isMounted = useRef(false);
39
+ if (!isMounted.current) updateRuntime();
40
+ useEffect(() => {
41
+ if (!threadBinding) return void 0;
42
+ isMounted.current = true;
43
+ updateRuntime();
44
+ return threadBinding.outerSubscribe(updateRuntime);
45
+ }, [threadBinding, updateRuntime]);
46
+ const initPromiseRef = useRef(void 0);
47
+ const hasInitializedRef = useRef(false);
48
+ const titleDisposeRef = useRef(void 0);
49
+ const titleAliveRef = useRef(false);
50
+ const handleInitialize = useEffectEvent(() => {
51
+ if (hasInitializedRef.current) return;
52
+ if (itemRuntime.getState().status !== "new") return;
53
+ hasInitializedRef.current = true;
54
+ const initPromise = itemRuntime.initialize();
55
+ initPromiseRef.current = initPromise;
56
+ initPromise.then(() => {
57
+ if (!titleAliveRef.current) return;
58
+ titleDisposeRef.current?.();
59
+ titleDisposeRef.current = subscribeToTitleGeneration(runtime.thread, itemRuntime);
60
+ }, () => {
61
+ if (initPromiseRef.current === initPromise) {
62
+ initPromiseRef.current = void 0;
63
+ hasInitializedRef.current = false;
64
+ }
65
+ });
66
+ });
67
+ const getInitializePromise = useEffectEvent(() => {
68
+ handleInitialize();
69
+ return initPromiseRef.current;
70
+ });
71
+ useEffect(() => {
72
+ if (!threadBinding) return;
73
+ const runtimeCore = threadBinding.getState();
74
+ const setGetInitializePromise = runtimeCore.__internal_setGetInitializePromise;
75
+ if (typeof setGetInitializePromise === "function") setGetInitializePromise.call(runtimeCore, getInitializePromise);
76
+ }, [threadBinding]);
77
+ useEffect(() => {
78
+ if (!runtime?.threads?.main) return void 0;
79
+ hasInitializedRef.current = false;
80
+ titleAliveRef.current = true;
81
+ const unsubscribe = runtime.threads.main.unstable_on("initialize", handleInitialize);
82
+ return () => {
83
+ titleAliveRef.current = false;
84
+ unsubscribe();
85
+ titleDisposeRef.current?.();
86
+ titleDisposeRef.current = void 0;
87
+ };
88
+ }, [runtime]);
89
+ return runtime;
90
+ };
91
+ const useRemoteThreadResource = ({ threadId, generation, parentList, runtimeHook, parentClient, adapters, publish }) => {
92
+ const itemRuntime = useMemo(() => new ThreadListItemRuntimeImpl(new ShallowMemoizeSubject({
93
+ path: {
94
+ ref: `threadItems[threadId=${threadId}]`,
95
+ threadSelector: {
96
+ type: "threadId",
97
+ threadId
98
+ }
99
+ },
100
+ getState: () => {
101
+ const data = parentList.getItemById(threadId);
102
+ if (!data) return SKIP_UPDATE;
103
+ return {
104
+ id: data.id,
105
+ remoteId: data.remoteId,
106
+ externalId: data.externalId,
107
+ title: data.title,
108
+ lastMessageAt: data.lastMessageAt,
109
+ custom: data.custom,
110
+ status: data.status,
111
+ isMain: data.id === parentList.mainThreadId,
112
+ isRunning: parentList.unstable_isThreadRunning?.(data.id) ?? false
113
+ };
114
+ },
115
+ subscribe: (callback) => parentList.subscribe(callback)
116
+ }), parentList), [parentList, threadId]);
117
+ const { client } = useConfiguredAui(parentClient, { threadListItem: ThreadListItemClient({ runtime: itemRuntime }) });
118
+ return useAssistantContextProvider(client, function useThreadClient() {
119
+ return useRuntimeAdaptersProvider(adapters, function useBoundRuntime() {
120
+ return useRemoteThreadBinder({
121
+ threadId,
122
+ generation,
123
+ runtimeHook,
124
+ publish,
125
+ itemRuntime
126
+ });
127
+ });
128
+ });
129
+ };
130
+ const RemoteThreadResource = resource(useRemoteThreadResource);
131
+ //#endregion
132
+ export { RemoteThreadResource, isTitleSourceMessage, subscribeToTitleGeneration };
133
+
134
+ //# sourceMappingURL=RemoteThreadResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteThreadResource.js","names":["useCallback","useEffect","useEffectEvent","useMemo","useRef","resource","useAssistantContextProvider","useConfiguredAui","ThreadListItemClient","AssistantRuntime","ThreadListRuntimeCore","ThreadRuntimeCore","ThreadRuntimeImpl","ThreadListItemRuntimeImpl","ThreadListItemRuntime","SKIP_UPDATE","ShallowMemoizeSubject","useRuntimeAdaptersProvider","RuntimeAdapters","RemoteThreadListHook","RemoteThreadResourceProps","threadId","generation","parentList","runtimeHook","parentClient","Parameters","adapters","publish","runtime","isTitleSourceMessage","message","status","type","subscribeToTitleGeneration","threadRuntime","itemRuntime","generate","generateTitle","catch","error","console","hasTitleSource","getState","messages","some","unsubscribe","subscribe","useRemoteThreadBinder","threadBinding","thread","__internal_threadBinding","updateRuntime","isMounted","current","undefined","outerSubscribe","initPromiseRef","Promise","hasInitializedRef","titleDisposeRef","titleAliveRef","handleInitialize","state","initPromise","initialize","then","getInitializePromise","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","threads","main","unstable_on","useRemoteThreadResource","path","ref","threadSelector","data","getItemById","id","remoteId","externalId","title","lastMessageAt","custom","isMain","mainThreadId","isRunning","unstable_isThreadRunning","callback","client","threadListItem","useThreadClient","useBoundRuntime","RemoteThreadResource"],"sources":["../../../src/react/runtimes/RemoteThreadResource.ts"],"sourcesContent":["import { useCallback, useEffect, useEffectEvent, useMemo, useRef } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantContextProvider,\n useConfiguredAui,\n} from \"@assistant-ui/store/client\";\nimport { ThreadListItemClient } from \"../../store/internal\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport {\n ThreadListItemRuntimeImpl,\n type ThreadListItemRuntime,\n} from \"../../runtime/api/thread-list-item-runtime\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n useRuntimeAdaptersProvider,\n type RuntimeAdapters,\n} from \"./RuntimeAdapterProvider\";\n\nexport type RemoteThreadListHook = () => AssistantRuntime;\n\nexport type RemoteThreadResourceProps = {\n threadId: string;\n generation: number;\n parentList: ThreadListRuntimeCore;\n runtimeHook: RemoteThreadListHook;\n parentClient: Parameters<typeof useConfiguredAui>[0];\n adapters: RuntimeAdapters | null;\n publish: (\n threadId: string,\n runtime: ThreadRuntimeCore,\n generation: number,\n ) => void;\n};\n\nexport const isTitleSourceMessage = (message: {\n status?: { type: string } | undefined;\n}) => message.status?.type !== \"running\";\n\nexport const subscribeToTitleGeneration = (\n threadRuntime: AssistantRuntime[\"thread\"],\n itemRuntime: ThreadListItemRuntime,\n) => {\n const generate = () =>\n void itemRuntime.generateTitle().catch((error: unknown) => {\n console.error(\"[assistant-ui] Thread title generation failed\", error);\n });\n\n const hasTitleSource = () =>\n threadRuntime.getState().messages.some(isTitleSourceMessage);\n\n if (hasTitleSource()) {\n generate();\n return () => {};\n }\n\n const unsubscribe = threadRuntime.subscribe(() => {\n if (!hasTitleSource()) return;\n unsubscribe();\n generate();\n });\n return unsubscribe;\n};\n\nconst useRemoteThreadBinder = ({\n threadId,\n generation,\n runtimeHook,\n publish,\n itemRuntime,\n}: {\n threadId: string;\n generation: number;\n runtimeHook: RemoteThreadListHook;\n publish: RemoteThreadResourceProps[\"publish\"];\n itemRuntime: ThreadListItemRuntime;\n}) => {\n const runtime = runtimeHook();\n const threadBinding = (runtime?.thread as ThreadRuntimeImpl | undefined)\n ?.__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n if (!threadBinding) return;\n publish(threadId, threadBinding.getState(), generation);\n }, [threadId, generation, threadBinding, publish]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n if (!threadBinding) return undefined;\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n const titleDisposeRef = useRef<(() => void) | undefined>(undefined);\n const titleAliveRef = useRef(false);\n\n const handleInitialize = useEffectEvent(() => {\n if (hasInitializedRef.current) return;\n\n const state = itemRuntime.getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n const initPromise = itemRuntime.initialize();\n initPromiseRef.current = initPromise;\n\n // The title needs the thread to exist and its first message, so it arms\n // when initialization resolves rather than at the first runEnd; waiting\n // for the run would leave the thread on \"New Chat\" for the whole\n // response, and forever when the run never completes.\n void initPromise.then(\n () => {\n if (!titleAliveRef.current) return;\n titleDisposeRef.current?.();\n titleDisposeRef.current = subscribeToTitleGeneration(\n runtime.thread,\n itemRuntime,\n );\n },\n () => {\n if (initPromiseRef.current === initPromise) {\n initPromiseRef.current = undefined;\n hasInitializedRef.current = false;\n }\n },\n );\n });\n\n const getInitializePromise = useEffectEvent(() => {\n handleInitialize();\n return initPromiseRef.current;\n });\n\n useEffect(() => {\n if (!threadBinding) return;\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, getInitializePromise);\n }\n }, [threadBinding]);\n useEffect(() => {\n if (!runtime?.threads?.main) return undefined;\n hasInitializedRef.current = false;\n titleAliveRef.current = true;\n const unsubscribe = runtime.threads.main.unstable_on(\n \"initialize\",\n handleInitialize,\n );\n return () => {\n titleAliveRef.current = false;\n unsubscribe();\n titleDisposeRef.current?.();\n titleDisposeRef.current = undefined;\n };\n }, [runtime]);\n\n return runtime;\n};\n\nconst useRemoteThreadResource = ({\n threadId,\n generation,\n parentList,\n runtimeHook,\n parentClient,\n adapters,\n publish,\n}: RemoteThreadResourceProps) => {\n const itemRuntime = useMemo(\n () =>\n new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n const data = parentList.getItemById(threadId);\n if (!data) return SKIP_UPDATE;\n return {\n id: data.id,\n remoteId: data.remoteId,\n externalId: data.externalId,\n title: data.title,\n lastMessageAt: data.lastMessageAt,\n custom: data.custom,\n status: data.status,\n isMain: data.id === parentList.mainThreadId,\n isRunning:\n parentList.unstable_isThreadRunning?.(data.id) ?? false,\n };\n },\n subscribe: (callback) => parentList.subscribe(callback),\n }),\n parentList,\n ),\n [parentList, threadId],\n );\n\n const { client } = useConfiguredAui(parentClient, {\n threadListItem: ThreadListItemClient({ runtime: itemRuntime }),\n });\n\n return useAssistantContextProvider(client, function useThreadClient() {\n return useRuntimeAdaptersProvider(adapters, function useBoundRuntime() {\n return useRemoteThreadBinder({\n threadId,\n generation,\n runtimeHook,\n publish,\n itemRuntime,\n });\n });\n });\n};\n\nexport const RemoteThreadResource = resource(useRemoteThreadResource);\n"],"mappings":"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"}
@@ -1,13 +1,7 @@
1
- import { AttachmentAdapter } from "../../adapters/attachment.js";
2
- import { ModelContextProvider } from "../../model-context/types.js";
3
- import { ThreadHistoryAdapter } from "../../adapters/thread-history.js";
1
+ import { RuntimeAdapters } from "../../runtimes/remote-thread-list/types.js";
2
+ import { useRuntimeAdapters, useRuntimeAdaptersProvider } from "./useRuntimeAdapters.js";
4
3
  import { FC, ReactNode } from "react";
5
4
  //#region src/react/runtimes/RuntimeAdapterProvider.d.ts
6
- type RuntimeAdapters = {
7
- modelContext?: ModelContextProvider | undefined;
8
- history?: ThreadHistoryAdapter | undefined;
9
- attachments?: AttachmentAdapter | undefined;
10
- };
11
5
  declare namespace RuntimeAdapterProvider {
12
6
  type Props = {
13
7
  adapters: RuntimeAdapters;
@@ -15,7 +9,6 @@ declare namespace RuntimeAdapterProvider {
15
9
  };
16
10
  }
17
11
  declare const RuntimeAdapterProvider: FC<RuntimeAdapterProvider.Props>;
18
- declare const useRuntimeAdapters: () => RuntimeAdapters | null;
19
12
  //#endregion
20
- export { RuntimeAdapterProvider, RuntimeAdapters, useRuntimeAdapters };
13
+ export { RuntimeAdapterProvider, type RuntimeAdapters, useRuntimeAdapters, useRuntimeAdaptersProvider };
21
14
  //# sourceMappingURL=RuntimeAdapterProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeAdapterProvider.d.ts","names":[],"sources":["../../../src/react/runtimes/RuntimeAdapterProvider.tsx"],"mappings":";;;;;KAWY;EACV,eAAe;EACf,UAAU;EACV,cAAc;;kBAKC;OACH;IACV,UAAU;IACV,UAAU;;;cAID,wBAAwB,GAAG,uBAAuB;cAgBlD,0BAAkB"}
1
+ {"version":3,"file":"RuntimeAdapterProvider.d.ts","names":[],"sources":["../../../src/react/runtimes/RuntimeAdapterProvider.tsx"],"mappings":";;;;kBAWiB;OACH;IACV,UAAU;IACV,UAAU;;;cAID,wBAAwB,GAAG,uBAAuB"}
@@ -1,8 +1,8 @@
1
+ import { RuntimeAdaptersContext, useRuntimeAdapters, useRuntimeAdaptersProvider } from "./useRuntimeAdapters.js";
1
2
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
- import { createContext, useContext } from "@assistant-ui/tap/react-shim";
3
+ import { useContext } from "@assistant-ui/tap/react-shim";
3
4
  import { jsx } from "react/jsx-runtime";
4
5
  //#region src/react/runtimes/RuntimeAdapterProvider.tsx
5
- const RuntimeAdaptersContext = createContext(null);
6
6
  const RuntimeAdapterProvider = (t0) => {
7
7
  const $ = c(6);
8
8
  const { adapters, children } = t0;
@@ -30,10 +30,7 @@ const RuntimeAdapterProvider = (t0) => {
30
30
  } else t2 = $[5];
31
31
  return t2;
32
32
  };
33
- const useRuntimeAdapters = () => {
34
- return useContext(RuntimeAdaptersContext);
35
- };
36
33
  //#endregion
37
- export { RuntimeAdapterProvider, useRuntimeAdapters };
34
+ export { RuntimeAdapterProvider, useRuntimeAdapters, useRuntimeAdaptersProvider };
38
35
 
39
36
  //# sourceMappingURL=RuntimeAdapterProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeAdapterProvider.js","names":["createContext","FC","ReactNode","useContext","useMemo","ThreadHistoryAdapter","AttachmentAdapter","ModelContextProvider","RuntimeAdapters","modelContext","history","attachments","RuntimeAdaptersContext","RuntimeAdapterProvider","Props","adapters","children","t0","$","_c","context","t1","value","t2","useRuntimeAdapters"],"sources":["../../../src/react/runtimes/RuntimeAdapterProvider.tsx"],"sourcesContent":["import {\n createContext,\n type FC,\n type ReactNode,\n useContext,\n useMemo,\n} from \"react\";\nimport type { ThreadHistoryAdapter } from \"../../adapters/thread-history\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\n\nexport type RuntimeAdapters = {\n modelContext?: ModelContextProvider | undefined;\n history?: ThreadHistoryAdapter | undefined;\n attachments?: AttachmentAdapter | undefined;\n};\n\nconst RuntimeAdaptersContext = createContext<RuntimeAdapters | null>(null);\n\nexport namespace RuntimeAdapterProvider {\n export type Props = {\n adapters: RuntimeAdapters;\n children: ReactNode;\n };\n}\n\nexport const RuntimeAdapterProvider: FC<RuntimeAdapterProvider.Props> = ({\n adapters,\n children,\n}) => {\n const context = useContext(RuntimeAdaptersContext);\n const value = useMemo(\n () => ({ ...context, ...adapters }),\n [context, adapters],\n );\n return (\n <RuntimeAdaptersContext.Provider value={value}>\n {children}\n </RuntimeAdaptersContext.Provider>\n );\n};\n\nexport const useRuntimeAdapters = () => {\n return useContext(RuntimeAdaptersContext);\n};\n"],"mappings":";;;;AAiBA,MAAMY,yBAAyBZ,cAAsC,IAAI;AASzE,MAAaa,0BAA2DI,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAJ,UAAAC,aAAAC;CAIvE,MAAAG,UAAgBjB,WAAWS,sBAAsB;CAAE,IAAAS;CAAA,IAAAH,EAAA,OAAAH,YAAAG,EAAA,OAAAE,SAAA;EAE1CC,KAAA;GAAA,GAAKD;GAAO,GAAKL;EAAS;EAACG,EAAA,KAAAH;EAAAG,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CADpC,MAAAI,QACSD;CAEP,IAAAE;CAAA,IAAAL,EAAA,OAAAF,YAAAE,EAAA,OAAAI,OAAA;EAEAC,KAAA,oBAAA,uBAAA,UAAA;GAAwCD;GACrCN;EACH,CAAA;EAAkCE,EAAA,KAAAF;EAAAE,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAFlCK;AAEkC;AAItC,MAAaC,2BAAqB;CAAA,OACzBrB,WAAWS,sBAAsB;AAAC"}
1
+ {"version":3,"file":"RuntimeAdapterProvider.js","names":["FC","ReactNode","useContext","useMemo","RuntimeAdapters","RuntimeAdaptersContext","useRuntimeAdapters","useRuntimeAdaptersProvider","RuntimeAdapterProvider","Props","adapters","children","t0","$","_c","context","t1","value","t2"],"sources":["../../../src/react/runtimes/RuntimeAdapterProvider.tsx"],"sourcesContent":["import { type FC, type ReactNode, useContext, useMemo } from \"react\";\nimport type { RuntimeAdapters } from \"../../runtimes/remote-thread-list/types\";\nimport {\n RuntimeAdaptersContext,\n useRuntimeAdapters,\n useRuntimeAdaptersProvider,\n} from \"./useRuntimeAdapters\";\n\nexport type { RuntimeAdapters };\nexport { useRuntimeAdapters, useRuntimeAdaptersProvider };\n\nexport namespace RuntimeAdapterProvider {\n export type Props = {\n adapters: RuntimeAdapters;\n children: ReactNode;\n };\n}\n\nexport const RuntimeAdapterProvider: FC<RuntimeAdapterProvider.Props> = ({\n adapters,\n children,\n}) => {\n const context = useContext(RuntimeAdaptersContext);\n const value = useMemo(\n () => ({ ...context, ...adapters }),\n [context, adapters],\n );\n return (\n <RuntimeAdaptersContext.Provider value={value}>\n {children}\n </RuntimeAdaptersContext.Provider>\n );\n};\n"],"mappings":";;;;;AAkBA,MAAaQ,0BAA2DI,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAJ,UAAAC,aAAAC;CAIvE,MAAAG,UAAgBb,WAAWG,sBAAsB;CAAE,IAAAW;CAAA,IAAAH,EAAA,OAAAH,YAAAG,EAAA,OAAAE,SAAA;EAE1CC,KAAA;GAAA,GAAKD;GAAO,GAAKL;EAAS;EAACG,EAAA,KAAAH;EAAAG,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CADpC,MAAAI,QACSD;CAEP,IAAAE;CAAA,IAAAL,EAAA,OAAAF,YAAAE,EAAA,OAAAI,OAAA;EAEAC,KAAA,oBAAA,uBAAA,UAAA;GAAwCD;GACrCN;EACH,CAAA;EAAkCE,EAAA,KAAAF;EAAAE,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAFlCK;AAEkC"}