@assistant-ui/core 0.3.12 → 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 (452) 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 +3 -3
  10. package/dist/index.js +2 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/internal.d.ts +1 -1
  13. package/dist/internal.js +6 -6
  14. package/dist/model-context/frame/host.d.ts.map +1 -1
  15. package/dist/model-context/frame/host.js +2 -1
  16. package/dist/model-context/frame/host.js.map +1 -1
  17. package/dist/model-context/registry.d.ts.map +1 -1
  18. package/dist/model-context/registry.js +16 -4
  19. package/dist/model-context/registry.js.map +1 -1
  20. package/dist/react/RuntimeAdapter.d.ts +8 -1
  21. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  22. package/dist/react/RuntimeAdapter.js +23 -18
  23. package/dist/react/RuntimeAdapter.js.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
  26. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  27. package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
  28. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
  29. package/dist/react/client/AdaptedRemoteThread.js +27 -0
  30. package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
  31. package/dist/react/client/InMemoryThreadList.d.ts +19 -0
  32. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
  33. package/dist/react/client/InMemoryThreadList.js +418 -0
  34. package/dist/react/client/InMemoryThreadList.js.map +1 -0
  35. package/dist/react/client/Interactables.d.ts.map +1 -1
  36. package/dist/react/client/Interactables.js +159 -102
  37. package/dist/react/client/Interactables.js.map +1 -1
  38. package/dist/react/client/RemoteThreadList.d.ts +34 -0
  39. package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
  40. package/dist/react/client/RemoteThreadList.js +826 -0
  41. package/dist/react/client/RemoteThreadList.js.map +1 -0
  42. package/dist/react/client/Tools.d.ts.map +1 -1
  43. package/dist/react/client/Tools.js +38 -27
  44. package/dist/react/client/Tools.js.map +1 -1
  45. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  46. package/dist/react/client/interactable-model-context.js +5 -1
  47. package/dist/react/client/interactable-model-context.js.map +1 -1
  48. package/dist/react/index.d.ts +7 -2
  49. package/dist/react/index.js +5 -2
  50. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  51. package/dist/react/interactables-legacy/Interactables.js +145 -110
  52. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  53. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  54. package/dist/react/primitive-hooks/useActionBarCopy.js +13 -18
  55. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  56. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  57. package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
  58. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  59. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  60. package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
  61. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  62. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  63. package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
  64. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  65. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  66. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
  67. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  68. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  69. package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
  70. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  71. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  72. package/dist/react/primitive-hooks/useComposerSend.js +2 -4
  73. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  74. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  75. package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
  76. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  77. package/dist/react/primitives/message/MessageParts.d.ts +13 -0
  78. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  79. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  80. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  81. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  82. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  83. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +22 -10
  84. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +109 -71
  86. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  87. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -2
  88. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  89. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +40 -13
  90. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  91. package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
  92. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
  93. package/dist/react/runtimes/RemoteThreadResource.js +134 -0
  94. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
  95. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
  96. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  97. package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
  98. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  99. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
  100. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
  101. package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
  102. package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
  103. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
  104. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  105. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
  106. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
  107. package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
  108. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
  109. package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
  110. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
  111. package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
  112. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
  113. package/dist/react/runtimes/assistant-transport/types.js +0 -0
  114. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
  115. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
  116. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
  117. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
  118. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
  119. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
  120. package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
  121. package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
  122. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
  123. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
  124. package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
  125. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
  126. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  127. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
  128. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  129. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
  130. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  131. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
  132. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  133. package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
  134. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  135. package/dist/react/runtimes/cloud/auiV0.js +7 -0
  136. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  137. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  138. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +22 -12
  139. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  140. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
  141. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
  142. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
  143. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
  144. package/dist/react/runtimes/external-message-converter.js +14 -14
  145. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  146. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  147. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
  148. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  149. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  150. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  151. package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
  152. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
  153. package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
  154. package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
  155. package/dist/runtime/api/composer-runtime.d.ts +5 -0
  156. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  157. package/dist/runtime/api/composer-runtime.js.map +1 -1
  158. package/dist/runtime/api/message-runtime.js +1 -1
  159. package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
  160. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  161. package/dist/runtime/api/thread-list-runtime.js +4 -2
  162. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  163. package/dist/runtime/api/thread-runtime.d.ts +12 -2
  164. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  165. package/dist/runtime/api/thread-runtime.js +13 -3
  166. package/dist/runtime/api/thread-runtime.js.map +1 -1
  167. package/dist/runtime/base/base-composer-runtime-core.d.ts +25 -0
  168. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  169. package/dist/runtime/base/base-composer-runtime-core.js +72 -18
  170. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  171. package/dist/runtime/base/base-thread-runtime-core.d.ts +15 -0
  172. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  173. package/dist/runtime/base/base-thread-runtime-core.js +34 -3
  174. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  175. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  176. package/dist/runtime/base/default-edit-composer-runtime-core.js +1 -6
  177. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  178. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
  179. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  180. package/dist/runtime/base/default-thread-composer-runtime-core.js +11 -8
  181. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  182. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  183. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  184. package/dist/runtime/internal.js +5 -5
  185. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +15 -0
  186. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  187. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  188. package/dist/runtime/queue/message-queue.js +25 -11
  189. package/dist/runtime/queue/message-queue.js.map +1 -1
  190. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
  191. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
  192. package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
  193. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
  194. package/dist/runtimes/external-store/external-store-adapter.d.ts +7 -0
  195. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  196. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  197. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  198. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
  199. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  200. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +11 -1
  201. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  202. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +78 -20
  203. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  204. package/dist/runtimes/internal.d.ts +1 -1
  205. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  206. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  207. package/dist/runtimes/local/local-thread-runtime-core.js +55 -14
  208. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  209. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -0
  210. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  211. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  212. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  213. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  214. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  215. package/dist/runtimes/remote-thread-list/types.d.ts +29 -1
  216. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  217. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
  218. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  219. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
  220. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  221. package/dist/store/clients/external-thread.d.ts +7 -0
  222. package/dist/store/clients/external-thread.d.ts.map +1 -1
  223. package/dist/store/clients/external-thread.js +460 -369
  224. package/dist/store/clients/external-thread.js.map +1 -1
  225. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  226. package/dist/store/clients/runtime-adapter.js +5 -2
  227. package/dist/store/clients/runtime-adapter.js.map +1 -1
  228. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  229. package/dist/store/clients/single-thread-list.js +31 -27
  230. package/dist/store/clients/single-thread-list.js.map +1 -1
  231. package/dist/store/clients/suggestions.d.ts +3 -1
  232. package/dist/store/clients/suggestions.d.ts.map +1 -1
  233. package/dist/store/clients/suggestions.js +65 -37
  234. package/dist/store/clients/suggestions.js.map +1 -1
  235. package/dist/store/clients/thread-selection-events.d.ts +10 -0
  236. package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
  237. package/dist/store/clients/thread-selection-events.js +40 -0
  238. package/dist/store/clients/thread-selection-events.js.map +1 -0
  239. package/dist/store/env.d.ts +5 -0
  240. package/dist/store/env.d.ts.map +1 -0
  241. package/dist/store/env.js +12 -0
  242. package/dist/store/env.js.map +1 -0
  243. package/dist/store/index.d.ts +6 -4
  244. package/dist/store/index.js +5 -3
  245. package/dist/store/internal.d.ts +4 -1
  246. package/dist/store/internal.js +4 -1
  247. package/dist/store/primitive-predicates.d.ts +19 -0
  248. package/dist/store/primitive-predicates.d.ts.map +1 -0
  249. package/dist/store/primitive-predicates.js +19 -0
  250. package/dist/store/primitive-predicates.js.map +1 -0
  251. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  252. package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
  253. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  254. package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
  255. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
  256. package/dist/store/runtime-clients/handle-runtime-action.js +12 -0
  257. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
  258. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
  259. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
  260. package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
  261. package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
  262. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +104 -57
  264. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  266. package/dist/store/runtime-clients/thread-list-runtime-client.js +5 -6
  267. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  268. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  269. package/dist/store/runtime-clients/thread-runtime-client.js +98 -82
  270. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  271. package/dist/store/scope-registration.d.ts +2 -2
  272. package/dist/store/scopes/composer.d.ts +9 -4
  273. package/dist/store/scopes/composer.d.ts.map +1 -1
  274. package/dist/store/scopes/suggestions.d.ts +6 -1
  275. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  276. package/dist/store/scopes/thread-list-item.d.ts +7 -6
  277. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  278. package/dist/store/scopes/thread.d.ts +25 -7
  279. package/dist/store/scopes/thread.d.ts.map +1 -1
  280. package/dist/store/scopes/threads.d.ts +17 -1
  281. package/dist/store/scopes/threads.d.ts.map +1 -1
  282. package/dist/subscribable/subscribable.d.ts +2 -1
  283. package/dist/subscribable/subscribable.d.ts.map +1 -1
  284. package/dist/subscribable/subscribable.js +23 -18
  285. package/dist/subscribable/subscribable.js.map +1 -1
  286. package/dist/types/error.d.ts +15 -1
  287. package/dist/types/error.d.ts.map +1 -1
  288. package/dist/types/error.js +18 -1
  289. package/dist/types/error.js.map +1 -1
  290. package/dist/types/message.d.ts +2 -0
  291. package/dist/types/message.d.ts.map +1 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/composite-context-provider.d.ts +1 -0
  294. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  295. package/dist/utils/composite-context-provider.js +25 -9
  296. package/dist/utils/composite-context-provider.js.map +1 -1
  297. package/dist/utils/notify-event-listeners.d.ts +2 -2
  298. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  299. package/dist/utils/notify-event-listeners.js +2 -2
  300. package/dist/utils/notify-event-listeners.js.map +1 -1
  301. package/package.json +7 -7
  302. package/src/adapters/speech.test.ts +118 -1
  303. package/src/adapters/speech.ts +21 -22
  304. package/src/adapters/thread-history.ts +2 -0
  305. package/src/adapters/voice.test.ts +69 -0
  306. package/src/adapters/voice.ts +27 -27
  307. package/src/index.ts +2 -0
  308. package/src/model-context/frame/host.test.ts +23 -0
  309. package/src/model-context/frame/host.ts +2 -1
  310. package/src/model-context/registry.test.ts +131 -0
  311. package/src/model-context/registry.ts +16 -6
  312. package/src/react/RuntimeAdapter.test.ts +2 -0
  313. package/src/react/RuntimeAdapter.ts +20 -8
  314. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
  315. package/src/react/client/AdaptedRemoteThread.ts +41 -0
  316. package/src/react/client/InMemoryThreadList.test.tsx +148 -0
  317. package/src/react/client/InMemoryThreadList.ts +290 -0
  318. package/src/react/client/Interactables.test.ts +326 -2
  319. package/src/react/client/Interactables.ts +227 -110
  320. package/src/react/client/RemoteThreadList.test.ts +1026 -0
  321. package/src/react/client/RemoteThreadList.ts +1067 -0
  322. package/src/react/client/Tools.ts +36 -29
  323. package/src/react/client/interactable-model-context.ts +6 -1
  324. package/src/react/index.ts +13 -0
  325. package/src/react/interactables-legacy/Interactables.test.ts +317 -0
  326. package/src/react/interactables-legacy/Interactables.ts +204 -128
  327. package/src/react/primitive-hooks/useActionBarCopy.ts +2 -7
  328. package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
  329. package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
  330. package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
  331. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
  332. package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
  333. package/src/react/primitive-hooks/useComposerSend.ts +2 -5
  334. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
  335. package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
  336. package/src/react/primitives/message/MessageParts.tsx +0 -1
  337. package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
  338. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
  339. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
  340. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
  341. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
  342. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +159 -124
  343. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +59 -20
  344. package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
  345. package/src/react/runtimes/RemoteThreadResource.ts +231 -0
  346. package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
  347. package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
  348. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
  349. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
  350. package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
  351. package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
  352. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
  353. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
  354. package/src/react/runtimes/assistant-transport/types.ts +170 -0
  355. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
  356. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +625 -0
  357. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +481 -0
  358. package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
  359. package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
  360. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
  361. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
  362. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
  363. package/src/react/runtimes/cloud/auiV0.ts +17 -1
  364. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +36 -21
  365. package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
  366. package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
  367. package/src/react/runtimes/external-message-converter.test.ts +143 -0
  368. package/src/react/runtimes/external-message-converter.ts +41 -41
  369. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
  370. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
  371. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +124 -0
  372. package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
  373. package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
  374. package/src/react/runtimes/useLocalRuntime.test.tsx +130 -4
  375. package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
  376. package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
  377. package/src/runtime/api/composer-runtime.ts +5 -0
  378. package/src/runtime/api/thread-list-runtime.ts +3 -1
  379. package/src/runtime/api/thread-runtime.ts +28 -3
  380. package/src/runtime/base/base-composer-runtime-core.ts +106 -13
  381. package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
  382. package/src/runtime/base/base-thread-runtime-core.ts +47 -2
  383. package/src/runtime/base/default-edit-composer-runtime-core.ts +1 -15
  384. package/src/runtime/base/default-thread-composer-runtime-core.ts +13 -15
  385. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  386. package/src/runtime/queue/external-thread-queue-adapter.ts +17 -0
  387. package/src/runtime/queue/message-queue.ts +28 -10
  388. package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
  389. package/src/runtimes/external-store/external-store-adapter.ts +7 -0
  390. package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
  391. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  392. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +187 -48
  393. package/src/runtimes/local/local-thread-runtime-core.test.ts +373 -4
  394. package/src/runtimes/local/local-thread-runtime-core.ts +83 -15
  395. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  396. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  397. package/src/runtimes/remote-thread-list/types.ts +30 -0
  398. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
  399. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
  400. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
  401. package/src/store/clients/external-thread.ts +119 -16
  402. package/src/store/clients/model-context-client.test.ts +16 -8
  403. package/src/store/clients/runtime-adapter.ts +5 -2
  404. package/src/store/clients/single-thread-list.ts +2 -1
  405. package/src/store/clients/suggestions.ts +39 -13
  406. package/src/store/clients/thread-selection-events.ts +21 -0
  407. package/src/store/env.ts +11 -0
  408. package/src/store/index.ts +14 -1
  409. package/src/store/internal.ts +13 -0
  410. package/src/store/primitive-predicates.test.ts +184 -0
  411. package/src/store/primitive-predicates.ts +43 -0
  412. package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
  413. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
  414. package/src/store/runtime-clients/handle-runtime-action.ts +11 -0
  415. package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
  416. package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
  417. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +28 -35
  418. package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
  419. package/src/store/runtime-clients/thread-runtime-client.ts +5 -0
  420. package/src/store/scopes/composer.ts +9 -4
  421. package/src/store/scopes/suggestions.ts +6 -0
  422. package/src/store/scopes/thread-list-item.ts +7 -6
  423. package/src/store/scopes/thread.ts +25 -7
  424. package/src/store/scopes/threads.ts +14 -0
  425. package/src/subscribable/subscribable.test.ts +77 -1
  426. package/src/subscribable/subscribable.ts +38 -23
  427. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
  428. package/src/tests/append-interactable-snapshots.test.ts +350 -0
  429. package/src/tests/auiV0Encode.test.ts +66 -0
  430. package/src/tests/base-composer-runtime-core-send.test.ts +156 -0
  431. package/src/tests/base-composer-runtime-core.test.ts +136 -1
  432. package/src/tests/composer-can-cancel.test.ts +101 -0
  433. package/src/tests/default-edit-composer-runtime-core.test.ts +0 -68
  434. package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
  435. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +491 -1
  436. package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
  437. package/src/tests/external-thread-attachments.test.tsx +214 -0
  438. package/src/tests/external-thread-parity.test.tsx +54 -0
  439. package/src/tests/external-thread-refetch.test.tsx +117 -0
  440. package/src/tests/external-thread-suggestions.test.tsx +59 -0
  441. package/src/tests/interactables-toolui-migration.test.tsx +66 -0
  442. package/src/tests/message-queue.test.ts +54 -0
  443. package/src/tests/session-reset-notification.test.ts +145 -0
  444. package/src/tests/thread-message-like.test.ts +39 -0
  445. package/src/tests/thread-switch-events.test.tsx +234 -0
  446. package/src/tests/tools-scope-migration.test.tsx +58 -0
  447. package/src/types/error.ts +24 -0
  448. package/src/types/message.ts +2 -0
  449. package/src/utils/composite-context-provider.test.ts +139 -0
  450. package/src/utils/composite-context-provider.ts +26 -8
  451. package/src/utils/notify-event-listeners.ts +10 -5
  452. package/src/tests/default-thread-composer-runtime-core.test.ts +0 -82
