@assistant-ui/core 0.3.17 → 0.3.19

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 (470) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +5 -4
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/adapters/speech.d.ts.map +1 -1
  5. package/dist/adapters/speech.js +13 -3
  6. package/dist/adapters/speech.js.map +1 -1
  7. package/dist/adapters/thread-history.d.ts +4 -0
  8. package/dist/adapters/thread-history.d.ts.map +1 -1
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/internal.d.ts +4 -3
  12. package/dist/internal.js +3 -2
  13. package/dist/model-context/frame/host.d.ts.map +1 -1
  14. package/dist/model-context/frame/host.js +35 -14
  15. package/dist/model-context/frame/host.js.map +1 -1
  16. package/dist/model-context/frame/provider.d.ts +2 -0
  17. package/dist/model-context/frame/provider.d.ts.map +1 -1
  18. package/dist/model-context/frame/provider.js +30 -7
  19. package/dist/model-context/frame/provider.js.map +1 -1
  20. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  21. package/dist/model-context/interactable-composer-metadata.js +27 -18
  22. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  23. package/dist/model-context/registry.d.ts.map +1 -1
  24. package/dist/model-context/registry.js +3 -5
  25. package/dist/model-context/registry.js.map +1 -1
  26. package/dist/model-context/types.d.ts.map +1 -1
  27. package/dist/model-context/types.js +5 -4
  28. package/dist/model-context/types.js.map +1 -1
  29. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  30. package/dist/react/adapters/LocalStorageThreadListAdapter.js +45 -7
  31. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  32. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  33. package/dist/react/client/DataRenderers.js +20 -15
  34. package/dist/react/client/DataRenderers.js.map +1 -1
  35. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  36. package/dist/react/client/InMemoryThreadList.js +62 -56
  37. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  38. package/dist/react/client/Interactables.d.ts.map +1 -1
  39. package/dist/react/client/Interactables.js +35 -32
  40. package/dist/react/client/Interactables.js.map +1 -1
  41. package/dist/react/client/RemoteThreadList.d.ts +1 -0
  42. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  43. package/dist/react/client/RemoteThreadList.js +154 -143
  44. package/dist/react/client/RemoteThreadList.js.map +1 -1
  45. package/dist/react/client/Tools.d.ts.map +1 -1
  46. package/dist/react/client/Tools.js +18 -16
  47. package/dist/react/client/Tools.js.map +1 -1
  48. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  49. package/dist/react/client/interactable-model-context.js +3 -2
  50. package/dist/react/client/interactable-model-context.js.map +1 -1
  51. package/dist/react/index.d.ts +2 -2
  52. package/dist/react/index.js +2 -2
  53. package/dist/react/interactables-legacy/Interactables.js +242 -121
  54. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  55. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  56. package/dist/react/interactables-legacy/useAssistantInteractable.js +3 -0
  57. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  58. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  59. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  60. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  61. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  62. package/dist/react/model-context/makeAssistantTool.js +1 -1
  63. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  64. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  65. package/dist/react/model-context/useAssistantTool.js +1 -1
  66. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  67. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  68. package/dist/react/model-context/useInteractable.js +4 -1
  69. package/dist/react/model-context/useInteractable.js.map +1 -1
  70. package/dist/react/model-context/useInteractableVersions.js +1 -1
  71. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  72. package/dist/react/model-context/useToolArgsStatus.js +2 -1
  73. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  74. package/dist/react/primitives/message/MessageGroupedParts.d.ts +11 -2
  75. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  76. package/dist/react/primitives/message/MessageGroupedParts.js +3 -2
  77. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  78. package/dist/react/primitives/part/PartMessages.d.ts +1 -0
  79. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  80. package/dist/react/primitives/part/PartMessages.js +1 -0
  81. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  82. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  83. package/dist/react/primitives/thread/ThreadMessages.js +6 -5
  84. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  86. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +16 -8
  87. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  88. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
  89. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  90. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +105 -104
  91. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  92. package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -0
  93. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  94. package/dist/react/runtimes/RemoteThreadResource.js +13 -11
  95. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  96. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +5 -24
  97. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  98. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +354 -226
  99. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  100. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -0
  101. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  102. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +22 -2
  103. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  104. package/dist/react/runtimes/cloud/auiV0.d.ts +40 -15
  105. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  106. package/dist/react/runtimes/cloud/auiV0.js +62 -15
  107. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  108. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +2 -1
  109. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  110. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +6 -1
  111. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
  112. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +6 -0
  113. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -0
  114. package/dist/react/runtimes/cloud/sdkIdentity.js +9 -0
  115. package/dist/react/runtimes/cloud/sdkIdentity.js.map +1 -0
  116. package/dist/react/runtimes/external-message-converter.d.ts +12 -2
  117. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  118. package/dist/react/runtimes/external-message-converter.js +26 -61
  119. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  120. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  121. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  122. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  123. package/dist/react/runtimes/useRemoteThreadListRuntime.js +64 -24
  124. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  125. package/dist/react/utils/groupParts.d.ts +6 -1
  126. package/dist/react/utils/groupParts.d.ts.map +1 -1
  127. package/dist/react/utils/groupParts.js +6 -0
  128. package/dist/react/utils/groupParts.js.map +1 -1
  129. package/dist/react/utils/useJSONEqual.d.ts +3 -1
  130. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  131. package/dist/react/utils/useJSONEqual.js +6 -1
  132. package/dist/react/utils/useJSONEqual.js.map +1 -1
  133. package/dist/react/utils/useJSONSchemaDependency.d.ts +7 -0
  134. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -0
  135. package/dist/react/utils/useJSONSchemaDependency.js +20 -0
  136. package/dist/react/utils/useJSONSchemaDependency.js.map +1 -0
  137. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  138. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  139. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  140. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  141. package/dist/runtime/api/thread-list-runtime.d.ts +3 -0
  142. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  143. package/dist/runtime/api/thread-list-runtime.js +18 -14
  144. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  145. package/dist/runtime/api/thread-runtime.d.ts +4 -0
  146. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  147. package/dist/runtime/api/thread-runtime.js +3 -6
  148. package/dist/runtime/api/thread-runtime.js.map +1 -1
  149. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -0
  150. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  151. package/dist/runtime/base/base-composer-runtime-core.js +62 -22
  152. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  153. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -0
  154. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  155. package/dist/runtime/base/base-thread-runtime-core.js +161 -69
  156. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  157. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  158. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  159. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -1
  160. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  161. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  162. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  163. package/dist/runtime/queue/message-queue.d.ts +5 -0
  164. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  165. package/dist/runtime/queue/message-queue.js +61 -6
  166. package/dist/runtime/queue/message-queue.js.map +1 -1
  167. package/dist/runtime/utils/auto-status.d.ts +6 -2
  168. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  169. package/dist/runtime/utils/auto-status.js +12 -4
  170. package/dist/runtime/utils/auto-status.js.map +1 -1
  171. package/dist/runtime/utils/external-message-conversion.d.ts +16 -4
  172. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  173. package/dist/runtime/utils/external-message-conversion.js +49 -13
  174. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  175. package/dist/runtime/utils/message-repository.d.ts +1 -0
  176. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  177. package/dist/runtime/utils/message-repository.js +18 -9
  178. package/dist/runtime/utils/message-repository.js.map +1 -1
  179. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  180. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  181. package/dist/runtime/utils/thread-message-like.js +5 -3
  182. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  183. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  184. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  185. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  186. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  187. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +8 -1
  188. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  189. package/dist/runtimes/internal.d.ts +3 -3
  190. package/dist/runtimes/internal.js +2 -2
  191. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  192. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  193. package/dist/runtimes/local/local-thread-runtime-core.js +4 -1
  194. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  195. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  196. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  197. package/dist/runtimes/remote-thread-list/remote-thread-state.js +130 -42
  198. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  199. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  200. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  201. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  202. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  203. package/dist/runtimes/remote-thread-list/title.d.ts +3 -1
  204. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  205. package/dist/runtimes/remote-thread-list/title.js +9 -1
  206. package/dist/runtimes/remote-thread-list/title.js.map +1 -1
  207. package/dist/runtimes/remote-thread-list/types.d.ts +10 -0
  208. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  209. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  210. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -1
  211. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  212. package/dist/store/clients/external-thread.d.ts.map +1 -1
  213. package/dist/store/clients/external-thread.js +260 -203
  214. package/dist/store/clients/external-thread.js.map +1 -1
  215. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  216. package/dist/store/clients/model-context-client.js +2 -1
  217. package/dist/store/clients/model-context-client.js.map +1 -1
  218. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  219. package/dist/store/clients/single-thread-list.js +1 -0
  220. package/dist/store/clients/single-thread-list.js.map +1 -1
  221. package/dist/store/clients/suggestions.d.ts.map +1 -1
  222. package/dist/store/clients/suggestions.js +5 -4
  223. package/dist/store/clients/suggestions.js.map +1 -1
  224. package/dist/store/clients/thread-tasks.d.ts +13 -0
  225. package/dist/store/clients/thread-tasks.d.ts.map +1 -0
  226. package/dist/store/clients/thread-tasks.js +69 -0
  227. package/dist/store/clients/thread-tasks.js.map +1 -0
  228. package/dist/store/index.d.ts +3 -2
  229. package/dist/store/index.js +3 -3
  230. package/dist/store/primitive-predicates.d.ts.map +1 -1
  231. package/dist/store/primitive-predicates.js +4 -4
  232. package/dist/store/primitive-predicates.js.map +1 -1
  233. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  234. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  235. package/dist/store/runtime-clients/composer-runtime-client.js +97 -61
  236. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  237. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  238. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  239. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  240. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  241. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  242. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
  243. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  244. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  245. package/dist/store/runtime-clients/thread-list-runtime-client.js +54 -52
  246. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  247. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  248. package/dist/store/runtime-clients/thread-runtime-client.js +246 -126
  249. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  250. package/dist/store/scope-registration.d.ts +2 -0
  251. package/dist/store/scope-registration.d.ts.map +1 -1
  252. package/dist/store/scopes/composer.d.ts +10 -2
  253. package/dist/store/scopes/composer.d.ts.map +1 -1
  254. package/dist/store/scopes/message.d.ts +30 -1
  255. package/dist/store/scopes/message.d.ts.map +1 -1
  256. package/dist/store/scopes/task.d.ts +36 -0
  257. package/dist/store/scopes/task.d.ts.map +1 -0
  258. package/dist/store/scopes/task.js +0 -0
  259. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  260. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  261. package/dist/store/scopes/thread.d.ts +28 -0
  262. package/dist/store/scopes/thread.d.ts.map +1 -1
  263. package/dist/store/scopes/threads.d.ts +1 -0
  264. package/dist/store/scopes/threads.d.ts.map +1 -1
  265. package/dist/subscribable/subscribable.d.ts +2 -1
  266. package/dist/subscribable/subscribable.d.ts.map +1 -1
  267. package/dist/subscribable/subscribable.js +23 -15
  268. package/dist/subscribable/subscribable.js.map +1 -1
  269. package/dist/types/attachment.d.ts +2 -1
  270. package/dist/types/attachment.d.ts.map +1 -1
  271. package/dist/types/attachment.js +2 -1
  272. package/dist/types/attachment.js.map +1 -1
  273. package/dist/types/index.d.ts +2 -2
  274. package/dist/types/message.d.ts +8 -1
  275. package/dist/types/message.d.ts.map +1 -1
  276. package/dist/types/message.js.map +1 -1
  277. package/dist/utils/abortable-iterable.d.ts +19 -0
  278. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  279. package/dist/utils/abortable-iterable.js +88 -0
  280. package/dist/utils/abortable-iterable.js.map +1 -0
  281. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  282. package/dist/utils/composite-context-provider.js +20 -2
  283. package/dist/utils/composite-context-provider.js.map +1 -1
  284. package/dist/utils/getGroupStatus.d.ts +18 -2
  285. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  286. package/dist/utils/getGroupStatus.js +32 -7
  287. package/dist/utils/getGroupStatus.js.map +1 -1
  288. package/dist/utils/record.d.ts +11 -0
  289. package/dist/utils/record.d.ts.map +1 -0
  290. package/dist/utils/record.js +12 -0
  291. package/dist/utils/record.js.map +1 -0
  292. package/dist/utils/wire-media.d.ts.map +1 -1
  293. package/dist/utils/wire-media.js +2 -2
  294. package/dist/utils/wire-media.js.map +1 -1
  295. package/package.json +11 -11
  296. package/src/adapters/attachment.test.ts +50 -1
  297. package/src/adapters/attachment.ts +7 -4
  298. package/src/adapters/speech.test.ts +236 -0
  299. package/src/adapters/speech.ts +17 -10
  300. package/src/adapters/thread-history.ts +3 -0
  301. package/src/index.ts +2 -0
  302. package/src/internal.ts +4 -0
  303. package/src/model-context/frame/host.test.ts +137 -1
  304. package/src/model-context/frame/host.ts +49 -16
  305. package/src/model-context/frame/provider.test.ts +71 -0
  306. package/src/model-context/frame/provider.ts +37 -7
  307. package/src/model-context/interactable-composer-metadata.test.ts +58 -0
  308. package/src/model-context/interactable-composer-metadata.ts +19 -13
  309. package/src/model-context/registry.test.ts +12 -0
  310. package/src/model-context/registry.ts +3 -2
  311. package/src/model-context/types.test.ts +25 -0
  312. package/src/model-context/types.ts +9 -4
  313. package/src/react/RuntimeAdapter.test.ts +34 -0
  314. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +244 -0
  315. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +104 -7
  316. package/src/react/client/DataRenderers.test.tsx +45 -0
  317. package/src/react/client/DataRenderers.ts +13 -9
  318. package/src/react/client/InMemoryThreadList.ts +1 -0
  319. package/src/react/client/Interactables.test.ts +72 -1
  320. package/src/react/client/Interactables.ts +22 -14
  321. package/src/react/client/RemoteThreadList.background.test.ts +148 -6
  322. package/src/react/client/RemoteThreadList.concurrent.test.tsx +42 -1
  323. package/src/react/client/RemoteThreadList.test.ts +386 -4
  324. package/src/react/client/RemoteThreadList.ts +181 -112
  325. package/src/react/client/Tools.ts +22 -11
  326. package/src/react/client/interactable-model-context.test.ts +44 -0
  327. package/src/react/client/interactable-model-context.ts +3 -2
  328. package/src/react/index.ts +5 -1
  329. package/src/react/interactables-legacy/Interactables.ts +16 -16
  330. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +132 -0
  331. package/src/react/interactables-legacy/useAssistantInteractable.ts +10 -1
  332. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  333. package/src/react/model-context/makeAssistantTool.ts +2 -2
  334. package/src/react/model-context/useAssistantTool.ts +2 -2
  335. package/src/react/model-context/useInteractable.test.tsx +177 -0
  336. package/src/react/model-context/useInteractable.ts +3 -0
  337. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  338. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  339. package/src/react/primitive-hooks/useActionBarCopy.test.ts +0 -1
  340. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +0 -1
  341. package/src/react/primitives/message/MessageGroupedParts.test.tsx +96 -0
  342. package/src/react/primitives/message/MessageGroupedParts.tsx +15 -4
  343. package/src/react/primitives/part/PartMessages.test.tsx +104 -1
  344. package/src/react/primitives/part/PartMessages.tsx +1 -0
  345. package/src/react/primitives/thread/ThreadMessages.test.tsx +142 -0
  346. package/src/react/primitives/thread/ThreadMessages.tsx +8 -5
  347. package/src/react/providers/ReadonlyThreadProvider.test.tsx +56 -0
  348. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  349. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +33 -0
  350. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  351. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +28 -5
  352. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  353. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +105 -0
  354. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +143 -112
  355. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  356. package/src/react/runtimes/RemoteThreadResource.ts +19 -12
  357. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +20 -14
  358. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +703 -6
  359. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +492 -402
  360. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +77 -0
  361. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +27 -1
  362. package/src/react/runtimes/cloud/auiV0.ts +160 -25
  363. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +36 -0
  364. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +8 -1
  365. package/src/react/runtimes/cloud/sdkIdentity.ts +9 -0
  366. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +18 -4
  367. package/src/react/runtimes/external-message-converter.test.ts +136 -1
  368. package/src/react/runtimes/external-message-converter.ts +39 -93
  369. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  370. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  371. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  372. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  373. package/src/react/runtimes/useRemoteThreadListRuntime.ts +34 -1
  374. package/src/react/utils/groupParts.ts +12 -1
  375. package/src/react/utils/useJSONEqual.ts +9 -0
  376. package/src/react/utils/useJSONSchemaDependency.ts +22 -0
  377. package/src/runtime/api/message-runtime.test.ts +75 -0
  378. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  379. package/src/runtime/api/thread-list-runtime.ts +21 -11
  380. package/src/runtime/api/thread-runtime.test.ts +136 -0
  381. package/src/runtime/api/thread-runtime.ts +10 -5
  382. package/src/runtime/base/base-composer-runtime-core.ts +105 -24
  383. package/src/runtime/base/base-thread-runtime-core.test.ts +1063 -2
  384. package/src/runtime/base/base-thread-runtime-core.ts +228 -87
  385. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  386. package/src/runtime/interfaces/thread-list-runtime-core.ts +5 -1
  387. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  388. package/src/runtime/queue/message-queue.ts +68 -6
  389. package/src/runtime/utils/auto-status.test.ts +112 -1
  390. package/src/runtime/utils/auto-status.ts +31 -5
  391. package/src/runtime/utils/external-message-conversion.test.ts +202 -0
  392. package/src/runtime/utils/external-message-conversion.ts +123 -32
  393. package/src/runtime/utils/message-repository.test.ts +49 -0
  394. package/src/runtime/utils/message-repository.ts +32 -20
  395. package/src/runtime/utils/thread-message-like.test.ts +52 -0
  396. package/src/runtime/utils/thread-message-like.ts +5 -1
  397. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  398. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -1
  399. package/src/runtimes/internal.ts +1 -0
  400. package/src/runtimes/local/local-thread-runtime-core.test.ts +21 -0
  401. package/src/runtimes/local/local-thread-runtime-core.ts +11 -1
  402. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +128 -2
  403. package/src/runtimes/remote-thread-list/remote-thread-state.ts +182 -42
  404. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  405. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  406. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  407. package/src/runtimes/remote-thread-list/title.ts +13 -0
  408. package/src/runtimes/remote-thread-list/types.ts +10 -0
  409. package/src/runtimes/tool-invocations/EDGE_CASES.md +2 -6
  410. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +133 -0
  411. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +10 -6
  412. package/src/store/clients/external-thread.ts +67 -4
  413. package/src/store/clients/model-context-client.ts +5 -1
  414. package/src/store/clients/single-thread-list.ts +1 -0
  415. package/src/store/clients/suggestions.test.ts +40 -0
  416. package/src/store/clients/suggestions.ts +13 -10
  417. package/src/store/clients/thread-tasks.test.ts +274 -0
  418. package/src/store/clients/thread-tasks.ts +138 -0
  419. package/src/store/index.ts +8 -0
  420. package/src/store/primitive-predicates.test.ts +48 -5
  421. package/src/store/primitive-predicates.ts +7 -2
  422. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  423. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  424. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  425. package/src/store/runtime-clients/thread-list-runtime-client.ts +1 -0
  426. package/src/store/runtime-clients/thread-runtime-client.ts +89 -11
  427. package/src/store/scope-registration.ts +2 -0
  428. package/src/store/scopes/composer.ts +16 -4
  429. package/src/store/scopes/message.ts +14 -0
  430. package/src/store/scopes/task.ts +34 -0
  431. package/src/store/scopes/thread-list-item.ts +5 -2
  432. package/src/store/scopes/thread.ts +20 -0
  433. package/src/store/scopes/threads.ts +1 -0
  434. package/src/store/thread-tasks.test.tsx +209 -0
  435. package/src/subscribable/subscribable.test.ts +156 -1
  436. package/src/subscribable/subscribable.ts +25 -15
  437. package/src/tests/MessageRepository.test.ts +117 -5
  438. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  439. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  440. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +47 -0
  441. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  442. package/src/tests/attachment-adapters.test.ts +14 -0
  443. package/src/tests/auiV0Encode.test.ts +300 -0
  444. package/src/tests/base-composer-runtime-core-send.test.ts +51 -0
  445. package/src/tests/base-composer-runtime-core.test.ts +353 -2
  446. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  447. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +178 -18
  448. package/src/tests/external-thread-attachments.test.tsx +208 -0
  449. package/src/tests/external-thread-parity.test.tsx +57 -0
  450. package/src/tests/groupParts.test.ts +71 -0
  451. package/src/tests/message-queue.test.ts +253 -0
  452. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  453. package/src/tests/remote-thread-list-reactive-threadId.test.ts +51 -0
  454. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  455. package/src/tests/thread-switch-events.test.tsx +78 -0
  456. package/src/tests/tools-scope-migration.test.tsx +28 -0
  457. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +43 -0
  458. package/src/types/attachment.ts +4 -0
  459. package/src/types/index.ts +1 -0
  460. package/src/types/message.ts +8 -0
  461. package/src/utils/abortable-iterable.test.ts +328 -0
  462. package/src/utils/abortable-iterable.ts +104 -0
  463. package/src/utils/composite-context-provider.test.ts +25 -0
  464. package/src/utils/composite-context-provider.ts +23 -2
  465. package/src/utils/getGroupStatus.test.ts +70 -4
  466. package/src/utils/getGroupStatus.ts +35 -12
  467. package/src/utils/record.test.ts +48 -0
  468. package/src/utils/record.ts +11 -0
  469. package/src/utils/wire-media.test.ts +10 -0
  470. package/src/utils/wire-media.ts +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-runtime.js","names":["Unsubscribe","LazyMemoizeSubject","NestedSubscriptionSubject","SKIP_UPDATE","ShallowMemoizeSubject","ThreadListRuntimeCore","ThreadListRuntimeEvent","ThreadListItemRuntime","ThreadListItemRuntimeImpl","ThreadListItemState","ThreadListItemRuntimeBinding","ThreadRuntime","ThreadRuntimeCoreBinding","ThreadRuntimeImpl","RESOLVED_PROMISE","Promise","resolve","NOOP_UNSUBSCRIBE","ThreadListState","mainThreadId","newThreadId","threadIds","archivedThreadIds","isLoading","isLoadingMore","hasMore","threadItems","Readonly","Record","Omit","ThreadListRuntime","getState","subscribe","callback","main","getById","threadId","mainItem","getItemById","getItemByIndex","idx","getArchivedItemByIndex","switchToThread","options","unarchive","switchToNewThread","unstable_subscribeThreadEvents","event","getLoadThreadsPromise","reload","reloadMainThread","loadMore","getThreadListState","threadList","getThreadListItemState","undefined","threadData","id","remoteId","externalId","title","status","lastMessageAt","custom","isMain","isRunning","unstable_isThreadRunning","ThreadListRuntimeCoreBinding","ThreadListRuntimeImpl","_getState","_stateBinding","_core","_runtimeFactory","binding","threadListItemBinding","constructor","stateBinding","path","bind","_mainThreadListItemRuntime","ref","threadSelector","type","getMainThreadRuntimeCore","__internal_bindMethods","JSON","stringify","getThreadRuntimeCore","index"],"sources":["../../../src/runtime/api/thread-list-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport {\n LazyMemoizeSubject,\n NestedSubscriptionSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport type {\n ThreadListRuntimeCore,\n ThreadListRuntimeEvent,\n} from \"../interfaces/thread-list-runtime-core\";\nimport {\n type ThreadListItemRuntime,\n ThreadListItemRuntimeImpl,\n type ThreadListItemState,\n} from \"./thread-list-item-runtime\";\nimport {\n type ThreadListItemRuntimeBinding,\n type ThreadRuntime,\n type ThreadRuntimeCoreBinding,\n ThreadRuntimeImpl,\n} from \"./thread-runtime\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\nconst NOOP_UNSUBSCRIBE = () => {};\n\nexport type ThreadListState = {\n readonly mainThreadId: string;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly isLoading: boolean;\n readonly isLoadingMore: boolean;\n readonly hasMore: boolean;\n readonly threadItems: Readonly<\n Record<\n string,\n Omit<ThreadListItemState, \"isMain\" | \"threadId\" | \"isRunning\">\n >\n >;\n};\n\nexport type ThreadListRuntime = {\n getState(): ThreadListState;\n\n subscribe(callback: () => void): Unsubscribe;\n\n readonly main: ThreadRuntime;\n getById(threadId: string): ThreadRuntime;\n\n readonly mainItem: ThreadListItemRuntime;\n getItemById(threadId: string): ThreadListItemRuntime;\n getItemByIndex(idx: number): ThreadListItemRuntime;\n getArchivedItemByIndex(idx: number): ThreadListItemRuntime;\n\n switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void>;\n switchToNewThread(): Promise<void>;\n\n /**\n * Observes lifecycle events on every thread this list keeps alive, so an\n * event that fires while its thread is not selected stays observable. Thread\n * lists that mount only the main thread never emit; their main thread's\n * runtime is observed directly.\n */\n unstable_subscribeThreadEvents(\n callback: (event: ThreadListRuntimeEvent) => void,\n ): Unsubscribe;\n\n getLoadThreadsPromise(): Promise<void>;\n reload(): Promise<void>;\n /**\n * Refetches the open thread's remote state, for state that changed out of\n * band and so never reached the stream. When the runtime declares the\n * in-place capability (`unstable_refetchThread`), composer drafts survive,\n * existing messages stay rendered during the refetch, and the promise\n * settles with the refetch, rejecting if it fails; that runtime also owns\n * what happens to a run in progress, since this does not stop one. Runtimes\n * without the capability have their hook remounted instead, which discards\n * unsent composer input and ends any run, and the promise resolves once the\n * new runtime attaches. A thread that has not been sent yet is left alone.\n */\n reloadMainThread(): Promise<void>;\n loadMore(): Promise<void>;\n};\n\nconst getThreadListState = (\n threadList: ThreadListRuntimeCore,\n): ThreadListState => {\n return {\n mainThreadId: threadList.mainThreadId,\n newThreadId: threadList.newThreadId,\n threadIds: threadList.threadIds,\n archivedThreadIds: threadList.archivedThreadIds,\n isLoading: threadList.isLoading,\n isLoadingMore: threadList.isLoadingMore ?? false,\n hasMore: threadList.hasMore ?? false,\n threadItems: threadList.threadItems,\n };\n};\n\nconst getThreadListItemState = (\n threadList: ThreadListRuntimeCore,\n threadId: string | undefined,\n): ThreadListItemState | SKIP_UPDATE => {\n if (threadId === undefined) return SKIP_UPDATE;\n\n const threadData = threadList.getItemById(threadId);\n if (!threadData) return SKIP_UPDATE;\n return {\n id: threadData.id,\n remoteId: threadData.remoteId,\n externalId: threadData.externalId,\n title: threadData.title,\n status: threadData.status,\n lastMessageAt: threadData.lastMessageAt,\n custom: threadData.custom,\n isMain: threadData.id === threadList.mainThreadId,\n isRunning: threadList.unstable_isThreadRunning?.(threadData.id) ?? false,\n };\n};\n\nexport type ThreadListRuntimeCoreBinding = ThreadListRuntimeCore;\n\nexport class ThreadListRuntimeImpl implements ThreadListRuntime {\n private _getState;\n private _stateBinding: LazyMemoizeSubject<ThreadListState, object>;\n private _core: ThreadListRuntimeCoreBinding;\n private _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime;\n\n constructor(\n _core: ThreadListRuntimeCoreBinding,\n _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime = ThreadRuntimeImpl,\n ) {\n this._core = _core;\n this._runtimeFactory = _runtimeFactory;\n const stateBinding = new LazyMemoizeSubject({\n path: {},\n getState: () => getThreadListState(_core),\n subscribe: (callback) => _core.subscribe(callback),\n });\n\n this._getState = stateBinding.getState.bind(stateBinding);\n this._stateBinding = stateBinding;\n\n this._mainThreadListItemRuntime = new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[main]`,\n threadSelector: { type: \"main\" },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.mainThreadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n\n this.main = new _runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: \"threads.main\",\n threadSelector: { type: \"main\" },\n },\n getState: () => _core.getMainThreadRuntimeCore(),\n subscribe: (callback) => _core.subscribe(callback),\n }),\n this._mainThreadListItemRuntime,\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchToThread = this.switchToThread.bind(this);\n this.switchToNewThread = this.switchToNewThread.bind(this);\n this.unstable_subscribeThreadEvents =\n this.unstable_subscribeThreadEvents.bind(this);\n this.getLoadThreadsPromise = this.getLoadThreadsPromise.bind(this);\n this.reload = this.reload.bind(this);\n this.reloadMainThread = this.reloadMainThread.bind(this);\n this.loadMore = this.loadMore.bind(this);\n this.getState = this.getState.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.getById = this.getById.bind(this);\n this.getItemById = this.getItemById.bind(this);\n this.getItemByIndex = this.getItemByIndex.bind(this);\n this.getArchivedItemByIndex = this.getArchivedItemByIndex.bind(this);\n }\n\n public switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._core.switchToThread(threadId, options);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._core.switchToNewThread();\n }\n\n public unstable_subscribeThreadEvents(\n callback: (event: ThreadListRuntimeEvent) => void,\n ): Unsubscribe {\n return (\n this._core.unstable_subscribeThreadEvents?.(callback) ?? NOOP_UNSUBSCRIBE\n );\n }\n\n public getLoadThreadsPromise(): Promise<void> {\n return this._core.getLoadThreadsPromise();\n }\n\n public reload(): Promise<void> {\n return this._core.reload?.() ?? RESOLVED_PROMISE;\n }\n\n public reloadMainThread(): Promise<void> {\n return this._core.reloadMainThread?.() ?? RESOLVED_PROMISE;\n }\n\n public loadMore(): Promise<void> {\n return this._core.loadMore?.() ?? RESOLVED_PROMISE;\n }\n\n public getState(): ThreadListState {\n return this._getState();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._stateBinding.subscribe(callback);\n }\n\n private _mainThreadListItemRuntime;\n\n public readonly main: ThreadRuntime;\n\n public get mainItem() {\n return this._mainThreadListItemRuntime;\n }\n\n public getById(threadId: string) {\n return new this._runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: `threads[threadId=${JSON.stringify(threadId)}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => this._core.getThreadRuntimeCore(threadId),\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this.mainItem,\n );\n }\n\n public getItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[${idx}]`,\n threadSelector: { type: \"index\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.threadIds[idx]);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getArchivedItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `archivedThreadItems[${idx}]`,\n threadSelector: { type: \"archiveIndex\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(\n this._core,\n this._core.archivedThreadIds[idx],\n );\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getItemById(threadId: string) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n return getThreadListItemState(this._core, threadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-list-runtime.js","names":["Unsubscribe","LazyMemoizeSubject","NestedSubscriptionSubject","SKIP_UPDATE","ShallowMemoizeSubject","ThreadListRuntimeCore","ThreadListRuntimeEvent","ThreadListItemRuntime","ThreadListItemRuntimeImpl","ThreadListItemState","ThreadListItemStateBinding","ThreadListItemRuntimeBinding","ThreadRuntime","ThreadRuntimeCoreBinding","ThreadRuntimeImpl","RESOLVED_PROMISE","Promise","resolve","NOOP_UNSUBSCRIBE","ThreadListState","mainThreadId","newThreadId","threadIds","archivedThreadIds","isLoading","loadError","isLoadingMore","hasMore","threadItems","Readonly","Record","Omit","ThreadListRuntime","getState","subscribe","callback","main","getById","threadId","mainItem","getItemById","getItemByIndex","idx","getArchivedItemByIndex","switchToThread","options","unarchive","switchToNewThread","unstable_subscribeThreadEvents","event","getLoadThreadsPromise","reload","reloadMainThread","loadMore","getThreadListState","threadList","getThreadListItemState","undefined","threadData","id","remoteId","externalId","title","status","lastMessageAt","custom","isMain","isRunning","unstable_isThreadRunning","ThreadListRuntimeCoreBinding","ThreadListRuntimeImpl","_getState","_stateBinding","_core","_runtimeFactory","binding","threadListItemBinding","constructor","stateBinding","path","bind","_mainThreadListItemRuntime","ref","threadSelector","type","getMainThreadRuntimeCore","__internal_bindMethods","_createItemStateBinding","JSON","stringify","getThreadRuntimeCore","index"],"sources":["../../../src/runtime/api/thread-list-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport {\n LazyMemoizeSubject,\n NestedSubscriptionSubject,\n} from \"../../subscribable/subscribable\";\nimport {\n SKIP_UPDATE,\n ShallowMemoizeSubject,\n} from \"../../subscribable/subscribable\";\nimport type {\n ThreadListRuntimeCore,\n ThreadListRuntimeEvent,\n} from \"../interfaces/thread-list-runtime-core\";\nimport {\n type ThreadListItemRuntime,\n ThreadListItemRuntimeImpl,\n type ThreadListItemState,\n type ThreadListItemStateBinding,\n} from \"./thread-list-item-runtime\";\nimport {\n type ThreadListItemRuntimeBinding,\n type ThreadRuntime,\n type ThreadRuntimeCoreBinding,\n ThreadRuntimeImpl,\n} from \"./thread-runtime\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\nconst NOOP_UNSUBSCRIBE = () => {};\n\nexport type ThreadListState = {\n readonly mainThreadId: string;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly isLoading: boolean;\n /** The error thrown by the most recent thread list load that failed, cleared when a later load starts. */\n readonly loadError: unknown;\n readonly isLoadingMore: boolean;\n readonly hasMore: boolean;\n readonly threadItems: Readonly<\n Record<\n string,\n Omit<ThreadListItemState, \"isMain\" | \"threadId\" | \"isRunning\">\n >\n >;\n};\n\nexport type ThreadListRuntime = {\n getState(): ThreadListState;\n\n subscribe(callback: () => void): Unsubscribe;\n\n readonly main: ThreadRuntime;\n getById(threadId: string): ThreadRuntime;\n\n readonly mainItem: ThreadListItemRuntime;\n getItemById(threadId: string): ThreadListItemRuntime;\n getItemByIndex(idx: number): ThreadListItemRuntime;\n getArchivedItemByIndex(idx: number): ThreadListItemRuntime;\n\n switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void>;\n switchToNewThread(): Promise<void>;\n\n /**\n * Observes lifecycle events on every thread this list keeps alive, so an\n * event that fires while its thread is not selected stays observable. Thread\n * lists that mount only the main thread never emit; their main thread's\n * runtime is observed directly.\n */\n unstable_subscribeThreadEvents(\n callback: (event: ThreadListRuntimeEvent) => void,\n ): Unsubscribe;\n\n getLoadThreadsPromise(): Promise<void>;\n reload(): Promise<void>;\n /**\n * Refetches the open thread's remote state, for state that changed out of\n * band and so never reached the stream. When the runtime declares the\n * in-place capability (`unstable_refetchThread`), composer drafts survive,\n * existing messages stay rendered during the refetch, and the promise\n * settles with the refetch, rejecting if it fails; that runtime also owns\n * what happens to a run in progress, since this does not stop one. Runtimes\n * without the capability have their hook remounted instead, which discards\n * unsent composer input and ends any run, and the promise resolves once the\n * new runtime attaches. A thread that has not been sent yet is left alone.\n */\n reloadMainThread(): Promise<void>;\n loadMore(): Promise<void>;\n};\n\nconst getThreadListState = (\n threadList: ThreadListRuntimeCore,\n): ThreadListState => {\n return {\n mainThreadId: threadList.mainThreadId,\n newThreadId: threadList.newThreadId,\n threadIds: threadList.threadIds,\n archivedThreadIds: threadList.archivedThreadIds,\n isLoading: threadList.isLoading,\n loadError: threadList.loadError,\n isLoadingMore: threadList.isLoadingMore ?? false,\n hasMore: threadList.hasMore ?? false,\n threadItems: threadList.threadItems,\n };\n};\n\nconst getThreadListItemState = (\n threadList: ThreadListRuntimeCore,\n threadId: string | undefined,\n): ThreadListItemState | SKIP_UPDATE => {\n if (threadId === undefined) return SKIP_UPDATE;\n\n const threadData = threadList.getItemById(threadId);\n if (!threadData) return SKIP_UPDATE;\n return {\n id: threadData.id,\n remoteId: threadData.remoteId,\n externalId: threadData.externalId,\n title: threadData.title,\n status: threadData.status,\n lastMessageAt: threadData.lastMessageAt,\n custom: threadData.custom,\n isMain: threadData.id === threadList.mainThreadId,\n isRunning: threadList.unstable_isThreadRunning?.(threadData.id) ?? false,\n };\n};\n\nexport type ThreadListRuntimeCoreBinding = ThreadListRuntimeCore;\n\nexport class ThreadListRuntimeImpl implements ThreadListRuntime {\n private _getState;\n private _stateBinding: LazyMemoizeSubject<ThreadListState, object>;\n private _core: ThreadListRuntimeCoreBinding;\n private _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime;\n\n constructor(\n _core: ThreadListRuntimeCoreBinding,\n _runtimeFactory: new (\n binding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) => ThreadRuntime = ThreadRuntimeImpl,\n ) {\n this._core = _core;\n this._runtimeFactory = _runtimeFactory;\n const stateBinding = new LazyMemoizeSubject({\n path: {},\n getState: () => getThreadListState(_core),\n subscribe: (callback) => _core.subscribe(callback),\n });\n\n this._getState = stateBinding.getState.bind(stateBinding);\n this._stateBinding = stateBinding;\n\n this._mainThreadListItemRuntime = new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[main]`,\n threadSelector: { type: \"main\" },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.mainThreadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n\n this.main = new _runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: \"threads.main\",\n threadSelector: { type: \"main\" },\n },\n getState: () => _core.getMainThreadRuntimeCore(),\n subscribe: (callback) => _core.subscribe(callback),\n }),\n this._mainThreadListItemRuntime,\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchToThread = this.switchToThread.bind(this);\n this.switchToNewThread = this.switchToNewThread.bind(this);\n this.unstable_subscribeThreadEvents =\n this.unstable_subscribeThreadEvents.bind(this);\n this.getLoadThreadsPromise = this.getLoadThreadsPromise.bind(this);\n this.reload = this.reload.bind(this);\n this.reloadMainThread = this.reloadMainThread.bind(this);\n this.loadMore = this.loadMore.bind(this);\n this.getState = this.getState.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.getById = this.getById.bind(this);\n this.getItemById = this.getItemById.bind(this);\n this.getItemByIndex = this.getItemByIndex.bind(this);\n this.getArchivedItemByIndex = this.getArchivedItemByIndex.bind(this);\n }\n\n public switchToThread(\n threadId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._core.switchToThread(threadId, options);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._core.switchToNewThread();\n }\n\n public unstable_subscribeThreadEvents(\n callback: (event: ThreadListRuntimeEvent) => void,\n ): Unsubscribe {\n return (\n this._core.unstable_subscribeThreadEvents?.(callback) ?? NOOP_UNSUBSCRIBE\n );\n }\n\n public getLoadThreadsPromise(): Promise<void> {\n return this._core.getLoadThreadsPromise();\n }\n\n public reload(): Promise<void> {\n return this._core.reload?.() ?? RESOLVED_PROMISE;\n }\n\n public reloadMainThread(): Promise<void> {\n return this._core.reloadMainThread?.() ?? RESOLVED_PROMISE;\n }\n\n public loadMore(): Promise<void> {\n return this._core.loadMore?.() ?? RESOLVED_PROMISE;\n }\n\n public getState(): ThreadListState {\n return this._getState();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._stateBinding.subscribe(callback);\n }\n\n private _mainThreadListItemRuntime;\n\n public readonly main: ThreadRuntime;\n\n public get mainItem() {\n return this._mainThreadListItemRuntime;\n }\n\n private _createItemStateBinding(\n threadId: string,\n ): ThreadListItemStateBinding {\n return new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[threadId=${threadId}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => {\n return getThreadListItemState(this._core, threadId);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n });\n }\n\n public getById(threadId: string) {\n return new this._runtimeFactory(\n new NestedSubscriptionSubject({\n path: {\n ref: `threads[threadId=${JSON.stringify(threadId)}]`,\n threadSelector: { type: \"threadId\", threadId },\n },\n getState: () => this._core.getThreadRuntimeCore(threadId),\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._createItemStateBinding(threadId),\n );\n }\n\n public getItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `threadItems[${idx}]`,\n threadSelector: { type: \"index\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(this._core, this._core.threadIds[idx]);\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getArchivedItemByIndex(idx: number) {\n return new ThreadListItemRuntimeImpl(\n new ShallowMemoizeSubject({\n path: {\n ref: `archivedThreadItems[${idx}]`,\n threadSelector: { type: \"archiveIndex\", index: idx },\n },\n getState: () => {\n return getThreadListItemState(\n this._core,\n this._core.archivedThreadIds[idx],\n );\n },\n subscribe: (callback) => this._core.subscribe(callback),\n }),\n this._core,\n );\n }\n\n public getItemById(threadId: string) {\n return new ThreadListItemRuntimeImpl(\n this._createItemStateBinding(threadId),\n this._core,\n );\n }\n}\n"],"mappings":"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"}
