@assistant-ui/core 0.3.19 → 0.3.20

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 (664) hide show
  1. package/dist/adapters/attachment.d.ts +9 -10
  2. package/dist/adapters/attachment.d.ts.map +1 -1
  3. package/dist/adapters/attachment.js +2 -1
  4. package/dist/adapters/attachment.js.map +1 -1
  5. package/dist/adapters/directive-formatter.d.ts +1 -2
  6. package/dist/adapters/directive-formatter.d.ts.map +1 -1
  7. package/dist/adapters/feedback.d.ts +2 -2
  8. package/dist/adapters/feedback.d.ts.map +1 -1
  9. package/dist/adapters/speech.d.ts +6 -7
  10. package/dist/adapters/speech.d.ts.map +1 -1
  11. package/dist/adapters/suggestion.d.ts +5 -6
  12. package/dist/adapters/suggestion.d.ts.map +1 -1
  13. package/dist/adapters/thread-history.d.ts +6 -7
  14. package/dist/adapters/thread-history.d.ts.map +1 -1
  15. package/dist/adapters/trigger.d.ts +1 -2
  16. package/dist/adapters/trigger.d.ts.map +1 -1
  17. package/dist/adapters/voice.d.ts +5 -6
  18. package/dist/adapters/voice.d.ts.map +1 -1
  19. package/dist/internal/duplicate-detection.d.ts +1 -2
  20. package/dist/internal/duplicate-detection.d.ts.map +1 -1
  21. package/dist/model-context/frame/host.d.ts +1 -2
  22. package/dist/model-context/frame/host.d.ts.map +1 -1
  23. package/dist/model-context/frame/provider.d.ts +1 -2
  24. package/dist/model-context/frame/provider.d.ts.map +1 -1
  25. package/dist/model-context/frame/types.d.ts +5 -6
  26. package/dist/model-context/frame/types.d.ts.map +1 -1
  27. package/dist/model-context/interactable-composer-metadata.d.ts +9 -10
  28. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  29. package/dist/model-context/registry-handles.d.ts +3 -4
  30. package/dist/model-context/registry-handles.d.ts.map +1 -1
  31. package/dist/model-context/registry.d.ts +1 -2
  32. package/dist/model-context/registry.d.ts.map +1 -1
  33. package/dist/model-context/tool-call-text.d.ts +2 -3
  34. package/dist/model-context/tool-call-text.d.ts.map +1 -1
  35. package/dist/model-context/tool.d.ts +2 -3
  36. package/dist/model-context/tool.d.ts.map +1 -1
  37. package/dist/model-context/types.d.ts +8 -9
  38. package/dist/model-context/types.d.ts.map +1 -1
  39. package/dist/react/AssistantProvider.d.ts +3 -4
  40. package/dist/react/AssistantProvider.d.ts.map +1 -1
  41. package/dist/react/AssistantRuntimeProvider.d.ts +1 -2
  42. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  43. package/dist/react/RuntimeAdapter.d.ts +2 -3
  44. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  45. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +4 -5
  46. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  47. package/dist/react/adapters/LocalStorageThreadListAdapter.js +20 -34
  48. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  49. package/dist/react/adapters/TitleGenerationAdapter.d.ts +2 -3
  50. package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
  51. package/dist/react/client/AdaptedRemoteThread.d.ts +1 -2
  52. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -1
  53. package/dist/react/client/DataRenderers.d.ts +1 -2
  54. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  55. package/dist/react/client/InMemoryThreadList.d.ts +3 -4
  56. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  57. package/dist/react/client/Interactables.d.ts +1 -2
  58. package/dist/react/client/Interactables.d.ts.map +1 -1
  59. package/dist/react/client/RemoteThreadList.d.ts +2 -3
  60. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  61. package/dist/react/client/Tools.d.ts +2 -2
  62. package/dist/react/client/Tools.d.ts.map +1 -1
  63. package/dist/react/client/interactable-model-context.d.ts +2 -3
  64. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  65. package/dist/react/interactables-legacy/Interactables.d.ts +1 -2
  66. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  67. package/dist/react/interactables-legacy/interactable-model-context.d.ts +2 -3
  68. package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
  69. package/dist/react/interactables-legacy/scopes.d.ts +9 -10
  70. package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
  71. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +2 -3
  72. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  73. package/dist/react/interactables-legacy/useInteractableState.d.ts +1 -2
  74. package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
  75. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +1 -2
  76. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  77. package/dist/react/model-context/define-mcp-toolkit.d.ts +4 -5
  78. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
  79. package/dist/react/model-context/define-toolkit.d.ts +2 -3
  80. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  81. package/dist/react/model-context/external-tool.d.ts +1 -2
  82. package/dist/react/model-context/external-tool.d.ts.map +1 -1
  83. package/dist/react/model-context/human-tool.d.ts +3 -4
  84. package/dist/react/model-context/human-tool.d.ts.map +1 -1
  85. package/dist/react/model-context/interactableTool.d.ts +3 -4
  86. package/dist/react/model-context/interactableTool.d.ts.map +1 -1
  87. package/dist/react/model-context/makeAssistantDataUI.d.ts +2 -3
  88. package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
  89. package/dist/react/model-context/makeAssistantTool.d.ts +2 -3
  90. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  91. package/dist/react/model-context/makeAssistantToolUI.d.ts +2 -3
  92. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  93. package/dist/react/model-context/provider-tool.d.ts +2 -3
  94. package/dist/react/model-context/provider-tool.d.ts.map +1 -1
  95. package/dist/react/model-context/stub-tool.d.ts +1 -2
  96. package/dist/react/model-context/stub-tool.d.ts.map +1 -1
  97. package/dist/react/model-context/toolbox.d.ts +9 -10
  98. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  99. package/dist/react/model-context/useAssistantContext.d.ts +2 -2
  100. package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
  101. package/dist/react/model-context/useAssistantDataUI.d.ts +2 -3
  102. package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
  103. package/dist/react/model-context/useAssistantInstructions.d.ts +2 -2
  104. package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
  105. package/dist/react/model-context/useAssistantTool.d.ts +2 -3
  106. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  107. package/dist/react/model-context/useAssistantToolUI.d.ts +2 -3
  108. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  109. package/dist/react/model-context/useAuiToolOverrides.d.ts +1 -2
  110. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
  111. package/dist/react/model-context/useInlineRender.d.ts +1 -2
  112. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  113. package/dist/react/model-context/useInteractable.d.ts +4 -5
  114. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  115. package/dist/react/model-context/useInteractableState.d.ts +1 -2
  116. package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
  117. package/dist/react/model-context/useInteractableVersions.d.ts +1 -2
  118. package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
  119. package/dist/react/model-context/useToolArgsStatus.d.ts +2 -3
  120. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  121. package/dist/react/primitive-hooks/useActionBarCopy.d.ts +2 -3
  122. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  123. package/dist/react/primitive-hooks/useActionBarEdit.d.ts +1 -2
  124. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  125. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts +2 -3
  126. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
  127. package/dist/react/primitive-hooks/useActionBarReload.d.ts +1 -2
  128. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  129. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts +1 -2
  130. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
  131. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts +1 -2
  132. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
  133. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts +1 -2
  134. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  135. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts +1 -2
  136. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  137. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +1 -2
  138. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
  139. package/dist/react/primitive-hooks/useComposerCancel.d.ts +1 -2
  140. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  141. package/dist/react/primitive-hooks/useComposerDictate.d.ts +1 -2
  142. package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
  143. package/dist/react/primitive-hooks/useComposerSend.d.ts +1 -2
  144. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  145. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts +1 -2
  146. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
  147. package/dist/react/primitive-hooks/useEditComposerSend.d.ts +1 -2
  148. package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
  149. package/dist/react/primitive-hooks/useMessageBranching.d.ts +1 -2
  150. package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
  151. package/dist/react/primitive-hooks/useMessageError.d.ts +1 -2
  152. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  153. package/dist/react/primitive-hooks/useMessageReload.d.ts +1 -2
  154. package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
  155. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +2 -3
  156. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  157. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +1 -2
  158. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  159. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +1 -2
  160. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  161. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts +1 -2
  162. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
  163. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts +1 -2
  164. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
  165. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts +1 -2
  166. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
  167. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts +1 -2
  168. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
  169. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts +1 -2
  170. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  171. package/dist/react/primitive-hooks/useThreadListNew.d.ts +1 -2
  172. package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
  173. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts +1 -2
  174. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
  175. package/dist/react/primitive-hooks/useThreadMessages.d.ts +1 -2
  176. package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
  177. package/dist/react/primitive-hooks/useVoice.d.ts +3 -4
  178. package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
  179. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +2 -3
  180. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  181. package/dist/react/primitives/composer/ComposerAttachments.d.ts +4 -5
  182. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  183. package/dist/react/primitives/composer/ComposerIf.d.ts +4 -5
  184. package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
  185. package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -3
  186. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  187. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +4 -5
  188. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
  189. package/dist/react/primitives/generativeUI/GenerativeUI.js +27 -28
  190. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  191. package/dist/react/primitives/message/MessageAttachments.d.ts +4 -5
  192. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  193. package/dist/react/primitives/message/MessageGroupedParts.d.ts +2 -3
  194. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  195. package/dist/react/primitives/message/MessageParts.d.ts +10 -10
  196. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  197. package/dist/react/primitives/message/MessageQuote.d.ts +2 -3
  198. package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
  199. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +2 -3
  200. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  201. package/dist/react/primitives/part/PartMessages.d.ts +3 -4
  202. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  203. package/dist/react/primitives/thread/ThreadMessages.d.ts +7 -8
  204. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  205. package/dist/react/primitives/thread/ThreadSuggestions.d.ts +5 -6
  206. package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
  207. package/dist/react/primitives/threadList/ThreadListItems.d.ts +4 -5
  208. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  209. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +2 -3
  210. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
  211. package/dist/react/providers/AttachmentByIndexProvider.d.ts +2 -3
  212. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  213. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +1 -2
  214. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  215. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +1 -2
  216. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  217. package/dist/react/providers/MessageByIdProvider.d.ts +1 -2
  218. package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
  219. package/dist/react/providers/MessageByIndexProvider.d.ts +1 -2
  220. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  221. package/dist/react/providers/PartByIndexProvider.d.ts +1 -2
  222. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  223. package/dist/react/providers/QueueItemByIndexProvider.d.ts +2 -3
  224. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  225. package/dist/react/providers/ReadonlyThreadProvider.d.ts +2 -3
  226. package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
  227. package/dist/react/providers/SuggestionByIndexProvider.d.ts +2 -3
  228. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  229. package/dist/react/providers/TextMessagePartProvider.d.ts +1 -2
  230. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  231. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +1 -2
  232. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  233. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +1 -2
  234. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  235. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -2
  236. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  237. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +17 -7
  238. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  239. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +1 -2
  240. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  241. package/dist/react/runtimes/RemoteThreadResource.d.ts +4 -5
  242. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  243. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -3
  244. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  245. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +2 -3
  246. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -1
  247. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +3 -4
  248. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  249. package/dist/react/runtimes/assistant-transport/runManager.d.ts +2 -3
  250. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  251. package/dist/react/runtimes/assistant-transport/types.d.ts +17 -18
  252. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -1
  253. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +4 -5
  254. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  255. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +1 -2
  256. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -1
  257. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +1 -2
  258. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -1
  259. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -3
  260. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  261. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +17 -4
  262. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  263. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -2
  264. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  265. package/dist/react/runtimes/cloud/auiV0.d.ts +11 -3
  266. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  267. package/dist/react/runtimes/cloud/auiV0.js +63 -2
  268. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  269. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +4 -5
  270. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  271. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +1 -2
  272. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -1
  273. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +1 -2
  274. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -1
  275. package/dist/react/runtimes/cloud/sdkIdentity.js +1 -1
  276. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -2
  277. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  278. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +1 -2
  279. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  280. package/dist/react/runtimes/createMessageConverter.d.ts +1 -2
  281. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  282. package/dist/react/runtimes/createRuntimeExtras.d.ts +3 -4
  283. package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
  284. package/dist/react/runtimes/external-message-converter.d.ts +6 -6
  285. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  286. package/dist/react/runtimes/useExternalStoreRuntime.d.ts +1 -2
  287. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  288. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +1 -2
  289. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
  290. package/dist/react/runtimes/useLocalRuntime.d.ts +3 -4
  291. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  292. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +1 -2
  293. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  294. package/dist/react/runtimes/useRemoteThreadListRuntime.js +2 -2
  295. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  296. package/dist/react/runtimes/useRuntimeAdapters.d.ts +4 -4
  297. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -1
  298. package/dist/react/runtimes/useStreamingTiming.d.ts +2 -2
  299. package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
  300. package/dist/react/types/MessagePartComponentTypes.d.ts +26 -27
  301. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  302. package/dist/react/types/scopes/dataRenderers.d.ts +3 -4
  303. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  304. package/dist/react/types/scopes/interactables.d.ts +10 -11
  305. package/dist/react/types/scopes/interactables.d.ts.map +1 -1
  306. package/dist/react/types/scopes/tools.d.ts +4 -5
  307. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  308. package/dist/react/utils/getMessageQuote.d.ts +1 -2
  309. package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
  310. package/dist/react/utils/groupParts.d.ts +7 -8
  311. package/dist/react/utils/groupParts.d.ts.map +1 -1
  312. package/dist/react/utils/useJSONEqual.d.ts +2 -3
  313. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  314. package/dist/react/utils/useJSONSchemaDependency.d.ts +1 -2
  315. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -1
  316. package/dist/runtime/api/assistant-runtime.d.ts +2 -3
  317. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  318. package/dist/runtime/api/attachment-runtime.d.ts +6 -7
  319. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  320. package/dist/runtime/api/bindings.d.ts +5 -6
  321. package/dist/runtime/api/bindings.d.ts.map +1 -1
  322. package/dist/runtime/api/composer-runtime.d.ts +10 -10
  323. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  324. package/dist/runtime/api/message-part-runtime.d.ts +3 -4
  325. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  326. package/dist/runtime/api/message-part-runtime.js +3 -2
  327. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  328. package/dist/runtime/api/message-runtime.d.ts +8 -6
  329. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  330. package/dist/runtime/api/message-runtime.js +3 -2
  331. package/dist/runtime/api/message-runtime.js.map +1 -1
  332. package/dist/runtime/api/paths.d.ts +6 -7
  333. package/dist/runtime/api/paths.d.ts.map +1 -1
  334. package/dist/runtime/api/thread-list-item-runtime.d.ts +8 -8
  335. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  336. package/dist/runtime/api/thread-list-runtime.d.ts +4 -5
  337. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  338. package/dist/runtime/api/thread-runtime.d.ts +10 -11
  339. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  340. package/dist/runtime/base/base-assistant-runtime-core.d.ts +1 -2
  341. package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
  342. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -2
  343. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  344. package/dist/runtime/base/base-thread-runtime-core.d.ts +8 -3
  345. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  346. package/dist/runtime/base/base-thread-runtime-core.js +71 -27
  347. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  348. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +1 -2
  349. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  350. package/dist/runtime/base/default-edit-composer-runtime-core.js +12 -2
  351. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  352. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -2
  353. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  354. package/dist/runtime/base/default-thread-composer-runtime-core.js +7 -1
  355. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  356. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +1 -2
  357. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
  358. package/dist/runtime/interfaces/assistant-runtime-core.d.ts +1 -2
  359. package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
  360. package/dist/runtime/interfaces/composer-runtime-core.d.ts +10 -11
  361. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  362. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -5
  363. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  364. package/dist/runtime/interfaces/thread-runtime-core.d.ts +17 -16
  365. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  366. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +2 -3
  367. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  368. package/dist/runtime/queue/message-queue.d.ts +5 -4
  369. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  370. package/dist/runtime/queue/message-queue.js +9 -1
  371. package/dist/runtime/queue/message-queue.js.map +1 -1
  372. package/dist/runtime/queue/queue-item.d.ts +2 -3
  373. package/dist/runtime/queue/queue-item.d.ts.map +1 -1
  374. package/dist/runtime/utils/abortable-thread-load.d.ts +2 -3
  375. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -1
  376. package/dist/runtime/utils/attachment-add-operations.d.ts +3 -4
  377. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -1
  378. package/dist/runtime/utils/auto-status.d.ts +7 -8
  379. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  380. package/dist/runtime/utils/chat-model-adapter.d.ts +5 -6
  381. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  382. package/dist/runtime/utils/external-message-conversion.d.ts +15 -16
  383. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  384. package/dist/runtime/utils/external-message-conversion.js +3 -2
  385. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  386. package/dist/runtime/utils/external-store-message.d.ts +4 -5
  387. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  388. package/dist/runtime/utils/message-repository-session.d.ts +3 -4
  389. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -1
  390. package/dist/runtime/utils/message-repository.d.ts +4 -5
  391. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  392. package/dist/runtime/utils/pending-tool-calls.d.ts +2 -3
  393. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -1
  394. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +1 -2
  395. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  396. package/dist/runtime/utils/runtime-extras-brand.d.ts +2 -3
  397. package/dist/runtime/utils/runtime-extras-brand.d.ts.map +1 -1
  398. package/dist/runtime/utils/stored-message-parts.d.ts +21 -0
  399. package/dist/runtime/utils/stored-message-parts.d.ts.map +1 -0
  400. package/dist/runtime/utils/stored-message-parts.js +83 -0
  401. package/dist/runtime/utils/stored-message-parts.js.map +1 -0
  402. package/dist/runtime/utils/streaming-timing.d.ts +4 -5
  403. package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
  404. package/dist/runtime/utils/thread-message-like.d.ts +5 -5
  405. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  406. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  407. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +3 -4
  408. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -1
  409. package/dist/runtime/utils/tool-call-tree.d.ts +4 -5
  410. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -1
  411. package/dist/runtimes/assistant-transport/utils.d.ts +1 -2
  412. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  413. package/dist/runtimes/external-store/external-store-adapter.d.ts +9 -6
  414. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  415. package/dist/runtimes/external-store/external-store-runtime-core.d.ts +1 -2
  416. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
  417. package/dist/runtimes/external-store/external-store-shared-options.d.ts +2 -3
  418. package/dist/runtimes/external-store/external-store-shared-options.d.ts.map +1 -1
  419. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -3
  420. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  421. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -3
  422. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  423. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +29 -6
  424. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  425. package/dist/runtimes/external-store/thread-message-converter.d.ts +2 -3
  426. package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
  427. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +2 -3
  428. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  429. package/dist/runtimes/local/local-runtime-core.d.ts +1 -2
  430. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
  431. package/dist/runtimes/local/local-runtime-options.d.ts +1 -2
  432. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  433. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +2 -3
  434. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
  435. package/dist/runtimes/local/local-thread-runtime-core.d.ts +9 -4
  436. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  437. package/dist/runtimes/local/local-thread-runtime-core.js +53 -9
  438. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  439. package/dist/runtimes/local/should-continue.d.ts +1 -2
  440. package/dist/runtimes/local/should-continue.d.ts.map +1 -1
  441. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -2
  442. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  443. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +1 -2
  444. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  445. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +1 -2
  446. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -1
  447. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +1 -2
  448. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  449. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +1 -2
  450. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  451. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +16 -17
  452. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  453. package/dist/runtimes/remote-thread-list/title-generation.d.ts +7 -8
  454. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -1
  455. package/dist/runtimes/remote-thread-list/title.d.ts +2 -3
  456. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  457. package/dist/runtimes/remote-thread-list/types.d.ts +8 -9
  458. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  459. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +4 -5
  460. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  461. package/dist/store/clients/chain-of-thought-client.d.ts +1 -2
  462. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  463. package/dist/store/clients/external-thread.d.ts +3 -4
  464. package/dist/store/clients/external-thread.d.ts.map +1 -1
  465. package/dist/store/clients/external-thread.js +15 -11
  466. package/dist/store/clients/external-thread.js.map +1 -1
  467. package/dist/store/clients/model-context-client.d.ts +1 -2
  468. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  469. package/dist/store/clients/no-op-composer-client.d.ts +1 -2
  470. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  471. package/dist/store/clients/runtime-adapter.d.ts +1 -2
  472. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  473. package/dist/store/clients/single-thread-list.d.ts +1 -2
  474. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  475. package/dist/store/clients/suggestions.d.ts +3 -4
  476. package/dist/store/clients/suggestions.d.ts.map +1 -1
  477. package/dist/store/clients/thread-message-client.d.ts +2 -3
  478. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  479. package/dist/store/clients/thread-selection-events.d.ts +1 -2
  480. package/dist/store/clients/thread-selection-events.d.ts.map +1 -1
  481. package/dist/store/clients/thread-tasks.d.ts +3 -4
  482. package/dist/store/clients/thread-tasks.d.ts.map +1 -1
  483. package/dist/store/env.d.ts +1 -2
  484. package/dist/store/env.d.ts.map +1 -1
  485. package/dist/store/primitive-predicates.d.ts +11 -12
  486. package/dist/store/primitive-predicates.d.ts.map +1 -1
  487. package/dist/store/primitive-predicates.js +2 -2
  488. package/dist/store/primitive-predicates.js.map +1 -1
  489. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +1 -2
  490. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  491. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -2
  492. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  493. package/dist/store/runtime-clients/handle-runtime-action.d.ts +1 -2
  494. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
  495. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +1 -2
  496. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -1
  497. package/dist/store/runtime-clients/liveRef.d.ts +1 -2
  498. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
  499. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +1 -2
  500. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  501. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -2
  502. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  503. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +1 -2
  504. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  505. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +1 -2
  506. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  507. package/dist/store/runtime-clients/thread-runtime-client.d.ts +1 -2
  508. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  509. package/dist/store/runtime-clients/useSubscribable.d.ts +1 -2
  510. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  511. package/dist/store/scopes/attachment.d.ts +4 -5
  512. package/dist/store/scopes/attachment.d.ts.map +1 -1
  513. package/dist/store/scopes/chain-of-thought.d.ts +5 -6
  514. package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
  515. package/dist/store/scopes/composer.d.ts +6 -7
  516. package/dist/store/scopes/composer.d.ts.map +1 -1
  517. package/dist/store/scopes/message.d.ts +6 -6
  518. package/dist/store/scopes/message.d.ts.map +1 -1
  519. package/dist/store/scopes/model-context.d.ts +3 -4
  520. package/dist/store/scopes/model-context.d.ts.map +1 -1
  521. package/dist/store/scopes/part.d.ts +4 -5
  522. package/dist/store/scopes/part.d.ts.map +1 -1
  523. package/dist/store/scopes/queue-item.d.ts +4 -4
  524. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  525. package/dist/store/scopes/suggestion.d.ts +4 -5
  526. package/dist/store/scopes/suggestion.d.ts.map +1 -1
  527. package/dist/store/scopes/suggestions.d.ts +5 -6
  528. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  529. package/dist/store/scopes/task.d.ts +4 -5
  530. package/dist/store/scopes/task.d.ts.map +1 -1
  531. package/dist/store/scopes/thread-list-item.d.ts +5 -6
  532. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  533. package/dist/store/scopes/thread.d.ts +5 -6
  534. package/dist/store/scopes/thread.d.ts.map +1 -1
  535. package/dist/store/scopes/threads.d.ts +4 -5
  536. package/dist/store/scopes/threads.d.ts.map +1 -1
  537. package/dist/subscribable/subscribable.d.ts +15 -16
  538. package/dist/subscribable/subscribable.d.ts.map +1 -1
  539. package/dist/tests/remote-thread-list-test-helpers.d.ts +5 -6
  540. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  541. package/dist/types/attachment.d.ts +9 -10
  542. package/dist/types/attachment.d.ts.map +1 -1
  543. package/dist/types/augmentations.d.ts +3 -4
  544. package/dist/types/augmentations.d.ts.map +1 -1
  545. package/dist/types/directive.d.ts +2 -3
  546. package/dist/types/directive.d.ts.map +1 -1
  547. package/dist/types/error.d.ts +8 -9
  548. package/dist/types/error.d.ts.map +1 -1
  549. package/dist/types/message.d.ts +48 -46
  550. package/dist/types/message.d.ts.map +1 -1
  551. package/dist/types/message.js.map +1 -1
  552. package/dist/types/quote.d.ts +1 -2
  553. package/dist/types/quote.d.ts.map +1 -1
  554. package/dist/types/trigger.d.ts +2 -3
  555. package/dist/types/trigger.d.ts.map +1 -1
  556. package/dist/types/unsubscribe.d.ts +1 -2
  557. package/dist/types/unsubscribe.d.ts.map +1 -1
  558. package/dist/utils/abortable-iterable.d.ts +2 -3
  559. package/dist/utils/abortable-iterable.d.ts.map +1 -1
  560. package/dist/utils/composite-context-provider.d.ts +1 -2
  561. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  562. package/dist/utils/data-url.d.ts +6 -7
  563. package/dist/utils/data-url.d.ts.map +1 -1
  564. package/dist/utils/getGroupStatus.d.ts +2 -3
  565. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  566. package/dist/utils/id.d.ts +3 -4
  567. package/dist/utils/id.d.ts.map +1 -1
  568. package/dist/utils/image-media-type.d.ts +1 -2
  569. package/dist/utils/image-media-type.d.ts.map +1 -1
  570. package/dist/utils/invoke-user-callback.d.ts +1 -2
  571. package/dist/utils/invoke-user-callback.d.ts.map +1 -1
  572. package/dist/utils/json/is-json-equal.d.ts +1 -2
  573. package/dist/utils/json/is-json-equal.d.ts.map +1 -1
  574. package/dist/utils/json/is-json.d.ts +4 -5
  575. package/dist/utils/json/is-json.d.ts.map +1 -1
  576. package/dist/utils/json/stable-stringify-tool-args.d.ts +2 -3
  577. package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -1
  578. package/dist/utils/normalizePartStatus.d.ts +4 -5
  579. package/dist/utils/normalizePartStatus.d.ts.map +1 -1
  580. package/dist/utils/notify-event-listeners.d.ts +1 -2
  581. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  582. package/dist/utils/record.d.ts +1 -2
  583. package/dist/utils/record.d.ts.map +1 -1
  584. package/dist/utils/silent-runtime-action.d.ts +2 -3
  585. package/dist/utils/silent-runtime-action.d.ts.map +1 -1
  586. package/dist/utils/text.d.ts +1 -2
  587. package/dist/utils/text.d.ts.map +1 -1
  588. package/dist/utils/wire-media.d.ts +3 -4
  589. package/dist/utils/wire-media.d.ts.map +1 -1
  590. package/package.json +14 -13
  591. package/src/adapters/attachment.ts +8 -1
  592. package/src/adapters/feedback.ts +1 -0
  593. package/src/model-context/frame/provider.test.ts +45 -20
  594. package/src/react/RuntimeAdapter.test.ts +4 -1
  595. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +117 -0
  596. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +27 -74
  597. package/src/react/client/Interactables.test.ts +12 -7
  598. package/src/react/client/RemoteThreadList.concurrent.test.tsx +9 -3
  599. package/src/react/client/RemoteThreadList.test.ts +5 -6
  600. package/src/react/interactables-legacy/Interactables.test.ts +9 -3
  601. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +40 -22
  602. package/src/react/model-context/useInteractable.test.tsx +56 -29
  603. package/src/react/primitive-hooks/useActionBarCopy.test.ts +5 -5
  604. package/src/react/primitives/generativeUI/GenerativeUI.test.tsx +54 -0
  605. package/src/react/primitives/generativeUI/GenerativeUI.tsx +13 -18
  606. package/src/react/primitives/message/MessageGroupedParts.test.tsx +4 -1
  607. package/src/react/primitives/thread/ThreadMessages.test.tsx +25 -7
  608. package/src/react/runtimes/RemoteThreadListHookInstanceManager.layout.test.tsx +62 -0
  609. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +2 -2
  610. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +23 -20
  611. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +24 -17
  612. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +39 -24
  613. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +73 -46
  614. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +66 -1
  615. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +102 -0
  616. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +24 -11
  617. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +8 -4
  618. package/src/react/runtimes/cloud/auiV0.ts +121 -1
  619. package/src/react/runtimes/cloud/auiV0DecodeSafely.test.ts +522 -0
  620. package/src/react/runtimes/external-message-converter.test.ts +7 -3
  621. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +2 -1
  622. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +8 -2
  623. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +6 -2
  624. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +84 -4
  625. package/src/react/runtimes/useRemoteThreadListRuntime.ts +5 -1
  626. package/src/runtime/api/message-part-runtime.ts +4 -1
  627. package/src/runtime/api/message-runtime.ts +15 -2
  628. package/src/runtime/base/base-thread-runtime-core.test.ts +761 -18
  629. package/src/runtime/base/base-thread-runtime-core.ts +89 -26
  630. package/src/runtime/base/default-edit-composer-runtime-core.ts +12 -2
  631. package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -1
  632. package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
  633. package/src/runtime/queue/message-queue.ts +11 -1
  634. package/src/runtime/utils/external-message-conversion.test.ts +43 -0
  635. package/src/runtime/utils/external-message-conversion.ts +6 -2
  636. package/src/runtime/utils/stored-message-parts.ts +174 -0
  637. package/src/runtime/utils/thread-message-like.ts +7 -2
  638. package/src/runtimes/external-store/external-store-adapter.ts +4 -0
  639. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +44 -9
  640. package/src/runtimes/local/local-thread-runtime-core.test.ts +168 -12
  641. package/src/runtimes/local/local-thread-runtime-core.ts +80 -9
  642. package/src/store/clients/external-thread.ts +34 -13
  643. package/src/store/primitive-predicates.test.ts +16 -0
  644. package/src/store/primitive-predicates.ts +4 -1
  645. package/src/store/runtime-clients/thread-runtime-client.test.tsx +110 -0
  646. package/src/store/scopes/message.ts +4 -1
  647. package/src/subscribable/subscribable.test.ts +7 -2
  648. package/src/tests/attachment-adapters.test.ts +16 -1
  649. package/src/tests/auiV0Encode.test.ts +4 -0
  650. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +6 -6
  651. package/src/tests/base-composer-runtime-core.test.ts +16 -5
  652. package/src/tests/composer-can-cancel.test.ts +35 -6
  653. package/src/tests/composer-can-send.test.ts +22 -0
  654. package/src/tests/default-edit-composer-runtime-core.test.ts +47 -0
  655. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +229 -27
  656. package/src/tests/external-store-thread-runtime-core.test.ts +31 -0
  657. package/src/tests/external-thread-attachments.test.tsx +22 -23
  658. package/src/tests/external-thread-feedback.test.tsx +20 -7
  659. package/src/tests/external-thread-parity.test.tsx +1 -1
  660. package/src/tests/message-queue.test.ts +45 -10
  661. package/src/tests/thread-switch-events.test.tsx +11 -7
  662. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +2 -1
  663. package/src/types/message.test.ts +19 -0
  664. package/src/types/message.ts +16 -8
