@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,58 +1,26 @@
1
- import {
2
- resource,
3
- tapState,
4
- tapMemo,
5
- tapEffectEvent,
6
- tapEffect,
7
- tapRef,
8
- } from "@assistant-ui/tap";
1
+ import { resource, tapEffectEvent, tapResource } from "@assistant-ui/tap";
9
2
  import type {
10
3
  Unstable_TriggerAdapter,
11
4
  Unstable_TriggerCategory,
12
5
  Unstable_TriggerItem,
13
- Unstable_DirectiveFormatter,
14
6
  } from "@assistant-ui/core";
15
7
  import type { AssistantClient } from "@assistant-ui/store";
16
- import { detectTrigger } from "./detectTrigger";
17
-
18
- function isTriggerItem(
19
- x: Unstable_TriggerItem | Unstable_TriggerCategory,
20
- ): x is Unstable_TriggerItem {
21
- return "type" in x;
22
- }
23
-
24
- function matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {
25
- return (
26
- item.id.toLowerCase().includes(lower) ||
27
- item.label.toLowerCase().includes(lower) ||
28
- (item.description?.toLowerCase().includes(lower) ?? false)
29
- );
30
- }
31
-
32
- // =============================================================================
33
- // Types
34
- // =============================================================================
35
-
36
- export type TriggerPopoverKeyEvent = {
37
- readonly key: string;
38
- readonly shiftKey: boolean;
39
- preventDefault(): void;
40
- };
8
+ import { TriggerDetectionResource } from "./triggerDetectionResource";
9
+ import { TriggerKeyboardResource } from "./triggerKeyboardResource";
10
+ import { TriggerNavigationResource } from "./triggerNavigationResource";
11
+ import {
12
+ TriggerSelectionResource,
13
+ type SelectItemOverride,
14
+ type TriggerBehavior,
15
+ } from "./triggerSelectionResource";
41
16
 
42
- export type SelectItemOverride = (item: Unstable_TriggerItem) => boolean;
17
+ export type { SelectItemOverride, TriggerBehavior };
18
+ export type { TriggerPopoverKeyEvent } from "./triggerKeyboardResource";
43
19
 
44
- export type OnSelectBehavior =
45
- | {
46
- type: "insertDirective";
47
- formatter: Unstable_DirectiveFormatter;
48
- }
49
- | {
50
- type: "action";
51
- handler: (item: Unstable_TriggerItem) => void;
52
- };
20
+ /** @deprecated Use `TriggerBehavior`. */
21
+ export type OnSelectBehavior = TriggerBehavior;
53
22
 
