@assistant-ui/react 0.14.26 → 0.14.27

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 (425) 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 +2 -1
  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/cloud/auiV0.d.ts +11 -2
  44. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  45. package/dist/legacy-runtime/cloud/auiV0.js +31 -2
  46. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  47. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +1 -5
  48. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  49. package/dist/legacy-runtime/hooks/AssistantContext.d.ts +0 -1
  50. package/dist/legacy-runtime/hooks/AssistantContext.d.ts.map +1 -1
  51. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts +12 -13
  52. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts.map +1 -1
  53. package/dist/legacy-runtime/hooks/ComposerContext.d.ts +0 -1
  54. package/dist/legacy-runtime/hooks/ComposerContext.d.ts.map +1 -1
  55. package/dist/legacy-runtime/hooks/MessageContext.d.ts +0 -1
  56. package/dist/legacy-runtime/hooks/MessageContext.d.ts.map +1 -1
  57. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts +0 -1
  58. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts.map +1 -1
  59. package/dist/legacy-runtime/hooks/ThreadContext.d.ts +0 -1
  60. package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +1 -1
  61. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts +0 -1
  62. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts.map +1 -1
  63. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +0 -1
  64. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +1 -1
  65. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts +1 -4
  66. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  67. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +1 -1
  68. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +0 -1
  69. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  70. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts +0 -1
  71. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  72. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts +0 -1
  73. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.d.ts.map +1 -1
  74. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.d.ts.map +1 -1
  75. package/dist/mcp-apps/McpAppRenderer.d.ts +12 -7
  76. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  77. package/dist/mcp-apps/McpAppRenderer.js +29 -7
  78. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  79. package/dist/mcp-apps/McpAppsRemoteHost.d.ts +0 -1
  80. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  81. package/dist/mcp-apps/McpAppsRemoteHost.js +32 -1
  82. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  83. package/dist/mcp-apps/app-frame.d.ts +1 -12
  84. package/dist/mcp-apps/app-frame.d.ts.map +1 -1
  85. package/dist/mcp-apps/app-frame.js +1 -1
  86. package/dist/mcp-apps/app-frame.js.map +1 -1
  87. package/dist/mcp-apps/bridge.d.ts +0 -1
  88. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  89. package/dist/mcp-apps/bridge.js +4 -3
  90. package/dist/mcp-apps/bridge.js.map +1 -1
  91. package/dist/mcp-apps/types.d.ts +10 -7
  92. package/dist/mcp-apps/types.d.ts.map +1 -1
  93. package/dist/mcp-apps/types.js.map +1 -1
  94. package/dist/mcp-apps/utils.d.ts +0 -1
  95. package/dist/mcp-apps/utils.d.ts.map +1 -1
  96. package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -6
  97. package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -1
  98. package/dist/model-context/makeAssistantVisible.d.ts +0 -1
  99. package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
  100. package/dist/primitives/actionBar/ActionBarCopy.d.ts +1 -4
  101. package/dist/primitives/actionBar/ActionBarCopy.d.ts.map +1 -1
  102. package/dist/primitives/actionBar/ActionBarEdit.d.ts +0 -1
  103. package/dist/primitives/actionBar/ActionBarEdit.d.ts.map +1 -1
  104. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts +1 -5
  105. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  106. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts +0 -1
  107. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts.map +1 -1
  108. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts +0 -1
  109. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts.map +1 -1
  110. package/dist/primitives/actionBar/ActionBarInteractionContext.d.ts.map +1 -1
  111. package/dist/primitives/actionBar/ActionBarReload.d.ts +0 -1
  112. package/dist/primitives/actionBar/ActionBarReload.d.ts.map +1 -1
  113. package/dist/primitives/actionBar/ActionBarRoot.d.ts +0 -1
  114. package/dist/primitives/actionBar/ActionBarRoot.d.ts.map +1 -1
  115. package/dist/primitives/actionBar/ActionBarSpeak.d.ts +0 -1
  116. package/dist/primitives/actionBar/ActionBarSpeak.d.ts.map +1 -1
  117. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts +0 -1
  118. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  119. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts +1 -6
  120. package/dist/primitives/actionBar/useActionBarFloatStatus.d.ts.map +1 -1
  121. package/dist/primitives/actionBar.d.ts +0 -2
  122. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts +0 -1
  123. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts.map +1 -1
  124. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts +0 -1
  125. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts.map +1 -1
  126. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts +0 -1
  127. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts.map +1 -1
  128. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts +0 -1
  129. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts.map +1 -1
  130. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts +0 -1
  131. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts.map +1 -1
  132. package/dist/primitives/actionBarMore/scope.d.ts +0 -1
  133. package/dist/primitives/actionBarMore/scope.d.ts.map +1 -1
  134. package/dist/primitives/actionBarMore.d.ts +0 -2
  135. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts +6 -4
  136. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts.map +1 -1
  137. package/dist/primitives/assistantModal/AssistantModalAnchor.js +2 -2
  138. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  139. package/dist/primitives/assistantModal/AssistantModalContent.d.ts +4 -2
  140. package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
  141. package/dist/primitives/assistantModal/AssistantModalContent.js +2 -1
  142. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  143. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts +0 -1
  144. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts.map +1 -1
  145. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts +6 -4
  146. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts.map +1 -1
  147. package/dist/primitives/assistantModal/AssistantModalTrigger.js +2 -2
  148. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  149. package/dist/primitives/assistantModal/popoverRenderPrimitives.d.ts +14 -0
  150. package/dist/primitives/assistantModal/popoverRenderPrimitives.d.ts.map +1 -0
  151. package/dist/primitives/assistantModal/popoverRenderPrimitives.js +10 -0
  152. package/dist/primitives/assistantModal/popoverRenderPrimitives.js.map +1 -0
  153. package/dist/primitives/assistantModal/scope.d.ts +0 -1
  154. package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
  155. package/dist/primitives/assistantModal.d.ts +0 -2
  156. package/dist/primitives/attachment/AttachmentName.d.ts +0 -1
  157. package/dist/primitives/attachment/AttachmentName.d.ts.map +1 -1
  158. package/dist/primitives/attachment/AttachmentRemove.d.ts +0 -1
  159. package/dist/primitives/attachment/AttachmentRemove.d.ts.map +1 -1
  160. package/dist/primitives/attachment/AttachmentRoot.d.ts +0 -1
  161. package/dist/primitives/attachment/AttachmentRoot.d.ts.map +1 -1
  162. package/dist/primitives/attachment/AttachmentThumb.d.ts +0 -1
  163. package/dist/primitives/attachment/AttachmentThumb.d.ts.map +1 -1
  164. package/dist/primitives/attachment.d.ts +0 -2
  165. package/dist/primitives/branchPicker/BranchPickerCount.d.ts +0 -1
  166. package/dist/primitives/branchPicker/BranchPickerCount.d.ts.map +1 -1
  167. package/dist/primitives/branchPicker/BranchPickerNext.d.ts +0 -1
  168. package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
  169. package/dist/primitives/branchPicker/BranchPickerNumber.d.ts +0 -1
  170. package/dist/primitives/branchPicker/BranchPickerNumber.d.ts.map +1 -1
  171. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts +0 -1
  172. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
  173. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts +0 -1
  174. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  175. package/dist/primitives/branchPicker.d.ts +0 -2
  176. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +0 -1
  177. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
  178. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts +0 -1
  179. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts.map +1 -1
  180. package/dist/primitives/chainOfThought.d.ts +0 -2
  181. package/dist/primitives/composer/ComposerAddAttachment.d.ts +5 -6
  182. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  183. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts +0 -1
  184. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  185. package/dist/primitives/composer/ComposerCancel.d.ts +0 -1
  186. package/dist/primitives/composer/ComposerCancel.d.ts.map +1 -1
  187. package/dist/primitives/composer/ComposerCompactContext.d.ts +9 -0
  188. package/dist/primitives/composer/ComposerCompactContext.d.ts.map +1 -0
  189. package/dist/primitives/composer/ComposerCompactContext.js +11 -0
  190. package/dist/primitives/composer/ComposerCompactContext.js.map +1 -0
  191. package/dist/primitives/composer/ComposerDictate.d.ts +0 -1
  192. package/dist/primitives/composer/ComposerDictate.d.ts.map +1 -1
  193. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +0 -1
  194. package/dist/primitives/composer/ComposerDictationTranscript.d.ts.map +1 -1
  195. package/dist/primitives/composer/ComposerInput.d.ts +0 -1
  196. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  197. package/dist/primitives/composer/ComposerInput.js +17 -2
  198. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  199. package/dist/primitives/composer/ComposerInputPluginContext.d.ts +4 -3
  200. package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
  201. package/dist/primitives/composer/ComposerQuote.d.ts +0 -1
  202. package/dist/primitives/composer/ComposerQuote.d.ts.map +1 -1
  203. package/dist/primitives/composer/ComposerRoot.d.ts +22 -3
  204. package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
  205. package/dist/primitives/composer/ComposerRoot.js +63 -30
  206. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  207. package/dist/primitives/composer/ComposerSend.d.ts +0 -1
  208. package/dist/primitives/composer/ComposerSend.d.ts.map +1 -1
  209. package/dist/primitives/composer/ComposerStopDictation.d.ts +0 -1
  210. package/dist/primitives/composer/ComposerStopDictation.d.ts.map +1 -1
  211. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +10 -5
  212. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  213. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts +5 -3
  214. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts.map +1 -1
  215. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +3 -2
  216. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  217. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts +0 -1
  218. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts.map +1 -1
  219. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts +0 -1
  220. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts.map +1 -1
  221. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts +3 -2
  222. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts.map +1 -1
  223. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts +0 -1
  224. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts.map +1 -1
  225. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +10 -6
  226. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  227. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +8 -5
  228. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -1
  229. package/dist/primitives/composer/trigger/index.d.ts +0 -1
  230. package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
  231. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +5 -2
  232. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  233. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts +7 -4
  234. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
  235. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts +13 -7
  236. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
  237. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +7 -4
  238. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  239. package/dist/primitives/composer/useComposerInputState.d.ts.map +1 -1
  240. package/dist/primitives/composer.d.ts +0 -2
  241. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts +0 -1
  242. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts.map +1 -1
  243. package/dist/primitives/error/ErrorMessage.d.ts +0 -1
  244. package/dist/primitives/error/ErrorMessage.d.ts.map +1 -1
  245. package/dist/primitives/error/ErrorRoot.d.ts +0 -1
  246. package/dist/primitives/error/ErrorRoot.d.ts.map +1 -1
  247. package/dist/primitives/error.d.ts +0 -2
  248. package/dist/primitives/message/MessageError.d.ts +0 -1
  249. package/dist/primitives/message/MessageError.d.ts.map +1 -1
  250. package/dist/primitives/message/MessageIf.d.ts +0 -1
  251. package/dist/primitives/message/MessageIf.d.ts.map +1 -1
  252. package/dist/primitives/message/MessageParts.d.ts +0 -1
  253. package/dist/primitives/message/MessageParts.d.ts.map +1 -1
  254. package/dist/primitives/message/MessagePartsGrouped.d.ts +25 -12
  255. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  256. package/dist/primitives/message/MessageRoot.d.ts +0 -1
  257. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  258. package/dist/primitives/message.d.ts +0 -2
  259. package/dist/primitives/messagePart/MessagePartImage.d.ts +0 -1
  260. package/dist/primitives/messagePart/MessagePartImage.d.ts.map +1 -1
  261. package/dist/primitives/messagePart/MessagePartText.d.ts +0 -1
  262. package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
  263. package/dist/primitives/messagePart/useMessagePartData.d.ts +0 -1
  264. package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -1
  265. package/dist/primitives/messagePart/useMessagePartFile.d.ts +0 -1
  266. package/dist/primitives/messagePart/useMessagePartFile.d.ts.map +1 -1
  267. package/dist/primitives/messagePart/useMessagePartImage.d.ts +0 -1
  268. package/dist/primitives/messagePart/useMessagePartImage.d.ts.map +1 -1
  269. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts +0 -1
  270. package/dist/primitives/messagePart/useMessagePartReasoning.d.ts.map +1 -1
  271. package/dist/primitives/messagePart/useMessagePartSource.d.ts.map +1 -1
  272. package/dist/primitives/messagePart/useMessagePartText.d.ts +0 -1
  273. package/dist/primitives/messagePart/useMessagePartText.d.ts.map +1 -1
  274. package/dist/primitives/messagePart.d.ts +0 -2
  275. package/dist/primitives/queueItem/QueueItemRemove.d.ts +0 -1
  276. package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -1
  277. package/dist/primitives/queueItem/QueueItemSteer.d.ts +0 -1
  278. package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -1
  279. package/dist/primitives/queueItem/QueueItemText.d.ts +0 -1
  280. package/dist/primitives/queueItem/QueueItemText.d.ts.map +1 -1
  281. package/dist/primitives/queueItem.d.ts +0 -2
  282. package/dist/primitives/reasoning/useScrollLock.d.ts +0 -1
  283. package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -1
  284. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts +0 -1
  285. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts.map +1 -1
  286. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts +0 -1
  287. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts.map +1 -1
  288. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +2 -1
  289. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  290. package/dist/primitives/selectionToolbar.d.ts +0 -2
  291. package/dist/primitives/suggestion/SuggestionDescription.d.ts +0 -1
  292. package/dist/primitives/suggestion/SuggestionDescription.d.ts.map +1 -1
  293. package/dist/primitives/suggestion/SuggestionTitle.d.ts +0 -1
  294. package/dist/primitives/suggestion/SuggestionTitle.d.ts.map +1 -1
  295. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -5
  296. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  297. package/dist/primitives/suggestion.d.ts +0 -2
  298. package/dist/primitives/thread/ThreadEmpty.d.ts +0 -1
  299. package/dist/primitives/thread/ThreadEmpty.d.ts.map +1 -1
  300. package/dist/primitives/thread/ThreadIf.d.ts +0 -1
  301. package/dist/primitives/thread/ThreadIf.d.ts.map +1 -1
  302. package/dist/primitives/thread/ThreadRoot.d.ts +0 -1
  303. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  304. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +1 -4
  305. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  306. package/dist/primitives/thread/ThreadSuggestion.d.ts +13 -14
  307. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  308. package/dist/primitives/thread/ThreadViewport.d.ts +0 -1
  309. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  310. package/dist/primitives/thread/ThreadViewportFooter.d.ts +0 -1
  311. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  312. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts +2 -11
  313. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts.map +1 -1
  314. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts.map +1 -1
  315. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts.map +1 -1
  316. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts +1 -4
  317. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts.map +1 -1
  318. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts.map +1 -1
  319. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts.map +1 -1
  320. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts +1 -7
  321. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  322. package/dist/primitives/thread.d.ts +0 -2
  323. package/dist/primitives/threadList/ThreadListLoadMore.d.ts +0 -1
  324. package/dist/primitives/threadList/ThreadListLoadMore.d.ts.map +1 -1
  325. package/dist/primitives/threadList/ThreadListNew.d.ts +0 -1
  326. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  327. package/dist/primitives/threadList/ThreadListRoot.d.ts +0 -1
  328. package/dist/primitives/threadList/ThreadListRoot.d.ts.map +1 -1
  329. package/dist/primitives/threadList.d.ts +0 -2
  330. package/dist/primitives/threadListFocusGroup.d.ts +0 -1
  331. package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
  332. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +0 -1
  333. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  334. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +0 -1
  335. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  336. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +0 -1
  337. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  338. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +0 -1
  339. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  340. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +0 -1
  341. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  342. package/dist/primitives/threadListItem.d.ts +0 -2
  343. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts +0 -1
  344. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts.map +1 -1
  345. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts +0 -1
  346. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts.map +1 -1
  347. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts +0 -1
  348. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts.map +1 -1
  349. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts +0 -1
  350. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts.map +1 -1
  351. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts +0 -1
  352. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts.map +1 -1
  353. package/dist/primitives/threadListItemMore/scope.d.ts +0 -1
  354. package/dist/primitives/threadListItemMore/scope.d.ts.map +1 -1
  355. package/dist/primitives/threadListItemMore.d.ts +0 -2
  356. package/dist/sandbox-host/SandboxHost.d.ts +1 -10
  357. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  358. package/dist/tests/remote-thread-list-test-helpers.d.ts +0 -1
  359. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  360. package/dist/unstable/useComposerInput.d.ts +2 -2
  361. package/dist/unstable/useComposerInput.d.ts.map +1 -1
  362. package/dist/unstable/useComposerInputHistory.d.ts +2 -2
  363. package/dist/unstable/useComposerInputHistory.d.ts.map +1 -1
  364. package/dist/unstable/useLiveCompletionAdapter.d.ts +4 -3
  365. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -1
  366. package/dist/unstable/useMentionAdapter.d.ts +19 -10
  367. package/dist/unstable/useMentionAdapter.d.ts.map +1 -1
  368. package/dist/unstable/useMessageStallDetection.d.ts +3 -1
  369. package/dist/unstable/useMessageStallDetection.d.ts.map +1 -1
  370. package/dist/unstable/useSlashCommandAdapter.d.ts +6 -4
  371. package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
  372. package/dist/utils/Primitive.d.ts +0 -1
  373. package/dist/utils/Primitive.d.ts.map +1 -1
  374. package/dist/utils/RequireAtLeastOne.d.ts +1 -1
  375. package/dist/utils/RequireAtLeastOne.d.ts.map +1 -1
  376. package/dist/utils/createActionButton.d.ts +0 -1
  377. package/dist/utils/createActionButton.d.ts.map +1 -1
  378. package/dist/utils/getSelectionMessageId.d.ts.map +1 -1
  379. package/dist/utils/getSelectionMessageId.js +32 -7
  380. package/dist/utils/getSelectionMessageId.js.map +1 -1
  381. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  382. package/dist/utils/hooks/useMediaQuery.d.ts.map +1 -1
  383. package/dist/utils/hooks/useOnResizeContent.d.ts.map +1 -1
  384. package/dist/utils/hooks/useOnScrollToBottom.d.ts.map +1 -1
  385. package/dist/utils/hooks/useSizeHandle.d.ts +0 -1
  386. package/dist/utils/hooks/useSizeHandle.d.ts.map +1 -1
  387. package/dist/utils/smooth/SmoothContext.d.ts +71 -72
  388. package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
  389. package/dist/utils/smooth/useSmooth.d.ts +0 -1
  390. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  391. package/dist/utils/useToolArgsFieldStatus.d.ts +2 -2
  392. package/dist/utils/useToolArgsFieldStatus.d.ts.map +1 -1
  393. package/package.json +18 -18
  394. package/src/index.ts +3 -0
  395. package/src/legacy-runtime/cloud/auiV0.ts +72 -3
  396. package/src/mcp-apps/McpAppRenderer.test.tsx +141 -0
  397. package/src/mcp-apps/McpAppRenderer.tsx +48 -10
  398. package/src/mcp-apps/McpAppsRemoteHost.test.ts +126 -0
  399. package/src/mcp-apps/McpAppsRemoteHost.ts +40 -1
  400. package/src/mcp-apps/app-frame.tsx +3 -1
  401. package/src/mcp-apps/bridge.ts +1 -1
  402. package/src/mcp-apps/types.ts +16 -8
  403. package/src/primitives/assistantModal/AssistantModalAnchor.tsx +6 -8
  404. package/src/primitives/assistantModal/AssistantModalContent.tsx +5 -5
  405. package/src/primitives/assistantModal/AssistantModalTrigger.test.tsx +80 -0
  406. package/src/primitives/assistantModal/AssistantModalTrigger.tsx +6 -8
  407. package/src/primitives/assistantModal/popoverRenderPrimitives.ts +6 -0
  408. package/src/primitives/composer/ComposerCompactContext.tsx +13 -0
  409. package/src/primitives/composer/ComposerInput.tsx +35 -0
  410. package/src/primitives/composer/ComposerRoot.test.tsx +161 -0
  411. package/src/primitives/composer/ComposerRoot.tsx +37 -7
  412. package/src/tests/LocalThreadRuntimeCore.test.ts +4 -1
  413. package/src/tests/auiV0Encode.test.ts +134 -1
  414. package/src/utils/getSelectionMessageId.test.ts +175 -0
  415. package/src/utils/getSelectionMessageId.ts +57 -6
  416. package/dist/utils/json/is-json-equal.d.ts +0 -5
  417. package/dist/utils/json/is-json-equal.d.ts.map +0 -1
  418. package/dist/utils/json/is-json-equal.js +0 -26
  419. package/dist/utils/json/is-json-equal.js.map +0 -1
  420. package/dist/utils/json/is-json.d.ts +0 -10
  421. package/dist/utils/json/is-json.d.ts.map +0 -1
  422. package/dist/utils/json/is-json.js +0 -22
  423. package/dist/utils/json/is-json.js.map +0 -1
  424. package/src/utils/json/is-json-equal.ts +0 -48
  425. package/src/utils/json/is-json.ts +0 -58
