@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
@@ -6,7 +6,11 @@ import {
6
6
  import type { ExternalStoreAdapter } from "../runtimes/external-store/external-store-adapter";
7
7
  import type { RealtimeVoiceAdapter } from "../adapters/voice";
8
8
  import type { ModelContextProvider } from "../model-context/types";
9
- import type { AppendMessage, ThreadMessage } from "../types/message";
9
+ import type {
10
+ AppendMessage,
11
+ ThreadAssistantMessage,
12
+ ThreadMessage,
13
+ } from "../types/message";
10
14
  import { createMessageQueue } from "../runtime/queue/message-queue";
11
15
  import { getThreadMessageText } from "../utils/text";
12
16
  import { invalidateThreadRuntime } from "../runtime/utils/thread-runtime-lifecycle";
@@ -27,21 +31,23 @@ const createUserMessage = (id: string, text = "Hello"): ThreadMessage =>
27
31
  },
28
32
  }) as ThreadMessage;
29
33
 
30
- const createAssistantMessage = (id: string, text = "Hi there"): ThreadMessage =>
31
- ({
32
- id,
33
- role: "assistant" as const,
34
- createdAt: new Date(),
35
- content: [{ type: "text" as const, text }],
36
- status: { type: "complete" as const, reason: "stop" as const },
37
- metadata: {
38
- unstable_state: null,
39
- unstable_annotations: [],
40
- unstable_data: [],
41
- steps: [],
42
- custom: {},
43
- },
44
- }) as ThreadMessage;
34
+ const createAssistantMessage = (
35
+ id: string,
36
+ text = "Hi there",
37
+ ): ThreadAssistantMessage => ({
38
+ id,
39
+ role: "assistant" as const,
40
+ createdAt: new Date(),
41
+ content: [{ type: "text" as const, text }],
42
+ status: { type: "complete" as const, reason: "stop" as const },
43
+ metadata: {
44
+ unstable_state: null,
45
+ unstable_annotations: [],
46
+ unstable_data: [],
47
+ steps: [],
48
+ custom: {},
49
+ },
50
+ });
45
51
 
