@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
@@ -475,6 +475,17 @@ export class ExternalStoreThreadRuntimeCore
475
475
  this._messages = messagesSnapshot;
476
476
  }
477
477
 
478
+ if (this._voiceMessages.length > 0) {
479
+ const hostIds = new Set(this._messages.map((message) => message.id));
480
+ const remaining = this._voiceMessages.filter(
481
+ (message) => !hostIds.has(message.id),
482
+ );
483
+ if (remaining.length !== this._voiceMessages.length) {
484
+ this._voiceMessages = remaining;
485
+ this._markVoiceMessagesDirty();
486
+ }
487
+ }
488
+
478
489
  if (repositoryChanged) {
479
490
  this._runTrackerUpdate(() => this._toolInvocations?.reset());
480
491
  }
@@ -637,23 +648,31 @@ export class ExternalStoreThreadRuntimeCore
637
648
  }
638
649
 
639
650
  public async append(rawMessage: AppendMessage): Promise<void> {
640
- if (this._isVoiceMessage(rawMessage.sourceId))
651
+ let message = {
652
+ ...rawMessage,
653
+ parentId: this._resolveAppendParent(rawMessage.parentId),
654
+ };
655
+ if (this.voice)
656
+ throw new Error(
657
+ "Cannot send a text message while a voice session is connected",
658
+ );
659
+ if (this._isVoiceMessage(message.sourceId))
641
660
  throw new Error("Voice transcript messages cannot be edited");
642
661
  // sourceId marks an edit send; the parent may coincide with the head
643
662
  // after a resync (e.g. cancelRun dropped the edited message).
644
663
  const isEdit =
645
- rawMessage.sourceId != null ||
646
- rawMessage.parentId !== (this.messages.at(-1)?.id ?? null);
664
+ message.sourceId != null ||
665
+ message.parentId !== (this._getBaseMessages().at(-1)?.id ?? null);
647
666
 
648
667
  // A transformed-queue send is stamped at flush; any other queue's
649
668
  // transform would gate against its own thread's messages, so those stamp
650
669
  // at send.
651
- const message =
670
+ message =
652
671
  !isEdit &&
653
672
  this._store.queue &&
654
673
  this._store.queue === this._transformedQueue
655
- ? rawMessage
656
- : this.enrichAppendMetadata(rawMessage);
674
+ ? message
675
+ : this.enrichAppendMetadata(message);
657
676
 
658
677
  const generation = captureThreadRuntimeGeneration(this);
659
678
  this.ensureInitialized();
@@ -707,6 +726,10 @@ export class ExternalStoreThreadRuntimeCore
707
726
  }
708
727
  }
709
728
 
729
+ protected override _commitVoiceMessage(message: ThreadMessage): void {
730
+ this._store.onVoiceTranscript?.(message);
731
+ }
732
+
710
733
  public async deleteMessage(messageId: string): Promise<void> {
711
734
  if (this._store.onDelete) {
712
735
  // The host owns deletion here, and it may decline (fail a server call,
@@ -763,7 +786,14 @@ export class ExternalStoreThreadRuntimeCore
763
786
  }
764
787
 
765
788
  this.repository.deleteMessage(messageId);
766
- this._messages = this.repository.getMessages();
789
+ this._publishRepositoryMessages();
790
+ }
791
+
792
+ // Notifies even when the visible messages are unchanged: deleting an
793
+ // off-branch message still changes the branch counts subscribers read.
794
+ private _publishRepositoryMessages() {
795
+ const messages = this.repository.getMessages();
796
+ if (!shallowArrayEqual(this._messages, messages)) this._messages = messages;
767
797
  this._notifySubscribers();
768
798
  }
769
799
 