@@ -28,6 +28,10 @@ type CreateResumeRunConfig = CreateStartRunConfig & {
28
28
  stream?: (options: ChatModelRunOptions) => AsyncGenerator<ChatModelRunResult, void, unknown>;
29
29
  };
30
30
  type CreateAppendMessage = string | {
31
+ /**
32
+ * An omitted value or `undefined` selects the current tail.
33
+ * `null` selects a root branch.
34
+ */
31
35
  parentId?: string | null | undefined;
32
36
  sourceId?: string | null | undefined;
33
37
  role?: AppendMessage["role"] | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime.d.ts","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;KA+CY;EACV;EACA;EACA,YAAY;;KAGF,wBAAwB;EAClC,UACE,SAAS,wBACN,eAAe;;KAoBV;EAGN;EACA;EACA,OAAO;EACP,SAAS;EACT,cAAc;EACd,WAAW;EACX,YAAY;EACZ,YAAY;EACZ;;KAiCM,2BAA2B,sBACrC,mBACA;EAEA,eAAe,uBAAuB;;KAG5B,+BAA+B,sBACzC,qBACA;KAGU;;;;;WAKD;;;;;;WAOA,UAAU;;;;WAKV;;;;WAKA;;;;WAKA;;;;WAKA,cAAc;;;;WAKd,mBAAmB;;;;;;WAOnB,OAAO;;;;WAKP,sBAAsB;;;;WAKtB;;;;WAKA,QAAQ;WAER,OAAO;;;;;;cAOL,gCACX,SAAS,KAAK;cASH,iBACX,SAAS,mBACT,qBAAqB,wBACpB;KAiBS;;;;WAID,MAAM;;;;WAKN,UAAU;;;;EAKnB,YAAY;;;;;;;;;;;;;;;;;EAkBZ,OAAO,SAAS;EAEhB,cAAc,2BAA2B;;;;;EAMzC,SAAS,QAAQ;;;;;EAMjB,UAAU,QAAQ;;;;;;;EAQlB;;;;;;;EAQA,oBAAoB;EAEpB,UAAU,uBAAuB;EACjC;;;;;;;EAOA;EACA,mBAAmB;EAEnB,UAAU;EACV,OAAO,YAAY;;;;;;EAOnB,MAAM,2BAA2B;EAEjC,kBAAkB,cAAc;EAChC,eAAe,oBAAoB;;;;EAKnC;EAEA;EACA;EACA;EACA,qBAAqB,uBAAuB;EAC5C;EACA;EAEA,YAAY,UAAU,wBACpB,OAAO,GACP,UAAU,2BAA2B,KACpC;;cAGQ,6BAA6B;MAC7B,QAAI;MAIJ,4BAJI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QArQA,OAAA;;wBAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDS,eAAA,uBAAa;;IA8NnB,iBAAA;;mBADF;mBAGA;EAMf,YAAA,eAAe,0BACf,uBAAuB;YA2Cf;WA4BM,UAAQ;EAEjB,YAAQ;EAIR,OAAO,SAAS;EAchB,cAAc,2BAAiB;EAI/B,UAAU;EAIV,mBAAe;EAIf,SAAS,QAAQ;EAIjB,UAAU,QAAQ;EAIlB;EAIA,oBAAoB;EAIpB;EAIA;EAIA;EAIA;EAIA;EAIA;EAIA,qBAAqB,uBAAoB;EAIzC;EAIA;EAIA,UAAM;EAIN,OAAO,MAAM;EAIb,MAAM,2BAA2B;EAIjC,kBAAkB,cAAW;EAsB7B,eAAe,oBAAiB;UAW/B;UA2CA;EAKD,YAAY,UAAU,wBAC3B,OAAO,GACP,UAAU,2BAA2B,KACpC"}
1
+ {"version":3,"file":"thread-runtime.d.ts","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;KAgDY;EACV;EACA;EACA,YAAY;;KAGF,wBAAwB;EAClC,UACE,SAAS,wBACN,eAAe;;KAoBV;;;;;EAON;EACA;EACA,OAAO;EACP,SAAS;EACT,cAAc;EACd,WAAW;EACX,YAAY;EACZ,YAAY;EACZ;;KAoCM,2BAA2B,sBACrC,mBACA;EAEA,eAAe,uBAAuB;;KAG5B,+BAA+B,sBACzC,qBACA;KAGU;;;;;WAKD;;;;;;WAOA,UAAU;;;;WAKV;;;;WAKA;;;;WAKA;;;;WAKA,cAAc;;;;WAKd,mBAAmB;;;;;;WAOnB,OAAO;;;;WAKP,sBAAsB;;;;WAKtB;;;;WAKA,QAAQ;WAER,OAAO;;;;;;cAOL,gCACX,SAAS,KAAK;cASH,iBACX,SAAS,mBACT,qBAAqB,wBACpB;KAiBS;;;;WAID,MAAM;;;;WAKN,UAAU;;;;EAKnB,YAAY;;;;;;;;;;;;;;;;;EAkBZ,OAAO,SAAS;EAEhB,cAAc,2BAA2B;;;;;EAMzC,SAAS,QAAQ;;;;;EAMjB,UAAU,QAAQ;;;;;;;EAQlB;;;;;;;EAQA,oBAAoB;EAEpB,UAAU,uBAAuB;EACjC;;;;;;;EAOA;EACA,mBAAmB;EAEnB,UAAU;EACV,OAAO,YAAY;;;;;;EAOnB,MAAM,2BAA2B;EAEjC,kBAAkB,cAAc;EAChC,eAAe,oBAAoB;;;;EAKnC;EAEA;EACA;EACA;EACA,qBAAqB,uBAAuB;EAC5C;EACA;EAEA,YAAY,UAAU,wBACpB,OAAO,GACP,UAAU,2BAA2B,KACpC;;cAGQ,6BAA6B;MAC7B,QAAI;MAIJ,4BAJI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAvQL,OAAA;;wBAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkDc,eAAA,uBAAa;;IA8NnB,iBAAA;;mBADF;mBAGA;EAMf,YAAA,eAAe,0BACf,uBAAuB;YAwCf;WA4BM,UAAQ;EAEjB,YAAQ;EAIR,OAAO,SAAS;EAchB,cAAc,2BAAiB;EAI/B,UAAU;EAIV,mBAAe;EAIf,SAAS,QAAQ;EAIjB,UAAU,QAAQ;EAIlB;EAIA,oBAAoB;EAIpB;EAIA;EAIA;EAIA;EAIA;EAIA;EAIA,qBAAqB,uBAAoB;EAIzC;EAIA;EAIA,UAAM;EAIN,OAAO,MAAM;EAIb,MAAM,2BAA2B;EAIjC,kBAAkB,cAAW;EAsB7B,eAAe,oBAAiB;UAW/B;UA2CA;EAKD,YAAY,UAAU,wBAC3B,OAAO,GACP,UAAU,2BAA2B,KACpC"}
@@ -1,4 +1,4 @@
1
- import { EventSubscriptionSubject, NestedSubscriptionSubject, SKIP_UPDATE, ShallowMemoizeSubject } from "../../subscribable/subscribable.js";
1
+ import { EventSubscriptionSubject, NestedSubscriptionSubject, SKIP_UPDATE, ShallowMemoizeSubject, runCleanups } from "../../subscribable/subscribable.js";
2
2
  import { isMessageNotSentError } from "../../types/error.js";
3
3
  import { symbolInnerMessage } from "../utils/external-store-message.js";
4
4
  import { ThreadComposerRuntimeImpl } from "./composer-runtime.js";
@@ -35,7 +35,7 @@ const toAppendMessage = (messages, message) => {
35
35
  };
36
36
  return {
37
37
  createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
38
- parentId: message.parentId ?? messages.at(-1)?.id ?? null,
38
+ parentId: message.parentId === void 0 ? messages.at(-1)?.id ?? null : message.parentId,
39
39
  sourceId: message.sourceId ?? null,
40
40
  role: message.role ?? "user",
41
41
  content: message.content,
@@ -86,10 +86,7 @@ var ThreadRuntimeImpl = class {
86
86
  subscribe: (callback) => {
87
87
  const sub1 = threadBinding.subscribe(callback);
88
88
  const sub2 = threadListItemBinding.subscribe(callback);
89
- return () => {
90
- sub1();
91
- sub2();
92
- };
89
+ return () => runCleanups([sub1, sub2]);
93
90
  }
94
91
  });
95
92
  this._stateBinding = stateBinding;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime.js","names":["ThreadSuggestion","RuntimeCapabilities","ThreadRuntimeCore","SpeechState","VoiceSessionState","ThreadRuntimeEventCallback","ThreadRuntimeEventType","StartRunConfig","ResumeRunConfig","ExportedMessageRepository","ThreadMessageLike","MessageRuntime","MessageRuntimeImpl","MessageState","NestedSubscriptionSubject","ShallowMemoizeSubject","SKIP_UPDATE","SubscribableWithState","ThreadComposerRuntime","ThreadComposerRuntimeImpl","MessageRuntimePath","ThreadListItemRuntimePath","ThreadRuntimePath","ThreadListItemState","AppendMessage","ThreadMessage","Unsubscribe","isMessageNotSentError","RunConfig","EventSubscriptionSubject","symbolInnerMessage","ModelContext","ChatModelRunOptions","ChatModelRunResult","ReadonlyJSONValue","CreateStartRunConfig","parentId","sourceId","runConfig","CreateResumeRunConfig","stream","options","AsyncGenerator","toResumeRunConfig","message","toStartRunConfig","CreateAppendMessage","role","content","attachments","metadata","createdAt","Date","startRun","toAppendMessage","messages","at","id","type","text","custom","ThreadRuntimeCoreBinding","outerSubscribe","callback","ThreadListItemRuntimeBinding","ThreadState","threadId","isDisabled","isLoading","isRunning","capabilities","state","suggestions","extras","speech","voice","getThreadRuntimeCoreIsRunning","runtime","Pick","undefined","lastMessage","status","getThreadState","threadListItemState","Object","freeze","ThreadRuntime","path","composer","getState","append","deleteMessage","messageId","Promise","config","resumeRun","exportExternalState","importExternalState","subscribe","cancelRun","unstable_notifySessionReset","getModelContext","export","import","repository","reset","initialMessages","getMessageByIndex","idx","getMessageById","stopSpeaking","connectVoice","disconnectVoice","getVoiceVolume","subscribeVoiceVolume","muteVoice","unmuteVoice","unstable_on","event","E","ThreadRuntimeImpl","_threadBinding","__internal_threadBinding","getStateState","_stateBinding","constructor","threadBinding","threadListItemBinding","stateBinding","sub1","sub2","ref","composerSource","__internal_bindMethods","bind","task","resolve","catch","error","data","Error","_getMessageRuntime","messageSelector","index","JSON","stringify","speechState","thread","branches","getBranches","isLast","branchNumber","indexOf","branchCount","length","_eventSubscriptionSubjects","Map","subject","get","binding","set","payload"],"sources":["../../../src/runtime/api/thread-runtime.ts"],"sourcesContent":["import type {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport type { ExportedMessageRepository } from \"../utils/message-repository\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\nimport {\n type MessageRuntime,\n MessageRuntimeImpl,\n type MessageState,\n} from \"./message-runtime\";\nimport { NestedSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport {\n ShallowMemoizeSubject,\n SKIP_UPDATE,\n} from \"../../subscribable/subscribable\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport {\n type ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./composer-runtime\";\nimport type {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./paths\";\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport { isMessageNotSentError } from \"../../types/error\";\nimport type { RunConfig } from \"../../types/message\";\nimport { EventSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport { symbolInnerMessage } from \"../utils/external-store-message\";\nimport type { ModelContext } from \"../../model-context/types\";\nimport type {\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"../utils/chat-model-adapter\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream?: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n ...(message.stream ? { stream: message.stream } : {}),\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n metadata?: AppendMessage[\"metadata\"] | undefined;\n createdAt?: Date | undefined;\n runConfig?: AppendMessage[\"runConfig\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.12.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.12.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is loading its history.\n */\n readonly isLoading: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * The thread state.\n *\n * @deprecated This feature is experimental\n */\n readonly state: ReadonlyJSONValue;\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n\n readonly voice: VoiceSessionState | undefined;\n};\n\n/**\n * The canonical `isRunning` derivation. A runtime that tracks run state itself\n * reports it directly; the rest fall back to the trailing assistant message.\n */\nexport const getThreadRuntimeCoreIsRunning = (\n runtime: Pick<ThreadRuntimeCore, \"isRunning\" | \"messages\">,\n): boolean => {\n if (runtime.isRunning !== undefined) return runtime.isRunning;\n const lastMessage = runtime.messages.at(-1);\n return (\n lastMessage?.role === \"assistant\" && lastMessage.status.type === \"running\"\n );\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isLoading: runtime.isLoading,\n isRunning: getThreadRuntimeCoreIsRunning(runtime),\n messages: runtime.messages,\n state: runtime.state,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n voice: runtime.voice,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n deleteMessage(messageId: string): void | Promise<void>;\n\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n resumeRun(config: CreateResumeRunConfig): void;\n\n /**\n * Export the thread state in the external store format.\n * For AI SDK runtimes, this returns the AI SDK message format.\n * For other runtimes, this may return different formats or throw an error.\n * @returns The thread state in the external format (typed as any)\n */\n exportExternalState(): any;\n\n /**\n * Import thread state from the external store format.\n * For AI SDK runtimes, this accepts AI SDK messages.\n * For other runtimes, this may accept different formats or throw an error.\n * @param state The thread state in the external format (typed as any)\n */\n importExternalState(state: any): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n /**\n * Notifies the runtime that the adapter discarded its backing session.\n * Clears session-scoped tool-invocation state without run-cancel side\n * effects such as composer draft restoration. Internal API for\n * external-store adapter authors.\n */\n unstable_notifySessionReset(): void;\n getModelContext(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n\n /**\n * Reset the thread with optional initial messages.\n *\n * @param initialMessages - Optional array of initial messages to populate the thread\n */\n reset(initialMessages?: readonly ThreadMessageLike[]): void;\n\n getMessageByIndex(idx: number): MessageRuntime;\n getMessageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking(): void;\n\n connectVoice(): void;\n disconnectVoice(): void;\n getVoiceVolume(): number;\n subscribeVoiceVolume(callback: () => void): Unsubscribe;\n muteVoice(): void;\n unmuteVoice(): void;\n\n unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n private readonly _stateBinding: ShallowMemoizeSubject<\n ThreadState,\n ThreadRuntimePath\n >;\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._stateBinding = stateBinding;\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.deleteMessage = this.deleteMessage.bind(this);\n this.resumeRun = this.resumeRun.bind(this);\n this.importExternalState = this.importExternalState.bind(this);\n this.exportExternalState = this.exportExternalState.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.unstable_notifySessionReset =\n this.unstable_notifySessionReset.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.connectVoice = this.connectVoice.bind(this);\n this.disconnectVoice = this.disconnectVoice.bind(this);\n this.muteVoice = this.muteVoice.bind(this);\n this.unmuteVoice = this.unmuteVoice.bind(this);\n this.getVoiceVolume = this.getVoiceVolume.bind(this);\n this.subscribeVoiceVolume = this.subscribeVoiceVolume.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.reset = this.reset.bind(this);\n this.getMessageByIndex = this.getMessageByIndex.bind(this);\n this.getMessageById = this.getMessageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n const task = this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n // An undispatched send is reported to the composer, so it is a control\n // signal rather than a failure to surface; every other rejection keeps\n // reaching the host untouched.\n void Promise.resolve(task).catch((error) => {\n if (!isMessageNotSentError(error)) throw error;\n });\n }\n\n public deleteMessage(messageId: string) {\n return this._threadBinding.getState().deleteMessage(messageId);\n }\n\n public subscribe(callback: () => void) {\n return this._stateBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public startRun(config: CreateStartRunConfig) {\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public exportExternalState() {\n return this._threadBinding.getState().exportExternalState();\n }\n\n public importExternalState(state: any) {\n this._threadBinding.getState().importExternalState(state);\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public unstable_notifySessionReset() {\n this._threadBinding.getState().unstable_notifySessionReset();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public connectVoice() {\n this._threadBinding.getState().connectVoice();\n }\n\n public disconnectVoice() {\n this._threadBinding.getState().disconnectVoice();\n }\n\n public getVoiceVolume() {\n return this._threadBinding.getState().getVoiceVolume();\n }\n\n public subscribeVoiceVolume(callback: () => void) {\n return this._threadBinding.getState().subscribeVoiceVolume(callback);\n }\n\n public muteVoice() {\n this._threadBinding.getState().muteVoice();\n }\n\n public unmuteVoice() {\n this._threadBinding.getState().unmuteVoice();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._threadBinding.getState().reset(initialMessages);\n }\n\n public getMessageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n index: idx,\n };\n },\n );\n }\n\n public getMessageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage; index: number }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId, index } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined || index === undefined)\n return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n index,\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject<ThreadRuntimeEventType>({\n event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback as (payload?: unknown) => void);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thread-runtime.js","names":["ThreadSuggestion","RuntimeCapabilities","ThreadRuntimeCore","SpeechState","VoiceSessionState","ThreadRuntimeEventCallback","ThreadRuntimeEventType","StartRunConfig","ResumeRunConfig","ExportedMessageRepository","ThreadMessageLike","MessageRuntime","MessageRuntimeImpl","MessageState","NestedSubscriptionSubject","runCleanups","ShallowMemoizeSubject","SKIP_UPDATE","SubscribableWithState","ThreadComposerRuntime","ThreadComposerRuntimeImpl","MessageRuntimePath","ThreadListItemRuntimePath","ThreadRuntimePath","ThreadListItemState","AppendMessage","ThreadMessage","Unsubscribe","isMessageNotSentError","RunConfig","EventSubscriptionSubject","symbolInnerMessage","ModelContext","ChatModelRunOptions","ChatModelRunResult","ReadonlyJSONValue","CreateStartRunConfig","parentId","sourceId","runConfig","CreateResumeRunConfig","stream","options","AsyncGenerator","toResumeRunConfig","message","toStartRunConfig","CreateAppendMessage","role","content","attachments","metadata","createdAt","Date","startRun","toAppendMessage","messages","at","id","type","text","custom","undefined","ThreadRuntimeCoreBinding","outerSubscribe","callback","ThreadListItemRuntimeBinding","ThreadState","threadId","isDisabled","isLoading","isRunning","capabilities","state","suggestions","extras","speech","voice","getThreadRuntimeCoreIsRunning","runtime","Pick","lastMessage","status","getThreadState","threadListItemState","Object","freeze","ThreadRuntime","path","composer","getState","append","deleteMessage","messageId","Promise","config","resumeRun","exportExternalState","importExternalState","subscribe","cancelRun","unstable_notifySessionReset","getModelContext","export","import","repository","reset","initialMessages","getMessageByIndex","idx","getMessageById","stopSpeaking","connectVoice","disconnectVoice","getVoiceVolume","subscribeVoiceVolume","muteVoice","unmuteVoice","unstable_on","event","E","ThreadRuntimeImpl","_threadBinding","__internal_threadBinding","getStateState","_stateBinding","constructor","threadBinding","threadListItemBinding","stateBinding","sub1","sub2","ref","composerSource","__internal_bindMethods","bind","task","resolve","catch","error","data","Error","_getMessageRuntime","messageSelector","index","JSON","stringify","speechState","thread","branches","getBranches","isLast","branchNumber","indexOf","branchCount","length","_eventSubscriptionSubjects","Map","subject","get","binding","set","payload"],"sources":["../../../src/runtime/api/thread-runtime.ts"],"sourcesContent":["import type {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n VoiceSessionState,\n ThreadRuntimeEventCallback,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../interfaces/thread-runtime-core\";\nimport type { ExportedMessageRepository } from \"../utils/message-repository\";\nimport type { ThreadMessageLike } from \"../utils/thread-message-like\";\nimport {\n type MessageRuntime,\n MessageRuntimeImpl,\n type MessageState,\n} from \"./message-runtime\";\nimport { NestedSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport {\n runCleanups,\n ShallowMemoizeSubject,\n SKIP_UPDATE,\n} from \"../../subscribable/subscribable\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport {\n type ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./composer-runtime\";\nimport type {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./paths\";\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport { isMessageNotSentError } from \"../../types/error\";\nimport type { RunConfig } from \"../../types/message\";\nimport { EventSubscriptionSubject } from \"../../subscribable/subscribable\";\nimport { symbolInnerMessage } from \"../utils/external-store-message\";\nimport type { ModelContext } from \"../../model-context/types\";\nimport type {\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"../utils/chat-model-adapter\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream?: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n ...(message.stream ? { stream: message.stream } : {}),\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n /**\n * An omitted value or `undefined` selects the current tail.\n * `null` selects a root branch.\n */\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n metadata?: AppendMessage[\"metadata\"] | undefined;\n createdAt?: Date | undefined;\n runConfig?: AppendMessage[\"runConfig\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId:\n message.parentId === undefined\n ? (messages.at(-1)?.id ?? null)\n : message.parentId,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.12.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.12.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is loading its history.\n */\n readonly isLoading: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * The thread state.\n *\n * @deprecated This feature is experimental\n */\n readonly state: ReadonlyJSONValue;\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n\n readonly voice: VoiceSessionState | undefined;\n};\n\n/**\n * The canonical `isRunning` derivation. A runtime that tracks run state itself\n * reports it directly; the rest fall back to the trailing assistant message.\n */\nexport const getThreadRuntimeCoreIsRunning = (\n runtime: Pick<ThreadRuntimeCore, \"isRunning\" | \"messages\">,\n): boolean => {\n if (runtime.isRunning !== undefined) return runtime.isRunning;\n const lastMessage = runtime.messages.at(-1);\n return (\n lastMessage?.role === \"assistant\" && lastMessage.status.type === \"running\"\n );\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isLoading: runtime.isLoading,\n isRunning: getThreadRuntimeCoreIsRunning(runtime),\n messages: runtime.messages,\n state: runtime.state,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n voice: runtime.voice,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n deleteMessage(messageId: string): void | Promise<void>;\n\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n resumeRun(config: CreateResumeRunConfig): void;\n\n /**\n * Export the thread state in the external store format.\n * For AI SDK runtimes, this returns the AI SDK message format.\n * For other runtimes, this may return different formats or throw an error.\n * @returns The thread state in the external format (typed as any)\n */\n exportExternalState(): any;\n\n /**\n * Import thread state from the external store format.\n * For AI SDK runtimes, this accepts AI SDK messages.\n * For other runtimes, this may accept different formats or throw an error.\n * @param state The thread state in the external format (typed as any)\n */\n importExternalState(state: any): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n /**\n * Notifies the runtime that the adapter discarded its backing session.\n * Clears session-scoped tool-invocation state without run-cancel side\n * effects such as composer draft restoration. Internal API for\n * external-store adapter authors.\n */\n unstable_notifySessionReset(): void;\n getModelContext(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n\n /**\n * Reset the thread with optional initial messages.\n *\n * @param initialMessages - Optional array of initial messages to populate the thread\n */\n reset(initialMessages?: readonly ThreadMessageLike[]): void;\n\n getMessageByIndex(idx: number): MessageRuntime;\n getMessageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking(): void;\n\n connectVoice(): void;\n disconnectVoice(): void;\n getVoiceVolume(): number;\n subscribeVoiceVolume(callback: () => void): Unsubscribe;\n muteVoice(): void;\n unmuteVoice(): void;\n\n unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n private readonly _stateBinding: ShallowMemoizeSubject<\n ThreadState,\n ThreadRuntimePath\n >;\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => runCleanups([sub1, sub2]);\n },\n });\n\n this._stateBinding = stateBinding;\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.deleteMessage = this.deleteMessage.bind(this);\n this.resumeRun = this.resumeRun.bind(this);\n this.importExternalState = this.importExternalState.bind(this);\n this.exportExternalState = this.exportExternalState.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.unstable_notifySessionReset =\n this.unstable_notifySessionReset.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.connectVoice = this.connectVoice.bind(this);\n this.disconnectVoice = this.disconnectVoice.bind(this);\n this.muteVoice = this.muteVoice.bind(this);\n this.unmuteVoice = this.unmuteVoice.bind(this);\n this.getVoiceVolume = this.getVoiceVolume.bind(this);\n this.subscribeVoiceVolume = this.subscribeVoiceVolume.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.reset = this.reset.bind(this);\n this.getMessageByIndex = this.getMessageByIndex.bind(this);\n this.getMessageById = this.getMessageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n const task = this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n // An undispatched send is reported to the composer, so it is a control\n // signal rather than a failure to surface; every other rejection keeps\n // reaching the host untouched.\n void Promise.resolve(task).catch((error) => {\n if (!isMessageNotSentError(error)) throw error;\n });\n }\n\n public deleteMessage(messageId: string) {\n return this._threadBinding.getState().deleteMessage(messageId);\n }\n\n public subscribe(callback: () => void) {\n return this._stateBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public startRun(config: CreateStartRunConfig) {\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public exportExternalState() {\n return this._threadBinding.getState().exportExternalState();\n }\n\n public importExternalState(state: any) {\n this._threadBinding.getState().importExternalState(state);\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public unstable_notifySessionReset() {\n this._threadBinding.getState().unstable_notifySessionReset();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public connectVoice() {\n this._threadBinding.getState().connectVoice();\n }\n\n public disconnectVoice() {\n this._threadBinding.getState().disconnectVoice();\n }\n\n public getVoiceVolume() {\n return this._threadBinding.getState().getVoiceVolume();\n }\n\n public subscribeVoiceVolume(callback: () => void) {\n return this._threadBinding.getState().subscribeVoiceVolume(callback);\n }\n\n public muteVoice() {\n this._threadBinding.getState().muteVoice();\n }\n\n public unmuteVoice() {\n this._threadBinding.getState().unmuteVoice();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public reset(initialMessages?: readonly ThreadMessageLike[]) {\n this._threadBinding.getState().reset(initialMessages);\n }\n\n public getMessageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n index: idx,\n };\n },\n );\n }\n\n public getMessageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage; index: number }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId, index } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined || index === undefined)\n return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n index,\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on<E extends ThreadRuntimeEventType>(\n event: E,\n callback: ThreadRuntimeEventCallback<E>,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject<ThreadRuntimeEventType>({\n event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback as (payload?: unknown) => void);\n }\n}\n"],"mappings":"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"}
@@ -93,6 +93,7 @@ declare abstract class BaseComposerRuntimeCore extends BaseSubscribable implemen
93
93
  private _isActiveSession;
94
94
  startDictation(): void;
95
95
  stopDictation(): void;
96
+ private _stopDictationSession;
96
97
  private _cleanupDictation;
97
98
  private _eventSubscribers;
98
99
  protected _notifyEventSubscribers<E extends ComposerRuntimeEventType>(event: E, payload: ComposerRuntimeEventPayload[E]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"base-composer-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/base/base-composer-runtime-core.ts"],"mappings":";;;;;;;;;;uBAuCsB,gCACZ,4BACG;WAEK;qBAEG,wBAAwB;qBACxB,uBAAuB;YAEhC,2BACR;IAAY;MAAa,SAAS;;KAClC,SAAS,GAAG,kBAAkB,sCAAsC;MAW3D;UAIH;MACG,wBAAW;YAIZ,eAAe,gBAAgB;eAKrB;eACA;MAET;UAIH;MAEJ;UAII;MAEJ;UAII;MAEJ,aAAS;UAIL;MAEJ,SAAK;EAIF,SAAS,OAAO;EAOhB,QAAQ;UAWP;EASD,QAAQ,MAAM;EAOd,aAAa,WAAW;YAOrB;UACF;UACA;UACA;UAEA;UAIA;UAIA;UAMM;EAQD,SAAK;EA8BL,oBAAgB;EAQhB,KAAK,UAAU,cAAW;;;;;;;;;EAsGhC,aAAa;IAClB;IACA,QAAQ;IACR,uBAAuB;;;;;;;EAsBlB,aAAa;IAClB;IACA,QAAQ;IACR,uBAAuB;;UAuBjB;EAcD;MAII,kBAAkB;EAItB,cACL,sBACA,YAAY;EAEP,gBAAgB;qBAEJ,WACjB,SAAS,KAAK,yCACd,UAAU,qBACF;qBACS;EAEb,cAAc,kBAAkB,OAAO,mBAAgB;UA8HrD;EAqBF,iBAAiB,uBAAoB;UAmCnC;UACA;UACA;UACA;UACA;UACA;UACA;UACA;MAEG,aAAa;UAIhB;EAUD;EA6FA;UASC;UAuBA;YAKE,wBAAwB,UAAU,0BAC1C,OAAO,GACP,SAAS,4BAA4B;EAQhC,YAAY,UAAU,0BAC3B,OAAO,GACP,UAAU,6BAA6B"}
1
+ {"version":3,"file":"base-composer-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/base/base-composer-runtime-core.ts"],"mappings":";;;;;;;;;;uBAqCsB,gCACZ,4BACG;WAEK;qBAEG,wBAAwB;qBACxB,uBAAuB;YAEhC,2BACR;IAAY;MAAa,SAAS;;KAClC,SAAS,GAAG,kBAAkB,sCAAsC;MAW3D;UAIH;MACG,wBAAW;YAIZ,eAAe,gBAAgB;eAKrB;eACA;MAET;UAIH;MAEJ;UAII;MAEJ;UAII;MAEJ,aAAS;UAIL;MAEJ,SAAK;EAIF,SAAS,OAAO;EAOhB,QAAQ;UAWP;EASD,QAAQ,MAAM;EAOd,aAAa,WAAW;YAOrB;UACF;UACA;UACA;UAEA;UAIA;UAIA;UAOM;EAQD,SAAK;EA8BL,oBAAgB;EAYhB,KAAK,UAAU,cAAW;;;;;;;;;EA8GhC,aAAa;IAClB;IACA,QAAQ;IACR,uBAAuB;;;;;;;EAsBlB,aAAa;IAClB;IACA,QAAQ;IACR,uBAAuB;;UAuBjB;EAcD;MAII,kBAAkB;EAItB,cACL,sBACA,YAAY;EAEP,gBAAgB;qBAEJ,WACjB,SAAS,KAAK,yCACd,UAAU,qBACF;qBACS;EAEb,cAAc,kBAAkB,OAAO,mBAAgB;UAsJrD;EAuBF,iBAAiB,uBAAoB;UAmCnC;UACA;UACA;UACA;UACA;UACA;UACA;UACA;MAEG,aAAa;UAIhB;EAUD;EAyGA;UASC;UAmBA;UAoCA;YAKE,wBAAwB,UAAU,0BAC1C,OAAO,GACP,SAAS,4BAA4B;EAQhC,YAAY,UAAU,0BAC3B,OAAO,GACP,UAAU,6BAA6B"}
@@ -4,10 +4,9 @@ import { generateId } from "../../utils/id.js";
4
4
  import { fileMatchesAccept } from "../../adapters/attachment.js";
5
5
  import { isMessageNotSentError } from "../../types/error.js";
6
6
  import { EMPTY_QUEUE_ITEMS } from "../queue/queue-item.js";
7
- import { isCreateAttachment } from "../../types/attachment.js";
7
+ import { isAttachmentComplete, isCreateAttachment } from "../../types/attachment.js";
8
8
  import { AttachmentAddOperations, drainAttachmentAdd } from "../utils/attachment-add-operations.js";
9
9
  //#region src/runtime/base/base-composer-runtime-core.ts
10
- const isAttachmentComplete = (a) => a.status.type === "complete";
11
10
  var BaseComposerRuntimeCore = class extends BaseSubscribable {
12
11
  isEditing = true;
13
12
  enrichWithComposerMetadata(message, composerMetadata) {
@@ -97,13 +96,14 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
97
96
  _emptyTextAndAttachments() {
98
97
  this._attachments = [];
99
98
  this._text = "";
99
+ this._rebaseDictation("");
100
100
  this._notifySubscribers();
101
101
  }
102
102
  async _onClearAttachments() {
103
103
  const adapter = this.getAttachmentAdapter();
104
104
  if (adapter) {
105
105
  const pending = this._attachments.filter((a) => !isAttachmentComplete(a));
106
- await Promise.all(pending.map((a) => adapter.remove(a)));
106
+ await Promise.all(pending.map(async (a) => adapter.remove(a)));
107
107
  }
108
108
  }
109
109
  async reset() {
@@ -121,14 +121,18 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
121
121
  }
122
122
  async clearAttachments() {
123
123
  this._cancelAllAttachmentAdds();
124
+ if (this._isSending) for (const attachment of this._attachments) this._removedDuringSend.add(attachment.id);
124
125
  const task = this._onClearAttachments();
125
126
  this.setAttachments([]);
126
127
  await task;
127
128
  }
128
129
  async send(options) {
129
130
  if (!this.canSend || this._isSending) return;
130
- if (this._dictationSession) {
131
+ if (this._dictationSession) try {
131
132
  this._dictationSession.cancel();
133
+ } catch (error) {
134
+ console.error("[assistant-ui] Dictation session cancel threw", error);
135
+ } finally {
132
136
  this._cleanupDictation();
133
137
  }
134
138
  const adapter = this.getAttachmentAdapter();
@@ -200,7 +204,10 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
200
204
  if (sendTask) sendTask.catch((error) => {
201
205
  this._restoreUnsentDraft(error, generation, draft);
202
206
  });
203
- this._notifyEventSubscribers("send", {});
207
+ this._notifyEventSubscribers("send", {
208
+ chars: text.length,
209
+ attachments: finalAttachments.length
210
+ });
204
211
  }
205
212
  /**
206
213
  * Take a message back into the composer when it has nowhere else to live:
@@ -255,7 +262,7 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
255
262
  }, adapter.accept)) {
256
263
  const message = `File type ${fileOrAttachment.contentType || "unknown"} is not accepted. Accepted types: ${adapter.accept}`;
257
264
  const err = new Error(message);
258
- this._safeEmitAttachmentAddError("not-accepted", message, void 0, err);
265
+ this._safeEmitAttachmentAddError("not-accepted", message, void 0, err, fileOrAttachment.contentType);
259
266
  throw err;
260
267
  }
261
268
  const a = {
@@ -268,14 +275,14 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
268
275
  };
269
276
  this._attachments = [...this._attachments, a];
270
277
  this._notifySubscribers();
271
- this._notifyEventSubscribers("attachmentAdd", {});
278
+ this._notifyEventSubscribers("attachmentAdd", { ...a.contentType ? { contentType: a.contentType } : void 0 });
272
279
  return;
273
280
  }
274
281
  const adapter = this.getAttachmentAdapter();
275
282
  if (!adapter) {
276
283
  const message = "Attachments are not supported";
277
284
  const err = /* @__PURE__ */ new Error(message);
278
- this._safeEmitAttachmentAddError("no-adapter", message, void 0, err);
285
+ this._safeEmitAttachmentAddError("no-adapter", message, void 0, err, fileOrAttachment.type);
279
286
  throw err;
280
287
  }
281
288
  if (!fileMatchesAccept({
@@ -284,7 +291,7 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
284
291
  }, adapter.accept)) {
285
292
  const message = `File type ${fileOrAttachment.type || "unknown"} is not accepted. Accepted types: ${adapter.accept}`;
286
293
  const err = new Error(message);
287
- this._safeEmitAttachmentAddError("not-accepted", message, void 0, err);
294
+ this._safeEmitAttachmentAddError("not-accepted", message, void 0, err, fileOrAttachment.type);
288
295
  throw err;
289
296
  }
290
297
  const operation = this._attachmentAddOperations.start();
@@ -316,22 +323,23 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
316
323
  message: e instanceof Error ? e.message : String(e)
317
324
  }
318
325
  });
