@assistant-ui/react 0.12.25 → 0.12.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 (491) hide show
  1. package/dist/augmentations.d.ts.map +1 -1
  2. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  3. package/dist/client/InMemoryThreadList.js +1 -0
  4. package/dist/client/InMemoryThreadList.js.map +1 -1
  5. package/dist/client/SingleThreadList.d.ts.map +1 -1
  6. package/dist/client/SingleThreadList.js +1 -0
  7. package/dist/client/SingleThreadList.js.map +1 -1
  8. package/dist/context/providers/MessageProvider.d.ts +1 -1
  9. package/dist/context/providers/MessageProvider.d.ts.map +1 -1
  10. package/dist/context/react/ThreadViewportContext.d.ts +3 -3
  11. package/dist/context/react/ThreadViewportContext.d.ts.map +1 -1
  12. package/dist/context/react/utils/createContextHook.d.ts +1 -1
  13. package/dist/context/react/utils/createContextHook.d.ts.map +1 -1
  14. package/dist/context/react/utils/createContextHook.js.map +1 -1
  15. package/dist/context/react/utils/createContextStoreHook.d.ts +1 -1
  16. package/dist/context/react/utils/createContextStoreHook.d.ts.map +1 -1
  17. package/dist/context/react/utils/createStateHookForRuntime.d.ts +1 -1
  18. package/dist/context/react/utils/createStateHookForRuntime.d.ts.map +1 -1
  19. package/dist/context/react/utils/createStateHookForRuntime.js +1 -0
  20. package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -1
  21. package/dist/devtools/DevToolsHooks.d.ts +1 -1
  22. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  23. package/dist/devtools/DevToolsHooks.js +4 -0
  24. package/dist/devtools/DevToolsHooks.js.map +1 -1
  25. package/dist/index.d.ts +3 -5
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +6 -32
  28. package/dist/index.js.map +1 -1
  29. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts +3 -3
  30. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  31. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  32. package/dist/legacy-runtime/cloud/auiV0.d.ts +3 -3
  33. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  34. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  35. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +1 -1
  36. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  37. package/dist/legacy-runtime/hooks/AssistantContext.d.ts +1 -1
  38. package/dist/legacy-runtime/hooks/AssistantContext.d.ts.map +1 -1
  39. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts +1 -1
  40. package/dist/legacy-runtime/hooks/AttachmentContext.d.ts.map +1 -1
  41. package/dist/legacy-runtime/hooks/ComposerContext.d.ts +1 -1
  42. package/dist/legacy-runtime/hooks/ComposerContext.d.ts.map +1 -1
  43. package/dist/legacy-runtime/hooks/MessageContext.d.ts +1 -1
  44. package/dist/legacy-runtime/hooks/MessageContext.d.ts.map +1 -1
  45. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts +1 -1
  46. package/dist/legacy-runtime/hooks/MessagePartContext.d.ts.map +1 -1
  47. package/dist/legacy-runtime/hooks/ThreadContext.d.ts +1 -1
  48. package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +1 -1
  49. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts +1 -1
  50. package/dist/legacy-runtime/hooks/ThreadListItemContext.d.ts.map +1 -1
  51. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts +1 -1
  52. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.d.ts.map +1 -1
  53. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +2 -2
  54. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  55. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts +3 -3
  56. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  57. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +14 -1
  58. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  59. package/dist/model-context/frame/useAssistantFrameHost.d.ts +1 -1
  60. package/dist/model-context/frame/useAssistantFrameHost.d.ts.map +1 -1
  61. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  62. package/dist/model-context/makeAssistantVisible.d.ts +1 -1
  63. package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
  64. package/dist/primitives/actionBar/ActionBarCopy.d.ts +1 -1
  65. package/dist/primitives/actionBar/ActionBarCopy.d.ts.map +1 -1
  66. package/dist/primitives/actionBar/ActionBarEdit.d.ts +1 -1
  67. package/dist/primitives/actionBar/ActionBarEdit.d.ts.map +1 -1
  68. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts +1 -1
  69. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  70. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts +1 -1
  71. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts.map +1 -1
  72. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts +1 -1
  73. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts.map +1 -1
  74. package/dist/primitives/actionBar/ActionBarReload.d.ts +1 -1
  75. package/dist/primitives/actionBar/ActionBarReload.d.ts.map +1 -1
  76. package/dist/primitives/actionBar/ActionBarRoot.d.ts +1 -1
  77. package/dist/primitives/actionBar/ActionBarRoot.d.ts.map +1 -1
  78. package/dist/primitives/actionBar/ActionBarSpeak.d.ts +1 -1
  79. package/dist/primitives/actionBar/ActionBarSpeak.d.ts.map +1 -1
  80. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts +1 -1
  81. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  82. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts +5 -2
  83. package/dist/primitives/actionBarMore/ActionBarMoreContent.d.ts.map +1 -1
  84. package/dist/primitives/actionBarMore/ActionBarMoreContent.js +3 -2
  85. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  86. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts +7 -4
  87. package/dist/primitives/actionBarMore/ActionBarMoreItem.d.ts.map +1 -1
  88. package/dist/primitives/actionBarMore/ActionBarMoreItem.js +2 -2
  89. package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
  90. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts +1 -1
  91. package/dist/primitives/actionBarMore/ActionBarMoreRoot.d.ts.map +1 -1
  92. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
  93. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts +7 -4
  94. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.d.ts.map +1 -1
  95. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +2 -2
  96. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
  97. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts +7 -4
  98. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.d.ts.map +1 -1
  99. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +2 -2
  100. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
  101. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts +1 -1
  102. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts.map +1 -1
  103. package/dist/primitives/assistantModal/AssistantModalAnchor.js +1 -1
  104. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  105. package/dist/primitives/assistantModal/AssistantModalContent.d.ts +1 -1
  106. package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
  107. package/dist/primitives/assistantModal/AssistantModalContent.js +1 -1
  108. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  109. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts +1 -1
  110. package/dist/primitives/assistantModal/AssistantModalRoot.d.ts.map +1 -1
  111. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  112. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts +1 -1
  113. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts.map +1 -1
  114. package/dist/primitives/assistantModal/AssistantModalTrigger.js +1 -1
  115. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  116. package/dist/primitives/attachment/AttachmentRemove.d.ts +1 -1
  117. package/dist/primitives/attachment/AttachmentRemove.d.ts.map +1 -1
  118. package/dist/primitives/attachment/AttachmentRoot.d.ts +1 -1
  119. package/dist/primitives/attachment/AttachmentRoot.d.ts.map +1 -1
  120. package/dist/primitives/attachment/AttachmentRoot.js +1 -1
  121. package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
  122. package/dist/primitives/attachment/AttachmentThumb.d.ts +1 -1
  123. package/dist/primitives/attachment/AttachmentThumb.d.ts.map +1 -1
  124. package/dist/primitives/attachment/AttachmentThumb.js +1 -1
  125. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  126. package/dist/primitives/branchPicker/BranchPickerNext.d.ts +1 -1
  127. package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
  128. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts +1 -1
  129. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
  130. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts +1 -1
  131. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  132. package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -1
  133. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  134. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +1 -1
  135. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
  136. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts +1 -1
  137. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts.map +1 -1
  138. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +1 -1
  139. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js.map +1 -1
  140. package/dist/primitives/composer/ComposerAddAttachment.d.ts +1 -1
  141. package/dist/primitives/composer/ComposerAddAttachment.d.ts.map +1 -1
  142. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts +1 -1
  143. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  144. package/dist/primitives/composer/ComposerAttachmentDropzone.js +3 -2
  145. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  146. package/dist/primitives/composer/ComposerCancel.d.ts +1 -1
  147. package/dist/primitives/composer/ComposerCancel.d.ts.map +1 -1
  148. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +1 -1
  149. package/dist/primitives/composer/ComposerDictationTranscript.d.ts.map +1 -1
  150. package/dist/primitives/composer/ComposerDictationTranscript.js +1 -1
  151. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  152. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  153. package/dist/primitives/composer/ComposerInput.js +28 -0
  154. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  155. package/dist/primitives/composer/ComposerInputPluginContext.d.ts +11 -3
  156. package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
  157. package/dist/primitives/composer/ComposerInputPluginContext.js +13 -9
  158. package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
  159. package/dist/primitives/composer/ComposerRoot.d.ts +1 -1
  160. package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
  161. package/dist/primitives/composer/ComposerSend.d.ts +1 -1
  162. package/dist/primitives/composer/ComposerSend.d.ts.map +1 -1
  163. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +60 -0
  164. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -0
  165. package/dist/primitives/composer/trigger/TriggerPopover.js +108 -0
  166. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -0
  167. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts +31 -0
  168. package/dist/primitives/composer/trigger/TriggerPopoverAction.d.ts.map +1 -0
  169. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +39 -0
  170. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -0
  171. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts.map +1 -1
  172. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +3 -3
  173. package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
  174. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts.map +1 -1
  175. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +11 -9
  176. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  177. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts +28 -0
  178. package/dist/primitives/composer/trigger/TriggerPopoverDirective.d.ts.map +1 -0
  179. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +37 -0
  180. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -0
  181. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts.map +1 -1
  182. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +9 -6
  183. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  184. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +16 -17
  185. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  186. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +53 -248
  187. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  188. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +60 -0
  189. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -0
  190. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +117 -0
  191. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -0
  192. package/dist/primitives/composer/trigger/detectTrigger.js +1 -1
  193. package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
  194. package/dist/primitives/composer/trigger/index.d.ts +16 -3
  195. package/dist/primitives/composer/trigger/index.d.ts.map +1 -1
  196. package/dist/primitives/composer/trigger/index.js +9 -2
  197. package/dist/primitives/composer/trigger/index.js.map +1 -1
  198. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +22 -0
  199. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -0
  200. package/dist/primitives/composer/trigger/triggerDetectionResource.js +17 -0
  201. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -0
  202. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts +45 -0
  203. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -0
  204. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +94 -0
  205. package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -0
  206. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts +31 -0
  207. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -0
  208. package/dist/primitives/composer/trigger/triggerNavigationResource.js +94 -0
  209. package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -0
  210. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +42 -0
  211. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -0
  212. package/dist/primitives/composer/trigger/triggerSelectionResource.js +62 -0
  213. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -0
  214. package/dist/primitives/composer.d.ts +8 -13
  215. package/dist/primitives/composer.d.ts.map +1 -1
  216. package/dist/primitives/composer.js +7 -17
  217. package/dist/primitives/composer.js.map +1 -1
  218. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts +14 -0
  219. package/dist/primitives/dropdownMenuRenderPrimitives.d.ts.map +1 -0
  220. package/dist/primitives/dropdownMenuRenderPrimitives.js +7 -0
  221. package/dist/primitives/dropdownMenuRenderPrimitives.js.map +1 -0
  222. package/dist/primitives/error/ErrorMessage.d.ts +1 -1
  223. package/dist/primitives/error/ErrorMessage.d.ts.map +1 -1
  224. package/dist/primitives/error/ErrorMessage.js +1 -1
  225. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  226. package/dist/primitives/error/ErrorRoot.d.ts +1 -1
  227. package/dist/primitives/error/ErrorRoot.d.ts.map +1 -1
  228. package/dist/primitives/error/ErrorRoot.js +1 -1
  229. package/dist/primitives/error/ErrorRoot.js.map +1 -1
  230. package/dist/primitives/message/MessageError.d.ts +1 -1
  231. package/dist/primitives/message/MessageError.d.ts.map +1 -1
  232. package/dist/primitives/message/MessageIf.js +1 -1
  233. package/dist/primitives/message/MessageIf.js.map +1 -1
  234. package/dist/primitives/message/MessagePartsGrouped.d.ts +1 -1
  235. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  236. package/dist/primitives/message/MessageRoot.d.ts +1 -1
  237. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  238. package/dist/primitives/messagePart/MessagePartImage.d.ts +1 -1
  239. package/dist/primitives/messagePart/MessagePartImage.d.ts.map +1 -1
  240. package/dist/primitives/messagePart/MessagePartImage.js +2 -1
  241. package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
  242. package/dist/primitives/messagePart/MessagePartInProgress.d.ts +1 -1
  243. package/dist/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  244. package/dist/primitives/messagePart/MessagePartText.d.ts +2 -2
  245. package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
  246. package/dist/primitives/queueItem/QueueItemRemove.d.ts +1 -1
  247. package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -1
  248. package/dist/primitives/queueItem/QueueItemSteer.d.ts +1 -1
  249. package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -1
  250. package/dist/primitives/suggestion/SuggestionDescription.d.ts +1 -1
  251. package/dist/primitives/suggestion/SuggestionDescription.d.ts.map +1 -1
  252. package/dist/primitives/suggestion/SuggestionDescription.js +1 -1
  253. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  254. package/dist/primitives/suggestion/SuggestionTitle.d.ts +1 -1
  255. package/dist/primitives/suggestion/SuggestionTitle.d.ts.map +1 -1
  256. package/dist/primitives/suggestion/SuggestionTitle.js +1 -1
  257. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  258. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -1
  259. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  260. package/dist/primitives/thread/ThreadRoot.d.ts +1 -1
  261. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  262. package/dist/primitives/thread/ThreadRoot.js +1 -1
  263. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  264. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +1 -1
  265. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  266. package/dist/primitives/thread/ThreadSuggestion.d.ts +1 -1
  267. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  268. package/dist/primitives/thread/ThreadSuggestion.js +0 -2
  269. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  270. package/dist/primitives/thread/ThreadViewport.d.ts +1 -1
  271. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  272. package/dist/primitives/thread/ThreadViewportFooter.d.ts +1 -1
  273. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  274. package/dist/primitives/threadList/ThreadListNew.d.ts +1 -1
  275. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  276. package/dist/primitives/threadList/ThreadListRoot.d.ts +1 -1
  277. package/dist/primitives/threadList/ThreadListRoot.d.ts.map +1 -1
  278. package/dist/primitives/threadList/ThreadListRoot.js +1 -1
  279. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  280. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +1 -1
  281. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  282. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +1 -1
  283. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  284. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +1 -1
  285. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  286. package/dist/primitives/threadListItem/ThreadListItemRoot.js +1 -1
  287. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  288. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +1 -1
  289. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  290. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +1 -1
  291. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  292. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts +5 -2
  293. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts.map +1 -1
  294. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +3 -2
  295. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  296. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts +7 -4
  297. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts.map +1 -1
  298. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +2 -2
  299. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  300. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts +1 -1
  301. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts.map +1 -1
  302. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  303. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts +7 -4
  304. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts.map +1 -1
  305. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +2 -2
  306. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  307. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts +7 -4
  308. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts.map +1 -1
  309. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +2 -2
  310. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  311. package/dist/unstable/useMentionAdapter.d.ts +80 -0
  312. package/dist/unstable/useMentionAdapter.d.ts.map +1 -0
  313. package/dist/unstable/useMentionAdapter.js +129 -0
  314. package/dist/unstable/useMentionAdapter.js.map +1 -0
  315. package/dist/unstable/useSlashCommandAdapter.d.ts +32 -17
  316. package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
  317. package/dist/unstable/useSlashCommandAdapter.js +56 -32
  318. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  319. package/dist/utils/Primitive.d.ts +6 -4
  320. package/dist/utils/Primitive.d.ts.map +1 -1
  321. package/dist/utils/Primitive.js +15 -8
  322. package/dist/utils/Primitive.js.map +1 -1
  323. package/dist/utils/createActionButton.d.ts +1 -1
  324. package/dist/utils/createActionButton.d.ts.map +1 -1
  325. package/dist/utils/hooks/useManagedRef.d.ts +1 -1
  326. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  327. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  328. package/dist/utils/json/is-json.d.ts +1 -1
  329. package/dist/utils/json/is-json.d.ts.map +1 -1
  330. package/dist/utils/smooth/SmoothContext.d.ts +2 -2
  331. package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
  332. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  333. package/package.json +10 -10
  334. package/src/augmentations.ts +2 -0
  335. package/src/client/InMemoryThreadList.ts +1 -0
  336. package/src/client/SingleThreadList.ts +1 -0
  337. package/src/context/providers/MessageProvider.tsx +1 -1
  338. package/src/context/providers/ThreadViewportProvider.tsx +1 -1
  339. package/src/context/react/ThreadViewportContext.ts +3 -3
  340. package/src/context/react/utils/createContextHook.ts +1 -1
  341. package/src/context/react/utils/createContextStoreHook.ts +2 -2
  342. package/src/context/react/utils/createStateHookForRuntime.ts +2 -1
  343. package/src/devtools/DevToolsHooks.ts +5 -1
  344. package/src/index.ts +27 -56
  345. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +3 -3
  346. package/src/legacy-runtime/cloud/auiV0.ts +6 -3
  347. package/src/legacy-runtime/cloud/useCloudThreadListRuntime.ts +1 -1
  348. package/src/legacy-runtime/hooks/AssistantContext.ts +1 -1
  349. package/src/legacy-runtime/hooks/AttachmentContext.ts +1 -1
  350. package/src/legacy-runtime/hooks/ComposerContext.ts +1 -1
  351. package/src/legacy-runtime/hooks/MessageContext.ts +1 -1
  352. package/src/legacy-runtime/hooks/MessagePartContext.ts +1 -1
  353. package/src/legacy-runtime/hooks/ThreadContext.ts +1 -1
  354. package/src/legacy-runtime/hooks/ThreadListItemContext.ts +1 -1
  355. package/src/legacy-runtime/runtime-cores/assistant-transport/commandQueue.ts +1 -1
  356. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +2 -2
  357. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +20 -4
  358. package/src/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.test.ts +8 -2
  359. package/src/model-context/frame/useAssistantFrameHost.ts +1 -1
  360. package/src/model-context/makeAssistantVisible.tsx +3 -3
  361. package/src/primitives/actionBar/ActionBarCopy.tsx +1 -1
  362. package/src/primitives/actionBar/ActionBarEdit.ts +2 -2
  363. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +1 -1
  364. package/src/primitives/actionBar/ActionBarFeedbackNegative.tsx +1 -1
  365. package/src/primitives/actionBar/ActionBarFeedbackPositive.tsx +1 -1
  366. package/src/primitives/actionBar/ActionBarReload.ts +2 -2
  367. package/src/primitives/actionBar/ActionBarRoot.tsx +1 -1
  368. package/src/primitives/actionBar/ActionBarSpeak.ts +2 -2
  369. package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +1 -1
  370. package/src/primitives/actionBarMore/ActionBarMoreContent.tsx +10 -4
  371. package/src/primitives/actionBarMore/ActionBarMoreItem.tsx +7 -7
  372. package/src/primitives/actionBarMore/ActionBarMoreRoot.tsx +2 -2
  373. package/src/primitives/actionBarMore/ActionBarMoreSeparator.tsx +7 -5
  374. package/src/primitives/actionBarMore/ActionBarMoreTrigger.tsx +7 -7
  375. package/src/primitives/assistantModal/AssistantModalAnchor.tsx +6 -2
  376. package/src/primitives/assistantModal/AssistantModalContent.tsx +6 -2
  377. package/src/primitives/assistantModal/AssistantModalRoot.tsx +2 -2
  378. package/src/primitives/assistantModal/AssistantModalTrigger.tsx +6 -2
  379. package/src/primitives/attachment/AttachmentRemove.ts +2 -2
  380. package/src/primitives/attachment/AttachmentRoot.tsx +5 -1
  381. package/src/primitives/attachment/AttachmentThumb.tsx +5 -1
  382. package/src/primitives/branchPicker/BranchPickerNext.ts +2 -2
  383. package/src/primitives/branchPicker/BranchPickerPrevious.ts +2 -2
  384. package/src/primitives/branchPicker/BranchPickerRoot.tsx +5 -1
  385. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +2 -2
  386. package/src/primitives/chainOfThought/ChainOfThoughtRoot.tsx +5 -1
  387. package/src/primitives/composer/ComposerAddAttachment.ts +2 -2
  388. package/src/primitives/composer/ComposerAttachmentDropzone.test.tsx +125 -0
  389. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +11 -8
  390. package/src/primitives/composer/ComposerCancel.ts +2 -2
  391. package/src/primitives/composer/ComposerDictationTranscript.tsx +5 -1
  392. package/src/primitives/composer/ComposerInput.tsx +33 -1
  393. package/src/primitives/composer/ComposerInputPluginContext.tsx +37 -24
  394. package/src/primitives/composer/ComposerRoot.tsx +1 -1
  395. package/src/primitives/composer/ComposerSend.ts +2 -2
  396. package/src/primitives/composer/trigger/TriggerPopover.tsx +207 -0
  397. package/src/primitives/composer/trigger/TriggerPopoverAction.tsx +61 -0
  398. package/src/primitives/composer/trigger/TriggerPopoverBack.tsx +4 -3
  399. package/src/primitives/composer/trigger/TriggerPopoverCategories.tsx +14 -17
  400. package/src/primitives/composer/trigger/TriggerPopoverDirective.tsx +57 -0
  401. package/src/primitives/composer/trigger/TriggerPopoverItems.tsx +44 -40
  402. package/src/primitives/composer/trigger/TriggerPopoverResource.ts +76 -315
  403. package/src/primitives/composer/trigger/TriggerPopoverRootContext.tsx +212 -0
  404. package/src/primitives/composer/trigger/detectTrigger.test.ts +36 -0
  405. package/src/primitives/composer/trigger/detectTrigger.ts +1 -1
  406. package/src/primitives/composer/trigger/index.ts +21 -5
  407. package/src/primitives/composer/trigger/triggerDetectionResource.ts +43 -0
  408. package/src/primitives/composer/trigger/triggerKeyboardResource.ts +151 -0
  409. package/src/primitives/composer/trigger/triggerNavigationResource.ts +145 -0
  410. package/src/primitives/composer/trigger/triggerSelectionResource.ts +122 -0
  411. package/src/primitives/composer.ts +8 -18
  412. package/src/primitives/dropdownMenuRenderPrimitives.test.tsx +64 -0
  413. package/src/primitives/dropdownMenuRenderPrimitives.ts +15 -0
  414. package/src/primitives/error/ErrorMessage.tsx +5 -1
  415. package/src/primitives/error/ErrorRoot.tsx +5 -1
  416. package/src/primitives/message/MessageError.ts +1 -1
  417. package/src/primitives/message/MessageIf.ts +1 -1
  418. package/src/primitives/message/MessagePartsGrouped.tsx +1 -1
  419. package/src/primitives/message/MessageRoot.tsx +1 -1
  420. package/src/primitives/messagePart/MessagePartImage.tsx +6 -1
  421. package/src/primitives/messagePart/MessagePartInProgress.ts +1 -1
  422. package/src/primitives/messagePart/MessagePartText.tsx +3 -3
  423. package/src/primitives/queueItem/QueueItemRemove.ts +2 -2
  424. package/src/primitives/queueItem/QueueItemSteer.ts +2 -2
  425. package/src/primitives/suggestion/SuggestionDescription.tsx +5 -1
  426. package/src/primitives/suggestion/SuggestionTitle.tsx +5 -1
  427. package/src/primitives/suggestion/SuggestionTrigger.ts +2 -2
  428. package/src/primitives/thread/ThreadRoot.tsx +5 -1
  429. package/src/primitives/thread/ThreadScrollToBottom.ts +2 -2
  430. package/src/primitives/thread/ThreadSuggestion.ts +2 -4
  431. package/src/primitives/thread/ThreadViewport.tsx +1 -1
  432. package/src/primitives/thread/ThreadViewportFooter.tsx +1 -1
  433. package/src/primitives/threadList/ThreadListNew.tsx +1 -1
  434. package/src/primitives/threadList/ThreadListRoot.tsx +5 -1
  435. package/src/primitives/threadListItem/ThreadListItemArchive.ts +2 -2
  436. package/src/primitives/threadListItem/ThreadListItemDelete.ts +2 -2
  437. package/src/primitives/threadListItem/ThreadListItemRoot.tsx +5 -1
  438. package/src/primitives/threadListItem/ThreadListItemTrigger.ts +2 -2
  439. package/src/primitives/threadListItem/ThreadListItemUnarchive.ts +2 -2
  440. package/src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx +10 -4
  441. package/src/primitives/threadListItemMore/ThreadListItemMoreItem.tsx +7 -7
  442. package/src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx +2 -2
  443. package/src/primitives/threadListItemMore/ThreadListItemMoreSeparator.tsx +7 -5
  444. package/src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx +7 -7
  445. package/src/tests/BaseComposerRuntimeCore.test.ts +143 -0
  446. package/src/tests/DataRenderers.test.ts +174 -41
  447. package/src/tests/MessageParts.loading.test.tsx +104 -0
  448. package/src/tests/RemoteThreadListRuntime.deferredProvider.test.tsx +79 -0
  449. package/src/unstable/useMentionAdapter.ts +220 -0
  450. package/src/unstable/useSlashCommandAdapter.ts +79 -50
  451. package/src/utils/Primitive.test.tsx +7 -1
  452. package/src/utils/Primitive.tsx +49 -16
  453. package/src/utils/createActionButton.tsx +3 -3
  454. package/src/utils/hooks/useManagedRef.ts +2 -2
  455. package/src/utils/json/is-json.ts +1 -1
  456. package/src/utils/smooth/SmoothContext.tsx +5 -5
  457. package/dist/primitives/composer/mention/ComposerMentionContext.d.ts +0 -25
  458. package/dist/primitives/composer/mention/ComposerMentionContext.d.ts.map +0 -1
  459. package/dist/primitives/composer/mention/ComposerMentionContext.js +0 -74
  460. package/dist/primitives/composer/mention/ComposerMentionContext.js.map +0 -1
  461. package/dist/primitives/composer/mention/index.d.ts +0 -6
  462. package/dist/primitives/composer/mention/index.d.ts.map +0 -1
  463. package/dist/primitives/composer/mention/index.js +0 -8
  464. package/dist/primitives/composer/mention/index.js.map +0 -1
  465. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.d.ts +0 -36
  466. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.d.ts.map +0 -1
  467. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.js +0 -36
  468. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.js.map +0 -1
  469. package/dist/primitives/composer/slash-command/index.d.ts +0 -2
  470. package/dist/primitives/composer/slash-command/index.d.ts.map +0 -1
  471. package/dist/primitives/composer/slash-command/index.js +0 -2
  472. package/dist/primitives/composer/slash-command/index.js.map +0 -1
  473. package/dist/primitives/composer/trigger/TriggerPopoverContext.d.ts +0 -37
  474. package/dist/primitives/composer/trigger/TriggerPopoverContext.d.ts.map +0 -1
  475. package/dist/primitives/composer/trigger/TriggerPopoverContext.js +0 -70
  476. package/dist/primitives/composer/trigger/TriggerPopoverContext.js.map +0 -1
  477. package/dist/primitives/composer/trigger/TriggerPopoverPopover.d.ts +0 -26
  478. package/dist/primitives/composer/trigger/TriggerPopoverPopover.d.ts.map +0 -1
  479. package/dist/primitives/composer/trigger/TriggerPopoverPopover.js +0 -28
  480. package/dist/primitives/composer/trigger/TriggerPopoverPopover.js.map +0 -1
  481. package/dist/unstable/useToolMentionAdapter.d.ts +0 -42
  482. package/dist/unstable/useToolMentionAdapter.d.ts.map +0 -1
  483. package/dist/unstable/useToolMentionAdapter.js +0 -65
  484. package/dist/unstable/useToolMentionAdapter.js.map +0 -1
  485. package/src/primitives/composer/mention/ComposerMentionContext.tsx +0 -175
  486. package/src/primitives/composer/mention/index.ts +0 -19
  487. package/src/primitives/composer/slash-command/ComposerSlashCommandRoot.tsx +0 -76
  488. package/src/primitives/composer/slash-command/index.ts +0 -1
  489. package/src/primitives/composer/trigger/TriggerPopoverContext.tsx +0 -129
  490. package/src/primitives/composer/trigger/TriggerPopoverPopover.tsx +0 -51
  491. package/src/unstable/useToolMentionAdapter.ts +0 -114