@@ -92,6 +92,8 @@ export abstract class BaseThreadRuntimeCore
92
92
  return this.repository.getMessages();
93
93
  }
94
94
 
95
+ protected _commitVoiceMessage(_message: ThreadMessage): void {}
96
+
95
97
  public get messages(): readonly ThreadMessage[] {
96
98
  if (this._voiceMessages.length === 0) {
97
99
  return this._getBaseMessages();
@@ -101,7 +103,13 @@ export abstract class BaseThreadRuntimeCore
101
103
  this._cachedVoiceGeneration !== this._voiceGeneration ||
102
104
  this._cachedMergedBase !== base
103
105
  ) {
104
- this._cachedMergedMessages = [...base, ...this._voiceMessages];
106
+ const baseMessageIds = new Set(base.map((message) => message.id));
107
+ this._cachedMergedMessages = [
108
+ ...base,
109
+ ...this._voiceMessages.filter(
110
+ (message) => !baseMessageIds.has(message.id),
111
+ ),
112
+ ];
105
113
  this._cachedVoiceGeneration = this._voiceGeneration;
106
114
  this._cachedMergedBase = base;
107
115
  }
@@ -177,7 +185,17 @@ export abstract class BaseThreadRuntimeCore
177
185
  );
178
186
  }
179
187
 