54
23
  export type TriggerPopoverResourceOutput = {
55
- // State
56
24
  readonly open: boolean;
57
25
  readonly query: string;
58
26
  readonly activeCategoryId: string | null;
@@ -65,312 +33,105 @@ export type TriggerPopoverResourceOutput = {
65
33
  /** ID of the currently highlighted item (for aria-activedescendant). */
66
34
  readonly highlightedItemId: string | undefined;
67
35
 
68
- // Actions
69
36
  selectCategory(categoryId: string): void;
70
37
  goBack(): void;
71
38
  selectItem(item: Unstable_TriggerItem): void;
72
39
  close(): void;
73
- handleKeyDown(e: TriggerPopoverKeyEvent): boolean;
40
+ /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */
41
+ highlightIndex(index: number): void;
42
+ handleKeyDown(e: {
43
+ readonly key: string;
44
+ readonly shiftKey: boolean;
45
+ preventDefault(): void;
46
+ }): boolean;
74
47
 
75
- // Internal (for ComposerInput integration)
76
48
  setCursorPosition(pos: number): void;
77
49
  registerSelectItemOverride(fn: SelectItemOverride): () => void;
78
50
  };
79
51
 
80
- // =============================================================================
81
- // Resource
82
- // =============================================================================
83
-
52
+ /** Composes detection, navigation, keyboard, and selection sub-resources. */
84
53
  export const TriggerPopoverResource = resource(
85
54
  ({
86
55
  adapter,
87
56
  text,
88
57
  triggerChar,
89
- onSelect,
58
+ behavior,
90
59
  aui,
91
60
  popoverId,
92
61
  }: {
93
62
  adapter: Unstable_TriggerAdapter | undefined;
94
63
  text: string;
95
64
  triggerChar: string;
96
- onSelect: OnSelectBehavior;
65
+ behavior: TriggerBehavior | undefined;
97
66
  aui: AssistantClient;
98
67
  /** Stable ID for accessible element IDs (pass React's useId() from component layer). */
99
68
  popoverId: string;
100
69
  }): TriggerPopoverResourceOutput => {
101
- // -------------------------------------------------------------------------
102
- // Cursor tracking + trigger detection
103
- // -------------------------------------------------------------------------
104
-
105
- const [cursorPosition, setCursorPosition] = tapState(text.length);
106
-
107
- const trigger = tapMemo(() => {
108
- const pos = Math.min(cursorPosition, text.length);
109
- return detectTrigger(text, triggerChar, pos);
110
- }, [cursorPosition, text, triggerChar]);
111
-
112
- const open = trigger !== null && adapter !== undefined;
113
- const query = trigger?.query ?? "";
114
-
115
- // -------------------------------------------------------------------------
116
- // Category navigation
117
- // -------------------------------------------------------------------------
118
-
119
- const [activeCategoryId, setActiveCategoryId] = tapState<string | null>(
120
- null,
70
+ const detection = tapResource(
71
+ TriggerDetectionResource({ text, triggerChar }),
121
72
  );
122
73
 
123
- // Reset when popover closes
124
- tapEffect(() => {
125
- if (!open) setActiveCategoryId(null);
126
- }, [open]);
127
-
128
- const categories = tapMemo<readonly Unstable_TriggerCategory[]>(() => {
129
- if (!open || !adapter) return [];
130
- return adapter.categories();
131
- }, [open, adapter]);
132
-
133
- const effectiveActiveCategoryId = open ? activeCategoryId : null;
134
-
135
- // -------------------------------------------------------------------------
136
- // Items + search
137
- // -------------------------------------------------------------------------
138
-
139
- const allItems = tapMemo<readonly Unstable_TriggerItem[]>(() => {
140
- if (!effectiveActiveCategoryId || !adapter) return [];
141
- return adapter.categoryItems(effectiveActiveCategoryId);
142
- }, [effectiveActiveCategoryId, adapter]);
143
-
144
- const searchResults = tapMemo<
145
- readonly Unstable_TriggerItem[] | null
146
- >(() => {
147
- if (!open || !adapter || effectiveActiveCategoryId) return null;
148
- // If categories exist and query is empty, show categories first (not search)
149
- if (!query && categories.length > 0) return null;
150
- if (adapter.search) return adapter.search(query);
151
-
152
- // Fallback: search all categories manually (reuse already-computed list)
153
- const all: Unstable_TriggerItem[] = [];
154
- const lower = query.toLowerCase();
155
- for (const cat of categories) {
156
- for (const item of adapter.categoryItems(cat.id)) {
157
- if (matchesQuery(item, lower)) {
158
- all.push(item);
159
- }
160
- }
161
- }
162
- return all;
163
- }, [open, adapter, query, effectiveActiveCategoryId, categories]);
164
-
165
- const isSearchMode = searchResults !== null;
166
-
167
- // -------------------------------------------------------------------------
168
- // Filtering
169
- // -------------------------------------------------------------------------
170
-
171
- const filteredCategories = tapMemo(() => {
172
- if (isSearchMode) return [];
173
- if (!query) return categories;
174
- const lower = query.toLowerCase();
175
- return categories.filter((cat) =>
176
- cat.label.toLowerCase().includes(lower),
177
- );
178
- }, [categories, query, isSearchMode]);
179
-
180
- const filteredItems = tapMemo(() => {
181
- if (isSearchMode) return searchResults ?? [];
182
- if (!query) return allItems;
183
- const lower = query.toLowerCase();
184
- return allItems.filter((item) => matchesQuery(item, lower));
185
- }, [allItems, query, isSearchMode, searchResults]);
186
-
187
- // -------------------------------------------------------------------------
188
- // Keyboard navigation
189
- // -------------------------------------------------------------------------
190
-
191
- const [highlightedIndex, setHighlightedIndex] = tapState(0);
192
-
193
- const navigableList = tapMemo(() => {
194
- if (isSearchMode) return searchResults ?? [];
195
- if (effectiveActiveCategoryId) return filteredItems;
196
- return filteredCategories;
197
- }, [
198
- isSearchMode,
199
- searchResults,
200
- effectiveActiveCategoryId,
201
- filteredItems,
202
- filteredCategories,
203
- ]);
204
-
205
- // Reset highlight when list changes
206
- // biome-ignore lint/correctness/useExhaustiveDependencies: intentional reset on list change
207
- tapEffect(() => {
208
- setHighlightedIndex(0);
209
- }, [navigableList]);
210
-
211
- // -------------------------------------------------------------------------
212
- // Select-item override (for Lexical integration)
213
- // -------------------------------------------------------------------------
214
-
215
- const selectItemOverrideRef = tapRef<SelectItemOverride | null>(null);
216
-
217
- const registerSelectItemOverride = tapEffectEvent(
218
- (fn: SelectItemOverride) => {
219
- selectItemOverrideRef.current = fn;
220
- return () => {
221
- if (selectItemOverrideRef.current === fn) {
222
- selectItemOverrideRef.current = null;
223
- }
224
- };
225
- },
74
+ const open =
75
+ detection.trigger !== null &&
76
+ adapter !== undefined &&
77
+ behavior !== undefined;
78
+
79
+ const navigation = tapResource(
80
+ TriggerNavigationResource({
81
+ adapter,
82
+ query: detection.query,
83
+ open,
84
+ }),
226
85
  );
227
86
 
228
- // -------------------------------------------------------------------------
229
- // Actions (stable via tapEffectEvent)
230
- // -------------------------------------------------------------------------
231
-
232
- const selectCategory = tapEffectEvent((categoryId: string) => {
233
- setActiveCategoryId(categoryId);
234
- setHighlightedIndex(0);
235
- });
236
-
237
- const goBack = tapEffectEvent(() => {
238
- setActiveCategoryId(null);
239
- setHighlightedIndex(0);
87
+ const onSelected = tapEffectEvent(() => {
88
+ navigation.goBack();
240
89
  });
241
90
 
242
- const selectItem = tapEffectEvent((item: Unstable_TriggerItem) => {
243
- if (!trigger) return;
244
-
245
- // Try the override first (e.g. Lexical MentionPlugin)
246
- if (selectItemOverrideRef.current?.(item)) {
247
- setActiveCategoryId(null);
248
- setHighlightedIndex(0);
249
- return;
250
- }
251
-
252
- // Behavior depends on the onSelect configuration
253
- if (onSelect.type === "insertDirective") {
254
- // Insert directive text (mention path)
255
- const currentText = aui.composer().getState().text;
256
- const before = currentText.slice(0, trigger.offset);
257
- const after = currentText.slice(
258
- trigger.offset + triggerChar.length + trigger.query.length,
259
- );
260
- const directive = onSelect.formatter.serialize(item);
261
- const newText =
262
- before + directive + (after.startsWith(" ") ? after : ` ${after}`);
263
-
264
- aui.composer().setText(newText);
265
- } else if (onSelect.type === "action") {
266
- // Execute action + clear trigger text (slash command path)
267
- const currentText = aui.composer().getState().text;
268
- const before = currentText.slice(0, trigger.offset);
269
- const after = currentText.slice(
270
- trigger.offset + triggerChar.length + trigger.query.length,
271
- );
272
- const newText = before + after.trimStart();
273
- aui.composer().setText(newText);
274
-
275
- onSelect.handler(item);
276
- }
277
-
278
- setActiveCategoryId(null);
279
- setHighlightedIndex(0);
280
- });
281
-
282
- const close = tapEffectEvent(() => {
283
- setActiveCategoryId(null);
284
- setHighlightedIndex(0);
285
- // Move cursor before the trigger so trigger detection deactivates
286
- if (trigger) {
287
- setCursorPosition(trigger.offset);
288
- }
289
- });
290
-
291
- const handleKeyDown = tapEffectEvent(
292
- (e: TriggerPopoverKeyEvent): boolean => {
293
- if (!open) return false;
294
-
295
- switch (e.key) {
296
- case "ArrowDown": {
297
- e.preventDefault();
298
- setHighlightedIndex((prev) => {
299
- const len = navigableList.length;
300
- if (len === 0) return 0;
301
- return prev < len - 1 ? prev + 1 : 0;
302
- });
303
- return true;
304
- }
305
- case "ArrowUp": {
306
- e.preventDefault();
307
- setHighlightedIndex((prev) => {
308
- const len = navigableList.length;
309
- if (len === 0) return 0;
310
- return prev > 0 ? prev - 1 : len - 1;
311
- });
312
- return true;
313
- }
314
- case "Enter": {
315
- if (e.shiftKey) return false;
316
- e.preventDefault();
317
- const item = navigableList[highlightedIndex];
318
- if (!item) return true;
319
-
320
- if (isTriggerItem(item)) {
321
- selectItem(item);
322
- } else {
323
- selectCategory(item.id);
324
- }
325
- return true;
326
- }
327
- case "Escape": {
328
- e.preventDefault();
329
- close();
330
- return true;
331
- }
332
- case "Backspace": {
333
- if (effectiveActiveCategoryId && query === "") {
334
- e.preventDefault();
335
- goBack();
336
- return true;
337
- }
338
- return false;
339
- }
340
- default:
341
- return false;
342
- }
343
- },
91
+ const selection = tapResource(
92
+ TriggerSelectionResource({
93
+ behavior,
94
+ trigger: detection.trigger,
95
+ aui,
96
+ triggerChar,
97
+ setCursorPosition: detection.setCursorPosition,
98
+ onSelected,
99
+ }),
344
100
  );
345
101
 
346
- // -------------------------------------------------------------------------
347
- // Output
348
- // -------------------------------------------------------------------------
349
-
350
- // Compute highlighted item ID for aria-activedescendant
351
- const highlightedEntry = navigableList[highlightedIndex];
352
- const highlightedItemId =
353
- open && highlightedEntry
354
- ? `${popoverId}-option-${highlightedEntry.id}`
355
- : undefined;
102
+ const keyboard = tapResource(
103
+ TriggerKeyboardResource({
104
+ navigableList: navigation.navigableList,
105
+ isSearchMode: navigation.isSearchMode,
106
+ activeCategoryId: navigation.activeCategoryId,
107
+ query: detection.query,
108
+ popoverId,
109
+ open,
110
+ selectItem: selection.selectItem,
111
+ selectCategory: navigation.selectCategory,
112
+ goBack: navigation.goBack,
113
+ close: selection.close,
114
+ }),
115
+ );
356
116
 
357
117
  return {
358
118
  open,
359
- query,
360
- activeCategoryId: effectiveActiveCategoryId,
361
- categories: filteredCategories,
362
- items: filteredItems,
363
- highlightedIndex,
364
- isSearchMode,
119
+ query: detection.query,
120
+ activeCategoryId: navigation.activeCategoryId,
121
+ categories: navigation.categories,
122
+ items: navigation.items,
123
+ highlightedIndex: keyboard.highlightedIndex,
124
+ isSearchMode: navigation.isSearchMode,
365
125
  popoverId,
366
- highlightedItemId,
367
- selectCategory,
368
- goBack,
369
- selectItem,
370
- close,
371
- handleKeyDown,
372
- setCursorPosition,
373
- registerSelectItemOverride,
126
+ highlightedItemId: keyboard.highlightedItemId,
127
+ selectCategory: navigation.selectCategory,
128
+ goBack: navigation.goBack,
129
+ selectItem: selection.selectItem,
130
+ close: selection.close,
131
+ highlightIndex: keyboard.highlightIndex,
132
+ handleKeyDown: keyboard.handleKeyDown,
133
+ setCursorPosition: detection.setCursorPosition,
134
+ registerSelectItemOverride: selection.registerSelectItemOverride,
374
135
  };
375
136
  },
376
137
  );
@@ -0,0 +1,212 @@
1
+ "use client";
2
+
3
+ import {
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ useMemo,
8
+ useRef,
9
+ useSyncExternalStore,
10
+ type FC,
11
+ type ReactNode,
12
+ } from "react";
13
+ import {
14
+ ComposerInputPluginProvider,
15
+ useComposerInputPluginRegistryOptional,
16
+ } from "../ComposerInputPluginContext";
17
+ import type { TriggerPopoverResourceOutput } from "./TriggerPopoverResource";
18
+ import type { TriggerBehavior } from "./triggerSelectionResource";
19
+
20
+ export type RegisteredTrigger = {
21
+ readonly char: string;
22
+ /** Behavior contributed by a child `TriggerPopover.Directive` / `.Action`. */
23
+ readonly behavior?: TriggerBehavior;
24
+ readonly resource: TriggerPopoverResourceOutput;
25
+ };
26
+
27
+ export type TriggerPopoverLifecycleListener = {
28
+ added(trigger: RegisteredTrigger): void;
29
+ removed(char: string): void;
30
+ };
31
+
32
+ export type TriggerPopoverRootContextValue = {
33
+ register(trigger: RegisteredTrigger): () => void;
34
+ getTriggers(): ReadonlyMap<string, RegisteredTrigger>;
35
+ subscribe(listener: () => void): () => void;
36
+ /** Subscribe to per-trigger add/remove events. */
37
+ subscribeLifecycle(listener: TriggerPopoverLifecycleListener): () => void;
38
+ };
39
+
40
+ const TriggerPopoverRootContext =
41
+ createContext<TriggerPopoverRootContextValue | null>(null);
42
+
43
+ export const useTriggerPopoverRootContext = () => {
44
+ const ctx = useContext(TriggerPopoverRootContext);
45
+ if (!ctx)
46
+ throw new Error(
47
+ "useTriggerPopoverRootContext must be used within ComposerPrimitive.TriggerPopoverRoot",
48
+ );
49
+ return ctx;
50
+ };
51
+
52
+ export const useTriggerPopoverRootContextOptional = () =>
53
+ useContext(TriggerPopoverRootContext);
54
+
55
+ /**
56
+ * Live map of registered triggers, re-rendering on change. Prefer
57
+ * `subscribeLifecycle` for incremental add/remove handling.
58
+ */
59
+ export const useTriggerPopoverTriggers = () => {
60
+ const ctx = useTriggerPopoverRootContext();
61
+ return useSyncExternalStore(ctx.subscribe, ctx.getTriggers, ctx.getTriggers);
62
+ };
63
+
64
+ const EMPTY_TRIGGERS: ReadonlyMap<string, RegisteredTrigger> = new Map();
65
+ const noopSubscribe = () => () => {};
66
+ const getEmptyTriggers = () => EMPTY_TRIGGERS;
67
+
68
+ /** Like `useTriggerPopoverTriggers` but returns an empty map outside a root. */
69
+ export const useTriggerPopoverTriggersOptional = () => {
70
+ const ctx = useTriggerPopoverRootContextOptional();
71
+ return useSyncExternalStore(
72
+ ctx ? ctx.subscribe : noopSubscribe,
73
+ ctx ? ctx.getTriggers : getEmptyTriggers,
74
+ ctx ? ctx.getTriggers : getEmptyTriggers,
75
+ );
76
+ };
77
+
78
+ export namespace ComposerPrimitiveTriggerPopoverRoot {
79
+ export type Props = {
80
+ children: ReactNode;
81
+ };
82
+ }
83
+
84
+ const TriggerPopoverRootInner: FC<
85
+ ComposerPrimitiveTriggerPopoverRoot.Props
86
+ > = ({ children }) => {
87
+ const triggersRef = useRef<ReadonlyMap<string, RegisteredTrigger>>(new Map());
88
+ const listenersRef = useRef<Set<() => void>>(new Set());
89
+ const lifecycleListenersRef = useRef<Set<TriggerPopoverLifecycleListener>>(
90
+ new Set(),
91
+ );
92
+
93
+ const notify = useCallback(() => {
94
+ for (const listener of listenersRef.current) listener();
95
+ }, []);
96
+
97
+ const register = useCallback<TriggerPopoverRootContextValue["register"]>(
98
+ (trigger) => {
99
+ const { char } = trigger;
100
+ if (triggersRef.current.has(char)) {
101
+ if (process.env.NODE_ENV !== "production") {
102
+ console.warn(
103
+ `[assistant-ui] Duplicate TriggerPopover for char "${char}". Ignoring the second registration.`,
104
+ );
105
+ }
106
+ return () => {};
107
+ }
108
+ if (process.env.NODE_ENV !== "production") {
109
+ for (const existing of triggersRef.current.values()) {
110
+ if (
111
+ char.startsWith(existing.char) ||
112
+ existing.char.startsWith(char)
113
+ ) {
114
+ console.warn(
115
+ `[assistant-ui] Trigger prefix collision between "${existing.char}" and "${char}". One char is a prefix of the other; only one will match reliably.`,
116
+ );
117
+ }
118
+ }
119
+ }
120
+ const next = new Map(triggersRef.current);
121
+ next.set(char, trigger);
122
+ triggersRef.current = next;
123
+ notify();
124
+ for (const l of lifecycleListenersRef.current) l.added(trigger);
125
+ return () => {
126
+ const after = new Map(triggersRef.current);
127
+ after.delete(char);
128
+ triggersRef.current = after;
129
+ notify();
130
+ for (const l of lifecycleListenersRef.current) l.removed(char);
131
+ };
132
+ },
133
+ [notify],
134
+ );
135
+
136
+ const getTriggers = useCallback<
137
+ TriggerPopoverRootContextValue["getTriggers"]
138
+ >(() => triggersRef.current, []);
139
+
140
+ const subscribe = useCallback<TriggerPopoverRootContextValue["subscribe"]>(
141
+ (listener) => {
142
+ listenersRef.current.add(listener);
143
+ return () => {
144
+ listenersRef.current.delete(listener);
145
+ };
146
+ },
147
+ [],
148
+ );
149
+
150
+ const subscribeLifecycle = useCallback<
151
+ TriggerPopoverRootContextValue["subscribeLifecycle"]
152
+ >((listener) => {
153
+ lifecycleListenersRef.current.add(listener);
154
+ return () => {
155
+ lifecycleListenersRef.current.delete(listener);
156
+ };
157
+ }, []);
158
+
159
+ const value = useMemo<TriggerPopoverRootContextValue>(
160
+ () => ({ register, getTriggers, subscribe, subscribeLifecycle }),
161
+ [register, getTriggers, subscribe, subscribeLifecycle],
162
+ );
163
+
164
+ return (
165
+ <TriggerPopoverRootContext.Provider value={value}>
166
+ {children}
167
+ </TriggerPopoverRootContext.Provider>
168
+ );
169
+ };
170
+
171
+ /**
172
+ * Provider that groups one or more `TriggerPopover` declarations. Each trigger
173
+ * is identified by its `char` (unique within the root). Behavior is contributed
174
+ * by a child `TriggerPopover.Directive` or `TriggerPopover.Action`.
175
+ *
176
+ * @example
177
+ * ```tsx
178
+ * <ComposerPrimitive.Unstable_TriggerPopoverRoot>
179
+ * <ComposerPrimitive.Unstable_TriggerPopover char="@" adapter={mentionAdapter}>
180
+ * <ComposerPrimitive.Unstable_TriggerPopover.Directive formatter={formatter} />
181
+ * ...
182
+ * </ComposerPrimitive.Unstable_TriggerPopover>
183
+ *
184
+ * <ComposerPrimitive.Unstable_TriggerPopover char="/" adapter={slashAdapter}>
185
+ * <ComposerPrimitive.Unstable_TriggerPopover.Action onExecute={handler} />
186
+ * ...
187
+ * </ComposerPrimitive.Unstable_TriggerPopover>
188
+ *
189
+ * <ComposerPrimitive.Root>
190
+ * <ComposerPrimitive.Input />
191
+ * </ComposerPrimitive.Root>
192
+ * </ComposerPrimitive.Unstable_TriggerPopoverRoot>
193
+ * ```
194
+ */
195
+ export const ComposerPrimitiveTriggerPopoverRoot: FC<
196
+ ComposerPrimitiveTriggerPopoverRoot.Props
197
+ > = ({ children }) => {
198
+ const existingRegistry = useComposerInputPluginRegistryOptional();
199
+
200
+ if (existingRegistry) {
201
+ return <TriggerPopoverRootInner>{children}</TriggerPopoverRootInner>;
202
+ }
203
+
204
+ return (
205
+ <ComposerInputPluginProvider>
206
+ <TriggerPopoverRootInner>{children}</TriggerPopoverRootInner>
207
+ </ComposerInputPluginProvider>
208
+ );
209
+ };
210
+
211
+ ComposerPrimitiveTriggerPopoverRoot.displayName =
212
+ "ComposerPrimitive.TriggerPopoverRoot";
@@ -75,4 +75,40 @@ describe("detectTrigger", () => {
75
75
  offset: 6,
76
76
  });
77
77
  });
78
+
79
+ it("treats U+3000 full-width space before trigger as boundary", () => {
80
+ expect(detectTrigger("全角\u3000@foo", "@", 7)).toEqual({
81
+ query: "foo",
82
+ offset: 3,
83
+ });
84
+ });
85
+
86
+ it("treats U+00A0 NBSP before trigger as boundary", () => {
87
+ expect(detectTrigger("x\u00A0@foo", "@", 6)).toEqual({
88
+ query: "foo",
89
+ offset: 2,
90
+ });
91
+ });
92
+
93
+ it("stops at U+3000 full-width space inside query", () => {
94
+ expect(detectTrigger("@foo\u3000bar", "@", 8)).toBeNull();
95
+ });
96
+
97
+ it("IME full-width space before trigger char acts as boundary", () => {
98
+ expect(detectTrigger("hello\u3000@foo", "@", 10)).toEqual({
99
+ query: "foo",
100
+ offset: 6,
101
+ });
102
+ });
103
+
104
+ it("NBSP between word and trigger acts as boundary", () => {
105
+ expect(detectTrigger("hello\u00a0@foo", "@", 10)).toEqual({
106
+ query: "foo",
107
+ offset: 6,
108
+ });
109
+ });
110
+
111
+ it("full-width trigger char does NOT match ASCII trigger (literal comparison)", () => {
112
+ expect(detectTrigger("hello \uff20foo", "@", 10)).toBeNull();
113
+ });
78
114
  });