@assistant-ui/react 0.12.17 → 0.12.20

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 (508) hide show
  1. package/README.md +1 -1
  2. package/dist/client/ExternalThread.d.ts +24 -3
  3. package/dist/client/ExternalThread.d.ts.map +1 -1
  4. package/dist/client/ExternalThread.js +107 -27
  5. package/dist/client/ExternalThread.js.map +1 -1
  6. package/dist/client/InMemoryThreadList.js +23 -30
  7. package/dist/client/InMemoryThreadList.js.map +1 -1
  8. package/dist/client/SingleThreadList.d.ts +12 -0
  9. package/dist/client/SingleThreadList.d.ts.map +1 -0
  10. package/dist/client/SingleThreadList.js +68 -0
  11. package/dist/client/SingleThreadList.js.map +1 -0
  12. package/dist/context/index.d.ts +19 -3
  13. package/dist/context/index.d.ts.map +1 -1
  14. package/dist/context/index.js +18 -3
  15. package/dist/context/index.js.map +1 -1
  16. package/dist/context/react/ThreadViewportContext.d.ts +1 -1
  17. package/dist/context/react/ThreadViewportContext.d.ts.map +1 -1
  18. package/dist/hooks/useMessageQuote.d.ts.map +1 -1
  19. package/dist/hooks/useMessageQuote.js +2 -1
  20. package/dist/hooks/useMessageQuote.js.map +1 -1
  21. package/dist/index.d.ts +96 -8
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +101 -8
  24. package/dist/index.js.map +1 -1
  25. package/dist/internal.d.ts +2 -1
  26. package/dist/internal.d.ts.map +1 -1
  27. package/dist/internal.js +2 -1
  28. package/dist/internal.js.map +1 -1
  29. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -1
  30. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  31. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts +1 -1
  32. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  33. package/dist/legacy-runtime/hooks/ThreadContext.d.ts +1 -1
  34. package/dist/legacy-runtime/hooks/ThreadContext.d.ts.map +1 -1
  35. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +1 -1
  36. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  37. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.js.map +1 -1
  38. package/dist/primitives/actionBar/ActionBarSpeak.d.ts.map +1 -1
  39. package/dist/primitives/actionBar/ActionBarSpeak.js +4 -13
  40. package/dist/primitives/actionBar/ActionBarSpeak.js.map +1 -1
  41. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts.map +1 -1
  42. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +4 -9
  43. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  44. package/dist/primitives/actionBar.d.ts +10 -0
  45. package/dist/primitives/actionBar.d.ts.map +1 -0
  46. package/dist/primitives/actionBar.js +10 -0
  47. package/dist/primitives/actionBar.js.map +1 -0
  48. package/dist/primitives/actionBarMore.d.ts +6 -0
  49. package/dist/primitives/actionBarMore.d.ts.map +1 -0
  50. package/dist/primitives/actionBarMore.js +6 -0
  51. package/dist/primitives/actionBarMore.js.map +1 -0
  52. package/dist/primitives/assistantModal.d.ts +5 -0
  53. package/dist/primitives/assistantModal.d.ts.map +1 -0
  54. package/dist/primitives/assistantModal.js +5 -0
  55. package/dist/primitives/assistantModal.js.map +1 -0
  56. package/dist/primitives/attachment/AttachmentThumb.js +1 -1
  57. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  58. package/dist/primitives/attachment.d.ts +5 -0
  59. package/dist/primitives/attachment.d.ts.map +1 -0
  60. package/dist/primitives/attachment.js +5 -0
  61. package/dist/primitives/attachment.js.map +1 -0
  62. package/dist/primitives/branchPicker/BranchPickerNext.d.ts.map +1 -1
  63. package/dist/primitives/branchPicker/BranchPickerNext.js +3 -17
  64. package/dist/primitives/branchPicker/BranchPickerNext.js.map +1 -1
  65. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts +0 -21
  66. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts.map +1 -1
  67. package/dist/primitives/branchPicker/BranchPickerPrevious.js +3 -38
  68. package/dist/primitives/branchPicker/BranchPickerPrevious.js.map +1 -1
  69. package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -1
  70. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  71. package/dist/primitives/branchPicker.d.ts +6 -0
  72. package/dist/primitives/branchPicker.d.ts.map +1 -0
  73. package/dist/primitives/branchPicker.js +6 -0
  74. package/dist/primitives/branchPicker.js.map +1 -0
  75. package/dist/primitives/chainOfThought.d.ts +4 -0
  76. package/dist/primitives/chainOfThought.d.ts.map +1 -0
  77. package/dist/primitives/chainOfThought.js +4 -0
  78. package/dist/primitives/chainOfThought.js.map +1 -0
  79. package/dist/primitives/composer/ComposerDictate.d.ts.map +1 -1
  80. package/dist/primitives/composer/ComposerDictate.js +3 -10
  81. package/dist/primitives/composer/ComposerDictate.js.map +1 -1
  82. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  83. package/dist/primitives/composer/ComposerInput.js +37 -7
  84. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  85. package/dist/primitives/composer/ComposerQueue.d.ts +2 -0
  86. package/dist/primitives/composer/ComposerQueue.d.ts.map +1 -0
  87. package/dist/primitives/composer/ComposerQueue.js +3 -0
  88. package/dist/primitives/composer/ComposerQueue.js.map +1 -0
  89. package/dist/primitives/composer/ComposerSend.d.ts.map +1 -1
  90. package/dist/primitives/composer/ComposerSend.js +3 -1
  91. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  92. package/dist/primitives/composer/mention/ComposerMentionBack.d.ts +21 -0
  93. package/dist/primitives/composer/mention/ComposerMentionBack.d.ts.map +1 -0
  94. package/dist/primitives/composer/mention/ComposerMentionBack.js +28 -0
  95. package/dist/primitives/composer/mention/ComposerMentionBack.js.map +1 -0
  96. package/dist/primitives/composer/mention/ComposerMentionCategories.d.ts +42 -0
  97. package/dist/primitives/composer/mention/ComposerMentionCategories.d.ts.map +1 -0
  98. package/dist/primitives/composer/mention/ComposerMentionCategories.js +32 -0
  99. package/dist/primitives/composer/mention/ComposerMentionCategories.js.map +1 -0
  100. package/dist/primitives/composer/mention/ComposerMentionContext.d.ts +23 -0
  101. package/dist/primitives/composer/mention/ComposerMentionContext.d.ts.map +1 -0
  102. package/dist/primitives/composer/mention/ComposerMentionContext.js +66 -0
  103. package/dist/primitives/composer/mention/ComposerMentionContext.js.map +1 -0
  104. package/dist/primitives/composer/mention/ComposerMentionItems.d.ts +46 -0
  105. package/dist/primitives/composer/mention/ComposerMentionItems.d.ts.map +1 -0
  106. package/dist/primitives/composer/mention/ComposerMentionItems.js +30 -0
  107. package/dist/primitives/composer/mention/ComposerMentionItems.js.map +1 -0
  108. package/dist/primitives/composer/mention/ComposerMentionPopover.d.ts +24 -0
  109. package/dist/primitives/composer/mention/ComposerMentionPopover.d.ts.map +1 -0
  110. package/dist/primitives/composer/mention/ComposerMentionPopover.js +28 -0
  111. package/dist/primitives/composer/mention/ComposerMentionPopover.js.map +1 -0
  112. package/dist/primitives/composer/mention/MentionResource.d.ts +39 -0
  113. package/dist/primitives/composer/mention/MentionResource.d.ts.map +1 -0
  114. package/dist/primitives/composer/mention/MentionResource.js +230 -0
  115. package/dist/primitives/composer/mention/MentionResource.js.map +1 -0
  116. package/dist/primitives/composer/mention/detectMentionTrigger.d.ts +2 -0
  117. package/dist/primitives/composer/mention/detectMentionTrigger.d.ts.map +1 -0
  118. package/dist/primitives/composer/mention/detectMentionTrigger.js +26 -0
  119. package/dist/primitives/composer/mention/detectMentionTrigger.js.map +1 -0
  120. package/dist/primitives/composer/mention/index.d.ts +6 -0
  121. package/dist/primitives/composer/mention/index.d.ts.map +1 -0
  122. package/dist/primitives/composer/mention/index.js +6 -0
  123. package/dist/primitives/composer/mention/index.js.map +1 -0
  124. package/dist/primitives/composer.d.ts +26 -0
  125. package/dist/primitives/composer.d.ts.map +1 -0
  126. package/dist/primitives/composer.js +26 -0
  127. package/dist/primitives/composer.js.map +1 -0
  128. package/dist/primitives/error/ErrorMessage.d.ts.map +1 -1
  129. package/dist/primitives/error/ErrorMessage.js +2 -7
  130. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  131. package/dist/primitives/error.d.ts +3 -0
  132. package/dist/primitives/error.d.ts.map +1 -0
  133. package/dist/primitives/error.js +3 -0
  134. package/dist/primitives/error.js.map +1 -0
  135. package/dist/primitives/message/MessageError.d.ts.map +1 -1
  136. package/dist/primitives/message/MessageError.js +3 -4
  137. package/dist/primitives/message/MessageError.js.map +1 -1
  138. package/dist/primitives/message/MessageParts.d.ts.map +1 -1
  139. package/dist/primitives/message/MessageParts.js +6 -1
  140. package/dist/primitives/message/MessageParts.js.map +1 -1
  141. package/dist/primitives/message/MessagePartsGrouped.d.ts +1 -1
  142. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  143. package/dist/primitives/message/MessagePartsGrouped.js +2 -1
  144. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  145. package/dist/primitives/message.d.ts +11 -0
  146. package/dist/primitives/message.d.ts.map +1 -0
  147. package/dist/primitives/message.js +11 -0
  148. package/dist/primitives/message.js.map +1 -0
  149. package/dist/primitives/messagePart.d.ts +5 -0
  150. package/dist/primitives/messagePart.d.ts.map +1 -0
  151. package/dist/primitives/messagePart.js +5 -0
  152. package/dist/primitives/messagePart.js.map +1 -0
  153. package/dist/primitives/queueItem/QueueItemRemove.d.ts +19 -0
  154. package/dist/primitives/queueItem/QueueItemRemove.d.ts.map +1 -0
  155. package/dist/primitives/queueItem/QueueItemRemove.js +21 -0
  156. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -0
  157. package/dist/primitives/queueItem/QueueItemSteer.d.ts +19 -0
  158. package/dist/primitives/queueItem/QueueItemSteer.d.ts.map +1 -0
  159. package/dist/primitives/queueItem/QueueItemSteer.js +21 -0
  160. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -0
  161. package/dist/primitives/queueItem/QueueItemText.d.ts +18 -0
  162. package/dist/primitives/queueItem/QueueItemText.d.ts.map +1 -0
  163. package/dist/primitives/queueItem/QueueItemText.js +19 -0
  164. package/dist/primitives/queueItem/QueueItemText.js.map +1 -0
  165. package/dist/primitives/queueItem.d.ts +4 -0
  166. package/dist/primitives/queueItem.d.ts.map +1 -0
  167. package/dist/primitives/queueItem.js +4 -0
  168. package/dist/primitives/queueItem.js.map +1 -0
  169. package/dist/primitives/selectionToolbar.d.ts +3 -0
  170. package/dist/primitives/selectionToolbar.d.ts.map +1 -0
  171. package/dist/primitives/selectionToolbar.js +3 -0
  172. package/dist/primitives/selectionToolbar.js.map +1 -0
  173. package/dist/primitives/suggestion.d.ts +4 -0
  174. package/dist/primitives/suggestion.d.ts.map +1 -0
  175. package/dist/primitives/suggestion.js +4 -0
  176. package/dist/primitives/suggestion.js.map +1 -0
  177. package/dist/primitives/thread/ThreadRoot.d.ts +3 -1
  178. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  179. package/dist/primitives/thread/ThreadRoot.js +3 -1
  180. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  181. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  182. package/dist/primitives/thread/ThreadSuggestion.js +8 -29
  183. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  184. package/dist/primitives/thread/ThreadViewport.d.ts +3 -1
  185. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  186. package/dist/primitives/thread/ThreadViewport.js +3 -1
  187. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  188. package/dist/primitives/thread/ThreadViewportFooter.d.ts +3 -1
  189. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  190. package/dist/primitives/thread/ThreadViewportFooter.js +3 -1
  191. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  192. package/dist/primitives/thread.d.ts +13 -0
  193. package/dist/primitives/thread.d.ts.map +1 -0
  194. package/dist/primitives/thread.js +13 -0
  195. package/dist/primitives/thread.js.map +1 -0
  196. package/dist/primitives/threadList/ThreadListNew.d.ts.map +1 -1
  197. package/dist/primitives/threadList/ThreadListNew.js +4 -5
  198. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  199. package/dist/primitives/threadList.d.ts +5 -0
  200. package/dist/primitives/threadList.d.ts.map +1 -0
  201. package/dist/primitives/threadList.js +5 -0
  202. package/dist/primitives/threadList.js.map +1 -0
  203. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts.map +1 -1
  204. package/dist/primitives/threadListItem/ThreadListItemArchive.js +3 -6
  205. package/dist/primitives/threadListItem/ThreadListItemArchive.js.map +1 -1
  206. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts.map +1 -1
  207. package/dist/primitives/threadListItem/ThreadListItemDelete.js +3 -6
  208. package/dist/primitives/threadListItem/ThreadListItemDelete.js.map +1 -1
  209. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts.map +1 -1
  210. package/dist/primitives/threadListItem/ThreadListItemTrigger.js +3 -6
  211. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  212. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  213. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js +3 -6
  214. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
  215. package/dist/primitives/threadListItem.d.ts +7 -0
  216. package/dist/primitives/threadListItem.d.ts.map +1 -0
  217. package/dist/primitives/threadListItem.js +7 -0
  218. package/dist/primitives/threadListItem.js.map +1 -0
  219. package/dist/primitives/threadListItemMore.d.ts +6 -0
  220. package/dist/primitives/threadListItemMore.d.ts.map +1 -0
  221. package/dist/primitives/threadListItemMore.js +6 -0
  222. package/dist/primitives/threadListItemMore.js.map +1 -0
  223. package/dist/unstable/useToolMentionAdapter.d.ts +42 -0
  224. package/dist/unstable/useToolMentionAdapter.d.ts.map +1 -0
  225. package/dist/unstable/useToolMentionAdapter.js +65 -0
  226. package/dist/unstable/useToolMentionAdapter.js.map +1 -0
  227. package/package.json +12 -12
  228. package/src/client/ExternalThread.ts +161 -32
  229. package/src/client/InMemoryThreadList.ts +24 -35
  230. package/src/client/SingleThreadList.ts +95 -0
  231. package/src/context/index.ts +67 -3
  232. package/src/context/react/ThreadViewportContext.ts +1 -1
  233. package/src/hooks/useMessageQuote.ts +3 -7
  234. package/src/index.ts +357 -8
  235. package/src/internal.ts +5 -1
  236. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +1 -1
  237. package/src/legacy-runtime/cloud/useCloudThreadListRuntime.ts +1 -1
  238. package/src/legacy-runtime/hooks/MessageContext.ts +1 -1
  239. package/src/legacy-runtime/hooks/ThreadContext.ts +2 -2
  240. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +4 -1
  241. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +1 -1
  242. package/src/model-context/frame/SPEC_AssistantFrame.md +2 -2
  243. package/src/primitives/actionBar/ActionBarSpeak.ts +4 -17
  244. package/src/primitives/actionBar/ActionBarStopSpeaking.tsx +4 -12
  245. package/src/primitives/actionBar.ts +9 -0
  246. package/src/primitives/actionBarMore.ts +5 -0
  247. package/src/primitives/assistantModal.ts +4 -0
  248. package/src/primitives/attachment/AttachmentThumb.tsx +1 -1
  249. package/src/primitives/attachment.ts +4 -0
  250. package/src/primitives/branchPicker/BranchPickerNext.ts +3 -20
  251. package/src/primitives/branchPicker/BranchPickerPrevious.ts +3 -41
  252. package/src/primitives/branchPicker/BranchPickerRoot.tsx +1 -1
  253. package/src/primitives/branchPicker.ts +5 -0
  254. package/src/primitives/{chainOfThought/index.ts → chainOfThought.ts} +3 -3
  255. package/src/primitives/composer/ComposerDictate.ts +3 -15
  256. package/src/primitives/composer/ComposerInput.tsx +49 -5
  257. package/src/primitives/composer/ComposerQueue.tsx +3 -0
  258. package/src/primitives/composer/ComposerSend.ts +3 -1
  259. package/src/primitives/composer/mention/ComposerMentionBack.tsx +55 -0
  260. package/src/primitives/composer/mention/ComposerMentionCategories.tsx +104 -0
  261. package/src/primitives/composer/mention/ComposerMentionContext.tsx +141 -0
  262. package/src/primitives/composer/mention/ComposerMentionItems.tsx +104 -0
  263. package/src/primitives/composer/mention/ComposerMentionPopover.tsx +52 -0
  264. package/src/primitives/composer/mention/MentionResource.ts +328 -0
  265. package/src/primitives/composer/mention/detectMentionTrigger.test.ts +78 -0
  266. package/src/primitives/composer/mention/detectMentionTrigger.ts +37 -0
  267. package/src/primitives/composer/mention/index.ts +16 -0
  268. package/src/primitives/composer.ts +25 -0
  269. package/src/primitives/error/ErrorMessage.tsx +2 -7
  270. package/src/primitives/error.ts +2 -0
  271. package/src/primitives/message/MessageError.ts +3 -7
  272. package/src/primitives/message/MessageParts.tsx +11 -4
  273. package/src/primitives/message/MessagePartsGrouped.tsx +3 -5
  274. package/src/primitives/message.ts +13 -0
  275. package/src/primitives/messagePart.ts +4 -0
  276. package/src/primitives/queueItem/QueueItemRemove.ts +37 -0
  277. package/src/primitives/queueItem/QueueItemSteer.ts +37 -0
  278. package/src/primitives/queueItem/QueueItemText.tsx +37 -0
  279. package/src/primitives/queueItem.ts +3 -0
  280. package/src/primitives/{selectionToolbar/index.ts → selectionToolbar.ts} +2 -2
  281. package/src/primitives/suggestion.ts +3 -0
  282. package/src/primitives/thread/ThreadRoot.tsx +3 -1
  283. package/src/primitives/thread/ThreadSuggestion.ts +8 -30
  284. package/src/primitives/thread/ThreadViewport.tsx +3 -1
  285. package/src/primitives/thread/ThreadViewportFooter.tsx +3 -1
  286. package/src/primitives/thread.ts +15 -0
  287. package/src/primitives/threadList/ThreadListNew.tsx +4 -5
  288. package/src/primitives/threadList.ts +4 -0
  289. package/src/primitives/threadListItem/ThreadListItemArchive.ts +3 -6
  290. package/src/primitives/threadListItem/ThreadListItemDelete.ts +3 -6
  291. package/src/primitives/threadListItem/ThreadListItemTrigger.ts +3 -6
  292. package/src/primitives/threadListItem/ThreadListItemUnarchive.ts +3 -6
  293. package/src/primitives/threadListItem.ts +6 -0
  294. package/src/primitives/threadListItemMore.ts +5 -0
  295. package/src/unstable/useToolMentionAdapter.ts +114 -0
  296. package/dist/client/index.d.ts +0 -7
  297. package/dist/client/index.d.ts.map +0 -1
  298. package/dist/client/index.js +0 -10
  299. package/dist/client/index.js.map +0 -1
  300. package/dist/context/providers/index.d.ts +0 -10
  301. package/dist/context/providers/index.d.ts.map +0 -1
  302. package/dist/context/providers/index.js +0 -10
  303. package/dist/context/providers/index.js.map +0 -1
  304. package/dist/context/react/index.d.ts +0 -9
  305. package/dist/context/react/index.d.ts.map +0 -1
  306. package/dist/context/react/index.js +0 -10
  307. package/dist/context/react/index.js.map +0 -1
  308. package/dist/context/stores/index.d.ts +0 -2
  309. package/dist/context/stores/index.d.ts.map +0 -1
  310. package/dist/context/stores/index.js +0 -2
  311. package/dist/context/stores/index.js.map +0 -1
  312. package/dist/devtools/index.d.ts +0 -2
  313. package/dist/devtools/index.d.ts.map +0 -1
  314. package/dist/devtools/index.js +0 -2
  315. package/dist/devtools/index.js.map +0 -1
  316. package/dist/legacy-runtime/cloud/index.d.ts +0 -3
  317. package/dist/legacy-runtime/cloud/index.d.ts.map +0 -1
  318. package/dist/legacy-runtime/cloud/index.js +0 -3
  319. package/dist/legacy-runtime/cloud/index.js.map +0 -1
  320. package/dist/legacy-runtime/runtime/index.d.ts +0 -2
  321. package/dist/legacy-runtime/runtime/index.d.ts.map +0 -1
  322. package/dist/legacy-runtime/runtime/index.js +0 -2
  323. package/dist/legacy-runtime/runtime/index.js.map +0 -1
  324. package/dist/legacy-runtime/runtime-cores/adapters/attachment/index.d.ts +0 -4
  325. package/dist/legacy-runtime/runtime-cores/adapters/attachment/index.d.ts.map +0 -1
  326. package/dist/legacy-runtime/runtime-cores/adapters/attachment/index.js +0 -4
  327. package/dist/legacy-runtime/runtime-cores/adapters/attachment/index.js.map +0 -1
  328. package/dist/legacy-runtime/runtime-cores/adapters/feedback/index.d.ts +0 -2
  329. package/dist/legacy-runtime/runtime-cores/adapters/feedback/index.d.ts.map +0 -1
  330. package/dist/legacy-runtime/runtime-cores/adapters/feedback/index.js +0 -2
  331. package/dist/legacy-runtime/runtime-cores/adapters/feedback/index.js.map +0 -1
  332. package/dist/legacy-runtime/runtime-cores/adapters/index.d.ts +0 -7
  333. package/dist/legacy-runtime/runtime-cores/adapters/index.d.ts.map +0 -1
  334. package/dist/legacy-runtime/runtime-cores/adapters/index.js +0 -7
  335. package/dist/legacy-runtime/runtime-cores/adapters/index.js.map +0 -1
  336. package/dist/legacy-runtime/runtime-cores/adapters/speech/index.d.ts +0 -3
  337. package/dist/legacy-runtime/runtime-cores/adapters/speech/index.d.ts.map +0 -1
  338. package/dist/legacy-runtime/runtime-cores/adapters/speech/index.js +0 -2
  339. package/dist/legacy-runtime/runtime-cores/adapters/speech/index.js.map +0 -1
  340. package/dist/legacy-runtime/runtime-cores/adapters/suggestion/index.d.ts +0 -2
  341. package/dist/legacy-runtime/runtime-cores/adapters/suggestion/index.d.ts.map +0 -1
  342. package/dist/legacy-runtime/runtime-cores/adapters/suggestion/index.js +0 -2
  343. package/dist/legacy-runtime/runtime-cores/adapters/suggestion/index.js.map +0 -1
  344. package/dist/legacy-runtime/runtime-cores/adapters/thread-history/index.d.ts +0 -2
  345. package/dist/legacy-runtime/runtime-cores/adapters/thread-history/index.d.ts.map +0 -1
  346. package/dist/legacy-runtime/runtime-cores/adapters/thread-history/index.js +0 -2
  347. package/dist/legacy-runtime/runtime-cores/adapters/thread-history/index.js.map +0 -1
  348. package/dist/legacy-runtime/runtime-cores/assistant-transport/index.d.ts +0 -3
  349. package/dist/legacy-runtime/runtime-cores/assistant-transport/index.d.ts.map +0 -1
  350. package/dist/legacy-runtime/runtime-cores/assistant-transport/index.js +0 -2
  351. package/dist/legacy-runtime/runtime-cores/assistant-transport/index.js.map +0 -1
  352. package/dist/legacy-runtime/runtime-cores/core/index.d.ts +0 -2
  353. package/dist/legacy-runtime/runtime-cores/core/index.d.ts.map +0 -1
  354. package/dist/legacy-runtime/runtime-cores/core/index.js +0 -2
  355. package/dist/legacy-runtime/runtime-cores/core/index.js.map +0 -1
  356. package/dist/legacy-runtime/runtime-cores/external-store/index.d.ts +0 -7
  357. package/dist/legacy-runtime/runtime-cores/external-store/index.d.ts.map +0 -1
  358. package/dist/legacy-runtime/runtime-cores/external-store/index.js +0 -6
  359. package/dist/legacy-runtime/runtime-cores/external-store/index.js.map +0 -1
  360. package/dist/legacy-runtime/runtime-cores/index.d.ts +0 -9
  361. package/dist/legacy-runtime/runtime-cores/index.d.ts.map +0 -1
  362. package/dist/legacy-runtime/runtime-cores/index.js +0 -8
  363. package/dist/legacy-runtime/runtime-cores/index.js.map +0 -1
  364. package/dist/legacy-runtime/runtime-cores/local/index.d.ts +0 -8
  365. package/dist/legacy-runtime/runtime-cores/local/index.d.ts.map +0 -1
  366. package/dist/legacy-runtime/runtime-cores/local/index.js +0 -7
  367. package/dist/legacy-runtime/runtime-cores/local/index.js.map +0 -1
  368. package/dist/legacy-runtime/runtime-cores/remote-thread-list/index.d.ts +0 -5
  369. package/dist/legacy-runtime/runtime-cores/remote-thread-list/index.d.ts.map +0 -1
  370. package/dist/legacy-runtime/runtime-cores/remote-thread-list/index.js +0 -5
  371. package/dist/legacy-runtime/runtime-cores/remote-thread-list/index.js.map +0 -1
  372. package/dist/model-context/frame/index.d.ts +0 -6
  373. package/dist/model-context/frame/index.d.ts.map +0 -1
  374. package/dist/model-context/frame/index.js +0 -5
  375. package/dist/model-context/frame/index.js.map +0 -1
  376. package/dist/model-context/index.d.ts +0 -10
  377. package/dist/model-context/index.d.ts.map +0 -1
  378. package/dist/model-context/index.js +0 -11
  379. package/dist/model-context/index.js.map +0 -1
  380. package/dist/model-context/registry/index.d.ts +0 -3
  381. package/dist/model-context/registry/index.d.ts.map +0 -1
  382. package/dist/model-context/registry/index.js +0 -2
  383. package/dist/model-context/registry/index.js.map +0 -1
  384. package/dist/primitives/actionBar/index.d.ts +0 -10
  385. package/dist/primitives/actionBar/index.d.ts.map +0 -1
  386. package/dist/primitives/actionBar/index.js +0 -10
  387. package/dist/primitives/actionBar/index.js.map +0 -1
  388. package/dist/primitives/actionBarMore/index.d.ts +0 -6
  389. package/dist/primitives/actionBarMore/index.d.ts.map +0 -1
  390. package/dist/primitives/actionBarMore/index.js +0 -6
  391. package/dist/primitives/actionBarMore/index.js.map +0 -1
  392. package/dist/primitives/assistantModal/index.d.ts +0 -5
  393. package/dist/primitives/assistantModal/index.d.ts.map +0 -1
  394. package/dist/primitives/assistantModal/index.js +0 -5
  395. package/dist/primitives/assistantModal/index.js.map +0 -1
  396. package/dist/primitives/attachment/index.d.ts +0 -5
  397. package/dist/primitives/attachment/index.d.ts.map +0 -1
  398. package/dist/primitives/attachment/index.js +0 -5
  399. package/dist/primitives/attachment/index.js.map +0 -1
  400. package/dist/primitives/branchPicker/index.d.ts +0 -6
  401. package/dist/primitives/branchPicker/index.d.ts.map +0 -1
  402. package/dist/primitives/branchPicker/index.js +0 -6
  403. package/dist/primitives/branchPicker/index.js.map +0 -1
  404. package/dist/primitives/chainOfThought/index.d.ts +0 -4
  405. package/dist/primitives/chainOfThought/index.d.ts.map +0 -1
  406. package/dist/primitives/chainOfThought/index.js +0 -4
  407. package/dist/primitives/chainOfThought/index.js.map +0 -1
  408. package/dist/primitives/composer/index.d.ts +0 -16
  409. package/dist/primitives/composer/index.d.ts.map +0 -1
  410. package/dist/primitives/composer/index.js +0 -16
  411. package/dist/primitives/composer/index.js.map +0 -1
  412. package/dist/primitives/error/index.d.ts +0 -3
  413. package/dist/primitives/error/index.d.ts.map +0 -1
  414. package/dist/primitives/error/index.js +0 -3
  415. package/dist/primitives/error/index.js.map +0 -1
  416. package/dist/primitives/index.d.ts +0 -27
  417. package/dist/primitives/index.d.ts.map +0 -1
  418. package/dist/primitives/index.js +0 -27
  419. package/dist/primitives/index.js.map +0 -1
  420. package/dist/primitives/message/index.d.ts +0 -10
  421. package/dist/primitives/message/index.d.ts.map +0 -1
  422. package/dist/primitives/message/index.js +0 -10
  423. package/dist/primitives/message/index.js.map +0 -1
  424. package/dist/primitives/messagePart/index.d.ts +0 -4
  425. package/dist/primitives/messagePart/index.d.ts.map +0 -1
  426. package/dist/primitives/messagePart/index.js +0 -4
  427. package/dist/primitives/messagePart/index.js.map +0 -1
  428. package/dist/primitives/reasoning/index.d.ts +0 -2
  429. package/dist/primitives/reasoning/index.d.ts.map +0 -1
  430. package/dist/primitives/reasoning/index.js +0 -2
  431. package/dist/primitives/reasoning/index.js.map +0 -1
  432. package/dist/primitives/selectionToolbar/index.d.ts +0 -3
  433. package/dist/primitives/selectionToolbar/index.d.ts.map +0 -1
  434. package/dist/primitives/selectionToolbar/index.js +0 -3
  435. package/dist/primitives/selectionToolbar/index.js.map +0 -1
  436. package/dist/primitives/suggestion/index.d.ts +0 -4
  437. package/dist/primitives/suggestion/index.d.ts.map +0 -1
  438. package/dist/primitives/suggestion/index.js +0 -4
  439. package/dist/primitives/suggestion/index.js.map +0 -1
  440. package/dist/primitives/thread/index.d.ts +0 -13
  441. package/dist/primitives/thread/index.d.ts.map +0 -1
  442. package/dist/primitives/thread/index.js +0 -13
  443. package/dist/primitives/thread/index.js.map +0 -1
  444. package/dist/primitives/threadList/index.d.ts +0 -5
  445. package/dist/primitives/threadList/index.d.ts.map +0 -1
  446. package/dist/primitives/threadList/index.js +0 -5
  447. package/dist/primitives/threadList/index.js.map +0 -1
  448. package/dist/primitives/threadListItem/index.d.ts +0 -7
  449. package/dist/primitives/threadListItem/index.d.ts.map +0 -1
  450. package/dist/primitives/threadListItem/index.js +0 -7
  451. package/dist/primitives/threadListItem/index.js.map +0 -1
  452. package/dist/primitives/threadListItemMore/index.d.ts +0 -6
  453. package/dist/primitives/threadListItemMore/index.d.ts.map +0 -1
  454. package/dist/primitives/threadListItemMore/index.js +0 -6
  455. package/dist/primitives/threadListItemMore/index.js.map +0 -1
  456. package/dist/types/index.d.ts +0 -4
  457. package/dist/types/index.d.ts.map +0 -1
  458. package/dist/types/index.js +0 -2
  459. package/dist/types/index.js.map +0 -1
  460. package/dist/types/scopes/index.d.ts +0 -3
  461. package/dist/types/scopes/index.d.ts.map +0 -1
  462. package/dist/types/scopes/index.js +0 -2
  463. package/dist/types/scopes/index.js.map +0 -1
  464. package/dist/utils/smooth/index.d.ts +0 -3
  465. package/dist/utils/smooth/index.d.ts.map +0 -1
  466. package/dist/utils/smooth/index.js +0 -6
  467. package/dist/utils/smooth/index.js.map +0 -1
  468. package/src/client/index.ts +0 -18
  469. package/src/context/providers/index.ts +0 -15
  470. package/src/context/react/index.ts +0 -50
  471. package/src/context/stores/index.ts +0 -1
  472. package/src/devtools/index.ts +0 -1
  473. package/src/legacy-runtime/cloud/index.ts +0 -2
  474. package/src/legacy-runtime/runtime/index.ts +0 -25
  475. package/src/legacy-runtime/runtime-cores/adapters/attachment/index.ts +0 -10
  476. package/src/legacy-runtime/runtime-cores/adapters/feedback/index.ts +0 -2
  477. package/src/legacy-runtime/runtime-cores/adapters/index.ts +0 -6
  478. package/src/legacy-runtime/runtime-cores/adapters/speech/index.ts +0 -9
  479. package/src/legacy-runtime/runtime-cores/adapters/suggestion/index.ts +0 -2
  480. package/src/legacy-runtime/runtime-cores/adapters/thread-history/index.ts +0 -9
  481. package/src/legacy-runtime/runtime-cores/assistant-transport/index.ts +0 -11
  482. package/src/legacy-runtime/runtime-cores/core/index.ts +0 -7
  483. package/src/legacy-runtime/runtime-cores/external-store/index.ts +0 -21
  484. package/src/legacy-runtime/runtime-cores/index.ts +0 -10
  485. package/src/legacy-runtime/runtime-cores/local/index.ts +0 -18
  486. package/src/legacy-runtime/runtime-cores/remote-thread-list/index.ts +0 -7
  487. package/src/model-context/frame/index.ts +0 -10
  488. package/src/model-context/index.ts +0 -45
  489. package/src/model-context/registry/index.ts +0 -6
  490. package/src/primitives/actionBar/index.ts +0 -9
  491. package/src/primitives/actionBarMore/index.ts +0 -5
  492. package/src/primitives/assistantModal/index.ts +0 -4
  493. package/src/primitives/attachment/index.ts +0 -4
  494. package/src/primitives/branchPicker/index.ts +0 -5
  495. package/src/primitives/composer/index.ts +0 -15
  496. package/src/primitives/error/index.ts +0 -2
  497. package/src/primitives/index.ts +0 -27
  498. package/src/primitives/message/index.ts +0 -12
  499. package/src/primitives/messagePart/index.ts +0 -3
  500. package/src/primitives/reasoning/index.ts +0 -1
  501. package/src/primitives/suggestion/index.ts +0 -3
  502. package/src/primitives/thread/index.ts +0 -15
  503. package/src/primitives/threadList/index.ts +0 -4
  504. package/src/primitives/threadListItem/index.ts +0 -6
  505. package/src/primitives/threadListItemMore/index.ts +0 -5
  506. package/src/types/index.ts +0 -56
  507. package/src/types/scopes/index.ts +0 -59
  508. package/src/utils/smooth/index.ts +0 -6
