@assistant-ui/react 0.14.16 → 0.14.19

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 (380) hide show
  1. package/dist/client/ExternalThread.d.ts +5 -3
  2. package/dist/client/ExternalThread.d.ts.map +1 -1
  3. package/dist/client/ExternalThread.js +745 -255
  4. package/dist/client/ExternalThread.js.map +1 -1
  5. package/dist/client/InMemoryThreadList.d.ts +1 -1
  6. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  7. package/dist/client/InMemoryThreadList.js +299 -113
  8. package/dist/client/InMemoryThreadList.js.map +1 -1
  9. package/dist/client/SingleThreadList.d.ts +1 -6
  10. package/dist/client/SingleThreadList.d.ts.map +1 -1
  11. package/dist/client/SingleThreadList.js +143 -55
  12. package/dist/client/SingleThreadList.js.map +1 -1
  13. package/dist/context/ReadonlyStore.js.map +1 -1
  14. package/dist/context/providers/MessageProvider.js +38 -5
  15. package/dist/context/providers/MessageProvider.js.map +1 -1
  16. package/dist/context/providers/ThreadViewportProvider.js +76 -20
  17. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  18. package/dist/context/react/ThreadViewportContext.js.map +1 -1
  19. package/dist/context/react/utils/createContextHook.js.map +1 -1
  20. package/dist/context/react/utils/createContextStoreHook.js +17 -2
  21. package/dist/context/react/utils/createContextStoreHook.js.map +1 -1
  22. package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -1
  23. package/dist/context/react/utils/ensureBinding.js.map +1 -1
  24. package/dist/context/react/utils/useRuntimeState.js +18 -2
  25. package/dist/context/react/utils/useRuntimeState.js.map +1 -1
  26. package/dist/context/stores/ThreadViewport.js.map +1 -1
  27. package/dist/devtools/DevToolsHooks.js.map +1 -1
  28. package/dist/hooks/useMessageQuote.js.map +1 -1
  29. package/dist/hooks/useMessageTiming.js +4 -1
  30. package/dist/hooks/useMessageTiming.js.map +1 -1
  31. package/dist/hooks/useToolCallElapsed.d.ts +23 -0
  32. package/dist/hooks/useToolCallElapsed.d.ts.map +1 -0
  33. package/dist/hooks/useToolCallElapsed.js +72 -0
  34. package/dist/hooks/useToolCallElapsed.js.map +1 -0
  35. package/dist/index.d.ts +6 -2
  36. package/dist/index.js +5 -1
  37. package/dist/internal.js.map +1 -1
  38. package/dist/legacy-runtime/AssistantRuntimeProvider.js +46 -10
  39. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  40. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  41. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js +27 -6
  42. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js.map +1 -1
  43. package/dist/legacy-runtime/hooks/AssistantContext.js +13 -2
  44. package/dist/legacy-runtime/hooks/AssistantContext.js.map +1 -1
  45. package/dist/legacy-runtime/hooks/AttachmentContext.js +9 -1
  46. package/dist/legacy-runtime/hooks/AttachmentContext.js.map +1 -1
  47. package/dist/legacy-runtime/hooks/ComposerContext.js +9 -1
  48. package/dist/legacy-runtime/hooks/ComposerContext.js.map +1 -1
  49. package/dist/legacy-runtime/hooks/MessageContext.js +12 -2
  50. package/dist/legacy-runtime/hooks/MessageContext.js.map +1 -1
  51. package/dist/legacy-runtime/hooks/MessagePartContext.js +9 -1
  52. package/dist/legacy-runtime/hooks/MessagePartContext.js.map +1 -1
  53. package/dist/legacy-runtime/hooks/ThreadContext.js +33 -5
  54. package/dist/legacy-runtime/hooks/ThreadContext.js.map +1 -1
  55. package/dist/legacy-runtime/hooks/ThreadListItemContext.js +9 -1
  56. package/dist/legacy-runtime/hooks/ThreadListItemContext.js.map +1 -1
  57. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +3 -3
  58. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +1 -1
  59. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js +71 -31
  60. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js.map +1 -1
  61. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
  62. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +24 -16
  63. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  64. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +17 -12
  65. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +1 -1
  66. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js +17 -3
  67. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js.map +1 -1
  68. package/dist/mcp-apps/McpAppRenderer.d.ts +2 -10
  69. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  70. package/dist/mcp-apps/McpAppRenderer.js +9 -8
  71. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  72. package/dist/mcp-apps/McpAppsRemoteHost.d.ts +1 -8
  73. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  74. package/dist/mcp-apps/McpAppsRemoteHost.js +6 -5
  75. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  76. package/dist/mcp-apps/app-frame.js +33 -14
  77. package/dist/mcp-apps/app-frame.js.map +1 -1
  78. package/dist/mcp-apps/bridge.js.map +1 -1
  79. package/dist/mcp-apps/types.js.map +1 -1
  80. package/dist/mcp-apps/utils.js.map +1 -1
  81. package/dist/model-context/frame/useAssistantFrameHost.js +32 -14
  82. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  83. package/dist/model-context/makeAssistantVisible.js +64 -26
  84. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  85. package/dist/primitives/actionBar/ActionBarCopy.js +94 -20
  86. package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
  87. package/dist/primitives/actionBar/ActionBarEdit.js.map +1 -1
  88. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +105 -37
  89. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  90. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +60 -11
  91. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
  92. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +60 -11
  93. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
  94. package/dist/primitives/actionBar/ActionBarInteractionContext.js +3 -1
  95. package/dist/primitives/actionBar/ActionBarInteractionContext.js.map +1 -1
  96. package/dist/primitives/actionBar/ActionBarReload.js.map +1 -1
  97. package/dist/primitives/actionBar/ActionBarRoot.js +84 -25
  98. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  99. package/dist/primitives/actionBar/ActionBarSpeak.js.map +1 -1
  100. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +45 -14
  101. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  102. package/dist/primitives/actionBar/useActionBarFloatStatus.js +22 -10
  103. package/dist/primitives/actionBar/useActionBarFloatStatus.js.map +1 -1
  104. package/dist/primitives/actionBar.js.map +1 -1
  105. package/dist/primitives/actionBarMore/ActionBarMoreContent.js +44 -7
  106. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  107. package/dist/primitives/actionBarMore/ActionBarMoreItem.js +28 -6
  108. package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
  109. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +103 -36
  110. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
  111. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +28 -6
  112. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
  113. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +28 -6
  114. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
  115. package/dist/primitives/actionBarMore/scope.js.map +1 -1
  116. package/dist/primitives/actionBarMore.js.map +1 -1
  117. package/dist/primitives/assistantModal/AssistantModalAnchor.js +27 -6
  118. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  119. package/dist/primitives/assistantModal/AssistantModalContent.js +71 -10
  120. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  121. package/dist/primitives/assistantModal/AssistantModalRoot.js +93 -26
  122. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  123. package/dist/primitives/assistantModal/AssistantModalTrigger.js +27 -6
  124. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  125. package/dist/primitives/assistantModal/scope.js.map +1 -1
  126. package/dist/primitives/assistantModal.js.map +1 -1
  127. package/dist/primitives/attachment/AttachmentName.js +13 -1
  128. package/dist/primitives/attachment/AttachmentName.js.map +1 -1
  129. package/dist/primitives/attachment/AttachmentRemove.js +11 -4
  130. package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
  131. package/dist/primitives/attachment/AttachmentRoot.js +13 -4
  132. package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
  133. package/dist/primitives/attachment/AttachmentThumb.js +20 -9
  134. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  135. package/dist/primitives/attachment.js.map +1 -1
  136. package/dist/primitives/branchPicker/BranchPickerCount.js +14 -2
  137. package/dist/primitives/branchPicker/BranchPickerCount.js.map +1 -1
  138. package/dist/primitives/branchPicker/BranchPickerNext.js.map +1 -1
  139. package/dist/primitives/branchPicker/BranchPickerNumber.js +14 -2
  140. package/dist/primitives/branchPicker/BranchPickerNumber.js.map +1 -1
  141. package/dist/primitives/branchPicker/BranchPickerPrevious.js.map +1 -1
  142. package/dist/primitives/branchPicker/BranchPickerRoot.js +34 -6
  143. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  144. package/dist/primitives/branchPicker.js.map +1 -1
  145. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +16 -5
  146. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  147. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +13 -4
  148. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js.map +1 -1
  149. package/dist/primitives/chainOfThought.js.map +1 -1
  150. package/dist/primitives/composer/ComposerAddAttachment.js +37 -24
  151. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  152. package/dist/primitives/composer/ComposerAttachmentDropzone.js +124 -49
  153. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  154. package/dist/primitives/composer/ComposerCancel.js.map +1 -1
  155. package/dist/primitives/composer/ComposerDictate.js.map +1 -1
  156. package/dist/primitives/composer/ComposerDictationTranscript.js +32 -7
  157. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  158. package/dist/primitives/composer/ComposerInput.js +29 -29
  159. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  160. package/dist/primitives/composer/ComposerInputPluginContext.js +71 -25
  161. package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
  162. package/dist/primitives/composer/ComposerQuote.js +92 -23
  163. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  164. package/dist/primitives/composer/ComposerRoot.js +45 -11
  165. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  166. package/dist/primitives/composer/ComposerSend.js +9 -2
  167. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  168. package/dist/primitives/composer/ComposerStopDictation.js +15 -5
  169. package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
  170. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  171. package/dist/primitives/composer/trigger/TriggerPopover.js +215 -75
  172. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  173. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  174. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +35 -7
  175. package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
  176. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +134 -28
  177. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  178. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
  179. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +132 -28
  180. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  181. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +2 -10
  182. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  183. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +126 -53
  184. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  185. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +181 -78
  186. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  187. package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
  188. package/dist/primitives/composer/trigger/index.js.map +1 -1
  189. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +2 -6
  190. package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
  191. package/dist/primitives/composer/trigger/triggerDetectionResource.js +30 -15
  192. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
  193. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts +2 -17
  194. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
  195. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +117 -59
  196. package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
  197. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts +2 -10
  198. package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
  199. package/dist/primitives/composer/trigger/triggerNavigationResource.js +204 -71
  200. package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
  201. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +2 -10
  202. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  203. package/dist/primitives/composer/trigger/triggerSelectionResource.js +51 -14
  204. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  205. package/dist/primitives/composer.js.map +1 -1
  206. package/dist/primitives/dropdownMenuRenderPrimitives.js.map +1 -1
  207. package/dist/primitives/error/ErrorMessage.js +28 -6
  208. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  209. package/dist/primitives/error/ErrorRoot.js +14 -5
  210. package/dist/primitives/error/ErrorRoot.js.map +1 -1
  211. package/dist/primitives/error.js.map +1 -1
  212. package/dist/primitives/message/MessageError.js +2 -1
  213. package/dist/primitives/message/MessageError.js.map +1 -1
  214. package/dist/primitives/message/MessageIf.js +50 -20
  215. package/dist/primitives/message/MessageIf.js.map +1 -1
  216. package/dist/primitives/message/MessageParts.js +41 -7
  217. package/dist/primitives/message/MessageParts.js.map +1 -1
  218. package/dist/primitives/message/MessagePartsGrouped.js +399 -94
  219. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  220. package/dist/primitives/message/MessageRoot.js +197 -65
  221. package/dist/primitives/message/MessageRoot.js.map +1 -1
  222. package/dist/primitives/message.js.map +1 -1
  223. package/dist/primitives/messagePart/MessagePartImage.js +15 -5
  224. package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
  225. package/dist/primitives/messagePart/MessagePartText.d.ts +5 -2
  226. package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
  227. package/dist/primitives/messagePart/MessagePartText.js +35 -7
  228. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  229. package/dist/primitives/messagePart/useMessagePartData.js +5 -4
  230. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  231. package/dist/primitives/messagePart/useMessagePartFile.js +5 -4
  232. package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -1
  233. package/dist/primitives/messagePart/useMessagePartImage.js +5 -4
  234. package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -1
  235. package/dist/primitives/messagePart/useMessagePartReasoning.js +5 -4
  236. package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -1
  237. package/dist/primitives/messagePart/useMessagePartSource.js +5 -4
  238. package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -1
  239. package/dist/primitives/messagePart/useMessagePartText.js +5 -4
  240. package/dist/primitives/messagePart/useMessagePartText.js.map +1 -1
  241. package/dist/primitives/messagePart.js.map +1 -1
  242. package/dist/primitives/queueItem/QueueItemRemove.js +11 -4
  243. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
  244. package/dist/primitives/queueItem/QueueItemSteer.js +11 -4
  245. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
  246. package/dist/primitives/queueItem/QueueItemText.js +20 -6
  247. package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
  248. package/dist/primitives/queueItem.js.map +1 -1
  249. package/dist/primitives/reasoning/useScrollLock.js +61 -34
  250. package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
  251. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +56 -16
  252. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  253. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +120 -59
  254. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  255. package/dist/primitives/selectionToolbar.js.map +1 -1
  256. package/dist/primitives/suggestion/SuggestionDescription.js +20 -6
  257. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  258. package/dist/primitives/suggestion/SuggestionTitle.js +20 -6
  259. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  260. package/dist/primitives/suggestion/SuggestionTrigger.js +39 -26
  261. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  262. package/dist/primitives/suggestion.js.map +1 -1
  263. package/dist/primitives/thread/ThreadEmpty.js +6 -2
  264. package/dist/primitives/thread/ThreadEmpty.js.map +1 -1
  265. package/dist/primitives/thread/ThreadIf.js +32 -10
  266. package/dist/primitives/thread/ThreadIf.js.map +1 -1
  267. package/dist/primitives/thread/ThreadRoot.js +13 -4
  268. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  269. package/dist/primitives/thread/ThreadScrollToBottom.js +24 -6
  270. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  271. package/dist/primitives/thread/ThreadSuggestion.js +18 -6
  272. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  273. package/dist/primitives/thread/ThreadViewport.js +185 -47
  274. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  275. package/dist/primitives/thread/ThreadViewportFooter.js +22 -9
  276. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  277. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js.map +1 -1
  278. package/dist/primitives/thread/topAnchor/createReserveObservers.js.map +1 -1
  279. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -1
  280. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
  281. package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -1
  282. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +19 -4
  283. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -1
  284. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  285. package/dist/primitives/thread/useThreadViewportAutoScroll.js +21 -16
  286. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  287. package/dist/primitives/thread.js.map +1 -1
  288. package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -1
  289. package/dist/primitives/threadList/ThreadListNew.js +53 -11
  290. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  291. package/dist/primitives/threadList/ThreadListRoot.js +13 -4
  292. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  293. package/dist/primitives/threadList.js.map +1 -1
  294. package/dist/primitives/threadListItem/ThreadListItemArchive.js.map +1 -1
  295. package/dist/primitives/threadListItem/ThreadListItemDelete.js.map +1 -1
  296. package/dist/primitives/threadListItem/ThreadListItemRoot.js +26 -7
  297. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  298. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  299. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
  300. package/dist/primitives/threadListItem.js.map +1 -1
  301. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +44 -7
  302. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  303. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +28 -6
  304. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  305. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +25 -5
  306. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  307. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +28 -6
  308. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  309. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +28 -6
  310. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  311. package/dist/primitives/threadListItemMore/scope.js.map +1 -1
  312. package/dist/primitives/threadListItemMore.js.map +1 -1
  313. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  314. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  315. package/dist/tests/setup.js.map +1 -1
  316. package/dist/unstable/useComposerInputHistory.d.ts +30 -0
  317. package/dist/unstable/useComposerInputHistory.d.ts.map +1 -0
  318. package/dist/unstable/useComposerInputHistory.js +117 -0
  319. package/dist/unstable/useComposerInputHistory.js.map +1 -0
  320. package/dist/unstable/useMentionAdapter.js.map +1 -1
  321. package/dist/unstable/useMessageStallDetection.d.ts +29 -0
  322. package/dist/unstable/useMessageStallDetection.d.ts.map +1 -0
  323. package/dist/unstable/useMessageStallDetection.js +69 -0
  324. package/dist/unstable/useMessageStallDetection.js.map +1 -0
  325. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  326. package/dist/utils/Primitive.js +57 -12
  327. package/dist/utils/Primitive.js.map +1 -1
  328. package/dist/utils/createActionButton.js +23 -7
  329. package/dist/utils/createActionButton.js.map +1 -1
  330. package/dist/utils/getSelectionMessageId.js.map +1 -1
  331. package/dist/utils/hooks/useManagedRef.js +16 -8
  332. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  333. package/dist/utils/hooks/useMediaQuery.js +25 -10
  334. package/dist/utils/hooks/useMediaQuery.js.map +1 -1
  335. package/dist/utils/hooks/useOnResizeContent.js +29 -19
  336. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  337. package/dist/utils/hooks/useOnScrollToBottom.js +20 -4
  338. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  339. package/dist/utils/hooks/useSizeHandle.js +23 -15
  340. package/dist/utils/hooks/useSizeHandle.js.map +1 -1
  341. package/dist/utils/json/is-json-equal.js.map +1 -1
  342. package/dist/utils/json/is-json.js.map +1 -1
  343. package/dist/utils/smooth/SmoothContext.js +41 -11
  344. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  345. package/dist/utils/smooth/useSmooth.d.ts +40 -2
  346. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  347. package/dist/utils/smooth/useSmooth.js +52 -13
  348. package/dist/utils/smooth/useSmooth.js.map +1 -1
  349. package/dist/utils/useToolArgsFieldStatus.d.ts +2 -2
  350. package/dist/utils/useToolArgsFieldStatus.d.ts.map +1 -1
  351. package/dist/utils/useToolArgsFieldStatus.js +13 -5
  352. package/dist/utils/useToolArgsFieldStatus.js.map +1 -1
  353. package/package.json +6 -6
  354. package/src/client/ExternalThread.ts +146 -74
  355. package/src/client/InMemoryThreadList.ts +23 -21
  356. package/src/client/SingleThreadList.ts +29 -27
  357. package/src/hooks/useToolCallElapsed.ts +52 -0
  358. package/src/index.ts +19 -0
  359. package/src/mcp-apps/McpAppRenderer.tsx +5 -3
  360. package/src/mcp-apps/McpAppsRemoteHost.ts +5 -3
  361. package/src/primitives/composer/ComposerInput.test.tsx +1 -1
  362. package/src/primitives/composer/ComposerInput.tsx +3 -3
  363. package/src/primitives/composer/trigger/TriggerPopover.tsx +4 -5
  364. package/src/primitives/composer/trigger/TriggerPopoverResource.ts +5 -3
  365. package/src/primitives/composer/trigger/triggerDetectionResource.ts +21 -21
  366. package/src/primitives/composer/trigger/triggerKeyboardResource.test.ts +5 -4
  367. package/src/primitives/composer/trigger/triggerKeyboardResource.ts +99 -101
  368. package/src/primitives/composer/trigger/triggerNavigationResource.ts +92 -98
  369. package/src/primitives/composer/trigger/triggerSelectionResource.ts +76 -76
  370. package/src/primitives/messagePart/MessagePartText.tsx +3 -2
  371. package/src/primitives/reasoning/useScrollLock.ts +25 -2
  372. package/src/primitives/thread/useThreadViewportAutoScroll.ts +8 -0
  373. package/src/tests/external-thread-branches.test.tsx +160 -0
  374. package/src/tests/shouldContinue.test.ts +33 -0
  375. package/src/tests/toolCallTiming.test.tsx +221 -0
  376. package/src/unstable/useComposerInputHistory.test.tsx +201 -0
  377. package/src/unstable/useComposerInputHistory.ts +160 -0
  378. package/src/unstable/useMessageStallDetection.ts +91 -0
  379. package/src/utils/smooth/useSmooth.test.tsx +95 -0
  380. package/src/utils/smooth/useSmooth.ts +82 -10