@@ -788,6 +818,8 @@ export class ExternalStoreThreadRuntimeCore
788
818
  public async startRun(config: StartRunConfig): Promise<void> {
789
819
  if (!this._store.onReload)
790
820
  throw new Error("Runtime does not support reloading messages.");
821
+ if (this.voice)
822
+ throw new Error("Cannot start a run while a voice session is connected");
791
823
  if (this._isVoiceMessage(config.sourceId))
792
824
  throw new Error("Voice transcript messages cannot be reloaded");
793
825
 
@@ -804,6 +836,8 @@ export class ExternalStoreThreadRuntimeCore
804
836
  public async resumeRun(config: ResumeRunConfig): Promise<void> {
805
837
  if (!this._store.onResume)
806
838
  throw new Error("Runtime does not support resuming runs.");
839
+ if (this.voice)
840
+ throw new Error("Cannot start a run while a voice session is connected");
807
841
  if (this._isVoiceMessage(config.sourceId))
808
842
  throw new Error("Voice transcript messages cannot be reloaded");
809
843
 
@@ -898,7 +932,7 @@ export class ExternalStoreThreadRuntimeCore
898
932
  movedLeaf = { id: trailingUserLeaf.id, draft };
899
933
  }
900
934
  }
901
- if (!movedLeaf) this._notifySubscribers();
935
+ this._publishRepositoryMessages();
902
936
 
903
937
  // The resync commits what the cancel left (a kept optimistic message, the
904
938
  // restored branch) back to the store a macrotask later. The store may move
@@ -920,7 +954,8 @@ export class ExternalStoreThreadRuntimeCore
920
954
  this.composer.retractDraft(movedLeaf.draft);
921
955
  }
922
956
  }
923
- this.updateMessages(this.repository.getMessages());
957
+ this._publishRepositoryMessages();
958
+ this.updateMessages(this._messages);
924
959
  }, 0);
925
960
  }
926
961
 
@@ -6,6 +6,7 @@ import type {
6
6
  ChatModelRunResult,
7
7
  } from "../../runtime/utils/chat-model-adapter";
8
8
  import type { AppendMessage, ToolCallMessagePart } from "../../types/message";
9
+ import type { ThreadHistoryAdapter } from "../../adapters/thread-history";
9
10
  import type { LocalRuntimeOptionsBase } from "./local-runtime-options";
10
11
  import {
11
12
  ExportedMessageRepository,
@@ -407,6 +408,76 @@ describe("LocalThreadRuntimeCore human-in-the-loop tools", () => {
407
408
  });
408
409
  });
409
410
 