@@ -0,0 +1,328 @@
1
+ import {
2
+ resource,
3
+ tapState,
4
+ tapMemo,
5
+ tapEffectEvent,
6
+ tapEffect,
7
+ tapRef,
8
+ } from "@assistant-ui/tap";
9
+ import type {
10
+ Unstable_MentionAdapter,
11
+ Unstable_MentionCategory,
12
+ Unstable_MentionItem,
13
+ Unstable_DirectiveFormatter,
14
+ } from "@assistant-ui/core";
15
+ import type { AssistantClient } from "@assistant-ui/store";
16
+ import { detectMentionTrigger } from "./detectMentionTrigger";
17
+
18
+ // =============================================================================
19
+ // Types
20
+ // =============================================================================
21
+
22
+ export type MentionKeyEvent = {
23
+ readonly key: string;
24
+ readonly shiftKey: boolean;
25
+ preventDefault(): void;
26
+ };
27
+
28
+ export type SelectItemOverride = (item: Unstable_MentionItem) => boolean;
29
+
30
+ export type MentionResourceOutput = {
31
+ // State
32
+ readonly open: boolean;
33
+ readonly query: string;
34
+ readonly activeCategoryId: string | null;
35
+ readonly categories: readonly Unstable_MentionCategory[];
36
+ readonly items: readonly Unstable_MentionItem[];
37
+ readonly highlightedIndex: number;
38
+ readonly isSearchMode: boolean;
39
+ readonly formatter: Unstable_DirectiveFormatter;
40
+
41
+ // Actions
42
+ selectCategory(categoryId: string): void;
43
+ goBack(): void;
44
+ selectItem(item: Unstable_MentionItem): void;
45
+ close(): void;
46
+ handleKeyDown(e: MentionKeyEvent): boolean;
47
+
48
+ // Internal (for ComposerInput integration)
49
+ setCursorPosition(pos: number): void;
50
+ registerSelectItemOverride(fn: SelectItemOverride): () => void;
51
+ };
52
+
53
+ // =============================================================================
54
+ // Resource
55
+ // =============================================================================
56
+
57
+ export const MentionResource = resource(
58
+ ({
59
+ adapter,
60
+ text,
61
+ triggerChar,
62
+ formatter,
63
+ aui,
64
+ }: {
65
+ adapter: Unstable_MentionAdapter | undefined;
66
+ text: string;
67
+ triggerChar: string;
68
+ formatter: Unstable_DirectiveFormatter;
69
+ aui: AssistantClient;
70
+ }): MentionResourceOutput => {
71
+ // -------------------------------------------------------------------------
72
+ // Cursor tracking + trigger detection
73
+ // -------------------------------------------------------------------------
74
+
75
+ const [cursorPosition, setCursorPosition] = tapState(text.length);
76
+
77
+ const trigger = tapMemo(() => {
78
+ const pos = Math.min(cursorPosition, text.length);
79
+ return detectMentionTrigger(text, triggerChar, pos);
80
+ }, [cursorPosition, text, triggerChar]);
81
+
82
+ const open = trigger !== null && adapter !== undefined;
83
+ const query = trigger?.query ?? "";
84
+
85
+ // -------------------------------------------------------------------------
86
+ // Category navigation
87
+ // -------------------------------------------------------------------------
88
+
89
+ const [activeCategoryId, setActiveCategoryId] = tapState<string | null>(
90
+ null,
91
+ );
92
+
93
+ // Reset when popover closes
94
+ tapEffect(() => {
95
+ if (!open) setActiveCategoryId(null);
96
+ }, [open]);
97
+
98
+ const categories = tapMemo<readonly Unstable_MentionCategory[]>(() => {
99
+ if (!open || !adapter) return [];
100
+ return adapter.categories();
101
+ }, [open, adapter]);
102
+
103
+ const effectiveActiveCategoryId = open ? activeCategoryId : null;
104
+
105
+ // -------------------------------------------------------------------------
106
+ // Items + search
107
+ // -------------------------------------------------------------------------
108
+
109
+ const allItems = tapMemo<readonly Unstable_MentionItem[]>(() => {
110
+ if (!effectiveActiveCategoryId || !adapter) return [];
111
+ return adapter.categoryItems(effectiveActiveCategoryId);
112
+ }, [effectiveActiveCategoryId, adapter]);
113
+
114
+ const searchResults = tapMemo<
115
+ readonly Unstable_MentionItem[] | null
116
+ >(() => {
117
+ if (!open || !adapter || !query || effectiveActiveCategoryId) return null;
118
+ if (adapter.search) return adapter.search(query);
119
+
120
+ const cats = adapter.categories();
121
+ const all: Unstable_MentionItem[] = [];
122
+ const lower = query.toLowerCase();
123
+ for (const cat of cats) {
124
+ for (const item of adapter.categoryItems(cat.id)) {
125
+ if (
126
+ item.id.toLowerCase().includes(lower) ||
127
+ item.label.toLowerCase().includes(lower) ||
128
+ item.description?.toLowerCase().includes(lower)
129
+ ) {
130
+ all.push(item);
131
+ }
132
+ }
133
+ }
134
+ return all;
135
+ }, [open, adapter, query, effectiveActiveCategoryId]);
136
+
137
+ const isSearchMode = searchResults !== null;
138
+
139
+ // -------------------------------------------------------------------------
140
+ // Filtering
141
+ // -------------------------------------------------------------------------
142
+
143
+ const filteredCategories = tapMemo(() => {
144
+ if (isSearchMode) return [];
145
+ if (!query) return categories;
146
+ const lower = query.toLowerCase();
147
+ return categories.filter((cat) =>
148
+ cat.label.toLowerCase().includes(lower),
149
+ );
150
+ }, [categories, query, isSearchMode]);
151
+
152
+ const filteredItems = tapMemo(() => {
153
+ if (isSearchMode) return searchResults ?? [];
154
+ if (!query) return allItems;
155
+ const lower = query.toLowerCase();
156
+ return allItems.filter(
157
+ (item) =>
158
+ item.id.toLowerCase().includes(lower) ||
159
+ item.label.toLowerCase().includes(lower) ||
160
+ item.description?.toLowerCase().includes(lower),
161
+ );
162
+ }, [allItems, query, isSearchMode, searchResults]);
163
+
164
+ // -------------------------------------------------------------------------
165
+ // Keyboard navigation
166
+ // -------------------------------------------------------------------------
167
+
168
+ const [highlightedIndex, setHighlightedIndex] = tapState(0);
169
+
170
+ const navigableList = tapMemo(() => {
171
+ if (isSearchMode) return searchResults ?? [];
172
+ if (effectiveActiveCategoryId) return filteredItems;
173
+ return filteredCategories;
174
+ }, [
175
+ isSearchMode,
176
+ searchResults,
177
+ effectiveActiveCategoryId,
178
+ filteredItems,
179
+ filteredCategories,
180
+ ]);
181
+
182
+ // Reset highlight when list changes
183
+ // biome-ignore lint/correctness/useExhaustiveDependencies: intentional reset on list change
184
+ tapEffect(() => {
185
+ setHighlightedIndex(0);
186
+ }, [navigableList]);
187
+
188
+ // -------------------------------------------------------------------------
189
+ // Lexical select-item override
190
+ // -------------------------------------------------------------------------
191
+
192
+ const selectItemOverrideRef = tapRef<SelectItemOverride | null>(null);
193
+
194
+ const registerSelectItemOverride = tapEffectEvent(
195
+ (fn: SelectItemOverride) => {
196
+ selectItemOverrideRef.current = fn;
197
+ return () => {
198
+ if (selectItemOverrideRef.current === fn) {
199
+ selectItemOverrideRef.current = null;
200
+ }
201
+ };
202
+ },
203
+ );
204
+
205
+ // -------------------------------------------------------------------------
206
+ // Actions (stable via tapEffectEvent)
207
+ // -------------------------------------------------------------------------
208
+
209
+ const selectCategory = tapEffectEvent((categoryId: string) => {
210
+ setActiveCategoryId(categoryId);
211
+ setHighlightedIndex(0);
212
+ });
213
+
214
+ const goBack = tapEffectEvent(() => {
215
+ setActiveCategoryId(null);
216
+ setHighlightedIndex(0);
217
+ });
218
+
219
+ const selectItem = tapEffectEvent((item: Unstable_MentionItem) => {
220
+ if (!trigger) return;
221
+
222
+ // Try the Lexical override first
223
+ if (selectItemOverrideRef.current?.(item)) {
224
+ setActiveCategoryId(null);
225
+ setHighlightedIndex(0);
226
+ return;
227
+ }
228
+
229
+ // Default: text-based replacement (textarea path)
230
+ const currentText = aui.composer().getState().text;
231
+ const before = currentText.slice(0, trigger.offset);
232
+ const after = currentText.slice(
233
+ trigger.offset + triggerChar.length + trigger.query.length,
234
+ );
235
+ const directive = formatter.serialize(item);
236
+ const newText =
237
+ before + directive + (after.startsWith(" ") ? after : ` ${after}`);
238
+
239
+ aui.composer().setText(newText);
240
+ setActiveCategoryId(null);
241
+ setHighlightedIndex(0);
242
+ });
243
+
244
+ const close = tapEffectEvent(() => {
245
+ setActiveCategoryId(null);
246
+ setHighlightedIndex(0);
247
+ // Move cursor before the trigger so trigger detection deactivates
248
+ if (trigger) {
249
+ setCursorPosition(trigger.offset);
250
+ }
251
+ });
252
+
253
+ const handleKeyDown = tapEffectEvent((e: MentionKeyEvent): boolean => {
254
+ if (!open) return false;
255
+
256
+ switch (e.key) {
257
+ case "ArrowDown": {
258
+ e.preventDefault();
259
+ setHighlightedIndex((prev) => {
260
+ const len = navigableList.length;
261
+ if (len === 0) return 0;
262
+ return prev < len - 1 ? prev + 1 : 0;
263
+ });
264
+ return true;
265
+ }
266
+ case "ArrowUp": {
267
+ e.preventDefault();
268
+ setHighlightedIndex((prev) => {
269
+ const len = navigableList.length;
270
+ if (len === 0) return 0;
271
+ return prev > 0 ? prev - 1 : len - 1;
272
+ });
273
+ return true;
274
+ }
275
+ case "Enter": {
276
+ if (e.shiftKey) return false;
277
+ e.preventDefault();
278
+ const item = navigableList[highlightedIndex];
279
+ if (!item) return true;
280
+
281
+ if (isSearchMode || effectiveActiveCategoryId) {
282
+ selectItem(item as Unstable_MentionItem);
283
+ } else {
284
+ selectCategory((item as Unstable_MentionCategory).id);
285
+ }
286
+ return true;
287
+ }
288
+ case "Escape": {
289
+ e.preventDefault();
290
+ close();
291
+ return true;
292
+ }
293
+ case "Backspace": {
294
+ if (effectiveActiveCategoryId && query === "") {
295
+ e.preventDefault();
296
+ goBack();
297
+ return true;
298
+ }
299
+ return false;
300
+ }
301
+ default:
302
+ return false;
303
+ }
304
+ });
305
+
306
+ // -------------------------------------------------------------------------
307
+ // Output
308
+ // -------------------------------------------------------------------------
309
+
310
+ return {
311
+ open,
312
+ query,
313
+ activeCategoryId: effectiveActiveCategoryId,
314
+ categories: filteredCategories,
315
+ items: filteredItems,
316
+ highlightedIndex,
317
+ isSearchMode,
318
+ formatter,
319
+ selectCategory,
320
+ goBack,
321
+ selectItem,
322
+ close,
323
+ handleKeyDown,
324
+ setCursorPosition,
325
+ registerSelectItemOverride,
326
+ };
327
+ },
328
+ );
@@ -0,0 +1,78 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { detectMentionTrigger } from "./detectMentionTrigger";
3
+
4
+ describe("detectMentionTrigger", () => {
5
+ it("detects @query at cursor position", () => {
6
+ expect(detectMentionTrigger("hello @wea", "@", 10)).toEqual({
7
+ query: "wea",
8
+ offset: 6,
9
+ });
10
+ });
11
+
12
+ it("returns null when cursor is before the trigger", () => {
13
+ expect(detectMentionTrigger("hello @weather", "@", 5)).toBeNull();
14
+ });
15
+
16
+ it("returns null when no trigger character", () => {
17
+ expect(detectMentionTrigger("hello world", "@", 11)).toBeNull();
18
+ });
19
+
20
+ it("requires whitespace or start before trigger", () => {
21
+ expect(detectMentionTrigger("email@test", "@", 10)).toBeNull();
22
+ });
23
+
24
+ it("trigger at start of text", () => {
25
+ expect(detectMentionTrigger("@foo", "@", 4)).toEqual({
26
+ query: "foo",
27
+ offset: 0,
28
+ });
29
+ });
30
+
31
+ it("stops at whitespace in query", () => {
32
+ // "@foo bar" — space terminates the mention
33
+ expect(detectMentionTrigger("@foo bar", "@", 8)).toBeNull();
34
+ });
35
+
36
+ it("stops at newline", () => {
37
+ expect(detectMentionTrigger("@foo\nbar", "@", 8)).toBeNull();
38
+ });
39
+
40
+ it("stops at tab", () => {
41
+ expect(detectMentionTrigger("@foo\tbar", "@", 8)).toBeNull();
42
+ });
43
+
44
+ it("treats tab before trigger as valid boundary", () => {
45
+ expect(detectMentionTrigger("hello\t@foo", "@", 10)).toEqual({
46
+ query: "foo",
47
+ offset: 6,
48
+ });
49
+ });
50
+
51
+ it("finds trigger closest to cursor, not earlier ones", () => {
52
+ // Text has two @: "hello @old text @new"
53
+ // Cursor at end → should find @new
54
+ expect(detectMentionTrigger("hello @old text @new", "@", 20)).toEqual({
55
+ query: "new",
56
+ offset: 16,
57
+ });
58
+ });
59
+
60
+ it("ignores trigger after cursor", () => {
61
+ // Cursor at position 5, trigger at position 10
62
+ expect(detectMentionTrigger("hello text @foo", "@", 5)).toBeNull();
63
+ });
64
+
65
+ it("works with multi-char trigger", () => {
66
+ expect(detectMentionTrigger("hello @@foo", "@@", 11)).toEqual({
67
+ query: "foo",
68
+ offset: 6,
69
+ });
70
+ });
71
+
72
+ it("empty query when cursor is right after trigger", () => {
73
+ expect(detectMentionTrigger("hello @", "@", 7)).toEqual({
74
+ query: "",
75
+ offset: 6,
76
+ });
77
+ });
78
+ });
@@ -0,0 +1,37 @@
1
+ const WHITESPACE_RE = /\s/;
2
+
3
+ /**
4
+ * Detect a mention trigger in text relative to the cursor position.
5
+ *
6
+ * @internal Exported for testing and for the MentionResource.
7
+ */
8
+ export function detectMentionTrigger(
9
+ text: string,
10
+ triggerChar: string,
11
+ cursorPosition: number,
12
+ ): {
13
+ query: string;
14
+ offset: number;
15
+ } | null {
16
+ // Only consider text up to the cursor
17
+ const textUpToCursor = text.slice(0, cursorPosition);
18
+
19
+ // Search backwards from cursor for the trigger character.
20
+ // Stop at any whitespace during scan — trigger must be contiguous with cursor.
21
+ for (let i = textUpToCursor.length - 1; i >= 0; i--) {
22
+ const char = textUpToCursor[i]!;
23
+
24
+ if (WHITESPACE_RE.test(char)) return null;
25
+
26
+ if (textUpToCursor.startsWith(triggerChar, i)) {
27
+ // Trigger must be preceded by whitespace or be at start of text
28
+ if (i > 0 && !WHITESPACE_RE.test(textUpToCursor[i - 1]!)) continue;
29
+
30
+ const query = textUpToCursor.slice(i + triggerChar.length);
31
+
32
+ return { query, offset: i };
33
+ }
34
+ }
35
+
36
+ return null;
37
+ }
@@ -0,0 +1,16 @@
1
+ export {
2
+ ComposerPrimitiveMentionRoot,
3
+ useMentionContext,
4
+ useMentionContextOptional,
5
+ useMentionInternalContext,
6
+ } from "./ComposerMentionContext";
7
+ export { ComposerPrimitiveMentionPopover } from "./ComposerMentionPopover";
8
+ export {
9
+ ComposerPrimitiveMentionCategories,
10
+ ComposerPrimitiveMentionCategoryItem,
11
+ } from "./ComposerMentionCategories";
12
+ export {
13
+ ComposerPrimitiveMentionItems,
14
+ ComposerPrimitiveMentionItem,
15
+ } from "./ComposerMentionItems";
16
+ export { ComposerPrimitiveMentionBack } from "./ComposerMentionBack";
@@ -0,0 +1,25 @@
1
+ export { ComposerPrimitiveRoot as Root } from "./composer/ComposerRoot";
2
+ export { ComposerPrimitiveInput as Input } from "./composer/ComposerInput";
3
+ export { ComposerPrimitiveSend as Send } from "./composer/ComposerSend";
4
+ export { ComposerPrimitiveCancel as Cancel } from "./composer/ComposerCancel";
5
+ export { ComposerPrimitiveAddAttachment as AddAttachment } from "./composer/ComposerAddAttachment";
6
+ export { ComposerPrimitiveAttachments as Attachments } from "./composer/ComposerAttachments";
7
+ export { ComposerPrimitiveAttachmentByIndex as AttachmentByIndex } from "./composer/ComposerAttachments";
8
+ export { ComposerPrimitiveAttachmentDropzone as AttachmentDropzone } from "./composer/ComposerAttachmentDropzone";
9
+ export { ComposerPrimitiveDictate as Dictate } from "./composer/ComposerDictate";
10
+ export { ComposerPrimitiveStopDictation as StopDictation } from "./composer/ComposerStopDictation";
11
+ export { ComposerPrimitiveDictationTranscript as DictationTranscript } from "./composer/ComposerDictationTranscript";
12
+ export { ComposerPrimitiveIf as If } from "./composer/ComposerIf";
13
+ export { ComposerPrimitiveQuote as Quote } from "./composer/ComposerQuote";
14
+ export { ComposerPrimitiveQuoteText as QuoteText } from "./composer/ComposerQuote";
15
+ export { ComposerPrimitiveQuoteDismiss as QuoteDismiss } from "./composer/ComposerQuote";
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";
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { Primitive } from "@radix-ui/react-primitive";
4
4
  import { type ComponentRef, forwardRef, ComponentPropsWithoutRef } from "react";
