@assistant-ui/react 0.12.25 → 0.12.26

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 (485) 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/MessagePartsGrouped.d.ts +1 -1
  233. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  234. package/dist/primitives/message/MessageRoot.d.ts +1 -1
  235. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  236. package/dist/primitives/messagePart/MessagePartImage.d.ts +1 -1
  237. package/dist/primitives/messagePart/MessagePartImage.d.ts.map +1 -1
  238. package/dist/primitives/messagePart/MessagePartImage.js +2 -1
  239. package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
  240. package/dist/primitives/messagePart/MessagePartInProgress.d.ts +1 -1
  241. package/dist/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  242. package/dist/primitives/messagePart/MessagePartText.d.ts +2 -2
  243. package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
  244. package/dist/primitives/queueItem/QueueItemRemove.d.ts +1 -1
  245. package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -1
  246. package/dist/primitives/queueItem/QueueItemSteer.d.ts +1 -1
  247. package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -1
  248. package/dist/primitives/suggestion/SuggestionDescription.d.ts +1 -1
  249. package/dist/primitives/suggestion/SuggestionDescription.d.ts.map +1 -1
  250. package/dist/primitives/suggestion/SuggestionDescription.js +1 -1
  251. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  252. package/dist/primitives/suggestion/SuggestionTitle.d.ts +1 -1
  253. package/dist/primitives/suggestion/SuggestionTitle.d.ts.map +1 -1
  254. package/dist/primitives/suggestion/SuggestionTitle.js +1 -1
  255. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  256. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -1
  257. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  258. package/dist/primitives/thread/ThreadRoot.d.ts +1 -1
  259. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  260. package/dist/primitives/thread/ThreadRoot.js +1 -1
  261. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  262. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +1 -1
  263. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  264. package/dist/primitives/thread/ThreadSuggestion.d.ts +1 -1
  265. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  266. package/dist/primitives/thread/ThreadSuggestion.js +0 -2
  267. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  268. package/dist/primitives/thread/ThreadViewport.d.ts +1 -1
  269. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  270. package/dist/primitives/thread/ThreadViewportFooter.d.ts +1 -1
  271. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  272. package/dist/primitives/threadList/ThreadListNew.d.ts +1 -1
  273. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  274. package/dist/primitives/threadList/ThreadListRoot.d.ts +1 -1
  275. package/dist/primitives/threadList/ThreadListRoot.d.ts.map +1 -1
  276. package/dist/primitives/threadList/ThreadListRoot.js +1 -1
  277. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  278. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +1 -1
  279. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  280. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +1 -1
  281. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  282. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +1 -1
  283. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  284. package/dist/primitives/threadListItem/ThreadListItemRoot.js +1 -1
  285. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  286. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +1 -1
  287. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  288. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +1 -1
  289. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  290. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts +5 -2
  291. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.d.ts.map +1 -1
  292. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +3 -2
  293. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  294. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts +7 -4
  295. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.d.ts.map +1 -1
  296. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +2 -2
  297. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  298. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts +1 -1
  299. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.d.ts.map +1 -1
  300. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  301. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts +7 -4
  302. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.d.ts.map +1 -1
  303. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +2 -2
  304. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  305. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts +7 -4
  306. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.d.ts.map +1 -1
  307. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +2 -2
  308. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  309. package/dist/unstable/useMentionAdapter.d.ts +80 -0
  310. package/dist/unstable/useMentionAdapter.d.ts.map +1 -0
  311. package/dist/unstable/useMentionAdapter.js +129 -0
  312. package/dist/unstable/useMentionAdapter.js.map +1 -0
  313. package/dist/unstable/useSlashCommandAdapter.d.ts +32 -17
  314. package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
  315. package/dist/unstable/useSlashCommandAdapter.js +56 -32
  316. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  317. package/dist/utils/Primitive.d.ts +6 -4
  318. package/dist/utils/Primitive.d.ts.map +1 -1
  319. package/dist/utils/Primitive.js +15 -8
  320. package/dist/utils/Primitive.js.map +1 -1
  321. package/dist/utils/createActionButton.d.ts +1 -1
  322. package/dist/utils/createActionButton.d.ts.map +1 -1
  323. package/dist/utils/hooks/useManagedRef.d.ts +1 -1
  324. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  325. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  326. package/dist/utils/json/is-json.d.ts +1 -1
  327. package/dist/utils/json/is-json.d.ts.map +1 -1
  328. package/dist/utils/smooth/SmoothContext.d.ts +2 -2
  329. package/dist/utils/smooth/SmoothContext.d.ts.map +1 -1
  330. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  331. package/package.json +9 -9
  332. package/src/augmentations.ts +2 -0
  333. package/src/client/InMemoryThreadList.ts +1 -0
  334. package/src/client/SingleThreadList.ts +1 -0
  335. package/src/context/providers/MessageProvider.tsx +1 -1
  336. package/src/context/providers/ThreadViewportProvider.tsx +1 -1
  337. package/src/context/react/ThreadViewportContext.ts +3 -3
  338. package/src/context/react/utils/createContextHook.ts +1 -1
  339. package/src/context/react/utils/createContextStoreHook.ts +2 -2
  340. package/src/context/react/utils/createStateHookForRuntime.ts +2 -1
  341. package/src/devtools/DevToolsHooks.ts +5 -1
  342. package/src/index.ts +27 -56
  343. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +3 -3
  344. package/src/legacy-runtime/cloud/auiV0.ts +6 -3
  345. package/src/legacy-runtime/cloud/useCloudThreadListRuntime.ts +1 -1
  346. package/src/legacy-runtime/hooks/AssistantContext.ts +1 -1
  347. package/src/legacy-runtime/hooks/AttachmentContext.ts +1 -1
  348. package/src/legacy-runtime/hooks/ComposerContext.ts +1 -1
  349. package/src/legacy-runtime/hooks/MessageContext.ts +1 -1
  350. package/src/legacy-runtime/hooks/MessagePartContext.ts +1 -1
  351. package/src/legacy-runtime/hooks/ThreadContext.ts +1 -1
  352. package/src/legacy-runtime/hooks/ThreadListItemContext.ts +1 -1
  353. package/src/legacy-runtime/runtime-cores/assistant-transport/commandQueue.ts +1 -1
  354. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +2 -2
  355. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +20 -4
  356. package/src/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.test.ts +8 -2
  357. package/src/model-context/frame/useAssistantFrameHost.ts +1 -1
  358. package/src/model-context/makeAssistantVisible.tsx +3 -3
  359. package/src/primitives/actionBar/ActionBarCopy.tsx +1 -1
  360. package/src/primitives/actionBar/ActionBarEdit.ts +2 -2
  361. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +1 -1
  362. package/src/primitives/actionBar/ActionBarFeedbackNegative.tsx +1 -1
  363. package/src/primitives/actionBar/ActionBarFeedbackPositive.tsx +1 -1
  364. package/src/primitives/actionBar/ActionBarReload.ts +2 -2
  365. package/src/primitives/actionBar/ActionBarRoot.tsx +1 -1
  366. package/src/primitives/actionBar/ActionBarSpeak.ts +2 -2
  367. package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +1 -1
  368. package/src/primitives/actionBarMore/ActionBarMoreContent.tsx +10 -4
  369. package/src/primitives/actionBarMore/ActionBarMoreItem.tsx +7 -7
  370. package/src/primitives/actionBarMore/ActionBarMoreRoot.tsx +2 -2
  371. package/src/primitives/actionBarMore/ActionBarMoreSeparator.tsx +7 -5
  372. package/src/primitives/actionBarMore/ActionBarMoreTrigger.tsx +7 -7
  373. package/src/primitives/assistantModal/AssistantModalAnchor.tsx +6 -2
  374. package/src/primitives/assistantModal/AssistantModalContent.tsx +6 -2
  375. package/src/primitives/assistantModal/AssistantModalRoot.tsx +2 -2
  376. package/src/primitives/assistantModal/AssistantModalTrigger.tsx +6 -2
  377. package/src/primitives/attachment/AttachmentRemove.ts +2 -2
  378. package/src/primitives/attachment/AttachmentRoot.tsx +5 -1
  379. package/src/primitives/attachment/AttachmentThumb.tsx +5 -1
  380. package/src/primitives/branchPicker/BranchPickerNext.ts +2 -2
  381. package/src/primitives/branchPicker/BranchPickerPrevious.ts +2 -2
  382. package/src/primitives/branchPicker/BranchPickerRoot.tsx +5 -1
  383. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +2 -2
  384. package/src/primitives/chainOfThought/ChainOfThoughtRoot.tsx +5 -1
  385. package/src/primitives/composer/ComposerAddAttachment.ts +2 -2
  386. package/src/primitives/composer/ComposerAttachmentDropzone.test.tsx +125 -0
  387. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +11 -8
  388. package/src/primitives/composer/ComposerCancel.ts +2 -2
  389. package/src/primitives/composer/ComposerDictationTranscript.tsx +5 -1
  390. package/src/primitives/composer/ComposerInput.tsx +33 -1
  391. package/src/primitives/composer/ComposerInputPluginContext.tsx +37 -24
  392. package/src/primitives/composer/ComposerRoot.tsx +1 -1
  393. package/src/primitives/composer/ComposerSend.ts +2 -2
  394. package/src/primitives/composer/trigger/TriggerPopover.tsx +207 -0
  395. package/src/primitives/composer/trigger/TriggerPopoverAction.tsx +61 -0
  396. package/src/primitives/composer/trigger/TriggerPopoverBack.tsx +4 -3
  397. package/src/primitives/composer/trigger/TriggerPopoverCategories.tsx +14 -17
  398. package/src/primitives/composer/trigger/TriggerPopoverDirective.tsx +57 -0
  399. package/src/primitives/composer/trigger/TriggerPopoverItems.tsx +44 -40
  400. package/src/primitives/composer/trigger/TriggerPopoverResource.ts +76 -315
  401. package/src/primitives/composer/trigger/TriggerPopoverRootContext.tsx +212 -0
  402. package/src/primitives/composer/trigger/detectTrigger.test.ts +36 -0
  403. package/src/primitives/composer/trigger/detectTrigger.ts +1 -1
  404. package/src/primitives/composer/trigger/index.ts +21 -5
  405. package/src/primitives/composer/trigger/triggerDetectionResource.ts +43 -0
  406. package/src/primitives/composer/trigger/triggerKeyboardResource.ts +151 -0
  407. package/src/primitives/composer/trigger/triggerNavigationResource.ts +145 -0
  408. package/src/primitives/composer/trigger/triggerSelectionResource.ts +122 -0
  409. package/src/primitives/composer.ts +8 -18
  410. package/src/primitives/dropdownMenuRenderPrimitives.test.tsx +64 -0
  411. package/src/primitives/dropdownMenuRenderPrimitives.ts +15 -0
  412. package/src/primitives/error/ErrorMessage.tsx +5 -1
  413. package/src/primitives/error/ErrorRoot.tsx +5 -1
  414. package/src/primitives/message/MessageError.ts +1 -1
  415. package/src/primitives/message/MessagePartsGrouped.tsx +1 -1
  416. package/src/primitives/message/MessageRoot.tsx +1 -1
  417. package/src/primitives/messagePart/MessagePartImage.tsx +6 -1
  418. package/src/primitives/messagePart/MessagePartInProgress.ts +1 -1
  419. package/src/primitives/messagePart/MessagePartText.tsx +3 -3
  420. package/src/primitives/queueItem/QueueItemRemove.ts +2 -2
  421. package/src/primitives/queueItem/QueueItemSteer.ts +2 -2
  422. package/src/primitives/suggestion/SuggestionDescription.tsx +5 -1
  423. package/src/primitives/suggestion/SuggestionTitle.tsx +5 -1
  424. package/src/primitives/suggestion/SuggestionTrigger.ts +2 -2
  425. package/src/primitives/thread/ThreadRoot.tsx +5 -1
  426. package/src/primitives/thread/ThreadScrollToBottom.ts +2 -2
  427. package/src/primitives/thread/ThreadSuggestion.ts +2 -4
  428. package/src/primitives/thread/ThreadViewport.tsx +1 -1
  429. package/src/primitives/thread/ThreadViewportFooter.tsx +1 -1
  430. package/src/primitives/threadList/ThreadListNew.tsx +1 -1
  431. package/src/primitives/threadList/ThreadListRoot.tsx +5 -1
  432. package/src/primitives/threadListItem/ThreadListItemArchive.ts +2 -2
  433. package/src/primitives/threadListItem/ThreadListItemDelete.ts +2 -2
  434. package/src/primitives/threadListItem/ThreadListItemRoot.tsx +5 -1
  435. package/src/primitives/threadListItem/ThreadListItemTrigger.ts +2 -2
  436. package/src/primitives/threadListItem/ThreadListItemUnarchive.ts +2 -2
  437. package/src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx +10 -4
  438. package/src/primitives/threadListItemMore/ThreadListItemMoreItem.tsx +7 -7
  439. package/src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx +2 -2
  440. package/src/primitives/threadListItemMore/ThreadListItemMoreSeparator.tsx +7 -5
  441. package/src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx +7 -7
  442. package/src/tests/DataRenderers.test.ts +174 -41
  443. package/src/unstable/useMentionAdapter.ts +220 -0
  444. package/src/unstable/useSlashCommandAdapter.ts +79 -50
  445. package/src/utils/Primitive.test.tsx +7 -1
  446. package/src/utils/Primitive.tsx +49 -16
  447. package/src/utils/createActionButton.tsx +3 -3
  448. package/src/utils/hooks/useManagedRef.ts +2 -2
  449. package/src/utils/json/is-json.ts +1 -1
  450. package/src/utils/smooth/SmoothContext.tsx +5 -5
  451. package/dist/primitives/composer/mention/ComposerMentionContext.d.ts +0 -25
  452. package/dist/primitives/composer/mention/ComposerMentionContext.d.ts.map +0 -1
  453. package/dist/primitives/composer/mention/ComposerMentionContext.js +0 -74
  454. package/dist/primitives/composer/mention/ComposerMentionContext.js.map +0 -1
  455. package/dist/primitives/composer/mention/index.d.ts +0 -6
  456. package/dist/primitives/composer/mention/index.d.ts.map +0 -1
  457. package/dist/primitives/composer/mention/index.js +0 -8
  458. package/dist/primitives/composer/mention/index.js.map +0 -1
  459. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.d.ts +0 -36
  460. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.d.ts.map +0 -1
  461. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.js +0 -36
  462. package/dist/primitives/composer/slash-command/ComposerSlashCommandRoot.js.map +0 -1
  463. package/dist/primitives/composer/slash-command/index.d.ts +0 -2
  464. package/dist/primitives/composer/slash-command/index.d.ts.map +0 -1
  465. package/dist/primitives/composer/slash-command/index.js +0 -2
  466. package/dist/primitives/composer/slash-command/index.js.map +0 -1
  467. package/dist/primitives/composer/trigger/TriggerPopoverContext.d.ts +0 -37
  468. package/dist/primitives/composer/trigger/TriggerPopoverContext.d.ts.map +0 -1
  469. package/dist/primitives/composer/trigger/TriggerPopoverContext.js +0 -70
  470. package/dist/primitives/composer/trigger/TriggerPopoverContext.js.map +0 -1
  471. package/dist/primitives/composer/trigger/TriggerPopoverPopover.d.ts +0 -26
  472. package/dist/primitives/composer/trigger/TriggerPopoverPopover.d.ts.map +0 -1
  473. package/dist/primitives/composer/trigger/TriggerPopoverPopover.js +0 -28
  474. package/dist/primitives/composer/trigger/TriggerPopoverPopover.js.map +0 -1
  475. package/dist/unstable/useToolMentionAdapter.d.ts +0 -42
  476. package/dist/unstable/useToolMentionAdapter.d.ts.map +0 -1
  477. package/dist/unstable/useToolMentionAdapter.js +0 -65
  478. package/dist/unstable/useToolMentionAdapter.js.map +0 -1
  479. package/src/primitives/composer/mention/ComposerMentionContext.tsx +0 -175
  480. package/src/primitives/composer/mention/index.ts +0 -19
  481. package/src/primitives/composer/slash-command/ComposerSlashCommandRoot.tsx +0 -76
  482. package/src/primitives/composer/slash-command/index.ts +0 -1
  483. package/src/primitives/composer/trigger/TriggerPopoverContext.tsx +0 -129
  484. package/src/primitives/composer/trigger/TriggerPopoverPopover.tsx +0 -51
  485. package/src/unstable/useToolMentionAdapter.ts +0 -114