@@ -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;
@@ -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
+ });
@@ -1,14 +1,12 @@
1
- import {
2
- type ComponentPropsWithoutRef,
3
- type ComponentRef,
4
- forwardRef,
5
- } from "react";
6
- import { Popover as PopoverPrimitive } from "radix-ui";
1
+ import { type ComponentRef, forwardRef } from "react";
2
+ import type { Popover as PopoverPrimitive } from "radix-ui";
3
+ import type { WithRenderPropProps } from "../../utils/Primitive";
4
+ import { PopoverRenderTrigger } from "./popoverRenderPrimitives";
7
5
  import { type ScopedProps, usePopoverScope } from "./scope";
8
6
 
9
7
  export namespace AssistantModalPrimitiveTrigger {
10
8
  export type Element = ComponentRef<typeof PopoverPrimitive.Trigger>;
11
- export type Props = ComponentPropsWithoutRef<typeof PopoverPrimitive.Trigger>;
9
+ export type Props = WithRenderPropProps<typeof PopoverPrimitive.Trigger>;
12
10
  }
13
11
 
14
12
  export const AssistantModalPrimitiveTrigger = forwardRef<
@@ -24,7 +22,7 @@ export const AssistantModalPrimitiveTrigger = forwardRef<
24
22
  ) => {
25
23
  const scope = usePopoverScope(__scopeAssistantModal);
26
24
 
27
- return <PopoverPrimitive.Trigger {...scope} {...rest} ref={ref} />;
25
+ return <PopoverRenderTrigger {...scope} {...rest} ref={ref} />;
28
26
  },
