@assistant-ui/core 0.3.12 → 0.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/dist/adapters/speech.d.ts.map +1 -1
  2. package/dist/adapters/speech.js +9 -15
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +2 -0
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/adapters/voice.d.ts.map +1 -1
  7. package/dist/adapters/voice.js +27 -15
  8. package/dist/adapters/voice.js.map +1 -1
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.js +2 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/internal.d.ts +1 -1
  13. package/dist/internal.js +6 -6
  14. package/dist/model-context/frame/host.d.ts.map +1 -1
  15. package/dist/model-context/frame/host.js +2 -1
  16. package/dist/model-context/frame/host.js.map +1 -1
  17. package/dist/model-context/registry.d.ts.map +1 -1
  18. package/dist/model-context/registry.js +16 -4
  19. package/dist/model-context/registry.js.map +1 -1
  20. package/dist/react/RuntimeAdapter.d.ts +8 -1
  21. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  22. package/dist/react/RuntimeAdapter.js +23 -18
  23. package/dist/react/RuntimeAdapter.js.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
  26. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  27. package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
  28. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
  29. package/dist/react/client/AdaptedRemoteThread.js +27 -0
  30. package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
  31. package/dist/react/client/InMemoryThreadList.d.ts +19 -0
  32. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
  33. package/dist/react/client/InMemoryThreadList.js +418 -0
  34. package/dist/react/client/InMemoryThreadList.js.map +1 -0
  35. package/dist/react/client/Interactables.d.ts.map +1 -1
  36. package/dist/react/client/Interactables.js +159 -102
  37. package/dist/react/client/Interactables.js.map +1 -1
  38. package/dist/react/client/RemoteThreadList.d.ts +34 -0
  39. package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
  40. package/dist/react/client/RemoteThreadList.js +826 -0
  41. package/dist/react/client/RemoteThreadList.js.map +1 -0
  42. package/dist/react/client/Tools.d.ts.map +1 -1
  43. package/dist/react/client/Tools.js +38 -27
  44. package/dist/react/client/Tools.js.map +1 -1
  45. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  46. package/dist/react/client/interactable-model-context.js +5 -1
  47. package/dist/react/client/interactable-model-context.js.map +1 -1
  48. package/dist/react/index.d.ts +7 -2
  49. package/dist/react/index.js +5 -2
  50. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  51. package/dist/react/interactables-legacy/Interactables.js +145 -110
  52. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  53. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  54. package/dist/react/primitive-hooks/useActionBarCopy.js +13 -18
  55. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  56. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  57. package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
  58. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  59. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  60. package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
  61. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  62. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  63. package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
  64. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  65. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  66. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
  67. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  68. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  69. package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
  70. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  71. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  72. package/dist/react/primitive-hooks/useComposerSend.js +2 -4
  73. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  74. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  75. package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
  76. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  77. package/dist/react/primitives/message/MessageParts.d.ts +13 -0
  78. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  79. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  80. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  81. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  82. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  83. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +22 -10
  84. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +109 -71
  86. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  87. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +8 -2
  88. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  89. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +40 -13
  90. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  91. package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
  92. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
  93. package/dist/react/runtimes/RemoteThreadResource.js +134 -0
  94. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
  95. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
  96. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  97. package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
  98. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  99. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
  100. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
  101. package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
  102. package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
  103. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
  104. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  105. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
  106. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
  107. package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
  108. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
  109. package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
  110. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
  111. package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
  112. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
  113. package/dist/react/runtimes/assistant-transport/types.js +0 -0
  114. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
  115. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
  116. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
  117. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
  118. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
  119. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
  120. package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
  121. package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
  122. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
  123. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
  124. package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
  125. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
  126. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  127. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
  128. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  129. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
  130. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  131. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
  132. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  133. package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
  134. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  135. package/dist/react/runtimes/cloud/auiV0.js +7 -0
  136. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  137. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  138. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +22 -12
  139. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  140. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
  141. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
  142. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
  143. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
  144. package/dist/react/runtimes/external-message-converter.js +14 -14
  145. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  146. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  147. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
  148. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  149. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  150. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  151. package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
  152. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
  153. package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
  154. package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
  155. package/dist/runtime/api/composer-runtime.d.ts +5 -0
  156. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  157. package/dist/runtime/api/composer-runtime.js.map +1 -1
  158. package/dist/runtime/api/message-runtime.js +1 -1
  159. package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
  160. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  161. package/dist/runtime/api/thread-list-runtime.js +4 -2
  162. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  163. package/dist/runtime/api/thread-runtime.d.ts +12 -2
  164. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  165. package/dist/runtime/api/thread-runtime.js +13 -3
  166. package/dist/runtime/api/thread-runtime.js.map +1 -1
  167. package/dist/runtime/base/base-composer-runtime-core.d.ts +25 -0
  168. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  169. package/dist/runtime/base/base-composer-runtime-core.js +72 -18
  170. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  171. package/dist/runtime/base/base-thread-runtime-core.d.ts +15 -0
  172. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  173. package/dist/runtime/base/base-thread-runtime-core.js +34 -3
  174. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  175. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  176. package/dist/runtime/base/default-edit-composer-runtime-core.js +1 -6
  177. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  178. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
  179. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  180. package/dist/runtime/base/default-thread-composer-runtime-core.js +11 -8
  181. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  182. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  183. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  184. package/dist/runtime/internal.js +5 -5
  185. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +15 -0
  186. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  187. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  188. package/dist/runtime/queue/message-queue.js +25 -11
  189. package/dist/runtime/queue/message-queue.js.map +1 -1
  190. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
  191. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
  192. package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
  193. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
  194. package/dist/runtimes/external-store/external-store-adapter.d.ts +7 -0
  195. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  196. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  197. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  198. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
  199. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  200. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +11 -1
  201. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  202. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +78 -20
  203. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  204. package/dist/runtimes/internal.d.ts +1 -1
  205. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  206. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  207. package/dist/runtimes/local/local-thread-runtime-core.js +55 -14
  208. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  209. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -0
  210. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  211. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  212. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  213. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  214. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  215. package/dist/runtimes/remote-thread-list/types.d.ts +29 -1
  216. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  217. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
  218. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  219. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
  220. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  221. package/dist/store/clients/external-thread.d.ts +7 -0
  222. package/dist/store/clients/external-thread.d.ts.map +1 -1
  223. package/dist/store/clients/external-thread.js +460 -369
  224. package/dist/store/clients/external-thread.js.map +1 -1
  225. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  226. package/dist/store/clients/runtime-adapter.js +5 -2
  227. package/dist/store/clients/runtime-adapter.js.map +1 -1
  228. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  229. package/dist/store/clients/single-thread-list.js +31 -27
  230. package/dist/store/clients/single-thread-list.js.map +1 -1
  231. package/dist/store/clients/suggestions.d.ts +3 -1
  232. package/dist/store/clients/suggestions.d.ts.map +1 -1
  233. package/dist/store/clients/suggestions.js +65 -37
  234. package/dist/store/clients/suggestions.js.map +1 -1
  235. package/dist/store/clients/thread-selection-events.d.ts +10 -0
  236. package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
  237. package/dist/store/clients/thread-selection-events.js +40 -0
  238. package/dist/store/clients/thread-selection-events.js.map +1 -0
  239. package/dist/store/env.d.ts +5 -0
  240. package/dist/store/env.d.ts.map +1 -0
  241. package/dist/store/env.js +12 -0
  242. package/dist/store/env.js.map +1 -0
  243. package/dist/store/index.d.ts +6 -4
  244. package/dist/store/index.js +5 -3
  245. package/dist/store/internal.d.ts +4 -1
  246. package/dist/store/internal.js +4 -1
  247. package/dist/store/primitive-predicates.d.ts +19 -0
  248. package/dist/store/primitive-predicates.d.ts.map +1 -0
  249. package/dist/store/primitive-predicates.js +19 -0
  250. package/dist/store/primitive-predicates.js.map +1 -0
  251. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  252. package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
  253. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  254. package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
  255. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
  256. package/dist/store/runtime-clients/handle-runtime-action.js +12 -0
  257. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
  258. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
  259. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
  260. package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
  261. package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
  262. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +104 -57
  264. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  266. package/dist/store/runtime-clients/thread-list-runtime-client.js +5 -6
  267. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  268. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  269. package/dist/store/runtime-clients/thread-runtime-client.js +98 -82
  270. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  271. package/dist/store/scope-registration.d.ts +2 -2
  272. package/dist/store/scopes/composer.d.ts +9 -4
  273. package/dist/store/scopes/composer.d.ts.map +1 -1
  274. package/dist/store/scopes/suggestions.d.ts +6 -1
  275. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  276. package/dist/store/scopes/thread-list-item.d.ts +7 -6
  277. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  278. package/dist/store/scopes/thread.d.ts +25 -7
  279. package/dist/store/scopes/thread.d.ts.map +1 -1
  280. package/dist/store/scopes/threads.d.ts +17 -1
  281. package/dist/store/scopes/threads.d.ts.map +1 -1
  282. package/dist/subscribable/subscribable.d.ts +2 -1
  283. package/dist/subscribable/subscribable.d.ts.map +1 -1
  284. package/dist/subscribable/subscribable.js +23 -18
  285. package/dist/subscribable/subscribable.js.map +1 -1
  286. package/dist/types/error.d.ts +15 -1
  287. package/dist/types/error.d.ts.map +1 -1
  288. package/dist/types/error.js +18 -1
  289. package/dist/types/error.js.map +1 -1
  290. package/dist/types/message.d.ts +2 -0
  291. package/dist/types/message.d.ts.map +1 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/composite-context-provider.d.ts +1 -0
  294. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  295. package/dist/utils/composite-context-provider.js +25 -9
  296. package/dist/utils/composite-context-provider.js.map +1 -1
  297. package/dist/utils/notify-event-listeners.d.ts +2 -2
  298. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  299. package/dist/utils/notify-event-listeners.js +2 -2
  300. package/dist/utils/notify-event-listeners.js.map +1 -1
  301. package/package.json +7 -7
  302. package/src/adapters/speech.test.ts +118 -1
  303. package/src/adapters/speech.ts +21 -22
  304. package/src/adapters/thread-history.ts +2 -0
  305. package/src/adapters/voice.test.ts +69 -0
  306. package/src/adapters/voice.ts +27 -27
  307. package/src/index.ts +2 -0
  308. package/src/model-context/frame/host.test.ts +23 -0
  309. package/src/model-context/frame/host.ts +2 -1
  310. package/src/model-context/registry.test.ts +131 -0
  311. package/src/model-context/registry.ts +16 -6
  312. package/src/react/RuntimeAdapter.test.ts +2 -0
  313. package/src/react/RuntimeAdapter.ts +20 -8
  314. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
  315. package/src/react/client/AdaptedRemoteThread.ts +41 -0
  316. package/src/react/client/InMemoryThreadList.test.tsx +148 -0
  317. package/src/react/client/InMemoryThreadList.ts +290 -0
  318. package/src/react/client/Interactables.test.ts +326 -2
  319. package/src/react/client/Interactables.ts +227 -110
  320. package/src/react/client/RemoteThreadList.test.ts +1026 -0
  321. package/src/react/client/RemoteThreadList.ts +1067 -0
  322. package/src/react/client/Tools.ts +36 -29
  323. package/src/react/client/interactable-model-context.ts +6 -1
  324. package/src/react/index.ts +13 -0
  325. package/src/react/interactables-legacy/Interactables.test.ts +317 -0
  326. package/src/react/interactables-legacy/Interactables.ts +204 -128
  327. package/src/react/primitive-hooks/useActionBarCopy.ts +2 -7
  328. package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
  329. package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
  330. package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
  331. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
  332. package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
  333. package/src/react/primitive-hooks/useComposerSend.ts +2 -5
  334. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
  335. package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
  336. package/src/react/primitives/message/MessageParts.tsx +0 -1
  337. package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
  338. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
  339. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
  340. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
  341. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
  342. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +159 -124
  343. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +59 -20
  344. package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
  345. package/src/react/runtimes/RemoteThreadResource.ts +231 -0
  346. package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
  347. package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
  348. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
  349. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
  350. package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
  351. package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
  352. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
  353. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
  354. package/src/react/runtimes/assistant-transport/types.ts +170 -0
  355. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
  356. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +625 -0
  357. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +481 -0
  358. package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
  359. package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
  360. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
  361. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
  362. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
  363. package/src/react/runtimes/cloud/auiV0.ts +17 -1
  364. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +36 -21
  365. package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
  366. package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
  367. package/src/react/runtimes/external-message-converter.test.ts +143 -0
  368. package/src/react/runtimes/external-message-converter.ts +41 -41
  369. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
  370. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
  371. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +124 -0
  372. package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
  373. package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
  374. package/src/react/runtimes/useLocalRuntime.test.tsx +130 -4
  375. package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
  376. package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
  377. package/src/runtime/api/composer-runtime.ts +5 -0
  378. package/src/runtime/api/thread-list-runtime.ts +3 -1
  379. package/src/runtime/api/thread-runtime.ts +28 -3
  380. package/src/runtime/base/base-composer-runtime-core.ts +106 -13
  381. package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
  382. package/src/runtime/base/base-thread-runtime-core.ts +47 -2
  383. package/src/runtime/base/default-edit-composer-runtime-core.ts +1 -15
  384. package/src/runtime/base/default-thread-composer-runtime-core.ts +13 -15
  385. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  386. package/src/runtime/queue/external-thread-queue-adapter.ts +17 -0
  387. package/src/runtime/queue/message-queue.ts +28 -10
  388. package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
  389. package/src/runtimes/external-store/external-store-adapter.ts +7 -0
  390. package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
  391. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  392. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +187 -48
  393. package/src/runtimes/local/local-thread-runtime-core.test.ts +373 -4
  394. package/src/runtimes/local/local-thread-runtime-core.ts +83 -15
  395. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  396. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  397. package/src/runtimes/remote-thread-list/types.ts +30 -0
  398. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
  399. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
  400. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
  401. package/src/store/clients/external-thread.ts +119 -16
  402. package/src/store/clients/model-context-client.test.ts +16 -8
  403. package/src/store/clients/runtime-adapter.ts +5 -2
  404. package/src/store/clients/single-thread-list.ts +2 -1
  405. package/src/store/clients/suggestions.ts +39 -13
  406. package/src/store/clients/thread-selection-events.ts +21 -0
  407. package/src/store/env.ts +11 -0
  408. package/src/store/index.ts +14 -1
  409. package/src/store/internal.ts +13 -0
  410. package/src/store/primitive-predicates.test.ts +184 -0
  411. package/src/store/primitive-predicates.ts +43 -0
  412. package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
  413. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
  414. package/src/store/runtime-clients/handle-runtime-action.ts +11 -0
  415. package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
  416. package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
  417. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +28 -35
  418. package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
  419. package/src/store/runtime-clients/thread-runtime-client.ts +5 -0
  420. package/src/store/scopes/composer.ts +9 -4
  421. package/src/store/scopes/suggestions.ts +6 -0
  422. package/src/store/scopes/thread-list-item.ts +7 -6
  423. package/src/store/scopes/thread.ts +25 -7
  424. package/src/store/scopes/threads.ts +14 -0
  425. package/src/subscribable/subscribable.test.ts +77 -1
  426. package/src/subscribable/subscribable.ts +38 -23
  427. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
  428. package/src/tests/append-interactable-snapshots.test.ts +350 -0
  429. package/src/tests/auiV0Encode.test.ts +66 -0
  430. package/src/tests/base-composer-runtime-core-send.test.ts +156 -0
  431. package/src/tests/base-composer-runtime-core.test.ts +136 -1
  432. package/src/tests/composer-can-cancel.test.ts +101 -0
  433. package/src/tests/default-edit-composer-runtime-core.test.ts +0 -68
  434. package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
  435. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +491 -1
  436. package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
  437. package/src/tests/external-thread-attachments.test.tsx +214 -0
  438. package/src/tests/external-thread-parity.test.tsx +54 -0
  439. package/src/tests/external-thread-refetch.test.tsx +117 -0
  440. package/src/tests/external-thread-suggestions.test.tsx +59 -0
  441. package/src/tests/interactables-toolui-migration.test.tsx +66 -0
  442. package/src/tests/message-queue.test.ts +54 -0
  443. package/src/tests/session-reset-notification.test.ts +145 -0
  444. package/src/tests/thread-message-like.test.ts +39 -0
  445. package/src/tests/thread-switch-events.test.tsx +234 -0
  446. package/src/tests/tools-scope-migration.test.tsx +58 -0
  447. package/src/types/error.ts +24 -0
  448. package/src/types/message.ts +2 -0
  449. package/src/utils/composite-context-provider.test.ts +139 -0
  450. package/src/utils/composite-context-provider.ts +26 -8
  451. package/src/utils/notify-event-listeners.ts +10 -5
  452. package/src/tests/default-thread-composer-runtime-core.test.ts +0 -82
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-runtime.js","names":["Unsubscribe","LazyMemoizeSubject","NestedSubscriptionSubject","SKIP_UPDATE","ShallowMemoizeSubject","ThreadListRuntimeCore","ThreadListItemRuntime","ThreadListItemRuntimeImpl","ThreadListItemState","ThreadListItemRuntimeBinding","ThreadRuntime","ThreadRuntimeCoreBinding","ThreadRuntimeImpl","RESOLVED_PROMISE","Promise","resolve","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","getLoadThreadsPromise","reload","reloadMainThread","loadMore","getThreadListState","threadList","getThreadListItemState","undefined","threadData","id","remoteId","externalId","title","status","lastMessageAt","custom","isMain","isRunning","unstable_isThreadRunning","ThreadListRuntimeCoreBinding","ThreadListRuntimeImpl","_getState","_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 { ThreadListRuntimeCore } 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();\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 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 _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\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.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 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._core.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","ThreadListItemRuntime","ThreadListItemRuntimeImpl","ThreadListItemState","ThreadListItemRuntimeBinding","ThreadRuntime","ThreadRuntimeCoreBinding","ThreadRuntimeImpl","RESOLVED_PROMISE","Promise","resolve","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","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 { ThreadListRuntimeCore } 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();\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 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.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 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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"}
@@ -99,7 +99,7 @@ type ThreadState = {
99
99
  * The canonical `isRunning` derivation. A runtime that tracks run state itself
100
100
  * reports it directly; the rest fall back to the trailing assistant message.
101
101
  */
102
- declare const getThreadRuntimeCoreIsRunning: (runtime: ThreadRuntimeCore) => boolean;
102
+ declare const getThreadRuntimeCoreIsRunning: (runtime: Pick<ThreadRuntimeCore, "isRunning" | "messages">) => boolean;
103
103
  declare const getThreadState: (runtime: ThreadRuntimeCore, threadListItemState: ThreadListItemState) => ThreadState;
104
104
  type ThreadRuntime = {
105
105
  /**
@@ -158,6 +158,13 @@ type ThreadRuntime = {
158
158
  importExternalState(state: any): void;
159
159
  subscribe(callback: () => void): Unsubscribe;
160
160
  cancelRun(): void;
161
+ /**
162
+ * Notifies the runtime that the adapter discarded its backing session.
163
+ * Clears session-scoped tool-invocation state without run-cancel side
164
+ * effects such as composer draft restoration. Internal API for
165
+ * external-store adapter authors.
166
+ */
167
+ unstable_notifySessionReset(): void;
161
168
  getModelContext(): ModelContext;
162
169
  export(): ExportedMessageRepository;
163
170
  import(repository: ExportedMessageRepository): void;
@@ -198,6 +205,7 @@ declare class ThreadRuntimeImpl implements ThreadRuntime {
198
205
  startRun: (config: StartRunConfig) => void;
199
206
  resumeRun: (config: ResumeRunConfig) => void;
200
207
  cancelRun: () => void;
208
+ unstable_notifySessionReset: () => void;
201
209
  addToolResult: (options: AddToolResultOptions) => void;
202
210
  resumeToolCall: (options: ResumeToolCallOptions) => void;
203
211
  respondToToolApproval: (options: RespondToToolApprovalOptions) => void;
@@ -273,19 +281,21 @@ declare class ThreadRuntimeImpl implements ThreadRuntime {
273
281
  getStateState(): ThreadState;
274
282
  };
275
283
  private readonly _threadBinding;
284
+ private readonly _stateBinding;
276
285
  constructor(threadBinding: ThreadRuntimeCoreBinding, threadListItemBinding: ThreadListItemRuntimeBinding);
277
286
  protected __internal_bindMethods(): void;
278
287
  readonly composer: ThreadComposerRuntimeImpl;
279
288
  getState(): ThreadState;
280
289
  append(message: CreateAppendMessage): void;
281
290
  deleteMessage(messageId: string): void | Promise<void>;
282
- subscribe(callback: () => void): Unsubscribe;
291
+ subscribe(callback: () => void): () => void;
283
292
  getModelContext(): ModelContext;
284
293
  startRun(config: CreateStartRunConfig): void;
285
294
  resumeRun(config: CreateResumeRunConfig): void;
286
295
  exportExternalState(): any;
287
296
  importExternalState(state: any): void;
288
297
  cancelRun(): void;
298
+ unstable_notifySessionReset(): void;
289
299
  stopSpeaking(): void;
290
300
  connectVoice(): void;
291
301
  disconnectVoice(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-runtime.d.ts","names":[],"sources":["../../../src/runtime/api/thread-runtime.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;KA8CY;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;cASE,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;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA3PkB,OAAA;;wBAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6CT,eAAA,uBAAa;;IAuNnB,iBAAA;;mBADF;EAKf,YAAA,eAAe,0BACf,uBAAuB;YA0Cf;WA0BM,UAAQ;EAEjB,YAAQ;EAIR,OAAO,SAAS;EAQhB,cAAc,2BAAiB;EAI/B,UAAU,uBAAoB;EAI9B,mBAAe;EAIf,SAAS,QAAQ;EAIjB,UAAU,QAAQ;EAIlB;EAIA,oBAAoB;EAIpB;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":";;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QArQU,OAAA;;wBAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDD,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,5 +1,6 @@
1
- import { symbolInnerMessage } from "../utils/external-store-message.js";
2
1
  import { EventSubscriptionSubject, NestedSubscriptionSubject, SKIP_UPDATE, ShallowMemoizeSubject } from "../../subscribable/subscribable.js";
2
+ import { isMessageNotSentError } from "../../types/error.js";
3
+ import { symbolInnerMessage } from "../utils/external-store-message.js";
3
4
  import { ThreadComposerRuntimeImpl } from "./composer-runtime.js";
4
5
  import { MessageRuntimeImpl } from "./message-runtime.js";
5
6
  //#region src/runtime/api/thread-runtime.ts
@@ -77,6 +78,7 @@ var ThreadRuntimeImpl = class {
77
78
  return this._threadBinding;
78
79
  }
79
80
  _threadBinding;
81
+ _stateBinding;
80
82
  constructor(threadBinding, threadListItemBinding) {
81
83
  const stateBinding = new ShallowMemoizeSubject({
82
84
  path: threadBinding.path,
@@ -90,6 +92,7 @@ var ThreadRuntimeImpl = class {
90
92
  };
91
93
  }
92
94
  });
95
+ this._stateBinding = stateBinding;
93
96
  this._threadBinding = {
94
97
  path: threadBinding.path,
95
98
  getState: () => threadBinding.getState(),
@@ -116,6 +119,7 @@ var ThreadRuntimeImpl = class {
116
119
  this.exportExternalState = this.exportExternalState.bind(this);
117
120
  this.startRun = this.startRun.bind(this);
118
121
  this.cancelRun = this.cancelRun.bind(this);
122
+ this.unstable_notifySessionReset = this.unstable_notifySessionReset.bind(this);
119
123
  this.stopSpeaking = this.stopSpeaking.bind(this);
120
124
  this.connectVoice = this.connectVoice.bind(this);
121
125
  this.disconnectVoice = this.disconnectVoice.bind(this);
@@ -138,13 +142,16 @@ var ThreadRuntimeImpl = class {
138
142
  return this._threadBinding.getStateState();
139
143
  }
140
144
  append(message) {
141
- this._threadBinding.getState().append(toAppendMessage(this._threadBinding.getState().messages, message));
145
+ const task = this._threadBinding.getState().append(toAppendMessage(this._threadBinding.getState().messages, message));
146
+ Promise.resolve(task).catch((error) => {
147
+ if (!isMessageNotSentError(error)) throw error;
148
+ });
142
149
  }
143
150
  deleteMessage(messageId) {
144
151
  return this._threadBinding.getState().deleteMessage(messageId);
145
152
  }
146
153
  subscribe(callback) {
147
- return this._threadBinding.subscribe(callback);
154
+ return this._stateBinding.subscribe(callback);
148
155
  }
149
156
  getModelContext() {
150
157
  return this._threadBinding.getState().getModelContext();
@@ -164,6 +171,9 @@ var ThreadRuntimeImpl = class {
164
171
  cancelRun() {
165
172
  this._threadBinding.getState().cancelRun();
166
173
  }
174
+ unstable_notifySessionReset() {
175
+ this._threadBinding.getState().unstable_notifySessionReset();
176
+ }
167
177
  stopSpeaking() {
168
178
  return this._threadBinding.getState().stopSpeaking();
169
179
  }
@@ -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","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","undefined","lastMessage","status","getThreadState","threadListItemState","Object","freeze","ThreadRuntime","path","composer","getState","append","deleteMessage","messageId","Promise","config","resumeRun","exportExternalState","importExternalState","subscribe","cancelRun","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","constructor","threadBinding","threadListItemBinding","stateBinding","sub1","sub2","ref","composerSource","__internal_bindMethods","bind","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 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: ThreadRuntimeCore,\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 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\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._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.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 this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\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._threadBinding.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 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","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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"}
@@ -34,6 +34,7 @@ declare abstract class BaseComposerRuntimeCore extends BaseSubscribable implemen
34
34
  get quote(): QuoteInfo | undefined;
35
35
  setQuote(quote: QuoteInfo | undefined): void;
36
36
  setText(value: string): void;
37
+ private _rebaseDictation;
37
38
  setRole(role: MessageRole): void;
38
39
  setRunConfig(runConfig: RunConfig): void;
39
40
  protected _isSending: boolean;
@@ -47,6 +48,30 @@ declare abstract class BaseComposerRuntimeCore extends BaseSubscribable implemen
47
48
  reset(): Promise<void>;
48
49
  clearAttachments(): Promise<void>;
49
50
  send(options?: SendOptions): Promise<void>;
51
+ /**
52
+ * Take a message back into the composer when it has nowhere else to live:
53
+ * a send the runtime never dispatched, or a message a cancelled run is
54
+ * removing from the thread. Reports whether the composer accepted it, so a
55
+ * caller that is also removing the message can keep it instead of dropping
56
+ * it. Refused, and left untouched, while the composer holds anything of its
57
+ * own.
58
+ */
59
+ restoreDraft(draft: {
60
+ text: string;
61
+ quote?: QuoteInfo | undefined;
62
+ attachments?: readonly Attachment[] | undefined;
63
+ }): boolean;
64
+ /**
65
+ * Inverse of `restoreDraft`: clears the composer while it still holds
66
+ * exactly the given draft. A draft the user has edited since is left
67
+ * untouched.
68
+ */
69
+ retractDraft(draft: {
70
+ text: string;
71
+ quote?: QuoteInfo | undefined;
72
+ attachments?: readonly Attachment[] | undefined;
73
+ }): void;
74
+ private _restoreUnsentDraft;
50
75
  cancel(): void;
51
76
  get queue(): readonly QueueItemState[];
52
77
  moveQueueItem(_queueItemId: string, _placement: QueuePlacement): void;
@@ -1 +1 @@
1
- {"version":3,"file":"base-composer-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/base/base-composer-runtime-core.ts"],"mappings":";;;;;;;;;;uBA0CsB,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;EAaR,QAAQ,MAAM;EAOd,aAAa,WAAW;YAOrB;UACF;UACA;UACA;UAEA;UAQA;UAOA;UAMM;EAQD,SAAK;EA8BL,oBAAgB;EAQhB,KAAK,UAAU,cAAW;EAiFhC;MAII,kBAAkB;EAItB,cACL,sBACA,YAAY;EAEP,gBAAgB;qBAEJ,WACjB,SAAS,KAAK,yCACd,UAAU,qBACF;qBACS;EAEb,cAAc,kBAAkB,OAAO,mBAAgB;UAuIrD;EAqBF,iBAAiB,uBAAoB;UAmCnC;UACA;UACA;UACA;UACA;UACA;UACA;UACA;MAEG,aAAa;UAIhB;EAUD;EA6FA;UAUC;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":";;;;;;;;;;uBA2CsB,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;UAQA;UAOA;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;UAuIrD;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,8 +1,9 @@
1
+ import { notifyEventListeners } from "../../utils/notify-event-listeners.js";
2
+ import { BaseSubscribable } from "../../subscribable/subscribable.js";
1
3
  import { generateId } from "../../utils/id.js";
2
4
  import { fileMatchesAccept } from "../../adapters/attachment.js";
5
+ import { isMessageNotSentError } from "../../types/error.js";
3
6
  import { EMPTY_QUEUE_ITEMS } from "../../store/scopes/queue-item.js";
4
- import { notifyEventListeners } from "../../utils/notify-event-listeners.js";
5
- import { BaseSubscribable } from "../../subscribable/subscribable.js";
6
7
  import { isCreateAttachment } from "../../types/attachment.js";
7
8
  //#region src/runtime/base/base-composer-runtime-core.ts
8
9
  const isAttachmentComplete = (a) => a.status.type === "complete";
@@ -59,17 +60,19 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
59
60
  setText(value) {
60
61
  if (this._text === value) return;
61
62
  this._text = value;
62
- if (this._dictation) {
63
- this._dictationBaseText = value;
64
- this._currentInterimText = "";
65
- const { status, inputDisabled } = this._dictation;
66
- this._dictation = inputDisabled ? {
67
- status,
68
- inputDisabled
69
- } : { status };
70
- }
63
+ this._rebaseDictation(value);
71
64
  this._notifySubscribers();
72
65
  }
66
+ _rebaseDictation(value) {
67
+ if (!this._dictation) return;
68
+ this._dictationBaseText = value;
69
+ this._currentInterimText = "";
70
+ const { status, inputDisabled } = this._dictation;
71
+ this._dictation = inputDisabled ? {
72
+ status,
73
+ inputDisabled
74
+ } : { status };
75
+ }
73
76
  setRole(role) {
74
77
  if (this._role === role) return;
75
78
  this._role = role;
@@ -141,6 +144,8 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
141
144
  const originalAttachments = this.attachments;
142
145
  const text = this.text;
143
146
  const quote = this._quote;
147
+ const role = this.role;
148
+ const runConfig = this.runConfig;
144
149
  this._quote = void 0;
145
150
  this._text = "";
146
151
  this._isSending = true;
@@ -153,6 +158,7 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
153
158
  if (generation === this._sendGeneration) {
154
159
  if (!this.text.trim() && this._quote === void 0) {
155
160
  this._text = text;
161
+ this._rebaseDictation(text);
156
162
  this._quote = quote;
157
163
  this._notifySubscribers();
158
164
  }
@@ -174,19 +180,68 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
174
180
  this._removedDuringSend.clear();
175
181
  const message = {
176
182
  createdAt: /* @__PURE__ */ new Date(),
177
- role: this.role,
183
+ role,
178
184
  content: text ? [{
179
185
  type: "text",
180
186
  text
181
187
  }] : [],
182
188
  attachments: finalAttachments,
183
- runConfig: this.runConfig,
189
+ runConfig,
184
190
  metadata: { custom: { ...quote ? { quote } : {} } }
185
191
  };
186
- const sendTask = this.handleSend(message, options);
187
- if (sendTask) sendTask.catch(() => {});
192
+ const draft = {
193
+ text,
194
+ quote,
195
+ attachments: finalAttachments
196
+ };
197
+ let sendTask;
198
+ try {
199
+ sendTask = this.handleSend(message, options);
200
+ } catch (error) {
201
+ this._restoreUnsentDraft(error, generation, draft);
202
+ throw error;
203
+ }
204
+ if (sendTask) sendTask.catch((error) => {
205
+ this._restoreUnsentDraft(error, generation, draft);
206
+ });
188
207
  this._notifyEventSubscribers("send", {});
189
208
  }
209
+ /**
210
+ * Take a message back into the composer when it has nowhere else to live:
211
+ * a send the runtime never dispatched, or a message a cancelled run is
212
+ * removing from the thread. Reports whether the composer accepted it, so a
213
+ * caller that is also removing the message can keep it instead of dropping
214
+ * it. Refused, and left untouched, while the composer holds anything of its
215
+ * own.
216
+ */
217
+ restoreDraft(draft) {
218
+ if (this._text.trim() || this._quote !== void 0 || this._attachments.length > 0) return false;
219
+ this._text = draft.text;
220
+ this._rebaseDictation(draft.text);
221
+ this._quote = draft.quote;
222
+ this._attachments = draft.attachments ?? [];
223
+ this._notifySubscribers();
224
+ return true;
225
+ }
226
+ /**
227
+ * Inverse of `restoreDraft`: clears the composer while it still holds
228
+ * exactly the given draft. A draft the user has edited since is left
229
+ * untouched.
230
+ */
231
+ retractDraft(draft) {
232
+ const attachmentsUntouched = draft.attachments !== void 0 ? this._attachments === draft.attachments : this._attachments.length === 0;
233
+ if (this._text !== draft.text || this._quote !== draft.quote || !attachmentsUntouched) return;
234
+ this._text = "";
235
+ this._rebaseDictation("");
236
+ this._quote = void 0;
237
+ this._attachments = [];
238
+ this._notifySubscribers();
239
+ }
240
+ _restoreUnsentDraft(error, generation, draft) {
241
+ if (!isMessageNotSentError(error)) return;
242
+ if (generation !== this._sendGeneration) return;
243
+ this.restoreDraft(draft);
244
+ }
190
245
  cancel() {
191
246
  this.handleCancel();
192
247
  }
@@ -408,9 +463,8 @@ var BaseComposerRuntimeCore = class extends BaseSubscribable {
408
463
  if (!this._dictationSession) return;
409
464
  const session = this._dictationSession;
410
465
  const sessionId = this._activeDictationSessionId;
411
- session.stop().finally(() => {
412
- this._cleanupDictation({ sessionId });
413
- });
466
+ const cleanup = () => this._cleanupDictation({ sessionId });
467
+ session.stop().then(cleanup, cleanup);
414
468
  }
415
469
  _cleanupDictation(options) {
416
470
  if (options?.sessionId !== void 0 && options.sessionId !== this._activeDictationSessionId || this._isCleaningDictation) return;