@assistant-ui/core 0.3.19 → 0.3.21

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 (934) hide show
  1. package/dist/adapters/attachment.d.ts +50 -43
  2. package/dist/adapters/attachment.d.ts.map +1 -1
  3. package/dist/adapters/attachment.js +52 -21
  4. package/dist/adapters/attachment.js.map +1 -1
  5. package/dist/adapters/directive-formatter.d.ts +2 -5
  6. package/dist/adapters/directive-formatter.d.ts.map +1 -1
  7. package/dist/adapters/feedback.d.ts +7 -8
  8. package/dist/adapters/feedback.d.ts.map +1 -1
  9. package/dist/adapters/index.d.ts +14 -9
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +1 -1
  12. package/dist/adapters/speech.d.ts +63 -65
  13. package/dist/adapters/speech.d.ts.map +1 -1
  14. package/dist/adapters/speech.js +16 -2
  15. package/dist/adapters/speech.js.map +1 -1
  16. package/dist/adapters/suggestion.d.ts +19 -22
  17. package/dist/adapters/suggestion.d.ts.map +1 -1
  18. package/dist/adapters/thread-history.d.ts +60 -58
  19. package/dist/adapters/thread-history.d.ts.map +1 -1
  20. package/dist/adapters/trigger.d.ts +8 -11
  21. package/dist/adapters/trigger.d.ts.map +1 -1
  22. package/dist/adapters/voice.d.ts +50 -45
  23. package/dist/adapters/voice.d.ts.map +1 -1
  24. package/dist/adapters/voice.js +17 -3
  25. package/dist/adapters/voice.js.map +1 -1
  26. package/dist/index.d.ts +70 -56
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/internal/duplicate-detection.d.ts +1 -4
  31. package/dist/internal/duplicate-detection.d.ts.map +1 -1
  32. package/dist/internal.d.ts +27 -58
  33. package/dist/internal.d.ts.map +1 -0
  34. package/dist/internal.js +8 -6
  35. package/dist/model-context/frame/host.d.ts +20 -23
  36. package/dist/model-context/frame/host.d.ts.map +1 -1
  37. package/dist/model-context/frame/host.js +3 -1
  38. package/dist/model-context/frame/host.js.map +1 -1
  39. package/dist/model-context/frame/provider.d.ts +28 -30
  40. package/dist/model-context/frame/provider.d.ts.map +1 -1
  41. package/dist/model-context/frame/provider.js +6 -0
  42. package/dist/model-context/frame/provider.js.map +1 -1
  43. package/dist/model-context/frame/types.d.ts +24 -27
  44. package/dist/model-context/frame/types.d.ts.map +1 -1
  45. package/dist/model-context/frame/validate.d.ts +3 -0
  46. package/dist/model-context/frame/validate.d.ts.map +1 -0
  47. package/dist/model-context/frame/validate.js +26 -0
  48. package/dist/model-context/frame/validate.js.map +1 -0
  49. package/dist/model-context/interactable-composer-metadata.d.ts +51 -39
  50. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  51. package/dist/model-context/interactable-composer-metadata.js +30 -6
  52. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  53. package/dist/model-context/registry-handles.d.ts +9 -12
  54. package/dist/model-context/registry-handles.d.ts.map +1 -1
  55. package/dist/model-context/registry.d.ts +15 -18
  56. package/dist/model-context/registry.d.ts.map +1 -1
  57. package/dist/model-context/tool-call-text.d.ts +15 -17
  58. package/dist/model-context/tool-call-text.d.ts.map +1 -1
  59. package/dist/model-context/tool.d.ts +12 -14
  60. package/dist/model-context/tool.d.ts.map +1 -1
  61. package/dist/model-context/types.d.ts +40 -43
  62. package/dist/model-context/types.d.ts.map +1 -1
  63. package/dist/react/AssistantProvider.d.ts +9 -12
  64. package/dist/react/AssistantProvider.d.ts.map +1 -1
  65. package/dist/react/AssistantRuntimeProvider.d.ts +23 -26
  66. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  67. package/dist/react/RuntimeAdapter.d.ts +4 -8
  68. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  69. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +28 -23
  70. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  71. package/dist/react/adapters/LocalStorageThreadListAdapter.js +77 -58
  72. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  73. package/dist/react/adapters/TitleGenerationAdapter.d.ts +4 -7
  74. package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
  75. package/dist/react/client/AdaptedRemoteThread.d.ts +6 -9
  76. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -1
  77. package/dist/react/client/DataRenderers.d.ts +2 -5
  78. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  79. package/dist/react/client/InMemoryThreadList.d.ts +9 -12
  80. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  81. package/dist/react/client/Interactables.d.ts +3 -6
  82. package/dist/react/client/Interactables.d.ts.map +1 -1
  83. package/dist/react/client/Interactables.js +306 -101
  84. package/dist/react/client/Interactables.js.map +1 -1
  85. package/dist/react/client/RemoteThreadList.d.ts +34 -37
  86. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  87. package/dist/react/client/RemoteThreadList.js +2 -1
  88. package/dist/react/client/RemoteThreadList.js.map +1 -1
  89. package/dist/react/client/Tools.d.ts +10 -12
  90. package/dist/react/client/Tools.d.ts.map +1 -1
  91. package/dist/react/client/Tools.js +4 -8
  92. package/dist/react/client/Tools.js.map +1 -1
  93. package/dist/react/client/interactable-model-context.d.ts +9 -11
  94. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  95. package/dist/react/client/interactable-model-context.js +32 -22
  96. package/dist/react/client/interactable-model-context.js.map +1 -1
  97. package/dist/react/index.d.ts +160 -122
  98. package/dist/react/index.d.ts.map +1 -0
  99. package/dist/react/index.js +5 -5
  100. package/dist/react/interactables-legacy/Interactables.d.ts +2 -5
  101. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  102. package/dist/react/interactables-legacy/Interactables.js +15 -8
  103. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  104. package/dist/react/interactables-legacy/interactable-model-context.d.ts +6 -9
  105. package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
  106. package/dist/react/interactables-legacy/interactable-model-context.js +13 -14
  107. package/dist/react/interactables-legacy/interactable-model-context.js.map +1 -1
  108. package/dist/react/interactables-legacy/scopes.d.ts +42 -46
  109. package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
  110. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +8 -11
  111. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  112. package/dist/react/interactables-legacy/useInteractableState.d.ts +7 -9
  113. package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
  114. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +23 -14
  115. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  116. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +54 -25
  117. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  118. package/dist/react/model-context/define-mcp-toolkit.d.ts +15 -18
  119. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
  120. package/dist/react/model-context/define-toolkit.d.ts +13 -6
  121. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  122. package/dist/react/model-context/external-tool.d.ts +1 -4
  123. package/dist/react/model-context/external-tool.d.ts.map +1 -1
  124. package/dist/react/model-context/human-tool.d.ts +3 -6
  125. package/dist/react/model-context/human-tool.d.ts.map +1 -1
  126. package/dist/react/model-context/interactableTool.d.ts +26 -29
  127. package/dist/react/model-context/interactableTool.d.ts.map +1 -1
  128. package/dist/react/model-context/makeAssistantDataUI.d.ts +6 -9
  129. package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
  130. package/dist/react/model-context/makeAssistantTool.d.ts +6 -9
  131. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  132. package/dist/react/model-context/makeAssistantToolUI.d.ts +6 -9
  133. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  134. package/dist/react/model-context/provider-tool.d.ts +5 -7
  135. package/dist/react/model-context/provider-tool.d.ts.map +1 -1
  136. package/dist/react/model-context/stub-tool.d.ts +1 -4
  137. package/dist/react/model-context/stub-tool.d.ts.map +1 -1
  138. package/dist/react/model-context/toolbox.d.ts +44 -32
  139. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  140. package/dist/react/model-context/useAssistantContext.d.ts +3 -6
  141. package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
  142. package/dist/react/model-context/useAssistantDataUI.d.ts +7 -10
  143. package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
  144. package/dist/react/model-context/useAssistantInstructions.d.ts +3 -6
  145. package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
  146. package/dist/react/model-context/useAssistantTool.d.ts +9 -13
  147. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  148. package/dist/react/model-context/useAssistantToolUI.d.ts +13 -16
  149. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  150. package/dist/react/model-context/useAuiToolOverrides.d.ts +3 -5
  151. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
  152. package/dist/react/model-context/useInlineRender.d.ts +3 -6
  153. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  154. package/dist/react/model-context/useInteractable.d.ts +40 -40
  155. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  156. package/dist/react/model-context/useInteractableState.d.ts +10 -9
  157. package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
  158. package/dist/react/model-context/useInteractableVersions.d.ts +4 -7
  159. package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
  160. package/dist/react/model-context/useToolArgsStatus.d.ts +7 -9
  161. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  162. package/dist/react/primitive-hooks/useActionBarCopy.d.ts +7 -10
  163. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  164. package/dist/react/primitive-hooks/useActionBarEdit.d.ts +3 -6
  165. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  166. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts +6 -9
  167. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
  168. package/dist/react/primitive-hooks/useActionBarReload.d.ts +3 -6
  169. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  170. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts +3 -6
  171. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
  172. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts +3 -6
  173. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
  174. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts +3 -6
  175. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  176. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts +3 -6
  177. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  178. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +4 -7
  179. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
  180. package/dist/react/primitive-hooks/useComposerCancel.d.ts +3 -6
  181. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  182. package/dist/react/primitive-hooks/useComposerDictate.d.ts +3 -6
  183. package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
  184. package/dist/react/primitive-hooks/useComposerSend.d.ts +4 -7
  185. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  186. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts +2 -5
  187. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
  188. package/dist/react/primitive-hooks/useEditComposerSend.d.ts +3 -6
  189. package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
  190. package/dist/react/primitive-hooks/useMessageBranching.d.ts +5 -8
  191. package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
  192. package/dist/react/primitive-hooks/useMessageError.d.ts +1 -4
  193. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  194. package/dist/react/primitive-hooks/useMessageReload.d.ts +3 -6
  195. package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
  196. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +7 -10
  197. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  198. package/dist/react/primitive-hooks/useSuggestionTrigger.js +4 -4
  199. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  200. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +1 -4
  201. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  202. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +1 -4
  203. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  204. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts +2 -5
  205. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
  206. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts +2 -5
  207. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
  208. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts +2 -5
  209. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
  210. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts +2 -5
  211. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
  212. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts +3 -6
  213. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  214. package/dist/react/primitive-hooks/useThreadListNew.d.ts +2 -5
  215. package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
  216. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts +1 -4
  217. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
  218. package/dist/react/primitive-hooks/useThreadMessages.d.ts +2 -5
  219. package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
  220. package/dist/react/primitive-hooks/useVoice.d.ts +8 -11
  221. package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
  222. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +27 -29
  223. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  224. package/dist/react/primitives/composer/ComposerAttachments.d.ts +26 -28
  225. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  226. package/dist/react/primitives/composer/ComposerIf.d.ts +13 -13
  227. package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
  228. package/dist/react/primitives/composer/ComposerQueue.d.ts +13 -17
  229. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  230. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +30 -33
  231. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
  232. package/dist/react/primitives/generativeUI/GenerativeUI.js +42 -33
  233. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  234. package/dist/react/primitives/message/MessageAttachments.d.ts +30 -28
  235. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  236. package/dist/react/primitives/message/MessageAttachments.js +14 -15
  237. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  238. package/dist/react/primitives/message/MessageGroupedParts.d.ts +122 -120
  239. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  240. package/dist/react/primitives/message/MessageGroupedParts.js +3 -3
  241. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  242. package/dist/react/primitives/message/MessageParts.d.ts +208 -194
  243. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  244. package/dist/react/primitives/message/MessageParts.js +124 -82
  245. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  246. package/dist/react/primitives/message/MessageQuote.d.ts +8 -11
  247. package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
  248. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +4 -7
  249. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  250. package/dist/react/primitives/part/PartMessages.d.ts +16 -19
  251. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  252. package/dist/react/primitives/thread/ThreadMessages.d.ts +61 -64
  253. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  254. package/dist/react/primitives/thread/ThreadSuggestions.d.ts +25 -27
  255. package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
  256. package/dist/react/primitives/thread/ThreadSuggestions.js +24 -5
  257. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  258. package/dist/react/primitives/threadList/ThreadListItems.d.ts +26 -28
  259. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  260. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +6 -9
  261. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
  262. package/dist/react/providers/AttachmentByIndexProvider.d.ts +5 -8
  263. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  264. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +4 -7
  265. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  266. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +3 -6
  267. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  268. package/dist/react/providers/MessageByIdProvider.d.ts +3 -6
  269. package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
  270. package/dist/react/providers/MessageByIndexProvider.d.ts +3 -6
  271. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  272. package/dist/react/providers/PartByIndexProvider.d.ts +3 -6
  273. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  274. package/dist/react/providers/QueueItemByIndexProvider.d.ts +4 -7
  275. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  276. package/dist/react/providers/ReadonlyThreadProvider.d.ts +7 -10
  277. package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
  278. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  279. package/dist/react/providers/SuggestionByIndexProvider.d.ts +4 -7
  280. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  281. package/dist/react/providers/TextMessagePartProvider.d.ts +4 -7
  282. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  283. package/dist/react/providers/TextMessagePartProvider.js +5 -1
  284. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  285. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +4 -7
  286. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  287. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +4 -8
  288. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  289. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +210 -219
  290. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  291. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +70 -46
  292. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  293. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +186 -198
  294. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  295. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +13 -4
  296. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  297. package/dist/react/runtimes/RemoteThreadResource.d.ts +17 -23
  298. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  299. package/dist/react/runtimes/RemoteThreadResource.js +3 -1
  300. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  301. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +10 -11
  302. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  303. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +11 -14
  304. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -1
  305. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +6 -8
  306. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  307. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +9 -2
  308. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -1
  309. package/dist/react/runtimes/assistant-transport/runManager.d.ts +9 -12
  310. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  311. package/dist/react/runtimes/assistant-transport/runManager.js +4 -1
  312. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
  313. package/dist/react/runtimes/assistant-transport/types.d.ts +123 -118
  314. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -1
  315. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +7 -10
  316. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  317. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +17 -6
  318. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  319. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +3 -6
  320. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -1
  321. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +2 -5
  322. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -1
  323. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +7 -10
  324. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  325. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +426 -216
  326. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  327. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +15 -18
  328. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  329. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +8 -4
  330. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  331. package/dist/react/runtimes/cloud/auiV0.d.ts +146 -125
  332. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  333. package/dist/react/runtimes/cloud/auiV0.js +120 -8
  334. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  335. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +13 -15
  336. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  337. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +5 -7
  338. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -1
  339. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +2 -5
  340. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -1
  341. package/dist/react/runtimes/cloud/sdkIdentity.js +1 -1
  342. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +3 -6
  343. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  344. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +9 -11
  345. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  346. package/dist/react/runtimes/createMessageConverter.d.ts +15 -19
  347. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  348. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  349. package/dist/react/runtimes/createRuntimeExtras.d.ts +14 -17
  350. package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
  351. package/dist/react/runtimes/external-message-converter.d.ts +17 -21
  352. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  353. package/dist/react/runtimes/external-store-history-copy.d.ts +25 -0
  354. package/dist/react/runtimes/external-store-history-copy.d.ts.map +1 -0
  355. package/dist/react/runtimes/external-store-history-copy.js +148 -0
  356. package/dist/react/runtimes/external-store-history-copy.js.map +1 -0
  357. package/dist/react/runtimes/useExternalStoreRuntime.d.ts +3 -6
  358. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  359. package/dist/react/runtimes/useExternalStoreRuntime.js +72 -35
  360. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  361. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +2 -5
  362. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
  363. package/dist/react/runtimes/useLocalRuntime.d.ts +29 -41
  364. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  365. package/dist/react/runtimes/useLocalRuntime.js +142 -34
  366. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  367. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +3 -6
  368. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  369. package/dist/react/runtimes/useRemoteThreadListRuntime.js +2 -2
  370. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  371. package/dist/react/runtimes/useRuntimeAdapters.d.ts +5 -7
  372. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -1
  373. package/dist/react/runtimes/useStreamingTiming.d.ts +4 -6
  374. package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
  375. package/dist/react/types/MessagePartComponentTypes.d.ts +72 -70
  376. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  377. package/dist/react/types/scopes/dataRenderers.d.ts +11 -15
  378. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  379. package/dist/react/types/scopes/interactables.d.ts +60 -60
  380. package/dist/react/types/scopes/interactables.d.ts.map +1 -1
  381. package/dist/react/types/scopes/tools.d.ts +21 -24
  382. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  383. package/dist/react/types/store-augmentation.d.ts +10 -11
  384. package/dist/react/types/store-augmentation.d.ts.map +1 -1
  385. package/dist/react/utils/getMessageQuote.d.ts +6 -8
  386. package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
  387. package/dist/react/utils/groupParts.d.ts +35 -37
  388. package/dist/react/utils/groupParts.d.ts.map +1 -1
  389. package/dist/react/utils/useJSONEqual.d.ts +3 -6
  390. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  391. package/dist/react/utils/useJSONSchemaDependency.d.ts +3 -6
  392. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -1
  393. package/dist/runtime/api/assistant-runtime.d.ts +28 -31
  394. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  395. package/dist/runtime/api/attachment-runtime.d.ts +51 -49
  396. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  397. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  398. package/dist/runtime/api/bindings.d.ts +35 -35
  399. package/dist/runtime/api/bindings.d.ts.map +1 -1
  400. package/dist/runtime/api/composer-runtime.d.ts +215 -201
  401. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  402. package/dist/runtime/api/composer-runtime.js +4 -0
  403. package/dist/runtime/api/composer-runtime.js.map +1 -1
  404. package/dist/runtime/api/message-part-runtime.d.ts +31 -30
  405. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  406. package/dist/runtime/api/message-part-runtime.js +25 -2
  407. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  408. package/dist/runtime/api/message-runtime.d.ts +87 -82
  409. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  410. package/dist/runtime/api/message-runtime.js +4 -3
  411. package/dist/runtime/api/message-runtime.js.map +1 -1
  412. package/dist/runtime/api/paths.d.ts +54 -57
  413. package/dist/runtime/api/paths.d.ts.map +1 -1
  414. package/dist/runtime/api/thread-list-item-runtime.d.ts +70 -72
  415. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  416. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  417. package/dist/runtime/api/thread-list-runtime.d.ts +77 -81
  418. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  419. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  420. package/dist/runtime/api/thread-runtime.d.ts +306 -308
  421. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  422. package/dist/runtime/api/thread-runtime.js +2 -1
  423. package/dist/runtime/api/thread-runtime.js.map +1 -1
  424. package/dist/runtime/base/base-assistant-runtime-core.d.ts +9 -12
  425. package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
  426. package/dist/runtime/base/base-composer-runtime-core.d.ts +150 -101
  427. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  428. package/dist/runtime/base/base-composer-runtime-core.js +400 -122
  429. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  430. package/dist/runtime/base/base-thread-runtime-core.d.ts +121 -104
  431. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  432. package/dist/runtime/base/base-thread-runtime-core.js +174 -62
  433. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  434. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +30 -31
  435. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  436. package/dist/runtime/base/default-edit-composer-runtime-core.js +21 -2
  437. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  438. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +28 -31
  439. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  440. package/dist/runtime/base/default-thread-composer-runtime-core.js +23 -2
  441. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  442. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +15 -18
  443. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
  444. package/dist/runtime/interfaces/assistant-runtime-core.d.ts +8 -11
  445. package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
  446. package/dist/runtime/interfaces/composer-runtime-core.d.ts +98 -83
  447. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  448. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +67 -70
  449. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  450. package/dist/runtime/interfaces/thread-runtime-core.d.ts +225 -211
  451. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  452. package/dist/runtime/internal.d.ts +25 -20
  453. package/dist/runtime/internal.d.ts.map +1 -0
  454. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +37 -40
  455. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  456. package/dist/runtime/queue/message-queue.d.ts +32 -33
  457. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  458. package/dist/runtime/queue/message-queue.js +10 -2
  459. package/dist/runtime/queue/message-queue.js.map +1 -1
  460. package/dist/runtime/queue/queue-item.d.ts +7 -10
  461. package/dist/runtime/queue/queue-item.d.ts.map +1 -1
  462. package/dist/runtime/utils/abortable-thread-load.d.ts +9 -11
  463. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -1
  464. package/dist/runtime/utils/attachment-add-operations.d.ts +16 -15
  465. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -1
  466. package/dist/runtime/utils/attachment-add-operations.js +24 -2
  467. package/dist/runtime/utils/attachment-add-operations.js.map +1 -1
  468. package/dist/runtime/utils/attachment-send-operations.d.ts +12 -0
  469. package/dist/runtime/utils/attachment-send-operations.d.ts.map +1 -0
  470. package/dist/runtime/utils/attachment-send-operations.js +34 -0
  471. package/dist/runtime/utils/attachment-send-operations.js.map +1 -0
  472. package/dist/runtime/utils/auto-status.d.ts +11 -13
  473. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  474. package/dist/runtime/utils/auto-status.js +3 -5
  475. package/dist/runtime/utils/auto-status.js.map +1 -1
  476. package/dist/runtime/utils/chat-model-adapter.d.ts +31 -33
  477. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  478. package/dist/runtime/utils/external-message-conversion.d.ts +47 -48
  479. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  480. package/dist/runtime/utils/external-message-conversion.js +6 -5
  481. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  482. package/dist/runtime/utils/external-store-message.d.ts +6 -9
  483. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  484. package/dist/runtime/utils/message-repository-session.d.ts +24 -27
  485. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -1
  486. package/dist/runtime/utils/message-repository.d.ts +52 -54
  487. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  488. package/dist/runtime/utils/message-repository.js +8 -7
  489. package/dist/runtime/utils/message-repository.js.map +1 -1
  490. package/dist/runtime/utils/pending-tool-calls.d.ts +12 -14
  491. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -1
  492. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +7 -10
  493. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  494. package/dist/runtime/utils/runtime-extras-brand.d.ts +6 -9
  495. package/dist/runtime/utils/runtime-extras-brand.d.ts.map +1 -1
  496. package/dist/runtime/utils/stored-message-parts.d.ts +21 -0
  497. package/dist/runtime/utils/stored-message-parts.d.ts.map +1 -0
  498. package/dist/runtime/utils/stored-message-parts.js +103 -0
  499. package/dist/runtime/utils/stored-message-parts.js.map +1 -0
  500. package/dist/runtime/utils/streaming-timing.d.ts +23 -26
  501. package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
  502. package/dist/runtime/utils/thread-message-like.d.ts +38 -34
  503. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  504. package/dist/runtime/utils/thread-message-like.js +16 -6
  505. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  506. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +5 -7
  507. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -1
  508. package/dist/runtime/utils/thread-runtime-lifecycle.js +31 -4
  509. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -1
  510. package/dist/runtime/utils/tool-call-tree.d.ts +10 -13
  511. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -1
  512. package/dist/runtime/utils/tool-interactions.d.ts +10 -0
  513. package/dist/runtime/utils/tool-interactions.d.ts.map +1 -0
  514. package/dist/runtime/utils/tool-interactions.js +92 -0
  515. package/dist/runtime/utils/tool-interactions.js.map +1 -0
  516. package/dist/runtimes/assistant-transport/utils.d.ts +1 -4
  517. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  518. package/dist/runtimes/external-store/external-store-adapter.d.ts +220 -200
  519. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  520. package/dist/runtimes/external-store/external-store-runtime-core.d.ts +6 -8
  521. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
  522. package/dist/runtimes/external-store/external-store-runtime-core.js +4 -1
  523. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  524. package/dist/runtimes/external-store/external-store-shared-options.d.ts +3 -6
  525. package/dist/runtimes/external-store/external-store-shared-options.d.ts.map +1 -1
  526. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +40 -43
  527. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  528. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +2 -2
  529. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  530. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +119 -125
  531. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  532. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +71 -18
  533. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  534. package/dist/runtimes/external-store/thread-message-converter.d.ts +5 -8
  535. package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
  536. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +96 -98
  537. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  538. package/dist/runtimes/inert/InertThreadRuntimeCore.js +3 -0
  539. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  540. package/dist/runtimes/internal.d.ts +20 -16
  541. package/dist/runtimes/internal.d.ts.map +1 -0
  542. package/dist/runtimes/local/local-runtime-core.d.ts +7 -10
  543. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
  544. package/dist/runtimes/local/local-runtime-options.d.ts +41 -44
  545. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  546. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +42 -45
  547. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
  548. package/dist/runtimes/local/local-thread-runtime-core.d.ts +94 -93
  549. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  550. package/dist/runtimes/local/local-thread-runtime-core.js +220 -29
  551. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  552. package/dist/runtimes/local/should-continue.d.ts +2 -5
  553. package/dist/runtimes/local/should-continue.d.ts.map +1 -1
  554. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +77 -55
  555. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  556. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +28 -1
  557. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  558. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +12 -15
  559. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  560. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +3 -6
  561. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -1
  562. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +2 -5
  563. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  564. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +34 -31
  565. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  566. package/dist/runtimes/remote-thread-list/optimistic-state.js +8 -3
  567. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  568. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +60 -63
  569. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  570. package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -1
  571. package/dist/runtimes/remote-thread-list/title-generation.d.ts +31 -33
  572. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -1
  573. package/dist/runtimes/remote-thread-list/title.d.ts +5 -8
  574. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  575. package/dist/runtimes/remote-thread-list/types.d.ts +119 -121
  576. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  577. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +147 -149
  578. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  579. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +22 -7
  580. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  581. package/dist/store/clients/chain-of-thought-client.d.ts +8 -11
  582. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  583. package/dist/store/clients/external-thread.d.ts +56 -58
  584. package/dist/store/clients/external-thread.d.ts.map +1 -1
  585. package/dist/store/clients/external-thread.js +1270 -741
  586. package/dist/store/clients/external-thread.js.map +1 -1
  587. package/dist/store/clients/model-context-client.d.ts +2 -5
  588. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  589. package/dist/store/clients/no-op-composer-client.d.ts +3 -6
  590. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  591. package/dist/store/clients/no-op-composer-client.js +3 -1
  592. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  593. package/dist/store/clients/runtime-adapter.d.ts +2 -5
  594. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  595. package/dist/store/clients/single-thread-list.d.ts +4 -6
  596. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  597. package/dist/store/clients/submission-message.d.ts +8 -0
  598. package/dist/store/clients/submission-message.d.ts.map +1 -0
  599. package/dist/store/clients/submission-message.js +22 -0
  600. package/dist/store/clients/submission-message.js.map +1 -0
  601. package/dist/store/clients/suggestions.d.ts +8 -11
  602. package/dist/store/clients/suggestions.d.ts.map +1 -1
  603. package/dist/store/clients/thread-message-client.d.ts +12 -12
  604. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  605. package/dist/store/clients/thread-message-client.js +81 -82
  606. package/dist/store/clients/thread-message-client.js.map +1 -1
  607. package/dist/store/clients/thread-selection-events.d.ts +1 -4
  608. package/dist/store/clients/thread-selection-events.d.ts.map +1 -1
  609. package/dist/store/clients/thread-tasks.d.ts +7 -10
  610. package/dist/store/clients/thread-tasks.d.ts.map +1 -1
  611. package/dist/store/env.d.ts +1 -4
  612. package/dist/store/env.d.ts.map +1 -1
  613. package/dist/store/index.d.ts +33 -36
  614. package/dist/store/index.d.ts.map +1 -0
  615. package/dist/store/index.js +5 -5
  616. package/dist/store/internal.d.ts +12 -12
  617. package/dist/store/internal.d.ts.map +1 -0
  618. package/dist/store/internal.js +2 -2
  619. package/dist/store/primitive-predicates.d.ts +14 -16
  620. package/dist/store/primitive-predicates.d.ts.map +1 -1
  621. package/dist/store/primitive-predicates.js +10 -5
  622. package/dist/store/primitive-predicates.js.map +1 -1
  623. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +4 -7
  624. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  625. package/dist/store/runtime-clients/composer-runtime-client.d.ts +11 -14
  626. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  627. package/dist/store/runtime-clients/composer-runtime-client.js +65 -62
  628. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  629. package/dist/store/runtime-clients/handle-runtime-action.d.ts +1 -4
  630. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
  631. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +1 -4
  632. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -1
  633. package/dist/store/runtime-clients/liveRef.d.ts +2 -5
  634. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
  635. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +4 -7
  636. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  637. package/dist/store/runtime-clients/message-part-runtime-client.js +26 -16
  638. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  639. package/dist/store/runtime-clients/message-runtime-client.d.ts +10 -11
  640. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  641. package/dist/store/runtime-clients/message-runtime-client.js +121 -113
  642. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  643. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +5 -8
  644. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  645. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +6 -9
  646. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  647. package/dist/store/runtime-clients/thread-runtime-client.d.ts +4 -7
  648. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  649. package/dist/store/runtime-clients/thread-runtime-client.js +221 -158
  650. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  651. package/dist/store/runtime-clients/useSubscribable.d.ts +3 -6
  652. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  653. package/dist/store/scope-registration.d.ts +28 -29
  654. package/dist/store/scope-registration.d.ts.map +1 -1
  655. package/dist/store/scopes/attachment.d.ts +19 -22
  656. package/dist/store/scopes/attachment.d.ts.map +1 -1
  657. package/dist/store/scopes/chain-of-thought.d.ts +33 -35
  658. package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
  659. package/dist/store/scopes/composer.d.ts +147 -135
  660. package/dist/store/scopes/composer.d.ts.map +1 -1
  661. package/dist/store/scopes/message.d.ts +119 -112
  662. package/dist/store/scopes/message.d.ts.map +1 -1
  663. package/dist/store/scopes/model-context.d.ts +10 -13
  664. package/dist/store/scopes/model-context.d.ts.map +1 -1
  665. package/dist/store/scopes/part.d.ts +53 -50
  666. package/dist/store/scopes/part.d.ts.map +1 -1
  667. package/dist/store/scopes/queue-item.d.ts +21 -23
  668. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  669. package/dist/store/scopes/suggestion.d.ts +14 -17
  670. package/dist/store/scopes/suggestion.d.ts.map +1 -1
  671. package/dist/store/scopes/suggestions.d.ts +18 -21
  672. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  673. package/dist/store/scopes/task.d.ts +27 -30
  674. package/dist/store/scopes/task.d.ts.map +1 -1
  675. package/dist/store/scopes/thread-list-item.d.ts +68 -71
  676. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  677. package/dist/store/scopes/thread.d.ts +197 -200
  678. package/dist/store/scopes/thread.d.ts.map +1 -1
  679. package/dist/store/scopes/threads.d.ts +49 -52
  680. package/dist/store/scopes/threads.d.ts.map +1 -1
  681. package/dist/subscribable/subscribable.d.ts +73 -69
  682. package/dist/subscribable/subscribable.d.ts.map +1 -1
  683. package/dist/subscribable/subscribable.js +35 -7
  684. package/dist/subscribable/subscribable.js.map +1 -1
  685. package/dist/types/attachment.d.ts +35 -37
  686. package/dist/types/attachment.d.ts.map +1 -1
  687. package/dist/types/augmentations.d.ts +7 -8
  688. package/dist/types/augmentations.d.ts.map +1 -1
  689. package/dist/types/directive.d.ts +13 -16
  690. package/dist/types/directive.d.ts.map +1 -1
  691. package/dist/types/error.d.ts +15 -17
  692. package/dist/types/error.d.ts.map +1 -1
  693. package/dist/types/index.d.ts +7 -7
  694. package/dist/types/index.d.ts.map +1 -0
  695. package/dist/types/message.d.ts +358 -318
  696. package/dist/types/message.d.ts.map +1 -1
  697. package/dist/types/message.js.map +1 -1
  698. package/dist/types/quote.d.ts +3 -6
  699. package/dist/types/quote.d.ts.map +1 -1
  700. package/dist/types/trigger.d.ts +10 -13
  701. package/dist/types/trigger.d.ts.map +1 -1
  702. package/dist/types/unsubscribe.d.ts +1 -4
  703. package/dist/types/unsubscribe.d.ts.map +1 -1
  704. package/dist/utils/abortable-iterable.d.ts +2 -5
  705. package/dist/utils/abortable-iterable.d.ts.map +1 -1
  706. package/dist/utils/composite-context-provider.d.ts +9 -13
  707. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  708. package/dist/utils/data-url.d.ts +16 -19
  709. package/dist/utils/data-url.d.ts.map +1 -1
  710. package/dist/utils/getGroupStatus.d.ts +19 -21
  711. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  712. package/dist/utils/id.d.ts +3 -6
  713. package/dist/utils/id.d.ts.map +1 -1
  714. package/dist/utils/image-media-type.d.ts +1 -4
  715. package/dist/utils/image-media-type.d.ts.map +1 -1
  716. package/dist/utils/invoke-user-callback.d.ts +1 -4
  717. package/dist/utils/invoke-user-callback.d.ts.map +1 -1
  718. package/dist/utils/json/is-json-equal.d.ts +1 -4
  719. package/dist/utils/json/is-json-equal.d.ts.map +1 -1
  720. package/dist/utils/json/is-json.d.ts +5 -8
  721. package/dist/utils/json/is-json.d.ts.map +1 -1
  722. package/dist/utils/json/stable-stringify-tool-args.d.ts +3 -6
  723. package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -1
  724. package/dist/utils/normalizePartStatus.d.ts +6 -8
  725. package/dist/utils/normalizePartStatus.d.ts.map +1 -1
  726. package/dist/utils/normalizePartStatus.js +3 -2
  727. package/dist/utils/normalizePartStatus.js.map +1 -1
  728. package/dist/utils/notify-event-listeners.d.ts +2 -4
  729. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  730. package/dist/utils/record.d.ts +1 -4
  731. package/dist/utils/record.d.ts.map +1 -1
  732. package/dist/utils/silent-runtime-action.d.ts +2 -5
  733. package/dist/utils/silent-runtime-action.d.ts.map +1 -1
  734. package/dist/utils/text.d.ts +2 -5
  735. package/dist/utils/text.d.ts.map +1 -1
  736. package/dist/utils/wire-media.d.ts +3 -6
  737. package/dist/utils/wire-media.d.ts.map +1 -1
  738. package/package.json +15 -13
  739. package/src/adapters/attachment.test.ts +98 -1
  740. package/src/adapters/attachment.ts +77 -20
  741. package/src/adapters/feedback.ts +1 -0
  742. package/src/adapters/speech.test.ts +94 -0
  743. package/src/adapters/speech.ts +16 -2
  744. package/src/adapters/thread-history.ts +16 -5
  745. package/src/adapters/voice.test.ts +169 -0
  746. package/src/adapters/voice.ts +25 -4
  747. package/src/index.ts +14 -2
  748. package/src/internal.ts +7 -0
  749. package/src/model-context/frame/host.test.ts +51 -1
  750. package/src/model-context/frame/host.ts +3 -1
  751. package/src/model-context/frame/provider.test.ts +106 -20
  752. package/src/model-context/frame/provider.ts +8 -1
  753. package/src/model-context/frame/validate.ts +57 -0
  754. package/src/model-context/interactable-composer-metadata.test.ts +82 -0
  755. package/src/model-context/interactable-composer-metadata.ts +45 -2
  756. package/src/react/RuntimeAdapter.test.ts +4 -1
  757. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +711 -0
  758. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +125 -109
  759. package/src/react/client/Interactables.test.ts +865 -8
  760. package/src/react/client/Interactables.ts +325 -45
  761. package/src/react/client/RemoteThreadList.concurrent.test.tsx +9 -3
  762. package/src/react/client/RemoteThreadList.initialize-failure.test.ts +124 -0
  763. package/src/react/client/RemoteThreadList.test.ts +5 -6
  764. package/src/react/client/RemoteThreadList.ts +6 -0
  765. package/src/react/client/Tools.ts +2 -3
  766. package/src/react/client/interactable-model-context.test.ts +56 -13
  767. package/src/react/client/interactable-model-context.ts +48 -23
  768. package/src/react/index.ts +2 -2
  769. package/src/react/interactables-legacy/Interactables.test.ts +221 -4
  770. package/src/react/interactables-legacy/Interactables.ts +25 -14
  771. package/src/react/interactables-legacy/interactable-model-context.ts +26 -24
  772. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +40 -22
  773. package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +22 -2
  774. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +63 -11
  775. package/src/react/model-context/useInteractable.test.tsx +56 -29
  776. package/src/react/primitive-hooks/useActionBarCopy.test.ts +5 -5
  777. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +33 -0
  778. package/src/react/primitive-hooks/useSuggestionTrigger.ts +7 -4
  779. package/src/react/primitives/generativeUI/GenerativeUI.test.tsx +170 -0
  780. package/src/react/primitives/generativeUI/GenerativeUI.tsx +43 -28
  781. package/src/react/primitives/message/MessageAttachments.test.tsx +2 -6
  782. package/src/react/primitives/message/MessageAttachments.tsx +14 -8
  783. package/src/react/primitives/message/MessageGroupedParts.test.tsx +155 -8
  784. package/src/react/primitives/message/MessageGroupedParts.tsx +19 -6
  785. package/src/react/primitives/message/MessageParts.test.tsx +84 -0
  786. package/src/react/primitives/message/MessageParts.tool-interaction.test.tsx +69 -0
  787. package/src/react/primitives/message/MessageParts.tsx +29 -8
  788. package/src/react/primitives/thread/ThreadMessages.test.tsx +25 -7
  789. package/src/react/primitives/thread/ThreadSuggestions.test.tsx +97 -0
  790. package/src/react/primitives/thread/ThreadSuggestions.tsx +29 -6
  791. package/src/react/providers/ReadonlyThreadProvider.tsx +2 -2
  792. package/src/react/providers/TextMessagePartProvider.tsx +3 -0
  793. package/src/react/runtimes/RemoteThreadListHookInstanceManager.layout.test.tsx +62 -0
  794. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +2 -2
  795. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +93 -0
  796. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +181 -21
  797. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +62 -17
  798. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +112 -77
  799. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +19 -3
  800. package/src/react/runtimes/RemoteThreadResource.ts +5 -2
  801. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +3 -1
  802. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +10 -2
  803. package/src/react/runtimes/assistant-transport/runManager.ts +3 -0
  804. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +57 -0
  805. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +73 -46
  806. package/src/react/runtimes/assistant-transport/transport-thread-id.test.tsx +571 -0
  807. package/src/react/runtimes/assistant-transport/types.ts +9 -1
  808. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +10 -0
  809. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +108 -1
  810. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +33 -9
  811. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.copy.integration.test.tsx +289 -0
  812. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.copy.test.tsx +471 -0
  813. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.engagement.test.tsx +330 -0
  814. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +78 -2
  815. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +463 -2
  816. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +595 -227
  817. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +33 -4
  818. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +7 -3
  819. package/src/react/runtimes/cloud/auiV0.ts +275 -6
  820. package/src/react/runtimes/cloud/auiV0DecodeSafely.test.ts +873 -0
  821. package/src/react/runtimes/createMessageConverter.ts +9 -3
  822. package/src/react/runtimes/external-message-converter.test.ts +7 -3
  823. package/src/react/runtimes/external-store-history-copy.ts +223 -0
  824. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +2 -1
  825. package/src/react/runtimes/useExternalStoreRuntime.history-copy.test.tsx +483 -0
  826. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +84 -3
  827. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +6 -2
  828. package/src/react/runtimes/useExternalStoreRuntime.ts +25 -5
  829. package/src/react/runtimes/useLocalRuntime.test.tsx +145 -1
  830. package/src/react/runtimes/useLocalRuntime.ts +8 -5
  831. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +84 -4
  832. package/src/react/runtimes/useRemoteThreadListRuntime.ts +5 -1
  833. package/src/react/types/MessagePartComponentTypes.ts +10 -0
  834. package/src/react/types/scopes/interactables.ts +3 -0
  835. package/src/runtime/api/attachment-runtime.ts +10 -5
  836. package/src/runtime/api/bindings.ts +6 -1
  837. package/src/runtime/api/composer-runtime.ts +29 -6
  838. package/src/runtime/api/message-part-runtime.test.ts +215 -0
  839. package/src/runtime/api/message-part-runtime.ts +44 -1
  840. package/src/runtime/api/message-runtime.test.ts +112 -2
  841. package/src/runtime/api/message-runtime.ts +25 -7
  842. package/src/runtime/api/thread-list-item-runtime.ts +5 -5
  843. package/src/runtime/api/thread-list-runtime.ts +3 -3
  844. package/src/runtime/api/thread-runtime.test.ts +59 -0
  845. package/src/runtime/api/thread-runtime.ts +21 -11
  846. package/src/runtime/base/base-composer-runtime-core.ts +548 -153
  847. package/src/runtime/base/base-thread-runtime-core.test.ts +1614 -136
  848. package/src/runtime/base/base-thread-runtime-core.ts +236 -46
  849. package/src/runtime/base/default-edit-composer-runtime-core.ts +24 -2
  850. package/src/runtime/base/default-thread-composer-runtime-core.ts +33 -3
  851. package/src/runtime/interfaces/composer-runtime-core.ts +19 -0
  852. package/src/runtime/interfaces/thread-runtime-core.ts +24 -1
  853. package/src/runtime/queue/message-queue.ts +11 -1
  854. package/src/runtime/utils/attachment-add-operations.ts +45 -2
  855. package/src/runtime/utils/attachment-send-operations.ts +54 -0
  856. package/src/runtime/utils/auto-status.test.ts +54 -0
  857. package/src/runtime/utils/auto-status.ts +3 -10
  858. package/src/runtime/utils/external-message-conversion.test.ts +91 -0
  859. package/src/runtime/utils/external-message-conversion.ts +9 -6
  860. package/src/runtime/utils/message-repository.test.ts +69 -1
  861. package/src/runtime/utils/message-repository.ts +14 -7
  862. package/src/runtime/utils/stored-message-parts.ts +216 -0
  863. package/src/runtime/utils/thread-message-like.test.ts +58 -0
  864. package/src/runtime/utils/thread-message-like.ts +79 -48
  865. package/src/runtime/utils/thread-runtime-lifecycle.test.ts +67 -0
  866. package/src/runtime/utils/thread-runtime-lifecycle.ts +42 -8
  867. package/src/runtime/utils/tool-interactions.test.ts +193 -0
  868. package/src/runtime/utils/tool-interactions.ts +147 -0
  869. package/src/runtimes/external-store/external-store-adapter.ts +25 -0
  870. package/src/runtimes/external-store/external-store-runtime-core.ts +10 -2
  871. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +2 -2
  872. package/src/runtimes/external-store/external-store-thread-runtime-core.test.ts +49 -0
  873. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +114 -32
  874. package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +127 -56
  875. package/src/runtimes/inert/InertThreadRuntimeCore.ts +10 -1
  876. package/src/runtimes/local/local-thread-runtime-core.edit-cancellation.test.ts +70 -0
  877. package/src/runtimes/local/local-thread-runtime-core.test.ts +1866 -169
  878. package/src/runtimes/local/local-thread-runtime-core.ts +365 -40
  879. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +53 -1
  880. package/src/runtimes/remote-thread-list/optimistic-state.ts +8 -3
  881. package/src/runtimes/tool-invocations/EDGE_CASES.md +19 -4
  882. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +392 -39
  883. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +31 -8
  884. package/src/store/clients/external-thread.test.ts +145 -0
  885. package/src/store/clients/external-thread.ts +669 -144
  886. package/src/store/clients/model-context-client.test.ts +8 -8
  887. package/src/store/clients/no-op-composer-client.ts +2 -0
  888. package/src/store/clients/submission-message.ts +27 -0
  889. package/src/store/clients/thread-message-client.test.ts +39 -0
  890. package/src/store/clients/thread-message-client.ts +13 -6
  891. package/src/store/index.ts +2 -2
  892. package/src/store/internal.ts +1 -0
  893. package/src/store/primitive-predicates.test.ts +119 -0
  894. package/src/store/primitive-predicates.ts +19 -4
  895. package/src/store/runtime-clients/composer-runtime-client.ts +4 -3
  896. package/src/store/runtime-clients/message-part-runtime-client.test.ts +42 -0
  897. package/src/store/runtime-clients/message-part-runtime-client.ts +4 -0
  898. package/src/store/runtime-clients/message-runtime-client.ts +5 -0
  899. package/src/store/runtime-clients/thread-runtime-client.test.tsx +243 -0
  900. package/src/store/runtime-clients/thread-runtime-client.ts +46 -9
  901. package/src/store/scopes/composer.ts +22 -4
  902. package/src/store/scopes/message.ts +12 -1
  903. package/src/store/scopes/part.ts +8 -0
  904. package/src/subscribable/subscribable.test.ts +205 -3
  905. package/src/subscribable/subscribable.ts +49 -7
  906. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +95 -1
  907. package/src/tests/attachment-adapters.test.ts +16 -1
  908. package/src/tests/auiV0Encode.test.ts +412 -1
  909. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +6 -6
  910. package/src/tests/base-composer-runtime-core-send.test.ts +722 -29
  911. package/src/tests/base-composer-runtime-core.test.ts +212 -5
  912. package/src/tests/composer-can-cancel.test.ts +35 -6
  913. package/src/tests/composer-can-send.test.ts +120 -1
  914. package/src/tests/composer-submission.test.tsx +796 -0
  915. package/src/tests/default-edit-composer-runtime-core.test.ts +149 -2
  916. package/src/tests/external-store-thread-list-runtime-core.test.ts +111 -0
  917. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +810 -28
  918. package/src/tests/external-store-thread-runtime-core.test.ts +217 -0
  919. package/src/tests/external-thread-attachments.test.tsx +763 -26
  920. package/src/tests/external-thread-feedback.test.tsx +20 -7
  921. package/src/tests/external-thread-isLast.test.tsx +69 -0
  922. package/src/tests/external-thread-parity.test.tsx +1 -1
  923. package/src/tests/get-thread-state-isRunning.test.ts +2 -2
  924. package/src/tests/message-queue.test.ts +45 -10
  925. package/src/tests/remote-thread-list-adapter-switch.test.ts +45 -1
  926. package/src/tests/thread-switch-events.test.tsx +11 -7
  927. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +2 -1
  928. package/src/types/message.test.ts +19 -0
  929. package/src/types/message.ts +65 -10
  930. package/src/utils/normalizePartStatus.ts +14 -1
  931. package/dist/tests/remote-thread-list-test-helpers.d.ts +0 -16
  932. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +0 -1
  933. package/dist/tests/remote-thread-list-test-helpers.js +0 -59
  934. package/dist/tests/remote-thread-list-test-helpers.js.map +0 -1