29
27
  );
30
28
 
@@ -0,0 +1,6 @@
1
+ import { Popover as PopoverPrimitive } from "radix-ui";
2
+ import { withRenderProp } from "../../utils/Primitive";
3
+
4
+ export const PopoverRenderTrigger = withRenderProp(PopoverPrimitive.Trigger);
5
+ export const PopoverRenderAnchor = withRenderProp(PopoverPrimitive.Anchor);
6
+ export const PopoverRenderContent = withRenderProp(PopoverPrimitive.Content);
@@ -0,0 +1,13 @@
1
+ "use client";
2
+
3
+ import { createContext, useContext } from "react";
4
+
5
+ export type ComposerCompactContextValue = {
6
+ setMultiline: (multiline: boolean) => void;
7
+ };
8
+
9
+ export const ComposerCompactContext =
10
+ createContext<ComposerCompactContextValue | null>(null);
11
+
12
+ export const useComposerCompactContextOptional = () =>
13
+ useContext(ComposerCompactContext);
@@ -17,6 +17,7 @@ import {
17
17
  } from "react";
18
18
  import TextareaAutosize, {
19
19
  type TextareaAutosizeProps,
20
+ type TextareaHeightChangeMeta,
20
21
  } from "react-textarea-autosize";
21
22
  import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
