@assistant-ui/react 0.15.30 → 0.15.32

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 (550) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/adapters/OpenAIRealtimeVoiceAdapter.js +1 -2
  3. package/dist/assistant-transport.js +1 -2
  4. package/dist/cloud-renderer/CloudRendererHost.d.ts.map +1 -1
  5. package/dist/cloud-renderer/CloudRendererHost.js +2 -4
  6. package/dist/cloud-renderer/CloudRendererHost.js.map +1 -1
  7. package/dist/context/ReadonlyStore.js +1 -2
  8. package/dist/context/providers/AttachmentByIndexProvider.js +1 -2
  9. package/dist/context/providers/ChainOfThoughtByIndicesProvider.js +1 -2
  10. package/dist/context/providers/MessageByIndexProvider.js +1 -2
  11. package/dist/context/providers/MessageProvider.js +1 -2
  12. package/dist/context/providers/PartByIndexProvider.js +1 -2
  13. package/dist/context/providers/SuggestionByIndexProvider.js +1 -2
  14. package/dist/context/providers/TextMessagePartProvider.js +1 -2
  15. package/dist/context/providers/ThreadListItemProvider.js +1 -2
  16. package/dist/context/providers/ThreadViewportProvider.js +1 -2
  17. package/dist/context/react/ThreadViewportContext.js +1 -2
  18. package/dist/context/react/utils/createContextHook.js +1 -2
  19. package/dist/context/react/utils/createContextStoreHook.js +1 -2
  20. package/dist/context/stores/ThreadViewport.js +1 -2
  21. package/dist/devtools/DevToolsHooks.js +1 -2
  22. package/dist/hooks/useMessageQuote.js +1 -2
  23. package/dist/hooks/useMessageTiming.js +1 -2
  24. package/dist/hooks/useToolCallElapsed.js +1 -2
  25. package/dist/index.d.ts +9 -8
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -9
  28. package/dist/internal.d.ts +1 -1
  29. package/dist/internal.d.ts.map +1 -1
  30. package/dist/internal.js +2 -3
  31. package/dist/internal.js.map +1 -1
  32. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts +1 -1
  33. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  34. package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -2
  35. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  36. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  37. package/dist/mcp-apps/McpAppRenderer.js +3 -3
  38. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  39. package/dist/mcp-apps/McpAppsRemoteHost.js +1 -2
  40. package/dist/mcp-apps/app-frame.js +1 -2
  41. package/dist/mcp-apps/bridge.js +1 -2
  42. package/dist/mcp-apps/csp.js +1 -2
  43. package/dist/mcp-apps/types.js +1 -2
  44. package/dist/mcp-apps/utils.js +1 -2
  45. package/dist/model-context/frame/useAssistantFrameHost.js +1 -2
  46. package/dist/model-context/makeAssistantVisible.js +1 -2
  47. package/dist/primitives/actionBar/ActionBarCopy.d.ts +1 -1
  48. package/dist/primitives/actionBar/ActionBarCopy.js +1 -2
  49. package/dist/primitives/actionBar/ActionBarEdit.d.ts +1 -1
  50. package/dist/primitives/actionBar/ActionBarEdit.js +1 -2
  51. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts +1 -1
  52. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +1 -2
  53. package/dist/primitives/actionBar/ActionBarFeedbackNegative.d.ts +1 -1
  54. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -2
  55. package/dist/primitives/actionBar/ActionBarFeedbackPositive.d.ts +1 -1
  56. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -2
  57. package/dist/primitives/actionBar/ActionBarInteractionContext.js +1 -2
  58. package/dist/primitives/actionBar/ActionBarReload.d.ts +1 -1
  59. package/dist/primitives/actionBar/ActionBarReload.js +1 -2
  60. package/dist/primitives/actionBar/ActionBarRoot.d.ts +1 -1
  61. package/dist/primitives/actionBar/ActionBarRoot.js +1 -2
  62. package/dist/primitives/actionBar/ActionBarSpeak.d.ts +1 -1
  63. package/dist/primitives/actionBar/ActionBarSpeak.js +1 -2
  64. package/dist/primitives/actionBar/ActionBarStopSpeaking.d.ts +1 -1
  65. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +1 -2
  66. package/dist/primitives/actionBar/useActionBarFloatStatus.js +1 -2
  67. package/dist/primitives/actionBar.js +1 -2
  68. package/dist/primitives/actionBarMore/ActionBarMoreContent.js +1 -2
  69. package/dist/primitives/actionBarMore/ActionBarMoreItem.js +1 -2
  70. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +1 -2
  71. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +1 -2
  72. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +1 -2
  73. package/dist/primitives/actionBarMore/scope.js +1 -2
  74. package/dist/primitives/actionBarMore.js +1 -2
  75. package/dist/primitives/assistantModal/AssistantModalAnchor.js +1 -2
  76. package/dist/primitives/assistantModal/AssistantModalContent.js +1 -2
  77. package/dist/primitives/assistantModal/AssistantModalRoot.js +1 -2
  78. package/dist/primitives/assistantModal/AssistantModalTrigger.js +1 -2
  79. package/dist/primitives/assistantModal/popoverRenderPrimitives.js +1 -2
  80. package/dist/primitives/assistantModal/scope.js +1 -2
  81. package/dist/primitives/assistantModal.js +1 -2
  82. package/dist/primitives/attachment/AttachmentName.js +1 -2
  83. package/dist/primitives/attachment/AttachmentRemove.d.ts +1 -1
  84. package/dist/primitives/attachment/AttachmentRemove.js +1 -2
  85. package/dist/primitives/attachment/AttachmentRoot.d.ts +1 -1
  86. package/dist/primitives/attachment/AttachmentRoot.js +1 -2
  87. package/dist/primitives/attachment/AttachmentThumb.d.ts +1 -1
  88. package/dist/primitives/attachment/AttachmentThumb.js +1 -2
  89. package/dist/primitives/attachment.js +1 -2
  90. package/dist/primitives/branchPicker/BranchPickerCount.js +1 -2
  91. package/dist/primitives/branchPicker/BranchPickerNext.d.ts +1 -1
  92. package/dist/primitives/branchPicker/BranchPickerNext.js +1 -2
  93. package/dist/primitives/branchPicker/BranchPickerNumber.js +1 -2
  94. package/dist/primitives/branchPicker/BranchPickerPrevious.d.ts +1 -1
  95. package/dist/primitives/branchPicker/BranchPickerPrevious.js +1 -2
  96. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts +1 -1
  97. package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -2
  98. package/dist/primitives/branchPicker.js +1 -2
  99. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +6 -5
  100. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
  101. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +57 -20
  102. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  103. package/dist/primitives/chainOfThought/ChainOfThoughtParts.js +1 -2
  104. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.d.ts +1 -1
  105. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +1 -2
  106. package/dist/primitives/chainOfThought.js +1 -2
  107. package/dist/primitives/composer/ComposerAddAttachment.d.ts +1 -1
  108. package/dist/primitives/composer/ComposerAddAttachment.js +1 -2
  109. package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -2
  110. package/dist/primitives/composer/ComposerAttachments.js +1 -2
  111. package/dist/primitives/composer/ComposerCancel.d.ts +1 -1
  112. package/dist/primitives/composer/ComposerCancel.js +1 -2
  113. package/dist/primitives/composer/ComposerCompactContext.js +1 -2
  114. package/dist/primitives/composer/ComposerDictate.d.ts +1 -1
  115. package/dist/primitives/composer/ComposerDictate.js +1 -2
  116. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +1 -1
  117. package/dist/primitives/composer/ComposerDictationTranscript.js +1 -2
  118. package/dist/primitives/composer/ComposerIf.js +1 -2
  119. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  120. package/dist/primitives/composer/ComposerInput.js +4 -5
  121. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  122. package/dist/primitives/composer/ComposerInputPluginContext.js +1 -2
  123. package/dist/primitives/composer/ComposerQueue.js +1 -2
  124. package/dist/primitives/composer/ComposerQuote.d.ts +3 -3
  125. package/dist/primitives/composer/ComposerQuote.js +1 -2
  126. package/dist/primitives/composer/ComposerResume.d.ts +1 -1
  127. package/dist/primitives/composer/ComposerResume.js +1 -2
  128. package/dist/primitives/composer/ComposerRoot.d.ts +1 -1
  129. package/dist/primitives/composer/ComposerRoot.js +1 -2
  130. package/dist/primitives/composer/ComposerSend.d.ts +1 -1
  131. package/dist/primitives/composer/ComposerSend.js +1 -2
  132. package/dist/primitives/composer/ComposerStopDictation.d.ts +1 -1
  133. package/dist/primitives/composer/ComposerStopDictation.js +1 -2
  134. package/dist/primitives/composer/composerInputSelector.js +1 -2
  135. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +1 -1
  136. package/dist/primitives/composer/trigger/TriggerPopover.js +1 -2
  137. package/dist/primitives/composer/trigger/TriggerPopoverAction.js +1 -2
  138. package/dist/primitives/composer/trigger/TriggerPopoverBack.d.ts +1 -1
  139. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +1 -2
  140. package/dist/primitives/composer/trigger/TriggerPopoverCategories.d.ts +2 -2
  141. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +1 -2
  142. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +1 -2
  143. package/dist/primitives/composer/trigger/TriggerPopoverItems.d.ts +2 -2
  144. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +1 -2
  145. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +1 -2
  146. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +1 -2
  147. package/dist/primitives/composer/trigger/detectTrigger.js +1 -2
  148. package/dist/primitives/composer/trigger/index.d.ts +1 -1
  149. package/dist/primitives/composer/trigger/index.js +1 -2
  150. package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js +1 -2
  151. package/dist/primitives/composer/trigger/triggerDetectionResource.js +1 -2
  152. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +1 -2
  153. package/dist/primitives/composer/trigger/triggerNavigationResource.js +1 -2
  154. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  155. package/dist/primitives/composer/trigger/triggerSelectionResource.js +3 -4
  156. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  157. package/dist/primitives/composer/useComposerCancelWithFocus.js +1 -2
  158. package/dist/primitives/composer/useComposerInputState.js +1 -2
  159. package/dist/primitives/composer.js +1 -2
  160. package/dist/primitives/dropdownMenuRenderPrimitives.js +1 -2
  161. package/dist/primitives/error/ErrorMessage.d.ts +1 -1
  162. package/dist/primitives/error/ErrorMessage.js +1 -2
  163. package/dist/primitives/error/ErrorRoot.d.ts +1 -1
  164. package/dist/primitives/error/ErrorRoot.js +1 -2
  165. package/dist/primitives/error.js +1 -2
  166. package/dist/primitives/message/MessageAttachments.js +1 -2
  167. package/dist/primitives/message/MessageError.js +1 -2
  168. package/dist/primitives/message/MessageIf.js +1 -2
  169. package/dist/primitives/message/MessageParts.js +1 -2
  170. package/dist/primitives/message/MessagePartsGrouped.js +1 -2
  171. package/dist/primitives/message/MessageRoot.d.ts +1 -1
  172. package/dist/primitives/message/MessageRoot.js +1 -2
  173. package/dist/primitives/message.js +1 -2
  174. package/dist/primitives/messagePart/MessagePartImage.d.ts +1 -1
  175. package/dist/primitives/messagePart/MessagePartImage.js +1 -2
  176. package/dist/primitives/messagePart/MessagePartInProgress.js +1 -2
  177. package/dist/primitives/messagePart/MessagePartText.d.ts +1 -1
  178. package/dist/primitives/messagePart/MessagePartText.js +1 -2
  179. package/dist/primitives/messagePart/useMessagePartData.js +1 -2
  180. package/dist/primitives/messagePart/useMessagePartFile.js +1 -2
  181. package/dist/primitives/messagePart/useMessagePartImage.js +1 -2
  182. package/dist/primitives/messagePart/useMessagePartReasoning.js +1 -2
  183. package/dist/primitives/messagePart/useMessagePartSource.js +1 -2
  184. package/dist/primitives/messagePart/useMessagePartText.js +1 -2
  185. package/dist/primitives/messagePart.js +1 -2
  186. package/dist/primitives/queueItem/QueueItemRemove.d.ts +1 -1
  187. package/dist/primitives/queueItem/QueueItemRemove.js +1 -2
  188. package/dist/primitives/queueItem/QueueItemSteer.d.ts +1 -1
  189. package/dist/primitives/queueItem/QueueItemSteer.js +1 -2
  190. package/dist/primitives/queueItem/QueueItemText.d.ts +1 -1
  191. package/dist/primitives/queueItem/QueueItemText.js +1 -2
  192. package/dist/primitives/queueItem.js +1 -2
  193. package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -1
  194. package/dist/primitives/reasoning/useScrollLock.js +41 -25
  195. package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
  196. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.d.ts +1 -1
  197. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -2
  198. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.d.ts +1 -1
  199. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +1 -2
  200. package/dist/primitives/selectionToolbar.js +1 -2
  201. package/dist/primitives/suggestion/SuggestionDescription.d.ts +1 -1
  202. package/dist/primitives/suggestion/SuggestionDescription.js +1 -2
  203. package/dist/primitives/suggestion/SuggestionTitle.d.ts +1 -1
  204. package/dist/primitives/suggestion/SuggestionTitle.js +1 -2
  205. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +1 -1
  206. package/dist/primitives/suggestion/SuggestionTrigger.js +1 -2
  207. package/dist/primitives/suggestion.js +1 -2
  208. package/dist/primitives/thread/ThreadEmpty.js +1 -2
  209. package/dist/primitives/thread/ThreadIf.js +1 -2
  210. package/dist/primitives/thread/ThreadLoadEarlier.d.ts +1 -1
  211. package/dist/primitives/thread/ThreadLoadEarlier.js +1 -2
  212. package/dist/primitives/thread/ThreadMessages.js +1 -2
  213. package/dist/primitives/thread/ThreadRoot.d.ts +1 -1
  214. package/dist/primitives/thread/ThreadRoot.js +1 -2
  215. package/dist/primitives/thread/ThreadRootElementContext.js +1 -2
  216. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +1 -1
  217. package/dist/primitives/thread/ThreadScrollToBottom.js +1 -2
  218. package/dist/primitives/thread/ThreadSuggestion.d.ts +1 -1
  219. package/dist/primitives/thread/ThreadSuggestion.js +1 -2
  220. package/dist/primitives/thread/ThreadSuggestions.js +1 -2
  221. package/dist/primitives/thread/ThreadViewport.d.ts +1 -1
  222. package/dist/primitives/thread/ThreadViewport.js +1 -2
  223. package/dist/primitives/thread/ThreadViewportFooter.d.ts +1 -1
  224. package/dist/primitives/thread/ThreadViewportFooter.js +1 -2
  225. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js +1 -2
  226. package/dist/primitives/thread/topAnchor/createReserveObservers.js +1 -2
  227. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +1 -2
  228. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +1 -2
  229. package/dist/primitives/thread/topAnchor/topAnchorUtils.js +1 -2
  230. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +1 -2
  231. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  232. package/dist/primitives/thread/useThreadViewportAutoScroll.js +7 -5
  233. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  234. package/dist/primitives/thread.js +1 -2
  235. package/dist/primitives/threadList/ThreadListItems.js +1 -2
  236. package/dist/primitives/threadList/ThreadListLoadMore.d.ts +1 -1
  237. package/dist/primitives/threadList/ThreadListLoadMore.js +1 -2
  238. package/dist/primitives/threadList/ThreadListNew.d.ts +1 -1
  239. package/dist/primitives/threadList/ThreadListNew.js +1 -2
  240. package/dist/primitives/threadList/ThreadListRoot.d.ts +1 -1
  241. package/dist/primitives/threadList/ThreadListRoot.js +1 -2
  242. package/dist/primitives/threadList.js +1 -2
  243. package/dist/primitives/threadListFocusGroup.d.ts +1 -1
  244. package/dist/primitives/threadListFocusGroup.d.ts.map +1 -1
  245. package/dist/primitives/threadListFocusGroup.js +1 -2
  246. package/dist/primitives/threadListItem/ThreadListItemArchive.d.ts +1 -1
  247. package/dist/primitives/threadListItem/ThreadListItemArchive.js +1 -2
  248. package/dist/primitives/threadListItem/ThreadListItemDelete.d.ts +1 -1
  249. package/dist/primitives/threadListItem/ThreadListItemDelete.js +1 -2
  250. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +1 -1
  251. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  252. package/dist/primitives/threadListItem/ThreadListItemRoot.js +2 -3
  253. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  254. package/dist/primitives/threadListItem/ThreadListItemTitle.js +1 -2
  255. package/dist/primitives/threadListItem/ThreadListItemTrigger.d.ts +1 -1
  256. package/dist/primitives/threadListItem/ThreadListItemTrigger.js +1 -2
  257. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts +2 -2
  258. package/dist/primitives/threadListItem/ThreadListItemUnarchive.d.ts.map +1 -1
  259. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js +3 -4
  260. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
  261. package/dist/primitives/threadListItem.js +1 -2
  262. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -2
  263. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +1 -2
  264. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +1 -2
  265. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +1 -2
  266. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -2
  267. package/dist/primitives/threadListItemMore/scope.js +1 -2
  268. package/dist/primitives/threadListItemMore.js +1 -2
  269. package/dist/sandbox-host/SandboxHost.js +1 -2
  270. package/dist/unstable/useComposerInput.js +2 -3
  271. package/dist/unstable/useComposerInput.js.map +1 -1
  272. package/dist/unstable/useComposerInputHistory.d.ts.map +1 -1
  273. package/dist/unstable/useComposerInputHistory.js +3 -4
  274. package/dist/unstable/useComposerInputHistory.js.map +1 -1
  275. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -1
  276. package/dist/unstable/useLiveCompletionAdapter.js +4 -4
  277. package/dist/unstable/useLiveCompletionAdapter.js.map +1 -1
  278. package/dist/unstable/useMentionAdapter.js +1 -2
  279. package/dist/unstable/useMessageStallDetection.js +1 -2
  280. package/dist/unstable/useModelContextSnapshot.js +1 -2
  281. package/dist/unstable/useSlashCommandAdapter.js +1 -2
  282. package/dist/unstable/webmcp/WebMcpRegistrationResource.js +1 -2
  283. package/dist/unstable/webmcp/convertTools.js +1 -2
  284. package/dist/unstable/webmcp/useWebMcpProvider.js +1 -2
  285. package/dist/unstable/webmcp/webmcp-host.js +1 -2
  286. package/dist/utils/Primitive.d.ts +17 -17
  287. package/dist/utils/Primitive.js +1 -2
  288. package/dist/utils/createActionButton.d.ts +1 -1
  289. package/dist/utils/createActionButton.js +1 -2
  290. package/dist/utils/getSelectionMessageId.js +1 -2
  291. package/dist/utils/hooks/useManagedRef.js +1 -2
  292. package/dist/utils/hooks/useMediaQuery.js +1 -2
  293. package/dist/utils/hooks/useOnScrollToBottom.js +1 -2
  294. package/dist/utils/hooks/useSizeHandle.js +1 -2
  295. package/dist/utils/isCompositionKey.js +1 -2
  296. package/dist/utils/smooth/SmoothContext.js +1 -2
  297. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  298. package/dist/utils/smooth/useSmooth.js +11 -4
  299. package/dist/utils/smooth/useSmooth.js.map +1 -1
  300. package/dist/utils/useIsomorphicLayoutEffect.js +0 -1
  301. package/package.json +13 -13
  302. package/src/adapters/OpenAIRealtimeVoiceAdapter.test.ts +14 -1
  303. package/src/cloud-renderer/CloudRendererHost.tsx +4 -2
  304. package/src/index.ts +9 -8
  305. package/src/internal.ts +1 -1
  306. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +1 -1
  307. package/src/mcp-apps/McpAppRenderer.composer.test.tsx +111 -0
  308. package/src/mcp-apps/McpAppRenderer.test.tsx +24 -23
  309. package/src/mcp-apps/McpAppRenderer.tsx +9 -1
  310. package/src/primitives/actionBar/ActionBarCopy.test.tsx +57 -0
  311. package/src/primitives/actionBar/ActionBarExportMarkdown.test.tsx +24 -5
  312. package/src/primitives/assistantModal/AssistantModalRoot.test.tsx +1 -1
  313. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.test.tsx +91 -0
  314. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.tsx +54 -0
  315. package/src/primitives/composer/ComposerInput.focus-on-run-start.test.tsx +1 -1
  316. package/src/primitives/composer/ComposerInput.test.tsx +1 -0
  317. package/src/primitives/composer/ComposerInput.text-change.test.tsx +68 -0
  318. package/src/primitives/composer/ComposerInput.thread-scope.test.tsx +82 -0
  319. package/src/primitives/composer/ComposerInput.tsx +4 -3
  320. package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +6 -4
  321. package/src/primitives/composer/trigger/triggerSelectionResource.ts +2 -0
  322. package/src/primitives/reasoning/useScrollLock.test.tsx +71 -2
  323. package/src/primitives/reasoning/useScrollLock.ts +78 -51
  324. package/src/primitives/thread/ThreadRoot.test.tsx +1 -1
  325. package/src/primitives/thread/ThreadViewport.thread-scope.test.tsx +51 -0
  326. package/src/primitives/thread/useThreadViewportAutoScroll.ts +8 -2
  327. package/src/primitives/threadListItem/ThreadListItemRoot.tsx +4 -1
  328. package/src/primitives/threadListItem/ThreadListItemUnarchive.test.tsx +52 -0
  329. package/src/primitives/threadListItem/ThreadListItemUnarchive.ts +2 -2
  330. package/src/primitives/threadListItem/ThreadListKeyboardNav.test.tsx +25 -0
  331. package/src/tests/DataRenderers.test.tsx +1 -1
  332. package/src/tests/MessageParts.loading.test.tsx +1 -1
  333. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +1 -1
  334. package/src/tests/RemoteThreadListRuntime.deferredProvider.test.tsx +4 -2
  335. package/src/tests/RemoteThreadListRuntime.reloadMainThread.test.tsx +4 -2
  336. package/src/tests/generative-ui.primitive.test.tsx +1 -1
  337. package/src/tests/local-runtime-queue.test.tsx +2 -2
  338. package/src/tests/messagePartSwitchRace.test.tsx +2 -2
  339. package/src/tests/messagePartTypeMismatch.test.tsx +1 -1
  340. package/src/tests/threadListItemIsRunning.test.tsx +5 -3
  341. package/src/tests/toolCallTiming.test.tsx +1 -1
  342. package/src/unstable/useComposerInput.test.tsx +1 -1
  343. package/src/unstable/useComposerInput.ts +1 -1
  344. package/src/unstable/useComposerInputHistory.test.tsx +10 -7
  345. package/src/unstable/useComposerInputHistory.thread-scope.test.tsx +123 -0
  346. package/src/unstable/useComposerInputHistory.ts +3 -2
  347. package/src/unstable/useLiveCompletionAdapter.test.tsx +44 -0
  348. package/src/unstable/useLiveCompletionAdapter.ts +3 -2
  349. package/src/unstable/webmcp/convertTools.test.ts +11 -1
  350. package/src/utils/hooks/useMediaQuery.test.tsx +35 -0
  351. package/src/utils/smooth/useSmooth.test.tsx +150 -14
  352. package/src/utils/smooth/useSmooth.ts +16 -2
  353. package/dist/context/providers/ChainOfThoughtPartByIndexProvider.d.ts +0 -2
  354. package/dist/context/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +0 -1
  355. package/dist/context/providers/ChainOfThoughtPartByIndexProvider.js +0 -3
  356. package/dist/legacy-runtime/RuntimeAdapter.d.ts +0 -2
  357. package/dist/legacy-runtime/RuntimeAdapter.d.ts.map +0 -1
  358. package/dist/legacy-runtime/RuntimeAdapter.js +0 -2
  359. package/dist/legacy-runtime/cloud/AssistantCloudThreadHistoryAdapter.d.ts +0 -2
  360. package/dist/legacy-runtime/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +0 -1
  361. package/dist/legacy-runtime/cloud/AssistantCloudThreadHistoryAdapter.js +0 -3
  362. package/dist/legacy-runtime/runtime/AssistantRuntime.d.ts +0 -3
  363. package/dist/legacy-runtime/runtime/AssistantRuntime.d.ts.map +0 -1
  364. package/dist/legacy-runtime/runtime/AssistantRuntime.js +0 -2
  365. package/dist/legacy-runtime/runtime/AttachmentRuntime.d.ts +0 -3
  366. package/dist/legacy-runtime/runtime/AttachmentRuntime.d.ts.map +0 -1
  367. package/dist/legacy-runtime/runtime/AttachmentRuntime.js +0 -2
  368. package/dist/legacy-runtime/runtime/ComposerRuntime.d.ts +0 -4
  369. package/dist/legacy-runtime/runtime/ComposerRuntime.d.ts.map +0 -1
  370. package/dist/legacy-runtime/runtime/ComposerRuntime.js +0 -2
  371. package/dist/legacy-runtime/runtime/RuntimeBindings.d.ts +0 -3
  372. package/dist/legacy-runtime/runtime/RuntimeBindings.d.ts.map +0 -1
  373. package/dist/legacy-runtime/runtime/RuntimeBindings.js +0 -0
  374. package/dist/legacy-runtime/runtime/RuntimePathTypes.d.ts +0 -2
  375. package/dist/legacy-runtime/runtime/RuntimePathTypes.d.ts.map +0 -1
  376. package/dist/legacy-runtime/runtime/RuntimePathTypes.js +0 -0
  377. package/dist/legacy-runtime/runtime/ThreadListItemRuntime.d.ts +0 -5
  378. package/dist/legacy-runtime/runtime/ThreadListItemRuntime.d.ts.map +0 -1
  379. package/dist/legacy-runtime/runtime/ThreadListItemRuntime.js +0 -2
  380. package/dist/legacy-runtime/runtime/ThreadRuntime.d.ts +0 -4
  381. package/dist/legacy-runtime/runtime/ThreadRuntime.d.ts.map +0 -1
  382. package/dist/legacy-runtime/runtime/ThreadRuntime.js +0 -2
  383. package/dist/legacy-runtime/runtime-cores/adapters/RuntimeAdapterProvider.d.ts +0 -2
  384. package/dist/legacy-runtime/runtime-cores/adapters/RuntimeAdapterProvider.d.ts.map +0 -1
  385. package/dist/legacy-runtime/runtime-cores/adapters/RuntimeAdapterProvider.js +0 -3
  386. package/dist/legacy-runtime/runtime-cores/adapters/attachment/CloudFileAttachmentAdapter.d.ts +0 -2
  387. package/dist/legacy-runtime/runtime-cores/adapters/attachment/CloudFileAttachmentAdapter.d.ts.map +0 -1
  388. package/dist/legacy-runtime/runtime-cores/adapters/attachment/CloudFileAttachmentAdapter.js +0 -3
  389. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.d.ts +0 -2
  390. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.d.ts.map +0 -1
  391. package/dist/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.js +0 -2
  392. package/dist/legacy-runtime/runtime-cores/composer/DefaultEditComposerRuntimeCore.d.ts +0 -2
  393. package/dist/legacy-runtime/runtime-cores/composer/DefaultEditComposerRuntimeCore.d.ts.map +0 -1
  394. package/dist/legacy-runtime/runtime-cores/composer/DefaultEditComposerRuntimeCore.js +0 -2
  395. package/dist/legacy-runtime/runtime-cores/composer/DefaultThreadComposerRuntimeCore.d.ts +0 -2
  396. package/dist/legacy-runtime/runtime-cores/composer/DefaultThreadComposerRuntimeCore.d.ts.map +0 -1
  397. package/dist/legacy-runtime/runtime-cores/composer/DefaultThreadComposerRuntimeCore.js +0 -2
  398. package/dist/legacy-runtime/runtime-cores/core/AssistantRuntimeCore.d.ts +0 -2
  399. package/dist/legacy-runtime/runtime-cores/core/AssistantRuntimeCore.d.ts.map +0 -1
  400. package/dist/legacy-runtime/runtime-cores/core/AssistantRuntimeCore.js +0 -0
  401. package/dist/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.d.ts +0 -2
  402. package/dist/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.d.ts.map +0 -1
  403. package/dist/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.js +0 -2
  404. package/dist/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.d.ts +0 -2
  405. package/dist/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.d.ts.map +0 -1
  406. package/dist/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.js +0 -2
  407. package/dist/legacy-runtime/runtime-cores/core/ComposerRuntimeCore.d.ts +0 -2
  408. package/dist/legacy-runtime/runtime-cores/core/ComposerRuntimeCore.d.ts.map +0 -1
  409. package/dist/legacy-runtime/runtime-cores/core/ComposerRuntimeCore.js +0 -0
  410. package/dist/legacy-runtime/runtime-cores/core/ThreadListRuntimeCore.d.ts +0 -2
  411. package/dist/legacy-runtime/runtime-cores/core/ThreadListRuntimeCore.d.ts.map +0 -1
  412. package/dist/legacy-runtime/runtime-cores/core/ThreadListRuntimeCore.js +0 -0
  413. package/dist/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.d.ts +0 -2
  414. package/dist/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.d.ts.map +0 -1
  415. package/dist/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.js +0 -0
  416. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreAdapter.d.ts +0 -2
  417. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreAdapter.d.ts.map +0 -1
  418. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreAdapter.js +0 -0
  419. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreRuntimeCore.d.ts +0 -2
  420. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreRuntimeCore.d.ts.map +0 -1
  421. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreRuntimeCore.js +0 -2
  422. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.d.ts +0 -3
  423. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.d.ts.map +0 -1
  424. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.js +0 -2
  425. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.d.ts +0 -2
  426. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.d.ts.map +0 -1
  427. package/dist/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.js +0 -2
  428. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageConverter.d.ts +0 -3
  429. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageConverter.d.ts.map +0 -1
  430. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageConverter.js +0 -2
  431. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.d.ts +0 -3
  432. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.d.ts.map +0 -1
  433. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.js +0 -2
  434. package/dist/legacy-runtime/runtime-cores/external-store/auto-status.d.ts +0 -2
  435. package/dist/legacy-runtime/runtime-cores/external-store/auto-status.d.ts.map +0 -1
  436. package/dist/legacy-runtime/runtime-cores/external-store/auto-status.js +0 -2
  437. package/dist/legacy-runtime/runtime-cores/external-store/createMessageConverter.d.ts +0 -2
  438. package/dist/legacy-runtime/runtime-cores/external-store/createMessageConverter.d.ts.map +0 -1
  439. package/dist/legacy-runtime/runtime-cores/external-store/createMessageConverter.js +0 -3
  440. package/dist/legacy-runtime/runtime-cores/external-store/external-message-converter.d.ts +0 -2
  441. package/dist/legacy-runtime/runtime-cores/external-store/external-message-converter.d.ts.map +0 -1
  442. package/dist/legacy-runtime/runtime-cores/external-store/external-message-converter.js +0 -3
  443. package/dist/legacy-runtime/runtime-cores/external-store/useExternalStoreRuntime.d.ts +0 -2
  444. package/dist/legacy-runtime/runtime-cores/external-store/useExternalStoreRuntime.d.ts.map +0 -1
  445. package/dist/legacy-runtime/runtime-cores/external-store/useExternalStoreRuntime.js +0 -3
  446. package/dist/legacy-runtime/runtime-cores/local/ChatModelAdapter.d.ts +0 -2
  447. package/dist/legacy-runtime/runtime-cores/local/ChatModelAdapter.d.ts.map +0 -1
  448. package/dist/legacy-runtime/runtime-cores/local/ChatModelAdapter.js +0 -0
  449. package/dist/legacy-runtime/runtime-cores/local/LocalRuntimeCore.d.ts +0 -2
  450. package/dist/legacy-runtime/runtime-cores/local/LocalRuntimeCore.d.ts.map +0 -1
  451. package/dist/legacy-runtime/runtime-cores/local/LocalRuntimeCore.js +0 -2
  452. package/dist/legacy-runtime/runtime-cores/local/LocalRuntimeOptions.d.ts +0 -4
  453. package/dist/legacy-runtime/runtime-cores/local/LocalRuntimeOptions.d.ts.map +0 -1
  454. package/dist/legacy-runtime/runtime-cores/local/LocalRuntimeOptions.js +0 -2
  455. package/dist/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.d.ts +0 -3
  456. package/dist/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.d.ts.map +0 -1
  457. package/dist/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.js +0 -2
  458. package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.d.ts +0 -2
  459. package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.d.ts.map +0 -1
  460. package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.js +0 -2
  461. package/dist/legacy-runtime/runtime-cores/local/shouldContinue.d.ts +0 -2
  462. package/dist/legacy-runtime/runtime-cores/local/shouldContinue.d.ts.map +0 -1
  463. package/dist/legacy-runtime/runtime-cores/local/shouldContinue.js +0 -2
  464. package/dist/legacy-runtime/runtime-cores/local/useLocalRuntime.d.ts +0 -2
  465. package/dist/legacy-runtime/runtime-cores/local/useLocalRuntime.d.ts.map +0 -1
  466. package/dist/legacy-runtime/runtime-cores/local/useLocalRuntime.js +0 -3
  467. package/dist/legacy-runtime/runtime-cores/remote-thread-list/BaseSubscribable.d.ts +0 -2
  468. package/dist/legacy-runtime/runtime-cores/remote-thread-list/BaseSubscribable.d.ts.map +0 -1
  469. package/dist/legacy-runtime/runtime-cores/remote-thread-list/BaseSubscribable.js +0 -2
  470. package/dist/legacy-runtime/runtime-cores/remote-thread-list/EMPTY_THREAD_CORE.d.ts +0 -2
  471. package/dist/legacy-runtime/runtime-cores/remote-thread-list/EMPTY_THREAD_CORE.d.ts.map +0 -1
  472. package/dist/legacy-runtime/runtime-cores/remote-thread-list/EMPTY_THREAD_CORE.js +0 -2
  473. package/dist/legacy-runtime/runtime-cores/remote-thread-list/OptimisticState.d.ts +0 -2
  474. package/dist/legacy-runtime/runtime-cores/remote-thread-list/OptimisticState.d.ts.map +0 -1
  475. package/dist/legacy-runtime/runtime-cores/remote-thread-list/OptimisticState.js +0 -2
  476. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts +0 -2
  477. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts.map +0 -1
  478. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.js +0 -3
  479. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts +0 -2
  480. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts.map +0 -1
  481. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js +0 -3
  482. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.d.ts +0 -2
  483. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.d.ts.map +0 -1
  484. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.js +0 -3
  485. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.d.ts +0 -2
  486. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.d.ts.map +0 -1
  487. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.js +0 -2
  488. package/dist/legacy-runtime/runtime-cores/remote-thread-list/types.d.ts +0 -2
  489. package/dist/legacy-runtime/runtime-cores/remote-thread-list/types.d.ts.map +0 -1
  490. package/dist/legacy-runtime/runtime-cores/remote-thread-list/types.js +0 -0
  491. package/dist/legacy-runtime/runtime-cores/remote-thread-list/useRemoteThreadListRuntime.d.ts +0 -2
  492. package/dist/legacy-runtime/runtime-cores/remote-thread-list/useRemoteThreadListRuntime.d.ts.map +0 -1
  493. package/dist/legacy-runtime/runtime-cores/remote-thread-list/useRemoteThreadListRuntime.js +0 -3
  494. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts +0 -4
  495. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts.map +0 -1
  496. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +0 -3
  497. package/dist/utils/hooks/useOnResizeContent.d.ts +0 -2
  498. package/dist/utils/hooks/useOnResizeContent.d.ts.map +0 -1
  499. package/dist/utils/hooks/useOnResizeContent.js +0 -21
  500. package/dist/utils/hooks/useOnResizeContent.js.map +0 -1
  501. package/src/context/providers/ChainOfThoughtPartByIndexProvider.tsx +0 -3
  502. package/src/legacy-runtime/RuntimeAdapter.ts +0 -1
  503. package/src/legacy-runtime/cloud/AssistantCloudThreadHistoryAdapter.ts +0 -3
  504. package/src/legacy-runtime/runtime/AssistantRuntime.ts +0 -2
  505. package/src/legacy-runtime/runtime/AttachmentRuntime.ts +0 -7
  506. package/src/legacy-runtime/runtime/ComposerRuntime.ts +0 -20
  507. package/src/legacy-runtime/runtime/RuntimeBindings.ts +0 -12
  508. package/src/legacy-runtime/runtime/RuntimePathTypes.ts +0 -8
  509. package/src/legacy-runtime/runtime/ThreadListItemRuntime.ts +0 -10
  510. package/src/legacy-runtime/runtime/ThreadRuntime.ts +0 -14
  511. package/src/legacy-runtime/runtime-cores/adapters/RuntimeAdapterProvider.tsx +0 -7
  512. package/src/legacy-runtime/runtime-cores/adapters/attachment/CloudFileAttachmentAdapter.ts +0 -3
  513. package/src/legacy-runtime/runtime-cores/composer/BaseComposerRuntimeCore.ts +0 -1
  514. package/src/legacy-runtime/runtime-cores/composer/DefaultEditComposerRuntimeCore.ts +0 -1
  515. package/src/legacy-runtime/runtime-cores/composer/DefaultThreadComposerRuntimeCore.ts +0 -1
  516. package/src/legacy-runtime/runtime-cores/core/AssistantRuntimeCore.ts +0 -1
  517. package/src/legacy-runtime/runtime-cores/core/BaseAssistantRuntimeCore.ts +0 -1
  518. package/src/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.ts +0 -1
  519. package/src/legacy-runtime/runtime-cores/core/ComposerRuntimeCore.ts +0 -6
  520. package/src/legacy-runtime/runtime-cores/core/ThreadListRuntimeCore.ts +0 -4
  521. package/src/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.ts +0 -13
  522. package/src/legacy-runtime/runtime-cores/external-store/ExternalStoreAdapter.ts +0 -6
  523. package/src/legacy-runtime/runtime-cores/external-store/ExternalStoreRuntimeCore.ts +0 -1
  524. package/src/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadListRuntimeCore.ts +0 -2
  525. package/src/legacy-runtime/runtime-cores/external-store/ExternalStoreThreadRuntimeCore.ts +0 -4
  526. package/src/legacy-runtime/runtime-cores/external-store/ThreadMessageConverter.ts +0 -2
  527. package/src/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.ts +0 -2
  528. package/src/legacy-runtime/runtime-cores/external-store/auto-status.ts +0 -1
  529. package/src/legacy-runtime/runtime-cores/external-store/createMessageConverter.ts +0 -2
  530. package/src/legacy-runtime/runtime-cores/external-store/external-message-converter.ts +0 -7
  531. package/src/legacy-runtime/runtime-cores/external-store/useExternalStoreRuntime.ts +0 -3
  532. package/src/legacy-runtime/runtime-cores/local/ChatModelAdapter.ts +0 -7
  533. package/src/legacy-runtime/runtime-cores/local/LocalRuntimeCore.ts +0 -1
  534. package/src/legacy-runtime/runtime-cores/local/LocalRuntimeOptions.ts +0 -3
  535. package/src/legacy-runtime/runtime-cores/local/LocalThreadListRuntimeCore.ts +0 -2
  536. package/src/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.ts +0 -1
  537. package/src/legacy-runtime/runtime-cores/local/shouldContinue.ts +0 -1
  538. package/src/legacy-runtime/runtime-cores/local/useLocalRuntime.ts +0 -3
  539. package/src/legacy-runtime/runtime-cores/remote-thread-list/BaseSubscribable.ts +0 -1
  540. package/src/legacy-runtime/runtime-cores/remote-thread-list/EMPTY_THREAD_CORE.ts +0 -1
  541. package/src/legacy-runtime/runtime-cores/remote-thread-list/OptimisticState.ts +0 -1
  542. package/src/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.tsx +0 -3
  543. package/src/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.tsx +0 -3
  544. package/src/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.tsx +0 -3
  545. package/src/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.ts +0 -1
  546. package/src/legacy-runtime/runtime-cores/remote-thread-list/types.ts +0 -7
  547. package/src/legacy-runtime/runtime-cores/remote-thread-list/useRemoteThreadListRuntime.ts +0 -3
  548. package/src/legacy-runtime/runtime-cores/utils/MessageRepository.ts +0 -3
  549. package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +0 -49
  550. package/src/utils/hooks/useOnResizeContent.ts +0 -15