@@ -3,8 +3,8 @@ import { getThreadMessageText } from "../../utils/text.js";
3
3
  import { toMessagePartStatus } from "../../utils/normalizePartStatus.js";
4
4
  import { resolveToolApprovalResponse } from "../../runtime/utils/resolveToolApprovalResponse.js";
5
5
  import { isCreateAttachment } from "../../types/attachment.js";
6
+ import { ThreadSuggestions } from "./suggestions.js";
6
7
  import { ModelContext } from "./model-context-client.js";
7
- import { Suggestions } from "./suggestions.js";
8
8
  import { DataRenderers } from "../../react/client/DataRenderers.js";
9
9
  import { Tools } from "../../react/client/Tools.js";
10
10
  import { SingleThreadList } from "./single-thread-list.js";
@@ -16,6 +16,7 @@ import { Derived, attachTransformScopes, useClientLookup, useClientResource } fr
16
16
  //#region src/store/clients/external-thread.ts
17
17
  const EMPTY_QUEUE_ITEMS = [];
18
18
  const EMPTY_BRANCH_IDS = [];
19
+ const EMPTY_SUGGESTIONS = [];
19
20
  const COMPLETE_STATUS = Object.freeze({ type: "complete" });
20
21
  const derivePartStatus = (message, partIndex, part) => {
21
22
  if (!message.status) return COMPLETE_STATUS;
@@ -352,6 +353,39 @@ const useAttachmentResource = ({ attachment, onRemove }) => {
352
353
  };
353
354
  };