package/src/index.ts CHANGED
@@ -141,6 +141,7 @@ export {
141
141
  type MessageQueueDriver,
142
142
  type MessageQueueController,
143
143
  type ExternalThreadQueueAdapter,
144
+ type ExternalThreadBranchAdapter,
144
145
  } from "@assistant-ui/core";
145
146
  export { useExternalStoreRuntime } from "./legacy-runtime/runtime-cores/external-store/useExternalStoreRuntime";
146
147
  export { useExternalStoreSharedOptions } from "@assistant-ui/core/react";
@@ -288,6 +289,13 @@ export { useThreadViewportAutoScroll } from "./primitives/thread/useThreadViewpo
288
289
  export { useScrollLock } from "./primitives/reasoning/useScrollLock";
289
290
  export { useMessageQuote } from "./hooks/useMessageQuote";
290
291
  export { useMessageTiming } from "./hooks/useMessageTiming";
292
+ export { useToolCallElapsed } from "./hooks/useToolCallElapsed";
293
+ export {
294
+ unstable_useMessageStallDetection,
295
+ type Unstable_MessageStallDetection,
296
+ type Unstable_MessageStallDetectionOptions,
297
+ } from "./unstable/useMessageStallDetection";
298
+ export { useSmooth, type SmoothOptions } from "./utils/smooth/useSmooth";
291
299
 