@@ -1,4 +1,4 @@
1
- const WHITESPACE_RE = /\s/;
1
+ const WHITESPACE_RE = /\s/u;
2
2
 
3
3
  /**
4
4
  * Detect a trigger character in text relative to the cursor position.
@@ -1,9 +1,16 @@
1
1
  export {
2
2
  ComposerPrimitiveTriggerPopoverRoot,
3
- useTriggerPopoverContext,
4
- useTriggerPopoverContextOptional,
5
- } from "./TriggerPopoverContext";
6
- export { ComposerPrimitiveTriggerPopoverPopover } from "./TriggerPopoverPopover";
3
+ useTriggerPopoverRootContext,
4
+ useTriggerPopoverRootContextOptional,
5
+ useTriggerPopoverTriggers,
6
+ useTriggerPopoverTriggersOptional,
7
+ type RegisteredTrigger,
8
+ type TriggerPopoverRootContextValue,
9
+ } from "./TriggerPopoverRootContext";
10
+ export {
11
+ useTriggerPopoverScopeContext,
12
+ useTriggerPopoverScopeContextOptional,
13
+ } from "./TriggerPopover";
7
14
  export {
8
15
  ComposerPrimitiveTriggerPopoverCategories,
9
16
  ComposerPrimitiveTriggerPopoverCategoryItem,
@@ -13,4 +20,13 @@ export {
13
20
  ComposerPrimitiveTriggerPopoverItem,
14
21
  } from "./TriggerPopoverItems";
15
22
  export { ComposerPrimitiveTriggerPopoverBack } from "./TriggerPopoverBack";
16
- export type { OnSelectBehavior } from "./TriggerPopoverResource";
23
+ export type { TriggerBehavior } from "./triggerSelectionResource";
24
+
25
+ import { ComposerPrimitiveTriggerPopover as Base } from "./TriggerPopover";
26
+ import { ComposerPrimitiveTriggerPopoverAction } from "./TriggerPopoverAction";
27
+ import { ComposerPrimitiveTriggerPopoverDirective } from "./TriggerPopoverDirective";
28
+
29
+ export const ComposerPrimitiveTriggerPopover = Object.assign(Base, {
30
+ Directive: ComposerPrimitiveTriggerPopoverDirective,
31
+ Action: ComposerPrimitiveTriggerPopoverAction,
32
+ });
@@ -0,0 +1,43 @@
1
+ import { resource, tapMemo, tapState } from "@assistant-ui/tap";
2
+ import { detectTrigger } from "./detectTrigger";
3
+
4
+ /** Detected trigger position within the composer text. */
5
+ export type DetectedTrigger = {
6
+ readonly offset: number;
7
+ readonly query: string;
8
+ };
9
+
10
+ export type TriggerDetectionResourceOutput = {
11
+ /** Detected trigger (or `null` when inactive). */
12
+ readonly trigger: DetectedTrigger | null;
13
+ /** Current query string (empty when no trigger active). */
14
+ readonly query: string;
15
+ /** Update the tracked cursor position (wired to composer input). */
16
+ setCursorPosition(pos: number): void;
17
+ };
18
+
19
+ /** Tracks cursor position and derives the active trigger + query from composer text. */
20
+ export const TriggerDetectionResource = resource(
21
+ ({
22
+ text,
23
+ triggerChar,
24
+ }: {
25
+ text: string;
26
+ triggerChar: string;
27
+ }): TriggerDetectionResourceOutput => {
28
+ const [cursorPosition, setCursorPosition] = tapState(text.length);
29
+
30
+ const trigger = tapMemo(() => {
31
+ const pos = Math.min(cursorPosition, text.length);
32
+ return detectTrigger(text, triggerChar, pos);
33
+ }, [cursorPosition, text, triggerChar]);
34
+
35
+ const query = trigger?.query ?? "";
36
+
37
+ return {
38
+ trigger,
39
+ query,
40
+ setCursorPosition,
41
+ };
42
+ },
43
+ );
@@ -0,0 +1,151 @@
1
+ import {
2
+ resource,
3
+ tapEffect,
4
+ tapEffectEvent,
5
+ tapState,
6
+ } from "@assistant-ui/tap";
7
+ import type {
8
+ Unstable_TriggerCategory,
9
+ Unstable_TriggerItem,
10
+ } from "@assistant-ui/core";
11
+
12
+ /** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */
13
+ function isTriggerItem(
14
+ x: Unstable_TriggerItem | Unstable_TriggerCategory,
15
+ ): x is Unstable_TriggerItem {
16
+ return "type" in x;
17
+ }
18
+
19
+ /** Key event shape accepted by the keyboard handler. */
20
+ export type TriggerPopoverKeyEvent = {
21
+ readonly key: string;
22
+ readonly shiftKey: boolean;
23
+ preventDefault(): void;
24
+ };
25
+
26
+ export type TriggerKeyboardResourceOutput = {
27
+ /** Index of the currently highlighted entry within the navigable list. */
28
+ readonly highlightedIndex: number;
29
+ /** ID of the currently highlighted item (for `aria-activedescendant`). */
30
+ readonly highlightedItemId: string | undefined;
31
+ /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */
32
+ highlightIndex(index: number): void;
33
+ /** Handle a key event; returns `true` if it was consumed. */
34
+ handleKeyDown(e: TriggerPopoverKeyEvent): boolean;
35
+ };
36
+
37
+ /**
38
+ * Owns keyboard-driven highlight state for the popover. Delegates selection,
39
+ * category drill-in, back, and close to the callbacks supplied by the parent.
40
+ */
41
+ export const TriggerKeyboardResource = resource(
42
+ ({
43
+ navigableList,
44
+ isSearchMode,
45
+ activeCategoryId,
46
+ query,
47
+ popoverId,
48
+ open,
49
+ selectItem,
50
+ selectCategory,
51
+ goBack,
52
+ close,
53
+ }: {
54
+ navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];
55
+ isSearchMode: boolean;
56
+ activeCategoryId: string | null;
57
+ query: string;
58
+ popoverId: string;
59
+ open: boolean;
60
+ selectItem: (item: Unstable_TriggerItem) => void;
61
+ selectCategory: (categoryId: string) => void;
62
+ goBack: () => void;
63
+ close: () => void;
64
+ }): TriggerKeyboardResourceOutput => {
65
+ const [highlightedIndex, setHighlightedIndex] = tapState(0);
66
+
67
+ // biome-ignore lint/correctness/useExhaustiveDependencies: intentional reset on list change
68
+ tapEffect(() => {
69
+ setHighlightedIndex(0);
70
+ }, [navigableList]);
71
+
72
+ // biome-ignore lint/correctness/useExhaustiveDependencies: intentional reset
73
+ tapEffect(() => {
74
+ setHighlightedIndex(0);
75
+ }, [isSearchMode, activeCategoryId]);
76
+
77
+ const highlightIndex = tapEffectEvent((index: number) => {
78
+ if (index < 0 || index >= navigableList.length) return;
79
+ if (index === highlightedIndex) return;
80
+ setHighlightedIndex(index);
81
+ });
82
+
83
+ const handleKeyDown = tapEffectEvent(
84
+ (e: TriggerPopoverKeyEvent): boolean => {
85
+ if (!open) return false;
86
+
87
+ switch (e.key) {
88
+ case "ArrowDown": {
89
+ e.preventDefault();
90
+ setHighlightedIndex((prev) => {
91
+ const len = navigableList.length;
92
+ if (len === 0) return 0;
93
+ return prev < len - 1 ? prev + 1 : 0;
94
+ });
95
+ return true;
96
+ }
97
+ case "ArrowUp": {
98
+ e.preventDefault();
99
+ setHighlightedIndex((prev) => {
100
+ const len = navigableList.length;
101
+ if (len === 0) return 0;
102
+ return prev > 0 ? prev - 1 : len - 1;
103
+ });
104
+ return true;
105
+ }
106
+ case "Enter": {
107
+ if (e.shiftKey) return false;
108
+ e.preventDefault();
109
+ const item = navigableList[highlightedIndex];
110
+ if (!item) return true;
111
+
112
+ if (isTriggerItem(item)) {
113
+ selectItem(item);
114
+ } else {
115
+ selectCategory(item.id);
116
+ }
117
+ return true;
118
+ }
119
+ case "Escape": {
120
+ e.preventDefault();
121
+ close();
122
+ return true;
123
+ }
124
+ case "Backspace": {
125
+ if (activeCategoryId && query === "") {
126
+ e.preventDefault();
127
+ goBack();
128
+ return true;
129
+ }
130
+ return false;
131
+ }
132
+ default:
133
+ return false;
134
+ }
135
+ },
136
+ );
137
+
138
+ const highlightedEntry = navigableList[highlightedIndex];
139
+ const highlightedItemId =
140
+ open && highlightedEntry
141
+ ? `${popoverId}-option-${highlightedEntry.id}`
142
+ : undefined;
143
+
144
+ return {
145
+ highlightedIndex,
146
+ highlightedItemId,
147
+ highlightIndex,
148
+ handleKeyDown,
149
+ };
150
+ },
151
+ );
@@ -0,0 +1,145 @@
1
+ import {
2
+ resource,
3
+ tapEffect,
4
+ tapEffectEvent,
5
+ tapMemo,
6
+ tapState,
7
+ } from "@assistant-ui/tap";
8
+ import type {
9
+ Unstable_TriggerAdapter,
10
+ Unstable_TriggerCategory,
11
+ Unstable_TriggerItem,
12
+ } from "@assistant-ui/core";
13
+
14
+ function matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {
15
+ return (
16
+ item.id.toLowerCase().includes(lower) ||
17
+ item.label.toLowerCase().includes(lower) ||
18
+ (item.description?.toLowerCase().includes(lower) ?? false)
19
+ );
20
+ }
21
+
22
+ export type TriggerNavigationResourceOutput = {
23
+ /** Filtered categories visible in the list (empty in search mode). */
24
+ readonly categories: readonly Unstable_TriggerCategory[];
25
+ /** Filtered items visible in the list. */
26
+ readonly items: readonly Unstable_TriggerItem[];
27
+ /** `true` when the current list is search results rather than categories. */
28
+ readonly isSearchMode: boolean;
29
+ /** Currently drilled-into category id (or `null` for the top level). */
30
+ readonly activeCategoryId: string | null;
31
+ /** Flat list used for keyboard navigation (categories or items). */
32
+ readonly navigableList: readonly (
33
+ | Unstable_TriggerCategory
34
+ | Unstable_TriggerItem
35
+ )[];
36
+ /** Drill into a category. */
37
+ selectCategory(categoryId: string): void;
38
+ /** Return to the top-level category list. */
39
+ goBack(): void;
40
+ };
41
+
42
+ /**
43
+ * Computes categories, items, search results, and navigation state from the
44
+ * adapter + current query. Pure derivation — no side effects on the composer.
45
+ */
46
+ export const TriggerNavigationResource = resource(
47
+ ({
48
+ adapter,
49
+ query,
50
+ open,
51
+ }: {
52
+ adapter: Unstable_TriggerAdapter | undefined;
53
+ query: string;
54
+ open: boolean;
55
+ }): TriggerNavigationResourceOutput => {
56
+ const [activeCategoryId, setActiveCategoryId] = tapState<string | null>(
57
+ null,
58
+ );
59
+
60
+ tapEffect(() => {
61
+ if (!open) setActiveCategoryId(null);
62
+ }, [open]);
63
+
64
+ const categories = tapMemo<readonly Unstable_TriggerCategory[]>(() => {
65
+ if (!open || !adapter) return [];
66
+ return adapter.categories();
67
+ }, [open, adapter]);
68
+
69
+ const effectiveActiveCategoryId = open ? activeCategoryId : null;
70
+
71
+ const allItems = tapMemo<readonly Unstable_TriggerItem[]>(() => {
72
+ if (!effectiveActiveCategoryId || !adapter) return [];
73
+ return adapter.categoryItems(effectiveActiveCategoryId);
74
+ }, [effectiveActiveCategoryId, adapter]);
75
+
76
+ const searchResults = tapMemo<
77
+ readonly Unstable_TriggerItem[] | null
78
+ >(() => {
79
+ if (!open || !adapter || effectiveActiveCategoryId) return null;
80
+ // If categories exist and query is empty, show categories first (not search)
81
+ if (!query && categories.length > 0) return null;
82
+ if (adapter.search) return adapter.search(query);
83
+
84
+ // fallback: no adapter.search
85
+ const all: Unstable_TriggerItem[] = [];
86
+ const lower = query.toLowerCase();
87
+ for (const cat of categories) {
88
+ for (const item of adapter.categoryItems(cat.id)) {
89
+ if (matchesQuery(item, lower)) {
90
+ all.push(item);
91
+ }
92
+ }
93
+ }
94
+ return all;
95
+ }, [open, adapter, query, effectiveActiveCategoryId, categories]);
96
+
97
+ const isSearchMode = searchResults !== null;
98
+
99
+ const filteredCategories = tapMemo(() => {
100
+ if (isSearchMode) return [];
101
+ if (!query) return categories;
102
+ const lower = query.toLowerCase();
103
+ return categories.filter((cat) =>
104
+ cat.label.toLowerCase().includes(lower),
105
+ );
106
+ }, [categories, query, isSearchMode]);
107
+
108
+ const filteredItems = tapMemo(() => {
109
+ if (isSearchMode) return searchResults ?? [];
110
+ if (!query) return allItems;
111
+ const lower = query.toLowerCase();
112
+ return allItems.filter((item) => matchesQuery(item, lower));
113
+ }, [allItems, query, isSearchMode, searchResults]);
114
+
115
+ const navigableList = tapMemo(() => {
116
+ if (isSearchMode) return searchResults ?? [];
117
+ if (effectiveActiveCategoryId) return filteredItems;
118
+ return filteredCategories;
119
+ }, [
120
+ isSearchMode,
121
+ searchResults,
122
+ effectiveActiveCategoryId,
123
+ filteredItems,
124
+ filteredCategories,
125
+ ]);
126
+
127
+ const selectCategory = tapEffectEvent((categoryId: string) => {
128
+ setActiveCategoryId(categoryId);
129
+ });
130
+
131
+ const goBack = tapEffectEvent(() => {
132
+ setActiveCategoryId(null);
133
+ });
134
+
135
+ return {
136
+ categories: filteredCategories,
137
+ items: filteredItems,
138
+ isSearchMode,
139
+ activeCategoryId: effectiveActiveCategoryId,
140
+ navigableList,
141
+ selectCategory,
142
+ goBack,
143
+ };
144
+ },
145
+ );
@@ -0,0 +1,122 @@
1
+ import { resource, tapEffectEvent, tapRef } from "@assistant-ui/tap";
2
+ import type {
3
+ Unstable_DirectiveFormatter,
4
+ Unstable_TriggerItem,
5
+ } from "@assistant-ui/core";
6
+ import type { AssistantClient } from "@assistant-ui/store";
7
+ import type { DetectedTrigger } from "./triggerDetectionResource";
8
+
9
+ /** External override for selection (used by Lexical's DirectivePlugin). */
10
+ export type SelectItemOverride = (item: Unstable_TriggerItem) => boolean;
11
+
12
+ export type TriggerBehavior =
13
+ | {
14
+ readonly kind: "directive";
15
+ readonly formatter: Unstable_DirectiveFormatter;
16
+ readonly onInserted?: (item: Unstable_TriggerItem) => void;
17
+ }
18
+ | {
19
+ readonly kind: "action";
20
+ readonly formatter: Unstable_DirectiveFormatter;
21
+ readonly onExecute: (item: Unstable_TriggerItem) => void;
22
+ readonly removeOnExecute?: boolean;
23
+ };
24
+
25
+ export type TriggerSelectionResourceOutput = {
26
+ /** Select an item — runs override (if any) then applies behavior. */
27
+ selectItem(item: Unstable_TriggerItem): void;
28
+ /** Close the popover (moves cursor before trigger to deactivate detection). */
29
+ close(): void;
30
+ /** Register a Lexical-style selection override. Returns unregister fn. */
31
+ registerSelectItemOverride(fn: SelectItemOverride): () => void;
32
+ };
33
+
34
+ /** Owns composer text mutation + behavior dispatch on item selection. */
35
+ export const TriggerSelectionResource = resource(
36
+ ({
37
+ behavior,
38
+ trigger,
39
+ aui,
40
+ triggerChar,
41
+ setCursorPosition,
42
+ onSelected,
43
+ }: {
44
+ behavior: TriggerBehavior | undefined;
45
+ trigger: DetectedTrigger | null;
46
+ aui: AssistantClient;
47
+ triggerChar: string;
48
+ setCursorPosition: (pos: number) => void;
49
+ /** Called after a successful selection so the parent can reset nav state. */
50
+ onSelected: () => void;
51
+ }): TriggerSelectionResourceOutput => {
52
+ // Select-item override: lets Lexical's DirectivePlugin intercept selection
53
+ // and drive its own node insertion.
54
+ const selectItemOverrideRef = tapRef<SelectItemOverride | null>(null);
55
+
56
+ const registerSelectItemOverride = tapEffectEvent(
57
+ (fn: SelectItemOverride) => {
58
+ selectItemOverrideRef.current = fn;
59
+ return () => {
60
+ if (selectItemOverrideRef.current === fn) {
61
+ selectItemOverrideRef.current = null;
62
+ }
63
+ };
64
+ },
65
+ );
66
+
67
+ const selectItem = tapEffectEvent((item: Unstable_TriggerItem) => {
68
+ if (!trigger || !behavior) return;
69
+
70
+ if (selectItemOverrideRef.current?.(item)) {
71
+ onSelected();
72
+ return;
73
+ }
74
+
75
+ const currentText = aui.composer().getState().text;
76
+ const before = currentText.slice(0, trigger.offset);
77
+ const after = currentText.slice(
78
+ trigger.offset + triggerChar.length + trigger.query.length,
79
+ );
80
+
81
+ const insertDirective = () => {
82
+ const directive = behavior.formatter.serialize(item);
83
+ aui
84
+ .composer()
85
+ .setText(
86
+ before + directive + (after.startsWith(" ") ? after : ` ${after}`),
87
+ );
88
+ };
89
+
90
+ if (behavior.kind === "directive") {
91
+ insertDirective();
92
+ behavior.onInserted?.(item);
93
+ } else {
94
+ if (behavior.removeOnExecute) {
95
+ aui
96
+ .composer()
97
+ .setText(before + (after.startsWith(" ") ? after.slice(1) : after));
98
+ } else {
99
+ // Leave directive chip in the composer as an audit trail
100
+ insertDirective();
101
+ }
102
+ behavior.onExecute(item);
103
+ }
104
+
105
+ onSelected();
106
+ });
107
+
108
+ const close = tapEffectEvent(() => {
109
+ onSelected();
110
+ // Move cursor before the trigger so trigger detection deactivates
111
+ if (trigger) {
112
+ setCursorPosition(trigger.offset);
113
+ }
114
+ });
115
+
116
+ return {
117
+ selectItem,
118
+ close,
119
+ registerSelectItemOverride,
120
+ };
121
+ },
122
+ );
@@ -14,28 +14,18 @@ export { ComposerPrimitiveQuote as Quote } from "./composer/ComposerQuote";
14
14
  export { ComposerPrimitiveQuoteText as QuoteText } from "./composer/ComposerQuote";