@@ -5,7 +5,7 @@ export declare namespace ThreadListItemPrimitiveDelete {
5
5
  type Props = ActionButtonProps<typeof useThreadListItemDelete>;
6
6
  }
7
7
  export declare const ThreadListItemPrimitiveDelete: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
8
- asChild?: boolean;
8
+ asChild?: boolean | undefined;
9
9
  }, "ref"> & {
10
10
  render?: import("react").ReactElement | undefined;
11
11
  } & import("react").RefAttributes<HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
@@ -1,13 +1,12 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
3
  import { useThreadListItemDelete } from "@assistant-ui/core/react";
4
- //#region src/primitives/threadListItem/ThreadListItemDelete.ts
4
+ // src/primitives/threadListItem/ThreadListItemDelete.ts
5
5
  const useThreadListItemDelete$1 = () => {
6
6
  const { delete: deleteThread } = useThreadListItemDelete();
7
7
  return deleteThread;
8
8
  };
9
9
  const ThreadListItemPrimitiveDelete = createActionButton("ThreadListItemPrimitive.Delete", useThreadListItemDelete$1);
10
- //#endregion
11
10
  export { ThreadListItemPrimitiveDelete };
12
11
 
13
12
  //# sourceMappingURL=ThreadListItemDelete.js.map