292
300
  // Re-export core types from @assistant-ui/core
293
301
  export type {
@@ -307,7 +315,12 @@ export type {
307
315
  GenerativeUINode,
308
316
  GenerativeUISpec,
309
317
  Unstable_AudioMessagePart,
318
+ RespondToToolApprovalOptions,
319
+ ToolApprovalOption,
320
+ ToolApprovalOptionKind,
321
+ ToolApprovalResponse,
310
322
  ToolCallMessagePart,
323
+ ToolCallTiming,
311
324
  ToolModelContentPart,
312
325
  MessageStatus,
313
326
  MessagePartStatus,
@@ -421,6 +434,12 @@ export type {
421
434
  } from "@assistant-ui/core";
422
435
  export { unstable_defaultDirectiveFormatter } from "@assistant-ui/core";
423
436
 
437
+ // Unstable - composer input history (terminal-style ArrowUp/ArrowDown recall)
438
+ export {
439
+ unstable_useComposerInputHistory,
440
+ type Unstable_ComposerInputHistory,
441
+ } from "./unstable/useComposerInputHistory";
442
+
424
443
  export type { Assistant } from "./augmentations";
425
444
 
426
445
  // --- mcp-apps ---
@@ -195,9 +195,9 @@ function InlineRenderer({
195
195
  * renderer loads that resource from the configured host and displays it in a
196
196
  * sandboxed frame.
197
197
  */
198
- export const McpAppRenderer = resource(function McpAppRenderer(
198
+ const useMcpAppRenderer = (
199
199
  options: McpAppRendererOptions,
200
- ): { readonly render: ToolCallMessagePartComponent } {
200
+ ): { readonly render: ToolCallMessagePartComponent } => {
201
201
  const host = useResource(options.host);
202
202
 
203
203
  const optionsRef = useRef<McpAppRendererOptions>(options);
@@ -219,4 +219,6 @@ export const McpAppRenderer = resource(function McpAppRenderer(
219
219
  }, []);
220
220
 
221
221
  return { render };
222
- });
222
+ };
223
+
224
+ export const McpAppRenderer = resource(useMcpAppRenderer);
@@ -34,9 +34,9 @@ async function postToHost(
34
34
  * params }`, using the method names expected by the assistant-ui MCP Apps
35
35
  * guide.
36
36
  */
37
- export const McpAppsRemoteHost = resource(function McpAppsRemoteHost(
37
+ const useMcpAppsRemoteHost = (
38
38
  options: McpAppsRemoteHostOptions,
39
- ): McpAppsHost {
39
+ ): McpAppsHost => {
40
40
  const optionsRef = useRef(options);
41
41
  optionsRef.current = options;
42
42
 
@@ -57,4 +57,6 @@ export const McpAppsRemoteHost = resource(function McpAppsRemoteHost(
57
57
  }),
58
58
  [],
59
59
  );
60
- });
60
+ };
61
+
62
+ export const McpAppsRemoteHost = resource(useMcpAppsRemoteHost);
@@ -61,7 +61,7 @@ vi.mock("@assistant-ui/store", () => {
61
61
  });
62
62
 
63
63
  vi.mock("@assistant-ui/tap", () => ({
64
- flushResourcesSync: (fn: () => void) => fn(),
64
+ flushTapSync: (fn: () => void) => fn(),
65
65
  }));
66
66
 
67
67
  vi.mock("./ComposerInputPluginContext", () => ({
@@ -22,7 +22,7 @@ import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
22
22
  import { useOnScrollToBottom } from "../../utils/hooks/useOnScrollToBottom";
23
23
  import { useMediaQuery } from "../../utils/hooks/useMediaQuery";
24
24
  import { useAuiState, useAui } from "@assistant-ui/store";
25
- import { flushResourcesSync } from "@assistant-ui/tap";
25
+ import { flushTapSync } from "@assistant-ui/tap";
26
26
  import { useComposerInputPluginRegistryOptional } from "./ComposerInputPluginContext";
27
27
  import { useTriggerPopoverActiveAriaOptional } from "./trigger/TriggerPopoverRootContext";
28
28
 
@@ -350,7 +350,7 @@ export const ComposerPrimitiveInput = forwardRef<
350
350
  }
351
351
  const isComposing = nativeIsComposing || compositionRef.current;
352
352
  // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value
353
- flushResourcesSync(() => {
353
+ flushTapSync(() => {
354
354
  aui.composer().setText(e.target.value);
355
355
  });
356
356
  if (isComposing) return;
@@ -377,7 +377,7 @@ export const ComposerPrimitiveInput = forwardRef<
377
377
  compositionRef.current = false;
378
378
  if (!aui.composer().getState().isEditing) return;
379
379
  const target = e.target as HTMLTextAreaElement;
380
- flushResourcesSync(() => {
380
+ flushTapSync(() => {
381
381
  aui.composer().setText(target.value);
382
382
  });
383
383
  const pos = target.selectionStart ?? target.value.length;
@@ -9,6 +9,7 @@ import {
9
9
  useCallback,
10
10
  useContext,
11
11
  useEffect,
12
+ useEffectEvent,
12
13
  useId,
13
14
  useMemo,
14
15
  useRef,
@@ -161,23 +162,21 @@ export const ComposerPrimitiveTriggerPopover = forwardRef<
161
162
  }),
162
163
  );
163
164
 
164
- // Wrapper changes per render, but tap-stable methods inside don't.
165
- const resourceRef = useRef(resource);
166
- resourceRef.current = resource;
165
+ const getResource = useEffectEvent(() => resource);
167
166
 
168
167
  const root = useTriggerPopoverRootContext();
169
168
  useEffect(() => {
170
169
  return root.register({
171
170
  char,
172
171
  ...(behavior ? { behavior } : {}),
173
- resource: resourceRef.current,
172
+ resource: getResource(),
174
173
  });
175
174
  }, [root, char, behavior]);
176
175
 
177
176
  const pluginRegistry = useComposerInputPluginRegistryOptional();
178
177
  useEffect(() => {
179
178
  if (!pluginRegistry) return undefined;
180
- return pluginRegistry.register(resourceRef.current);
179
+ return pluginRegistry.register(getResource());
181
180
  }, [pluginRegistry]);
182
181
 
183
182
  const open = behavior !== null && resource.open;
@@ -51,7 +51,7 @@ export type TriggerPopoverResourceOutput = {
51
51
  };
52
52
 
53
53
  /** Composes detection, navigation, keyboard, and selection sub-resources. */
54
- export const TriggerPopoverResource = resource(function TriggerPopoverResource({
54
+ const useTriggerPopoverResource = ({
55
55
  adapter,
56
56
  text,
57
57
  triggerChar,
@@ -66,7 +66,7 @@ export const TriggerPopoverResource = resource(function TriggerPopoverResource({
66
66
  aui: AssistantClient;
67
67
  /** Stable ID for accessible element IDs (pass React's useId() from component layer). */
68
68
  popoverId: string;
69
- }): TriggerPopoverResourceOutput {
69
+ }): TriggerPopoverResourceOutput => {
70
70
  const detection = useResource(
71
71
  TriggerDetectionResource({ text, triggerChar }),
72
72
  );
@@ -133,4 +133,6 @@ export const TriggerPopoverResource = resource(function TriggerPopoverResource({
133
133
  setCursorPosition: detection.setCursorPosition,
134
134
  registerSelectItemOverride: selection.registerSelectItemOverride,
135
135
  };
136
- });
136
+ };
137
+
138
+ export const TriggerPopoverResource = resource(useTriggerPopoverResource);
@@ -18,27 +18,27 @@ export type TriggerDetectionResourceOutput = {
18
18
  };
19
19
 
20
20
  /** Tracks cursor position and derives the active trigger + query from composer text. */
21
- export const TriggerDetectionResource = resource(
22
- function TriggerDetectionResource({
23
- text,
24
- triggerChar,
25
- }: {
26
- text: string;
27
- triggerChar: string;
28
- }): TriggerDetectionResourceOutput {
29
- const [cursorPosition, setCursorPosition] = useState(text.length);
21
+ const useTriggerDetectionResource = ({
22
+ text,
23
+ triggerChar,
24
+ }: {
25
+ text: string;
26
+ triggerChar: string;
27
+ }): TriggerDetectionResourceOutput => {
28
+ const [cursorPosition, setCursorPosition] = useState(text.length);
30
29
 
31
- const trigger = useMemo(() => {
32
- const pos = Math.min(cursorPosition, text.length);
33
- return detectTrigger(text, triggerChar, pos);
34
- }, [cursorPosition, text, triggerChar]);
30
+ const trigger = useMemo(() => {
31
+ const pos = Math.min(cursorPosition, text.length);
32
+ return detectTrigger(text, triggerChar, pos);
33
+ }, [cursorPosition, text, triggerChar]);
35
34
 
36
- const query = trigger?.query ?? "";
35
+ const query = trigger?.query ?? "";
37
36
 
38
- return {
39
- trigger,
40
- query,
41
- setCursorPosition,
42
- };
43
- },
44
- );
37
+ return {
38
+ trigger,
39
+ query,
40
+ setCursorPosition,
41
+ };
42
+ };
43
+
44
+ export const TriggerDetectionResource = resource(useTriggerDetectionResource);
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi } from "vitest";
2
- import { createResourceRoot } from "@assistant-ui/tap";
2
+ import { createTapRoot, useResource } from "@assistant-ui/tap";
3
3
  import type {
4
4
  Unstable_TriggerCategory,
5
5
  Unstable_TriggerItem,
@@ -41,9 +41,10 @@ const render = (
41
41
  close: vi.fn(),
42
42
  ...overrides,
43
43
  };
44
- const root = createResourceRoot();
45
- const sub = root.render(TriggerKeyboardResource(props));
46
- return { sub, props };
44
+ const root = createTapRoot(function Root() {
45
+ return useResource(TriggerKeyboardResource(props));
46
+ });
47
+ return { sub: root, props };
47
48
  };
48
49
 
49
50
  describe("TriggerKeyboardResource", () => {
@@ -34,113 +34,111 @@ export type TriggerKeyboardResourceOutput = {
34
34
  * Owns keyboard-driven highlight state for the popover. Delegates selection,
35
35
  * category drill-in, back, and close to the callbacks supplied by the parent.
36
36
  */
37
- export const TriggerKeyboardResource = resource(
38
- function TriggerKeyboardResource({
39
- navigableList,
40
- isSearchMode,
41
- activeCategoryId,
42
- query,
43
- popoverId,
44
- open,
45
- selectItem,
46
- selectCategory,
47
- goBack,
48
- close,
49
- }: {
50
- navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];
51
- isSearchMode: boolean;
52
- activeCategoryId: string | null;
53
- query: string;
54
- popoverId: string;
55
- open: boolean;
56
- selectItem: (item: Unstable_TriggerItem) => void;
57
- selectCategory: (categoryId: string) => void;
58
- goBack: () => void;
59
- close: () => void;
60
- }): TriggerKeyboardResourceOutput {
61
- const [highlightedIndex, setHighlightedIndex] = useState(0);
37
+ const useTriggerKeyboardResource = ({
38
+ navigableList,
39
+ isSearchMode,
40
+ activeCategoryId,
41
+ query,
42
+ popoverId,
43
+ open,
44
+ selectItem,
45
+ selectCategory,
46
+ goBack,
47
+ close,
48
+ }: {
49
+ navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];
50
+ isSearchMode: boolean;
51
+ activeCategoryId: string | null;
52
+ query: string;
53
+ popoverId: string;
54
+ open: boolean;
55
+ selectItem: (item: Unstable_TriggerItem) => void;
56
+ selectCategory: (categoryId: string) => void;
57
+ goBack: () => void;
58
+ close: () => void;
59
+ }): TriggerKeyboardResourceOutput => {
60
+ const [highlightedIndex, setHighlightedIndex] = useState(0);
62
61
 
63
- useEffect(() => {
64
- setHighlightedIndex(0);
65
- }, [navigableList]);
62
+ useEffect(() => {
63
+ setHighlightedIndex(0);
64
+ }, [navigableList]);
66
65
 
67
- useEffect(() => {
68
- setHighlightedIndex(0);
69
- }, [isSearchMode, activeCategoryId]);
66
+ useEffect(() => {
67
+ setHighlightedIndex(0);
68
+ }, [isSearchMode, activeCategoryId]);
70
69
 
71
- const highlightIndex = useEffectEvent((index: number) => {
72
- if (index < 0 || index >= navigableList.length) return;
73
- if (index === highlightedIndex) return;
74
- setHighlightedIndex(index);
75
- });
70
+ const highlightIndex = useEffectEvent((index: number) => {
71
+ if (index < 0 || index >= navigableList.length) return;
72
+ if (index === highlightedIndex) return;
73
+ setHighlightedIndex(index);
74
+ });
76
75
 
77
- const handleKeyDown = useEffectEvent(
78
- (e: TriggerPopoverKeyEvent): boolean => {
79
- if (!open) return false;
76
+ const handleKeyDown = useEffectEvent((e: TriggerPopoverKeyEvent): boolean => {
77
+ if (!open) return false;
80
78
 
81
- switch (e.key) {
82
- case "ArrowDown": {
83
- e.preventDefault();
84
- setHighlightedIndex((prev) => {
85
- const len = navigableList.length;
86
- if (len === 0) return 0;
87
- return prev < len - 1 ? prev + 1 : 0;
88
- });
89
- return true;
90
- }
91
- case "ArrowUp": {
92
- e.preventDefault();
93
- setHighlightedIndex((prev) => {
94
- const len = navigableList.length;
95
- if (len === 0) return 0;
96
- return prev > 0 ? prev - 1 : len - 1;
97
- });
98
- return true;
99
- }
100
- case "Enter":
101
- case "Tab": {
102
- if (e.shiftKey) return false;
103
- e.preventDefault();
104
- const item = navigableList[highlightedIndex];
105
- if (!item) return true;
79
+ switch (e.key) {
80
+ case "ArrowDown": {
81
+ e.preventDefault();
82
+ setHighlightedIndex((prev) => {
83
+ const len = navigableList.length;
84
+ if (len === 0) return 0;
85
+ return prev < len - 1 ? prev + 1 : 0;
86
+ });
87
+ return true;
88
+ }
89
+ case "ArrowUp": {
90
+ e.preventDefault();
91
+ setHighlightedIndex((prev) => {
92
+ const len = navigableList.length;
93
+ if (len === 0) return 0;
94
+ return prev > 0 ? prev - 1 : len - 1;
95
+ });
96
+ return true;
97
+ }
98
+ case "Enter":
99
+ case "Tab": {
100
+ if (e.shiftKey) return false;
101
+ e.preventDefault();
102
+ const item = navigableList[highlightedIndex];
103
+ if (!item) return true;
106
104
 
107
- if (isTriggerItem(item)) {
108
- selectItem(item);
109
- } else {
110
- selectCategory(item.id);
111
- }
112
- return true;
113
- }
114
- case "Escape": {
115
- e.preventDefault();
116
- close();
117
- return true;
118
- }
119
- case "Backspace": {
120
- if (activeCategoryId && query === "") {
121
- e.preventDefault();
122
- goBack();
123
- return true;
124
- }
125
- return false;
126
- }
127
- default:
128
- return false;
105
+ if (isTriggerItem(item)) {
106
+ selectItem(item);
107
+ } else {
108
+ selectCategory(item.id);
129
109
  }
130
- },
131
- );
110
+ return true;
111
+ }
112
+ case "Escape": {
113
+ e.preventDefault();
114
+ close();
115
+ return true;
116
+ }
117
+ case "Backspace": {
118
+ if (activeCategoryId && query === "") {
119
+ e.preventDefault();
120
+ goBack();
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ default:
126
+ return false;
127
+ }
128
+ });
129
+
130
+ const highlightedEntry = navigableList[highlightedIndex];
131
+ const highlightedItemId =
132
+ open && highlightedEntry
133
+ ? `${popoverId}-option-${highlightedEntry.id}`
134
+ : undefined;
132
135
 
133
- const highlightedEntry = navigableList[highlightedIndex];
134
- const highlightedItemId =
135
- open && highlightedEntry
136
- ? `${popoverId}-option-${highlightedEntry.id}`
137
- : undefined;
136
+ return {
137
+ highlightedIndex,
138
+ highlightedItemId,
139
+ highlightIndex,
140
+ handleKeyDown,
141
+ };
142
+ };
138
143
 
139
- return {
140
- highlightedIndex,
141
- highlightedItemId,
142
- highlightIndex,
143
- handleKeyDown,
144
- };
145
- },
146
- );
144
+ export const TriggerKeyboardResource = resource(useTriggerKeyboardResource);