@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
@@ -0,0 +1,125 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+ import { act } from "react";
5
+ import { createRoot, type Root } from "react-dom/client";
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
+ import { ComposerPrimitiveAttachmentDropzone } from "./ComposerAttachmentDropzone";
8
+
9
+ const addAttachment = vi.fn<(file: File) => Promise<void>>();
10
+
11
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
12
+
13
+ vi.mock("@assistant-ui/store", async (importOriginal) => {
14
+ const actual = await importOriginal<typeof import("@assistant-ui/store")>();
15
+ return {
16
+ ...actual,
17
+ useAui: () => ({
18
+ composer: () => ({
19
+ addAttachment,
20
+ }),
21
+ }),
22
+ };
23
+ });
24
+
25
+ const createDropEvent = (files: File[]) => {
26
+ const event = new Event("drop", { bubbles: true, cancelable: true });
27
+ Object.defineProperty(event, "dataTransfer", {
28
+ value: { files },
29
+ configurable: true,
30
+ });
31
+ return event;
32
+ };
33
+
34
+ describe("ComposerPrimitiveAttachmentDropzone", () => {
35
+ let container: HTMLDivElement;
36
+ let root: Root;
37
+
38
+ beforeEach(async () => {
39
+ addAttachment.mockReset();
40
+ container = document.createElement("div");
41
+ document.body.appendChild(container);
42
+ root = createRoot(container);
43
+
44
+ await act(async () => {
45
+ root.render(
46
+ <ComposerPrimitiveAttachmentDropzone data-testid="dropzone">
47
+ <div>dropzone</div>
48
+ </ComposerPrimitiveAttachmentDropzone>,
49
+ );
50
+ });
51
+ });
52
+
53
+ afterEach(async () => {
54
+ await act(async () => {
55
+ root.unmount();
56
+ });
57
+ container.remove();
58
+ vi.restoreAllMocks();
59
+ });
60
+
61
+ it("starts all dropped attachments before awaiting completion", async () => {
62
+ const resolvers: Array<() => void> = [];
63
+ addAttachment.mockImplementation(
64
+ () =>
65
+ new Promise<void>((resolve) => {
66
+ resolvers.push(resolve);
67
+ }),
68
+ );
69
+
70
+ const dropzone = container.querySelector("[data-testid='dropzone']");
71
+ expect(dropzone).not.toBeNull();
72
+
73
+ const files = [
74
+ new File(["a"], "first.txt", { type: "text/plain" }),
75
+ new File(["b"], "second.txt", { type: "text/plain" }),
76
+ new File(["c"], "third.txt", { type: "text/plain" }),
77
+ ];
78
+
79
+ await act(async () => {
80
+ dropzone!.dispatchEvent(createDropEvent(files));
81
+ await Promise.resolve();
82
+ });
83
+
84
+ expect(addAttachment).toHaveBeenCalledTimes(3);
85
+ expect(addAttachment.mock.calls.map(([file]) => file.name)).toEqual([
86
+ "first.txt",
87
+ "second.txt",
88
+ "third.txt",
89
+ ]);
90
+
91
+ for (const resolve of resolvers) resolve();
92
+
93
+ await act(async () => {
94
+ await Promise.resolve();
95
+ });
96
+ });
97
+
98
+ it("continues processing other files when one attachment fails", async () => {
99
+ const error = new Error("upload failed");
100
+ const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
101
+
102
+ addAttachment
103
+ .mockRejectedValueOnce(error)
104
+ .mockResolvedValueOnce(undefined)
105
+ .mockResolvedValueOnce(undefined);
106
+
107
+ const dropzone = container.querySelector("[data-testid='dropzone']");
108
+ expect(dropzone).not.toBeNull();
109
+
110
+ const files = [
111
+ new File(["a"], "first.txt", { type: "text/plain" }),
112
+ new File(["b"], "second.txt", { type: "text/plain" }),
113
+ new File(["c"], "third.txt", { type: "text/plain" }),
114
+ ];
115
+
116
+ await act(async () => {
117
+ dropzone!.dispatchEvent(createDropEvent(files));
118
+ await Promise.resolve();
119
+ await Promise.resolve();
120
+ });
121
+
122
+ expect(addAttachment).toHaveBeenCalledTimes(3);
123
+ expect(errorSpy).toHaveBeenCalledWith("Failed to add attachment:", error);
124
+ });
125
+ });
@@ -11,7 +11,7 @@ import {
11
11
 
12
12
  import { composeEventHandlers } from "@radix-ui/primitive";
13
13
  import { Slot } from "radix-ui";
14
- import React from "react";
14
+ import type React from "react";
15
15
  import { useAui } from "@assistant-ui/store";
16
16
 
17
17
  export namespace ComposerPrimitiveAttachmentDropzone {
@@ -66,13 +66,16 @@ export const ComposerPrimitiveAttachmentDropzone = forwardRef<
66
66
  if (disabled) return;
67
67
  e.preventDefault();
68
68
  setIsDragging(false);
69
- for (const file of e.dataTransfer.files) {
70
- try {
71
- await aui.composer().addAttachment(file);
72
- } catch (error) {
73
- console.error("Failed to add attachment:", error);
74
- }
75
- }
69
+ const files = Array.from(e.dataTransfer.files);
70
+ await Promise.all(
71
+ files.map(async (file) => {
72
+ try {
73
+ await aui.composer().addAttachment(file);
74
+ } catch (error) {
75
+ console.error("Failed to add attachment:", error);
76
+ }
77
+ }),
78
+ );
76
79
  },
77
80
  [disabled, aui],
78
81
  );
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
 