15
15
  export { ComposerPrimitiveQuoteDismiss as QuoteDismiss } from "./composer/ComposerQuote";
16
16
  export { ComposerPrimitiveQueue as Queue } from "./composer/ComposerQueue";
17
- export { ComposerPrimitiveMentionRoot as Unstable_MentionRoot } from "./composer/mention";
18
- export { ComposerPrimitiveMentionPopover as Unstable_MentionPopover } from "./composer/mention";
19
- export { ComposerPrimitiveMentionCategories as Unstable_MentionCategories } from "./composer/mention";
20
- export { ComposerPrimitiveMentionCategoryItem as Unstable_MentionCategoryItem } from "./composer/mention";
21
- export { ComposerPrimitiveMentionItems as Unstable_MentionItems } from "./composer/mention";
22
- export { ComposerPrimitiveMentionItem as Unstable_MentionItem } from "./composer/mention";
23
- export { ComposerPrimitiveMentionBack as Unstable_MentionBack } from "./composer/mention";
24
- export { useMentionContext as unstable_useMentionContext } from "./composer/mention";
25
- export { useMentionContextOptional as unstable_useMentionContextOptional } from "./composer/mention";
26
17
 
27
- // --- Generic Trigger Popover primitives (unstable) ---
18
+ export { ComposerPrimitiveTriggerPopover as Unstable_TriggerPopover } from "./composer/trigger";
28
19
  export { ComposerPrimitiveTriggerPopoverRoot as Unstable_TriggerPopoverRoot } from "./composer/trigger";