319
- this._safeEmitAttachmentAddError("adapter-error", e instanceof Error ? e.message : String(e), lastAttachment?.id, e instanceof Error ? e : void 0);
326
+ this._safeEmitAttachmentAddError("adapter-error", e instanceof Error ? e.message : String(e), lastAttachment?.id, e instanceof Error ? e : void 0, lastAttachment?.contentType || fileOrAttachment.type);
320
327
  throw e;
321
328
  } finally {
322
329
  this._attachmentAddOperations.finish(operation);
323
330
  }
324
331
  if (this._attachmentAddOperations.isCancelled(operation)) return;
325
- if (lastAttachment?.status.type === "incomplete" && lastAttachment.status.reason === "error") this._safeEmitAttachmentAddError("adapter-error", lastAttachment.status.message ?? "Attachment upload did not complete successfully.", lastAttachment.id);
326
- else this._notifyEventSubscribers("attachmentAdd", {});
332
+ if (lastAttachment?.status.type === "incomplete" && lastAttachment.status.reason === "error") this._safeEmitAttachmentAddError("adapter-error", lastAttachment.status.message ?? "Attachment upload did not complete successfully.", lastAttachment.id, void 0, lastAttachment.contentType || fileOrAttachment.type);
333
+ else this._notifyEventSubscribers("attachmentAdd", { ...lastAttachment?.contentType ? { contentType: lastAttachment.contentType } : fileOrAttachment.type ? { contentType: fileOrAttachment.type } : void 0 });
327
334
  }