354
355
  const AttachmentResource = resource(useAttachmentResource);
356
+ var AttachmentAddOperations = class {
357
+ operations = /* @__PURE__ */ new Set();
358
+ start() {
359
+ const operation = {
360
+ cancelled: false,
361
+ attachmentIds: /* @__PURE__ */ new Set()
362
+ };
363
+ this.operations.add(operation);
364
+ return operation;
365
+ }
366
+ accept(operation, attachmentId) {
367
+ if (operation.cancelled) return false;
368
+ operation.attachmentIds.add(attachmentId);
369
+ return true;
370
+ }
371
+ finish(operation) {
372
+ this.operations.delete(operation);
373
+ }
374
+ isCancelled(operation) {
375
+ return operation.cancelled;
376
+ }
377
+ cancel(attachmentId) {
378
+ for (const operation of [...this.operations]) {
379
+ if (!operation.attachmentIds.has(attachmentId)) continue;
380
+ operation.cancelled = true;
381
+ this.operations.delete(operation);
382
+ }
383
+ }
384
+ cancelAll() {
385
+ for (const operation of this.operations) operation.cancelled = true;
386
+ this.operations.clear();
387
+ }
388
+ };
355
389
  const useQueueItemClient = ({ item, onMove, onRemove }) => {
356
390
  return {
357
391
  getState: () => item,
@@ -365,8 +399,9 @@ const useQueueItemClient = ({ item, onMove, onRemove }) => {
365
399
  };
366
400
  const QueueItemClient = resource(useQueueItemClient);
367
401
  const drainAdapterAdd = async (result, upsert) => {
368
- if (Symbol.asyncIterator in result) for await (const attachment of result) upsert(attachment);
369
- else upsert(await result);
402
+ if (Symbol.asyncIterator in result) {
403
+ for await (const attachment of result) if (!upsert(attachment)) break;
404
+ } else upsert(await result);
370
405
  };
371
406
  const useLiveState = (initial) => {
372
407
  const $ = c(3);
@@ -394,76 +429,84 @@ const useLiveState = (initial) => {
394
429
  return t1;
395
430
  };
396
431
  const useComposerClientResource = (t0) => {
397
- const $ = c(104);
398
- const { type, canCancel, isSendDisabled: t1, onCancel, onBeginEdit, onSend, message, queue, attachmentAdapter } = t0;
399
- const isSendDisabled = t1 === void 0 ? false : t1;
432
+ const $ = c(105);
433
+ const { type, canCancel, isRunning: t1, isSendDisabled: t2, onCancel, onBeginEdit, onSend, message, queue, attachmentAdapter } = t0;
434
+ const isRunning = t1 === void 0 ? false : t1;
435
+ const isSendDisabled = t2 === void 0 ? false : t2;
400
436
  const [isEditing, setIsEditing, isEditingRef] = useLiveState(type === "thread");
401
437
  const [text, setText, textRef] = useLiveState("");
402
438
  const [role, setRole, roleRef] = useLiveState("user");
403
- let t2;
404
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
405
- t2 = {};
406
- $[0] = t2;
407
- } else t2 = $[0];
408
- const [runConfig, setRunConfig, runConfigRef] = useLiveState(t2);
409
439
  let t3;
440
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
441
+ t3 = {};
442
+ $[0] = t3;
443
+ } else t3 = $[0];
444
+ const [runConfig, setRunConfig, runConfigRef] = useLiveState(t3);
445
+ let t4;
410
446
  if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
411
- t3 = [];
412
- $[1] = t3;
413
- } else t3 = $[1];
414
- const [attachments, setAttachments, attachmentsRef] = useLiveState(t3);
447
+ t4 = [];
448
+ $[1] = t4;
449
+ } else t4 = $[1];
450
+ const [attachments, setAttachments, attachmentsRef] = useLiveState(t4);
415
451
  const [quote, setQuote, quoteRef] = useLiveState(void 0);