5
- import { useAuiState } from "@assistant-ui/store";
5
+ import { useMessageError } from "@assistant-ui/core/react";
6
6
 
7
7
  export namespace ErrorPrimitiveMessage {
8
8
  export type Element = ComponentRef<typeof Primitive.span>;
@@ -13,12 +13,7 @@ export const ErrorPrimitiveMessage = forwardRef<
13
13
  ErrorPrimitiveMessage.Element,
14
14
  ErrorPrimitiveMessage.Props
15
15
  >(({ children, ...props }, forwardRef) => {
16
- const error = useAuiState((s) => {
17
- return s.message.status?.type === "incomplete" &&
18
- s.message.status.reason === "error"
19
- ? s.message.status.error
20
- : undefined;
21
- });
16
+ const error = useMessageError();
22
17
 
23
18
  if (error === undefined) return null;
24
19
 
@@ -0,0 +1,2 @@
1
+ export { ErrorPrimitiveRoot as Root } from "./error/ErrorRoot";
2
+ export { ErrorPrimitiveMessage as Message } from "./error/ErrorMessage";
@@ -1,15 +1,11 @@
1
1
  "use client";
2
2
 
3
3
  import { FC, PropsWithChildren } from "react";
4
- import { useAuiState } from "@assistant-ui/store";
4
+ import { useMessageError } from "@assistant-ui/core/react";
5
5
 
6
6
  export const MessagePrimitiveError: FC<PropsWithChildren> = ({ children }) => {
7
- const hasError = useAuiState(
8
- (s) =>
9
- s.message.status?.type === "incomplete" &&
10
- s.message.status.reason === "error",
11
- );
12
- return hasError ? children : null;
7
+ const error = useMessageError();
8
+ return error !== undefined ? children : null;
13
9
  };
14
10
 
15
11
  MessagePrimitiveError.displayName = "MessagePrimitive.Error";
@@ -31,10 +31,16 @@ export namespace MessagePrimitiveParts {
31
31
  /**
32
32
  * Renders the parts of a message with web-specific default components.
33
33
  */
34
- export const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props> = ({
35
- components,
36
- ...rest
37
- }) => {
34
+ export const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props> = (
35
+ props,
36
+ ) => {
37
+ if ("children" in props) {
38
+ return (
39
+ <MessagePrimitivePartsBase>{props.children}</MessagePrimitivePartsBase>
40
+ );
41
+ }
42
+
43
+ const { components, ...rest } = props;
38
44
  const merged = components
39
45
  ? {
40
46
  Text: components.Text ?? webDefaultComponents.Text,
@@ -58,6 +64,7 @@ export const MessagePrimitiveParts: FC<MessagePrimitiveParts.Props> = ({
58
64
  messagePartsDefaultComponents.ReasoningGroup,
59
65
  }),
60
66
  Empty: components.Empty,
67
+ Quote: components.Quote,
61
68
  }
62
69
  : webDefaultComponents;
63
70
 
@@ -8,10 +8,8 @@ import {
8
8
  useMemo,
9
9
  } from "react";
10
10
  import { useAuiState, useAui } from "@assistant-ui/store";
11
- import {
12
- PartByIndexProvider,
13
- TextMessagePartProvider,
14
- } from "../../context/providers";
11
+ import { PartByIndexProvider } from "../../context/providers/PartByIndexProvider";
12
+ import { TextMessagePartProvider } from "../../context/providers/TextMessagePartProvider";
15
13
  import { MessagePartPrimitiveText } from "../messagePart/MessagePartText";
16
14
  import { MessagePartPrimitiveImage } from "../messagePart/MessagePartImage";
17
15
  import type {
@@ -26,7 +24,7 @@ import type {
26
24
  ToolCallMessagePartProps,
27
25
  FileMessagePartComponent,
28
26
  ReasoningMessagePartComponent,
29
- } from "../../types";
27
+ } from "@assistant-ui/core/react";
30
28
  import { MessagePartPrimitiveInProgress } from "../messagePart/MessagePartInProgress";
31
29
  import type { MessagePartStatus } from "@assistant-ui/core";
32
30
 
@@ -0,0 +1,13 @@
1
+ export { MessagePrimitiveRoot as Root } from "./message/MessageRoot";
2
+ export { MessagePrimitiveParts as Parts } from "./message/MessageParts";
3
+ export { MessagePrimitivePartByIndex as PartByIndex } from "./message/MessageParts";
4
+ export { MessagePrimitiveParts as Content } from "./message/MessageParts";
5
+ export { MessagePrimitiveIf as If } from "./message/MessageIf";
6
+ export { MessagePrimitiveAttachments as Attachments } from "./message/MessageAttachments";
7
+ export { MessagePrimitiveAttachmentByIndex as AttachmentByIndex } from "./message/MessageAttachments";
8
+ export { MessagePrimitiveQuote as Quote } from "@assistant-ui/core/react";
9
+ export { MessagePrimitiveError as Error } from "./message/MessageError";
10
+ export {
11
+ MessagePrimitiveUnstable_PartsGrouped as Unstable_PartsGrouped,
12
+ MessagePrimitiveUnstable_PartsGroupedByParentId as Unstable_PartsGroupedByParentId,
13
+ } from "./message/MessagePartsGrouped";
@@ -0,0 +1,4 @@
1
+ export { MessagePartPrimitiveText as Text } from "./messagePart/MessagePartText";
2
+ export { MessagePartPrimitiveImage as Image } from "./messagePart/MessagePartImage";
3
+ export { MessagePartPrimitiveInProgress as InProgress } from "./messagePart/MessagePartInProgress";
4
+ export { PartPrimitiveMessages as Messages } from "@assistant-ui/core/react";
@@ -0,0 +1,37 @@
1
+ "use client";
2
+
3
+ import {
4
+ ActionButtonElement,
5
+ ActionButtonProps,
6
+ createActionButton,
7
+ } from "../../utils/createActionButton";
8
+ import { useAui } from "@assistant-ui/store";
9
+ import { useCallback } from "react";
10
+
11
+ const useQueueItemRemove = () => {
12
+ const aui = useAui();
13
+
14
+ const callback = useCallback(() => {
15
+ aui.queueItem().remove();
16
+ }, [aui]);
17
+
18
+ return callback;
19
+ };
20
+
21
+ export namespace QueueItemPrimitiveRemove {
22
+ export type Element = ActionButtonElement;
23
+ export type Props = ActionButtonProps<typeof useQueueItemRemove>;
24
+ }
25
+
26
+ /**
27
+ * A button that removes this item from the queue.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * <QueueItemPrimitive.Remove>×</QueueItemPrimitive.Remove>
32
+ * ```
33
+ */
34
+ export const QueueItemPrimitiveRemove = createActionButton(
35
+ "QueueItemPrimitive.Remove",
36
+ useQueueItemRemove,
37
+ );
@@ -0,0 +1,37 @@
1
+ "use client";
2
+
3
+ import {
4
+ ActionButtonElement,
5
+ ActionButtonProps,
6
+ createActionButton,
7
+ } from "../../utils/createActionButton";
8
+ import { useAui } from "@assistant-ui/store";
9
+ import { useCallback } from "react";
10
+
11
+ const useQueueItemSteer = () => {
12
+ const aui = useAui();
13
+
14
+ const callback = useCallback(() => {
15
+ aui.queueItem().steer();
16
+ }, [aui]);
17
+
18
+ return callback;
19
+ };
20
+
21
+ export namespace QueueItemPrimitiveSteer {
22
+ export type Element = ActionButtonElement;
23
+ export type Props = ActionButtonProps<typeof useQueueItemSteer>;
24
+ }
25
+
26
+ /**
27
+ * A button that steers the current run to process this queue item immediately.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * <QueueItemPrimitive.Steer>Run Now</QueueItemPrimitive.Steer>
32
+ * ```
33
+ */
34
+ export const QueueItemPrimitiveSteer = createActionButton(
35
+ "QueueItemPrimitive.Steer",
36
+ useQueueItemSteer,
37
+ );