22
23
  import { useOnScrollToBottom } from "../../utils/hooks/useOnScrollToBottom";
@@ -24,6 +25,7 @@ import { useMediaQuery } from "../../utils/hooks/useMediaQuery";
24
25
  import { useAui } from "@assistant-ui/store";
25
26
  import { flushTapSync } from "@assistant-ui/tap";
26
27
  import { useComposerInputPluginRegistryOptional } from "./ComposerInputPluginContext";
28
+ import { useComposerCompactContextOptional } from "./ComposerCompactContext";
27
29
  import {
28
30
  useComposerInputDisabled,
29
31
  useComposerInputValue,
@@ -165,12 +167,14 @@ export const ComposerPrimitiveInput = forwardRef<
165
167
  unstable_focusOnThreadSwitched = true,
166
168
  unstable_insertNewlineOnTouchEnter = false,
167
169
  addAttachmentOnPaste = true,
170
+ onHeightChange,
168
171
  ...rest
169
172
  },
170
173
  forwardedRef,
171
174
  ) => {
172
175
  const aui = useAui();
173
176
  const pluginRegistry = useComposerInputPluginRegistryOptional();
177
+ const compactContext = useComposerCompactContextOptional();
174
178
 
175
179
  const declaredSubmitMode =
176
180
  submitMode ?? (submitOnEnter === false ? "none" : "enter");
@@ -278,6 +282,28 @@ export const ComposerPrimitiveInput = forwardRef<
278
282
  }