46
52
  const createBaseAdapter = (
47
53
  overrides: Partial<ExternalStoreAdapter<ThreadMessage>> = {},
@@ -457,6 +463,63 @@ describe("ExternalStoreThreadRuntimeCore adapter contract", () => {
457
463
  expect(lastCall).toEqual([]);
458
464
  });
459
465
 
466
+ it.each([
467
+ { label: "without setMessages", withSetMessages: false, ids: ["u1"] },
468
+ { label: "with setMessages", withSetMessages: true, ids: [] },
469
+ ])(
470
+ "publishes only resolvable messages through the rollback $label",
471
+ async ({ withSetMessages, ids }) => {
472
+ const setMessages = vi.fn();
473
+ const adapter = () =>
474
+ createBaseAdapter({
475
+ messages: [createUserMessage("u1", "cancel me")],
476
+ isRunning: true,
477
+ onCancel: vi.fn(),
478
+ ...(withSetMessages && { setMessages }),
479
+ });
480
+ const core = new ExternalStoreThreadRuntimeCore(
481
+ contextProvider,
482
+ adapter(),
483
+ );
484
+ const unresolved = () =>
485
+ core.messages
486
+ .filter((m) => !core.getMessageById(m.id))
487
+ .map((m) => m.id);
488
+ expect(core.messages).toHaveLength(2);
489
+
490
+ core.cancelRun();
491
+ expect(unresolved()).toEqual([]);
492
+
493
+ core.__internal_setAdapter(adapter());
494
+ expect(unresolved()).toEqual([]);
495
+
496
+ await new Promise((resolve) => setTimeout(resolve, 0));
497
+ expect(unresolved()).toEqual([]);
498
+ expect(core.messages.map((m) => m.id)).toEqual(ids);
499
+ },
500
+ );
501
+
502
+ it("keeps the published messages array when cancel rolls nothing back", async () => {
503
+ const messages = [createUserMessage("u1"), createAssistantMessage("a1")];
504
+ const adapter = () =>
505
+ createBaseAdapter({
506
+ messages: [...messages],
507
+ isRunning: true,
508
+ onCancel: vi.fn(),
509
+ });
510
+ const core = new ExternalStoreThreadRuntimeCore(
511
+ contextProvider,
512
+ adapter(),
513
+ );
514
+ core.__internal_setAdapter(adapter());
515
+ const published = core.messages;
516
+
517
+ core.cancelRun();
518
+ await new Promise((resolve) => setTimeout(resolve, 0));
519
+
520
+ expect(core.messages).toBe(published);
521
+ });
522
+
460
523
  it("evicts an empty optimistic head on cancel", async () => {
461
524
  const optimisticAssistant = {
462
525
  ...createAssistantMessage("server-msg", ""),
@@ -1304,6 +1367,9 @@ describe("ExternalStoreThreadRuntimeCore adapter contract", () => {
1304
1367
 
1305
1368
  describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1306
1369
  const createVoiceAdapter = () => {
1370
+ let statusCallback:
1371
+ | ((status: RealtimeVoiceAdapter.Status) => void)
1372
+ | undefined;
1307
1373
  let transcriptCallback:
1308
1374
  | ((transcript: RealtimeVoiceAdapter.TranscriptItem) => void)
1309
1375
  | undefined;
@@ -1313,7 +1379,12 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1313
1379
  disconnect: vi.fn(),
1314
1380
  mute: vi.fn(),
1315
1381
  unmute: vi.fn(),
1316
- onStatusChange: () => () => {},
1382
+ onStatusChange: (callback) => {
1383
+ statusCallback = callback;
1384
+ return () => {
1385
+ statusCallback = undefined;
1386
+ };
1387
+ },
1317
1388
  onTranscript: (callback) => {
1318
1389
  transcriptCallback = callback;
1319
1390
  return () => {
@@ -1325,17 +1396,20 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1325
1396
  };
1326
1397
  return {
1327
1398
  adapter: { connect: () => session } satisfies RealtimeVoiceAdapter,
1399
+ emitStatus: (status: RealtimeVoiceAdapter.Status) =>
1400
+ statusCallback?.(status),
1328
1401
  emitTranscript: (transcript: RealtimeVoiceAdapter.TranscriptItem) =>
1329
1402
  transcriptCallback?.(transcript),
1330
1403
  };
1331
1404
  };
1332
1405
 
1333
- const createVoiceCore = () => {
1406
+ const createVoiceCore = ({ commit = true }: { commit?: boolean } = {}) => {
1334
1407
  const voiceAdapter = createVoiceAdapter();
1335
1408
  const onNew = vi.fn(async () => {});
1336
1409
  const onEdit = vi.fn(async () => {});
1337
1410
  const onReload = vi.fn(async () => {});
1338
1411
  const onResume = vi.fn(async () => {});
1412
+ const onVoiceTranscript = vi.fn();
1339
1413
  const core = new ExternalStoreThreadRuntimeCore(
1340
1414
  createContextProvider(),
1341
1415
  createBaseAdapter({
@@ -1343,6 +1417,7 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1343
1417
  onEdit,
1344
1418
  onReload,
1345
1419
  onResume,
1420
+ onVoiceTranscript,
1346
1421
  adapters: { voice: voiceAdapter.adapter },
1347
1422
  }),
1348
1423
  );
@@ -1352,18 +1427,139 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1352
1427
  text: "Hello",
1353
1428
  isFinal: true,
1354
1429
  });
1430
+ const transcript = core.messages[0]!;
1431
+ if (commit) {
1432
+ core.__internal_setAdapter(
1433
+ createBaseAdapter({
1434
+ messages: [transcript],
1435
+ onNew,
1436
+ onEdit,
1437
+ onReload,
1438
+ onResume,
1439
+ onVoiceTranscript,
1440
+ adapters: { voice: voiceAdapter.adapter },
1441
+ }),
1442
+ );
1443
+ core.disconnectVoice();
1444
+ }
1355
1445
  return {
1356
1446
  core,
1357
1447
  onNew,
1358
1448
  onEdit,
1359
1449
  onReload,
1360
1450
  onResume,
1361
- transcriptId: core.messages[0]!.id,
1451
+ transcriptId: transcript.id,
1362
1452
  };
1363
1453
  };
1364
1454
 
1365
- it("rejects an edit resubmission of a transcript before reaching the store", async () => {
1366
- const { core, onNew, onEdit, transcriptId } = createVoiceCore();
1455
+ it("hands a final transcript to onVoiceTranscript and drops the side list copy once the host carries it", () => {
1456
+ const voiceAdapter = createVoiceAdapter();
1457
+ const onVoiceTranscript = vi.fn();
1458
+ const core = new ExternalStoreThreadRuntimeCore(
1459
+ createContextProvider(),
1460
+ createBaseAdapter({
1461
+ onVoiceTranscript,
1462
+ adapters: { voice: voiceAdapter.adapter },
1463
+ }),
1464
+ );
1465
+ core.connectVoice();
1466
+
1467
+ try {
1468
+ voiceAdapter.emitTranscript({
1469
+ role: "user",
1470
+ text: "Hello",
1471
+ isFinal: true,
1472
+ });
1473
+ const message = core.messages[0]!;
1474
+
1475
+ expect(message.role).toBe("user");
1476
+ expect(getThreadMessageText(message)).toBe("Hello");
1477
+ expect(message.metadata.modality).toBe("voice");
1478
+
1479
+ expect(onVoiceTranscript).toHaveBeenCalledExactlyOnceWith(message);
1480
+
1481
+ core.__internal_setAdapter(
1482
+ createBaseAdapter({
1483
+ messages: [message],
1484
+ onVoiceTranscript,
1485
+ adapters: { voice: voiceAdapter.adapter },
1486
+ }),
1487
+ );
1488
+
1489
+ expect(core.messages.filter(({ id }) => id === message.id)).toEqual([
1490
+ message,
1491
+ ]);
1492
+ } finally {
1493
+ core.disconnectVoice();
1494
+ }
1495
+ });
1496
+
1497
+ it("keeps transcripts for the session when the host has no onVoiceTranscript", () => {
1498
+ const voiceAdapter = createVoiceAdapter();
1499
+ const core = new ExternalStoreThreadRuntimeCore(
1500
+ createContextProvider(),
1501
+ createBaseAdapter({ adapters: { voice: voiceAdapter.adapter } }),
1502
+ );
1503
+ core.connectVoice();
1504
+
1505
+ voiceAdapter.emitTranscript({
1506
+ role: "user",
1507
+ text: "Hello",
1508
+ isFinal: true,
1509
+ });
1510
+
1511
+ expect(core.messages).toHaveLength(1);
1512
+
1513
+ core.disconnectVoice();
1514
+
1515
+ expect(core.messages).toEqual([]);
1516
+ });
1517
+
1518
+ it("parents a send after the session ended on the last repository message", async () => {
1519
+ const voiceAdapter = createVoiceAdapter();
1520
+ const onNew = vi.fn(async () => {});
1521
+ const core = new ExternalStoreThreadRuntimeCore(
1522
+ createContextProvider(),
1523
+ createBaseAdapter({
1524
+ onNew,
1525
+ adapters: { voice: voiceAdapter.adapter },
1526
+ }),
1527
+ );
1528
+ core.connectVoice();
1529
+
1530
+ try {
1531
+ voiceAdapter.emitTranscript({
1532
+ role: "user",
1533
+ text: "Hello",
1534
+ isFinal: true,
1535
+ });
1536
+ const transcript = core.messages[0]!;
1537
+ voiceAdapter.emitStatus({ type: "ended", reason: "finished" });
1538
+
1539
+ await core.append({
1540
+ parentId: transcript.id,
1541
+ sourceId: null,
1542
+ role: "user",
1543
+ content: [{ type: "text", text: "Follow up" }],
1544
+ attachments: [],
1545
+ metadata: { custom: {} },
1546
+ createdAt: new Date(),
1547
+ runConfig: {},
1548
+ startRun: false,
1549
+ });
1550
+
1551
+ expect(onNew).toHaveBeenCalledExactlyOnceWith(
1552
+ expect.objectContaining({ parentId: null }),
1553
+ );
1554
+ } finally {
1555
+ core.disconnectVoice();
1556
+ }
1557
+ });
1558
+
1559
+ it("rejects a text send while connected before reaching the store", async () => {
1560
+ const { core, onNew, onEdit, transcriptId } = createVoiceCore({
1561
+ commit: false,
1562
+ });
1367
1563
  try {
1368
1564
  const edit: AppendMessage = {
1369
1565
  parentId: null,
@@ -1377,10 +1573,10 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1377
1573
  };
1378
1574
 
1379
1575
  await expect(core.append(edit)).rejects.toThrow(
1380
- "Voice transcript messages cannot be edited",
1576
+ "Cannot send a text message while a voice session is connected",
1381
1577
  );
1382
1578
  await expect(core.append({ ...edit, startRun: false })).rejects.toThrow(
1383
- "Voice transcript messages cannot be edited",
1579
+ "Cannot send a text message while a voice session is connected",
1384
1580
  );
1385
1581
  expect(onNew).not.toHaveBeenCalled();
1386
1582
  expect(onEdit).not.toHaveBeenCalled();
@@ -1389,8 +1585,10 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1389
1585
  }
1390
1586
  });
1391
1587
 
1392
- it("rejects reloading a transcript before reaching the store", async () => {
1393
- const { core, onReload, onResume, transcriptId } = createVoiceCore();
1588
+ it("rejects a run while connected before reaching the store", async () => {
1589
+ const { core, onReload, onResume, transcriptId } = createVoiceCore({
1590
+ commit: false,
1591
+ });
1394
1592
  try {
1395
1593
  await expect(
1396
1594
  core.startRun({
@@ -1398,14 +1596,18 @@ describe("ExternalStoreThreadRuntimeCore voice transcripts", () => {
1398
1596
  sourceId: transcriptId,
1399
1597
  runConfig: {},
1400
1598
  }),
1401
- ).rejects.toThrow("Voice transcript messages cannot be reloaded");
1599
+ ).rejects.toThrow(
1600
+ "Cannot start a run while a voice session is connected",
1601
+ );
1402
1602
  await expect(
1403
1603
  core.resumeRun({
1404
1604
  parentId: null,
1405
1605
  sourceId: transcriptId,
1406
1606
  runConfig: {},
1407
1607
  }),
1408
- ).rejects.toThrow("Voice transcript messages cannot be reloaded");
1608
+ ).rejects.toThrow(
1609
+ "Cannot start a run while a voice session is connected",
1610
+ );
1409
1611
  expect(onReload).not.toHaveBeenCalled();
1410
1612
  expect(onResume).not.toHaveBeenCalled();
1411
1613
  } finally {
@@ -1282,6 +1282,37 @@ describe("ExternalStoreThreadRuntimeCore - deleteMessage via setMessages", () =>
1282
1282
  }
1283
1283
  });
1284
1284
 
1285
+ it("notifies the eviction when the host resyncs synchronously", async () => {
1286
+ let current = [
1287
+ message("u1", "user", "one"),
1288
+ message("a1", "assistant", "two"),
1289
+ message("u2", "user", "three"),
1290
+ message("a2", "assistant", "four"),
1291
+ ];
1292
+ const store = (): ExternalStoreAdapter =>
1293
+ makeStore({
1294
+ messages: current,
1295
+ setMessages: (m: import("../types/message").ThreadMessage[]) => {
1296
+ current = m;
1297
+ runtime.__internal_setAdapter(store());
1298
+ },
1299
+ });
1300
+ const runtime = new ExternalStoreThreadRuntimeCore(
1301
+ mockContextProvider,
1302
+ store(),
1303
+ );
1304
+
1305
+ const observed: (readonly string[])[] = [];
1306
+ runtime.subscribe(() => {
1307
+ observed.push(runtime.getBranches("a2"));
1308
+ });
1309
+
1310
+ await runtime.deleteMessage("u2");
1311
+
1312
+ expect(runtime.messages.map((m) => m.id)).toEqual(["u1", "a1", "a2"]);
1313
+ expect(observed.at(-1)).toEqual(["a2"]);
1314
+ });
1315
+
1285
1316
  it("evicts the deleted message on the onDelete path too", async () => {
1286
1317
  let current = [
1287
1318
  message("u1", "user", "hi"),
@@ -243,12 +243,12 @@ describe("ExternalThread attachments", () => {
243
243
 
244
244
  it("preserves foreign files that expose content", async () => {
245
245
  const aui = renderThread();
246
- const foreignFile = {
247
- name: "photo.png",
248
- type: "image/png",
249
- lastModified: 0,
250
- content: [{ type: "text", text: "implementation detail" }],
251
- } as File;
246
+ const foreignFile = Object.assign(
247
+ new File([""], "photo.png", { type: "image/png" }),
248
+ {
249
+ content: [{ type: "text", text: "implementation detail" }],
250
+ },
251
+ );
252
252
 
253
253
  await act(() => aui().thread.composer().addAttachment(foreignFile));
254
254
 
@@ -375,7 +375,7 @@ describe("ExternalThread attachments", () => {
375
375
 
376
376
  it("preserves composer state while attachments are prepared for send", async () => {
377
377
  let resolveSend!: (attachment: CompleteAttachment) => void;
378
- const onNew = vi.fn();
378
+ const onNew = vi.fn<NonNullable<ExternalThreadProps["onNew"]>>();
379
379
  const file = new File(["data"], "notes.txt", { type: "text/plain" });
380
380
  const adapter = {
381
381
  accept: "*",
@@ -403,10 +403,10 @@ describe("ExternalThread attachments", () => {
403
403
  act(() => {
404
404
  composer().setText("first message");
405
405
  composer().setRole("assistant");
406
- composer().setRunConfig({ model: "model-a" });
406
+ composer().setRunConfig({ custom: { model: "model-a" } });
407
407
  composer().send();
408
408
  composer().setRole("system");
409
- composer().setRunConfig({ model: "model-b" });
409
+ composer().setRunConfig({ custom: { model: "model-b" } });
410
410
  });
411
411
  await act(async () => {
412
412
  resolveSend({
@@ -422,7 +422,7 @@ describe("ExternalThread attachments", () => {
422
422
  await waitFor(() => expect(onNew).toHaveBeenCalledTimes(1));
423
423
  expect(onNew.mock.calls[0]![0]).toMatchObject({
424
424
  role: "assistant",
425
- runConfig: { model: "model-a" },
425
+ runConfig: { custom: { model: "model-a" } },
426
426
  });
427
427
  });
428
428
 
@@ -931,8 +931,8 @@ describe("cancelled edit sessions", () => {
931
931
  name: "notes.txt",
932
932
  contentType: "text/plain",
933
933
  file: new File(["data"], "notes.txt", { type: "text/plain" }),
934
- status: { type: "pending", reason: "uploading", progress: 0 },
935
- } as PendingAttachment);
934
+ status: { type: "running", reason: "uploading", progress: 0 },
935
+ });
936
936
  await addPromise.catch(() => {});
937
937
  });
938
938
 
@@ -964,15 +964,14 @@ describe("cancelled edit sessions", () => {
964
964
  onEdit: () => {},
965
965
  attachmentAdapter: {
966
966
  accept: "*",
967
- add: async ({ file }: { file: File }) =>
968
- ({
969
- id: "pending-1",
970
- type: "document",
971
- name: file.name,
972
- contentType: file.type,
973
- file,
974
- status: { type: "pending", reason: "uploading", progress: 0 },
975
- }) as PendingAttachment,
967
+ add: async ({ file }: { file: File }) => ({
968
+ id: "pending-1",
969
+ type: "document",
970
+ name: file.name,
971
+ contentType: file.type,
972
+ file,
973
+ status: { type: "running", reason: "uploading", progress: 0 },
974
+ }),
976
975
  send: async () => ({}) as never,
977
976
  remove,
978
977
  },
@@ -1037,8 +1036,8 @@ describe("cancelled edit sessions", () => {
1037
1036
  name: "notes.txt",
1038
1037
  contentType: "text/plain",
1039
1038
  file: new File(["data"], "notes.txt", { type: "text/plain" }),
1040
- status: { type: "pending", reason: "uploading", progress: 0 },
1041
- } as PendingAttachment);
1039
+ status: { type: "running", reason: "uploading", progress: 0 },
1040
+ });
1042
1041
  await addPromise;
1043
1042
  });
1044
1043
 
@@ -78,11 +78,19 @@ describe("ExternalThread feedback", () => {
78
78
  expect(withAdapter().thread.getState().capabilities.feedback).toBe(true);
79
79
  });
80
80
 
81
- it("throws on submitFeedback when no adapter is configured", () => {
81
+ it("marks assistant feedback locally without an adapter", async () => {
82
82
  const { aui } = renderThreadWithProps({});
83
- expect(() =>
84
- aui().thread.message({ id: "a1" }).submitFeedback({ type: "positive" }),
85
- ).toThrow("Feedback adapter not configured");
83
+
84
+ await act(async () => {
85
+ aui().thread.message({ id: "a1" }).submitFeedback({ type: "positive" });
86
+ });
87
+
88
+ await waitFor(() => {
89
+ expect(
90
+ aui().thread.message({ id: "a1" }).getState().metadata
91
+ .submittedFeedback,
92
+ ).toEqual({ type: "positive" });
93
+ });
86
94
  });
87
95
 
88
96
  it("submits feedback to the adapter and marks the assistant message", async () => {
@@ -90,23 +98,28 @@ describe("ExternalThread feedback", () => {
90
98
  const { aui } = renderThreadWithProps({ feedbackAdapter: adapter });
91
99
 
92
100
  await act(async () => {
93
- aui().thread.message({ id: "a1" }).submitFeedback({ type: "positive" });
101
+ aui()
102
+ .thread.message({ id: "a1" })
103
+ .submitFeedback({ type: "positive", comment: "Helpful summary" });
94
104
  });
95
105
 
96
106
  expect(submit).toHaveBeenCalledTimes(1);
97
107
  expect(submit).toHaveBeenCalledWith({
98
108
  message: MESSAGES[1],
99
109
  type: "positive",
110
+ comment: "Helpful summary",
100
111
  });
101
112
  await waitFor(() => {
102
113
  expect(
103
114
  aui().thread.message({ id: "a1" }).getState().metadata
104
115
  .submittedFeedback,
105
- ).toEqual({ type: "positive" });
116
+ ).toEqual({ type: "positive", comment: "Helpful summary" });
106
117
  });
107
118
 
108
119
  await act(async () => {
109
- aui().thread.message({ id: "a1" }).submitFeedback({ type: "negative" });
120
+ aui()
121
+ .thread.message({ id: "a1" })
122
+ .submitFeedback({ type: "negative", comment: " " });
110
123
  });
111
124
 
112
125
  expect(submit).toHaveBeenLastCalledWith({
@@ -254,7 +254,7 @@ describe("ExternalThread unset optional callbacks", () => {
254
254
  expect(() => part().resumeToolCall(undefined)).toThrow(
255
255
  "Runtime does not support resuming tool calls (onResumeToolCall is not set).",
256
256
  );
257
- expect(() => aui().thread.resumeRun()).toThrow(
257
+ expect(() => aui().thread.resumeRun({ parentId: null })).toThrow(
258
258
  "Runtime does not support resuming runs (onResume is not set).",
259
259
  );
260
260
  expect(() => aui().thread.importExternalState({})).toThrow(
@@ -1,5 +1,8 @@
1
1
  import { describe, it, expect, vi } from "vitest";
2
- import { createMessageQueue } from "../runtime/queue/message-queue";
2
+ import {
3
+ createMessageQueue,
4
+ type MessageQueueDriver,
5
+ } from "../runtime/queue/message-queue";
3
6
  import type { AppendMessage } from "../types/message";
4
7
 
5
8
  const msg = (text: string, extra?: Partial<AppendMessage>): AppendMessage => ({
@@ -35,6 +38,32 @@ describe("createMessageQueue", () => {
35
38
  expect(adapter.items).toHaveLength(0);
36
39
  });
37
40
 
41
+ it("does not advance a held queue when a run settles", () => {
42
+ const run = vi.fn();
43
+ const { adapter, hold, notifyIdle } = createMessageQueue({ run });
44
+
45
+ adapter.enqueue(msg("first"));
46
+ adapter.enqueue(msg("second"));
47
+ hold();
48
+ notifyIdle();
49
+
50
+ expect(run).toHaveBeenCalledOnce();
51
+ expect(prompts(adapter.items)).toEqual(["second"]);
52
+ });
53
+
54
+ it("advances a held queue once when released", () => {
55
+ const run = vi.fn();
56
+ const { adapter, hold, release } = createMessageQueue({ run });
57
+
58
+ hold();
59
+ adapter.enqueue(msg("first"));
60
+ release();
61
+ release();
62
+
63
+ expect(run).toHaveBeenCalledOnce();
64
+ expect(adapter.items).toHaveLength(0);
65
+ });
66
+
38
67
  it("drains FIFO across multiple queued messages", () => {
39
68
  const order: string[] = [];
40
69
  const run = vi.fn((m: AppendMessage) =>
@@ -438,7 +467,7 @@ describe("createMessageQueue", () => {
438
467
  describe("synchronous dispatch failures", () => {
439
468
  it("restores a message when the driver throws", () => {
440
469
  const error = new Error("dispatch failed");
441
- const run = vi.fn(() => {
470
+ const run = vi.fn<MessageQueueDriver["run"]>(() => {
442
471
  throw error;
443
472
  });
444
473
  const { adapter } = createMessageQueue({ run });
@@ -446,7 +475,7 @@ describe("createMessageQueue", () => {
446
475
  expect(() => adapter.enqueue(msg("first"))).toThrow(error);
447
476
  expect(prompts(adapter.items)).toEqual(["first"]);
448
477
 
449
- run.mockImplementation(() => undefined);
478
+ run.mockImplementation(() => {});
450
479
  adapter.enqueue(msg("second"));
451
480
 
452
481
  expect(run).toHaveBeenCalledTimes(2);
@@ -490,7 +519,10 @@ describe("createMessageQueue", () => {
490
519
  const error = new Error("transform failed");
491
520
  const run = vi.fn();
492
521
  const { adapter } = createMessageQueue({ run });
493
- adapter.__internal_setDispatchTransform(() => {
522
+ const setDispatchTransform = adapter.__internal_setDispatchTransform;
523
+ if (setDispatchTransform === undefined)
524
+ throw new Error("expected dispatch transform support");
525
+ setDispatchTransform(() => {
494
526
  throw error;
495
527
  });
496
528
 
@@ -498,7 +530,7 @@ describe("createMessageQueue", () => {
498
530
  expect(run).not.toHaveBeenCalled();
499
531
  expect(prompts(adapter.items)).toEqual(["first"]);
500
532
 
501
- adapter.__internal_setDispatchTransform((message) => message);
533
+ setDispatchTransform((message) => message);
502
534
  adapter.enqueue(msg("second"));
503
535
 
504
536
  expect(run).toHaveBeenCalledWith(
@@ -511,7 +543,7 @@ describe("createMessageQueue", () => {
511
543
  it("restores a steer when cancellation throws", () => {
512
544
  const error = new Error("cancel failed");
513
545
  const run = vi.fn();
514
- const cancel = vi.fn(() => {
546
+ const cancel = vi.fn<NonNullable<MessageQueueDriver["cancel"]>>(() => {
515
547
  throw error;
516
548
  });
517
549
  const { adapter, notifyIdle } = createMessageQueue({ run, cancel });
@@ -523,7 +555,7 @@ describe("createMessageQueue", () => {
523
555
  notifyIdle();
524
556
  expect(run).toHaveBeenCalledOnce();
525
557
 
526
- cancel.mockImplementation(() => undefined);
558
+ cancel.mockImplementation(() => {});
527
559
  adapter.enqueue(msg("later"));
528
560
  expect(run).toHaveBeenLastCalledWith(
529
561
  expect.objectContaining({
@@ -541,7 +573,10 @@ describe("createMessageQueue", () => {
541
573
  const { adapter, notifyIdle } = createMessageQueue({ run, cancel });
542
574
 
543
575
  adapter.enqueue(msg("active"));
544
- adapter.__internal_setDispatchTransform(() => {
576
+ const setDispatchTransform = adapter.__internal_setDispatchTransform;
577
+ if (setDispatchTransform === undefined)
578
+ throw new Error("expected dispatch transform support");
579
+ setDispatchTransform(() => {
545
580
  throw error;
546
581
  });
547
582
 
@@ -550,7 +585,7 @@ describe("createMessageQueue", () => {
550
585
  expect(prompts(adapter.steerItems)).toEqual(["urgent"]);
551
586
 
552
587
  notifyIdle();
553
- adapter.__internal_setDispatchTransform((message) => message);
588
+ setDispatchTransform((message) => message);
554
589
  adapter.enqueue(msg("later"));
555
590
 
556
591
  expect(run).toHaveBeenLastCalledWith(
@@ -880,7 +915,7 @@ describe("createMessageQueue", () => {
880
915
  subscribe(laterSubscriber);
881
916
 
882
917
  try {
883
- expect(() => adapter.enqueue(msg("a"), { steer: false })).not.toThrow();
918
+ expect(() => adapter.enqueue(msg("a"))).not.toThrow();
884
919
  expect(run).toHaveBeenCalledTimes(1);
885
920
  expect(adapter.items).toHaveLength(0);
886
921
  expect(laterSubscriber).toHaveBeenCalledTimes(2);