188
+ protected _resolveAppendParent(parentId: string | null): string | null {
189
+ return this._isVoiceMessage(parentId)
190
+ ? (this._getBaseMessages().at(-1)?.id ?? null)
191
+ : parentId;
192
+ }
193
+
180
194
  public beginEdit(messageId: string) {
195
+ if (this.voice)
196
+ throw new Error(
197
+ "Cannot edit a message while a voice session is connected",
198
+ );
181
199
  if (this._isVoiceMessage(messageId)) {
182
200
  throw new Error("Voice transcript messages cannot be edited");
183
201
  }
@@ -253,21 +271,21 @@ export abstract class BaseThreadRuntimeCore
253
271
  });
254
272
  }
255
273
 
256
- public submitFeedback({ messageId, type }: SubmitFeedbackOptions) {
274
+ public submitFeedback({ messageId, type, comment }: SubmitFeedbackOptions) {
257
275
  const adapter = this.adapters?.feedback;
258
- if (!adapter) throw new Error("Feedback adapter not configured");
259
-
260
276
  const entry = this.getMessageById(messageId);
261
277
  if (!entry) throw new Error(`Message not found: ${messageId}`);
262
278
  const { message, parentId } = entry;
263
- adapter.submit({ message, type });
279
+ const trimmed = comment?.trim();
280
+ const feedback = { type, ...(trimmed ? { comment: trimmed } : undefined) };
281
+ adapter?.submit({ message, ...feedback });
264
282
 
265
283
  if (message.role === "assistant") {
266
284
  const updatedMessage: ThreadMessage = {
267
285
  ...message,
268
286
  metadata: {
269
287
  ...message.metadata,
270
- submittedFeedback: { type },
288
+ submittedFeedback: feedback,
271
289
  },
272
290
  };
273
291
  const voiceIdx = this._voiceMessages.findIndex(
@@ -384,12 +402,31 @@ export abstract class BaseThreadRuntimeCore
384
402
  return () => this._voiceVolumeSubscribers.delete(callback);
385
403
  };
386
404
 
405
+ protected _onVoiceConnected(): void {}
406
+
407
+ protected _onVoiceDisconnected(): void {}
408
+
409
+ protected _isRunActive(): boolean {
410
+ const runtime: ThreadRuntimeCore = this;
411
+ if (runtime.isRunning) return true;
412
+ const last = this._getBaseMessages().at(-1);
413
+ return (
414
+ last?.role === "assistant" &&
415
+ (last.status.type === "running" || last.status.type === "requires-action")
416
+ );
417
+ }
418
+
387
419
  public connectVoice() {
388
420
  const adapter = this.adapters?.voice;
389
421
  if (!adapter) throw new Error("Voice adapter not configured");
422
+ if (this._isRunActive())
423
+ throw new Error(
424
+ "Cannot start a voice session while a run is in progress or paused on a pending tool action",
425
+ );
426
+ const replacing = this._voiceSession !== undefined;
390
427
 
391
428
  try {
392
- this.disconnectVoice();
429
+ this._disconnectVoice(false);
393
430
  } catch (error) {
394
431
  console.error(
395
432
  "[assistant-ui] Voice cleanup threw before reconnect",
@@ -397,7 +434,14 @@ export abstract class BaseThreadRuntimeCore
397
434
  );
398
435
  }
399
436
 
400
- const session = adapter.connect({});
437
+ let session: RealtimeVoiceAdapter.Session;
438
+ try {
439
+ session = adapter.connect({});
440
+ } catch (error) {
441
+ if (replacing && this._voiceSession === undefined)
442
+ this._onVoiceDisconnected();
443
+ throw error;
444
+ }
401
445
  this._voiceSession = session;
402
446
  const unsubs: Array<() => void> = [];
403
447
  this._voiceUnsubs = unsubs;
@@ -433,10 +477,12 @@ export abstract class BaseThreadRuntimeCore
433
477
 
434
478
  unsubs.push(
435
479
  session.onStatusChange((status) => {
480
+ if (this._voiceSession !== session) return;
436
481
  if (status.type === "ended") {
437
482
  this._finishVoiceAssistantMessage();
438
483
  this._voiceSession = undefined;
439
484
  this.voice = undefined;
485
+ this._onVoiceDisconnected();
440
486
  } else {
441
487
  this.voice = {
442
488
  status,
@@ -477,17 +523,19 @@ export abstract class BaseThreadRuntimeCore
477
523
  this._handleVoiceTranscript(transcript);
478
524
  }),
479
525
  );
480
- finishDetachedSetup();
526
+ if (!finishDetachedSetup()) this._onVoiceConnected();
481
527
  } catch (error) {
482
528
  if (this._voiceSession === session && this._voiceUnsubs === unsubs) {
483
529
  try {
484
- this.disconnectVoice();
530
+ this._disconnectVoice(false);
485
531
  } catch (cleanupError) {
486
532
  console.error(
487
533
  "[assistant-ui] Voice rollback cleanup threw",
488
534
  cleanupError,
489
535
  );
490
536
  }
537
+ if (replacing && this._voiceSession === undefined)
538
+ this._onVoiceDisconnected();
491
539
  } else {
492
540
  finishDetachedSetup();
493
541
  }
@@ -507,7 +555,7 @@ export abstract class BaseThreadRuntimeCore
507
555
  this._currentAssistantMsg = null;
508
556
 
509
557
  if (transcript.isFinal) {
510
- this._voiceMessages.push({
558
+ const message: ThreadMessage = {
511
559
  id: generateId(),
512
560
  role: "user",
513
561
  content: [{ type: "text", text: transcript.text }],
@@ -515,7 +563,9 @@ export abstract class BaseThreadRuntimeCore
515
563
  createdAt: new Date(),
516
564
  status: { type: "complete", reason: "unknown" },
517
565
  attachments: [],
518
- });
566
+ };
567
+ this._voiceMessages.push(message);
568
+ this._commitVoiceMessage(message);
519
569
  this._markVoiceMessagesDirty();
520
570
  this._notifySubscribers();
521
571
  }
@@ -554,6 +604,7 @@ export abstract class BaseThreadRuntimeCore
554
604
  }
555
605
 
556
606
  if (transcript.isFinal) {
607
+ this._commitVoiceMessage(this._currentAssistantMsg);
557
608
  this._currentAssistantMsg = null;
558
609
  }
559
610
 
@@ -562,7 +613,7 @@ export abstract class BaseThreadRuntimeCore
562
613
  }
563
614
  }
564
615
 
565
- private _finishVoiceAssistantMessage() {
616
+ private _finishVoiceAssistantMessage(notify = true) {
566
617
  const last = this._voiceMessages.at(-1);
567
618
  if (last?.role === "assistant" && last.status.type === "running") {
568
619
  const idx = this._voiceMessages.length - 1;
@@ -570,12 +621,19 @@ export abstract class BaseThreadRuntimeCore
570
621
  ...(last as ThreadAssistantMessage),
571
622
  status: { type: "complete", reason: "stop" },
572
623
  };
624
+ this._commitVoiceMessage(this._voiceMessages[idx]!);
625
+ this._currentAssistantMsg = null;
573
626
  this._markVoiceMessagesDirty();
574
- this._notifySubscribers();
627
+ if (notify) this._notifySubscribers();
575
628
  }
576
629
  }
577
630
 
578
631
  public disconnectVoice() {
632
+ this._disconnectVoice(true);
633
+ }
634
+
635
+ private _disconnectVoice(fireHook: boolean) {
636
+ this._finishVoiceAssistantMessage(false);
579
637
  this._currentAssistantMsg = null;
580
638
  // Drain the shared list in place so reentrant setup cannot release the same handles again.
581
639
  const unsubs = this._voiceUnsubs.splice(0);
@@ -591,18 +649,23 @@ export abstract class BaseThreadRuntimeCore
591
649
  this._voiceMessages = [];
592
650
  this._markVoiceMessagesDirty();
593
651
 
594
- notifySubscribers([
595
- ...unsubs,
596
- ...(stopSpeaking ? [stopSpeaking] : []),
597
- ...(session ? [() => session.disconnect()] : []),
598
- () =>
599
- notifyEventListeners(
600
- this._voiceVolumeSubscribers,
601
- undefined,
602
- "Voice volume",
603
- ),
604
- () => this._notifySubscribers(),
605
- ]);
652
+ try {
653
+ notifySubscribers([
654
+ ...unsubs,
655
+ ...(stopSpeaking ? [stopSpeaking] : []),
656
+ ...(session ? [() => session.disconnect()] : []),
657
+ () =>
658
+ notifyEventListeners(
659
+ this._voiceVolumeSubscribers,
660
+ undefined,
661
+ "Voice volume",
662
+ ),
663
+ () => this._notifySubscribers(),
664
+ ]);
665
+ } finally {
666
+ if (fireHook && session && this._voiceSession === undefined)
667
+ this._onVoiceDisconnected();
668
+ }
606
669
  }
607
670
 
608
671
  public muteVoice() {
@@ -14,7 +14,7 @@ export class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {
14
14
  }
15
15
 
16
16
  public get canSend() {
17
- return !this.isEmpty && !this._isSending;
17
+ return !this.isEmpty && !this.runtime.voice && !this._isSending;
18
18
  }
19
19
 
20
20
  protected getAttachmentAdapter() {
@@ -52,7 +52,17 @@ export class DefaultEditComposerRuntimeCore extends BaseComposerRuntimeCore {
52
52
  ) {
53
53
  super();
54
54
  this.runtime = runtime;
55
- this.endEditCallback = endEditCallback;
55
+ let lastHasVoice = runtime.voice !== undefined;
56
+ const unsubscribe = runtime.subscribe(() => {
57
+ const hasVoice = runtime.voice !== undefined;
58
+ if (hasVoice === lastHasVoice) return;
59
+ lastHasVoice = hasVoice;
60
+ this._notifySubscribers();
61
+ });
62
+ this.endEditCallback = () => {
63
+ unsubscribe();
64
+ endEditCallback();
65
+ };
56
66
  this._parentId = parentId;
57
67
  this._sourceId = message.id;
58
68
  this.setText(getThreadMessageText(message));
@@ -26,7 +26,12 @@ export class DefaultThreadComposerRuntimeCore
26
26
  }
27
27
 
28
28
  public get canSend() {
29
- return !this.isEmpty && !this.runtime.isSendDisabled && !this._isSending;
29
+ return (
30
+ !this.isEmpty &&
31
+ !this.runtime.isSendDisabled &&
32
+ !this.runtime.voice &&
33
+ !this._isSending
34
+ );
30
35
  }
31
36
 
32
37
  private _queueCache:
@@ -99,6 +104,7 @@ export class DefaultThreadComposerRuntimeCore
99
104
  public connect() {
100
105
  let lastCanCancel = false;
101
106
  let lastIsSendDisabled = this.runtime.isSendDisabled;
107
+ let lastHasVoice = this.runtime.voice !== undefined;
102
108
  let lastQueue = this.queue;
103
109
  return this.runtime.subscribe(() => {
104
110
  let changed = false;
@@ -111,6 +117,11 @@ export class DefaultThreadComposerRuntimeCore
111
117
  lastIsSendDisabled = this.runtime.isSendDisabled;
112
118
  changed = true;
113
119
  }
120
+ const hasVoice = this.runtime.voice !== undefined;
121
+ if (lastHasVoice !== hasVoice) {
122
+ lastHasVoice = hasVoice;
123
+ changed = true;
124
+ }
114
125
  if (lastQueue !== this.queue) {
115
126
  lastQueue = this.queue;
116
127
  changed = true;
@@ -71,6 +71,7 @@ export type RespondToToolApprovalOptions = {
71
71
  export type SubmitFeedbackOptions = {
72
72
  messageId: string;
73
73
  type: "negative" | "positive";
74
+ comment?: string;
74
75
  };
75
76
 
76
77
  export type ThreadSuggestion = {
@@ -95,6 +96,7 @@ export type VoiceSessionState = {
95
96
 
96
97
  export type SubmittedFeedback = {
97
98
  readonly type: "negative" | "positive";
99
+ readonly comment?: string;
98
100
  };
99
101
 
100
102
  export type ThreadRuntimeEventPayload = {
@@ -25,6 +25,8 @@ export type MessageQueueDriver = {
25
25
 
26
26
  export type MessageQueueController = {
27
27
  readonly adapter: ExternalThreadQueueAdapter;
28
+ hold: () => void;
29
+ release: () => void;
28
30
  /** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */
29
31
  notifyBusy: () => void;
30
32
  /** Advances to the next pending message; call on the run's falling edge. */
@@ -88,6 +90,7 @@ export const createMessageQueue = (
88
90
 
89
91
  let running = false;
90
92
  let paused = false;
93
+ let held = false;
91
94
  let dispatchTransform: (message: AppendMessage) => AppendMessage = (m) => m;
92
95
  // swallow the cancelled run's settle when steering so it does not double-advance
93
96
  let suppressIdle = 0;
@@ -133,7 +136,7 @@ export const createMessageQueue = (
133
136
  };
134
137
 
135
138
  const advance = () => {
136
- if (running || paused) return;
139
+ if (running || paused || held) return;
137
140
  const lane: Lane = lanes.steer.length > 0 ? "steer" : "queue";
138
141
  const head = lanes[lane][0];
139
142
  if (!head) return;
@@ -334,6 +337,13 @@ export const createMessageQueue = (
334
337
 
335
338
  return {
336
339
  adapter,
340
+ hold: () => {
341
+ held = true;
342
+ },
343
+ release: () => {
344
+ held = false;
345
+ advance();
346
+ },
337
347
  notifyBusy: () => {
338
348
  paused = false;
339
349
  // a cancelled run's settle that is still outstanding belongs to a run
@@ -152,6 +152,49 @@ describe("chunkExternalMessages", () => {
152
152
  ]);
153
153
  expect(chunks[1]?.inputs).toEqual([answer]);
154
154
  });
155
+
156
+ it("keeps a voice assistant transcript out of the neighbouring assistant chunks", () => {
157
+ const typed = {};
158
+ const spoken = {};
159
+ const spokenAgain = {};
160
+ const typedAgain = {};
161
+ const callbackResults: ExternalMessageConverterCallbackResult<object>[] = [
162
+ { input: typed, outputs: [{ role: "assistant", content: "typed" }] },
163
+ {
164
+ input: spoken,
165
+ outputs: [
166
+ {
167
+ role: "assistant",
168
+ content: "spoken",
169
+ metadata: { modality: "voice" },
170
+ },
171
+ ],
172
+ },
173
+ {
174
+ input: spokenAgain,
175
+ outputs: [
176
+ {
177
+ role: "assistant",
178
+ content: "spoken again",
179
+ metadata: { modality: "voice" },
180
+ },
181
+ ],
182
+ },
183
+ {
184
+ input: typedAgain,
185
+ outputs: [{ role: "assistant", content: "typed again" }],
186
+ },
187
+ ];
188
+
189
+ const chunks = chunkExternalMessages(callbackResults);
190
+
191
+ expect(chunks.map((chunk) => chunk.inputs)).toEqual([
192
+ [typed],
193
+ [spoken],
194
+ [spokenAgain],
195
+ [typedAgain],
196
+ ]);
197
+ });
155
198
  });
156
199
 
157
200
  describe("convertExternalMessageChunk", () => {
@@ -348,11 +348,14 @@ export const chunkExternalMessages = <T>(
348
348
 
349
349
  for (const callbackResult of callbackResults) {
350
350
  for (const output of callbackResult.outputs) {
351
+ const isVoice =
352
+ output.role === "assistant" && output.metadata?.modality === "voice";
351
353
  if (
352
354
  (pendingNone && output.role !== "tool") ||
353
355
  !isAssistant ||
354
356
  output.role === "user" ||
355
- output.role === "system"
357
+ output.role === "system" ||
358
+ isVoice
356
359
  ) {
357
360
  flush();
358
361
  }
@@ -365,7 +368,8 @@ export const chunkExternalMessages = <T>(
365
368
 
366
369
  if (
367
370
  output.role === "assistant" &&
368
- (output.convertConfig?.joinStrategy === "none" ||
371
+ (isVoice ||
372
+ output.convertConfig?.joinStrategy === "none" ||
369
373
  joinStrategy === "none")
370
374
  ) {
371
375
  pendingNone = true;
@@ -0,0 +1,174 @@
1
+ import type { CompleteAttachment } from "../../types/attachment";
2
+ import type {
3
+ ThreadAssistantMessagePart,
4
+ ThreadMessage,
5
+ ThreadUserMessagePart,
6
+ } from "../../types/message";
7
+ import { isRecord } from "../../utils/json/is-json";
8
+
9
+ export const MAX_STORED_MESSAGE_DEPTH = 100;
10
+
11
+ type StoredPartGuard = (part: Record<string, unknown>) => boolean;
12
+
13
+ export type StoredMessagePart = Record<string, unknown> & { type: string };
14
+
15
+ export const parseStoredDate = (value: unknown): Date | null => {
16
+ if (value instanceof Date && !Number.isNaN(value.getTime())) return value;
17
+ if (typeof value !== "string" && typeof value !== "number") return null;
18
+
19
+ const date = new Date(value);
20
+ return Number.isNaN(date.getTime()) ? null : date;
21
+ };
22
+
23
+ export const isStoredMessageRole = (
24
+ value: unknown,
25
+ ): value is ThreadMessage["role"] =>
26
+ value === "system" || value === "user" || value === "assistant";
27
+
28
+ /**
29
+ * Builds the readability predicate for a persistence boundary. A stored part is
30
+ * readable when it passes the guard for its known type, or when its type is
31
+ * unknown and the boundary can still read it.
32
+ *
33
+ * Unknown types are where the boundaries part: local storage hands its rows to
34
+ * the runtime untouched, so a type written by a newer release still loads,
35
+ * while the aui/v0 decoder converts a `data-` prefix and throws on anything
36
+ * else unknown. Per-type differences ride in `overrides`.
37
+ */
38
+ const makeIsStoredMessagePart = (
39
+ overrides: Partial<
40
+ Record<
41
+ (ThreadUserMessagePart | ThreadAssistantMessagePart)["type"],
42
+ StoredPartGuard
43
+ >
44
+ >,
45
+ isReadableUnknownType: (type: string) => boolean,
46
+ ) => {
47
+ const storedPartGuards = {
48
+ text: (part) => typeof part.text === "string",
49
+ reasoning: (part) =>
50
+ typeof part.text === "string" ||
51
+ typeof part.unstable_summary === "string",
52
+ image: (part) => typeof part.image === "string",
53
+ file: (part) =>
54
+ typeof part.data === "string" && typeof part.mimeType === "string",
55
+ audio: (part) =>
56
+ isRecord(part.audio) &&
57
+ typeof part.audio.data === "string" &&
58
+ typeof part.audio.format === "string",
59
+ data: (part) => typeof part.name === "string",
60
+ source: (part) =>
61
+ typeof part.id === "string" &&
62
+ (part.sourceType === "url"
63
+ ? typeof part.url === "string"
64
+ : part.sourceType === "document" &&
65
+ typeof part.title === "string" &&
66
+ typeof part.mediaType === "string"),
67
+ "generative-ui": (part) => isRecord(part.spec),
68
+ "tool-call": (part) =>
69
+ typeof part.toolCallId === "string" &&
70
+ typeof part.toolName === "string" &&
71
+ isRecord(part.args) &&
72
+ typeof part.argsText === "string",
73
+ } satisfies Record<
74
+ (ThreadUserMessagePart | ThreadAssistantMessagePart)["type"],
75
+ StoredPartGuard
76
+ >;
77
+ const guards: Record<string, StoredPartGuard> = {
78
+ ...storedPartGuards,
79
+ ...overrides,
80
+ };
81
+
82
+ return (value: unknown): value is StoredMessagePart =>
83
+ isRecord(value) &&
84
+ typeof value.type === "string" &&
85
+ (Object.hasOwn(guards, value.type)
86
+ ? guards[value.type]!(value)
87
+ : isReadableUnknownType(value.type));
88
+ };
89
+
90
+ export const isStoredMessagePart = makeIsStoredMessagePart({}, () => true);
91
+
92
+ /**
93
+ * The aui/v0 decoder dereferences each present field rather than reading only
94
+ * the one it needs, so this boundary checks every field it will touch, while
95
+ * local storage stays no stricter than what the runtime itself writes.
96
+ */
97
+ const isStoredAuiV0Part = makeIsStoredMessagePart(
98
+ {
99
+ reasoning: (part) =>
100
+ (part.text === undefined || typeof part.text === "string") &&
101
+ (part.unstable_summary === undefined ||
102
+ typeof part.unstable_summary === "string") &&
103
+ (typeof part.text === "string" ||
104
+ typeof part.unstable_summary === "string"),
105
+ "tool-call": (part) =>
106
+ typeof part.toolCallId === "string" &&
107
+ typeof part.toolName === "string" &&
108
+ (part.args === undefined || isRecord(part.args)) &&
109
+ (part.argsText === undefined || typeof part.argsText === "string") &&
110
+ (part.args !== undefined || part.argsText !== undefined),
111
+ },
112
+ (type) => type.startsWith("data-"),
113
+ );
114
+
115
+ const rolePartTypes = {
116
+ user: {
117
+ text: true,
118
+ image: true,
119
+ file: true,
120
+ data: true,
121
+ audio: true,
122
+ } satisfies Record<ThreadUserMessagePart["type"], true>,
123
+ assistant: {
124
+ text: true,
125
+ reasoning: true,
126
+ "tool-call": true,
127
+ source: true,
128
+ file: true,
129
+ image: true,
130
+ data: true,
131
+ "generative-ui": true,
132
+ } satisfies Record<ThreadAssistantMessagePart["type"], true>,
133
+ };
134
+
135
+ /**
136
+ * `fromThreadMessageLike` converts each part through its role's branch and
137
+ * throws on a part that branch does not carry, which would cost the whole
138
+ * stored row. The aui/v0 boundary decodes through that converter, so it filters
139
+ * by role as well as by shape. A part type unknown to this table is left to the
140
+ * boundary predicate, which keeps the `data-` prefixes the converter handles.
141
+ */
142
+ export const isStoredAuiV0RolePart = (
143
+ role: ThreadMessage["role"],
144
+ value: unknown,
145
+ ): value is StoredMessagePart =>
146
+ isStoredAuiV0Part(value) &&
147
+ (role === "system"
148
+ ? value.type === "text"
149
+ : Object.hasOwn(rolePartTypes.assistant, value.type) ||
150
+ Object.hasOwn(rolePartTypes.user, value.type)
151
+ ? Object.hasOwn(rolePartTypes[role], value.type)
152
+ : true);
153
+
154
+ export const parseStoredAttachment = (
155
+ value: unknown,
156
+ isPart: (value: unknown) => value is StoredMessagePart,
157
+ ): CompleteAttachment | null => {
158
+ if (
159
+ !isRecord(value) ||
160
+ typeof value.id !== "string" ||
161
+ typeof value.type !== "string" ||
162
+ typeof value.name !== "string" ||
163
+ !isRecord(value.status) ||
164
+ value.status.type !== "complete" ||
165
+ !Array.isArray(value.content)
166
+ ) {
167
+ return null;
168
+ }
169
+
170
+ return {
171
+ ...value,
172
+ content: value.content.filter(isPart),
173
+ } as CompleteAttachment;
174
+ };
@@ -80,14 +80,19 @@ export type ThreadMessageLike = {
80
80
  | undefined;
81
81
  readonly metadata?:
82
82
  | {
83
- readonly unstable_state?: ReadonlyJSONValue;
83
+ readonly unstable_state?: ReadonlyJSONValue | undefined;
84
84
  readonly unstable_annotations?:
85
85
  | readonly ReadonlyJSONValue[]
86
86
  | undefined;
87
87
  readonly unstable_data?: readonly ReadonlyJSONValue[] | undefined;
88
88
  readonly steps?: readonly ThreadStep[] | undefined;
89
89
  readonly timing?: MessageTiming | undefined;
90
- readonly submittedFeedback?: { readonly type: "positive" | "negative" };
90
+ readonly submittedFeedback?:
91
+ | {
92
+ readonly type: "positive" | "negative";
93
+ readonly comment?: string;
94
+ }
95
+ | undefined;
91
96
  readonly isOptimistic?: boolean | undefined;
92
97
  readonly modality?: MessageModality | undefined;
93
98
  readonly custom?: Record<string, unknown> | undefined;
@@ -133,6 +133,10 @@ type ExternalStoreAdapterBase<T> = {
133
133
  * back, because the runtime cannot see a removal it did not make.
134
134
  */
135
135
  setMessages?: ((messages: readonly T[]) => void) | undefined;
136
+ /**
137
+ * Called with each finalized voice transcript message. The host appends it to its own messages under the same id, which is how the runtime knows the host carries it. A host that does not implement this callback keeps transcripts for the session only.
138
+ */
139
+ onVoiceTranscript?: ((message: ThreadMessage) => void) | undefined;
136
140
  /**
137
141
  * Fires when the user explicitly switches branches via the runtime's
138
142
  * `switchToBranch` action (e.g. a BranchPicker click). It does not fire on