@assistant-ui/react 0.14.26 → 0.14.28

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 (496) hide show
  1. package/README.md +1 -1
  2. package/dist/augmentations.d.ts.map +1 -1
  3. package/dist/client/ExternalThread.d.ts +6 -4
  4. package/dist/client/ExternalThread.d.ts.map +1 -1
  5. package/dist/client/ExternalThread.js +4 -3
  6. package/dist/client/ExternalThread.js.map +1 -1
  7. package/dist/client/InMemoryThreadList.d.ts +0 -1
  8. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  9. package/dist/client/InMemoryThreadList.js +4 -1
  10. package/dist/client/InMemoryThreadList.js.map +1 -1
  11. package/dist/client/SingleThreadList.d.ts +0 -1
  12. package/dist/client/SingleThreadList.d.ts.map +1 -1
  13. package/dist/context/ReadonlyStore.d.ts +0 -1
  14. package/dist/context/ReadonlyStore.d.ts.map +1 -1
  15. package/dist/context/providers/MessageProvider.d.ts +0 -1
  16. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  17. package/dist/context/providers/ThreadViewportProvider.d.ts +0 -1
  18. package/dist/context/providers/ThreadViewportProvider.d.ts.map +1 -1
  19. package/dist/context/react/ThreadViewportContext.d.ts +15 -16
  20. package/dist/context/react/ThreadViewportContext.d.ts.map +1 -1
  21. package/dist/context/react/utils/createContextHook.d.ts +0 -1
  22. package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
  23. package/dist/context/react/utils/createContextStoreHook.d.ts +2 -3
  24. package/dist/context/react/utils/createContextStoreHook.d.ts.map +1 -1
  25. package/dist/context/react/utils/createStateHookForRuntime.d.ts +0 -1
  26. package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -1
  27. package/dist/context/react/utils/ensureBinding.d.ts.map +1 -1
  28. package/dist/context/react/utils/useRuntimeState.d.ts +0 -1
  29. package/dist/context/react/utils/useRuntimeState.d.ts.map +1 -1
  30. package/dist/context/stores/ThreadViewport.d.ts +25 -15
  31. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  32. package/dist/devtools/DevToolsHooks.d.ts +0 -1
  33. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  34. package/dist/hooks/useMessageQuote.d.ts +0 -1
  35. package/dist/hooks/useMessageQuote.d.ts.map +1 -1
  36. package/dist/hooks/useMessageTiming.d.ts +0 -1
  37. package/dist/hooks/useMessageTiming.d.ts.map +1 -1
  38. package/dist/hooks/useToolCallElapsed.d.ts.map +1 -1
  39. package/dist/index.d.ts +5 -3
  40. package/dist/internal.d.ts +0 -2
  41. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts +0 -1
  42. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  43. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  44. package/dist/legacy-runtime/cloud/auiV0.d.ts +11 -2
  45. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  46. package/dist/legacy-runtime/cloud/auiV0.js +31 -2
  47. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  48. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +1 -5
  49. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  50. package/dist/legacy-runtime/hooks/AssistantContext.d.ts +0 -1
  51. package/dist/legacy-runtime/hooks/AssistantContext.d.ts.map +1 -1
  52. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts +12 -13
  53. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts.map +1 -1
  54. package/dist/legacy-runtime/hooks/ComposerContext.d.ts +0 -1
  55. package/dist/legacy-runtime/hooks/ComposerContext.d.ts.map +1 -1
  56. package/dist/legacy-runtime/hooks/MessageContext.d.ts +0 -1
  57. package/dist/legacy-runtime/hooks/MessageContext.d.ts.map +1 -1
  58. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts +0 -1
  59. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts.map +1 -1
  60. package/dist/legacy-runtime/hooks/ThreadContext.d.ts +0 -1
  61. package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +1 -1
  62. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts +0 -1
  63. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts.map +1 -1
  64. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +0 -1
  65. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +1 -1
  66. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts +1 -4
  67. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  68. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +1 -1
  69. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +0 -1
  70. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  71. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts +0 -1
  72. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  73. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts +0 -1
  74. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts.map +1 -1
  75. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.d.ts.map +1 -1
  76. package/dist/mcp-apps/McpAppRenderer.d.ts +12 -7
  77. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  78. package/dist/mcp-apps/McpAppRenderer.js +29 -7
  79. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  80. package/dist/mcp-apps/McpAppsRemoteHost.d.ts +0 -1
  81. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  82. package/dist/mcp-apps/McpAppsRemoteHost.js +32 -1
  83. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  84. package/dist/mcp-apps/app-frame.d.ts +1 -12
  85. package/dist/mcp-apps/app-frame.d.ts.map +1 -1
  86. package/dist/mcp-apps/app-frame.js +1 -1
  87. package/dist/mcp-apps/app-frame.js.map +1 -1
  88. package/dist/mcp-apps/bridge.d.ts +0 -1
  89. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  90. package/dist/mcp-apps/bridge.js +4 -3
  91. package/dist/mcp-apps/bridge.js.map +1 -1
  92. package/dist/mcp-apps/types.d.ts +10 -7
  93. package/dist/mcp-apps/types.d.ts.map +1 -1
  94. package/dist/mcp-apps/types.js.map +1 -1
  95. package/dist/mcp-apps/utils.d.ts +0 -1
  96. package/dist/mcp-apps/utils.d.ts.map +1 -1
  97. package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -6
  98. package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -1
  99. package/dist/model-context/makeAssistantVisible.d.ts +0 -1
  100. package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
  101. package/dist/model-context/makeAssistantVisible.js +7 -1
  102. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  103. package/dist/primitives/actionBar/ActionBarCopy.d.ts +1 -4
  104. package/dist/primitives/actionBar/ActionBarCopy.d.ts.map +1 -1
  105. package/dist/primitives/actionBar/ActionBarEdit.d.ts +0 -1
  106. package/dist/primitives/actionBar/ActionBarEdit.d.ts.map +1 -1
  107. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts +1 -5
  108. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  109. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts +0 -1
  110. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts.map +1 -1
  111. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts +0 -1
  112. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts.map +1 -1
  113. package/dist/primitives/actionBar/ActionBarInteractionContext.d.ts.map +1 -1
  114. package/dist/primitives/actionBar/ActionBarReload.d.ts +0 -1
  115. package/dist/primitives/actionBar/ActionBarReload.d.ts.map +1 -1
  116. package/dist/primitives/actionBar/ActionBarRoot.d.ts +0 -1
  117. package/dist/primitives/actionBar/ActionBarRoot.d.ts.map +1 -1
  118. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  119. package/dist/primitives/actionBar/ActionBarSpeak.d.ts +0 -1
  120. package/dist/primitives/actionBar/ActionBarSpeak.d.ts.map +1 -1
  121. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts +0 -1
  122. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  123. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts +1 -6
  124. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts.map +1 -1
  125. package/dist/primitives/actionBar.d.ts +0 -2
  126. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts +0 -1
  127. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts.map +1 -1
  128. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  129. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts +0 -1
  130. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts.map +1 -1
  131. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts +0 -1
  132. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts.map +1 -1
  133. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts +0 -1
  134. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts.map +1 -1
  135. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts +0 -1
  136. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts.map +1 -1
  137. package/dist/primitives/actionBarMore/scope.d.ts +0 -1
  138. package/dist/primitives/actionBarMore/scope.d.ts.map +1 -1
  139. package/dist/primitives/actionBarMore.d.ts +0 -2
  140. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts +6 -4
  141. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts.map +1 -1
  142. package/dist/primitives/assistantModal/AssistantModalAnchor.js +2 -2
  143. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  144. package/dist/primitives/assistantModal/AssistantModalContent.d.ts +4 -2
  145. package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
  146. package/dist/primitives/assistantModal/AssistantModalContent.js +2 -1
  147. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  148. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts +0 -1
  149. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts.map +1 -1
  150. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts +6 -4
  151. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts.map +1 -1
  152. package/dist/primitives/assistantModal/AssistantModalTrigger.js +2 -2
  153. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  154. package/dist/primitives/assistantModal/popoverRenderPrimitives.d.ts +14 -0
  155. package/dist/primitives/assistantModal/popoverRenderPrimitives.d.ts.map +1 -0
  156. package/dist/primitives/assistantModal/popoverRenderPrimitives.js +10 -0
  157. package/dist/primitives/assistantModal/popoverRenderPrimitives.js.map +1 -0
  158. package/dist/primitives/assistantModal/scope.d.ts +0 -1
  159. package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
  160. package/dist/primitives/assistantModal.d.ts +0 -2
  161. package/dist/primitives/attachment/AttachmentName.d.ts +0 -1
  162. package/dist/primitives/attachment/AttachmentName.d.ts.map +1 -1
  163. package/dist/primitives/attachment/AttachmentRemove.d.ts +0 -1
  164. package/dist/primitives/attachment/AttachmentRemove.d.ts.map +1 -1
  165. package/dist/primitives/attachment/AttachmentRoot.d.ts +0 -1
  166. package/dist/primitives/attachment/AttachmentRoot.d.ts.map +1 -1
  167. package/dist/primitives/attachment/AttachmentThumb.d.ts +0 -1
  168. package/dist/primitives/attachment/AttachmentThumb.d.ts.map +1 -1
  169. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  170. package/dist/primitives/attachment.d.ts +0 -2
  171. package/dist/primitives/branchPicker/BranchPickerCount.d.ts +0 -1
  172. package/dist/primitives/branchPicker/BranchPickerCount.d.ts.map +1 -1
  173. package/dist/primitives/branchPicker/BranchPickerNext.d.ts +0 -1
  174. package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
  175. package/dist/primitives/branchPicker/BranchPickerNumber.d.ts +0 -1
  176. package/dist/primitives/branchPicker/BranchPickerNumber.d.ts.map +1 -1
  177. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts +0 -1
  178. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
  179. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts +0 -1
  180. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  181. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  182. package/dist/primitives/branchPicker.d.ts +0 -2
  183. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +0 -1
  184. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
  185. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts +0 -1
  186. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts.map +1 -1
  187. package/dist/primitives/chainOfThought.d.ts +0 -2
  188. package/dist/primitives/composer/ComposerAddAttachment.d.ts +5 -6
  189. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  190. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts +0 -1
  191. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  192. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  193. package/dist/primitives/composer/ComposerCancel.d.ts +0 -1
  194. package/dist/primitives/composer/ComposerCancel.d.ts.map +1 -1
  195. package/dist/primitives/composer/ComposerCompactContext.d.ts +9 -0
  196. package/dist/primitives/composer/ComposerCompactContext.d.ts.map +1 -0
  197. package/dist/primitives/composer/ComposerCompactContext.js +11 -0
  198. package/dist/primitives/composer/ComposerCompactContext.js.map +1 -0
  199. package/dist/primitives/composer/ComposerDictate.d.ts +0 -1
  200. package/dist/primitives/composer/ComposerDictate.d.ts.map +1 -1
  201. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +0 -1
  202. package/dist/primitives/composer/ComposerDictationTranscript.d.ts.map +1 -1
  203. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  204. package/dist/primitives/composer/ComposerInput.d.ts +0 -1
  205. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  206. package/dist/primitives/composer/ComposerInput.js +17 -2
  207. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  208. package/dist/primitives/composer/ComposerInputPluginContext.d.ts +4 -3
  209. package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
  210. package/dist/primitives/composer/ComposerQuote.d.ts +0 -1
  211. package/dist/primitives/composer/ComposerQuote.d.ts.map +1 -1
  212. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  213. package/dist/primitives/composer/ComposerRoot.d.ts +27 -3
  214. package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
  215. package/dist/primitives/composer/ComposerRoot.js +109 -30
  216. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  217. package/dist/primitives/composer/ComposerSend.d.ts +0 -1
  218. package/dist/primitives/composer/ComposerSend.d.ts.map +1 -1
  219. package/dist/primitives/composer/ComposerStopDictation.d.ts +0 -1
  220. package/dist/primitives/composer/ComposerStopDictation.d.ts.map +1 -1
  221. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +10 -5
  222. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  223. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  224. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts +5 -3
  225. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts.map +1 -1
  226. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +3 -2
  227. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  228. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts +0 -1
  229. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts.map +1 -1
  230. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts +0 -1
  231. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts.map +1 -1
  232. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  233. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts +3 -2
  234. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts.map +1 -1
  235. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts +0 -1
  236. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts.map +1 -1
  237. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  238. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +10 -6
  239. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  240. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +8 -5
  241. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -1
  242. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  243. package/dist/primitives/composer/trigger/detectTrigger.d.ts +1 -1
  244. package/dist/primitives/composer/trigger/index.d.ts +0 -1
  245. package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
  246. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +5 -2
  247. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  248. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts +7 -4
  249. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
  250. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts +13 -7
  251. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
  252. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +7 -4
  253. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  254. package/dist/primitives/composer/useComposerInputState.d.ts.map +1 -1
  255. package/dist/primitives/composer.d.ts +0 -2
  256. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts +0 -1
  257. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts.map +1 -1
  258. package/dist/primitives/error/ErrorMessage.d.ts +0 -1
  259. package/dist/primitives/error/ErrorMessage.d.ts.map +1 -1
  260. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  261. package/dist/primitives/error/ErrorRoot.d.ts +0 -1
  262. package/dist/primitives/error/ErrorRoot.d.ts.map +1 -1
  263. package/dist/primitives/error.d.ts +0 -2
  264. package/dist/primitives/message/MessageError.d.ts +0 -1
  265. package/dist/primitives/message/MessageError.d.ts.map +1 -1
  266. package/dist/primitives/message/MessageIf.d.ts +0 -1
  267. package/dist/primitives/message/MessageIf.d.ts.map +1 -1
  268. package/dist/primitives/message/MessageParts.d.ts +0 -1
  269. package/dist/primitives/message/MessageParts.d.ts.map +1 -1
  270. package/dist/primitives/message/MessageParts.js.map +1 -1
  271. package/dist/primitives/message/MessagePartsGrouped.d.ts +25 -12
  272. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  273. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  274. package/dist/primitives/message/MessageRoot.d.ts +0 -1
  275. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  276. package/dist/primitives/message.d.ts +0 -2
  277. package/dist/primitives/messagePart/MessagePartImage.d.ts +0 -1
  278. package/dist/primitives/messagePart/MessagePartImage.d.ts.map +1 -1
  279. package/dist/primitives/messagePart/MessagePartText.d.ts +0 -1
  280. package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
  281. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  282. package/dist/primitives/messagePart/useMessagePartData.d.ts +3 -3
  283. package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -1
  284. package/dist/primitives/messagePart/useMessagePartData.js +3 -2
  285. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  286. package/dist/primitives/messagePart/useMessagePartFile.d.ts +5 -5
  287. package/dist/primitives/messagePart/useMessagePartFile.d.ts.map +1 -1
  288. package/dist/primitives/messagePart/useMessagePartFile.js +11 -3
  289. package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -1
  290. package/dist/primitives/messagePart/useMessagePartImage.d.ts +5 -5
  291. package/dist/primitives/messagePart/useMessagePartImage.d.ts.map +1 -1
  292. package/dist/primitives/messagePart/useMessagePartImage.js +10 -3
  293. package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -1
  294. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts +5 -5
  295. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts.map +1 -1
  296. package/dist/primitives/messagePart/useMessagePartReasoning.js +10 -3
  297. package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -1
  298. package/dist/primitives/messagePart/useMessagePartSource.d.ts +6 -4
  299. package/dist/primitives/messagePart/useMessagePartSource.d.ts.map +1 -1
  300. package/dist/primitives/messagePart/useMessagePartSource.js +12 -3
  301. package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -1
  302. package/dist/primitives/messagePart/useMessagePartText.d.ts +6 -6
  303. package/dist/primitives/messagePart/useMessagePartText.d.ts.map +1 -1
  304. package/dist/primitives/messagePart/useMessagePartText.js +10 -3
  305. package/dist/primitives/messagePart/useMessagePartText.js.map +1 -1
  306. package/dist/primitives/messagePart.d.ts +0 -2
  307. package/dist/primitives/queueItem/QueueItemRemove.d.ts +0 -1
  308. package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -1
  309. package/dist/primitives/queueItem/QueueItemSteer.d.ts +0 -1
  310. package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -1
  311. package/dist/primitives/queueItem/QueueItemText.d.ts +0 -1
  312. package/dist/primitives/queueItem/QueueItemText.d.ts.map +1 -1
  313. package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
  314. package/dist/primitives/queueItem.d.ts +0 -2
  315. package/dist/primitives/reasoning/useScrollLock.d.ts +0 -1
  316. package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -1
  317. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts +0 -1
  318. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts.map +1 -1
  319. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts +0 -1
  320. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts.map +1 -1
  321. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +2 -1
  322. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  323. package/dist/primitives/selectionToolbar.d.ts +0 -2
  324. package/dist/primitives/suggestion/SuggestionDescription.d.ts +0 -1
  325. package/dist/primitives/suggestion/SuggestionDescription.d.ts.map +1 -1
  326. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  327. package/dist/primitives/suggestion/SuggestionTitle.d.ts +0 -1
  328. package/dist/primitives/suggestion/SuggestionTitle.d.ts.map +1 -1
  329. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  330. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -5
  331. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  332. package/dist/primitives/suggestion.d.ts +0 -2
  333. package/dist/primitives/thread/ThreadEmpty.d.ts +0 -1
  334. package/dist/primitives/thread/ThreadEmpty.d.ts.map +1 -1
  335. package/dist/primitives/thread/ThreadIf.d.ts +0 -1
  336. package/dist/primitives/thread/ThreadIf.d.ts.map +1 -1
  337. package/dist/primitives/thread/ThreadRoot.d.ts +0 -1
  338. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  339. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +1 -4
  340. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  341. package/dist/primitives/thread/ThreadSuggestion.d.ts +13 -14
  342. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  343. package/dist/primitives/thread/ThreadViewport.d.ts +0 -1
  344. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  345. package/dist/primitives/thread/ThreadViewport.js +53 -19
  346. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  347. package/dist/primitives/thread/ThreadViewportFooter.d.ts +0 -1
  348. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  349. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts +2 -11
  350. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts.map +1 -1
  351. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts.map +1 -1
  352. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts +4 -0
  353. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts.map +1 -1
  354. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +14 -1
  355. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -1
  356. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts +14 -5
  357. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts.map +1 -1
  358. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +14 -1
  359. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
  360. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts.map +1 -1
  361. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts.map +1 -1
  362. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts +1 -7
  363. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  364. package/dist/primitives/thread/useThreadViewportAutoScroll.js +2 -1
  365. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  366. package/dist/primitives/thread.d.ts +0 -2
  367. package/dist/primitives/threadList/ThreadListLoadMore.d.ts +0 -1
  368. package/dist/primitives/threadList/ThreadListLoadMore.d.ts.map +1 -1
  369. package/dist/primitives/threadList/ThreadListNew.d.ts +0 -1
  370. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  371. package/dist/primitives/threadList/ThreadListRoot.d.ts +0 -1
  372. package/dist/primitives/threadList/ThreadListRoot.d.ts.map +1 -1
  373. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  374. package/dist/primitives/threadList.d.ts +0 -2
  375. package/dist/primitives/threadListFocusGroup.d.ts +0 -1
  376. package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
  377. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +0 -1
  378. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  379. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +0 -1
  380. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  381. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +0 -1
  382. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  383. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  384. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +0 -1
  385. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  386. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  387. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +0 -1
  388. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  389. package/dist/primitives/threadListItem.d.ts +0 -2
  390. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts +0 -1
  391. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts.map +1 -1
  392. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  393. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts +0 -1
  394. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts.map +1 -1
  395. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts +0 -1
  396. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts.map +1 -1
  397. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  398. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts +0 -1
  399. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts.map +1 -1
  400. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts +0 -1
  401. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts.map +1 -1
  402. package/dist/primitives/threadListItemMore/scope.d.ts +0 -1
  403. package/dist/primitives/threadListItemMore/scope.d.ts.map +1 -1
  404. package/dist/primitives/threadListItemMore.d.ts +0 -2
  405. package/dist/sandbox-host/SandboxHost.d.ts +1 -10
  406. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  407. package/dist/tests/remote-thread-list-test-helpers.d.ts +0 -1
  408. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  409. package/dist/tests/setup.d.ts +1 -1
  410. package/dist/unstable/useComposerInput.d.ts +2 -2
  411. package/dist/unstable/useComposerInput.d.ts.map +1 -1
  412. package/dist/unstable/useComposerInputHistory.d.ts +2 -2
  413. package/dist/unstable/useComposerInputHistory.d.ts.map +1 -1
  414. package/dist/unstable/useLiveCompletionAdapter.d.ts +4 -3
  415. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -1
  416. package/dist/unstable/useMentionAdapter.d.ts +19 -10
  417. package/dist/unstable/useMentionAdapter.d.ts.map +1 -1
  418. package/dist/unstable/useMessageStallDetection.d.ts +3 -1
  419. package/dist/unstable/useMessageStallDetection.d.ts.map +1 -1
  420. package/dist/unstable/useSlashCommandAdapter.d.ts +6 -4
  421. package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
  422. package/dist/utils/Primitive.d.ts +0 -1
  423. package/dist/utils/Primitive.d.ts.map +1 -1
  424. package/dist/utils/Primitive.js.map +1 -1
  425. package/dist/utils/RequireAtLeastOne.d.ts +1 -1
  426. package/dist/utils/RequireAtLeastOne.d.ts.map +1 -1
  427. package/dist/utils/createActionButton.d.ts +0 -1
  428. package/dist/utils/createActionButton.d.ts.map +1 -1
  429. package/dist/utils/getSelectionMessageId.d.ts.map +1 -1
  430. package/dist/utils/getSelectionMessageId.js +32 -7
  431. package/dist/utils/getSelectionMessageId.js.map +1 -1
  432. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  433. package/dist/utils/hooks/useMediaQuery.d.ts.map +1 -1
  434. package/dist/utils/hooks/useOnResizeContent.d.ts.map +1 -1
  435. package/dist/utils/hooks/useOnScrollToBottom.d.ts.map +1 -1
  436. package/dist/utils/hooks/useSizeHandle.d.ts +0 -1
  437. package/dist/utils/hooks/useSizeHandle.d.ts.map +1 -1
  438. package/dist/utils/smooth/SmoothContext.d.ts +71 -72
  439. package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
  440. package/dist/utils/smooth/useSmooth.d.ts +0 -1
  441. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  442. package/dist/utils/useToolArgsFieldStatus.d.ts +2 -2
  443. package/dist/utils/useToolArgsFieldStatus.d.ts.map +1 -1
  444. package/package.json +23 -23
  445. package/src/client/ExternalThread.ts +2 -1
  446. package/src/index.ts +3 -0
  447. package/src/legacy-runtime/cloud/auiV0.ts +72 -3
  448. package/src/mcp-apps/McpAppRenderer.test.tsx +141 -0
  449. package/src/mcp-apps/McpAppRenderer.tsx +48 -10
  450. package/src/mcp-apps/McpAppsRemoteHost.test.ts +126 -0
  451. package/src/mcp-apps/McpAppsRemoteHost.ts +40 -1
  452. package/src/mcp-apps/app-frame.tsx +3 -1
  453. package/src/mcp-apps/bridge.ts +1 -1
  454. package/src/mcp-apps/types.ts +16 -8
  455. package/src/model-context/makeAssistantVisible.test.tsx +146 -0
  456. package/src/model-context/makeAssistantVisible.tsx +18 -1
  457. package/src/primitives/assistantModal/AssistantModalAnchor.tsx +6 -8
  458. package/src/primitives/assistantModal/AssistantModalContent.tsx +5 -5
  459. package/src/primitives/assistantModal/AssistantModalTrigger.test.tsx +80 -0
  460. package/src/primitives/assistantModal/AssistantModalTrigger.tsx +6 -8
  461. package/src/primitives/assistantModal/popoverRenderPrimitives.ts +6 -0
  462. package/src/primitives/composer/ComposerCompactContext.tsx +13 -0
  463. package/src/primitives/composer/ComposerInput.tsx +35 -0
  464. package/src/primitives/composer/ComposerRoot.test.tsx +382 -0
  465. package/src/primitives/composer/ComposerRoot.tsx +86 -7
  466. package/src/primitives/messagePart/useMessagePartData.ts +3 -2
  467. package/src/primitives/messagePart/useMessagePartFile.ts +19 -7
  468. package/src/primitives/messagePart/useMessagePartImage.ts +18 -7
  469. package/src/primitives/messagePart/useMessagePartReasoning.ts +15 -6
  470. package/src/primitives/messagePart/useMessagePartSource.ts +20 -7
  471. package/src/primitives/messagePart/useMessagePartText.ts +15 -5
  472. package/src/primitives/thread/ThreadViewport.tsx +15 -0
  473. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.test.ts +243 -0
  474. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.ts +28 -7
  475. package/src/primitives/thread/topAnchor/topAnchorTurn.test.ts +69 -0
  476. package/src/primitives/thread/topAnchor/topAnchorTurn.ts +29 -0
  477. package/src/primitives/thread/useThreadViewportAutoScroll.test.tsx +86 -1
  478. package/src/primitives/thread/useThreadViewportAutoScroll.ts +6 -1
  479. package/src/tests/BaseComposerRuntimeCore.test.ts +12 -3
  480. package/src/tests/LocalThreadRuntimeCore.test.ts +4 -1
  481. package/src/tests/auiV0Encode.test.ts +134 -1
  482. package/src/tests/external-thread-attachments.test.tsx +81 -0
  483. package/src/tests/messagePartSwitchRace.test.tsx +158 -0
  484. package/src/tests/messagePartTypeMismatch.test.tsx +146 -0
  485. package/src/utils/getSelectionMessageId.test.ts +175 -0
  486. package/src/utils/getSelectionMessageId.ts +57 -6
  487. package/dist/utils/json/is-json-equal.d.ts +0 -5
  488. package/dist/utils/json/is-json-equal.d.ts.map +0 -1
  489. package/dist/utils/json/is-json-equal.js +0 -26
  490. package/dist/utils/json/is-json-equal.js.map +0 -1
  491. package/dist/utils/json/is-json.d.ts +0 -10
  492. package/dist/utils/json/is-json.d.ts.map +0 -1
  493. package/dist/utils/json/is-json.js +0 -22
  494. package/dist/utils/json/is-json.js.map +0 -1
  495. package/src/utils/json/is-json-equal.ts +0 -48
  496. package/src/utils/json/is-json.ts +0 -58