@@ -3,13 +3,19 @@ import {
3
3
  ExternalStoreThreadRuntimeCore,
4
4
  hasUpcomingMessage,
5
5
  } from "../runtimes/external-store/external-store-thread-runtime-core";
6
+ import { ExternalStoreRuntimeCore } from "../runtimes/external-store/external-store-runtime-core";
6
7
  import type { ExternalStoreAdapter } from "../runtimes/external-store/external-store-adapter";
7
8
  import type { RealtimeVoiceAdapter } from "../adapters/voice";
8
9
  import type { ModelContextProvider } from "../model-context/types";
9
- import type { AppendMessage, ThreadMessage } from "../types/message";
10
+ import type {
11
+ AppendMessage,
12
+ ThreadAssistantMessage,
13
+ ThreadMessage,
14
+ } from "../types/message";
10
15
  import { createMessageQueue } from "../runtime/queue/message-queue";
11
16
  import { getThreadMessageText } from "../utils/text";
12
17
  import { invalidateThreadRuntime } from "../runtime/utils/thread-runtime-lifecycle";
18
+ import { MessageRepository } from "../runtime/utils/message-repository";
13
19
 
14
20
  const createContextProvider = (): ModelContextProvider => ({
15
21
  getModelContext: () => ({}),
@@ -27,21 +33,23 @@ const createUserMessage = (id: string, text = "Hello"): ThreadMessage =>
27
33
  },
28
34
  }) as ThreadMessage;