@@ -6,7 +6,7 @@ export declare namespace ThreadListItemPrimitiveRoot {
6
6
  type Props = PrimitiveDivProps;
7
7
  }
8
8
  export declare const ThreadListItemPrimitiveRoot: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & {
9
- asChild?: boolean;
9
+ asChild?: boolean | undefined;
10
10
  }, "ref"> & {
11
11
  render?: import("react").ReactElement | undefined;
12
12
  } & import("react").RefAttributes<HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemRoot.d.ts","sourceRoot":"","sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAI9B,MAAM,OAAO,CAAC;AASf,KAAK,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AAExE,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,iBAAiB,CAAC;CACvC;AAED,eAAO,MAAM,2BAA2B;;;;0GAwDtC,CAAC"}
1
+ {"version":3,"file":"ThreadListItemRoot.d.ts","sourceRoot":"","sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iCAA8B;AAClD,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,wBAAwB,EAI9B,MAAM,OAAO,CAAC;AASf,KAAK,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AAExE,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,iBAAiB,CAAC;CACvC;AAED,eAAO,MAAM,2BAA2B;;;;0GA2DtC,CAAC"}
@@ -6,7 +6,7 @@ import { useAuiState } from "@assistant-ui/store";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  import { composeEventHandlers } from "radix-ui/internal";
8
8
  import { Direction } from "radix-ui";