@@ -26,6 +26,7 @@ import type {
26
26
  McpAppsHost,
27
27
  } from "./types";
28
28
  import { getMcpAppFromToolPart } from "./utils";
29
+ import { isRecord } from "@assistant-ui/core/internal";
29
30
 
30
31
  export type McpAppRendererOptions = {
31
32
  /**
@@ -55,6 +56,7 @@ export type McpAppRendererOptions = {
55
56
 
56
57
  type LoadedResourceState = {
57
58
  resourceUri: string;
59
+ serverId?: string;
58
60
  resource?: McpAppResource;
59
61
  error?: Error;
60
62
  };
@@ -100,7 +102,11 @@ function InlineRenderer({
100
102
  const aui = useAui();
101
103
  const app = getMcpAppFromToolPart(part);
102
104
  const cachedAppRef = useRef<McpAppMetadata | undefined>(undefined);
103
- if (app != null && cachedAppRef.current?.resourceUri !== app.resourceUri) {
105
+ if (
106
+ app != null &&
107
+ (cachedAppRef.current?.resourceUri !== app.resourceUri ||
108
+ cachedAppRef.current?.serverId !== app.serverId)
109
+ ) {
104
110
  cachedAppRef.current = app;
105
111
  }
106
112
  const appForRender = app ?? cachedAppRef.current;
@@ -108,21 +114,37 @@ function InlineRenderer({
108
114
  const [loadedResource, setLoadedResource] = useState<LoadedResourceState>();
109
115
 
110
116
  const resourceUri = appForRender?.resourceUri;
117
+ const serverId = appForRender?.serverId;
118
+ const serverIdRef = useRef<string | undefined>(undefined);
119
+ serverIdRef.current = serverId;
111
120
  useEffect(() => {
112
121
  if (appForRender == null || resourceUri == null) return;
113
122
  let cancelled = false;
114
123
  const targetUri = resourceUri;
124
+ const targetServerId = serverId;
115
125
 
116
126
  internalsRef.current.host
117
- .loadResource({ uri: targetUri })
127
+ .loadResource({
128
+ uri: targetUri,
129
+ ...(targetServerId ? { serverId: targetServerId } : {}),
130
+ })
118
131
  .then((res) => {
119
132
  if (!cancelled)
120
- setLoadedResource({ resourceUri: targetUri, resource: res });
133
+ setLoadedResource({
134
+ resourceUri: targetUri,
135
+ ...(targetServerId !== undefined
136
+ ? { serverId: targetServerId }
137
+ : {}),
138
+ resource: res,
139
+ });
121
140
  })
122
141
  .catch((error: unknown) => {
123
142
  if (!cancelled) {
124
143
  setLoadedResource({
125
144
  resourceUri: targetUri,
145
+ ...(targetServerId !== undefined
146
+ ? { serverId: targetServerId }
147
+ : {}),
126
148
  error: error instanceof Error ? error : new Error(String(error)),
127
149
  });
128
150
  }
@@ -131,8 +153,8 @@ function InlineRenderer({
131
153
  return () => {
132
154
  cancelled = true;
133
155
  };
134
- // oxlint-disable-next-line react/exhaustive-deps -- re-fetch only when URI changes; appForRender identity is unstable and internalsRef is a stable ref
135
- }, [resourceUri]);
156
+ // oxlint-disable-next-line react/exhaustive-deps -- re-fetch only when URI or server identity changes; appForRender identity is unstable and internalsRef is a stable ref
157
+ }, [resourceUri, serverId]);
136
158
 
137
159
  const bridgeHandlers = useMemo<McpAppBridgeHandlers>(
138
160
  () => ({
@@ -143,16 +165,32 @@ function InlineRenderer({
143
165
  aui.thread().append({ content: [{ type: "text", text }] });
144
166
  return { ok: true };
145
167
  },
146
- callTool: (params) => internalsRef.current.host.callTool(params),
147
- readResource: (params) => internalsRef.current.host.readResource(params),
148
- listResources: (params) =>
149
- internalsRef.current.host.listResources(params),
168
+ callTool: (params) =>
169
+ internalsRef.current.host.callTool({
170
+ ...params,
171
+ ...(serverIdRef.current ? { serverId: serverIdRef.current } : {}),
172
+ }),
173
+ readResource: (params) =>
174
+ internalsRef.current.host.readResource({
175
+ ...params,
176
+ ...(serverIdRef.current ? { serverId: serverIdRef.current } : {}),
177
+ }),
178
+ listResources: (params) => {
179
+ if (!serverIdRef.current) {
180
+ return internalsRef.current.host.listResources(params);
181
+ }
182
+ return internalsRef.current.host.listResources({
183
+ ...(isRecord(params) ? params : {}),
184
+ serverId: serverIdRef.current,
185
+ });
186
+ },
150
187
  }),
151
188
  [aui, internalsRef],
152
189
  );
153
190
 
154
191
  const loadedResourceForApp =
155
- loadedResource?.resourceUri === appForRender?.resourceUri
192
+ loadedResource?.resourceUri === appForRender?.resourceUri &&
193
+ loadedResource?.serverId === appForRender?.serverId
156
194
  ? loadedResource
157
195
  : undefined;
158
196
  const appResource = loadedResourceForApp?.resource;
@@ -0,0 +1,126 @@
1
+ import { createTapRoot, useResource } from "@assistant-ui/tap";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { McpAppsRemoteHost } from "./McpAppsRemoteHost";
4
+
5
+ const mount = (fetch: typeof globalThis.fetch) =>
6
+ createTapRoot(function Root() {
7
+ return useResource(
8
+ McpAppsRemoteHost({
9
+ url: "/api/mcp-apps",
10
+ fetch,
11
+ }),
12
+ );
13
+ });
14
+
15
+ describe("McpAppsRemoteHost", () => {
16
+ it("posts the requested method and params to the host route", async () => {
17
+ const fetch = vi.fn(async () =>
18
+ Response.json({ content: [{ type: "text", text: "ok" }] }),
19
+ ) as unknown as typeof globalThis.fetch;
20
+ const root = mount(fetch);
21
+
22
+ try {
23
+ await expect(
24
+ root.getValue().callTool({
25
+ name: "search",
26
+ arguments: { query: "docs" },
27
+ }),
28
+ ).resolves.toEqual({ content: [{ type: "text", text: "ok" }] });
29
+
30
+ expect(fetch).toHaveBeenCalledWith("/api/mcp-apps", {
31
+ method: "POST",
32
+ headers: { "content-type": "application/json" },
33
+ body: JSON.stringify({
34
+ method: "tools/call",
35
+ params: { name: "search", arguments: { query: "docs" } },
36
+ }),
37
+ });
38
+ } finally {
39
+ root.unmount();
40
+ }
41
+ });
42
+
43
+ it("posts serverId params verbatim for tool calls and resource loads", async () => {
44
+ const fetch = vi.fn(async () =>
45
+ Response.json({ content: [{ type: "text", text: "ok" }] }),
46
+ ) as unknown as typeof globalThis.fetch;
47
+ const root = mount(fetch);
48
+
49
+ try {
50
+ await root.getValue().callTool({
51
+ name: "search",
52
+ arguments: { query: "docs" },
53
+ serverId: "search-server",
54
+ });
55
+ await root.getValue().loadResource({
56
+ uri: "ui://example/search",
57
+ serverId: "search-server",
58
+ });
59
+
60
+ expect(fetch).toHaveBeenNthCalledWith(1, "/api/mcp-apps", {
61
+ method: "POST",
62
+ headers: { "content-type": "application/json" },
63
+ body: JSON.stringify({
64
+ method: "tools/call",
65
+ params: {
66
+ name: "search",
67
+ arguments: { query: "docs" },
68
+ serverId: "search-server",
69
+ },
70
+ }),
71
+ });
72
+ expect(fetch).toHaveBeenNthCalledWith(2, "/api/mcp-apps", {
73
+ method: "POST",
74
+ headers: { "content-type": "application/json" },
75
+ body: JSON.stringify({
76
+ method: "mcp-apps/read-resource",
77
+ params: {
78
+ uri: "ui://example/search",
79
+ serverId: "search-server",
80
+ },
81
+ }),
82
+ });
83
+ } finally {
84
+ root.unmount();
85
+ }
86
+ });
87
+
88
+ it("includes method, url, status, and text body in host request errors", async () => {
89
+ const fetch = vi.fn(
90
+ async () =>
91
+ new Response("Missing tool name", {
92
+ status: 500,
93
+ statusText: "Internal Server Error",
94
+ }),
95
+ ) as unknown as typeof globalThis.fetch;
96
+ const root = mount(fetch);
97
+
98
+ try {
99
+ await expect(
100
+ root.getValue().callTool({ name: "search" }),
101
+ ).rejects.toThrow(
102
+ 'MCP App host request "tools/call" to "/api/mcp-apps" failed with 500 Internal Server Error: Missing tool name',
103
+ );
104
+ } finally {
105
+ root.unmount();
106
+ }
107
+ });
108
+
109
+ it("uses JSON error messages from failed host responses", async () => {
110
+ const fetch = vi.fn(async () =>
111
+ Response.json(
112
+ { error: { message: "resources/list is not supported" } },
113
+ { status: 400, statusText: "Bad Request" },
114
+ ),
115
+ ) as unknown as typeof globalThis.fetch;
116
+ const root = mount(fetch);
117
+
118
+ try {
119
+ await expect(root.getValue().listResources()).rejects.toThrow(
120
+ 'MCP App host request "resources/list" to "/api/mcp-apps" failed with 400 Bad Request: resources/list is not supported',
121
+ );
122
+ } finally {
123
+ root.unmount();
124
+ }
125
+ });
126
+ });
@@ -6,6 +6,39 @@ import type {
6
6
  McpAppsRemoteHostOptions,
7
7
  } from "./types";
8
8
 
9
+ const truncateBody = (body: string) =>
10
+ body.length > 500 ? `${body.slice(0, 500)}...` : body;
11
+
12
+ const extractErrorBody = (body: string): string | undefined => {
13
+ const trimmed = body.trim();
14
+ if (!trimmed) return undefined;
15
+
16
+ try {
17
+ const parsed = JSON.parse(trimmed) as unknown;
18
+ if (parsed && typeof parsed === "object") {
19
+ const record = parsed as Record<string, unknown>;
20
+ if (typeof record.message === "string") return record.message;
21
+ if (typeof record.error === "string") return record.error;
22
+ if (record.error && typeof record.error === "object") {
23
+ const error = record.error as Record<string, unknown>;
24
+ if (typeof error.message === "string") return error.message;
25
+ }
26
+ }
27
+ } catch {
28
+ return truncateBody(trimmed);
29
+ }
30
+
31
+ return truncateBody(trimmed);
32
+ };
33
+
34
+ const readErrorBody = async (res: Response): Promise<string | undefined> => {
35
+ try {
36
+ return extractErrorBody(await res.text());
37
+ } catch {
38
+ return undefined;
39
+ }
40
+ };
41
+
9
42
  async function postToHost(
10
43
  options: McpAppsRemoteHostOptions,
11
44
  method: string,
@@ -22,7 +55,13 @@ async function postToHost(
22
55
  body: JSON.stringify({ method, params }),
23
56
  });
24
57
  if (!res.ok) {
25
- throw new Error(`MCP App host request failed: ${res.status}`);
58
+ const status = res.statusText
59
+ ? `${res.status} ${res.statusText}`
60
+ : `${res.status}`;
61
+ const body = await readErrorBody(res);
62
+ throw new Error(
63
+ `MCP App host request "${method}" to "${options.url}" failed with ${status}${body ? `: ${body}` : ""}`,
64
+ );
26
65
  }
27
66
  return res.json();
28
67
  }
@@ -246,7 +246,9 @@ export function McpAppFrame({
246
246
  return (
247
247
  <SandboxHost
248
248
  content={{ html: resource.html }}
249
- contentKey={resource.uri}
249
+ contentKey={
250
+ app.serverId ? `${app.serverId} ${resource.uri}` : resource.uri
251
+ }
250
252
  sandbox={{ ...sandbox, product: sandbox?.product ?? DEFAULT_PRODUCT }}
251
253
  maxHeight={maxHeight}
252
254
  createBridge={createBridge}
@@ -10,7 +10,7 @@ import {
10
10
  type McpAppJsonRpcRequest,
11
11
  type McpAppJsonRpcResponse,
12
12
  } from "./types";
13
- import { isRecord } from "../utils/json/is-json";
13
+ import { isRecord } from "@assistant-ui/core/internal";
14
14
 
15
15
  const VALID_DISPLAY_MODES = [
16
16
  "inline",
@@ -51,19 +51,27 @@ export type McpAppHostInfo = {
51
51
  * `McpAppsRemoteHost`.
52
52
  */
53
53
  export type McpAppsHost = {
54
- loadResource: (params: { uri: string }) => Promise<McpAppResource>;
55
- callTool: (params: McpAppToolCallParams) => Promise<unknown>;
56
- readResource: (params: { uri: string }) => Promise<unknown>;
54
+ loadResource: (params: {
55
+ uri: string;
56
+ serverId?: string;
57
+ }) => Promise<McpAppResource>;
58
+ callTool: (
59
+ params: McpAppToolCallParams & { serverId?: string },
60
+ ) => Promise<unknown>;
61
+ readResource: (params: {
62
+ uri: string;
63
+ serverId?: string;
64
+ }) => Promise<unknown>;
57
65
  listResources: (params?: unknown) => Promise<unknown>;
58
66
  };
59
67
 
60
68
  /**
61
69
  * Options for `McpAppsRemoteHost`. The host POSTs `{ method, params }` to
62
- * `url` and expects JSON responses. Method names sent:
63
- * - `mcp-apps/read-resource` (`{ uri }`) → `McpAppResource`
64
- * - `tools/call` (`{ name, arguments? }`) → tool result
65
- * - `resources/read` (`{ uri }`) → resource read result
66
- * - `resources/list` (`params?`) → list result
70
+ * `url` and expects JSON responses. Params may carry `serverId` for host-side routing. Method names sent:
71
+ * - `mcp-apps/read-resource` (`{ uri, serverId? }`) → `McpAppResource`
72
+ * - `tools/call` (`{ name, arguments?, serverId? }`) → tool result
73
+ * - `resources/read` (`{ uri, serverId? }`) → resource read result
74
+ * - `resources/list` (`{ serverId?, ...params }?`) → list result
67
75
  */
68
76
  export type McpAppsRemoteHostOptions = {
69
77
  url: string;
@@ -0,0 +1,146 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { act, cleanup, render } from "@testing-library/react";
4
+ import {
5
+ forwardRef,
6
+ useState,
7
+ type ComponentProps,
8
+ type ChangeEvent,
9
+ } from "react";
10
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
11
+
12
+ const { registerMock, auiMock } = vi.hoisted(() => {
13
+ const register = vi.fn((_provider: unknown) => () => {});
14
+ return {
15
+ registerMock: register,
16
+ auiMock: {
17
+ modelContext: () => ({ register }),
18
+ },
19
+ };
20
+ });
21
+
22
+ vi.mock("@assistant-ui/store", async (importOriginal) => ({
23
+ ...(await importOriginal()),
24
+ useAui: () => auiMock,
25
+ }));
26
+
27
+ import { makeAssistantVisible } from "./makeAssistantVisible";
28
+
29
+ type EditTool = {
30
+ execute: (args: { editId: string; value: string }) => Promise<unknown>;
31
+ };
32
+
33
+ type ModelContextProvider = {
34
+ getModelContext: () => {
35
+ tools: {
36
+ edit: EditTool;
37
+ };
38
+ };
39
+ };
40
+
41
+ const ControlledInput = forwardRef<HTMLInputElement, ComponentProps<"input">>(
42
+ ({ onChange, ...props }, ref) => {
43
+ const [value, setValue] = useState("initial");
44
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
45
+ setValue(event.target.value);
46
+ onChange?.(event);
47
+ };
48
+
49
+ return (
50
+ <input
51
+ {...props}
52
+ ref={ref}
53
+ value={value}
54
+ data-react-value={value}
55
+ onChange={handleChange}
56
+ />
57
+ );
58
+ },
59
+ );
60
+
61
+ const ControlledTextarea = forwardRef<
62
+ HTMLTextAreaElement,
63
+ ComponentProps<"textarea">
64
+ >(({ onChange, ...props }, ref) => {
65
+ const [value, setValue] = useState("initial");
66
+ const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {
67
+ setValue(event.target.value);
68
+ onChange?.(event);
69
+ };
70
+
71
+ return (
72
+ <textarea
73
+ {...props}
74
+ ref={ref}
75
+ value={value}
76
+ data-react-value={value}
77
+ onChange={handleChange}
78
+ />
79
+ );
80
+ });
81
+
82
+ const runEditTool = async (
83
+ element: HTMLInputElement | HTMLTextAreaElement,
84
+ value: string,
85
+ ) => {
86
+ const editId = element.dataset.editId;
87
+ if (editId === undefined) throw new Error("Missing edit id");
88
+
89
+ const provider = registerMock.mock.calls[0]![0] as ModelContextProvider;
90
+ const task = provider.getModelContext().tools.edit.execute({
91
+ editId,
92
+ value,
93
+ });
94
+ await vi.runAllTimersAsync();
95
+ await task;
96
+ };
97
+
98
+ describe("makeAssistantVisible editable components", () => {
99
+ beforeEach(() => {
100
+ registerMock.mockClear();
101
+ vi.stubGlobal("CSS", { escape: (value: string) => value });
102
+ vi.useFakeTimers();
103
+ });
104
+
105
+ afterEach(() => {
106
+ cleanup();
107
+ vi.unstubAllGlobals();
108
+ vi.useRealTimers();
109
+ });
110
+
111
+ it("updates controlled input state through the edit tool", async () => {
112
+ const EditableInput = makeAssistantVisible(ControlledInput, {
113
+ editable: true,
114
+ });
115
+ const onChange = vi.fn();
116
+ const input = render(<EditableInput onChange={onChange} />).getByRole(
117
+ "textbox",
118
+ );
119
+
120
+ await act(async () => {
121
+ await runEditTool(input as HTMLInputElement, "updated");
122
+ });
123
+
124
+ expect(input).toHaveProperty("value", "updated");
125
+ expect(input.getAttribute("data-react-value")).toBe("updated");
126
+ expect(onChange).toHaveBeenCalledOnce();
127
+ });
128
+
129
+ it("updates controlled textarea state through the edit tool", async () => {
130
+ const EditableTextarea = makeAssistantVisible(ControlledTextarea, {
131
+ editable: true,
132
+ });
133
+ const onChange = vi.fn();
134
+ const textarea = render(<EditableTextarea onChange={onChange} />).getByRole(
135
+ "textbox",
136
+ );
137
+
138
+ await act(async () => {
139
+ await runEditTool(textarea as HTMLTextAreaElement, "updated");
140
+ });
141
+
142
+ expect(textarea).toHaveProperty("value", "updated");
143
+ expect(textarea.getAttribute("data-react-value")).toBe("updated");
144
+ expect(onChange).toHaveBeenCalledOnce();
145
+ });
146
+ });
@@ -40,6 +40,23 @@ const click = tool({
40
40
  },
41
41
  });