29
35
 
30
- const createAssistantMessage = (id: string, text = "Hi there"): ThreadMessage =>
31
- ({
32
- id,
33
- role: "assistant" as const,
34
- createdAt: new Date(),
35
- content: [{ type: "text" as const, text }],
36
- status: { type: "complete" as const, reason: "stop" as const },
37
- metadata: {
38
- unstable_state: null,
39
- unstable_annotations: [],
40
- unstable_data: [],
41
- steps: [],
42
- custom: {},
43
- },
44
- }) as ThreadMessage;
36
+ const createAssistantMessage = (
37
+ id: string,
38
+ text = "Hi there",
39
+ ): ThreadAssistantMessage => ({
40
+ id,
41
+ role: "assistant" as const,
42
+ createdAt: new Date(),
43
+ content: [{ type: "text" as const, text }],
44
+ status: { type: "complete" as const, reason: "stop" as const },
45
+ metadata: {
46
+ unstable_state: null,
47
+ unstable_annotations: [],
48
+ unstable_data: [],
49
+ steps: [],
50
+ custom: {},
51
+ },
52
+ });
45
53
 
46
54
  const createBaseAdapter = (
47
55
  overrides: Partial<ExternalStoreAdapter<ThreadMessage>> = {},
@@ -457,6 +465,63 @@ describe("ExternalStoreThreadRuntimeCore adapter contract", () => {
457
465
  expect(lastCall).toEqual([]);
458
466
  });
459
467
 
468
+ it.each([
469
+ { label: "without setMessages", withSetMessages: false, ids: ["u1"] },
470
+ { label: "with setMessages", withSetMessages: true, ids: [] },
471
+ ])(
472
+ "publishes only resolvable messages through the rollback $label",
473
+ async ({ withSetMessages, ids }) => {
474
+ const setMessages = vi.fn();
475
+ const adapter = () =>
476
+ createBaseAdapter({
477
+ messages: [createUserMessage("u1", "cancel me")],
478
+ isRunning: true,
479
+ onCancel: vi.fn(),
480
+ ...(withSetMessages && { setMessages }),
481
+ });
482
+ const core = new ExternalStoreThreadRuntimeCore(
483
+ contextProvider,
484
+ adapter(),
485
+ );
486
+ const unresolved = () =>
487
+ core.messages
488
+ .filter((m) => !core.getMessageById(m.id))
489
+ .map((m) => m.id);
490
+ expect(core.messages).toHaveLength(2);
491
+
492
+ core.cancelRun();
493
+ expect(unresolved()).toEqual([]);
494
+
495
+ core.__internal_setAdapter(adapter());
496
+ expect(unresolved()).toEqual([]);
497
+
498
+ await new Promise((resolve) => setTimeout(resolve, 0));
499
+ expect(unresolved()).toEqual([]);
500
+ expect(core.messages.map((m) => m.id)).toEqual(ids);
501
+ },
502
+ );
503
+
504
+ it("keeps the published messages array when cancel rolls nothing back", async () => {
505
+ const messages = [createUserMessage("u1"), createAssistantMessage("a1")];
506
+ const adapter = () =>
507
+ createBaseAdapter({
508
+ messages: [...messages],
509
+ isRunning: true,
510
+ onCancel: vi.fn(),
511
+ });
512
+ const core = new ExternalStoreThreadRuntimeCore(
513
+ contextProvider,
514
+ adapter(),
515
+ );
516
+ core.__internal_setAdapter(adapter());
517
+ const published = core.messages;
518
+
519
+ core.cancelRun();
520
+ await new Promise((resolve) => setTimeout(resolve, 0));
521
+
522
+ expect(core.messages).toBe(published);
523
+ });
524
+
460
525
  it("evicts an empty optimistic head on cancel", async () => {
461
526
  const optimisticAssistant = {
462
527
  ...createAssistantMessage("server-msg", ""),
@@ -874,6 +939,63 @@ describe("ExternalStoreThreadRuntimeCore adapter contract", () => {
874
939
  expect(onUpdate).toHaveBeenCalled();
875
940
  });
876
941
 
942
+ it("stops running once a human-input request from streamCall is resumed", async () => {
943
+ const setToolStatuses = vi.fn();
944
+ const adapter = (messages: ThreadMessage[]) =>
945
+ createBaseAdapter({
946
+ unstable_enableToolInvocations: true,
947
+ isRunning: false,
948
+ setToolStatuses,
949
+ messages,
950
+ });
951
+ const core = new ExternalStoreThreadRuntimeCore(
952
+ {
953
+ getModelContext: () => ({
954
+ tools: {
955
+ confirm: {
956
+ parameters: { type: "object", properties: {} },
957
+ streamCall: async (_reader, { human }) => {
958
+ await human({ request: "confirm" });
959
+ },
960
+ },
961
+ },
962
+ }),
963
+ },
964
+ adapter([]),
965
+ );
966
+
967
+ core.__internal_setAdapter(
968
+ adapter([
969
+ {
970
+ ...createAssistantMessage("a1"),
971
+ status: { type: "requires-action", reason: "tool-calls" },
972
+ content: [
973
+ {
974
+ type: "tool-call",
975
+ toolCallId: "tc1",
976
+ toolName: "confirm",
977
+ args: {},
978
+ argsText: "{}",
979
+ },
980
+ ],
981
+ },
982
+ ]),
983
+ );
984
+ await vi.waitFor(() =>
985
+ expect(setToolStatuses).toHaveBeenLastCalledWith({
986
+ tc1: {
987
+ type: "interrupt",
988
+ payload: { type: "human", payload: { request: "confirm" } },
989
+ },
990
+ }),
991
+ );
992
+
993
+ core.resumeToolCall({ toolCallId: "tc1", payload: true });
994
+
995
+ expect(setToolStatuses).toHaveBeenLastCalledWith({});
996
+ expect(core.isRunning).toBe(false);
997
+ });
998
+
877
999
  it("mirrors the adapter running value when tool invocations are disabled", () => {
878
1000
  const core = new ExternalStoreThreadRuntimeCore(
879
1001
  contextProvider,
@@ -1303,7 +1425,12 @@ describe("ExternalStoreThreadRuntimeCore adapter contract", () => {
1303
1425
  });
1304
1426
 
1305
1427
  describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1306
- const createVoiceAdapter = () => {
1428
+ const createVoiceAdapter = ({
1429
+ sendText,
1430
+ }: { sendText?: RealtimeVoiceAdapter.Session["sendText"] } = {}) => {
1431
+ let statusCallback:
1432
+ | ((status: RealtimeVoiceAdapter.Status) => void)
1433
+ | undefined;
1307
1434
  let transcriptCallback:
1308
1435
  | ((transcript: RealtimeVoiceAdapter.TranscriptItem) => void)
1309
1436
  | undefined;
@@ -1313,7 +1440,13 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1313
1440
  disconnect: vi.fn(),
1314
1441
  mute: vi.fn(),
1315
1442
  unmute: vi.fn(),
1316
- onStatusChange: () => () => {},
1443
+ ...(sendText && { sendText }),
1444
+ onStatusChange: (callback) => {
1445
+ statusCallback = callback;
1446
+ return () => {
1447
+ statusCallback = undefined;
1448
+ };
1449
+ },
1317
1450
  onTranscript: (callback) => {
1318
1451
  transcriptCallback = callback;
1319
1452
  return () => {
@@ -1325,17 +1458,20 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1325
1458
  };
1326
1459
  return {
1327
1460
  adapter: { connect: () => session } satisfies RealtimeVoiceAdapter,
1461
+ emitStatus: (status: RealtimeVoiceAdapter.Status) =>
1462
+ statusCallback?.(status),
1328
1463
  emitTranscript: (transcript: RealtimeVoiceAdapter.TranscriptItem) =>
1329
1464
  transcriptCallback?.(transcript),
1330
1465
  };
1331
1466
  };
1332
1467
 
1333
- const createVoiceCore = () => {
1468
+ const createVoiceCore = ({ commit = true }: { commit?: boolean } = {}) => {
1334
1469
  const voiceAdapter = createVoiceAdapter();
1335
1470
  const onNew = vi.fn(async () => {});
1336
1471
  const onEdit = vi.fn(async () => {});
1337
1472
  const onReload = vi.fn(async () => {});
1338
1473
  const onResume = vi.fn(async () => {});
1474
+ const onVoiceTranscript = vi.fn();
1339
1475
  const core = new ExternalStoreThreadRuntimeCore(
1340
1476
  createContextProvider(),
1341
1477
  createBaseAdapter({
@@ -1343,6 +1479,7 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1343
1479
  onEdit,
1344
1480
  onReload,
1345
1481
  onResume,
1482
+ onVoiceTranscript,
1346
1483
  adapters: { voice: voiceAdapter.adapter },
1347
1484
  }),
1348
1485
  );
@@ -1352,18 +1489,657 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1352
1489
  text: "Hello",
1353
1490
  isFinal: true,
1354
1491
  });
1492
+ const transcript = core.messages[0]!;
1493
+ if (commit) {
1494
+ core.__internal_setAdapter(
1495
+ createBaseAdapter({
1496
+ messages: [transcript],
1497
+ onNew,
1498
+ onEdit,
1499
+ onReload,
1500
+ onResume,
1501
+ onVoiceTranscript,
1502
+ adapters: { voice: voiceAdapter.adapter },
1503
+ }),
1504
+ );
1505
+ core.disconnectVoice();
1506
+ }
1355
1507
  return {
1356
1508
  core,
1357
1509
  onNew,
1358
1510
  onEdit,
1359
1511
  onReload,
1360
1512
  onResume,
1361
- transcriptId: core.messages[0]!.id,
1513
+ transcriptId: transcript.id,
1362
1514
  };
1363
1515
  };
1364
1516
 
1365
- it("rejects an edit resubmission of a transcript before reaching the store", async () => {
1366
- const { core, onNew, onEdit, transcriptId } = createVoiceCore();
1517
+ it("waits for a host import already in progress before committing a final transcript", async () => {
1518
+ const voiceAdapter = createVoiceAdapter();
1519
+ const onVoiceTranscript = vi.fn();
1520
+ const adapters = { voice: voiceAdapter.adapter };
1521
+ const core = new ExternalStoreThreadRuntimeCore(
1522
+ createContextProvider(),
1523
+ createBaseAdapter({
1524
+ isLoading: true,
1525
+ onVoiceTranscript,
1526
+ adapters,
1527
+ }),
1528
+ );
1529
+
1530
+ core.connectVoice();
1531
+ expect(core.voice).toBeDefined();
1532
+
1533
+ voiceAdapter.emitTranscript({
1534
+ role: "user",
1535
+ text: "Hello",
1536
+ isFinal: true,
1537
+ });
1538
+ await Promise.resolve();
1539
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1540
+
1541
+ core.__internal_setAdapter(
1542
+ createBaseAdapter({
1543
+ isLoading: false,
1544
+ onVoiceTranscript,
1545
+ adapters,
1546
+ }),
1547
+ );
1548
+ await vi.waitFor(() => {
1549
+ expect(onVoiceTranscript).toHaveBeenCalledOnce();
1550
+ });
1551
+
1552
+ core.disconnectVoice();
1553
+ });
1554
+
1555
+ it("keeps holding a final transcript when one load ends and the next begins in the same tick", async () => {
1556
+ const voiceAdapter = createVoiceAdapter();
1557
+ const onVoiceTranscript = vi.fn();
1558
+ const render = (isLoading: boolean) =>
1559
+ createBaseAdapter({
1560
+ isLoading,
1561
+ onVoiceTranscript,
1562
+ adapters: { voice: voiceAdapter.adapter },
1563
+ });
1564
+ const core = new ExternalStoreThreadRuntimeCore(
1565
+ createContextProvider(),
1566
+ render(true),
1567
+ );
1568
+ core.connectVoice();
1569
+
1570
+ voiceAdapter.emitTranscript({
1571
+ role: "user",
1572
+ text: "Hello",
1573
+ isFinal: true,
1574
+ });
1575
+ core.__internal_setAdapter(render(false));
1576
+ core.__internal_setAdapter(render(true));
1577
+ await Promise.resolve();
1578
+ await Promise.resolve();
1579
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1580
+
1581
+ core.__internal_setAdapter(render(false));
1582
+ await vi.waitFor(() => {
1583
+ expect(onVoiceTranscript).toHaveBeenCalledOnce();
1584
+ });
1585
+
1586
+ core.disconnectVoice();
1587
+ });
1588
+
1589
+ it("waits for a host import started after connection before committing a final transcript", async () => {
1590
+ const voiceAdapter = createVoiceAdapter();
1591
+ const onVoiceTranscript = vi.fn();
1592
+ const historyMessage = createUserMessage("history");
1593
+ const voiceAdapterOptions = {
1594
+ onVoiceTranscript,
1595
+ adapters: { voice: voiceAdapter.adapter },
1596
+ };
1597
+ const core = new ExternalStoreThreadRuntimeCore(
1598
+ createContextProvider(),
1599
+ createBaseAdapter(voiceAdapterOptions),
1600
+ );
1601
+ core.connectVoice();
1602
+
1603
+ core.__internal_setAdapter(
1604
+ createBaseAdapter({
1605
+ ...voiceAdapterOptions,
1606
+ isLoading: true,
1607
+ messages: [historyMessage],
1608
+ }),
1609
+ );
1610
+ voiceAdapter.emitTranscript({
1611
+ role: "user",
1612
+ text: "Hello",
1613
+ isFinal: true,
1614
+ });
1615
+ await Promise.resolve();
1616
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1617
+
1618
+ core.__internal_setAdapter(
1619
+ createBaseAdapter({
1620
+ ...voiceAdapterOptions,
1621
+ isLoading: false,
1622
+ messages: [historyMessage],
1623
+ }),
1624
+ );
1625
+ await vi.waitFor(() => {
1626
+ expect(onVoiceTranscript).toHaveBeenCalledOnce();
1627
+ });
1628
+
1629
+ core.disconnectVoice();
1630
+ });
1631
+
1632
+ it("waits for a host import started after connection before committing a typed turn", async () => {
1633
+ const sendText = vi.fn(async () => {});
1634
+ const voiceAdapter = createVoiceAdapter({ sendText });
1635
+ const onVoiceTranscript = vi.fn();
1636
+ const voiceAdapterOptions = {
1637
+ onVoiceTranscript,
1638
+ adapters: { voice: voiceAdapter.adapter },
1639
+ };
1640
+ const core = new ExternalStoreThreadRuntimeCore(
1641
+ createContextProvider(),
1642
+ createBaseAdapter(voiceAdapterOptions),
1643
+ );
1644
+ core.connectVoice();
1645
+ core.__internal_setAdapter(
1646
+ createBaseAdapter({
1647
+ ...voiceAdapterOptions,
1648
+ isLoading: true,
1649
+ }),
1650
+ );
1651
+
1652
+ let settled = false;
1653
+ const append = core.append({
1654
+ parentId: null,
1655
+ sourceId: null,
1656
+ role: "user",
1657
+ content: [{ type: "text", text: "Typed" }],
1658
+ attachments: [],
1659
+ metadata: { custom: {} },
1660
+ createdAt: new Date(),
1661
+ runConfig: {},
1662
+ });
1663
+ void append.finally(() => {
1664
+ settled = true;
1665
+ });
1666
+ await vi.waitFor(() => {
1667
+ expect(sendText).toHaveBeenCalledExactlyOnceWith("Typed");
1668
+ });
1669
+ expect(settled).toBe(false);
1670
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1671
+
1672
+ core.__internal_setAdapter(
1673
+ createBaseAdapter({
1674
+ ...voiceAdapterOptions,
1675
+ isLoading: false,
1676
+ }),
1677
+ );
1678
+ await append;
1679
+
1680
+ expect(onVoiceTranscript).toHaveBeenCalledWith(
1681
+ expect.objectContaining({ role: "user" }),
1682
+ );
1683
+
1684
+ core.disconnectVoice();
1685
+ });
1686
+
1687
+ it("delivers a deferred transcript to the callback the host renders once loading ends", async () => {
1688
+ const voiceAdapter = createVoiceAdapter();
1689
+ const loadingVoiceTranscript = vi.fn();
1690
+ const loadedVoiceTranscript = vi.fn();
1691
+ const core = new ExternalStoreThreadRuntimeCore(
1692
+ createContextProvider(),
1693
+ createBaseAdapter({
1694
+ isLoading: true,
1695
+ onVoiceTranscript: loadingVoiceTranscript,
1696
+ adapters: { voice: voiceAdapter.adapter },
1697
+ }),
1698
+ );
1699
+ core.connectVoice();
1700
+
1701
+ voiceAdapter.emitTranscript({
1702
+ role: "user",
1703
+ text: "Hello",
1704
+ isFinal: true,
1705
+ });
1706
+ core.__internal_setAdapter(
1707
+ createBaseAdapter({
1708
+ isLoading: false,
1709
+ onVoiceTranscript: loadedVoiceTranscript,
1710
+ adapters: { voice: voiceAdapter.adapter },
1711
+ }),
1712
+ );
1713
+ await vi.waitFor(() => {
1714
+ expect(loadedVoiceTranscript).toHaveBeenCalledOnce();
1715
+ });
1716
+ expect(loadedVoiceTranscript).toHaveBeenCalledWith(
1717
+ expect.objectContaining({
1718
+ role: "user",
1719
+ content: [{ type: "text", text: "Hello" }],
1720
+ }),
1721
+ );
1722
+ expect(loadingVoiceTranscript).not.toHaveBeenCalled();
1723
+
1724
+ core.disconnectVoice();
1725
+ });
1726
+
1727
+ it("drops a deferred transcript when the host routes another conversation through one runtime", async () => {
1728
+ const voiceAdapter = createVoiceAdapter();
1729
+ const onVoiceTranscript = vi.fn();
1730
+ const core = new ExternalStoreThreadRuntimeCore(
1731
+ createContextProvider(),
1732
+ createBaseAdapter({
1733
+ isLoading: true,
1734
+ onVoiceTranscript,
1735
+ unstable_messageRepositoryInstance: new MessageRepository(),
1736
+ adapters: { voice: voiceAdapter.adapter },
1737
+ }),
1738
+ );
1739
+ core.connectVoice();
1740
+
1741
+ voiceAdapter.emitTranscript({
1742
+ role: "user",
1743
+ text: "Hello",
1744
+ isFinal: true,
1745
+ });
1746
+ core.__internal_setAdapter(
1747
+ createBaseAdapter({
1748
+ isLoading: false,
1749
+ onVoiceTranscript,
1750
+ unstable_messageRepositoryInstance: new MessageRepository(),
1751
+ adapters: { voice: voiceAdapter.adapter },
1752
+ }),
1753
+ );
1754
+ await Promise.resolve();
1755
+ await Promise.resolve();
1756
+
1757
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1758
+ expect(core.messages).toHaveLength(0);
1759
+
1760
+ core.disconnectVoice();
1761
+ });
1762
+
1763
+ it("drops a deferred transcript on the runtime the host switched away from", async () => {
1764
+ const voiceAdapter = createVoiceAdapter();
1765
+ const onVoiceTranscript = vi.fn();
1766
+ const render = (threadId: string, isLoading: boolean) =>
1767
+ createBaseAdapter({
1768
+ isLoading,
1769
+ onVoiceTranscript,
1770
+ adapters: { voice: voiceAdapter.adapter, threadList: { threadId } },
1771
+ });
1772
+ const runtime = new ExternalStoreRuntimeCore(render("thread-1", true));
1773
+ const thread = runtime.threads.getMainThreadRuntimeCore();
1774
+ thread.connectVoice();
1775
+
1776
+ voiceAdapter.emitTranscript({
1777
+ role: "user",
1778
+ text: "Hello",
1779
+ isFinal: true,
1780
+ });
1781
+ runtime.setAdapter(render("thread-2", false));
1782
+
1783
+ await vi.waitFor(() => {
1784
+ expect(thread.messages).toEqual([]);
1785
+ });
1786
+ expect(runtime.threads.getMainThreadRuntimeCore()).not.toBe(thread);
1787
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1788
+ expect(runtime.threads.getMainThreadRuntimeCore().messages).toHaveLength(0);
1789
+ // Loading never ends on the superseded runtime, so the invalidation alone
1790
+ // ended the wait.
1791
+ expect(thread.isLoading).toBe(true);
1792
+
1793
+ thread.disconnectVoice();
1794
+ });
1795
+
1796
+ it("resolves a typed turn deferred on the runtime the host switched away from", async () => {
1797
+ const sendText = vi.fn(async (_text: string) => {});
1798
+ const voiceAdapter = createVoiceAdapter({ sendText });
1799
+ const onVoiceTranscript = vi.fn();
1800
+ const render = (threadId: string, isLoading: boolean) =>
1801
+ createBaseAdapter({
1802
+ isLoading,
1803
+ onVoiceTranscript,
1804
+ adapters: { voice: voiceAdapter.adapter, threadList: { threadId } },
1805
+ });
1806
+ const runtime = new ExternalStoreRuntimeCore(render("thread-1", true));
1807
+ const thread = runtime.threads.getMainThreadRuntimeCore();
1808
+ thread.connectVoice();
1809
+
1810
+ const append = thread.append({
1811
+ parentId: null,
1812
+ sourceId: null,
1813
+ role: "user",
1814
+ content: [{ type: "text", text: "Typed" }],
1815
+ attachments: [],
1816
+ metadata: { custom: {} },
1817
+ createdAt: new Date(),
1818
+ runConfig: {},
1819
+ });
1820
+ await vi.waitFor(() => {
1821
+ expect(thread.messages).toHaveLength(1);
1822
+ });
1823
+ runtime.setAdapter(render("thread-2", false));
1824
+
1825
+ await expect(append).resolves.toBeUndefined();
1826
+ expect(sendText).toHaveBeenCalledExactlyOnceWith("Typed");
1827
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1828
+ expect(thread.messages).toEqual([]);
1829
+
1830
+ thread.disconnectVoice();
1831
+ });
1832
+
1833
+ it.each([
1834
+ { isLoading: true, state: "loading" },
1835
+ { isLoading: false, state: "loaded" },
1836
+ ])(
1837
+ "drops a typed turn still sending when the host switches away from a $state thread",
1838
+ async ({ isLoading }) => {
1839
+ let finishSend!: () => void;
1840
+ const sendText = vi.fn(
1841
+ (_text: string) =>
1842
+ new Promise<void>((resolve) => {
1843
+ finishSend = resolve;
1844
+ }),
1845
+ );
1846
+ const voiceAdapter = createVoiceAdapter({ sendText });
1847
+ const onVoiceTranscript = vi.fn();
1848
+ const render = (threadId: string, loading: boolean) =>
1849
+ createBaseAdapter({
1850
+ isLoading: loading,
1851
+ onVoiceTranscript,
1852
+ adapters: { voice: voiceAdapter.adapter, threadList: { threadId } },
1853
+ });
1854
+ const runtime = new ExternalStoreRuntimeCore(
1855
+ render("thread-1", isLoading),
1856
+ );
1857
+ const thread = runtime.threads.getMainThreadRuntimeCore();
1858
+ thread.connectVoice();
1859
+
1860
+ const append = thread.append({
1861
+ parentId: null,
1862
+ sourceId: null,
1863
+ role: "user",
1864
+ content: [{ type: "text", text: "Typed" }],
1865
+ attachments: [],
1866
+ metadata: { custom: {} },
1867
+ createdAt: new Date(),
1868
+ runConfig: {},
1869
+ });
1870
+ expect(sendText).toHaveBeenCalledExactlyOnceWith("Typed");
1871
+ runtime.setAdapter(render("thread-2", false));
1872
+ finishSend();
1873
+
1874
+ await expect(append).resolves.toBeUndefined();
1875
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1876
+ expect(thread.messages).toEqual([]);
1877
+
1878
+ thread.disconnectVoice();
1879
+ },
1880
+ );
1881
+
1882
+ it.each([
1883
+ { failure: "the session ends", rejects: false },
1884
+ { failure: "sendText rejects", rejects: true },
1885
+ ])(
1886
+ "resolves a typed turn on the runtime the host switched away from when $failure",
1887
+ async ({ rejects }) => {
1888
+ let finishSend!: () => void;
1889
+ let failSend!: (error: Error) => void;
1890
+ const sendText = vi.fn(
1891
+ (_text: string) =>
1892
+ new Promise<void>((resolve, reject) => {
1893
+ finishSend = resolve;
1894
+ failSend = reject;
1895
+ }),
1896
+ );
1897
+ const voiceAdapter = createVoiceAdapter({ sendText });
1898
+ const onVoiceTranscript = vi.fn();
1899
+ const render = (threadId: string) =>
1900
+ createBaseAdapter({
1901
+ onVoiceTranscript,
1902
+ adapters: { voice: voiceAdapter.adapter, threadList: { threadId } },
1903
+ });
1904
+ const runtime = new ExternalStoreRuntimeCore(render("thread-1"));
1905
+ const thread = runtime.threads.getMainThreadRuntimeCore();
1906
+ thread.connectVoice();
1907
+
1908
+ const append = thread.append({
1909
+ parentId: null,
1910
+ sourceId: null,
1911
+ role: "user",
1912
+ content: [{ type: "text", text: "Typed" }],
1913
+ attachments: [],
1914
+ metadata: { custom: {} },
1915
+ createdAt: new Date(),
1916
+ runConfig: {},
1917
+ });
1918
+ runtime.setAdapter(render("thread-2"));
1919
+ if (rejects) {
1920
+ failSend(new Error("offline"));
1921
+ } else {
1922
+ thread.disconnectVoice();
1923
+ finishSend();
1924
+ }
1925
+
1926
+ await expect(append).resolves.toBeUndefined();
1927
+ expect(onVoiceTranscript).not.toHaveBeenCalled();
1928
+ expect(thread.messages).toEqual([]);
1929
+
1930
+ thread.disconnectVoice();
1931
+ },
1932
+ );
1933
+
1934
+ it("hands a final transcript to onVoiceTranscript and drops the side list copy once the host carries it", () => {
1935
+ const voiceAdapter = createVoiceAdapter();
1936
+ const onVoiceTranscript = vi.fn();
1937
+ const core = new ExternalStoreThreadRuntimeCore(
1938
+ createContextProvider(),
1939
+ createBaseAdapter({
1940
+ onVoiceTranscript,
1941
+ adapters: { voice: voiceAdapter.adapter },
1942
+ }),
1943
+ );
1944
+ core.connectVoice();
1945
+
1946
+ try {
1947
+ voiceAdapter.emitTranscript({
1948
+ role: "user",
1949
+ text: "Hello",
1950
+ isFinal: true,
1951
+ });
1952
+ const message = core.messages[0]!;
1953
+
1954
+ expect(message.role).toBe("user");
1955
+ expect(getThreadMessageText(message)).toBe("Hello");
1956
+ expect(message.metadata.modality).toBe("voice");
1957
+
1958
+ expect(onVoiceTranscript).toHaveBeenCalledExactlyOnceWith(message);
1959
+
1960
+ core.__internal_setAdapter(
1961
+ createBaseAdapter({
1962
+ messages: [message],
1963
+ onVoiceTranscript,
1964
+ adapters: { voice: voiceAdapter.adapter },
1965
+ }),
1966
+ );
1967
+
1968
+ expect(core.messages.filter(({ id }) => id === message.id)).toEqual([
1969
+ message,
1970
+ ]);
1971
+ } finally {
1972
+ core.disconnectVoice();
1973
+ }
1974
+ });
1975
+
1976
+ it("takes back a spoken user turn that the host echoes through convertMessage", () => {
1977
+ const voiceAdapter = createVoiceAdapter();
1978
+ const onVoiceTranscript = vi.fn();
1979
+ const convertMessage = (message: ThreadMessage) => message;
1980
+ const core = new ExternalStoreThreadRuntimeCore(
1981
+ createContextProvider(),
1982
+ createBaseAdapter({
1983
+ convertMessage,
1984
+ onVoiceTranscript,
1985
+ adapters: { voice: voiceAdapter.adapter },
1986
+ }),
1987
+ );
1988
+ core.connectVoice();
1989
+
1990
+ try {
1991
+ voiceAdapter.emitTranscript({
1992
+ role: "user",
1993
+ text: "Hello",
1994
+ isFinal: true,
1995
+ });
1996
+ const message = core.messages[0]!;
1997
+ expect(onVoiceTranscript).toHaveBeenCalledExactlyOnceWith(message);
1998
+ expect(message).not.toHaveProperty("status");
1999
+
2000
+ core.__internal_setAdapter(
2001
+ createBaseAdapter({
2002
+ messages: [message],
2003
+ convertMessage,
2004
+ onVoiceTranscript,
2005
+ adapters: { voice: voiceAdapter.adapter },
2006
+ }),
2007
+ );
2008
+
2009
+ expect(core.messages.map(({ id }) => id)).toEqual([message.id]);
2010
+ expect(core.messages[0]!.metadata.modality).toBe("voice");
2011
+ } finally {
2012
+ core.disconnectVoice();
2013
+ }
2014
+ });
2015
+
2016
+ it("hands a typed message to onVoiceTranscript as a typed turn without reaching onNew", async () => {
2017
+ const sendText = vi.fn(async (_text: string) => {});
2018
+ const voiceAdapter = createVoiceAdapter({ sendText });
2019
+ const onNew = vi.fn(async () => {});
2020
+ const onVoiceTranscript = vi.fn();
2021
+ const core = new ExternalStoreThreadRuntimeCore(
2022
+ createContextProvider(),
2023
+ createBaseAdapter({
2024
+ onNew,
2025
+ onVoiceTranscript,
2026
+ adapters: { voice: voiceAdapter.adapter },
2027
+ }),
2028
+ );
2029
+ core.connectVoice();
2030
+
2031
+ try {
2032
+ voiceAdapter.emitTranscript({
2033
+ role: "user",
2034
+ text: "Hello",
2035
+ isFinal: true,
2036
+ });
2037
+ const transcript = core.messages[0]!;
2038
+ expect(core.voice?.canSendText).toBe(true);
2039
+
2040
+ await core.append({
2041
+ parentId: transcript.id,
2042
+ sourceId: null,
2043
+ role: "user",
2044
+ content: [{ type: "text", text: "Typed" }],
2045
+ attachments: [],
2046
+ metadata: { custom: {} },
2047
+ createdAt: new Date(),
2048
+ runConfig: {},
2049
+ });
2050
+
2051
+ expect(sendText).toHaveBeenCalledExactlyOnceWith("Typed");
2052
+ expect(onNew).not.toHaveBeenCalled();
2053
+ const typed = core.messages[1]!;
2054
+ expect(typed.role).toBe("user");
2055
+ expect(getThreadMessageText(typed)).toBe("Typed");
2056
+ expect(typed.metadata.modality).toBeUndefined();
2057
+ expect(onVoiceTranscript).toHaveBeenLastCalledWith(typed);
2058
+
2059
+ core.__internal_setAdapter(
2060
+ createBaseAdapter({
2061
+ messages: [transcript, typed],
2062
+ onNew,
2063
+ onVoiceTranscript,
2064
+ adapters: { voice: voiceAdapter.adapter },
2065
+ }),
2066
+ );
2067
+
2068
+ expect(core.messages.map(({ id }) => id)).toEqual([
2069
+ transcript.id,
2070
+ typed.id,
2071
+ ]);
2072
+ } finally {
2073
+ core.disconnectVoice();
2074
+ }
2075
+ });
2076
+
2077
+ it("keeps transcripts for the session when the host has no onVoiceTranscript", () => {
2078
+ const voiceAdapter = createVoiceAdapter();
2079
+ const core = new ExternalStoreThreadRuntimeCore(
2080
+ createContextProvider(),
2081
+ createBaseAdapter({ adapters: { voice: voiceAdapter.adapter } }),
2082
+ );
2083
+ core.connectVoice();
2084
+
2085
+ voiceAdapter.emitTranscript({
2086
+ role: "user",
2087
+ text: "Hello",
2088
+ isFinal: true,
2089
+ });
2090
+
2091
+ expect(core.messages).toHaveLength(1);
2092
+
2093
+ core.disconnectVoice();
2094
+
2095
+ expect(core.messages).toEqual([]);
2096
+ });
2097
+
2098
+ it("parents a send after the session ended on the last repository message", async () => {
2099
+ const voiceAdapter = createVoiceAdapter();
2100
+ const onNew = vi.fn(async () => {});
2101
+ const core = new ExternalStoreThreadRuntimeCore(
2102
+ createContextProvider(),
2103
+ createBaseAdapter({
2104
+ onNew,
2105
+ adapters: { voice: voiceAdapter.adapter },
2106
+ }),
2107
+ );
2108
+ core.connectVoice();
2109
+
2110
+ try {
2111
+ voiceAdapter.emitTranscript({
2112
+ role: "user",
2113
+ text: "Hello",
2114
+ isFinal: true,
2115
+ });
2116
+ const transcript = core.messages[0]!;
2117
+ voiceAdapter.emitStatus({ type: "ended", reason: "finished" });
2118
+
2119
+ await core.append({
2120
+ parentId: transcript.id,
2121
+ sourceId: null,
2122
+ role: "user",
2123
+ content: [{ type: "text", text: "Follow up" }],
2124
+ attachments: [],
2125
+ metadata: { custom: {} },
2126
+ createdAt: new Date(),
2127
+ runConfig: {},
2128
+ startRun: false,
2129
+ });
2130
+
2131
+ expect(onNew).toHaveBeenCalledExactlyOnceWith(
2132
+ expect.objectContaining({ parentId: null }),
2133
+ );
2134
+ } finally {
2135
+ core.disconnectVoice();
2136
+ }
2137
+ });
2138
+
2139
+ it("rejects a text send while connected before reaching the store", async () => {
2140
+ const { core, onNew, onEdit, transcriptId } = createVoiceCore({
2141
+ commit: false,
2142
+ });
1367
2143
  try {
1368
2144
  const edit: AppendMessage = {
1369
2145
  parentId: null,
@@ -1377,10 +2153,10 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1377
2153
  };
1378
2154
 
1379
2155
  await expect(core.append(edit)).rejects.toThrow(
1380
- "Voice transcript messages cannot be edited",
2156
+ "Cannot send a text message while a voice session is connected",
1381
2157
  );
1382
2158
  await expect(core.append({ ...edit, startRun: false })).rejects.toThrow(
1383
- "Voice transcript messages cannot be edited",
2159
+ "Cannot send a text message while a voice session is connected",
1384
2160
  );
1385
2161
  expect(onNew).not.toHaveBeenCalled();
1386
2162
  expect(onEdit).not.toHaveBeenCalled();
@@ -1389,8 +2165,10 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1389
2165
  }
1390
2166
  });
1391
2167
 
1392
- it("rejects reloading a transcript before reaching the store", async () => {
1393
- const { core, onReload, onResume, transcriptId } = createVoiceCore();
2168
+ it("rejects a run while connected before reaching the store", async () => {
2169
+ const { core, onReload, onResume, transcriptId } = createVoiceCore({
2170
+ commit: false,
2171
+ });
1394
2172
  try {
1395
2173
  await expect(
1396
2174
  core.startRun({
@@ -1398,14 +2176,18 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1398
2176
  sourceId: transcriptId,
1399
2177
  runConfig: {},
1400
2178
  }),
1401
- ).rejects.toThrow("Voice transcript messages cannot be reloaded");
2179
+ ).rejects.toThrow(
2180
+ "Cannot start a run while a voice session is connected",
2181
+ );
1402
2182
  await expect(
1403
2183
  core.resumeRun({
1404
2184
  parentId: null,
1405
2185
  sourceId: transcriptId,
1406
2186
  runConfig: {},
1407
2187
  }),
1408
- ).rejects.toThrow("Voice transcript messages cannot be reloaded");
2188
+ ).rejects.toThrow(
2189
+ "Cannot start a run while a voice session is connected",
2190
+ );
1409
2191
  expect(onReload).not.toHaveBeenCalled();
1410
2192
  expect(onResume).not.toHaveBeenCalled();
1411
2193
  } finally {