29
- export { ComposerPrimitiveTriggerPopoverPopover as Unstable_TriggerPopoverPopover } from "./composer/trigger";
30
20
  export { ComposerPrimitiveTriggerPopoverCategories as Unstable_TriggerPopoverCategories } from "./composer/trigger";
31
21
  export { ComposerPrimitiveTriggerPopoverCategoryItem as Unstable_TriggerPopoverCategoryItem } from "./composer/trigger";
32
22
  export { ComposerPrimitiveTriggerPopoverItems as Unstable_TriggerPopoverItems } from "./composer/trigger";
33
23
  export { ComposerPrimitiveTriggerPopoverItem as Unstable_TriggerPopoverItem } from "./composer/trigger";
34
24
  export { ComposerPrimitiveTriggerPopoverBack as Unstable_TriggerPopoverBack } from "./composer/trigger";
35
- export { useTriggerPopoverContext as unstable_useTriggerPopoverContext } from "./composer/trigger";
36
- export { useTriggerPopoverContextOptional as unstable_useTriggerPopoverContextOptional } from "./composer/trigger";
37
-
38
- // --- Slash Command primitives (unstable) ---
39
- // SlashCommandRoot is the only slash-specific primitive; UI primitives
40
- // (Popover, Items, Categories, Back) are the shared TriggerPopover* set above.
41
- export { ComposerPrimitiveSlashCommandRoot as Unstable_SlashCommandRoot } from "./composer/slash-command";
25
+ export { useTriggerPopoverRootContext as unstable_useTriggerPopoverRootContext } from "./composer/trigger";
26
+ export { useTriggerPopoverRootContextOptional as unstable_useTriggerPopoverRootContextOptional } from "./composer/trigger";
27
+ export { useTriggerPopoverScopeContext as unstable_useTriggerPopoverScopeContext } from "./composer/trigger";
28
+ export { useTriggerPopoverScopeContextOptional as unstable_useTriggerPopoverScopeContextOptional } from "./composer/trigger";
29
+ export { useTriggerPopoverTriggers as unstable_useTriggerPopoverTriggers } from "./composer/trigger";
30
+ export { useTriggerPopoverTriggersOptional as unstable_useTriggerPopoverTriggersOptional } from "./composer/trigger";
31
+ export type { RegisteredTrigger as Unstable_RegisteredTrigger } from "./composer/trigger";
@@ -0,0 +1,64 @@
1
+ import { renderToStaticMarkup } from "react-dom/server";
2
+ import { describe, expect, it } from "vitest";
3
+ import * as ActionBarMorePrimitive from "./actionBarMore";
4
+ import * as ThreadListItemMorePrimitive from "./threadListItemMore";
5
+
6
+ describe("dropdown menu primitive render props", () => {
7
+ it.each([
8
+ [
9
+ "ActionBarMorePrimitive.Trigger",
10
+ ActionBarMorePrimitive.Root,
11
+ ActionBarMorePrimitive.Trigger,
12
+ ],
13
+ [
14
+ "ThreadListItemMorePrimitive.Trigger",
15
+ ThreadListItemMorePrimitive.Root,
16
+ ThreadListItemMorePrimitive.Trigger,
17
+ ],
18
+ ])("%s render matches asChild", (_name, Root, Trigger) => {
19
+ const renderHtml = renderToStaticMarkup(
20
+ <Root open>
21
+ <Trigger render={<button type="button" className="trigger" />}>
22
+ More
23
+ </Trigger>
24
+ </Root>,
25
+ );
26
+
27
+ const asChildHtml = renderToStaticMarkup(
28
+ <Root open>
29
+ <Trigger asChild>
30
+ <button type="button" className="trigger">
31
+ More
32
+ </button>
33
+ </Trigger>
34
+ </Root>,
35
+ );
36
+
37
+ expect(renderHtml).toBe(asChildHtml);
38
+ });
39
+
40
+ it("accepts render on all affected dropdown menu primitives", () => {
41
+ const actionBarTree = (
42
+ <ActionBarMorePrimitive.Root open>
43
+ <ActionBarMorePrimitive.Trigger render={<button type="button" />} />
44
+ <ActionBarMorePrimitive.Content render={<div />} />
45
+ <ActionBarMorePrimitive.Item render={<div />} />
46
+ <ActionBarMorePrimitive.Separator render={<div />} />
47
+ </ActionBarMorePrimitive.Root>
48
+ );
49
+
50
+ const threadListItemTree = (
51
+ <ThreadListItemMorePrimitive.Root open>
52
+ <ThreadListItemMorePrimitive.Trigger
53
+ render={<button type="button" />}
54
+ />
55
+ <ThreadListItemMorePrimitive.Content render={<div />} />
56
+ <ThreadListItemMorePrimitive.Item render={<div />} />
57
+ <ThreadListItemMorePrimitive.Separator render={<div />} />
58
+ </ThreadListItemMorePrimitive.Root>
59
+ );
60
+
61
+ expect(actionBarTree).toBeTruthy();
62
+ expect(threadListItemTree).toBeTruthy();
63
+ });
64
+ });
@@ -0,0 +1,15 @@
1
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
2
+ import { withRenderProp } from "../utils/Primitive";
3
+
4
+ export const DropdownMenuRenderTrigger = withRenderProp(
5
+ DropdownMenuPrimitive.Trigger,
6
+ );
7
+ export const DropdownMenuRenderContent = withRenderProp(
8
+ DropdownMenuPrimitive.Content,
9
+ );
10
+ export const DropdownMenuRenderItem = withRenderProp(
11
+ DropdownMenuPrimitive.Item,
12
+ );
13
+ export const DropdownMenuRenderSeparator = withRenderProp(
14
+ DropdownMenuPrimitive.Separator,
15
+ );
@@ -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 { useMessageError } from "@assistant-ui/core/react";
6
10
 
7
11
  export namespace ErrorPrimitiveMessage {
@@ -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
 
6
10
  export namespace ErrorPrimitiveRoot {
7
11
  export type Element = ComponentRef<typeof Primitive.div>;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { FC, PropsWithChildren } from "react";
3
+ import type { FC, PropsWithChildren } from "react";
4
4
  import { useMessageError } from "@assistant-ui/core/react";
5
5
 
6
6
  export const MessagePrimitiveError: FC<PropsWithChildren> = ({ children }) => {
@@ -4,7 +4,7 @@ import {
4
4
  type ComponentType,
5
5
  type FC,
6
6
  memo,
7
- PropsWithChildren,
7
+ type PropsWithChildren,
8
8
  useMemo,
9
9
  } from "react";
10
10
  import { useAuiState, useAui } from "@assistant-ui/store";
@@ -4,7 +4,7 @@ import { Primitive } from "../../utils/Primitive";
4
4
  import {
5
5
  type ComponentRef,
6
6
  forwardRef,
7
- ComponentPropsWithoutRef,
7
+ type ComponentPropsWithoutRef,
8
8
  useCallback,
9
9
  } from "react";
10
10
  import { useAui, useAuiState } from "@assistant-ui/store";