3
3
  import {
4
- ActionButtonElement,
5
- ActionButtonProps,
4
+ type ActionButtonElement,
5
+ type ActionButtonProps,
6
6
  createActionButton,
7
7
  } from "../../utils/createActionButton";
8
8
  import { useComposerCancel as useComposerCancelBehavior } from "@assistant-ui/core/react";
@@ -1,7 +1,11 @@
1
1
  "use client";
2
2
 
3
3
  import { Primitive } from "../../utils/Primitive";
4
- import { type ComponentRef, forwardRef, ComponentPropsWithoutRef } from "react";
4
+ import {
5
+ type ComponentRef,
6
+ forwardRef,
7
+ type ComponentPropsWithoutRef,
8
+ } from "react";
5
9
  import { useAuiState } from "@assistant-ui/store";
6
10
 
7
11
  export namespace ComposerPrimitiveDictationTranscript {
@@ -4,7 +4,7 @@ import { composeEventHandlers } from "@radix-ui/primitive";
4
4
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
5
5
  import { Slot } from "radix-ui";
6
6
  import {
7
- ClipboardEvent,
7
+ type ClipboardEvent,
8
8
  type KeyboardEvent,
9
9
  type ReactElement,
10
10
  type ReactNode,
@@ -157,6 +157,8 @@ export const ComposerPrimitiveInput = forwardRef<
157
157
  ) || disabledProp;
158
158
  const textareaRef = useRef<HTMLTextAreaElement>(null);
159
159
  const ref = useComposedRefs(forwardedRef, textareaRef);
160
+ // suppress text/cursor broadcasts during IME composition
161
+ const compositionRef = useRef(false);
160
162
 
161
163
  useEscapeKeydown((e) => {
162
164
  // Only handle ESC if it originated from within this input
@@ -295,6 +297,10 @@ export const ComposerPrimitiveInput = forwardRef<
295
297
  onChange,
296
298
  (e: React.ChangeEvent<HTMLTextAreaElement>) => {
297
299
  if (!aui.composer().getState().isEditing) return;
300
+ const isComposing =
301
+ (e.nativeEvent as { isComposing?: boolean }).isComposing === true ||
302
+ compositionRef.current;
303
+ if (isComposing) return;
298
304
  flushResourcesSync(() => {
299
305
  aui.composer().setText(e.target.value);
300
306
  });
@@ -307,9 +313,35 @@ export const ComposerPrimitiveInput = forwardRef<
307
313
  },
308
314
  ),
309
315
  onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),
316
+ onCompositionStart: composeEventHandlers(
317
+ (rest as { onCompositionStart?: React.CompositionEventHandler })
318
+ .onCompositionStart,
319
+ () => {
320
+ compositionRef.current = true;
321
+ },
322
+ ),
323
+ onCompositionEnd: composeEventHandlers(
324
+ (rest as { onCompositionEnd?: React.CompositionEventHandler })
325
+ .onCompositionEnd,
326
+ (e: React.CompositionEvent<HTMLTextAreaElement>) => {
327
+ compositionRef.current = false;
328
+ if (!aui.composer().getState().isEditing) return;
329
+ const target = e.target as HTMLTextAreaElement;
330
+ flushResourcesSync(() => {
331
+ aui.composer().setText(target.value);
332
+ });
333
+ const pos = target.selectionStart ?? target.value.length;
334
+ if (pluginRegistry) {
335
+ for (const plugin of pluginRegistry.getPlugins()) {
336
+ plugin.setCursorPosition(pos);
337
+ }
338
+ }
339
+ },
340
+ ),
310
341
  onSelect: composeEventHandlers(
311
342
  onSelect,
312
343
  (e: React.SyntheticEvent<HTMLTextAreaElement>) => {
344
+ if (compositionRef.current) return;
313
345
  const target = e.target as HTMLTextAreaElement;
314
346
  const pos = target.selectionStart ?? target.value.length;
315
347
  if (pluginRegistry) {
@@ -10,15 +10,10 @@ import {
10
10
  type FC,
11
11
  } from "react";
12
12
 
13
- // =============================================================================
14
- // Plugin interface — any trigger system (mention, slash command, emoji, etc.)
15
- // registers one of these with the input.
16
- // =============================================================================
17
-
18
13
  /**
19
14
  * A plugin that intercepts keyboard events and cursor changes in the composer
20
- * input. Used by trigger roots (MentionRoot, SlashCommandRoot, etc.) to handle
21
- * popover navigation without ComposerInput knowing about specific triggers.
15
+ * input. Used by trigger popover declarations to handle popover navigation
16
+ * without ComposerInput knowing about specific triggers.
22
17
  */
23
18
  export type ComposerInputPlugin = {
24
19
  /** Handle a key event. Return true if consumed (stops propagation to other plugins and default behavior). */
@@ -35,13 +30,21 @@ export type ComposerInputPlugin = {
35
30
  setCursorPosition(pos: number): void;
36
31
  };
37
32
 
38
- // =============================================================================
39
- // Registry mutable, ref-based. No re-renders on register/unregister because
40
- // plugins are read imperatively at event time.
41
- // =============================================================================
33
+ /** Options for registering a plugin. */
34
+ export type ComposerInputPluginRegisterOptions = {
35
+ /**
36
+ * Relative priority. Plugins with higher priority receive events first.
37
+ * @default 0
38
+ */
39
+ priority?: number;
40
+ };
42
41
 
42
+ // Ref-based registry: plugins are read imperatively at event time, so register/unregister does not trigger re-renders.
43
43
  export type ComposerInputPluginRegistry = {
44
- register(plugin: ComposerInputPlugin): () => void;
44
+ register(
45
+ plugin: ComposerInputPlugin,
46
+ opts?: ComposerInputPluginRegisterOptions,
47
+ ): () => void;
45
48
  getPlugins(): readonly ComposerInputPlugin[];
46
49
  };
47
50
 
@@ -63,25 +66,35 @@ export const useComposerInputPluginRegistryOptional =
63
66
  return useContext(ComposerInputPluginRegistryContext);
64
67
  };
65
68
 
66
- // =============================================================================
67
- // Provider
68
- // =============================================================================
69
-
70
69
  export const ComposerInputPluginProvider: FC<{ children: ReactNode }> = ({
71
70
  children,
72
71
  }) => {
73
- const pluginsRef = useRef<Set<ComposerInputPlugin>>(new Set());
72
+ const pluginsRef = useRef<Map<ComposerInputPlugin, number>>(new Map());
74
73
  const snapshotRef = useRef<readonly ComposerInputPlugin[]>([]);
75
74
 
76
- const register = useCallback((plugin: ComposerInputPlugin) => {
77
- pluginsRef.current.add(plugin);
78
- snapshotRef.current = Array.from(pluginsRef.current);
79
- return () => {
80
- pluginsRef.current.delete(plugin);
81
- snapshotRef.current = Array.from(pluginsRef.current);
82
- };
75
+ const refreshSnapshot = useCallback(() => {
76
+ const entries = Array.from(pluginsRef.current.entries());
77
+ // Sort by priority descending; stable insertion order for equal priorities.
78
+ entries.sort((a, b) => b[1] - a[1]);
79
+ snapshotRef.current = entries.map(([plugin]) => plugin);
83
80
  }, []);
84
81
 
82
+ const register = useCallback(
83
+ (
84
+ plugin: ComposerInputPlugin,
85
+ opts?: ComposerInputPluginRegisterOptions,
86
+ ) => {
87
+ const priority = opts?.priority ?? 0;
88
+ pluginsRef.current.set(plugin, priority);
89
+ refreshSnapshot();
90
+ return () => {
91
+ pluginsRef.current.delete(plugin);
92
+ refreshSnapshot();
93
+ };
94
+ },
95
+ [refreshSnapshot],
96
+ );
97
+
85
98
  const getPlugins = useCallback(
86
99
  (): readonly ComposerInputPlugin[] => snapshotRef.current,
87
100
  [],
@@ -6,7 +6,7 @@ import {
6
6
  type ComponentRef,
7
7
  type FormEvent,
8
8
  forwardRef,
9
- ComponentPropsWithoutRef,
9
+ type ComponentPropsWithoutRef,
10
10
  } from "react";
11
11
  import { useComposerSend } from "./ComposerSend";
12
12
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  import { useCallback } from "react";
4
4
  import {
5
- ActionButtonElement,
6
- ActionButtonProps,
5
+ type ActionButtonElement,
6
+ type ActionButtonProps,
7
7
  createActionButton,
8
8
  } from "../../utils/createActionButton";
9
9
  import { useComposerSend as useComposerSendBehavior } from "@assistant-ui/core/react";
@@ -0,0 +1,207 @@
1
+ "use client";
2
+
3
+ import { useAui, useAuiState } from "@assistant-ui/store";
4
+ import { useResource } from "@assistant-ui/tap/react";
5
+ import type { Unstable_TriggerAdapter } from "@assistant-ui/core";
6
+ import {
7
+ createContext,
8
+ forwardRef,
9
+ useCallback,
10
+ useContext,
11
+ useEffect,
12
+ useId,
13
+ useMemo,
14
+ useRef,
15
+ useState,
16
+ type ComponentPropsWithoutRef,
17
+ type ComponentRef,
18
+ } from "react";
19
+ import { Primitive } from "../../../utils/Primitive";
20
+ import { useComposerInputPluginRegistryOptional } from "../ComposerInputPluginContext";
21
+ import {
22
+ TriggerPopoverResource,
23
+ type TriggerPopoverResourceOutput,
24
+ } from "./TriggerPopoverResource";
25
+ import type { TriggerBehavior } from "./triggerSelectionResource";
26
+ import { useTriggerPopoverRootContext } from "./TriggerPopoverRootContext";
27
+
28
+ const TriggerPopoverScopeContext =
29
+ createContext<TriggerPopoverResourceOutput | null>(null);
30
+
31
+ export const useTriggerPopoverScopeContext = () => {
32
+ const ctx = useContext(TriggerPopoverScopeContext);
33
+ if (!ctx)
34
+ throw new Error(
35
+ "useTriggerPopoverScopeContext must be used within ComposerPrimitive.TriggerPopover",
36
+ );
37
+ return ctx;
38
+ };
39
+
40
+ export const useTriggerPopoverScopeContextOptional = () =>
41
+ useContext(TriggerPopoverScopeContext);
42
+
43
+ /** Registration API exposed to behavior sub-primitives. */
44
+ export type TriggerBehaviorRegistration = {
45
+ register(behavior: TriggerBehavior): () => void;
46
+ };
47
+
48
+ const TriggerBehaviorRegistrationContext =
49
+ createContext<TriggerBehaviorRegistration | null>(null);
50
+
51
+ /** Obtain the registration handle from the parent `<TriggerPopover>`. */
52
+ export const useTriggerBehaviorRegistration = () => {
53
+ const ctx = useContext(TriggerBehaviorRegistrationContext);
54
+ if (!ctx)
55
+ throw new Error(
56
+ "TriggerPopover.Directive / TriggerPopover.Action must be rendered inside ComposerPrimitive.TriggerPopover",
57
+ );
58
+ return ctx;
59
+ };
60
+
61
+ export namespace ComposerPrimitiveTriggerPopover {
62
+ export type Element = ComponentRef<typeof Primitive.div>;
63
+ export type Props = Omit<
64
+ ComponentPropsWithoutRef<typeof Primitive.div>,
65
+ "onSelect"
66
+ > & {
67
+ /** The character(s) that activate this trigger (e.g. `"@"`, `"/"`). Also serves as the trigger identity within the root. */
68
+ readonly char: string;
69
+ /** Adapter providing categories and items. */
70
+ readonly adapter?: Unstable_TriggerAdapter | undefined;
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Declares a trigger and renders its popover container. The popover only
76
+ * renders its DOM (and children) when the trigger character is active in the
77
+ * composer input and a behavior sub-primitive has been registered.
78
+ *
79
+ * A behavior is contributed by rendering exactly one of
80
+ * `<TriggerPopover.Directive>` or `<TriggerPopover.Action>` as a child. Without
81
+ * a behavior the trigger stays closed.
82
+ *
83
+ * Must be placed inside `ComposerPrimitive.Unstable_TriggerPopoverRoot`.
84
+ *
85
+ * @example
86
+ * ```tsx
87
+ * <ComposerPrimitive.Unstable_TriggerPopover
88
+ * char="@"
89
+ * adapter={mentionAdapter}
90
+ * >
91
+ * <ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
92
+ * <ComposerPrimitive.Unstable_TriggerPopoverCategories>
93
+ * {(cats) => cats.map(...)}
94
+ * </ComposerPrimitive.Unstable_TriggerPopoverCategories>
95
+ * <ComposerPrimitive.Unstable_TriggerPopoverItems>
96
+ * {(items) => items.map(...)}
97
+ * </ComposerPrimitive.Unstable_TriggerPopoverItems>
98
+ * </ComposerPrimitive.Unstable_TriggerPopover>
99
+ * ```
100
+ */
101
+ export const ComposerPrimitiveTriggerPopover = forwardRef<
102
+ ComposerPrimitiveTriggerPopover.Element,
103
+ ComposerPrimitiveTriggerPopover.Props
104
+ >(
105
+ (
106
+ { char, adapter, "aria-label": ariaLabel, children, ...props },
107
+ forwardedRef,
108
+ ) => {
109
+ const aui = useAui();
110
+ const text = useAuiState((s) => s.composer.text);
111
+ const popoverId = useId();
112
+
113
+ // Track in state (for resource reactivity) + ref (dev warning on duplicate registrations).
114
+ const behaviorRef = useRef<TriggerBehavior | null>(null);
115
+ const [behavior, setBehavior] = useState<TriggerBehavior | null>(null);
116
+ const registrationCountRef = useRef(0);
117
+
118
+ const register = useCallback<TriggerBehaviorRegistration["register"]>(
119
+ (next) => {
120
+ registrationCountRef.current += 1;
121
+ if (
122
+ process.env.NODE_ENV !== "production" &&
123
+ registrationCountRef.current > 1
124
+ ) {
125
+ console.warn(
126
+ `[assistant-ui] TriggerPopover "${char}" received more than one behavior child. Exactly one <TriggerPopover.Directive> or <TriggerPopover.Action> is allowed per TriggerPopover; the last registration wins.`,
127
+ );
128
+ }
129
+ behaviorRef.current = next;
130
+ setBehavior(next);
131
+ return () => {
132
+ registrationCountRef.current = Math.max(
133
+ 0,
134
+ registrationCountRef.current - 1,
135
+ );
136
+ if (behaviorRef.current === next) {
137
+ behaviorRef.current = null;
138
+ setBehavior(null);
139
+ }
140
+ };
141
+ },
142
+ [char],
143
+ );
144
+
145
+ const registration = useMemo<TriggerBehaviorRegistration>(
146
+ () => ({ register }),
147
+ [register],
148
+ );
149
+
150
+ const resource = useResource(
151
+ TriggerPopoverResource({
152
+ adapter,
153
+ text,
154
+ triggerChar: char,
155
+ behavior: behavior ?? undefined,
156
+ aui,
157
+ popoverId,
158
+ }),
159
+ );
160
+
161
+ // Wrapper changes per render, but tap-stable methods inside don't.
162
+ const resourceRef = useRef(resource);
163
+ resourceRef.current = resource;
164
+
165
+ const root = useTriggerPopoverRootContext();
166
+ useEffect(() => {
167
+ return root.register({
168
+ char,
169
+ ...(behavior ? { behavior } : {}),
170
+ resource: resourceRef.current,
171
+ });
172
+ }, [root, char, behavior]);
173
+
174
+ const pluginRegistry = useComposerInputPluginRegistryOptional();
175
+ useEffect(() => {
176
+ if (!pluginRegistry) return undefined;
177
+ return pluginRegistry.register(resourceRef.current);
178
+ }, [pluginRegistry]);
179
+
180
+ const open = behavior !== null && resource.open;
181
+
182
+ return (
183
+ <TriggerBehaviorRegistrationContext.Provider value={registration}>
184
+ <TriggerPopoverScopeContext.Provider value={resource}>
185
+ {open ? (
186
+ <Primitive.div
187
+ role="listbox"
188
+ id={popoverId}
189
+ aria-label={ariaLabel ?? "Suggestions"}
190
+ aria-activedescendant={resource.highlightedItemId}
191
+ data-state="open"
192
+ {...props}
193
+ ref={forwardedRef}
194
+ >
195
+ {children}
196
+ </Primitive.div>
197
+ ) : (
198
+ children
199
+ )}
200
+ </TriggerPopoverScopeContext.Provider>
201
+ </TriggerBehaviorRegistrationContext.Provider>
202
+ );
203
+ },
204
+ );
205
+
206
+ ComposerPrimitiveTriggerPopover.displayName =
207
+ "ComposerPrimitive.TriggerPopover";
@@ -0,0 +1,61 @@
1
+ "use client";
2
+
3
+ import type {
4
+ Unstable_DirectiveFormatter,
5
+ Unstable_TriggerItem,
6
+ } from "@assistant-ui/core";
7
+ import { unstable_defaultDirectiveFormatter } from "@assistant-ui/core";
8
+ import { useEffect, useRef, type FC } from "react";
9
+ import { useTriggerBehaviorRegistration } from "./TriggerPopover";
10
+ import type { TriggerBehavior } from "./triggerSelectionResource";
11
+
12
+ export namespace ComposerPrimitiveTriggerPopoverAction {
13
+ export type Props = {
14
+ /** Defaults to `unstable_defaultDirectiveFormatter`. */
15
+ readonly formatter?: Unstable_DirectiveFormatter | undefined;
16
+ /** Fires the moment an item is selected; runs regardless of `removeOnExecute`. */
17
+ readonly onExecute: (item: Unstable_TriggerItem) => void;
18
+ /** When true, strips the trigger text after executing. Defaults to `false` (keeps audit-trail chip). */
19
+ readonly removeOnExecute?: boolean | undefined;
20
+ };
21
+ }
22
+
23
+ /**
24
+ * Configures a `<TriggerPopover>` to fire a handler when an item is selected,
25
+ * optionally leaving a directive chip behind as an audit trail. Render exactly
26
+ * one behavior sub-primitive per `<TriggerPopover>`.
27
+ *
28
+ * Exposed as `ComposerPrimitive.Unstable_TriggerPopover.Action`.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * <ComposerPrimitive.Unstable_TriggerPopover char="/" adapter={slashAdapter}>
33
+ * <ComposerPrimitive.Unstable_TriggerPopover.Action
34
+ * onExecute={(item) => commandHandlers[item.id]?.()}
35
+ * removeOnExecute={false}
36
+ * />
37
+ * </ComposerPrimitive.Unstable_TriggerPopover>
38
+ * ```
39
+ */
40
+ export const ComposerPrimitiveTriggerPopoverAction: FC<
41
+ ComposerPrimitiveTriggerPopoverAction.Props
42
+ > = ({ formatter, onExecute, removeOnExecute }) => {
43
+ const { register } = useTriggerBehaviorRegistration();
44
+ const onExecuteRef = useRef(onExecute);
45
+ onExecuteRef.current = onExecute;
46
+
47
+ useEffect(() => {
48
+ const behavior: TriggerBehavior = {
49
+ kind: "action",
50
+ formatter: formatter ?? unstable_defaultDirectiveFormatter,
51
+ onExecute: (item) => onExecuteRef.current(item),
52
+ ...(removeOnExecute !== undefined ? { removeOnExecute } : {}),
53
+ };
54
+ return register(behavior);
55
+ }, [register, formatter, removeOnExecute]);
56
+
57
+ return null;
58
+ };
59
+
60
+ ComposerPrimitiveTriggerPopoverAction.displayName =
61
+ "ComposerPrimitive.TriggerPopoverAction";
@@ -7,7 +7,7 @@ import {
7
7
  forwardRef,
8
8
  } from "react";
9
9
  import { composeEventHandlers } from "@radix-ui/primitive";
10
- import { useTriggerPopoverContext } from "./TriggerPopoverContext";
10
+ import { useTriggerPopoverScopeContext } from "./TriggerPopover";
11
11
 
12
12
  export namespace ComposerPrimitiveTriggerPopoverBack {
13
13
  export type Element = ComponentRef<typeof Primitive.button>;
@@ -22,9 +22,10 @@ export const ComposerPrimitiveTriggerPopoverBack = forwardRef<
22
22
  ComposerPrimitiveTriggerPopoverBack.Element,
23
23
  ComposerPrimitiveTriggerPopoverBack.Props
24
24
  >(({ onClick, ...props }, forwardedRef) => {
25
- const { activeCategoryId, isSearchMode, goBack } = useTriggerPopoverContext();
25
+ const { activeCategoryId, isSearchMode, goBack, open } =
26
+ useTriggerPopoverScopeContext();
26
27
 
27
- if (!activeCategoryId || isSearchMode) return null;
28
+ if (!open || !activeCategoryId || isSearchMode) return null;
28
29
 
29
30
  return (
30
31
  <Primitive.button