411
+ describe("LocalThreadRuntimeCore addToolResult content", () => {
412
+ it("stores modelContent and forwards it to the resumed adapter", async () => {
413
+ const { thread, runs } = createApprovalThread(toolCallResult("send_email"));
414
+
415
+ await thread.append(userMessage("send an email"));
416
+ await flush();
417
+
418
+ thread.addToolResult({
419
+ messageId: thread.messages.at(-1)!.id,
420
+ toolCallId: "call-send_email",
421
+ toolName: "send_email",
422
+ result: { approved: true },
423
+ isError: false,
424
+ modelContent: [{ type: "text", text: "Email sent." }],
425
+ });
426
+ await flush();
427
+
428
+ const resumedToolCall = runs[1]!
429
+ .unstable_getMessage()
430
+ .content.find((part) => part.type === "tool-call");
431
+ expect(resumedToolCall?.modelContent).toEqual([
432
+ { type: "text", text: "Email sent." },
433
+ ]);
434
+
435
+ const storedToolCall = thread.messages
436
+ .at(-1)!
437
+ .content.find((part) => part.type === "tool-call");
438
+ expect(storedToolCall?.modelContent).toEqual([
439
+ { type: "text", text: "Email sent." },
440
+ ]);
441
+ });
442
+
443
+ it("keeps a stored artifact when a later result omits it", async () => {
444
+ const { thread } = createApprovalThread(toolCallResult("send_email"));
445
+
446
+ await thread.append(userMessage("send an email"));
447
+ await flush();
448
+
449
+ const messageId = thread.messages.at(-1)!.id;
450
+ thread.addToolResult({
451
+ messageId,
452
+ toolCallId: "call-send_email",
453
+ toolName: "send_email",
454
+ result: { approved: true },
455
+ isError: false,
456
+ artifact: { draftId: "d-1" },
457
+ });
458
+ await flush();
459
+
460
+ thread.addToolResult({
461
+ messageId,
462
+ toolCallId: "call-send_email",
463
+ toolName: "send_email",
464
+ result: { approved: true, sent: true },
465
+ isError: false,
466
+ });
467
+ await flush();
468
+
469
+ const storedToolCall = thread.messages
470
+ .map((message) =>
471
+ message.content.find(
472
+ (part): part is ToolCallMessagePart =>
473
+ part.type === "tool-call" && part.toolCallId === "call-send_email",
474
+ ),
475
+ )
476
+ .find((part): part is ToolCallMessagePart => part !== undefined);
477
+ expect(storedToolCall?.artifact).toEqual({ draftId: "d-1" });
478
+ });
479
+ });
480
+
410
481
  describe("LocalThreadRuntimeCore state", () => {
411
482
  it.each([
412
483
  ["false", false],
@@ -856,7 +927,7 @@ describe("LocalThreadRuntimeCore cancellation", () => {
856
927
  const toolCall = thread.messages
857
928
  .find((item) => item.id === messageId)
858
929
  ?.content.find(
859
- (part) =>
930
+ (part): part is ToolCallMessagePart =>
860
931
  part.type === "tool-call" && part.toolCallId === "call-send_email",
861
932
  );
862
933
  expect(toolCall?.result).toEqual({ approved: true });
@@ -864,9 +935,10 @@ describe("LocalThreadRuntimeCore cancellation", () => {
864
935
 
865
936
  resolveSecond({ content: [{ type: "text", text: "replacement" }] });
866
937
  await vi.waitFor(() => {
867
- expect(
868
- thread.messages.find((item) => item.id === messageId)?.status.type,
869
- ).toBe("complete");
938
+ const message = thread.messages.find((item) => item.id === messageId);
939
+ if (message?.role !== "assistant")
940
+ throw new Error("expected assistant message");
941
+ expect(message.status.type).toBe("complete");
870
942
  });
871
943
  });
872
944
 
@@ -915,16 +987,19 @@ describe("LocalThreadRuntimeCore cancellation", () => {
915
987
  await appendPromise;
916
988
 
917
989
  const message = thread.messages.find((item) => item.id === messageId);
918
- const sendEmail = message?.content.find(
919
- (part) =>
990
+ if (message?.role !== "assistant")
991
+ throw new Error("expected assistant message");
992
+ const sendEmail = message.content.find(
993
+ (part): part is ToolCallMessagePart =>
920
994
  part.type === "tool-call" && part.toolCallId === "call-send_email",
921
995
  );
922
- const deploy = message?.content.find(
923
- (part) => part.type === "tool-call" && part.toolCallId === "call-deploy",
996
+ const deploy = message.content.find(
997
+ (part): part is ToolCallMessagePart =>
998
+ part.type === "tool-call" && part.toolCallId === "call-deploy",
924
999
  );
925
1000
  expect(sendEmail?.result).toEqual({ approved: true });
926
1001
  expect(deploy?.approval).toEqual({ id: "approval-1" });
927
- expect(message?.status.type).toBe("requires-action");
1002
+ expect(message.status.type).toBe("requires-action");
928
1003
  });
929
1004
 
930
1005
  it("ignores a superseded result after its message is removed", async () => {
@@ -1851,7 +1926,7 @@ describe("LocalThreadRuntimeCore runs", () => {
1851
1926
  ],
1852
1927
  status: { type: "requires-action", reason: "tool-calls" },
1853
1928
  metadata: {
1854
- steps: [{ usage: { promptTokens: 10, completionTokens: 5 } }],
1929
+ steps: [{ usage: { inputTokens: 10, outputTokens: 5 } }],
1855
1930
  },
1856
1931
  }));
1857
1932
  const thread = createPlainThread({ run }, { maxSteps: 1 });
@@ -1913,7 +1988,7 @@ describe("LocalThreadRuntimeCore runs", () => {
1913
1988
  run: async () => ({ content: [] }),
1914
1989
  };
1915
1990
  const thread = createPlainThread(adapter);
1916
- const load = vi.fn(async () => ({
1991
+ const load = vi.fn<ThreadHistoryAdapter["load"]>(async () => ({
1917
1992
  headId: "restored",
1918
1993
  messages: [
1919
1994
  {
@@ -1922,6 +1997,7 @@ describe("LocalThreadRuntimeCore runs", () => {
1922
1997
  id: "restored",
1923
1998
  role: "user" as const,
1924
1999
  content: [{ type: "text" as const, text: "hello" }],
2000
+ attachments: [],
1925
2001
  createdAt: new Date(0),
1926
2002
  metadata: { custom: {} },
1927
2003
  },
@@ -1950,7 +2026,7 @@ describe("LocalThreadRuntimeCore runs", () => {
1950
2026
  run: async () => ({ content: [] }),
1951
2027
  };
1952
2028
  const thread = createPlainThread(adapter);
1953
- const load = vi.fn(async () => ({
2029
+ const load = vi.fn<ThreadHistoryAdapter["load"]>(async () => ({
1954
2030
  headId: "restored",
1955
2031
  messages: [
1956
2032
  {
@@ -1959,6 +2035,7 @@ describe("LocalThreadRuntimeCore runs", () => {
1959
2035
  id: "restored",
1960
2036
  role: "user" as const,
1961
2037
  content: [{ type: "text" as const, text: "hello" }],
2038
+ attachments: [],
1962
2039
  createdAt: new Date(0),
1963
2040
  metadata: { custom: {} },
1964
2041
  },
@@ -2220,3 +2297,82 @@ describe("LocalThreadRuntimeCore imported approvals", () => {
2220
2297
  expect(thread.messages.at(-1)?.status?.type).toBe("complete");
2221
2298
  });
2222
2299
  });
2300
+
2301
+ describe("LocalThreadRuntimeCore message queue", () => {
2302
+ const createQueuedThread = () => {
2303
+ const dispatched: string[] = [];
2304
+ let release!: () => void;
2305
+ let gate = new Promise<void>((resolve) => (release = resolve));
2306
+
2307
+ const core = new LocalRuntimeCore(
2308
+ {
2309
+ adapters: {
2310
+ chatModel: {
2311
+ async run(options) {
2312
+ const last = options.messages.at(-1);
2313
+ const text = last?.content
2314
+ .filter((part) => part.type === "text")
2315
+ .map((part) => (part as { text: string }).text)
2316
+ .join("");
2317
+ dispatched.push(text ?? "");
2318
+ await gate;
2319
+ return { content: [{ type: "text", text: "ok" }] };
2320
+ },
2321
+ },
2322
+ },
2323
+ unstable_enableMessageQueue: true,
2324
+ },
2325
+ undefined,
2326
+ );
2327
+
2328
+ // the in-flight run already awaits the current gate, so the next gate has
2329
+ // to be installed before releasing it or the run dispatched next resolves
2330
+ // against an already-settled promise
2331
+ const releaseRun = async () => {
2332
+ const releaseCurrent = release;
2333
+ gate = new Promise<void>((resolve) => (release = resolve));
2334
+ releaseCurrent();
2335
+ await flush();
2336
+ };
2337
+
2338
+ return {
2339
+ thread: core.threads.getMainThreadRuntimeCore(),
2340
+ dispatched,
2341
+ releaseRun,
2342
+ };
2343
+ };
2344
+
2345
+ it("keeps the steer lane for implicit sends during back-to-back queued runs", async () => {
2346
+ const { thread, dispatched, releaseRun } = createQueuedThread();
2347
+ // the queue lane is only taken for a message appended onto the tail
2348
+ const appendToTail = (text: string, steer?: boolean) =>
2349
+ void thread.append({
2350
+ ...userMessage(text),
2351
+ parentId: thread.messages.at(-1)?.id ?? null,
2352
+ ...(steer !== undefined && { steer }),
2353
+ });
2354
+
2355
+ appendToTail("first");
2356
+ await flush();
2357
+ expect(dispatched).toEqual(["first"]);
2358
+
2359
+ // buffers behind the running dispatch, so releasing "first" dispatches it
2360
+ appendToTail("second", false);
2361
+ await flush();
2362
+ await releaseRun();
2363
+ expect(dispatched).toEqual(["first", "second"]);
2364
+
2365
+ // "second" is a queue-dispatched run in flight, so an implicit send steers
2366
+ // ahead of a bulk item even though it is appended after it
2367
+ appendToTail("bulk", false);
2368
+ appendToTail("implicit");
2369
+ await flush();
2370
+ await releaseRun();
2371
+
2372
+ expect(dispatched).toEqual(["first", "second", "implicit"]);
2373
+
2374
+ await releaseRun();
2375
+ expect(dispatched).toEqual(["first", "second", "implicit", "bulk"]);
2376
+ await releaseRun();
2377
+ });
2378
+ });
@@ -114,7 +114,10 @@ export class LocalThreadRuntimeCore
114
114
  private abortController: AbortController | null = null;
115
115
 
116
116
  private _queue: MessageQueueController | null = null;
117
- private _queueRunInFlight = false;
117
+ // Identifies the dispatch in flight, not merely that one is: consecutive
118
+ // queue runs overlap, and the previous dispatch settles after the next one
119
+ // has already started.
120
+ private _queueRunInFlight: object | null = null;
118
121
  private _activeRun: { cancelled: boolean } | null = null;
119
122
  private _runGeneration = 0;
120
123
 
@@ -255,22 +258,29 @@ export class LocalThreadRuntimeCore
255
258
  run: (message) => {
256
259
  // release the queue when the dispatch settles, even if it rejects
257
260
  // before reaching startRun's finally, so a failure can't deadlock it
258
- this._queueRunInFlight = true;
261
+ const dispatch = {};
262
+ this._queueRunInFlight = dispatch;
259
263
  const generation = this._runGeneration;
260
264
  // the tail may have moved since the message was enqueued
261
265
  void this._runAppend({
262
266
  ...message,
263
- parentId: this.messages.at(-1)?.id ?? null,
267
+ parentId: this._resolveAppendParent(
268
+ this.messages.at(-1)?.id ?? null,
269
+ ),
264
270
  })
265
271
  .finally(() => {
266
- this._queueRunInFlight = false;
267
- // a dispatch that failed before starting a run settles here;
268
- // runs that did start release from _runLoop
269
- if (this._runGeneration === generation) this._queue?.notifyIdle();
272
+ if (this._queueRunInFlight === dispatch) {
273
+ this._queueRunInFlight = null;
274
+ // A dispatch that failed before starting a run settles here;
275
+ // runs that did start release from _runLoop.
276
+ if (this._runGeneration === generation)
277
+ this._queue?.notifyIdle();
278
+ }
270
279
  })
271
280
  .catch(() => {});
272
281
  },
273
282
  });
283
+ if (this.voice) this._queue.hold();
274
284
  this._queue.subscribe(() => this._notifySubscribers());
275
285
  } else if (!canQueue && this._queue) {
276
286
  this._queue = null;
@@ -342,12 +352,20 @@ export class LocalThreadRuntimeCore
342
352
  }
343
353
 
344
354
  public async append(message: AppendMessage): Promise<void> {
355
+ message = {
356
+ ...message,
357
+ parentId: this._resolveAppendParent(message.parentId),
358
+ };
359
+ if (this.voice)
360
+ throw new Error(
361
+ "Cannot send a text message while a voice session is connected",
362
+ );
345
363
  if (this._isVoiceMessage(message.sourceId))
346
364
  throw new Error("Voice transcript messages cannot be edited");
347
365
  const isTail = message.parentId === (this.messages.at(-1)?.id ?? null);
348
366
  const willRun = message.startRun ?? message.role === "user";
349
367
  if (this._queue && willRun && isTail) {
350
- if (message.steer ?? this._queueRunInFlight)
368
+ if (message.steer ?? this._queueRunInFlight !== null)
351
369
  this._queue.adapter.steer(message);
352
370
  else this._queue.adapter.enqueue(message);
353
371
  return;
@@ -361,6 +379,28 @@ export class LocalThreadRuntimeCore
361
379
  return this._runAppend(message);
362
380
  }
363
381
 
382
+ protected override _commitVoiceMessage(message: ThreadMessage): void {
383
+ const parentId = this.repository.headId;
384
+ this.repository.addOrUpdateMessage(parentId, message);
385
+ this.repository.resetHead(message.id);
386
+ void this._options.adapters.history
387
+ ?.append({ parentId, message })
388
+ .catch(() => {});
389
+ const index = this._voiceMessages.findIndex(
390
+ (voiceMessage) => voiceMessage.id === message.id,
391
+ );
392
+ if (index !== -1) this._voiceMessages.splice(index, 1);
393
+ this._markVoiceMessagesDirty();
394
+ }
395
+
396
+ protected override _onVoiceConnected(): void {
397
+ this._queue?.hold();
398
+ }
399
+
400
+ protected override _onVoiceDisconnected(): void {
401
+ this._queue?.release();
402
+ }
403
+
364
404
  public getQueueItems(): readonly QueueItemState[] {
365
405
  // Reads can arrive during base-thread construction, before the queue field
366
406
  // is assigned, so guard against the unset field.
@@ -388,7 +428,22 @@ export class LocalThreadRuntimeCore
388
428
  this._notifySubscribers();
389
429
  }
390
430
 
431
+ private _pendingAppends = 0;
432
+
433
+ protected override _isRunActive(): boolean {
434
+ return this._pendingAppends > 0 || super._isRunActive();
435
+ }
436
+
391
437
  private async _runAppend(rawMessage: AppendMessage): Promise<void> {
438
+ this._pendingAppends += 1;
439
+ try {
440
+ await this._runAppendInner(rawMessage);
441
+ } finally {
442
+ this._pendingAppends -= 1;
443
+ }
444
+ }
445
+
446
+ private async _runAppendInner(rawMessage: AppendMessage): Promise<void> {
392
447
  // Stamped here rather than in `append` so a queued message is gated after
393
448
  // the flush re-pointed its parentId at the current tail.
394
449
  const generation = captureThreadRuntimeGeneration(this);
@@ -494,6 +549,8 @@ export class LocalThreadRuntimeCore
494
549
  runCallback?: ChatModelAdapter["run"],
495
550
  ): Promise<void> {
496
551
  this.ensureInitialized();
552
+ if (this.voice)
553
+ throw new Error("Cannot start a run while a voice session is connected");
497
554
  if (this._isVoiceMessage(sourceId))
498
555
  throw new Error("Voice transcript messages cannot be reloaded");
499
556
 
@@ -523,6 +580,8 @@ export class LocalThreadRuntimeCore
523
580
  runConfig: RunConfig | undefined,
524
581
  runCallback?: ChatModelAdapter["run"],
525
582
  ): Promise<void> {
583
+ if (this.voice)
584
+ throw new Error("Cannot start a run while a voice session is connected");
526
585
  this._notifyEventSubscribers("runStart", {});
527
586
 
528
587
  // A run entered on a requires-action message resumes a pause an
@@ -849,7 +908,12 @@ export class LocalThreadRuntimeCore
849
908
  result,
850
909
  isError,
851
910
  artifact,
911
+ modelContent,
852
912
  }: AddToolResultOptions) {
913
+ if (this.voice)
914
+ throw new Error(
915
+ "Cannot add a tool result while a voice session is connected",
916
+ );
853
917
  const messageData = this.repository.getMessage(messageId);
854
918
  const { parentId } = messageData;
855
919
  let { message } = messageData;
@@ -864,11 +928,14 @@ export class LocalThreadRuntimeCore
864
928
  if (c.toolCallId !== toolCallId) return c;
865
929
  found = true;
866
930
  if (c.result === undefined) added = true;
931
+ // artifact and modelContent are optional; only override when supplied so
932
+ // a later result that omits them does not clobber a stored value.
867
933
  return {
868
934
  ...c,
869
935
  result,
870
- artifact,
871
936
  isError,
937
+ ...(artifact !== undefined && { artifact }),
938
+ ...(modelContent !== undefined && { modelContent }),
872
939
  };
873
940
  });
874
941
 
@@ -907,6 +974,10 @@ export class LocalThreadRuntimeCore
907
974
  text,
908
975
  reason,
909
976
  }: RespondToToolApprovalOptions): Promise<void> {
977
+ if (this.voice)
978
+ throw new Error(
979
+ "Cannot respond to a tool approval while a voice session is connected",
980
+ );
910
981
  let message = this.repository
911
982
  .getMessages()
912
983
  .findLast(
@@ -142,8 +142,13 @@ type MessageClientProps = {
142
142
  onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;
143
143
  onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;
144
144
  attachmentAdapter?: AttachmentAdapter | undefined;
145
- submittedFeedback: "positive" | "negative" | undefined;
146
- onSubmitFeedback: (feedback: { type: "positive" | "negative" }) => void;
145
+ submittedFeedback:
146
+ | { type: "positive" | "negative"; comment?: string }
147
+ | undefined;
148
+ onSubmitFeedback: (feedback: {
149
+ type: "positive" | "negative";
150
+ comment?: string;
151
+ }) => void;
147
152
  speech: SpeechState | undefined;
148
153
  onSpeak: () => void;
149
154
  onStopSpeaking: () => void;
@@ -236,7 +241,7 @@ const useMessageClient = ({
236
241
  ...message,
237
242
  metadata: {
238
243
  ...message.metadata,
239
- submittedFeedback: { type: submittedFeedback },
244
+ submittedFeedback,
240
245
  },
241
246
  }
242
247
  : message;
@@ -931,16 +936,24 @@ const useExternalThread = ({
931
936
  Record<
932
937
  string,
933
938
  {
934
- type: "positive" | "negative";
935
- external: "positive" | "negative" | undefined;
939
+ feedback: { type: "positive" | "negative"; comment?: string };
940
+ external:
941
+ | {
942
+ readonly type: "positive" | "negative";
943
+ readonly comment?: string;
944
+ }
945
+ | undefined;
936
946
  }
937
947
  >
938
948
  >({});
939
949
 
940
950
  const feedbackFor = (msg: ExternalThreadMessage) => {
941
951
  const entry = submittedFeedback[msg.id];
942
- return entry && msg.metadata.submittedFeedback?.type === entry.external
943
- ? entry.type
952
+ const external = msg.metadata.submittedFeedback;
953
+ return entry &&
954
+ external?.type === entry.external?.type &&
955
+ external?.comment === entry.external?.comment
956
+ ? entry.feedback
944
957
  : undefined;
945
958
  };
946
959
 
@@ -952,7 +965,11 @@ const useExternalThread = ({
952
965
  setSubmittedFeedback((prev) => {
953
966
  const live = Object.entries(prev).filter(([id, entry]) => {
954
967
  const msg = messages.find((m) => m.id === id);
955
- return !!msg && msg.metadata.submittedFeedback?.type === entry.external;
968
+ return (
969
+ !!msg &&
970
+ msg.metadata.submittedFeedback?.type === entry.external?.type &&
971
+ msg.metadata.submittedFeedback?.comment === entry.external?.comment
972
+ );
956
973
  });
957
974
  return live.length === Object.keys(prev).length
958
975
  ? prev
@@ -962,17 +979,21 @@ const useExternalThread = ({
962
979
 
963
980
  const handleSubmitFeedback = (
964
981
  message: ExternalThreadMessage,
965
- { type }: { type: "positive" | "negative" },
982
+ feedback: { type: "positive" | "negative"; comment?: string },
966
983
  ) => {
967
- if (!feedbackAdapter) throw new Error("Feedback adapter not configured");
968
- feedbackAdapter.submit({ message, type });
984
+ const comment = feedback.comment?.trim();
985
+ const submittedFeedback = {
986
+ type: feedback.type,
987
+ ...(comment ? { comment } : undefined),
988
+ };
989
+ feedbackAdapter?.submit({ message, ...submittedFeedback });
969
990
 
970
991
  if (message.role === "assistant") {
971
992
  setSubmittedFeedback((prev) => ({
972
993
  ...prev,
973
994
  [message.id]: {
974
- type,
975
- external: message.metadata.submittedFeedback?.type,
995
+ feedback: submittedFeedback,
996
+ external: message.metadata.submittedFeedback,
976
997
  },
977
998
  }));
978
999
  }
@@ -61,6 +61,14 @@ describe("primitive predicates", () => {
61
61
  state({ thread, message: { role: "assistant" } }),
62
62
  ),
63
63
  ).toBe(false);
64
+ expect(
65
+ actionBarReloadDisabled(
66
+ state({
67
+ thread: { ...thread, voice: {} },
68
+ message: { role: "assistant" },
69
+ }),
70
+ ),
71
+ ).toBe(true);
64
72
  expect(
65
73
  actionBarReloadDisabled(state({ thread, message: { role: "user" } })),
66
74
  ).toBe(true);
@@ -202,6 +210,14 @@ describe("primitive predicates", () => {
202
210
  state({ ...editable, composer: { isEditing: false } }),
203
211
  ),
204
212
  ).toBe(false);
213
+ expect(
214
+ actionBarEditDisabled(
215
+ state({
216
+ optional: { thread: { capabilities: { edit: true }, voice: {} } },
217
+ composer: { isEditing: false },
218
+ }),
219
+ ),
220
+ ).toBe(true);
205
221
  expect(
206
222
  actionBarEditDisabled(
207
223
  state({ ...editable, composer: { isEditing: true } }),