@@ -1,52 +1,65 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import type { DataMessagePartComponent, DataRenderersState } from "../types";
3
-
4
- /**
5
- * Tests for the DataRenderers state management logic.
6
- *
7
- * Since the DataRenderers resource relies on @assistant-ui/tap's resource system
8
- * (which requires fiber infrastructure), we test the core state logic directly.
9
- */
10
- describe("DataRenderers state logic", () => {
11
- // Replicate the state management logic from DataRenderers.ts
12
- const createState = (): {
13
- state: DataRenderersState;
14
- setDataUI: (name: string, render: DataMessagePartComponent) => () => void;
15
- } => {
16
- let state: DataRenderersState = { renderers: {} };
17
-
18
- const setDataUI = (name: string, render: DataMessagePartComponent) => {
2
+ import type {
3
+ DataMessagePartComponent,
4
+ DataRenderersState,
5
+ } from "@assistant-ui/core/react";
6
+
7
+ // The resource in DataRenderers.ts requires fiber infrastructure, so these
8
+ // tests replicate the reducer directly and exercise it in isolation.
9
+
10
+ type StateHarness = {
11
+ state: DataRenderersState;
12
+ setDataUI: (name: string, render: DataMessagePartComponent) => () => void;
13
+ setFallbackDataUI: (render: DataMessagePartComponent) => () => void;
14
+ };
15
+
16
+ const createState = (): StateHarness => {
17
+ let state: DataRenderersState = { renderers: {}, fallbacks: [] };
18
+
19
+ const setDataUI = (name: string, render: DataMessagePartComponent) => {
20
+ state = {
21
+ ...state,
22
+ renderers: {
23
+ ...state.renderers,
24
+ [name]: [...(state.renderers[name] ?? []), render],
25
+ },
26
+ };
27
+ return () => {
19
28
  state = {
20
29
  ...state,
21
30
  renderers: {
22
31
  ...state.renderers,
23
- [name]: [...(state.renderers[name] ?? []), render],
32
+ [name]: state.renderers[name]?.filter((r) => r !== render) ?? [],
24
33
  },
25
34
  };
35
+ };
36
+ };
26
37
 
27
- return () => {
28
- state = {
29
- ...state,
30
- renderers: {
31
- ...state.renderers,
32
- [name]: state.renderers[name]?.filter((r) => r !== render) ?? [],
33
- },
34
- };
38
+ const setFallbackDataUI = (render: DataMessagePartComponent) => {
39
+ state = { ...state, fallbacks: [...state.fallbacks, render] };
40
+ return () => {
41
+ state = {
42
+ ...state,
43
+ fallbacks: state.fallbacks.filter((r) => r !== render),
35
44
  };
36
45
  };
46
+ };
37
47
 
38
- return {
39
- get state() {
40
- return state;
41
- },
42
- setDataUI,
43
- };
48
+ return {
49
+ get state() {
50
+ return state;
51
+ },
52
+ setDataUI,
53
+ setFallbackDataUI,
44
54
  };
55
+ };
45
56
 
57
+ describe("DataRenderers state logic", () => {
46
58
  describe("initial state", () => {
47
- it("should start with empty renderers", () => {
59
+ it("should start with empty renderers and fallbacks", () => {
48
60
  const { state } = createState();
49
61
  expect(state.renderers).toEqual({});
62
+ expect(state.fallbacks).toEqual([]);
50
63
  });
51
64
  });
52
65
 
@@ -129,8 +142,78 @@ describe("DataRenderers state logic", () => {
129
142
  });
130
143
  });
131
144
 
145
+ describe("DataRenderers fallback state logic", () => {
146
+ it("should register a fallback renderer", () => {
147
+ const s = createState();
148
+ const Fallback = (() => null) as unknown as DataMessagePartComponent;
149
+
150
+ s.setFallbackDataUI(Fallback);
151
+
152
+ expect(s.state.fallbacks).toHaveLength(1);
153
+ expect(s.state.fallbacks[0]).toBe(Fallback);
154
+ });
155
+
156
+ it("should unregister the fallback renderer on cleanup", () => {
157
+ const s = createState();
158
+ const Fallback = (() => null) as unknown as DataMessagePartComponent;
159
+
160
+ const unsub = s.setFallbackDataUI(Fallback);
161
+ expect(s.state.fallbacks).toHaveLength(1);
162
+
163
+ unsub();
164
+ expect(s.state.fallbacks).toHaveLength(0);
165
+ });
166
+
167
+ it("should stack fallbacks; the first registered takes priority", () => {
168
+ const s = createState();
169
+ const Fallback1 = (() => null) as unknown as DataMessagePartComponent;
170
+ const Fallback2 = (() => null) as unknown as DataMessagePartComponent;
171
+
172
+ s.setFallbackDataUI(Fallback1);
173
+ s.setFallbackDataUI(Fallback2);
174
+
175
+ expect(s.state.fallbacks).toEqual([Fallback1, Fallback2]);
176
+ });
177
+
178
+ it("should only unregister the specific fallback on cleanup", () => {
179
+ const s = createState();
180
+ const Fallback1 = (() => null) as unknown as DataMessagePartComponent;
181
+ const Fallback2 = (() => null) as unknown as DataMessagePartComponent;
182
+
183
+ const unsub1 = s.setFallbackDataUI(Fallback1);
184
+ s.setFallbackDataUI(Fallback2);
185
+
186
+ unsub1();
187
+ expect(s.state.fallbacks).toEqual([Fallback2]);
188
+ });
189
+
190
+ it("should restore the previous fallback when the active one unmounts", () => {
191
+ const s = createState();
192
+ const Fallback1 = (() => null) as unknown as DataMessagePartComponent;
193
+ const Fallback2 = (() => null) as unknown as DataMessagePartComponent;
194
+
195
+ s.setFallbackDataUI(Fallback1);
196
+ const unsub2 = s.setFallbackDataUI(Fallback2);
197
+
198
+ unsub2();
199
+ expect(s.state.fallbacks).toEqual([Fallback1]);
200
+ });
201
+
202
+ it("should not affect named renderers when setting fallback", () => {
203
+ const s = createState();
204
+ const Named = (() => null) as unknown as DataMessagePartComponent;
205
+ const Fallback = (() => null) as unknown as DataMessagePartComponent;
206
+
207
+ s.setDataUI("chart", Named);
208
+ s.setFallbackDataUI(Fallback);
209
+
210
+ expect(s.state.renderers["chart"]).toHaveLength(1);
211
+ expect(s.state.renderers["chart"]![0]).toBe(Named);
212
+ expect(s.state.fallbacks[0]).toBe(Fallback);
213
+ });
214
+ });
215
+
132
216
  describe("Data part component resolution", () => {
133
- // Replicate the component lookup logic from MessageParts.tsx
134
217
  const resolveDataComponent = (
135
218
  partName: string,
136
219
  inlineConfig?: {
@@ -138,16 +221,13 @@ describe("Data part component resolution", () => {
138
221
  Fallback?: DataMessagePartComponent;
139
222
  },
140
223
  globalRenderers?: Record<string, DataMessagePartComponent[]>,
224
+ globalFallbacks?: DataMessagePartComponent[],
141
225
  ): DataMessagePartComponent | undefined => {
226
+ const named = globalRenderers?.[partName]?.[0];
227
+ if (named) return named;
142
228
  const inlineFallback =
143
229
  inlineConfig?.by_name?.[partName] ?? inlineConfig?.Fallback;
144
- const globalRenderer = globalRenderers?.[partName];
145
-
146
- // Global takes priority (first element), then inline fallback
147
- if (globalRenderer && globalRenderer.length > 0) {
148
- return globalRenderer[0] ?? inlineFallback;
149
- }
150
- return inlineFallback;
230
+ return globalFallbacks?.[0] ?? inlineFallback;
151
231
  };
152
232
 
153
233
  it("should return undefined when no config provided", () => {
@@ -219,4 +299,57 @@ describe("Data part component resolution", () => {
219
299
  );
220
300
  expect(result).toBe(Fallback);
221
301
  });
302
+
303
+ // --- Global fallback stack resolution ---
304
+
305
+ it("should use global fallback when no name-specific renderer exists", () => {
306
+ const GlobalFallback = (() => null) as unknown as DataMessagePartComponent;
307
+
308
+ const result = resolveDataComponent("unknown-widget", undefined, {}, [
309
+ GlobalFallback,
310
+ ]);
311
+ expect(result).toBe(GlobalFallback);
312
+ });
313
+
314
+ it("should prefer global name-match over global fallback", () => {
315
+ const NamedComponent = (() => null) as unknown as DataMessagePartComponent;
316
+ const GlobalFallback = (() => null) as unknown as DataMessagePartComponent;
317
+
318
+ const result = resolveDataComponent(
319
+ "chart",
320
+ undefined,
321
+ { chart: [NamedComponent] },
322
+ [GlobalFallback],
323
+ );
324
+ expect(result).toBe(NamedComponent);
325
+ });
326
+
327
+ it("should prefer the first global fallback over inline Fallback", () => {
328
+ const InlineFallback = (() => null) as unknown as DataMessagePartComponent;
329
+ const GlobalFallback = (() => null) as unknown as DataMessagePartComponent;
330
+
331
+ const result = resolveDataComponent(
332
+ "unknown",
333
+ { Fallback: InlineFallback },
334
+ {},
335
+ [GlobalFallback],
336
+ );
337
+ expect(result).toBe(GlobalFallback);
338
+ });
339
+
340
+ it("should pick the first registered when multiple fallbacks are stacked", () => {
341
+ const First = (() => null) as unknown as DataMessagePartComponent;
342
+ const Second = (() => null) as unknown as DataMessagePartComponent;
343
+
344
+ const result = resolveDataComponent("anything", undefined, {}, [
345
+ First,
346
+ Second,
347
+ ]);
348
+ expect(result).toBe(First);
349
+ });
350
+
351
+ it("should return undefined when no fallbacks of any kind exist", () => {
352
+ const result = resolveDataComponent("unknown", undefined, {}, []);
353
+ expect(result).toBeUndefined();
354
+ });
222
355
  });
@@ -0,0 +1,104 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { render, screen, waitFor } from "@testing-library/react";
4
+ import type { FC, PropsWithChildren } from "react";
5
+ import { describe, expect, it } from "vitest";
6
+ import { AssistantRuntimeProvider } from "../context";
7
+ import * as MessagePartPrimitive from "../primitives/messagePart";
8
+ import * as MessagePrimitive from "../primitives/message";
9
+ import * as ThreadPrimitive from "../primitives/thread";
10
+ import { useLocalRuntime } from "../legacy-runtime/runtime-cores/local/useLocalRuntime";
11
+ import type { ChatModelAdapter, ThreadMessageLike } from "../index";
12
+
13
+ const noOpAdapter: ChatModelAdapter = {
14
+ async *run() {},
15
+ };
16
+
17
+ const initialMessages: ThreadMessageLike[] = [
18
+ {
19
+ role: "assistant",
20
+ content: [],
21
+ status: { type: "running" },
22
+ },
23
+ ];
24
+
25
+ const completeInitialMessages: ThreadMessageLike[] = [
26
+ {
27
+ role: "assistant",
28
+ content: [],
29
+ status: { type: "complete", reason: "stop" },
30
+ },
31
+ ];
32
+
33
+ const RunningText: FC = () => {
34
+ return (
35
+ <p>
36
+ <MessagePartPrimitive.Text />
37
+ <MessagePartPrimitive.InProgress>
38
+ <span data-testid="loading-dot">dot</span>
39
+ </MessagePartPrimitive.InProgress>
40
+ </p>
41
+ );
42
+ };
43
+
44
+ const ComponentsMessage: FC = () => {
45
+ return <MessagePrimitive.Parts components={{ Text: RunningText }} />;
46
+ };
47
+
48
+ const ChildrenMessage: FC = () => {
49
+ return (
50
+ <MessagePrimitive.Parts>
51
+ {({ part }) => {
52
+ if (part.type === "text") return <RunningText />;
53
+ return null;
54
+ }}
55
+ </MessagePrimitive.Parts>
56
+ );
57
+ };
58
+
59
+ const RuntimeProvider: FC<
60
+ PropsWithChildren<{ messages?: ThreadMessageLike[] }>
61
+ > = ({ children, messages = initialMessages }) => {
62
+ const runtime = useLocalRuntime(noOpAdapter, {
63
+ initialMessages: messages,
64
+ });
65
+ return (
66
+ <AssistantRuntimeProvider runtime={runtime}>
67
+ {children}
68
+ </AssistantRuntimeProvider>
69
+ );
70
+ };
71
+
72
+ const renderThread = (MessageComponent: FC, messages?: ThreadMessageLike[]) => {
73
+ render(
74
+ <RuntimeProvider messages={messages}>
75
+ <ThreadPrimitive.Messages components={{ Message: MessageComponent }} />
76
+ </RuntimeProvider>,
77
+ );
78
+ };
79
+
80
+ describe("MessagePrimitive.Parts loading state", () => {
81
+ it("renders the loading indicator for the components API when assistant parts are empty", async () => {
82
+ renderThread(ComponentsMessage);
83
+
84
+ await waitFor(() => {
85
+ expect(screen.getByTestId("loading-dot")).toBeTruthy();
86
+ });
87
+ });
88
+
89
+ it("renders the loading indicator for the children API when assistant parts are empty", async () => {
90
+ renderThread(ChildrenMessage);
91
+
92
+ await waitFor(() => {
93
+ expect(screen.getByTestId("loading-dot")).toBeTruthy();
94
+ });
95
+ });
96
+
97
+ it("does not render the loading indicator when assistant parts are empty but the message is complete", async () => {
98
+ renderThread(ChildrenMessage, completeInitialMessages);
99
+
100
+ await waitFor(() => {
101
+ expect(screen.queryByTestId("loading-dot")).toBeNull();
102
+ });
103
+ });
104
+ });
@@ -0,0 +1,79 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { render } from "@testing-library/react";
4
+ import { type FC, type PropsWithChildren, useState } from "react";
5
+ import { describe, expect, it } from "vitest";
6
+ import { useRemoteThreadListRuntime } from "@assistant-ui/core/react";
7
+ import { makeAdapter } from "@assistant-ui/core/tests/remote-thread-list-test-helpers";
8
+ import type { AssistantRuntime } from "@assistant-ui/core";
9
+ import { AssistantRuntimeProvider } from "../context";
10
+ import { useLocalRuntime } from "../legacy-runtime/runtime-cores/local/useLocalRuntime";
11
+ import { useAssistantRuntime } from "../legacy-runtime/hooks/AssistantContext";
12
+ import type { ChatModelAdapter, RemoteThreadListAdapter } from "../index";
13
+
14
+ const noOpAdapter: ChatModelAdapter = {
15
+ async *run() {},
16
+ };
17
+
18
+ const useTestRuntimeHook = () => useLocalRuntime(noOpAdapter);
19
+
20
+ const RuntimeProvider: FC<
21
+ PropsWithChildren<{ adapter: RemoteThreadListAdapter }>
22
+ > = ({ children, adapter }) => {
23
+ const runtime = useRemoteThreadListRuntime({
24
+ runtimeHook: useTestRuntimeHook,
25
+ adapter,
26
+ });
27
+ return (
28
+ <AssistantRuntimeProvider runtime={runtime}>
29
+ {children}
30
+ </AssistantRuntimeProvider>
31
+ );
32
+ };
33
+
34
+ const RuntimeCapture: FC<{
35
+ runtimeRef: { current: AssistantRuntime | null };
36
+ }> = ({ runtimeRef }) => {
37
+ const runtime = useAssistantRuntime();
38
+ runtimeRef.current = runtime;
39
+ return null;
40
+ };
41
+
42
+ // regression for #3678: deferred unstable_Provider must not strand the runtime binder.
43
+ describe("useRemoteThreadListRuntime with a deferred unstable_Provider", () => {
44
+ it("composer.setText does not throw EMPTY_THREAD_ERROR when unstable_Provider defers children", () => {
45
+ const Provider: FC<PropsWithChildren> = ({ children }) => {
46
+ const [ready] = useState(false);
47
+ if (!ready) return null;
48
+ return <>{children}</>;
49
+ };
50
+ const adapter = makeAdapter({ unstable_Provider: Provider });
51
+
52
+ const runtimeRef: { current: AssistantRuntime | null } = { current: null };
53
+ render(
54
+ <RuntimeProvider adapter={adapter}>
55
+ <RuntimeCapture runtimeRef={runtimeRef} />
56
+ </RuntimeProvider>,
57
+ );
58
+
59
+ const runtime = runtimeRef.current;
60
+ expect(runtime).toBeTruthy();
61
+ expect(() => runtime!.thread.composer.setText("hello")).not.toThrow();
62
+ });
63
+
64
+ it("composer.setText still works when unstable_Provider renders children unconditionally", () => {
65
+ const Provider: FC<PropsWithChildren> = ({ children }) => <>{children}</>;
66
+ const adapter = makeAdapter({ unstable_Provider: Provider });
67
+
68
+ const runtimeRef: { current: AssistantRuntime | null } = { current: null };
69
+ render(
70
+ <RuntimeProvider adapter={adapter}>
71
+ <RuntimeCapture runtimeRef={runtimeRef} />
72
+ </RuntimeProvider>,
73
+ );
74
+
75
+ const runtime = runtimeRef.current;
76
+ expect(runtime).toBeTruthy();
77
+ expect(() => runtime!.thread.composer.setText("hello")).not.toThrow();
78
+ });
79
+ });
@@ -0,0 +1,220 @@
1
+ "use client";
2
+
3
+ import { useMemo, type FC } from "react";
4
+ import { useAui } from "@assistant-ui/store";
5
+ import type {
6
+ Unstable_DirectiveFormatter,
7
+ Unstable_TriggerAdapter,
8
+ Unstable_TriggerCategory,
9
+ Unstable_TriggerItem,
10
+ } from "@assistant-ui/core";
11
+ import { unstable_defaultDirectiveFormatter } from "@assistant-ui/core";
12
+ import type { ReadonlyJSONObject } from "assistant-stream/utils";
13
+
14
+ /** Icon component shape consumed by `ComposerTriggerPopover`'s `iconMap`. */
15
+ export type Unstable_IconComponent = FC<{ className?: string }>;
16
+
17
+ export type Unstable_Mention = {
18
+ readonly id: string;
19
+ readonly type: string;
20
+ readonly label: string;
21
+ readonly description?: string | undefined;
22
+ /** Shortcut for `metadata.icon`; merged with `metadata` if both are given. */
23
+ readonly icon?: string | undefined;
24
+ readonly metadata?: ReadonlyJSONObject | undefined;
25
+ };
26
+
27
+ export type Unstable_MentionCategory = {
28
+ readonly id: string;
29
+ readonly label: string;
30
+ readonly items: readonly Unstable_Mention[];
31
+ };
32
+
33
+ export type Unstable_ModelContextToolsOptions = {
34
+ /** Wrap tools in a dedicated category (drill-down mode). */
35
+ readonly category?: { readonly id: string; readonly label: string };
36
+ /** Format tool name for display. */
37
+ readonly formatLabel?: (toolName: string) => string;
38
+ /** Default icon key for each tool. */
39
+ readonly icon?: string;
40
+ };
41
+
42
+ export type Unstable_UseMentionAdapterOptions = {
43
+ /** Flat mention list. Ignored when `categories` is set. */
44
+ readonly items?: readonly Unstable_Mention[];
45
+ /** Categorized mentions for drill-down navigation. */
46
+ readonly categories?: readonly Unstable_MentionCategory[];
47
+ /**
48
+ * How tools registered via `useAssistantTool` integrate.
49
+ * - `false`: exclude.
50
+ * - `true`: include (default when no `items`/`categories`; as a category
51
+ * if `categories` is set, flat otherwise).
52
+ * - object: explicit config.
53
+ *
54
+ * Omitted → defaults to `true` iff neither `items` nor `categories`.
55
+ */
56
+ readonly includeModelContextTools?:
57
+ | boolean
58
+ | Unstable_ModelContextToolsOptions;
59
+ /** Directive formatter. @default unstable_defaultDirectiveFormatter */
60
+ readonly formatter?: Unstable_DirectiveFormatter;
61
+ /** Fires after an item is inserted into the composer. */
62
+ readonly onInserted?: (item: Unstable_TriggerItem) => void;
63
+ /** Maps `metadata.icon` / `category.id` string keys to React components. */
64
+ readonly iconMap?: Record<string, Unstable_IconComponent>;
65
+ /** Fallback icon when no entry in `iconMap` matches. */
66
+ readonly fallbackIcon?: Unstable_IconComponent;
67
+ };
68
+
69
+ export type Unstable_MentionDirective = {
70
+ readonly formatter: Unstable_DirectiveFormatter;
71
+ readonly onInserted?: ((item: Unstable_TriggerItem) => void) | undefined;
72
+ };
73
+
74
+ /**
75
+ * @deprecated Under active development and might change without notice.
76
+ *
77
+ * Creates a spreadable `{ adapter, directive }` bundle for `@` mentions.
78
+ * Supports tools registered via `useAssistantTool`, explicit items, or both —
79
+ * flat or categorized.
80
+ *
81
+ * @example
82
+ * ```tsx
83
+ * const mention = unstable_useMentionAdapter();
84
+ * <ComposerTriggerPopover char="@" {...mention} />
85
+ * ```
86
+ */
87
+ export function unstable_useMentionAdapter(
88
+ options?: Unstable_UseMentionAdapterOptions,
89
+ ): {
90
+ adapter: Unstable_TriggerAdapter;
91
+ directive: Unstable_MentionDirective;
92
+ iconMap?: Record<string, Unstable_IconComponent>;
93
+ fallbackIcon?: Unstable_IconComponent;
94
+ } {
95
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
96
+ const aui = useAui();
97
+
98
+ const items = options?.items;
99
+ const categories = options?.categories;
100
+ const includeTools =
101
+ options?.includeModelContextTools ?? (!items && !categories);
102
+ const toolsConfig =
103
+ typeof includeTools === "object" ? includeTools : undefined;
104
+ const wantsTools = includeTools !== false;
105
+ const formatter = options?.formatter;
106
+ const onInserted = options?.onInserted;
107
+
108
+ // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage
109
+ const adapter = useMemo<Unstable_TriggerAdapter>(() => {
110
+ const getModelContextTools = (): Unstable_TriggerItem[] => {
111
+ if (!wantsTools) return [];
112
+ const ctx = aui.thread().getModelContext();
113
+ const tools = ctx.tools;
114
+ if (!tools) return [];
115
+ const formatLabel = toolsConfig?.formatLabel;
116
+ const defaultIcon = toolsConfig?.icon;
117
+ return Object.entries(tools).map(([name, tool]) =>
118
+ toTriggerItem({
119
+ id: name,
120
+ type: "tool",
121
+ label: formatLabel ? formatLabel(name) : name,
122
+ description: tool.description ?? undefined,
123
+ icon: defaultIcon,
124
+ }),
125
+ );
126
+ };
127
+
128
+ // Categorized: drill-down mode
129
+ if (categories && categories.length > 0) {
130
+ const groups = categories.map((cat) => ({
131
+ id: cat.id,
132
+ label: cat.label,
133
+ items: cat.items.map(toTriggerItem),
134
+ }));
135
+
136
+ let toolCategory: {
137
+ id: string;
138
+ label: string;
139
+ items: Unstable_TriggerItem[];
140
+ } | null = null;
141
+ if (wantsTools) {
142
+ const toolItems = getModelContextTools();
143
+ if (toolItems.length > 0) {
144
+ toolCategory = {
145
+ id: toolsConfig?.category?.id ?? "tools",
146
+ label: toolsConfig?.category?.label ?? "Tools",
147
+ items: toolItems,
148
+ };
149
+ }
150
+ }
151
+ const allGroups = toolCategory ? [...groups, toolCategory] : groups;
152
+
153
+ return {
154
+ categories: () => allGroups.map(({ id, label }) => ({ id, label })),
155
+ categoryItems: (id) => allGroups.find((g) => g.id === id)?.items ?? [],
156
+ search: (query) => {
157
+ const lower = query.toLowerCase();
158
+ return allGroups
159
+ .flatMap((g) => g.items)
160
+ .filter((item) => matchesQuery(item, lower));
161
+ },
162
+ };
163
+ }
164
+
165
+ // Flat: items + (optionally) tools, all in one search pool
166
+ const flatItems = (items ?? []).map(toTriggerItem);
167
+ const getFlatPool = (): Unstable_TriggerItem[] => {
168
+ if (!wantsTools) return flatItems;
169
+ const toolItems = getModelContextTools();
170
+ // Dedupe by id — explicit items win.
171
+ const seen = new Set(flatItems.map((i) => i.id));
172
+ return [...flatItems, ...toolItems.filter((t) => !seen.has(t.id))];
173
+ };
174
+
175
+ return {
176
+ categories: (): readonly Unstable_TriggerCategory[] => [],
177
+ categoryItems: () => [],
178
+ search: (query) => {
179
+ const lower = query.toLowerCase();
180
+ return getFlatPool().filter((item) => matchesQuery(item, lower));
181
+ },
182
+ };
183
+ }, [aui, items, categories, wantsTools, toolsConfig]);
184
+
185
+ // biome-ignore lint/correctness/useHookAtTopLevel: `unstable_` prefix not recognized as hook
186
+ const directive = useMemo<Unstable_MentionDirective>(
187
+ () => ({
188
+ formatter: formatter ?? unstable_defaultDirectiveFormatter,
189
+ ...(onInserted ? { onInserted } : {}),
190
+ }),
191
+ [formatter, onInserted],
192
+ );
193
+
194
+ return {
195
+ adapter,
196
+ directive,
197
+ ...(options?.iconMap ? { iconMap: options.iconMap } : {}),
198
+ ...(options?.fallbackIcon ? { fallbackIcon: options.fallbackIcon } : {}),
199
+ };
200
+ }
201
+
202
+ function toTriggerItem(m: Unstable_Mention): Unstable_TriggerItem {
203
+ const metadata =
204
+ m.icon !== undefined ? { ...(m.metadata ?? {}), icon: m.icon } : m.metadata;
205
+ return {
206
+ id: m.id,
207
+ type: m.type,
208
+ label: m.label,
209
+ ...(m.description !== undefined ? { description: m.description } : {}),
210
+ ...(metadata !== undefined ? { metadata } : {}),
211
+ };
212
+ }
213
+
214
+ function matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {
215
+ if (!lower) return true;
216
+ if (item.id.toLowerCase().includes(lower)) return true;
217
+ if (item.label.toLowerCase().includes(lower)) return true;
218
+ if (item.description?.toLowerCase().includes(lower)) return true;
219
+ return false;
220
+ }