279
283
  };
280
284
 
285
+ const handleHeightChange = (
286
+ height: number,
287
+ meta: TextareaHeightChangeMeta,
288
+ ) => {
289
+ onHeightChange?.(height, meta);
290
+ if (!compactContext) return;
291
+ const el = textareaRef.current;
292
+ if (!el || el.value === "") return;
293
+ const cs = getComputedStyle(el);
294
+ const contentHeight =
295
+ cs.boxSizing === "border-box"
296
+ ? height -
297
+ parseFloat(cs.paddingTop) -
298
+ parseFloat(cs.paddingBottom) -
299
+ parseFloat(cs.borderTopWidth) -
300
+ parseFloat(cs.borderBottomWidth)
301
+ : height;
302
+ if (Math.round(contentHeight / meta.rowHeight) > 1) {
303
+ compactContext.setMultiline(true);
304
+ }
305
+ };
306
+
281
307
  const autoFocusEnabled = autoFocus && !isDisabled;
282
308
  const focus = useCallback(() => {
283
309
  const textarea = textareaRef.current;
@@ -318,6 +344,10 @@ export const ComposerPrimitiveInput = forwardRef<
318
344
  return aui.on("threadListItem.switchedTo", focus);
319
345
  }, [unstable_focusOnThreadSwitched, focus, aui]);