9
- //#region src/primitives/threadListItem/ThreadListItemRoot.tsx
9
+ // src/primitives/threadListItem/ThreadListItemRoot.tsx
10
10
  const ThreadListItemPrimitiveRoot = forwardRef((props, ref) => {
11
11
  const isMain = useAuiState((s) => s.threads.mainThreadId === s.threadListItem.id);
12
12
  const triggerRef = useRef(null);
@@ -25,7 +25,7 @@ const ThreadListItemPrimitiveRoot = forwardRef((props, ref) => {
25
25
  const more = moreRef.current;
26
26
  if (trigger && event.target === trigger) {
27
27
  if (event.key === "ArrowDown" || event.key === "ArrowUp") {
28
- const triggers = getItems().map((item) => item.ref.current).filter((node) => node !== null);
28
+ const triggers = getItems().map((item) => item.ref.current).filter((node) => node !== null && !node.disabled);
29
29
  const next = triggers[triggers.indexOf(trigger) + (event.key === "ArrowDown" ? 1 : -1)];
30
30
  if (next) {
31
31
  next.focus();
@@ -54,7 +54,6 @@ const ThreadListItemPrimitiveRoot = forwardRef((props, ref) => {
54
54
  });
55
55
  });
56
56
  ThreadListItemPrimitiveRoot.displayName = "ThreadListItemPrimitive.Root";
57
- //#endregion
58
57
  export { ThreadListItemPrimitiveRoot };
59
58
 
60
59
  //# sourceMappingURL=ThreadListItemRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemRoot.js","names":["Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","KeyboardEvent","useMemo","useRef","useAuiState","composeEventHandlers","Direction","ThreadListItemFocusProvider","useThreadListCollection","PrimitiveDivProps","div","ThreadListItemPrimitiveRoot","Element","Props","props","ref","isMain","s","threads","mainThreadId","threadListItem","id","triggerRef","HTMLButtonElement","moreRef","focus","getItems","undefined","direction","useDirection","onKeyDown","event","HTMLDivElement","altKey","ctrlKey","metaKey","shiftKey","forwardKey","backKey","trigger","current","more","target","key","triggers","map","item","filter","node","next","indexOf","preventDefault","displayName","Primitive"],"sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n useMemo,\n useRef,\n} from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"radix-ui/internal\";\nimport { Direction } from \"radix-ui\";\nimport {\n ThreadListItemFocusProvider,\n useThreadListCollection,\n} from \"../threadListFocusGroup\";\n\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport namespace ThreadListItemPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = PrimitiveDivProps;\n}\n\nexport const ThreadListItemPrimitiveRoot = forwardRef<\n ThreadListItemPrimitiveRoot.Element,\n ThreadListItemPrimitiveRoot.Props\n>((props, ref) => {\n const isMain = useAuiState(\n (s) => s.threads.mainThreadId === s.threadListItem.id,\n );\n\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const moreRef = useRef<HTMLButtonElement | null>(null);\n const focus = useMemo(() => ({ triggerRef, moreRef }), []);\n\n const getItems = useThreadListCollection(undefined);\n const direction = Direction.useDirection();\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)\n return;\n const forwardKey = direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n const backKey = direction === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n const trigger = triggerRef.current;\n const more = moreRef.current;\n\n if (trigger && event.target === trigger) {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const triggers = getItems()\n .map((item) => item.ref.current)\n .filter((node): node is HTMLButtonElement => node !== null);\n const next =\n triggers[\n triggers.indexOf(trigger) + (event.key === \"ArrowDown\" ? 1 : -1)\n ];\n if (next) {\n next.focus();\n event.preventDefault();\n }\n } else if (event.key === forwardKey && more) {\n more.focus();\n event.preventDefault();\n }\n } else if (more && event.target === more && event.key === backKey) {\n trigger?.focus();\n event.preventDefault();\n }\n };\n\n return (\n <ThreadListItemFocusProvider value={focus}>\n <Primitive.div\n {...(isMain ? { \"data-active\": \"true\", \"aria-current\": \"true\" } : null)}\n {...props}\n onKeyDown={composeEventHandlers(props.onKeyDown, onKeyDown)}\n ref={ref}\n />\n </ThreadListItemFocusProvider>\n );\n});\n\nThreadListItemPrimitiveRoot.displayName = \"ThreadListItemPrimitive.Root\";\n"],"mappings":";;;;;;;;;AA0BA,MAAac,8BAA8BZ,YAGxCe,OAAOC,QAAQ;CAChB,MAAMC,SAASZ,aACZa,MAAMA,EAAEC,QAAQC,iBAAiBF,EAAEG,eAAeC,EACrD;CAEA,MAAMC,aAAanB,OAAiC,IAAI;CACxD,MAAMqB,UAAUrB,OAAiC,IAAI;CACrD,MAAMsB,QAAQvB,eAAe;EAAEoB;EAAYE;CAAQ,IAAI,CAAA,CAAE;CAEzD,MAAME,WAAWlB,wBAAwBmB,KAAAA,CAAS;CAClD,MAAMC,YAAYtB,UAAUuB,aAAa;CAEzC,MAAMC,aAAaC,UAAyC;EAC1D,IAAIA,MAAME,UAAUF,MAAMG,WAAWH,MAAMI,WAAWJ,MAAMK,UAC1D;EACF,MAAMC,aAAaT,cAAc,QAAQ,cAAc;EACvD,MAAMU,UAAUV,cAAc,QAAQ,eAAe;EACrD,MAAMW,UAAUjB,WAAWkB;EAC3B,MAAMC,OAAOjB,QAAQgB;EAErB,IAAID,WAAWR,MAAMW,WAAWH,SAAS;GACvC,IAAIR,MAAMY,QAAQ,eAAeZ,MAAMY,QAAQ,WAAW;IACxD,MAAMC,WAAWlB,SAAS,CAAC,CACxBmB,KAAKC,SAASA,KAAK/B,IAAIyB,OAAO,CAAC,CAC/BO,QAAQC,SAAoCA,SAAS,IAAI;IAC5D,MAAMC,OACJL,SACEA,SAASM,QAAQX,OAAO,KAAKR,MAAMY,QAAQ,cAAc,IAAI;IAEjE,IAAIM,MAAM;KACRA,KAAKxB,MAAM;KACXM,MAAMoB,eAAe;IACvB;GACF,OAAO,IAAIpB,MAAMY,QAAQN,cAAcI,MAAM;IAC3CA,KAAKhB,MAAM;IACXM,MAAMoB,eAAe;GACvB;EACF,OAAO,IAAIV,QAAQV,MAAMW,WAAWD,QAAQV,MAAMY,QAAQL,SAAS;GACjEC,SAASd,MAAM;GACfM,MAAMoB,eAAe;EACvB;CACF;CAEA,OACE,oBAAC,6BAAD;EAA6B,OAAO1B;EAClC,UAAA,oBAAC4B,YAAU,KAAX;GACE,GAAKrC,SAAS;IAAE,eAAe;IAAQ,gBAAgB;GAAO,IAAI;GAClE,GAAIF;GACJ,WAAWT,qBAAqBS,MAAMgB,WAAWA,SAAS;GACrDf;EAAI,CAAA;CAEgB,CAAA;AAEjC,CAAC;AAEDJ,4BAA4ByC,cAAc"}
1
+ {"version":3,"file":"ThreadListItemRoot.js","names":["Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","KeyboardEvent","useMemo","useRef","useAuiState","composeEventHandlers","Direction","ThreadListItemFocusProvider","useThreadListCollection","PrimitiveDivProps","div","ThreadListItemPrimitiveRoot","Element","Props","props","ref","isMain","s","threads","mainThreadId","threadListItem","id","triggerRef","HTMLButtonElement","moreRef","focus","getItems","undefined","direction","useDirection","onKeyDown","event","HTMLDivElement","altKey","ctrlKey","metaKey","shiftKey","forwardKey","backKey","trigger","current","more","target","key","triggers","map","item","filter","node","disabled","next","indexOf","preventDefault","displayName","Primitive"],"sources":["../../../src/primitives/threadListItem/ThreadListItemRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n useMemo,\n useRef,\n} from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport { composeEventHandlers } from \"radix-ui/internal\";\nimport { Direction } from \"radix-ui\";\nimport {\n ThreadListItemFocusProvider,\n useThreadListCollection,\n} from \"../threadListFocusGroup\";\n\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nexport namespace ThreadListItemPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = PrimitiveDivProps;\n}\n\nexport const ThreadListItemPrimitiveRoot = forwardRef<\n ThreadListItemPrimitiveRoot.Element,\n ThreadListItemPrimitiveRoot.Props\n>((props, ref) => {\n const isMain = useAuiState(\n (s) => s.threads.mainThreadId === s.threadListItem.id,\n );\n\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const moreRef = useRef<HTMLButtonElement | null>(null);\n const focus = useMemo(() => ({ triggerRef, moreRef }), []);\n\n const getItems = useThreadListCollection(undefined);\n const direction = Direction.useDirection();\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)\n return;\n const forwardKey = direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\";\n const backKey = direction === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n const trigger = triggerRef.current;\n const more = moreRef.current;\n\n if (trigger && event.target === trigger) {\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n const triggers = getItems()\n .map((item) => item.ref.current)\n .filter(\n (node): node is HTMLButtonElement =>\n node !== null && !node.disabled,\n );\n const next =\n triggers[\n triggers.indexOf(trigger) + (event.key === \"ArrowDown\" ? 1 : -1)\n ];\n if (next) {\n next.focus();\n event.preventDefault();\n }\n } else if (event.key === forwardKey && more) {\n more.focus();\n event.preventDefault();\n }\n } else if (more && event.target === more && event.key === backKey) {\n trigger?.focus();\n event.preventDefault();\n }\n };\n\n return (\n <ThreadListItemFocusProvider value={focus}>\n <Primitive.div\n {...(isMain ? { \"data-active\": \"true\", \"aria-current\": \"true\" } : null)}\n {...props}\n onKeyDown={composeEventHandlers(props.onKeyDown, onKeyDown)}\n ref={ref}\n />\n </ThreadListItemFocusProvider>\n );\n});\n\nThreadListItemPrimitiveRoot.displayName = \"ThreadListItemPrimitive.Root\";\n"],"mappings":";;;;;;;;;AA0BA,MAAac,8BAA8BZ,YAGxCe,OAAOC,QAAQ;CAChB,MAAMC,SAASZ,aACZa,MAAMA,EAAEC,QAAQC,iBAAiBF,EAAEG,eAAeC,EACrD;CAEA,MAAMC,aAAanB,OAAiC,IAAI;CACxD,MAAMqB,UAAUrB,OAAiC,IAAI;CACrD,MAAMsB,QAAQvB,eAAe;EAAEoB;EAAYE;CAAQ,IAAI,CAAA,CAAE;CAEzD,MAAME,WAAWlB,wBAAwBmB,KAAAA,CAAS;CAClD,MAAMC,YAAYtB,UAAUuB,aAAa;CAEzC,MAAMC,aAAaC,UAAyC;EAC1D,IAAIA,MAAME,UAAUF,MAAMG,WAAWH,MAAMI,WAAWJ,MAAMK,UAC1D;EACF,MAAMC,aAAaT,cAAc,QAAQ,cAAc;EACvD,MAAMU,UAAUV,cAAc,QAAQ,eAAe;EACrD,MAAMW,UAAUjB,WAAWkB;EAC3B,MAAMC,OAAOjB,QAAQgB;EAErB,IAAID,WAAWR,MAAMW,WAAWH,SAAS;GACvC,IAAIR,MAAMY,QAAQ,eAAeZ,MAAMY,QAAQ,WAAW;IACxD,MAAMC,WAAWlB,SAAS,CAAC,CACxBmB,KAAKC,SAASA,KAAK/B,IAAIyB,OAAO,CAAC,CAC/BO,QACEC,SACCA,SAAS,QAAQ,CAACA,KAAKC,QAC3B;IACF,MAAMC,OACJN,SACEA,SAASO,QAAQZ,OAAO,KAAKR,MAAMY,QAAQ,cAAc,IAAI;IAEjE,IAAIO,MAAM;KACRA,KAAKzB,MAAM;KACXM,MAAMqB,eAAe;IACvB;GACF,OAAO,IAAIrB,MAAMY,QAAQN,cAAcI,MAAM;IAC3CA,KAAKhB,MAAM;IACXM,MAAMqB,eAAe;GACvB;EACF,OAAO,IAAIX,QAAQV,MAAMW,WAAWD,QAAQV,MAAMY,QAAQL,SAAS;GACjEC,SAASd,MAAM;GACfM,MAAMqB,eAAe;EACvB;CACF;CAEA,OACE,oBAAC,6BAAD;EAA6B,OAAO3B;EAClC,UAAA,oBAAC6B,YAAU,KAAX;GACE,GAAKtC,SAAS;IAAE,eAAe;IAAQ,gBAAgB;GAAO,IAAI;GAClE,GAAIF;GACJ,WAAWT,qBAAqBS,MAAMgB,WAAWA,SAAS;GACrDf;EAAI,CAAA;CAEgB,CAAA;AAEjC,CAAC;AAEDJ,4BAA4B0C,cAAc"}
@@ -1,3 +1,2 @@
1
1
  "use client";
2
- import { ThreadListItemPrimitiveTitle } from "@assistant-ui/core/react";
3
- export { ThreadListItemPrimitiveTitle };
2
+ export { ThreadListItemPrimitiveTitle } from "@assistant-ui/core/react";
@@ -5,7 +5,7 @@ export declare namespace ThreadListItemPrimitiveTrigger {
5
5
  type Props = ActionButtonProps<typeof useThreadListItemTrigger>;
6
6
  }
7
7
  export declare const ThreadListItemPrimitiveTrigger: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
8
- asChild?: boolean;
8
+ asChild?: boolean | undefined;
9
9
  }, "ref"> & {
10
10
  render?: import("react").ReactElement | undefined;
11
11
  } & import("react").RefAttributes<HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
@@ -6,7 +6,7 @@ import { useThreadListItemTrigger } from "@assistant-ui/core/react";
6
6
  import { forwardRef } from "@assistant-ui/tap/react-shim";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  import { useComposedRefs } from "radix-ui/internal";
9
- //#region src/primitives/threadListItem/ThreadListItemTrigger.tsx
9
+ // src/primitives/threadListItem/ThreadListItemTrigger.tsx
10
10
  const useThreadListItemTrigger$1 = () => {
11
11
  const { switchTo } = useThreadListItemTrigger();
12
12
  return switchTo;
@@ -32,7 +32,6 @@ const ThreadListItemPrimitiveTrigger = forwardRef((props, forwardedRef) => {
32
32
  return t0;
33
33
  });
34
34
  ThreadListItemPrimitiveTrigger.displayName = "ThreadListItemPrimitive.Trigger";
35
- //#endregion
36
35
  export { ThreadListItemPrimitiveTrigger };
37
36
 
38
37
  //# sourceMappingURL=ThreadListItemTrigger.js.map
@@ -1,11 +1,11 @@
1
1
  import { type ActionButtonElement, type ActionButtonProps } from "../../utils/createActionButton.js";
2
- declare const useThreadListItemUnarchive: () => () => void;
2
+ declare const useThreadListItemUnarchive: () => (() => void) | null;
3
3
  export declare namespace ThreadListItemPrimitiveUnarchive {
4
4
  type Element = ActionButtonElement;
5
5
  type Props = ActionButtonProps<typeof useThreadListItemUnarchive>;
6
6
  }
7
7
  export declare const ThreadListItemPrimitiveUnarchive: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
8
- asChild?: boolean;
8
+ asChild?: boolean | undefined;
9
9
  }, "ref"> & {
10
10
  render?: import("react").ReactElement | undefined;
11
11
  } & import("react").RefAttributes<HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemUnarchive.d.ts","sourceRoot":"","sources":["../../../src/primitives/threadListItem/ThreadListItemUnarchive.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAEvB,0CAAuC;AAGxC,QAAA,MAAM,0BAA0B,kBAG/B,CAAC;AAEF,yBAAiB,gCAAgC,CAAC;IAChD,KAAY,OAAO,GAAG,mBAAmB,CAAC;IAC1C,KAAY,KAAK,GAAG,iBAAiB,CAAC,OAAO,0BAA0B,CAAC,CAAC;CAC1E;AAED,eAAO,MAAM,gCAAgC;;;;gHAG5C,CAAC"}
1
+ {"version":3,"file":"ThreadListItemUnarchive.d.ts","sourceRoot":"","sources":["../../../src/primitives/threadListItem/ThreadListItemUnarchive.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAEvB,0CAAuC;AAGxC,QAAA,MAAM,0BAA0B,2BAG/B,CAAC;AAEF,yBAAiB,gCAAgC,CAAC;IAChD,KAAY,OAAO,GAAG,mBAAmB,CAAC;IAC1C,KAAY,KAAK,GAAG,iBAAiB,CAAC,OAAO,0BAA0B,CAAC,CAAC;CAC1E;AAED,eAAO,MAAM,gCAAgC;;;;gHAG5C,CAAC"}
@@ -1,13 +1,12 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
3
  import { useThreadListItemUnarchive } from "@assistant-ui/core/react";
4
- //#region src/primitives/threadListItem/ThreadListItemUnarchive.ts
4
+ // src/primitives/threadListItem/ThreadListItemUnarchive.ts
5
5
  const useThreadListItemUnarchive$1 = () => {
6
- const { unarchive } = useThreadListItemUnarchive();
7
- return unarchive;
6
+ const { unarchive, disabled } = useThreadListItemUnarchive();
7
+ return disabled ? null : unarchive;
8
8
  };
9
9
  const ThreadListItemPrimitiveUnarchive = createActionButton("ThreadListItemPrimitive.Unarchive", useThreadListItemUnarchive$1);
10
- //#endregion
11
10
  export { ThreadListItemPrimitiveUnarchive };
12
11
 
13
12
  //# sourceMappingURL=ThreadListItemUnarchive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItemUnarchive.js","names":["ActionButtonElement","ActionButtonProps","createActionButton","useThreadListItemUnarchive","useThreadListItemUnarchiveBehavior","unarchive","ThreadListItemPrimitiveUnarchive","Element","Props","useThreadListItemUnarchive","useThreadListItemUnarchiveBehavior"],"sources":["../../../src/primitives/threadListItem/ThreadListItemUnarchive.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useThreadListItemUnarchive as useThreadListItemUnarchiveBehavior } from \"@assistant-ui/core/react\";\n\nconst useThreadListItemUnarchive = () => {\n const { unarchive } = useThreadListItemUnarchiveBehavior();\n return unarchive;\n};\n\nexport namespace ThreadListItemPrimitiveUnarchive {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useThreadListItemUnarchive>;\n}\n\nexport const ThreadListItemPrimitiveUnarchive = createActionButton(\n \"ThreadListItemPrimitive.Unarchive\",\n useThreadListItemUnarchive,\n);\n"],"mappings":";;;;AASA,MAAMG,qCAA6B;CACjC,MAAA,EAAAE,cAAsBD,2BAAmC;CAAE,OACpDC;AAAS;AAQlB,MAAaC,mCAAmCJ,mBAC9C,qCACAC,4BACF"}
1
+ {"version":3,"file":"ThreadListItemUnarchive.js","names":["ActionButtonElement","ActionButtonProps","createActionButton","useThreadListItemUnarchive","useThreadListItemUnarchiveBehavior","unarchive","disabled","ThreadListItemPrimitiveUnarchive","Element","Props","useThreadListItemUnarchive","useThreadListItemUnarchiveBehavior"],"sources":["../../../src/primitives/threadListItem/ThreadListItemUnarchive.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useThreadListItemUnarchive as useThreadListItemUnarchiveBehavior } from \"@assistant-ui/core/react\";\n\nconst useThreadListItemUnarchive = () => {\n const { unarchive, disabled } = useThreadListItemUnarchiveBehavior();\n return disabled ? null : unarchive;\n};\n\nexport namespace ThreadListItemPrimitiveUnarchive {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useThreadListItemUnarchive>;\n}\n\nexport const ThreadListItemPrimitiveUnarchive = createActionButton(\n \"ThreadListItemPrimitive.Unarchive\",\n useThreadListItemUnarchive,\n);\n"],"mappings":";;;;AASA,MAAMG,qCAA6B;CACjC,MAAA,EAAAE,WAAAC,aAAgCF,2BAAmC;CAAE,OAC9DE,WAAA,OAAAD;AAA2B;AAQpC,MAAaE,mCAAmCL,mBAC9C,qCACAC,4BACF"}
@@ -5,7 +5,7 @@ import { ThreadListItemPrimitiveUnarchive } from "./threadListItem/ThreadListIte
5
5
  import { ThreadListItemPrimitiveDelete } from "./threadListItem/ThreadListItemDelete.js";
6
6
  import { ThreadListItemPrimitiveTrigger } from "./threadListItem/ThreadListItemTrigger.js";
7
7
  import { ThreadListItemPrimitiveTitle } from "./threadListItem/ThreadListItemTitle.js";
8
- //#region src/primitives/threadListItem.ts
8
+ // src/primitives/threadListItem.ts
9
9
  var threadListItem_exports = /* @__PURE__ */ __exportAll({
10
10
  Archive: () => ThreadListItemPrimitiveArchive,
11
11
  Delete: () => ThreadListItemPrimitiveDelete,
@@ -14,7 +14,6 @@ var threadListItem_exports = /* @__PURE__ */ __exportAll({
14
14
  Trigger: () => ThreadListItemPrimitiveTrigger,
15
15
  Unarchive: () => ThreadListItemPrimitiveUnarchive
16
16
  });
17
- //#endregion
18
17
  export { ThreadListItemPrimitiveArchive as Archive, ThreadListItemPrimitiveDelete as Delete, ThreadListItemPrimitiveRoot as Root, ThreadListItemPrimitiveTitle as Title, ThreadListItemPrimitiveTrigger as Trigger, ThreadListItemPrimitiveUnarchive as Unarchive, threadListItem_exports };
19
18
 
20
19
  //# sourceMappingURL=threadListItem.js.map
@@ -8,7 +8,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  import { composeEventHandlers } from "radix-ui/internal";
10
10
  import { Direction, DropdownMenu } from "radix-ui";
11
- //#region src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx
11
+ // src/primitives/threadListItemMore/ThreadListItemMoreContent.tsx
12
12
  const ThreadListItemMorePrimitiveContent = forwardRef((t0, forwardedRef) => {
13
13
  const $ = c(21);
14
14
  const { __scopeThreadListItemMore, portalProps, sideOffset: t1, ...props } = t0;
@@ -82,7 +82,6 @@ const ThreadListItemMorePrimitiveContent = forwardRef((t0, forwardedRef) => {
82
82
  return t8;
83
83
  });
84
84
  ThreadListItemMorePrimitiveContent.displayName = "ThreadListItemMorePrimitive.Content";
85
- //#endregion
86
85
  export { ThreadListItemMorePrimitiveContent };
87
86
 
88
87
  //# sourceMappingURL=ThreadListItemMoreContent.js.map
@@ -4,7 +4,7 @@ import { useDropdownMenuScope } from "./scope.js";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { forwardRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
- //#region src/primitives/threadListItemMore/ThreadListItemMoreItem.tsx
7
+ // src/primitives/threadListItemMore/ThreadListItemMoreItem.tsx
8
8
  const ThreadListItemMorePrimitiveItem = forwardRef((t0, ref) => {
9
9
  const $ = c(7);
10
10
  let __scopeThreadListItemMore;
@@ -34,7 +34,6 @@ const ThreadListItemMorePrimitiveItem = forwardRef((t0, ref) => {
34
34
  return t1;
35
35
  });
36
36
  ThreadListItemMorePrimitiveItem.displayName = "ThreadListItemMorePrimitive.Item";
37
- //#endregion
38
37
  export { ThreadListItemMorePrimitiveItem };
39
38
 
40
39
  //# sourceMappingURL=ThreadListItemMoreItem.js.map
@@ -5,7 +5,7 @@ import { createContext, useContext } from "@assistant-ui/tap/react-shim";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { useControllableState } from "radix-ui/internal";
7
7
  import { DropdownMenu } from "radix-ui";
8
- //#region src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx
8
+ // src/primitives/threadListItemMore/ThreadListItemMoreRoot.tsx
9
9
  const ThreadListItemMoreSetOpenContext = createContext(() => {});
10
10
  const useThreadListItemMoreSetOpen = () => {
11
11
  return useContext(ThreadListItemMoreSetOpenContext);
@@ -112,7 +112,6 @@ const ThreadListItemMorePrimitiveRoot = (t0) => {
112
112
  return t7;
113
113
  };
114
114
  ThreadListItemMorePrimitiveRoot.displayName = "ThreadListItemMorePrimitive.Root";
115
- //#endregion
116
115
  export { ThreadListItemMorePrimitiveRoot, useThreadListItemMoreSetOpen, useThreadListItemMoreSharedFocusGroup };
117
116
 
118
117
  //# sourceMappingURL=ThreadListItemMoreRoot.js.map
@@ -4,7 +4,7 @@ import { useDropdownMenuScope } from "./scope.js";
4
4
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  import { forwardRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
- //#region src/primitives/threadListItemMore/ThreadListItemMoreSeparator.tsx
7
+ // src/primitives/threadListItemMore/ThreadListItemMoreSeparator.tsx
8
8
  const ThreadListItemMorePrimitiveSeparator = forwardRef((t0, ref) => {
9
9
  const $ = c(7);
10
10
  let __scopeThreadListItemMore;
@@ -34,7 +34,6 @@ const ThreadListItemMorePrimitiveSeparator = forwardRef((t0, ref) => {
34
34
  return t1;
35
35
  });
36
36
  ThreadListItemMorePrimitiveSeparator.displayName = "ThreadListItemMorePrimitive.Separator";
37
- //#endregion
38
37
  export { ThreadListItemMorePrimitiveSeparator };
39
38
 
40
39
  //# sourceMappingURL=ThreadListItemMoreSeparator.js.map
@@ -8,7 +8,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  import { composeEventHandlers, useComposedRefs } from "radix-ui/internal";
10
10
  import { Direction } from "radix-ui";
11
- //#region src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx
11
+ // src/primitives/threadListItemMore/ThreadListItemMoreTrigger.tsx
12
12
  const ThreadListItemMorePrimitiveTrigger = forwardRef((t0, ref) => {
13
13
  const $ = c(10);
14
14
  const { __scopeThreadListItemMore, ...rest } = t0;
@@ -51,7 +51,6 @@ const ThreadListItemMorePrimitiveTrigger = forwardRef((t0, ref) => {
51
51
  return t3;
52
52
  });
53
53
  ThreadListItemMorePrimitiveTrigger.displayName = "ThreadListItemMorePrimitive.Trigger";
54
- //#endregion
55
54
  export { ThreadListItemMorePrimitiveTrigger };
56
55
 
57
56
  //# sourceMappingURL=ThreadListItemMoreTrigger.js.map
@@ -1,7 +1,6 @@
1
1
  import { DropdownMenu } from "radix-ui";
2
- //#region src/primitives/threadListItemMore/scope.ts
2
+ // src/primitives/threadListItemMore/scope.ts
3
3
  const useDropdownMenuScope = DropdownMenu.createDropdownMenuScope();
4
- //#endregion
5
4
  export { useDropdownMenuScope };
6
5
 
7
6
  //# sourceMappingURL=scope.js.map
@@ -4,7 +4,7 @@ import { ThreadListItemMorePrimitiveTrigger } from "./threadListItemMore/ThreadL
4
4
  import { ThreadListItemMorePrimitiveContent } from "./threadListItemMore/ThreadListItemMoreContent.js";
5
5
  import { ThreadListItemMorePrimitiveItem } from "./threadListItemMore/ThreadListItemMoreItem.js";
6
6
  import { ThreadListItemMorePrimitiveSeparator } from "./threadListItemMore/ThreadListItemMoreSeparator.js";
7
- //#region src/primitives/threadListItemMore.ts
7
+ // src/primitives/threadListItemMore.ts
8
8
  var threadListItemMore_exports = /* @__PURE__ */ __exportAll({
9
9
  Content: () => ThreadListItemMorePrimitiveContent,
10
10
  Item: () => ThreadListItemMorePrimitiveItem,
@@ -12,7 +12,6 @@ var threadListItemMore_exports = /* @__PURE__ */ __exportAll({
12
12
  Separator: () => ThreadListItemMorePrimitiveSeparator,
13
13
  Trigger: () => ThreadListItemMorePrimitiveTrigger
14
14
  });
15
- //#endregion
16
15
  export { ThreadListItemMorePrimitiveContent as Content, ThreadListItemMorePrimitiveItem as Item, ThreadListItemMorePrimitiveRoot as Root, ThreadListItemMorePrimitiveSeparator as Separator, ThreadListItemMorePrimitiveTrigger as Trigger, threadListItemMore_exports };
17
16
 
18
17
  //# sourceMappingURL=threadListItemMore.js.map
@@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
5
5
  import { invokeUserCallback } from "@assistant-ui/core/internal";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  import { SafeContentFrame, isShimLoadError } from "safe-content-frame";
8
- //#region src/sandbox-host/SandboxHost.tsx
8
+ // src/sandbox-host/SandboxHost.tsx
9
9
  const DEFAULT_PRODUCT = "assistant-ui-sandbox";
10
10
  const DEFAULT_MAX_HEIGHT = 800;
11
11
  const LOAD_TIMEOUT_MS = 1e4;
@@ -184,7 +184,6 @@ function SandboxHost(t0) {
184
184
  } else t9 = $[20];
185
185
  return t9;
186
186
  }
187
- //#endregion
188
187
  export { SandboxHost, isSandboxFrameMessage };
189
188
 
190
189
  //# sourceMappingURL=SandboxHost.js.map
@@ -4,7 +4,7 @@ import { useComposerSend } from "@assistant-ui/core/react";
4
4
  import { useCallback } from "@assistant-ui/tap/react-shim";
5
5
  import { useAui } from "@assistant-ui/store";
6
6
  import { flushTapSync } from "@assistant-ui/tap";
7
- //#region src/unstable/useComposerInput.ts
7
+ // src/unstable/useComposerInput.ts
8
8
  /**
9
9
  * Headless bridge to the composer's text value and send action, for building a
10
10
  * custom composer input without `ComposerPrimitive.Input`. It is a thin bridge,
@@ -40,7 +40,7 @@ function unstable_useComposerInput(options) {
40
40
  const setText = useCallback((text) => {
41
41
  if (!aui.composer.getState().isEditing) return;
42
42
  flushTapSync(() => {
43
- aui.composer.setText(text);
43
+ aui.composer.setText(text, { origin: "user" });
44
44
  });
45
45
  }, [aui]);
46
46
  const { send: rawSend, disabled: sendDisabled } = useComposerSend();
@@ -74,7 +74,6 @@ function unstable_useComposerInput(options) {
74
74
  function unstable_useTriggerPopoverAriaProps() {
75
75
  return useTriggerPopoverAriaProps();
76
76
  }
77
- //#endregion
78
77
  export { unstable_useComposerInput, unstable_useTriggerPopoverAriaProps };
79
78
 
80
79
  //# sourceMappingURL=useComposerInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useComposerInput.js","names":["useCallback","useAui","flushTapSync","useComposerSend","ComposerSendOptions","TriggerPopoverAriaProps","useComposerInputDisabled","useComposerInputValue","useTriggerPopoverAriaProps","Unstable_UseComposerInputOptions","disabled","Unstable_ComposerInput","value","setText","text","send","options","isDisabled","canSend","unstable_useComposerInput","aui","composer","getState","isEditing","rawSend","sendDisabled","sendOptions","Unstable_TriggerPopoverAriaProps","unstable_useTriggerPopoverAriaProps"],"sources":["../../src/unstable/useComposerInput.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { useComposerSend } from \"@assistant-ui/core/react\";\nimport type { ComposerSendOptions } from \"@assistant-ui/core/store\";\nimport {\n type TriggerPopoverAriaProps,\n useComposerInputDisabled,\n useComposerInputValue,\n useTriggerPopoverAriaProps,\n} from \"../primitives/composer/useComposerInputState\";\n\n/** @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_UseComposerInputOptions = {\n /**\n * Disables the input in addition to the composer's own disabled sources\n * (thread disabled, active dictation). When disabled, `isDisabled` is `true`\n * and `canSend` is `false`.\n */\n disabled?: boolean | undefined;\n};\n\n/** @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_ComposerInput = {\n /** Current composer text, or `\"\"` when the composer is not editing. */\n value: string;\n /**\n * Writes `text` into the composer, mirroring `ComposerPrimitive.Input`:\n * a no-op unless the composer is editing; the controlled value stays in\n * sync within the same tick.\n */\n setText(text: string): void;\n /**\n * Sends the current message when `canSend` is `true`; otherwise a no-op.\n * Accepts the same options as the composer send action.\n */\n send(options?: ComposerSendOptions): void;\n /**\n * Whether the input is disabled, combining the `disabled` option with the\n * composer's own disabled sources (thread disabled, active dictation).\n */\n isDisabled: boolean;\n /**\n * Whether a send is currently available. Matches `ComposerPrimitive.Send`\n * gating (non-empty editing composer, not running without queue support) and\n * is additionally `false` while `isDisabled`.\n */\n canSend: boolean;\n};\n\n/**\n * Headless bridge to the composer's text value and send action, for building a\n * custom composer input without `ComposerPrimitive.Input`. It is a thin bridge,\n * not a second input: it does not own keyboard behavior, autosize, IME or\n * contentEditable sync, paste/drop attachments, focus management, or rich-text\n * state. Spread `unstable_useTriggerPopoverAriaProps()` onto your element for\n * trigger-popover combobox semantics.\n *\n * @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const { value, setText, send, isDisabled, canSend } = unstable_useComposerInput();\n * <textarea\n * value={value}\n * disabled={isDisabled}\n * onChange={(e) => setText(e.target.value)}\n * onKeyDown={(e) => {\n * if (e.nativeEvent.isComposing || e.keyCode === 229) return;\n *\n * if (e.key === \"Enter\" && !e.shiftKey && canSend) {\n * e.preventDefault();\n * send();\n * }\n * }}\n * />\n * ```\n */\nexport function unstable_useComposerInput(\n options?: Unstable_UseComposerInputOptions,\n): Unstable_ComposerInput {\n const aui = useAui();\n const value = useComposerInputValue();\n const isDisabled = useComposerInputDisabled(options?.disabled);\n\n const setText = useCallback(\n (text: string) => {\n if (!aui.composer.getState().isEditing) return;\n flushTapSync(() => {\n aui.composer.setText(text);\n });\n },\n [aui],\n );\n\n const { send: rawSend, disabled: sendDisabled } = useComposerSend();\n const canSend = !sendDisabled && !isDisabled;\n const send = useCallback(\n (sendOptions?: ComposerSendOptions) => {\n if (!canSend) return;\n rawSend(sendOptions);\n },\n [canSend, rawSend],\n );\n\n return { value, setText, send, isDisabled, canSend };\n}\n\n/** @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_TriggerPopoverAriaProps = TriggerPopoverAriaProps;\n\n/**\n * ARIA combobox attributes for the focused element (typically the composer\n * input) describing the open trigger popover, per the WAI-ARIA editable\n * combobox pattern. Returns an empty object outside a `TriggerPopoverRoot` or\n * when no popover is open. Spread these last so they take precedence over any\n * matching ARIA props you set yourself, mirroring `ComposerPrimitive.Input`.\n *\n * @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const aria = unstable_useTriggerPopoverAriaProps();\n * <textarea {...aria} />\n * ```\n */\nexport function unstable_useTriggerPopoverAriaProps(): Unstable_TriggerPopoverAriaProps {\n return useTriggerPopoverAriaProps();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFA,SAAgBmB,0BACdH,SACwB;CACxB,MAAMI,MAAMnB,OAAO;CACnB,MAAMW,QAAQL,sBAAsB;CACpC,MAAMU,aAAaX,yBAAyBU,SAASN,QAAQ;CAE7D,MAAMG,UAAUb,aACbc,SAAiB;EAChB,IAAI,CAACM,IAAIC,SAASC,SAAS,CAAC,CAACC,WAAW;EACxCrB,mBAAmB;GACjBkB,IAAIC,SAASR,QAAQC,IAAI;EAC3B,CAAC;CACH,GACA,CAACM,GAAG,CACN;CAEA,MAAM,EAAEL,MAAMS,SAASd,UAAUe,iBAAiBtB,gBAAgB;CAClE,MAAMe,UAAU,CAACO,gBAAgB,CAACR;CASlC,OAAO;EAAEL;EAAOC;EAASE,MARZf,aACV0B,gBAAsC;GACrC,IAAI,CAACR,SAAS;GACdM,QAAQE,WAAW;EACrB,GACA,CAACR,SAASM,OAAO,CAGMT;EAAME;EAAYC;CAAQ;AACrD;;;;;;;;;;;;;;;;AAoBA,SAAgBU,sCAAwE;CACtF,OAAOpB,2BAA2B;AACpC"}
1
+ {"version":3,"file":"useComposerInput.js","names":["useCallback","useAui","flushTapSync","useComposerSend","ComposerSendOptions","TriggerPopoverAriaProps","useComposerInputDisabled","useComposerInputValue","useTriggerPopoverAriaProps","Unstable_UseComposerInputOptions","disabled","Unstable_ComposerInput","value","setText","text","send","options","isDisabled","canSend","unstable_useComposerInput","aui","composer","getState","isEditing","origin","rawSend","sendDisabled","sendOptions","Unstable_TriggerPopoverAriaProps","unstable_useTriggerPopoverAriaProps"],"sources":["../../src/unstable/useComposerInput.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { useComposerSend } from \"@assistant-ui/core/react\";\nimport type { ComposerSendOptions } from \"@assistant-ui/core/store\";\nimport {\n type TriggerPopoverAriaProps,\n useComposerInputDisabled,\n useComposerInputValue,\n useTriggerPopoverAriaProps,\n} from \"../primitives/composer/useComposerInputState\";\n\n/** @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_UseComposerInputOptions = {\n /**\n * Disables the input in addition to the composer's own disabled sources\n * (thread disabled, active dictation). When disabled, `isDisabled` is `true`\n * and `canSend` is `false`.\n */\n disabled?: boolean | undefined;\n};\n\n/** @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_ComposerInput = {\n /** Current composer text, or `\"\"` when the composer is not editing. */\n value: string;\n /**\n * Writes `text` into the composer, mirroring `ComposerPrimitive.Input`:\n * a no-op unless the composer is editing; the controlled value stays in\n * sync within the same tick.\n */\n setText(text: string): void;\n /**\n * Sends the current message when `canSend` is `true`; otherwise a no-op.\n * Accepts the same options as the composer send action.\n */\n send(options?: ComposerSendOptions): void;\n /**\n * Whether the input is disabled, combining the `disabled` option with the\n * composer's own disabled sources (thread disabled, active dictation).\n */\n isDisabled: boolean;\n /**\n * Whether a send is currently available. Matches `ComposerPrimitive.Send`\n * gating (non-empty editing composer, not running without queue support) and\n * is additionally `false` while `isDisabled`.\n */\n canSend: boolean;\n};\n\n/**\n * Headless bridge to the composer's text value and send action, for building a\n * custom composer input without `ComposerPrimitive.Input`. It is a thin bridge,\n * not a second input: it does not own keyboard behavior, autosize, IME or\n * contentEditable sync, paste/drop attachments, focus management, or rich-text\n * state. Spread `unstable_useTriggerPopoverAriaProps()` onto your element for\n * trigger-popover combobox semantics.\n *\n * @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const { value, setText, send, isDisabled, canSend } = unstable_useComposerInput();\n * <textarea\n * value={value}\n * disabled={isDisabled}\n * onChange={(e) => setText(e.target.value)}\n * onKeyDown={(e) => {\n * if (e.nativeEvent.isComposing || e.keyCode === 229) return;\n *\n * if (e.key === \"Enter\" && !e.shiftKey && canSend) {\n * e.preventDefault();\n * send();\n * }\n * }}\n * />\n * ```\n */\nexport function unstable_useComposerInput(\n options?: Unstable_UseComposerInputOptions,\n): Unstable_ComposerInput {\n const aui = useAui();\n const value = useComposerInputValue();\n const isDisabled = useComposerInputDisabled(options?.disabled);\n\n const setText = useCallback(\n (text: string) => {\n if (!aui.composer.getState().isEditing) return;\n flushTapSync(() => {\n aui.composer.setText(text, { origin: \"user\" });\n });\n },\n [aui],\n );\n\n const { send: rawSend, disabled: sendDisabled } = useComposerSend();\n const canSend = !sendDisabled && !isDisabled;\n const send = useCallback(\n (sendOptions?: ComposerSendOptions) => {\n if (!canSend) return;\n rawSend(sendOptions);\n },\n [canSend, rawSend],\n );\n\n return { value, setText, send, isDisabled, canSend };\n}\n\n/** @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_TriggerPopoverAriaProps = TriggerPopoverAriaProps;\n\n/**\n * ARIA combobox attributes for the focused element (typically the composer\n * input) describing the open trigger popover, per the WAI-ARIA editable\n * combobox pattern. Returns an empty object outside a `TriggerPopoverRoot` or\n * when no popover is open. Spread these last so they take precedence over any\n * matching ARIA props you set yourself, mirroring `ComposerPrimitive.Input`.\n *\n * @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const aria = unstable_useTriggerPopoverAriaProps();\n * <textarea {...aria} />\n * ```\n */\nexport function unstable_useTriggerPopoverAriaProps(): Unstable_TriggerPopoverAriaProps {\n return useTriggerPopoverAriaProps();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFA,SAAgBmB,0BACdH,SACwB;CACxB,MAAMI,MAAMnB,OAAO;CACnB,MAAMW,QAAQL,sBAAsB;CACpC,MAAMU,aAAaX,yBAAyBU,SAASN,QAAQ;CAE7D,MAAMG,UAAUb,aACbc,SAAiB;EAChB,IAAI,CAACM,IAAIC,SAASC,SAAS,CAAC,CAACC,WAAW;EACxCrB,mBAAmB;GACjBkB,IAAIC,SAASR,QAAQC,MAAM,EAAEU,QAAQ,OAAO,CAAC;EAC/C,CAAC;CACH,GACA,CAACJ,GAAG,CACN;CAEA,MAAM,EAAEL,MAAMU,SAASf,UAAUgB,iBAAiBvB,gBAAgB;CAClE,MAAMe,UAAU,CAACQ,gBAAgB,CAACT;CASlC,OAAO;EAAEL;EAAOC;EAASE,MARZf,aACV2B,gBAAsC;GACrC,IAAI,CAACT,SAAS;GACdO,QAAQE,WAAW;EACrB,GACA,CAACT,SAASO,OAAO,CAGMV;EAAME;EAAYC;CAAQ;AACrD;;;;;;;;;;;;;;;;AAoBA,SAAgBW,sCAAwE;CACtF,OAAOrB,2BAA2B;AACpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useComposerInputHistory.d.ts","sourceRoot":"","sources":["../../src/unstable/useComposerInputHistory.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,oBAAoB,EAC1B,MAAM,OAAO,CAAC;AAOf,+GAA+G;AAC/G,MAAM,MAAM,6BAA6B,GAAG;IAC1C,gEAAgE;IAChE,SAAS,EAAE,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;CACtD,CAAC;AA2BF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gCAAgC,IAAI,6BAA6B,CA6FhF"}
1
+ {"version":3,"file":"useComposerInputHistory.d.ts","sourceRoot":"","sources":["../../src/unstable/useComposerInputHistory.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,oBAAoB,EAC1B,MAAM,OAAO,CAAC;AAOf,+GAA+G;AAC/G,MAAM,MAAM,6BAA6B,GAAG;IAC1C,gEAAgE;IAChE,SAAS,EAAE,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;CACtD,CAAC;AA2BF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gCAAgC,IAAI,6BAA6B,CA8FhF"}
@@ -4,7 +4,7 @@ import { useCallback, useEffect, useMemo, useRef } from "@assistant-ui/tap/react
4
4
  import { useAui } from "@assistant-ui/store";
5
5
  import { flushTapSync } from "@assistant-ui/tap";
6
6
  import { getThreadMessageText } from "@assistant-ui/core/internal";
7
- //#region src/unstable/useComposerInputHistory.ts
7
+ // src/unstable/useComposerInputHistory.ts
8
8
  const deriveHistory = (messages) => {
9
9
  const entries = [];
10
10
  for (let i = messages.length - 1; i >= 0; i--) {
@@ -44,7 +44,7 @@ function unstable_useComposerInputHistory() {
44
44
  const popoverCtx = useTriggerPopoverRootContextOptional();
45
45
  const browseRef = useRef(null);
46
46
  useEffect(() => {
47
- if (aui.composer.getState().type !== "thread") return void 0;
47
+ if (aui.composer.getState().type !== "thread" || !aui.optional.threads) return void 0;
48
48
  return aui.on("threads.selectionChanged", () => {
49
49
  browseRef.current = null;
50
50
  });
@@ -62,7 +62,7 @@ function unstable_useComposerInputHistory() {
62
62
  if (browseRef.current && value !== browseRef.current.lastRecalledText) browseRef.current = null;
63
63
  const browse = browseRef.current;
64
64
  const commitText = (text) => {
65
- flushTapSync(() => aui.composer.setText(text));
65
+ flushTapSync(() => aui.composer.setText(text, { origin: "recall" }));
66
66
  requestAnimationFrame(() => {
67
67
  textarea.setSelectionRange(text.length, text.length);
68
68
  });
@@ -111,7 +111,6 @@ function unstable_useComposerInputHistory() {
111
111
  }, [aui, popoverCtx]);
112
112
  return useMemo(() => ({ onKeyDown }), [onKeyDown]);
113
113
  }
114
- //#endregion
115
114
  export { unstable_useComposerInputHistory };
116
115
 
117
116
  //# sourceMappingURL=useComposerInputHistory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useComposerInputHistory.js","names":["useCallback","useEffect","useMemo","useRef","KeyboardEvent","KeyboardEventHandler","useAui","flushTapSync","ThreadMessage","getThreadMessageText","useTriggerPopoverRootContextOptional","Unstable_ComposerInputHistory","onKeyDown","HTMLTextAreaElement","BrowseState","cursor","draftSnapshot","lastRecalledText","deriveHistory","messages","entries","i","length","message","role","text","trim","push","isOnFirstLine","value","caret","slice","includes","isOnLastLine","unstable_useComposerInputHistory","aui","popoverCtx","browseRef","composer","getState","type","undefined","on","current","e","defaultPrevented","key","nativeEvent","isComposing","shiftKey","ctrlKey","metaKey","altKey","getActiveAria","textarea","currentTarget","selectionStart","selectionEnd","browse","commitText","setText","requestAnimationFrame","setSelectionRange","preventDefault","recall","history","entry","thread","next"],"sources":["../../src/unstable/useComposerInputHistory.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type KeyboardEvent,\n type KeyboardEventHandler,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport type { ThreadMessage } from \"@assistant-ui/core\";\nimport { getThreadMessageText } from \"@assistant-ui/core/internal\";\nimport { useTriggerPopoverRootContextOptional } from \"../primitives/composer/trigger/TriggerPopoverRootContext\";\n\n/** @deprecated Experimental since 2026-06-11. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_ComposerInputHistory = {\n /** Keydown handler to spread onto `ComposerPrimitive.Input`. */\n onKeyDown: KeyboardEventHandler<HTMLTextAreaElement>;\n};\n\ntype BrowseState = {\n cursor: number;\n draftSnapshot: string;\n lastRecalledText: string;\n};\n\nconst deriveHistory = (messages: readonly ThreadMessage[]): string[] => {\n const entries: string[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (message.role !== \"user\") continue;\n const text = getThreadMessageText(message).trim();\n if (!text) continue;\n if (entries[entries.length - 1] === text) continue;\n entries.push(text);\n }\n return entries;\n};\n\nconst isOnFirstLine = (value: string, caret: number): boolean =>\n !value.slice(0, caret).includes(\"\\n\");\n\nconst isOnLastLine = (value: string, caret: number): boolean =>\n !value.slice(caret).includes(\"\\n\");\n\n/**\n * Terminal-style input history for the thread composer: ArrowUp on an\n * empty draft recalls previously sent user messages (newest first),\n * ArrowDown steps back toward the newest and finally restores the draft\n * that was being typed when browsing started.\n *\n * Recall only triggers when the caret is on the first/last line with no\n * selection, so multi-line editing keeps native arrow behavior. The\n * handler yields to an open mention/slash popover, to IME composition,\n * to modifier keys, and to consumer handlers that already called\n * `preventDefault`. It is inert on edit composers.\n *\n * @deprecated Experimental since 2026-06-11. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const history = unstable_useComposerInputHistory();\n * <ComposerPrimitive.Input {...history} />\n * ```\n */\nexport function unstable_useComposerInputHistory(): Unstable_ComposerInputHistory {\n const aui = useAui();\n const popoverCtx = useTriggerPopoverRootContextOptional();\n const browseRef = useRef<BrowseState | null>(null);\n\n useEffect(() => {\n if (aui.composer.getState().type !== \"thread\") return undefined;\n\n return aui.on(\"threads.selectionChanged\", () => {\n browseRef.current = null;\n });\n }, [aui]);\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.defaultPrevented) return;\n if (e.key !== \"ArrowUp\" && e.key !== \"ArrowDown\") return;\n if (e.nativeEvent.isComposing) return;\n if (e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) return;\n if (popoverCtx && popoverCtx.getActiveAria() !== null) return;\n if (aui.composer.getState().type !== \"thread\") return;\n\n const textarea = e.currentTarget;\n const { selectionStart, selectionEnd, value } = textarea;\n if (selectionStart !== selectionEnd) return;\n\n if (browseRef.current && value !== browseRef.current.lastRecalledText) {\n browseRef.current = null;\n }\n const browse = browseRef.current;\n\n const commitText = (text: string): void => {\n flushTapSync(() => aui.composer.setText(text));\n // React's controlled-value commit restores the pre-recall caret;\n // reposition after the commit, before paint.\n requestAnimationFrame(() => {\n textarea.setSelectionRange(text.length, text.length);\n });\n e.preventDefault();\n };\n\n const recall = (\n history: readonly string[],\n cursor: number,\n draftSnapshot: string,\n ): void => {\n const entry = history[cursor];\n if (entry === undefined) {\n e.preventDefault();\n return;\n }\n browseRef.current = { cursor, draftSnapshot, lastRecalledText: entry };\n commitText(entry);\n };\n\n if (e.key === \"ArrowUp\") {\n if (!isOnFirstLine(value, selectionStart)) return;\n\n if (!browse) {\n if (value.trim() !== \"\") return;\n const history = deriveHistory(aui.thread.getState().messages);\n if (history.length === 0) return;\n recall(history, 0, value);\n return;\n }\n\n const history = deriveHistory(aui.thread.getState().messages);\n const next = browse.cursor + 1;\n if (next >= history.length) {\n e.preventDefault();\n return;\n }\n recall(history, next, browse.draftSnapshot);\n return;\n }\n\n if (!browse) return;\n if (!isOnLastLine(value, selectionEnd)) return;\n\n const next = browse.cursor - 1;\n if (next < 0) {\n browseRef.current = null;\n commitText(browse.draftSnapshot);\n return;\n }\n\n const history = deriveHistory(aui.thread.getState().messages);\n recall(history, next, browse.draftSnapshot);\n },\n [aui, popoverCtx],\n );\n\n return useMemo(() => ({ onKeyDown }), [onKeyDown]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useComposerInputHistory.js","names":["useCallback","useEffect","useMemo","useRef","KeyboardEvent","KeyboardEventHandler","useAui","flushTapSync","ThreadMessage","getThreadMessageText","useTriggerPopoverRootContextOptional","Unstable_ComposerInputHistory","onKeyDown","HTMLTextAreaElement","BrowseState","cursor","draftSnapshot","lastRecalledText","deriveHistory","messages","entries","i","length","message","role","text","trim","push","isOnFirstLine","value","caret","slice","includes","isOnLastLine","unstable_useComposerInputHistory","aui","popoverCtx","browseRef","composer","getState","type","optional","threads","undefined","on","current","e","defaultPrevented","key","nativeEvent","isComposing","shiftKey","ctrlKey","metaKey","altKey","getActiveAria","textarea","currentTarget","selectionStart","selectionEnd","browse","commitText","setText","origin","requestAnimationFrame","setSelectionRange","preventDefault","recall","history","entry","thread","next"],"sources":["../../src/unstable/useComposerInputHistory.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type KeyboardEvent,\n type KeyboardEventHandler,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport type { ThreadMessage } from \"@assistant-ui/core\";\nimport { getThreadMessageText } from \"@assistant-ui/core/internal\";\nimport { useTriggerPopoverRootContextOptional } from \"../primitives/composer/trigger/TriggerPopoverRootContext\";\n\n/** @deprecated Experimental since 2026-06-11. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_ComposerInputHistory = {\n /** Keydown handler to spread onto `ComposerPrimitive.Input`. */\n onKeyDown: KeyboardEventHandler<HTMLTextAreaElement>;\n};\n\ntype BrowseState = {\n cursor: number;\n draftSnapshot: string;\n lastRecalledText: string;\n};\n\nconst deriveHistory = (messages: readonly ThreadMessage[]): string[] => {\n const entries: string[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (message.role !== \"user\") continue;\n const text = getThreadMessageText(message).trim();\n if (!text) continue;\n if (entries[entries.length - 1] === text) continue;\n entries.push(text);\n }\n return entries;\n};\n\nconst isOnFirstLine = (value: string, caret: number): boolean =>\n !value.slice(0, caret).includes(\"\\n\");\n\nconst isOnLastLine = (value: string, caret: number): boolean =>\n !value.slice(caret).includes(\"\\n\");\n\n/**\n * Terminal-style input history for the thread composer: ArrowUp on an\n * empty draft recalls previously sent user messages (newest first),\n * ArrowDown steps back toward the newest and finally restores the draft\n * that was being typed when browsing started.\n *\n * Recall only triggers when the caret is on the first/last line with no\n * selection, so multi-line editing keeps native arrow behavior. The\n * handler yields to an open mention/slash popover, to IME composition,\n * to modifier keys, and to consumer handlers that already called\n * `preventDefault`. It is inert on edit composers.\n *\n * @deprecated Experimental since 2026-06-11. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const history = unstable_useComposerInputHistory();\n * <ComposerPrimitive.Input {...history} />\n * ```\n */\nexport function unstable_useComposerInputHistory(): Unstable_ComposerInputHistory {\n const aui = useAui();\n const popoverCtx = useTriggerPopoverRootContextOptional();\n const browseRef = useRef<BrowseState | null>(null);\n\n useEffect(() => {\n if (aui.composer.getState().type !== \"thread\" || !aui.optional.threads)\n return undefined;\n\n return aui.on(\"threads.selectionChanged\", () => {\n browseRef.current = null;\n });\n }, [aui]);\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.defaultPrevented) return;\n if (e.key !== \"ArrowUp\" && e.key !== \"ArrowDown\") return;\n if (e.nativeEvent.isComposing) return;\n if (e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) return;\n if (popoverCtx && popoverCtx.getActiveAria() !== null) return;\n if (aui.composer.getState().type !== \"thread\") return;\n\n const textarea = e.currentTarget;\n const { selectionStart, selectionEnd, value } = textarea;\n if (selectionStart !== selectionEnd) return;\n\n if (browseRef.current && value !== browseRef.current.lastRecalledText) {\n browseRef.current = null;\n }\n const browse = browseRef.current;\n\n const commitText = (text: string): void => {\n flushTapSync(() => aui.composer.setText(text, { origin: \"recall\" }));\n // React's controlled-value commit restores the pre-recall caret;\n // reposition after the commit, before paint.\n requestAnimationFrame(() => {\n textarea.setSelectionRange(text.length, text.length);\n });\n e.preventDefault();\n };\n\n const recall = (\n history: readonly string[],\n cursor: number,\n draftSnapshot: string,\n ): void => {\n const entry = history[cursor];\n if (entry === undefined) {\n e.preventDefault();\n return;\n }\n browseRef.current = { cursor, draftSnapshot, lastRecalledText: entry };\n commitText(entry);\n };\n\n if (e.key === \"ArrowUp\") {\n if (!isOnFirstLine(value, selectionStart)) return;\n\n if (!browse) {\n if (value.trim() !== \"\") return;\n const history = deriveHistory(aui.thread.getState().messages);\n if (history.length === 0) return;\n recall(history, 0, value);\n return;\n }\n\n const history = deriveHistory(aui.thread.getState().messages);\n const next = browse.cursor + 1;\n if (next >= history.length) {\n e.preventDefault();\n return;\n }\n recall(history, next, browse.draftSnapshot);\n return;\n }\n\n if (!browse) return;\n if (!isOnLastLine(value, selectionEnd)) return;\n\n const next = browse.cursor - 1;\n if (next < 0) {\n browseRef.current = null;\n commitText(browse.draftSnapshot);\n return;\n }\n\n const history = deriveHistory(aui.thread.getState().messages);\n recall(history, next, browse.draftSnapshot);\n },\n [aui, popoverCtx],\n );\n\n return useMemo(() => ({ onKeyDown }), [onKeyDown]);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useLiveCompletionAdapter.d.ts","sourceRoot":"","sources":["../../src/unstable/useLiveCompletionAdapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,+GAA+G;AAC/G,MAAM,MAAM,wCAAwC,GAAG;IACrD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAAC;IAC9E;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAKF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD;IAAE,OAAO,EAAE,uBAAuB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAiK1D"}
1
+ {"version":3,"file":"useLiveCompletionAdapter.d.ts","sourceRoot":"","sources":["../../src/unstable/useLiveCompletionAdapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,+GAA+G;AAC/G,MAAM,MAAM,wCAAwC,GAAG;IACrD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAAC;IAC9E;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAKF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD;IAAE,OAAO,EAAE,uBAAuB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAkK1D"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { useIsomorphicLayoutEffect } from "../utils/useIsomorphicLayoutEffect.js";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
4
- //#region src/unstable/useLiveCompletionAdapter.ts
4
+ // src/unstable/useLiveCompletionAdapter.ts
5
5
  /** Sentinel that no real query (including the empty string) equals, so the first query always fetches. */
6
6
  const NO_QUERY = "\0";
7
7
  /**
@@ -158,7 +158,8 @@ function unstable_useLiveCompletionAdapter(options) {
158
158
  categories: () => [],
159
159
  categoryItems: () => [],
160
160
  search: (query) => {
161
- if (query !== state.query || retryableQueryRef.current === query) queueMicrotask(() => scheduleFetch(query));
161
+ if (!enabled) return [];
162
+ if (query !== state.query || retryableQueryRef.current === query) queueMicrotask(() => scheduleFetchRef.current(query));
162
163
  else queueMicrotask(() => {
163
164
  if (deferredQueryRef.current !== null && deferredQueryRef.current !== query) deferredQueryRef.current = null;
164
165
  if (pendingQueryRef.current !== null && pendingQueryRef.current !== query) invalidatePending();
@@ -166,14 +167,13 @@ function unstable_useLiveCompletionAdapter(options) {
166
167
  return state.items;
167
168
  }
168
169
  }), [
170
+ enabled,
169
171
  state,
170
- scheduleFetch,
171
172
  invalidatePending
172
173
  ]),
173
174
  isLoading
174
175
  };
175
176
  }
176
- //#endregion
177
177
  export { unstable_useLiveCompletionAdapter };
178
178
 
179
179
  //# sourceMappingURL=useLiveCompletionAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLiveCompletionAdapter.js","names":["useCallback","useEffect","useMemo","useRef","useState","useIsomorphicLayoutEffect","Unstable_TriggerAdapter","Unstable_TriggerItem","Unstable_UseLiveCompletionAdapterOptions","fetcher","query","Promise","cacheKey","debounceMs","enabled","NO_QUERY","unstable_useLiveCompletionAdapter","options","adapter","isLoading","state","setState","items","failed","setIsLoading","fetcherRef","current","timerRef","ReturnType","setTimeout","tokenRef","pendingQueryRef","retryableQueryRef","pendingRetryQueryRef","inactiveRef","deferredQueryRef","cancelTimer","clearTimeout","rearmPendingRetry","scheduleFetch","token","resolve","then","scheduleFetchRef","invalidatePending","cacheKeyRef","s","deferredQuery","categories","categoryItems","search","queueMicrotask"],"sources":["../../src/unstable/useLiveCompletionAdapter.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../utils/useIsomorphicLayoutEffect\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** @deprecated Experimental since 2026-06-15. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_UseLiveCompletionAdapterOptions = {\n /**\n * Fetches the items for a query from an async source. Called debounced; the\n * resolved items are cached and returned synchronously to the popover on the\n * next render.\n */\n readonly fetcher: (query: string) => Promise<readonly Unstable_TriggerItem[]>;\n /**\n * Identifies the fetcher's data source. Change this when switching accounts,\n * workspaces, or another boundary that should invalidate cached results.\n */\n readonly cacheKey?: string | number | undefined;\n /** Debounce applied before a fetch fires, in milliseconds. @default 60 */\n readonly debounceMs?: number | undefined;\n /** When `false`, no fetch is scheduled and the adapter stays empty. @default true */\n readonly enabled?: boolean | undefined;\n};\n\n/** Sentinel that no real query (including the empty string) equals, so the first query always fetches. */\nconst NO_QUERY = \"\\u0000\";\n\n/**\n * Bridges an async completion source (a server search, a gateway RPC) into the\n * synchronous `Unstable_TriggerAdapter` that `ComposerTriggerPopover` consumes.\n * `search(query)` returns the last fetched items synchronously and schedules a\n * debounced fetch when the query changes; when results arrive the returned\n * `adapter` identity changes, which re-runs the popover's lookup so the fresh\n * items render. This is a search-only adapter (`categories` are empty).\n *\n * `isLoading` is `true` while a fetch is in flight. Pass it to the popover's\n * `isLoading` prop to render a loading state.\n *\n * @deprecated Experimental since 2026-06-15. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const mentions = unstable_useLiveCompletionAdapter({\n * fetcher: (query) => searchUsers(query),\n * });\n *\n * <ComposerTriggerPopover\n * char=\"@\"\n * adapter={mentions.adapter}\n * isLoading={mentions.isLoading}\n * directive={{ onInserted }}\n * />\n * ```\n */\nexport function unstable_useLiveCompletionAdapter(\n options: Unstable_UseLiveCompletionAdapterOptions,\n): { adapter: Unstable_TriggerAdapter; isLoading: boolean } {\n const { fetcher, cacheKey, debounceMs = 60, enabled = true } = options;\n\n const [state, setState] = useState<{\n query: string;\n items: readonly Unstable_TriggerItem[];\n failed: boolean;\n }>({ query: NO_QUERY, items: [], failed: false });\n const [isLoading, setIsLoading] = useState(false);\n\n const fetcherRef = useRef(fetcher);\n // The debounce timer must only observe fetchers from committed renders.\n useIsomorphicLayoutEffect(() => {\n fetcherRef.current = fetcher;\n }, [fetcher]);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const tokenRef = useRef(0);\n const pendingQueryRef = useRef<string | null>(null);\n const retryableQueryRef = useRef<string | null>(null);\n const pendingRetryQueryRef = useRef<string | null>(null);\n const inactiveRef = useRef(true);\n const deferredQueryRef = useRef<string | null>(null);\n\n const cancelTimer = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const rearmPendingRetry = useCallback(() => {\n const query = pendingRetryQueryRef.current;\n if (query === null) return;\n retryableQueryRef.current = query;\n pendingRetryQueryRef.current = null;\n }, []);\n\n const scheduleFetch = useCallback(\n (query: string) => {\n if (!enabled) return;\n if (inactiveRef.current) {\n deferredQueryRef.current = query;\n return;\n }\n if (pendingQueryRef.current === query) return;\n rearmPendingRetry();\n if (retryableQueryRef.current === query) {\n retryableQueryRef.current = null;\n pendingRetryQueryRef.current = query;\n }\n pendingQueryRef.current = query;\n cancelTimer();\n const token = ++tokenRef.current;\n setIsLoading(true);\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n Promise.resolve()\n .then(() => fetcherRef.current(query))\n .then(\n (items) => {\n if (token !== tokenRef.current) return;\n pendingRetryQueryRef.current = null;\n setState({ query, items, failed: false });\n setIsLoading(false);\n },\n () => {\n if (token !== tokenRef.current) return;\n pendingQueryRef.current = null;\n pendingRetryQueryRef.current = null;\n setState({ query, items: [], failed: true });\n setIsLoading(false);\n },\n );\n }, debounceMs);\n },\n [enabled, debounceMs, cancelTimer, rearmPendingRetry],\n );\n\n const scheduleFetchRef = useRef(scheduleFetch);\n useIsomorphicLayoutEffect(() => {\n scheduleFetchRef.current = scheduleFetch;\n }, [scheduleFetch]);\n\n const invalidatePending = useCallback(() => {\n rearmPendingRetry();\n cancelTimer();\n pendingQueryRef.current = null;\n tokenRef.current += 1;\n setIsLoading(false);\n }, [cancelTimer, rearmPendingRetry]);\n\n const cacheKeyRef = useRef(cacheKey);\n useIsomorphicLayoutEffect(() => {\n if (cacheKeyRef.current === cacheKey) return;\n cacheKeyRef.current = cacheKey;\n invalidatePending();\n retryableQueryRef.current = null;\n pendingRetryQueryRef.current = null;\n setState({ query: NO_QUERY, items: [], failed: false });\n }, [cacheKey, invalidatePending]);\n\n useEffect(() => {\n if (enabled) return;\n invalidatePending();\n setState((s) =>\n s.query === NO_QUERY ? s : { query: NO_QUERY, items: [], failed: false },\n );\n }, [enabled, invalidatePending]);\n\n // Render-time searches can outlive an abandoned render, so they only arm\n // request work after this hook commits.\n useIsomorphicLayoutEffect(() => {\n inactiveRef.current = false;\n const deferredQuery = deferredQueryRef.current;\n deferredQueryRef.current = null;\n if (deferredQuery !== null) scheduleFetchRef.current(deferredQuery);\n return () => {\n inactiveRef.current = true;\n invalidatePending();\n };\n }, [invalidatePending]);\n\n // Arm retries only after the failed state commits. Arming during rejection\n // would let the failure render immediately schedule another request.\n useEffect(() => {\n retryableQueryRef.current = state.failed ? state.query : null;\n }, [state]);\n\n const adapter = useMemo<Unstable_TriggerAdapter>(\n () => ({\n categories: () => [],\n categoryItems: () => [],\n search: (query: string) => {\n // search() runs inside the popover's render; defer state updates with\n // queueMicrotask so they are not dispatched while another component renders.\n if (query !== state.query || retryableQueryRef.current === query) {\n queueMicrotask(() => scheduleFetch(query));\n } else {\n queueMicrotask(() => {\n if (\n deferredQueryRef.current !== null &&\n deferredQueryRef.current !== query\n ) {\n deferredQueryRef.current = null;\n }\n if (\n pendingQueryRef.current !== null &&\n pendingQueryRef.current !== query\n ) {\n invalidatePending();\n }\n });\n }\n return state.items;\n },\n }),\n [state, scheduleFetch, invalidatePending],\n );\n\n return { adapter, isLoading };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useLiveCompletionAdapter.js","names":["useCallback","useEffect","useMemo","useRef","useState","useIsomorphicLayoutEffect","Unstable_TriggerAdapter","Unstable_TriggerItem","Unstable_UseLiveCompletionAdapterOptions","fetcher","query","Promise","cacheKey","debounceMs","enabled","NO_QUERY","unstable_useLiveCompletionAdapter","options","adapter","isLoading","state","setState","items","failed","setIsLoading","fetcherRef","current","timerRef","ReturnType","setTimeout","tokenRef","pendingQueryRef","retryableQueryRef","pendingRetryQueryRef","inactiveRef","deferredQueryRef","cancelTimer","clearTimeout","rearmPendingRetry","scheduleFetch","token","resolve","then","scheduleFetchRef","invalidatePending","cacheKeyRef","s","deferredQuery","categories","categoryItems","search","queueMicrotask"],"sources":["../../src/unstable/useLiveCompletionAdapter.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../utils/useIsomorphicLayoutEffect\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** @deprecated Experimental since 2026-06-15. Not scheduled for removal; the API may change in any release. */\nexport type Unstable_UseLiveCompletionAdapterOptions = {\n /**\n * Fetches the items for a query from an async source. Called debounced; the\n * resolved items are cached and returned synchronously to the popover on the\n * next render.\n */\n readonly fetcher: (query: string) => Promise<readonly Unstable_TriggerItem[]>;\n /**\n * Identifies the fetcher's data source. Change this when switching accounts,\n * workspaces, or another boundary that should invalidate cached results.\n */\n readonly cacheKey?: string | number | undefined;\n /** Debounce applied before a fetch fires, in milliseconds. @default 60 */\n readonly debounceMs?: number | undefined;\n /** When `false`, no fetch is scheduled and the adapter stays empty. @default true */\n readonly enabled?: boolean | undefined;\n};\n\n/** Sentinel that no real query (including the empty string) equals, so the first query always fetches. */\nconst NO_QUERY = \"\\u0000\";\n\n/**\n * Bridges an async completion source (a server search, a gateway RPC) into the\n * synchronous `Unstable_TriggerAdapter` that `ComposerTriggerPopover` consumes.\n * `search(query)` returns the last fetched items synchronously and schedules a\n * debounced fetch when the query changes; when results arrive the returned\n * `adapter` identity changes, which re-runs the popover's lookup so the fresh\n * items render. This is a search-only adapter (`categories` are empty).\n *\n * `isLoading` is `true` while a fetch is in flight. Pass it to the popover's\n * `isLoading` prop to render a loading state.\n *\n * @deprecated Experimental since 2026-06-15. Not scheduled for removal; the API may change in any release.\n *\n * @example\n * ```tsx\n * const mentions = unstable_useLiveCompletionAdapter({\n * fetcher: (query) => searchUsers(query),\n * });\n *\n * <ComposerTriggerPopover\n * char=\"@\"\n * adapter={mentions.adapter}\n * isLoading={mentions.isLoading}\n * directive={{ onInserted }}\n * />\n * ```\n */\nexport function unstable_useLiveCompletionAdapter(\n options: Unstable_UseLiveCompletionAdapterOptions,\n): { adapter: Unstable_TriggerAdapter; isLoading: boolean } {\n const { fetcher, cacheKey, debounceMs = 60, enabled = true } = options;\n\n const [state, setState] = useState<{\n query: string;\n items: readonly Unstable_TriggerItem[];\n failed: boolean;\n }>({ query: NO_QUERY, items: [], failed: false });\n const [isLoading, setIsLoading] = useState(false);\n\n const fetcherRef = useRef(fetcher);\n // The debounce timer must only observe fetchers from committed renders.\n useIsomorphicLayoutEffect(() => {\n fetcherRef.current = fetcher;\n }, [fetcher]);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const tokenRef = useRef(0);\n const pendingQueryRef = useRef<string | null>(null);\n const retryableQueryRef = useRef<string | null>(null);\n const pendingRetryQueryRef = useRef<string | null>(null);\n const inactiveRef = useRef(true);\n const deferredQueryRef = useRef<string | null>(null);\n\n const cancelTimer = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const rearmPendingRetry = useCallback(() => {\n const query = pendingRetryQueryRef.current;\n if (query === null) return;\n retryableQueryRef.current = query;\n pendingRetryQueryRef.current = null;\n }, []);\n\n const scheduleFetch = useCallback(\n (query: string) => {\n if (!enabled) return;\n if (inactiveRef.current) {\n deferredQueryRef.current = query;\n return;\n }\n if (pendingQueryRef.current === query) return;\n rearmPendingRetry();\n if (retryableQueryRef.current === query) {\n retryableQueryRef.current = null;\n pendingRetryQueryRef.current = query;\n }\n pendingQueryRef.current = query;\n cancelTimer();\n const token = ++tokenRef.current;\n setIsLoading(true);\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n Promise.resolve()\n .then(() => fetcherRef.current(query))\n .then(\n (items) => {\n if (token !== tokenRef.current) return;\n pendingRetryQueryRef.current = null;\n setState({ query, items, failed: false });\n setIsLoading(false);\n },\n () => {\n if (token !== tokenRef.current) return;\n pendingQueryRef.current = null;\n pendingRetryQueryRef.current = null;\n setState({ query, items: [], failed: true });\n setIsLoading(false);\n },\n );\n }, debounceMs);\n },\n [enabled, debounceMs, cancelTimer, rearmPendingRetry],\n );\n\n const scheduleFetchRef = useRef(scheduleFetch);\n useIsomorphicLayoutEffect(() => {\n scheduleFetchRef.current = scheduleFetch;\n }, [scheduleFetch]);\n\n const invalidatePending = useCallback(() => {\n rearmPendingRetry();\n cancelTimer();\n pendingQueryRef.current = null;\n tokenRef.current += 1;\n setIsLoading(false);\n }, [cancelTimer, rearmPendingRetry]);\n\n const cacheKeyRef = useRef(cacheKey);\n useIsomorphicLayoutEffect(() => {\n if (cacheKeyRef.current === cacheKey) return;\n cacheKeyRef.current = cacheKey;\n invalidatePending();\n retryableQueryRef.current = null;\n pendingRetryQueryRef.current = null;\n setState({ query: NO_QUERY, items: [], failed: false });\n }, [cacheKey, invalidatePending]);\n\n useEffect(() => {\n if (enabled) return;\n invalidatePending();\n setState((s) =>\n s.query === NO_QUERY ? s : { query: NO_QUERY, items: [], failed: false },\n );\n }, [enabled, invalidatePending]);\n\n // Render-time searches can outlive an abandoned render, so they only arm\n // request work after this hook commits.\n useIsomorphicLayoutEffect(() => {\n inactiveRef.current = false;\n const deferredQuery = deferredQueryRef.current;\n deferredQueryRef.current = null;\n if (deferredQuery !== null) scheduleFetchRef.current(deferredQuery);\n return () => {\n inactiveRef.current = true;\n invalidatePending();\n };\n }, [invalidatePending]);\n\n // Arm retries only after the failed state commits. Arming during rejection\n // would let the failure render immediately schedule another request.\n useEffect(() => {\n retryableQueryRef.current = state.failed ? state.query : null;\n }, [state]);\n\n const adapter = useMemo<Unstable_TriggerAdapter>(\n () => ({\n categories: () => [],\n categoryItems: () => [],\n search: (query: string) => {\n if (!enabled) return [];\n // search() runs inside the popover's render; defer state updates with\n // queueMicrotask so they are not dispatched while another component renders.\n if (query !== state.query || retryableQueryRef.current === query) {\n queueMicrotask(() => scheduleFetchRef.current(query));\n } else {\n queueMicrotask(() => {\n if (\n deferredQueryRef.current !== null &&\n deferredQueryRef.current !== query\n ) {\n deferredQueryRef.current = null;\n }\n if (\n pendingQueryRef.current !== null &&\n pendingQueryRef.current !== query\n ) {\n invalidatePending();\n }\n });\n }\n return state.items;\n },\n }),\n [enabled, state, invalidatePending],\n );\n\n return { adapter, isLoading };\n}\n"],"mappings":";;;;;AA6BA,MAAMe,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BjB,SAAgBC,kCACdC,SAC0D;CAC1D,MAAM,EAAER,SAASG,UAAUC,aAAa,IAAIC,UAAU,SAASG;CAE/D,MAAM,CAACG,OAAOC,YAAYjB,SAIvB;EAAEM,OAAOK;EAAUO,OAAO,CAAA;EAAIC,QAAQ;CAAM,CAAC;CAChD,MAAM,CAACJ,WAAWK,gBAAgBpB,SAAS,KAAK;CAEhD,MAAMqB,aAAatB,OAAOM,OAAO;CAEjCJ,gCAAgC;EAC9BoB,WAAWC,UAAUjB;CACvB,GAAG,CAACA,OAAO,CAAC;CAEZ,MAAMkB,WAAWxB,OAA6C,IAAI;CAClE,MAAM2B,WAAW3B,OAAO,CAAC;CACzB,MAAM4B,kBAAkB5B,OAAsB,IAAI;CAClD,MAAM6B,oBAAoB7B,OAAsB,IAAI;CACpD,MAAM8B,uBAAuB9B,OAAsB,IAAI;CACvD,MAAM+B,cAAc/B,OAAO,IAAI;CAC/B,MAAMgC,mBAAmBhC,OAAsB,IAAI;CAEnD,MAAMiC,cAAcpC,kBAAkB;EACpC,IAAI2B,SAASD,YAAY,MAAM;GAC7BW,aAAaV,SAASD,OAAO;GAC7BC,SAASD,UAAU;EACrB;CACF,GAAG,CAAA,CAAE;CAEL,MAAMY,oBAAoBtC,kBAAkB;EAC1C,MAAMU,QAAQuB,qBAAqBP;EACnC,IAAIhB,UAAU,MAAM;EACpBsB,kBAAkBN,UAAUhB;EAC5BuB,qBAAqBP,UAAU;CACjC,GAAG,CAAA,CAAE;CAEL,MAAMa,gBAAgBvC,aACnBU,UAAkB;EACjB,IAAI,CAACI,SAAS;EACd,IAAIoB,YAAYR,SAAS;GACvBS,iBAAiBT,UAAUhB;GAC3B;EACF;EACA,IAAIqB,gBAAgBL,YAAYhB,OAAO;EACvC4B,kBAAkB;EAClB,IAAIN,kBAAkBN,YAAYhB,OAAO;GACvCsB,kBAAkBN,UAAU;GAC5BO,qBAAqBP,UAAUhB;EACjC;EACAqB,gBAAgBL,UAAUhB;EAC1B0B,YAAY;EACZ,MAAMI,QAAQ,EAAEV,SAASJ;EACzBF,aAAa,IAAI;EACjBG,SAASD,UAAUG,iBAAiB;GAClCF,SAASD,UAAU;GACnBf,QAAQ8B,QAAQ,CAAC,CACdC,WAAWjB,WAAWC,QAAQhB,KAAK,CAAC,CAAC,CACrCgC,MACEpB,UAAU;IACT,IAAIkB,UAAUV,SAASJ,SAAS;IAChCO,qBAAqBP,UAAU;IAC/BL,SAAS;KAAEX;KAAOY;KAAOC,QAAQ;IAAM,CAAC;IACxCC,aAAa,KAAK;GACpB,SACM;IACJ,IAAIgB,UAAUV,SAASJ,SAAS;IAChCK,gBAAgBL,UAAU;IAC1BO,qBAAqBP,UAAU;IAC/BL,SAAS;KAAEX;KAAOY,OAAO,CAAA;KAAIC,QAAQ;IAAK,CAAC;IAC3CC,aAAa,KAAK;GACpB,CACF;EACJ,GAAGX,UAAU;CACf,GACA;EAACC;EAASD;EAAYuB;EAAaE;CAAiB,CACtD;CAEA,MAAMK,mBAAmBxC,OAAOoC,aAAa;CAC7ClC,gCAAgC;EAC9BsC,iBAAiBjB,UAAUa;CAC7B,GAAG,CAACA,aAAa,CAAC;CAElB,MAAMK,oBAAoB5C,kBAAkB;EAC1CsC,kBAAkB;EAClBF,YAAY;EACZL,gBAAgBL,UAAU;EAC1BI,SAASJ,WAAW;EACpBF,aAAa,KAAK;CACpB,GAAG,CAACY,aAAaE,iBAAiB,CAAC;CAEnC,MAAMO,cAAc1C,OAAOS,QAAQ;CACnCP,gCAAgC;EAC9B,IAAIwC,YAAYnB,YAAYd,UAAU;EACtCiC,YAAYnB,UAAUd;EACtBgC,kBAAkB;EAClBZ,kBAAkBN,UAAU;EAC5BO,qBAAqBP,UAAU;EAC/BL,SAAS;GAAEX,OAAOK;GAAUO,OAAO,CAAA;GAAIC,QAAQ;EAAM,CAAC;CACxD,GAAG,CAACX,UAAUgC,iBAAiB,CAAC;CAEhC3C,gBAAgB;EACd,IAAIa,SAAS;EACb8B,kBAAkB;EAClBvB,UAAUyB,MACRA,EAAEpC,UAAUK,WAAW+B,IAAI;GAAEpC,OAAOK;GAAUO,OAAO,CAAA;GAAIC,QAAQ;EAAM,CACzE;CACF,GAAG,CAACT,SAAS8B,iBAAiB,CAAC;CAI/BvC,gCAAgC;EAC9B6B,YAAYR,UAAU;EACtB,MAAMqB,gBAAgBZ,iBAAiBT;EACvCS,iBAAiBT,UAAU;EAC3B,IAAIqB,kBAAkB,MAAMJ,iBAAiBjB,QAAQqB,aAAa;EAClE,aAAa;GACXb,YAAYR,UAAU;GACtBkB,kBAAkB;EACpB;CACF,GAAG,CAACA,iBAAiB,CAAC;CAItB3C,gBAAgB;EACd+B,kBAAkBN,UAAUN,MAAMG,SAASH,MAAMV,QAAQ;CAC3D,GAAG,CAACU,KAAK,CAAC;CAkCV,OAAO;EAAEF,SAhCOhB,eACP;GACL8C,kBAAkB,CAAA;GAClBC,qBAAqB,CAAA;GACrBC,SAASxC,UAAkB;IACzB,IAAI,CAACI,SAAS,OAAO,CAAA;IAGrB,IAAIJ,UAAUU,MAAMV,SAASsB,kBAAkBN,YAAYhB,OACzDyC,qBAAqBR,iBAAiBjB,QAAQhB,KAAK,CAAC;SAEpDyC,qBAAqB;KACnB,IACEhB,iBAAiBT,YAAY,QAC7BS,iBAAiBT,YAAYhB,OAE7ByB,iBAAiBT,UAAU;KAE7B,IACEK,gBAAgBL,YAAY,QAC5BK,gBAAgBL,YAAYhB,OAE5BkC,kBAAkB;IAEtB,CAAC;IAEH,OAAOxB,MAAME;GACf;EACF,IACA;GAACR;GAASM;GAAOwB;EAAiB,CAG3B1B;EAASC;CAAU;AAC9B"}