416
- let t4;
417
- if ($[2] !== message || $[3] !== setAttachments || $[4] !== setRole || $[5] !== setText) {
418
- t4 = () => {
452
+ let t5;
453
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
454
+ t5 = new AttachmentAddOperations();
455
+ $[2] = t5;
456
+ } else t5 = $[2];
457
+ const attachmentAddOperations = t5;
458
+ let t6;
459
+ if ($[3] !== message || $[4] !== setAttachments || $[5] !== setRole || $[6] !== setText) {
460
+ t6 = () => {
419
461
  if (!message) return;
420
462
  const messageText = message.content.filter(_temp4).map(_temp5).join("\n\n");
421
463
  setText(messageText);
422
464
  setRole(message.role);
423
465
  setAttachments(message.attachments ?? []);
424
466
  };
425
- $[2] = message;
426
- $[3] = setAttachments;
427
- $[4] = setRole;
428
- $[5] = setText;
429
- $[6] = t4;
430
- } else t4 = $[6];
431
- const updateFromMessage = t4;
432
- let t5;
433
- if ($[7] !== attachmentAdapter || $[8] !== attachments || $[9] !== setAttachments) {
434
- let t6;
435
- if ($[11] !== attachmentAdapter || $[12] !== setAttachments) {
436
- t6 = (attachment) => withKey(attachment.id, AttachmentResource({
467
+ $[3] = message;
468
+ $[4] = setAttachments;
469
+ $[5] = setRole;
470
+ $[6] = setText;
471
+ $[7] = t6;
472
+ } else t6 = $[7];
473
+ const updateFromMessage = t6;
474
+ let t7;
475
+ if ($[8] !== attachmentAdapter || $[9] !== attachments || $[10] !== setAttachments) {
476
+ let t8;
477
+ if ($[12] !== attachmentAdapter || $[13] !== setAttachments) {
478
+ t8 = (attachment) => withKey(attachment.id, AttachmentResource({
437
479
  attachment,
438
480
  onRemove: async () => {
481
+ attachmentAddOperations.cancel(attachment.id);
439
482
  await attachmentAdapter?.remove(attachment);
440
483
  setAttachments((prev) => prev.filter((a) => a.id !== attachment.id));
441
484
  }
442
485
  }));
443
- $[11] = attachmentAdapter;
444
- $[12] = setAttachments;
445
- $[13] = t6;
446
- } else t6 = $[13];
447
- t5 = attachments.map(t6);
448
- $[7] = attachmentAdapter;
449
- $[8] = attachments;
450
- $[9] = setAttachments;
451
- $[10] = t5;
452
- } else t5 = $[10];
453
- const attachmentClients = useClientLookup(t5);
454
- let t6;
455
- if ($[14] !== attachmentAdapter) {
456
- t6 = async (removed) => {
486
+ $[12] = attachmentAdapter;
487
+ $[13] = setAttachments;
488
+ $[14] = t8;
489
+ } else t8 = $[14];
490
+ t7 = attachments.map(t8);
491
+ $[8] = attachmentAdapter;
492
+ $[9] = attachments;
493
+ $[10] = setAttachments;
494
+ $[11] = t7;
495
+ } else t7 = $[11];
496
+ const attachmentClients = useClientLookup(t7);
497
+ let t8;
498
+ if ($[15] !== attachmentAdapter) {
499
+ t8 = async (removed) => {
457
500
  if (!attachmentAdapter) return;
458
501
  await Promise.all(removed.filter(_temp6).map((a_1) => attachmentAdapter.remove(a_1)));
459
502
  };
460
- $[14] = attachmentAdapter;
461
- $[15] = t6;
462
- } else t6 = $[15];
463
- const removePendingAttachments = t6;
464
- let t7;
465
- if ($[16] !== setAttachments) {
466
- t7 = (attachment_0) => {
503
+ $[15] = attachmentAdapter;
504
+ $[16] = t8;
505
+ } else t8 = $[16];
506
+ const removePendingAttachments = t8;
507
+ let t9;
508
+ if ($[17] !== setAttachments) {
509
+ t9 = (attachment_0) => {
467
510
  setAttachments((prev_0) => {
468
511
  const idx = prev_0.findIndex((a_2) => a_2.id === attachment_0.id);
469
512
  if (idx === -1) return [...prev_0, attachment_0];
@@ -472,41 +515,41 @@ const useComposerClientResource = (t0) => {
472
515
  return next;
473
516
  });
474
517
  };
475
- $[16] = setAttachments;
476
- $[17] = t7;
477
- } else t7 = $[17];
478
- const upsertAttachment = t7;
518
+ $[17] = setAttachments;
519
+ $[18] = t9;
520
+ } else t9 = $[18];
521
+ const upsertAttachment = t9;
479
522
  const steerItems = queue?.steerItems ?? EMPTY_QUEUE_ITEMS;
480
523
  const laneItems = queue?.items ?? EMPTY_QUEUE_ITEMS;
481
- let t8;
482
- if ($[18] !== laneItems || $[19] !== steerItems) {
483
- t8 = steerItems.length === 0 ? laneItems : laneItems.length === 0 ? steerItems : [...steerItems, ...laneItems];
484
- $[18] = laneItems;
485
- $[19] = steerItems;
486
- $[20] = t8;
487
- } else t8 = $[20];
488
- const queueItems = t8;
489
- let t9;
490
- if ($[21] !== queue || $[22] !== queueItems) {
491
- let t10;
492
- if ($[24] !== queue) {
493
- t10 = (item) => withKey(item.id, QueueItemClient({
524
+ let t10;
525
+ if ($[19] !== laneItems || $[20] !== steerItems) {
526
+ t10 = steerItems.length === 0 ? laneItems : laneItems.length === 0 ? steerItems : [...steerItems, ...laneItems];
527
+ $[19] = laneItems;
528
+ $[20] = steerItems;
529
+ $[21] = t10;
530
+ } else t10 = $[21];
531
+ const queueItems = t10;
532
+ let t11;
533
+ if ($[22] !== queue || $[23] !== queueItems) {
534
+ let t12;
535
+ if ($[25] !== queue) {
536
+ t12 = (item) => withKey(item.id, QueueItemClient({
494
537
  item,
495
538
  onMove: (placement) => queue?.move(item.id, placement),
496
539
  onRemove: () => queue?.remove(item.id)
497
540
  }));
498
- $[24] = queue;
499
- $[25] = t10;
500
- } else t10 = $[25];
501
- t9 = queueItems.map(t10);
502
- $[21] = queue;
503
- $[22] = queueItems;
504
- $[23] = t9;
505
- } else t9 = $[23];
506
- const queueItemClients = useClientLookup(t9);
507
- let t10;
508
- if ($[26] !== attachmentAdapter?.accept || $[27] !== attachmentClients.state || $[28] !== attachments.length || $[29] !== canCancel || $[30] !== isEditing || $[31] !== isSendDisabled || $[32] !== queueItems || $[33] !== quote || $[34] !== role || $[35] !== runConfig || $[36] !== text || $[37] !== type) {
509
- t10 = () => {
541
+ $[25] = queue;
542
+ $[26] = t12;
543
+ } else t12 = $[26];
544
+ t11 = queueItems.map(t12);
545
+ $[22] = queue;
546
+ $[23] = queueItems;
547
+ $[24] = t11;
548
+ } else t11 = $[24];
549
+ const queueItemClients = useClientLookup(t11);
550
+ let t12;
551
+ if ($[27] !== attachmentAdapter?.accept || $[28] !== attachmentClients.state || $[29] !== attachments.length || $[30] !== canCancel || $[31] !== isEditing || $[32] !== isSendDisabled || $[33] !== queueItems || $[34] !== quote || $[35] !== role || $[36] !== runConfig || $[37] !== text || $[38] !== type) {
552
+ t12 = () => {
510
553
  const isEmpty = !text.trim() && !attachments.length;
511
554
  return {
512
555
  text,
@@ -524,37 +567,37 @@ const useComposerClientResource = (t0) => {
524
567
  queue: queueItems
525
568
  };
526
569
  };
527
- $[26] = attachmentAdapter?.accept;
528
- $[27] = attachmentClients.state;
529
- $[28] = attachments.length;
530
- $[29] = canCancel;
531
- $[30] = isEditing;
532
- $[31] = isSendDisabled;
533
- $[32] = queueItems;
534
- $[33] = quote;
535
- $[34] = role;
536
- $[35] = runConfig;
537
- $[36] = text;
538
- $[37] = type;
539
- $[38] = t10;
540
- } else t10 = $[38];
570
+ $[27] = attachmentAdapter?.accept;
571
+ $[28] = attachmentClients.state;
572
+ $[29] = attachments.length;
573
+ $[30] = canCancel;
574
+ $[31] = isEditing;
575
+ $[32] = isSendDisabled;
576
+ $[33] = queueItems;
577
+ $[34] = quote;
578
+ $[35] = role;
579
+ $[36] = runConfig;
580
+ $[37] = text;
581
+ $[38] = type;
582
+ $[39] = t12;
583
+ } else t12 = $[39];
541
584
  attachmentAdapter?.accept;
542
- let t11;
543
- if ($[39] !== t10) {
544
- t11 = t10();
545
- $[39] = t10;
546
- $[40] = t11;
547
- } else t11 = $[40];
548
- const state = t11;
549
- let t12;
550
- if ($[41] !== state) {
551
- t12 = () => state;
552
- $[41] = state;
553
- $[42] = t12;
554
- } else t12 = $[42];
555
585
  let t13;
556
- if ($[43] !== attachmentAdapter || $[44] !== setAttachments || $[45] !== upsertAttachment) {
557
- t13 = async (fileOrAttachment) => {
586
+ if ($[40] !== t12) {
587
+ t13 = t12();
588
+ $[40] = t12;
589
+ $[41] = t13;
590
+ } else t13 = $[41];
591
+ const state = t13;
592
+ let t14;
593
+ if ($[42] !== state) {
594
+ t14 = () => state;
595
+ $[42] = state;
596
+ $[43] = t14;
597
+ } else t14 = $[43];
598
+ let t15;
599
+ if ($[44] !== attachmentAdapter || $[45] !== setAttachments || $[46] !== upsertAttachment) {
600
+ t15 = async (fileOrAttachment) => {
558
601
  if (attachmentAdapter) {
559
602
  const file = isCreateAttachment(fileOrAttachment) ? {
560
603
  name: fileOrAttachment.name,
@@ -565,8 +608,21 @@ const useComposerClientResource = (t0) => {
565
608
  };
566
609
  if (!fileMatchesAccept(file, attachmentAdapter.accept)) throw new Error(`File type ${file.type || "unknown"} is not accepted. Accepted types: ${attachmentAdapter.accept}`);
567
610
  }
568
- if (!isCreateAttachment(fileOrAttachment) && attachmentAdapter) await drainAdapterAdd(attachmentAdapter.add({ file: fileOrAttachment }), upsertAttachment);
569
- else if (!isCreateAttachment(fileOrAttachment)) {
611
+ if (!isCreateAttachment(fileOrAttachment) && attachmentAdapter) {
612
+ const operation = attachmentAddOperations.start();
613
+ try {
614
+ await drainAdapterAdd(attachmentAdapter.add({ file: fileOrAttachment }), (attachment_1) => {
615
+ if (!attachmentAddOperations.accept(operation, attachment_1.id)) return false;
616
+ upsertAttachment(attachment_1);
617
+ return true;
618
+ });
619
+ attachmentAddOperations.finish(operation);
620
+ } catch (t16) {
621
+ const error = t16;
622
+ attachmentAddOperations.finish(operation);
623
+ if (!attachmentAddOperations.isCancelled(operation)) throw error;
624
+ }
625
+ } else if (!isCreateAttachment(fileOrAttachment)) {
570
626
  const newAttachment = {
571
627
  id: Math.random().toString(36).substring(7),
572
628
  type: "file",
@@ -589,35 +645,37 @@ const useComposerClientResource = (t0) => {
589
645
  setAttachments((prev_2) => [...prev_2, newAttachment_0]);
590
646
  }
591
647
  };
592
- $[43] = attachmentAdapter;
593
- $[44] = setAttachments;
594
- $[45] = upsertAttachment;
595
- $[46] = t13;
596
- } else t13 = $[46];
597
- let t14;
598
- if ($[47] !== attachmentsRef || $[48] !== removePendingAttachments || $[49] !== setAttachments) {
599
- t14 = async () => {
648
+ $[44] = attachmentAdapter;
649
+ $[45] = setAttachments;
650
+ $[46] = upsertAttachment;
651
+ $[47] = t15;
652
+ } else t15 = $[47];
653
+ let t16;
654
+ if ($[48] !== attachmentsRef || $[49] !== removePendingAttachments || $[50] !== setAttachments) {
655
+ t16 = async () => {
656
+ attachmentAddOperations.cancelAll();
600
657
  const removed_0 = attachmentsRef.current;
601
658
  setAttachments([]);
602
659
  await removePendingAttachments(removed_0);
603
660
  };
604
- $[47] = attachmentsRef;
605
- $[48] = removePendingAttachments;
606
- $[49] = setAttachments;
607
- $[50] = t14;
608
- } else t14 = $[50];
609
- let t15;
610
- if ($[51] !== attachmentClients) {
611
- t15 = (selector) => {
661
+ $[48] = attachmentsRef;
662
+ $[49] = removePendingAttachments;
663
+ $[50] = setAttachments;
664
+ $[51] = t16;
665
+ } else t16 = $[51];
666
+ let t17;
667
+ if ($[52] !== attachmentClients) {
668
+ t17 = (selector) => {
612
669
  if ("id" in selector) return attachmentClients.get({ key: selector.id });
613
670
  return attachmentClients.get(selector);
614
671
  };
615
- $[51] = attachmentClients;
616
- $[52] = t15;
617
- } else t15 = $[52];
618
- let t16;
619
- if ($[53] !== attachmentsRef || $[54] !== removePendingAttachments || $[55] !== setAttachments || $[56] !== setQuote || $[57] !== setRole || $[58] !== setRunConfig || $[59] !== setText) {
620
- t16 = async () => {
672
+ $[52] = attachmentClients;
673
+ $[53] = t17;
674
+ } else t17 = $[53];
675
+ let t18;
676
+ if ($[54] !== attachmentsRef || $[55] !== removePendingAttachments || $[56] !== setAttachments || $[57] !== setQuote || $[58] !== setRole || $[59] !== setRunConfig || $[60] !== setText) {
677
+ t18 = async () => {
678
+ attachmentAddOperations.cancelAll();
621
679
  const removed_1 = attachmentsRef.current;
622
680
  setText("");
623
681
  setRole("user");
@@ -626,30 +684,33 @@ const useComposerClientResource = (t0) => {
626
684
  setQuote(void 0);
627
685
  await removePendingAttachments(removed_1);
628
686
  };
629
- $[53] = attachmentsRef;
630
- $[54] = removePendingAttachments;
631
- $[55] = setAttachments;
632
- $[56] = setQuote;
633
- $[57] = setRole;
634
- $[58] = setRunConfig;
635
- $[59] = setText;
636
- $[60] = t16;
637
- } else t16 = $[60];
638
- let t17;
639
- if ($[61] !== attachmentAdapter || $[62] !== attachmentsRef || $[63] !== canCancel || $[64] !== isEditingRef || $[65] !== isSendDisabled || $[66] !== onSend || $[67] !== queue || $[68] !== quoteRef || $[69] !== roleRef || $[70] !== runConfigRef || $[71] !== setAttachments || $[72] !== setIsEditing || $[73] !== setQuote || $[74] !== setText || $[75] !== textRef || $[76] !== type) {
640
- t17 = (opts) => {
687
+ $[54] = attachmentsRef;
688
+ $[55] = removePendingAttachments;
689
+ $[56] = setAttachments;
690
+ $[57] = setQuote;
691
+ $[58] = setRole;
692
+ $[59] = setRunConfig;
693
+ $[60] = setText;
694
+ $[61] = t18;
695
+ } else t18 = $[61];
696
+ let t19;
697
+ if ($[62] !== attachmentAdapter || $[63] !== attachmentsRef || $[64] !== isEditingRef || $[65] !== isRunning || $[66] !== isSendDisabled || $[67] !== onSend || $[68] !== queue || $[69] !== quoteRef || $[70] !== roleRef || $[71] !== runConfigRef || $[72] !== setAttachments || $[73] !== setIsEditing || $[74] !== setQuote || $[75] !== setText || $[76] !== textRef || $[77] !== type) {
698
+ t19 = (opts) => {
641
699
  const currentQuote = quoteRef.current;
642
700
  const currentText = textRef.current;
701
+ const currentRole = roleRef.current;
702
+ const currentRunConfig = runConfigRef.current;
643
703
  const currentAttachments = attachmentsRef.current;
644
704
  const isEmpty_0 = !currentText.trim() && !currentAttachments.length;
645
705
  if (!isEditingRef.current) throw new Error("Composer is not available");
646
706
  if (isEmpty_0 || isSendDisabled) return;
707
+ attachmentAddOperations.cancelAll();
647
708
  setText("");
648
709
  setAttachments([]);
649
710
  setQuote(void 0);
650
711
  const dispatch = (sendAttachments) => {
651
712
  const composedMessage = {
652
- role: roleRef.current,
713
+ role: currentRole,
653
714
  content: currentText ? [{
654
715
  type: "text",
655
716
  text: currentText
@@ -658,113 +719,113 @@ const useComposerClientResource = (t0) => {
658
719
  createdAt: /* @__PURE__ */ new Date(),
659
720
  parentId: null,
660
721
  sourceId: null,
661
- runConfig: runConfigRef.current,
722
+ runConfig: currentRunConfig,
662
723
  startRun: opts?.startRun,
663
724
  metadata: { custom: { ...currentQuote ? { quote: currentQuote } : {} } }
664
725
  };
665
726
  if (queue && type === "thread") {
666
- if (opts?.steer ?? canCancel) queue.steer(composedMessage);
727
+ if (opts?.steer ?? isRunning) queue.steer(composedMessage);
667
728
  else queue.enqueue(composedMessage);
668
729
  } else onSend?.(composedMessage);
669
730
  if (type === "edit") setIsEditing(false);
670
731
  };
671
- if (attachmentAdapter && currentAttachments.length > 0) Promise.all(currentAttachments.map((attachment_1) => attachment_1.status.type === "complete" ? attachment_1 : attachmentAdapter.send(attachment_1))).then(dispatch, (error) => {
732
+ if (attachmentAdapter && currentAttachments.length > 0) Promise.all(currentAttachments.map((attachment_2) => attachment_2.status.type === "complete" ? attachment_2 : attachmentAdapter.send(attachment_2))).then(dispatch, (error_0) => {
672
733
  setText((prev_3) => currentText && prev_3 ? currentText + "\n" + prev_3 : currentText || prev_3);
673
734
  setQuote((prev_4) => prev_4 ?? currentQuote);
674
735
  setAttachments((prev_5) => [...currentAttachments, ...prev_5]);
675
- console.error("Failed to send attachments", error);
736
+ console.error("Failed to send attachments", error_0);
676
737
  });
677
738
  else dispatch(currentAttachments);
678
739
  };
679
- $[61] = attachmentAdapter;
680
- $[62] = attachmentsRef;
681
- $[63] = canCancel;
740
+ $[62] = attachmentAdapter;
741
+ $[63] = attachmentsRef;
682
742
  $[64] = isEditingRef;
683
- $[65] = isSendDisabled;
684
- $[66] = onSend;
685
- $[67] = queue;
686
- $[68] = quoteRef;
687
- $[69] = roleRef;
688
- $[70] = runConfigRef;
689
- $[71] = setAttachments;
690
- $[72] = setIsEditing;
691
- $[73] = setQuote;
692
- $[74] = setText;
693
- $[75] = textRef;
694
- $[76] = type;
695
- $[77] = t17;
696
- } else t17 = $[77];
697
- let t18;
698
- if ($[78] !== onCancel || $[79] !== setIsEditing || $[80] !== type) {
699
- t18 = () => {
743
+ $[65] = isRunning;
744
+ $[66] = isSendDisabled;
745
+ $[67] = onSend;
746
+ $[68] = queue;
747
+ $[69] = quoteRef;
748
+ $[70] = roleRef;
749
+ $[71] = runConfigRef;
750
+ $[72] = setAttachments;
751
+ $[73] = setIsEditing;
752
+ $[74] = setQuote;
753
+ $[75] = setText;
754
+ $[76] = textRef;
755
+ $[77] = type;
756
+ $[78] = t19;
757
+ } else t19 = $[78];
758
+ let t20;
759
+ if ($[79] !== onCancel || $[80] !== setIsEditing || $[81] !== type) {
760
+ t20 = () => {
700
761
  onCancel?.();
701
762
  if (type === "edit") setIsEditing(false);
702
763
  };
703
- $[78] = onCancel;
704
- $[79] = setIsEditing;
705
- $[80] = type;
706
- $[81] = t18;
707
- } else t18 = $[81];
708
- let t19;
709
- if ($[82] !== isEditingRef || $[83] !== onBeginEdit || $[84] !== setIsEditing || $[85] !== type || $[86] !== updateFromMessage) {
710
- t19 = () => {
764
+ $[79] = onCancel;
765
+ $[80] = setIsEditing;
766
+ $[81] = type;
767
+ $[82] = t20;
768
+ } else t20 = $[82];
769
+ let t21;
770
+ if ($[83] !== isEditingRef || $[84] !== onBeginEdit || $[85] !== setIsEditing || $[86] !== type || $[87] !== updateFromMessage) {
771
+ t21 = () => {
711
772
  onBeginEdit?.();
712
773
  if (type === "thread") return;
713
774
  if (isEditingRef.current) throw new Error("Edit already in progress");
714
775
  setIsEditing(true);
715
776
  updateFromMessage();
716
777
  };
717
- $[82] = isEditingRef;
718
- $[83] = onBeginEdit;
719
- $[84] = setIsEditing;
720
- $[85] = type;
721
- $[86] = updateFromMessage;
722
- $[87] = t19;
723
- } else t19 = $[87];
724
- let t20;
725
- if ($[88] !== queueItemClients) {
726
- t20 = (selector_0) => {
778
+ $[83] = isEditingRef;
779
+ $[84] = onBeginEdit;
780
+ $[85] = setIsEditing;
781
+ $[86] = type;
782
+ $[87] = updateFromMessage;
783
+ $[88] = t21;
784
+ } else t21 = $[88];
785
+ let t22;
786
+ if ($[89] !== queueItemClients) {
787
+ t22 = (selector_0) => {
727
788
  if ("id" in selector_0) return queueItemClients.get({ key: selector_0.id });
728
789
  return queueItemClients.get(selector_0);
729
790
  };
730
- $[88] = queueItemClients;
731
- $[89] = t20;
732
- } else t20 = $[89];
733
- let t21;
734
- if ($[90] !== setQuote || $[91] !== setRole || $[92] !== setRunConfig || $[93] !== setText || $[94] !== t12 || $[95] !== t13 || $[96] !== t14 || $[97] !== t15 || $[98] !== t16 || $[99] !== t17 || $[100] !== t18 || $[101] !== t19 || $[102] !== t20) {
735
- t21 = {
736
- getState: t12,
791
+ $[89] = queueItemClients;
792
+ $[90] = t22;
793
+ } else t22 = $[90];
794
+ let t23;
795
+ if ($[91] !== setQuote || $[92] !== setRole || $[93] !== setRunConfig || $[94] !== setText || $[95] !== t14 || $[96] !== t15 || $[97] !== t16 || $[98] !== t17 || $[99] !== t18 || $[100] !== t19 || $[101] !== t20 || $[102] !== t21 || $[103] !== t22) {
796
+ t23 = {
797
+ getState: t14,
737
798
  setText,
738
799
  setRole,
739
800
  setRunConfig,
740
- addAttachment: t13,
741
- clearAttachments: t14,
742
- attachment: t15,
743
- reset: t16,
744
- send: t17,
745
- cancel: t18,
746
- beginEdit: t19,
801
+ addAttachment: t15,
802
+ clearAttachments: t16,
803
+ attachment: t17,
804
+ reset: t18,
805
+ send: t19,
806
+ cancel: t20,
807
+ beginEdit: t21,
747
808
  startDictation: _temp7,
748
809
  stopDictation: _temp8,
749
810
  setQuote,
750
- queueItem: t20
811
+ queueItem: t22
751
812
  };
752
- $[90] = setQuote;
753
- $[91] = setRole;
754
- $[92] = setRunConfig;
755
- $[93] = setText;
756
- $[94] = t12;
757
- $[95] = t13;
758
- $[96] = t14;
759
- $[97] = t15;
760
- $[98] = t16;
761
- $[99] = t17;
762
- $[100] = t18;
763
- $[101] = t19;
764
- $[102] = t20;
765
- $[103] = t21;
766
- } else t21 = $[103];
767
- return t21;
813
+ $[91] = setQuote;
814
+ $[92] = setRole;
815
+ $[93] = setRunConfig;
816
+ $[94] = setText;
817
+ $[95] = t14;
818
+ $[96] = t15;
819
+ $[97] = t16;
820
+ $[98] = t17;
821
+ $[99] = t18;
822
+ $[100] = t19;
823
+ $[101] = t20;
824
+ $[102] = t21;
825
+ $[103] = t22;
826
+ $[104] = t23;
827
+ } else t23 = $[104];
828
+ return t23;
768
829
  };
769
830
  const ComposerClientResource = resource(useComposerClientResource);
770
831
  const createSpeechController = (notify) => {
@@ -833,8 +894,8 @@ const dedupeMessagesById = (messages) => {
833
894
  return deduped.length === messages.length ? messages : deduped.reverse();
834
895
  };
835
896
  const useExternalThread = (t0) => {
836
- const $ = c(106);
837
- const { messages: messagesProp, isRunning: t1, isLoading: t2, state: threadState, extras, isSendDisabled: t3, onNew, onEdit, onReload, onStartRun, onCancel, onResume, onAddToolResult, onResumeToolCall, onLoadExternalState, attachmentAdapter, feedbackAdapter, speechAdapter, queue, branches, onRespondToToolApproval } = t0;
897
+ const $ = c(115);
898
+ const { messages: messagesProp, isRunning: t1, isLoading: t2, state: threadState, extras, isSendDisabled: t3, onNew, onEdit, onReload, onStartRun, onCancel, onResume, onRefetchThread, onAddToolResult, onResumeToolCall, onLoadExternalState, attachmentAdapter, feedbackAdapter, speechAdapter, queue, branches, onRespondToToolApproval } = t0;
838
899
  const isRunning = t1 === void 0 ? false : t1;
839
900
  const isLoading = t2 === void 0 ? false : t2;
840
901
  const isSendDisabled = t3 === void 0 ? false : t3;
@@ -1007,36 +1068,41 @@ const useExternalThread = (t0) => {
1007
1068
  } else t17 = $[38];
1008
1069
  const messageClients = useClientLookup(t17);
1009
1070
  let t18;
1010
- if ($[39] !== onCancel) {
1071
+ if ($[39] !== onCancel || $[40] !== queue) {
1011
1072
  t18 = () => {
1012
- onCancel?.();
1073
+ if (!onCancel) return;
1074
+ queue?.__internal_notifyCancelled?.();
1075
+ onCancel();
1013
1076
  };
1014
1077
  $[39] = onCancel;
1015
- $[40] = t18;
1016
- } else t18 = $[40];
1078
+ $[40] = queue;
1079
+ $[41] = t18;
1080
+ } else t18 = $[41];
1017
1081
  const handleCancelRun = t18;
1018
1082
  let t19;
1019
- if ($[41] !== messages || $[42] !== onNew) {
1083
+ if ($[42] !== messages || $[43] !== onNew) {
1020
1084
  t19 = (message_1) => {
1021
1085
  onNew?.({
1022
1086
  ...message_1,
1023
1087
  parentId: messages.at(-1)?.id ?? null
1024
1088
  });
1025
1089
  };
1026
- $[41] = messages;
1027
- $[42] = onNew;
1028
- $[43] = t19;
1029
- } else t19 = $[43];
1090
+ $[42] = messages;
1091
+ $[43] = onNew;
1092
+ $[44] = t19;
1093
+ } else t19 = $[44];
1030
1094
  const handleSendNew = t19;
1031
1095
  let t20;
1032
- if ($[44] !== messages) {
1096
+ if ($[45] !== messages) {
1033
1097
  t20 = messages.at(-1)?.id ?? null;
1034
- $[44] = messages;
1035
- $[45] = t20;
1036
- } else t20 = $[45];
1098
+ $[45] = messages;
1099
+ $[46] = t20;
1100
+ } else t20 = $[46];
1037
1101
  const headId = t20;
1102
+ const hasCancel = !!onCancel;
1103
+ const hasRefetchThread = !!onRefetchThread;
1038
1104
  let t21;
1039
- if ($[46] !== headId || $[47] !== queue) {
1105
+ if ($[47] !== headId || $[48] !== queue) {
1040
1106
  t21 = queue && {
1041
1107
  ...queue,
1042
1108
  enqueue: (message_2) => queue.enqueue({
@@ -1048,31 +1114,40 @@ const useExternalThread = (t0) => {
1048
1114
  parentId: message_3.parentId ?? headId
1049
1115
  })
1050
1116
  };
1051
- $[46] = headId;
1052
- $[47] = queue;
1053
- $[48] = t21;
1054
- } else t21 = $[48];
1117
+ $[47] = headId;
1118
+ $[48] = queue;
1119
+ $[49] = t21;
1120
+ } else t21 = $[49];
1055
1121
  const composerQueue = t21;
1056
- let t22;
1057
- if ($[49] !== attachmentAdapter || $[50] !== composerQueue || $[51] !== handleCancelRun || $[52] !== handleSendNew || $[53] !== isRunning || $[54] !== isSendDisabled) {
1058
- t22 = ComposerClientResource({
1122
+ const t22 = isRunning && hasCancel;
1123
+ let t23;
1124
+ if ($[50] !== attachmentAdapter || $[51] !== composerQueue || $[52] !== handleCancelRun || $[53] !== handleSendNew || $[54] !== isRunning || $[55] !== isSendDisabled || $[56] !== t22) {
1125
+ t23 = ComposerClientResource({
1059
1126
  type: "thread",
1060
- canCancel: isRunning,
1127
+ canCancel: t22,
1128
+ isRunning,
1061
1129
  isSendDisabled,
1062
1130
  onCancel: handleCancelRun,
1063
1131
  onSend: handleSendNew,
1064
1132
  queue: composerQueue,
1065
1133
  attachmentAdapter
1066
1134
  });
1067
- $[49] = attachmentAdapter;
1068
- $[50] = composerQueue;
1069
- $[51] = handleCancelRun;
1070
- $[52] = handleSendNew;
1071
- $[53] = isRunning;
1072
- $[54] = isSendDisabled;
1073
- $[55] = t22;
1074
- } else t22 = $[55];
1075
- const composerClient = useClientResource(t22);
1135
+ $[50] = attachmentAdapter;
1136
+ $[51] = composerQueue;
1137
+ $[52] = handleCancelRun;
1138
+ $[53] = handleSendNew;
1139
+ $[54] = isRunning;
1140
+ $[55] = isSendDisabled;
1141
+ $[56] = t22;
1142
+ $[57] = t23;
1143
+ } else t23 = $[57];
1144
+ const composerClient = useClientResource(t23);
1145
+ let t24;
1146
+ if ($[58] === Symbol.for("react.memo_cache_sentinel")) {
1147
+ t24 = ThreadSuggestions(EMPTY_SUGGESTIONS);
1148
+ $[58] = t24;
1149
+ } else t24 = $[58];
1150
+ const suggestionsClient = useClientResource(t24);
1076
1151
  const hasQueue = !!queue;
1077
1152
  const hasBranches = !!branches;
1078
1153
  const hasEdit = !!onEdit;
@@ -1080,22 +1155,22 @@ const useExternalThread = (t0) => {
1080
1155
  const hasAttachments = !!attachmentAdapter;
1081
1156
  const hasFeedback = !!feedbackAdapter;
1082
1157
  const hasSpeech = !!speechAdapter;
1083
- let t23;
1084
- if ($[56] !== messageClients.state) {
1085
- t23 = messageClients.state.map(_temp9);
1086
- $[56] = messageClients.state;
1087
- $[57] = t23;
1088
- } else t23 = $[57];
1089
- const messageStates = t23;
1090
- const t24 = messages.length === 0;
1091
1158
  let t25;
1092
- if ($[58] !== hasAttachments || $[59] !== hasBranches || $[60] !== hasEdit || $[61] !== hasFeedback || $[62] !== hasQueue || $[63] !== hasReload || $[64] !== hasSpeech || $[65] !== isRunning) {
1093
- t25 = {
1159
+ if ($[59] !== messageClients.state) {
1160
+ t25 = messageClients.state.map(_temp9);
1161
+ $[59] = messageClients.state;
1162
+ $[60] = t25;
1163
+ } else t25 = $[60];
1164
+ const messageStates = t25;
1165
+ const t26 = messages.length === 0;
1166
+ let t27;
1167
+ if ($[61] !== hasAttachments || $[62] !== hasBranches || $[63] !== hasCancel || $[64] !== hasEdit || $[65] !== hasFeedback || $[66] !== hasQueue || $[67] !== hasRefetchThread || $[68] !== hasReload || $[69] !== hasSpeech) {
1168
+ t27 = {
1094
1169
  edit: hasEdit,
1095
1170
  delete: false,
1096
1171
  reload: hasReload,
1097
- refetchThread: false,
1098
- cancel: isRunning,
1172
+ refetchThread: hasRefetchThread,
1173
+ cancel: hasCancel,
1099
1174
  speech: hasSpeech,
1100
1175
  attachments: hasAttachments,
1101
1176
  feedback: hasFeedback,
@@ -1106,70 +1181,72 @@ const useExternalThread = (t0) => {
1106
1181
  dictation: false,
1107
1182
  queue: hasQueue
1108
1183
  };
1109
- $[58] = hasAttachments;
1110
- $[59] = hasBranches;
1111
- $[60] = hasEdit;
1112
- $[61] = hasFeedback;
1113
- $[62] = hasQueue;
1114
- $[63] = hasReload;
1115
- $[64] = hasSpeech;
1116
- $[65] = isRunning;
1117
- $[66] = t25;
1118
- } else t25 = $[66];
1119
- let t26;
1120
- if ($[67] !== threadState) {
1121
- t26 = threadState ?? {};
1122
- $[67] = threadState;
1123
- $[68] = t26;
1124
- } else t26 = $[68];
1125
- let t27;
1126
- if ($[69] === Symbol.for("react.memo_cache_sentinel")) {
1127
- t27 = [];
1128
- $[69] = t27;
1129
- } else t27 = $[69];
1184
+ $[61] = hasAttachments;
1185
+ $[62] = hasBranches;
1186
+ $[63] = hasCancel;
1187
+ $[64] = hasEdit;
1188
+ $[65] = hasFeedback;
1189
+ $[66] = hasQueue;
1190
+ $[67] = hasRefetchThread;
1191
+ $[68] = hasReload;
1192
+ $[69] = hasSpeech;
1193
+ $[70] = t27;
1194
+ } else t27 = $[70];
1130
1195
  let t28;
1131
- if ($[70] !== composerClient.state || $[71] !== extras || $[72] !== isLoading || $[73] !== isRunning || $[74] !== messageStates || $[75] !== speech || $[76] !== t24 || $[77] !== t25 || $[78] !== t26) {
1132
- t28 = {
1133
- isEmpty: t24,
1196
+ if ($[71] !== threadState) {
1197
+ t28 = threadState ?? {};
1198
+ $[71] = threadState;
1199
+ $[72] = t28;
1200
+ } else t28 = $[72];
1201
+ let t29;
1202
+ if ($[73] !== composerClient.state || $[74] !== extras || $[75] !== isLoading || $[76] !== isRunning || $[77] !== messageStates || $[78] !== speech || $[79] !== t26 || $[80] !== t27 || $[81] !== t28) {
1203
+ t29 = {
1204
+ isEmpty: t26,
1134
1205
  isDisabled: false,
1135
1206
  isLoading,
1136
1207
  isRunning,
1137
- capabilities: t25,
1208
+ capabilities: t27,
1138
1209
  messages: messageStates,
1139
- state: t26,
1140
- suggestions: t27,
1210
+ state: t28,
1211
+ suggestions: EMPTY_SUGGESTIONS,
1141
1212
  extras,
1142
1213
  speech,
1143
1214
  voice: void 0,
1144
1215
  composer: composerClient.state
1145
1216
  };
1146
- $[70] = composerClient.state;
1147
- $[71] = extras;
1148
- $[72] = isLoading;
1149
- $[73] = isRunning;
1150
- $[74] = messageStates;
1151
- $[75] = speech;
1152
- $[76] = t24;
1153
- $[77] = t25;
1154
- $[78] = t26;
1155
- $[79] = t28;
1156
- } else t28 = $[79];
1157
- const state = t28;
1158
- let t29;
1159
- if ($[80] !== state) {
1160
- t29 = () => state;
1161
- $[80] = state;
1162
- $[81] = t29;
1163
- } else t29 = $[81];
1217
+ $[73] = composerClient.state;
1218
+ $[74] = extras;
1219
+ $[75] = isLoading;
1220
+ $[76] = isRunning;
1221
+ $[77] = messageStates;
1222
+ $[78] = speech;
1223
+ $[79] = t26;
1224
+ $[80] = t27;
1225
+ $[81] = t28;
1226
+ $[82] = t29;
1227
+ } else t29 = $[82];
1228
+ const state = t29;
1164
1229
  let t30;
1165
- if ($[82] !== composerClient.methods) {
1166
- t30 = () => composerClient.methods;
1167
- $[82] = composerClient.methods;
1168
- $[83] = t30;
1169
- } else t30 = $[83];
1230
+ if ($[83] !== state) {
1231
+ t30 = () => state;
1232
+ $[83] = state;
1233
+ $[84] = t30;
1234
+ } else t30 = $[84];
1170
1235
  let t31;
1171
- if ($[84] !== messages || $[85] !== onNew || $[86] !== queue) {
1172
- t31 = (message_4) => {
1236
+ if ($[85] !== composerClient.methods) {
1237
+ t31 = () => composerClient.methods;
1238
+ $[85] = composerClient.methods;
1239
+ $[86] = t31;
1240
+ } else t31 = $[86];
1241
+ let t32;
1242
+ if ($[87] !== suggestionsClient) {
1243
+ t32 = () => suggestionsClient.methods;
1244
+ $[87] = suggestionsClient;
1245
+ $[88] = t32;
1246
+ } else t32 = $[88];
1247
+ let t33;
1248
+ if ($[89] !== messages || $[90] !== onNew || $[91] !== queue) {
1249
+ t33 = (message_4) => {
1173
1250
  const appendMessage = typeof message_4 === "string" ? {
1174
1251
  createdAt: /* @__PURE__ */ new Date(),
1175
1252
  parentId: messages.at(-1)?.id ?? null,
@@ -1196,62 +1273,70 @@ const useExternalThread = (t0) => {
1196
1273
  if (queue) queue.enqueue(appendMessage);
1197
1274
  else onNew?.(appendMessage);
1198
1275
  };
1199
- $[84] = messages;
1200
- $[85] = onNew;
1201
- $[86] = queue;
1202
- $[87] = t31;
1203
- } else t31 = $[87];
1204
- let t32;
1205
- if ($[88] !== onStartRun) {
1206
- t32 = () => {
1276
+ $[89] = messages;
1277
+ $[90] = onNew;
1278
+ $[91] = queue;
1279
+ $[92] = t33;
1280
+ } else t33 = $[92];
1281
+ let t34;
1282
+ if ($[93] !== onStartRun) {
1283
+ t34 = () => {
1207
1284
  onStartRun?.();
1208
1285
  };
1209
- $[88] = onStartRun;
1210
- $[89] = t32;
1211
- } else t32 = $[89];
1212
- let t33;
1213
- if ($[90] !== onResume) {
1214
- t33 = () => {
1286
+ $[93] = onStartRun;
1287
+ $[94] = t34;
1288
+ } else t34 = $[94];
1289
+ let t35;
1290
+ if ($[95] !== onResume) {
1291
+ t35 = () => {
1215
1292
  if (!onResume) throw new Error("Runtime does not support resuming runs (onResume is not set).");
1216
1293
  onResume();
1217
1294
  };
1218
- $[90] = onResume;
1219
- $[91] = t33;
1220
- } else t33 = $[91];
1221
- let t34;
1222
- if ($[92] !== onLoadExternalState) {
1223
- t34 = (state_0) => {
1295
+ $[95] = onResume;
1296
+ $[96] = t35;
1297
+ } else t35 = $[96];
1298
+ let t36;
1299
+ if ($[97] !== onRefetchThread) {
1300
+ t36 = onRefetchThread && { unstable_refetchThread: onRefetchThread };
1301
+ $[97] = onRefetchThread;
1302
+ $[98] = t36;
1303
+ } else t36 = $[98];
1304
+ let t37;
1305
+ if ($[99] !== onLoadExternalState) {
1306
+ t37 = (state_0) => {
1224
1307
  if (!onLoadExternalState) throw new Error("Runtime does not support importing external states (onLoadExternalState is not set).");
1225
1308
  onLoadExternalState(state_0);
1226
1309
  };
1227
- $[92] = onLoadExternalState;
1228
- $[93] = t34;
1229
- } else t34 = $[93];
1230
- let t35;
1231
- if ($[94] !== messageClients) {
1232
- t35 = (selector) => {
1310
+ $[99] = onLoadExternalState;
1311
+ $[100] = t37;
1312
+ } else t37 = $[100];
1313
+ let t38;
1314
+ if ($[101] !== messageClients) {
1315
+ t38 = (selector) => {
1233
1316
  if ("id" in selector) return messageClients.get({ key: selector.id });
1234
1317
  return messageClients.get(selector);
1235
1318
  };
1236
- $[94] = messageClients;
1237
- $[95] = t35;
1238
- } else t35 = $[95];
1239
- let t36;
1240
- if ($[96] !== handleCancelRun || $[97] !== speechController.stop || $[98] !== t29 || $[99] !== t30 || $[100] !== t31 || $[101] !== t32 || $[102] !== t33 || $[103] !== t34 || $[104] !== t35) {
1241
- t36 = {
1242
- getState: t29,
1243
- composer: t30,
1244
- append: t31,
1319
+ $[101] = messageClients;
1320
+ $[102] = t38;
1321
+ } else t38 = $[102];
1322
+ let t39;
1323
+ if ($[103] !== handleCancelRun || $[104] !== speechController.stop || $[105] !== t30 || $[106] !== t31 || $[107] !== t32 || $[108] !== t33 || $[109] !== t34 || $[110] !== t35 || $[111] !== t36 || $[112] !== t37 || $[113] !== t38) {
1324
+ t39 = {
1325
+ getState: t30,
1326
+ composer: t31,
1327
+ suggestions: t32,
1328
+ append: t33,
1245
1329
  deleteMessage: _temp0,
1246
- startRun: t32,
1247
- resumeRun: t33,
1330
+ startRun: t34,
1331
+ resumeRun: t35,
1248
1332
  cancelRun: handleCancelRun,
1249
- importExternalState: t34,
1333
+ ...t36,
1334
+ importExternalState: t37,
1250
1335
  getModelContext: _temp1,
1251
1336
  export: _temp10,
1252
1337
  import: _temp11,
1253
1338
  reset: _temp12,
1254
- message: t35,
1339
+ message: t38,
1255
1340
  stopSpeaking: speechController.stop,
1256
1341
  connectVoice: _temp13,
1257
1342
  disconnectVoice: _temp14,
@@ -1260,18 +1345,20 @@ const useExternalThread = (t0) => {
1260
1345
  muteVoice: _temp18,
1261
1346
  unmuteVoice: _temp19
1262
1347
  };
1263
- $[96] = handleCancelRun;
1264
- $[97] = speechController.stop;
1265
- $[98] = t29;
1266
- $[99] = t30;
1267
- $[100] = t31;
1268
- $[101] = t32;
1269
- $[102] = t33;
1270
- $[103] = t34;
1271
- $[104] = t35;
1272
- $[105] = t36;
1273
- } else t36 = $[105];
1274
- return t36;
1348
+ $[103] = handleCancelRun;
1349
+ $[104] = speechController.stop;
1350
+ $[105] = t30;
1351
+ $[106] = t31;
1352
+ $[107] = t32;
1353
+ $[108] = t33;
1354
+ $[109] = t34;
1355
+ $[110] = t35;
1356
+ $[111] = t36;
1357
+ $[112] = t37;
1358
+ $[113] = t38;
1359
+ $[114] = t39;
1360
+ } else t39 = $[114];
1361
+ return t39;
1275
1362
  };
1276
1363
  const ExternalThread = resource(useExternalThread);
1277
1364
  attachTransformScopes(useExternalThread, (scopes, parent) => {
@@ -1298,7 +1385,11 @@ attachTransformScopes(useExternalThread, (scopes, parent) => {
1298
1385
  if (!scopes.modelContext && parent.modelContext.source === null) scopes.modelContext = ModelContext();
1299
1386
  if (!scopes.tools && parent.tools.source === null) scopes.tools = Tools({});
1300
1387
  if (!scopes.dataRenderers && parent.dataRenderers.source === null) scopes.dataRenderers = DataRenderers();
1301
- if (!scopes.suggestions && parent.suggestions.source === null) scopes.suggestions = Suggestions();
1388
+ if (!scopes.suggestions && parent.suggestions.source === null) scopes.suggestions = Derived({
1389
+ source: "thread",
1390
+ query: {},
1391
+ get: (aui) => aui.thread.suggestions()
1392
+ });
1302
1393
  });
1303
1394
  function _temp() {}
1304
1395
  function _temp2(attachment) {