320
346
 
347
+ useEffect(() => {
348
+ if (value === "") compactContext?.setMultiline(false);
349
+ }, [value, compactContext]);
350
+
321
351
  const ariaComboboxProps = useTriggerPopoverAriaProps();
322
352
 
323
353
  const inputProps = {
@@ -391,6 +421,11 @@ export const ComposerPrimitiveInput = forwardRef<
391
421
  },
392
422
  ),
393
423
  onPaste: composeEventHandlers(onPaste, handlePaste),
424
+ ...(compactContext
425
+ ? { onHeightChange: handleHeightChange }
426
+ : onHeightChange !== undefined
427
+ ? { onHeightChange }
428
+ : {}),
394
429
  };
395
430
 
396
431
  if (render && isValidElement(render)) {
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { act } from "react";
5
+ import type { ReactNode } from "react";
6
+ import { createRoot } from "react-dom/client";
7
+ import type { Root } from "react-dom/client";
8
+ import type * as AssistantStore from "@assistant-ui/store";
9
+ import type * as ComposerSendModule from "./ComposerSend";
10
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
11
+ import { useComposerCompactContextOptional } from "./ComposerCompactContext";
12
+ import type { ComposerCompactContextValue } from "./ComposerCompactContext";
13
+ import { ComposerPrimitiveRoot } from "./ComposerRoot";
14
+
15
+ type StoreState = {
16
+ composer: {
17
+ attachments: object[];
18
+ quote: object | undefined;
19
+ queue: object[];
20
+ dictation: object | undefined;
21
+ text: string;
22
+ };
23
+ };
24
+
25
+ const { storeState } = vi.hoisted((): { storeState: StoreState } => ({
26
+ storeState: {
27
+ composer: {
28
+ attachments: [],
29
+ quote: undefined,
30
+ queue: [],
31
+ dictation: undefined,
32
+ text: "",
33
+ },
34
+ },
35
+ }));
36
+
37
+ (globalThis as Record<string, unknown>).IS_REACT_ACT_ENVIRONMENT = true;
38
+
39
+ vi.mock("@assistant-ui/store", async (importOriginal) => {
40
+ const actual = await importOriginal<typeof AssistantStore>();
41
+ return {
42
+ ...actual,
43
+ useAuiState: <T,>(selector: (state: StoreState) => T) =>
44
+ selector(storeState),
45
+ };
46
+ });
47
+
48
+ vi.mock("./ComposerSend", async (importOriginal) => ({
49
+ ...(await importOriginal<typeof ComposerSendModule>()),
50
+ useComposerSend: () => vi.fn(),
51
+ }));
52
+
53
+ const resetStoreState = () => {
54
+ storeState.composer.attachments = [];
55
+ storeState.composer.quote = undefined;
56
+ storeState.composer.queue = [];
57
+ storeState.composer.dictation = undefined;
58
+ storeState.composer.text = "";
59
+ };
60
+
61
+ describe("ComposerPrimitiveRoot", () => {
62
+ let container: HTMLDivElement;
63
+ let root: Root;
64
+
65
+ beforeEach(() => {
66
+ resetStoreState();
67
+ container = document.createElement("div");
68
+ document.body.appendChild(container);
69
+ root = createRoot(container);
70
+ });
71
+
72
+ afterEach(async () => {
73
+ await act(async () => {
74
+ root.unmount();
75
+ });
76
+ container.remove();
77
+ vi.restoreAllMocks();
78
+ });
79
+
80
+ const mount = async (props: {
81
+ compact?: boolean | undefined;
82
+ children?: ReactNode;
83
+ }) => {
84
+ await act(async () => {
85
+ root.render(
86
+ <ComposerPrimitiveRoot data-testid="composer-root" {...props} />,
87
+ );
88
+ });
89
+ const form = container.querySelector("form");
90
+ expect(form).not.toBeNull();
91
+ return form as HTMLFormElement;
92
+ };
93
+
94
+ it("does not mark the form compact when compact is not enabled", async () => {
95
+ const form = await mount({});
96
+
97
+ expect(form.hasAttribute("data-compact")).toBe(false);
98
+ });
99
+
100
+ it("provides no compact context when compact is not enabled", async () => {
101
+ let compactContext: ComposerCompactContextValue | null = null;
102
+ const Probe = () => {
103
+ compactContext = useComposerCompactContextOptional();
104
+ return null;
105
+ };
106
+
107
+ await mount({ children: <Probe /> });
108
+
109
+ expect(compactContext).toBeNull();
110
+ });
111
+
112
+ it("starts compact on the first render when compact is enabled and composer state is pristine", async () => {
113
+ const form = await mount({ compact: true });
114
+
115
+ expect(form.hasAttribute("data-compact")).toBe(true);
116
+ });
117
+
118
+ it.each([
119
+ ["attachments are present", { attachments: [{}] }],
120
+ ["a quote is present", { quote: {} }],
121
+ ["queued messages are present", { queue: [{}] }],
122
+ ["dictation is active", { dictation: {} }],
123
+ ["text contains an explicit newline", { text: "a\nb" }],
124
+ ] as const)(
125
+ "does not mark the form compact when %s",
126
+ async (_name, composerPatch) => {
127
+ Object.assign(storeState.composer, composerPatch);
128
+
129
+ const form = await mount({ compact: true });
130
+
131
+ expect(form.hasAttribute("data-compact")).toBe(false);
132
+ },
133
+ );
134
+
135
+ it("updates compact mode when the compact context multiline latch changes", async () => {
136
+ let compactContext: ComposerCompactContextValue | null = null;
137
+ const Probe = () => {
138
+ compactContext = useComposerCompactContextOptional();
139
+ return null;
140
+ };
141
+
142
+ const form = await mount({
143
+ compact: true,
144
+ children: <Probe />,
145
+ });
146
+ const context = compactContext;
147
+ expect(context).not.toBeNull();
148
+ if (!context) throw new Error("Composer compact context was not provided");
149
+ expect(form.hasAttribute("data-compact")).toBe(true);
150
+
151
+ await act(async () => {
152
+ context.setMultiline(true);
153
+ });
154
+ expect(form.hasAttribute("data-compact")).toBe(false);
155
+
156
+ await act(async () => {
157
+ context.setMultiline(false);
158
+ });
159
+ expect(form.hasAttribute("data-compact")).toBe(true);
160
+ });
161
+ });
@@ -1,14 +1,18 @@
1
1
  "use client";
2
2
 
3
3
  import { composeEventHandlers } from "@radix-ui/primitive";
4
+ import { useAuiState } from "@assistant-ui/store";
4
5
  import { Primitive } from "../../utils/Primitive";
5
6
  import {
6
7
  type ComponentRef,
7
8
  type FormEvent,
8
9
  forwardRef,
9
10
  type ComponentPropsWithoutRef,
11
+ useMemo,
12
+ useState,
10
13
  } from "react";
11
14
  import { useComposerSend } from "./ComposerSend";
15
+ import { ComposerCompactContext } from "./ComposerCompactContext";
12
16
 
13
17
  export namespace ComposerPrimitiveRoot {
14
18
  export type Element = ComponentRef<typeof Primitive.form>;
@@ -16,7 +20,17 @@ export namespace ComposerPrimitiveRoot {
16
20
  * Props for the ComposerPrimitive.Root component.
17
21
  * Accepts all standard form element props.
18
22
  */
19
- export type Props = ComponentPropsWithoutRef<typeof Primitive.form>;
23
+ export type Props = ComponentPropsWithoutRef<typeof Primitive.form> & {
24
+ /**
25
+ * Opt the composer into compact mode. While the input holds at most a single
26
+ * line of text and there are no attachments, quote, queued messages, or
27
+ * active dictation, the root renders a `data-compact` attribute so styles
28
+ * can collapse the composer into a single row. It expands automatically
29
+ * when any of those conditions stop holding.
30
+ * @default false
31
+ */
32
+ compact?: boolean | undefined;
33
+ };
20
34
  }
21
35
 
22
36
  /**
@@ -37,9 +51,22 @@ export namespace ComposerPrimitiveRoot {
37
51
  export const ComposerPrimitiveRoot = forwardRef<
38
52
  ComposerPrimitiveRoot.Element,
39
53
  ComposerPrimitiveRoot.Props
40
- >(({ onSubmit, ...rest }, forwardedRef) => {
54
+ >(({ onSubmit, compact, ...rest }, forwardedRef) => {
41
55
  const send = useComposerSend();
42
56
 
57
+ const [multiline, setMultiline] = useState(false);
58
+ const compactContext = useMemo(() => ({ setMultiline }), []);
59
+ const stateAllowsCompact = useAuiState((s) =>
60
+ compact
61
+ ? s.composer.attachments.length === 0 &&
62
+ s.composer.quote == null &&
63
+ s.composer.queue.length === 0 &&
64
+ s.composer.dictation == null &&
65
+ !s.composer.text.includes("\n")
66
+ : false,
67
+ );
68
+ const isCompact = stateAllowsCompact && !multiline;
69
+
43
70
  const handleSubmit = (e: FormEvent) => {
44
71
  e.preventDefault();
45
72
 
@@ -48,11 +75,14 @@ export const ComposerPrimitiveRoot = forwardRef<
48
75
  };
49
76
 
50
77
  return (
51
- <Primitive.form
52
- {...rest}
53
- ref={forwardedRef}
54
- onSubmit={composeEventHandlers(onSubmit, handleSubmit)}
55
- />
78
+ <ComposerCompactContext.Provider value={compact ? compactContext : null}>
79
+ <Primitive.form
80
+ {...rest}
81
+ data-compact={isCompact ? "" : undefined}
82
+ ref={forwardedRef}
83
+ onSubmit={composeEventHandlers(onSubmit, handleSubmit)}
84
+ />
85
+ </ComposerCompactContext.Provider>
56
86
  );
57
87
  });
58
88
 
@@ -161,7 +161,10 @@ describe("LocalThreadRuntimeCore", () => {
161
161
  expect(assistant.status!.type).toBe("incomplete");
162
162
  if (assistant.status!.type === "incomplete") {
163
163
  expect(assistant.status!.reason).toBe("error");
164
- expect(assistant.status!.error).toBe("Model unavailable");
164
+ expect(assistant.status!.error).toEqual({
165
+ code: "unknown",
166
+ message: "Model unavailable",
167
+ });
165
168
  }
166
169
  });
167
170