328
- _safeEmitAttachmentAddError(reason, message, attachmentId, error) {
335
+ _safeEmitAttachmentAddError(reason, message, attachmentId, error, contentType) {
329
336
  try {
330
337
  this._notifyEventSubscribers("attachmentAddError", {
331
338
  reason,
332
339
  message,
333
340
  ...attachmentId !== void 0 && { attachmentId },
334
- ...error !== void 0 && { error }
341
+ ...error !== void 0 && { error },
342
+ ...contentType ? { contentType } : void 0
335
343
  });
336
344
  } catch (subscriberError) {
337
345
  console.error("[assistant-ui] attachmentAddError subscriber threw:", subscriberError);
@@ -382,16 +390,26 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
382
390
  startDictation() {
383
391
  const adapter = this.getDictationAdapter();
384
392
  if (!adapter) throw new Error("Dictation adapter not configured");
393
+ const isReplacing = this._dictationSession !== void 0;
385
394
  if (this._dictationSession) {
386
- for (const unsub of this._dictationUnsubscribes) unsub();
387
- this._dictationUnsubscribes = [];
388
- this._dictationSession.stop().catch(() => {});
389
- this._dictationSession = void 0;
395
+ const oldSession = this._dictationSession;
396
+ this._cleanupDictation({ notify: false });
397
+ this._stopDictationSession(oldSession);
390
398
  }
391
399
  const inputDisabled = adapter.disableInputDuringDictation ?? false;
392
400
  this._dictationBaseText = this._text;
393
401
  this._currentInterimText = "";
394
- const session = adapter.listen();
402
+ let session;
403
+ try {
404
+ session = adapter.listen();
405
+ } catch (error) {
406
+ if (isReplacing) try {
407
+ this._notifySubscribers();
408
+ } catch (notifyError) {
409
+ console.error("[assistant-ui] Dictation replacement rollback notification threw", notifyError);
410
+ }
411
+ throw error;
412
+ }
395
413
  this._dictationSession = session;
396
414
  const sessionId = ++this._dictationSessionIdCounter;
397
415
  this._activeDictationSessionId = sessionId;
@@ -449,20 +467,42 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
449
467
  const session = this._dictationSession;
450
468
  const sessionId = this._activeDictationSessionId;
451
469
  const cleanup = () => this._cleanupDictation({ sessionId });
452
- session.stop().then(cleanup, cleanup);
470
+ this._stopDictationSession(session, cleanup);
471
+ }
472
+ _stopDictationSession(session, onSettled = () => {}) {
473
+ let task;
474
+ try {
475
+ task = session.stop();
476
+ } catch (error) {
477
+ console.error("[assistant-ui] Dictation session stop threw", error);
478
+ onSettled();
479
+ return;
480
+ }
481
+ task.then(onSettled, (error) => {
482
+ console.error("[assistant-ui] Dictation session stop rejected", error);
483
+ onSettled();
484
+ });
453
485
  }
454
486
  _cleanupDictation(options) {
455
487
  if (options?.sessionId !== void 0 && options.sessionId !== this._activeDictationSessionId || this._isCleaningDictation) return;
456
488
  this._isCleaningDictation = true;
489
+ const runCleanup = (cleanup) => {
490
+ try {
491
+ cleanup();
492
+ } catch (error) {
493
+ console.error("[assistant-ui] Dictation cleanup threw", error);
494
+ }
495
+ };
457
496
  try {
458
- for (const unsub of this._dictationUnsubscribes) unsub();
497
+ const unsubscribes = this._dictationUnsubscribes;
459
498
  this._dictationUnsubscribes = [];
460
499
  this._dictationSession = void 0;
461
500
  this._activeDictationSessionId = void 0;
462
501
  this._dictation = void 0;
463
502
  this._dictationBaseText = "";
464
503
  this._currentInterimText = "";
465
- this._notifySubscribers();
504
+ for (const unsubscribe of unsubscribes) runCleanup(unsubscribe);
505
+ if (options?.notify !== false) runCleanup(() => this._notifySubscribers());
466
506
  } finally {
467
507
  this._isCleaningDictation = false;
468
508
  }