42
42
 
43
+ const setNativeValue = (
44
+ element: HTMLInputElement | HTMLTextAreaElement,
45
+ value: string,
46
+ ) => {
47
+ const prototype =
48
+ element instanceof HTMLInputElement
49
+ ? HTMLInputElement.prototype
50
+ : HTMLTextAreaElement.prototype;
51
+ const setter = Object.getOwnPropertyDescriptor(prototype, "value")?.set;
52
+
53
+ if (setter) {
54
+ setter.call(element, value);
55
+ } else {
56
+ element.value = value;
57
+ }
58
+ };
59
+
43
60
  const edit = tool({
44
61
  parameters: {
45
62
  type: "object",
@@ -57,7 +74,7 @@ const edit = tool({
57
74
  const escapedEditId = CSS.escape(editId);
58
75
  const el = document.querySelector(`[data-edit-id='${escapedEditId}']`);
59
76
  if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
60
- el.value = value;
77
+ setNativeValue(el, value);
61
78
  el.dispatchEvent(new Event("input", { bubbles: true }));
62
79
  el.dispatchEvent(new Event("change", { bubbles: true }));
63
80
 
@@ -1,16 +1,14 @@
1
1
  "use client";
2
2
 
3
- import {
4
- type ComponentPropsWithoutRef,
5
- type ComponentRef,
6
- forwardRef,
7
- } from "react";
8
- import { Popover as PopoverPrimitive } from "radix-ui";
3
+ import { type ComponentRef, forwardRef } from "react";
4
+ import type { Popover as PopoverPrimitive } from "radix-ui";
5
+ import type { WithRenderPropProps } from "../../utils/Primitive";
6
+ import { PopoverRenderAnchor } from "./popoverRenderPrimitives";
9
7
  import { type ScopedProps, usePopoverScope } from "./scope";
10
8
 
11
9
  export namespace AssistantModalPrimitiveAnchor {
12
10
  export type Element = ComponentRef<typeof PopoverPrimitive.Anchor>;
13
- export type Props = ComponentPropsWithoutRef<typeof PopoverPrimitive.Anchor>;
11
+ export type Props = WithRenderPropProps<typeof PopoverPrimitive.Anchor>;
14
12
  }
15
13
 
16
14
  export const AssistantModalPrimitiveAnchor = forwardRef<
@@ -26,7 +24,7 @@ export const AssistantModalPrimitiveAnchor = forwardRef<
26
24
  ) => {
27
25
  const scope = usePopoverScope(__scopeAssistantModal);
28
26
 
29
- return <PopoverPrimitive.Anchor {...scope} {...rest} ref={ref} />;
27
+ return <PopoverRenderAnchor {...scope} {...rest} ref={ref} />;
30
28
  },
31
29
  );
32
30
  AssistantModalPrimitiveAnchor.displayName = "AssistantModalPrimitive.Anchor";
@@ -6,14 +6,14 @@ import {
6
6
  forwardRef,
7
7
  } from "react";
8
8
  import { Popover as PopoverPrimitive } from "radix-ui";
9
- import { type ScopedProps, usePopoverScope } from "./scope";
10
9
  import { composeEventHandlers } from "@radix-ui/primitive";
10
+ import type { WithRenderPropProps } from "../../utils/Primitive";
11
+ import { PopoverRenderContent } from "./popoverRenderPrimitives";
12
+ import { type ScopedProps, usePopoverScope } from "./scope";
11
13
 
12
14
  export namespace AssistantModalPrimitiveContent {
13
15
  export type Element = ComponentRef<typeof PopoverPrimitive.Content>;
14
- export type Props = ComponentPropsWithoutRef<
15
- typeof PopoverPrimitive.Content
16
- > & {
16
+ export type Props = WithRenderPropProps<typeof PopoverPrimitive.Content> & {
17
17
  portalProps?:
18
18
  | ComponentPropsWithoutRef<typeof PopoverPrimitive.Portal>
19
19
  | undefined;
@@ -41,7 +41,7 @@ export const AssistantModalPrimitiveContent = forwardRef<
41
41
 
42
42
  return (
43
43
  <PopoverPrimitive.Portal {...scope} {...portalProps}>
44
- <PopoverPrimitive.Content
44
+ <PopoverRenderContent
45
45
  {...scope}
46
46
  {...props}
47
47
  ref={forwardedRef}
@@ -0,0 +1,80 @@
1
+ import { renderToStaticMarkup } from "react-dom/server";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { AssistantModalPrimitiveAnchor } from "./AssistantModalAnchor";
4
+ import { AssistantModalPrimitiveContent } from "./AssistantModalContent";
5
+ import { AssistantModalPrimitiveRoot } from "./AssistantModalRoot";
6
+ import { AssistantModalPrimitiveTrigger } from "./AssistantModalTrigger";
7
+
8
+ vi.mock("@assistant-ui/store", async (importOriginal) => {
9
+ const actual = await importOriginal<typeof import("@assistant-ui/store")>();
10
+ return {
11
+ ...actual,
12
+ useAui: () => ({
13
+ on: () => () => {},
14
+ }),
15
+ };
16
+ });
17
+
18
+ describe("AssistantModalPrimitive render props", () => {
19
+ it("Trigger render matches asChild", () => {
20
+ const renderHtml = renderToStaticMarkup(
21
+ <AssistantModalPrimitiveRoot open>
22
+ <AssistantModalPrimitiveTrigger
23
+ render={<button type="button" className="trigger" />}
24
+ >
25
+ Open
26
+ </AssistantModalPrimitiveTrigger>
27
+ </AssistantModalPrimitiveRoot>,
28
+ );
29
+
30
+ const asChildHtml = renderToStaticMarkup(
31
+ <AssistantModalPrimitiveRoot open>
32
+ <AssistantModalPrimitiveTrigger asChild>
33
+ <button type="button" className="trigger">
34
+ Open
35
+ </button>
36
+ </AssistantModalPrimitiveTrigger>
37
+ </AssistantModalPrimitiveRoot>,
38
+ );
39
+
40
+ expect(renderHtml).toBe(asChildHtml);
41
+ expect(renderHtml).toContain('class="trigger"');
42
+ expect(renderHtml).toContain("Open");
43
+ expect(renderHtml).toContain('type="button"');
44
+ expect(renderHtml).toMatch(/aria-haspopup|aria-expanded|data-state/);
45
+ });
46
+
47
+ it("Anchor render matches asChild", () => {
48
+ const renderHtml = renderToStaticMarkup(
49
+ <AssistantModalPrimitiveRoot open>
50
+ <AssistantModalPrimitiveAnchor render={<div className="anchor" />}>
51
+ Anchor
52
+ </AssistantModalPrimitiveAnchor>
53
+ </AssistantModalPrimitiveRoot>,
54
+ );
55
+
56
+ const asChildHtml = renderToStaticMarkup(
57
+ <AssistantModalPrimitiveRoot open>
58
+ <AssistantModalPrimitiveAnchor asChild>
59
+ <div className="anchor">Anchor</div>
60
+ </AssistantModalPrimitiveAnchor>
61
+ </AssistantModalPrimitiveRoot>,
62
+ );
63
+
64
+ expect(renderHtml).toBe(asChildHtml);
65
+ expect(renderHtml).toContain('class="anchor"');
66
+ expect(renderHtml).toContain("Anchor");
67
+ });
68
+
69
+ it("accepts render on Trigger, Anchor, and Content", () => {
70
+ const tree = (
71
+ <AssistantModalPrimitiveRoot open>
72
+ <AssistantModalPrimitiveTrigger render={<button type="button" />} />
73
+ <AssistantModalPrimitiveAnchor render={<div />} />
74
+ <AssistantModalPrimitiveContent render={<div />} />
75
+ </AssistantModalPrimitiveRoot>
76
+ );
77
+
78
+ expect(tree).toBeTruthy();
79
+ });
80
+ });