@assistant-ui/react 0.14.18 → 0.14.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/dist/client/ExternalThread.d.ts +3 -2
  2. package/dist/client/ExternalThread.d.ts.map +1 -1
  3. package/dist/client/ExternalThread.js +721 -256
  4. package/dist/client/ExternalThread.js.map +1 -1
  5. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  6. package/dist/client/InMemoryThreadList.js +292 -108
  7. package/dist/client/InMemoryThreadList.js.map +1 -1
  8. package/dist/client/SingleThreadList.js +139 -53
  9. package/dist/client/SingleThreadList.js.map +1 -1
  10. package/dist/context/ReadonlyStore.js.map +1 -1
  11. package/dist/context/providers/MessageProvider.js +38 -5
  12. package/dist/context/providers/MessageProvider.js.map +1 -1
  13. package/dist/context/providers/ThreadViewportProvider.js +76 -20
  14. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  15. package/dist/context/react/ThreadViewportContext.js.map +1 -1
  16. package/dist/context/react/utils/createContextHook.js.map +1 -1
  17. package/dist/context/react/utils/createContextStoreHook.js +17 -2
  18. package/dist/context/react/utils/createContextStoreHook.js.map +1 -1
  19. package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -1
  20. package/dist/context/react/utils/ensureBinding.js.map +1 -1
  21. package/dist/context/react/utils/useRuntimeState.js +18 -2
  22. package/dist/context/react/utils/useRuntimeState.js.map +1 -1
  23. package/dist/context/stores/ThreadViewport.js.map +1 -1
  24. package/dist/devtools/DevToolsHooks.js.map +1 -1
  25. package/dist/hooks/useMessageQuote.js.map +1 -1
  26. package/dist/hooks/useMessageTiming.js +4 -1
  27. package/dist/hooks/useMessageTiming.js.map +1 -1
  28. package/dist/hooks/useToolCallElapsed.d.ts +23 -0
  29. package/dist/hooks/useToolCallElapsed.d.ts.map +1 -0
  30. package/dist/hooks/useToolCallElapsed.js +72 -0
  31. package/dist/hooks/useToolCallElapsed.js.map +1 -0
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.js +3 -1
  34. package/dist/internal.js.map +1 -1
  35. package/dist/legacy-runtime/AssistantRuntimeProvider.js +46 -10
  36. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  37. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  38. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js +27 -6
  39. package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js.map +1 -1
  40. package/dist/legacy-runtime/hooks/AssistantContext.js +13 -2
  41. package/dist/legacy-runtime/hooks/AssistantContext.js.map +1 -1
  42. package/dist/legacy-runtime/hooks/AttachmentContext.js +9 -1
  43. package/dist/legacy-runtime/hooks/AttachmentContext.js.map +1 -1
  44. package/dist/legacy-runtime/hooks/ComposerContext.js +9 -1
  45. package/dist/legacy-runtime/hooks/ComposerContext.js.map +1 -1
  46. package/dist/legacy-runtime/hooks/MessageContext.js +12 -2
  47. package/dist/legacy-runtime/hooks/MessageContext.js.map +1 -1
  48. package/dist/legacy-runtime/hooks/MessagePartContext.js +9 -1
  49. package/dist/legacy-runtime/hooks/MessagePartContext.js.map +1 -1
  50. package/dist/legacy-runtime/hooks/ThreadContext.js +33 -5
  51. package/dist/legacy-runtime/hooks/ThreadContext.js.map +1 -1
  52. package/dist/legacy-runtime/hooks/ThreadListItemContext.js +9 -1
  53. package/dist/legacy-runtime/hooks/ThreadListItemContext.js.map +1 -1
  54. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +3 -3
  55. package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +1 -1
  56. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js +71 -31
  57. package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js.map +1 -1
  58. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
  59. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +24 -16
  60. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  61. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +17 -12
  62. package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +1 -1
  63. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js +17 -3
  64. package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js.map +1 -1
  65. package/dist/mcp-apps/McpAppRenderer.js +6 -6
  66. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  67. package/dist/mcp-apps/McpAppsRemoteHost.js +3 -3
  68. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  69. package/dist/mcp-apps/app-frame.js +33 -14
  70. package/dist/mcp-apps/app-frame.js.map +1 -1
  71. package/dist/mcp-apps/bridge.js.map +1 -1
  72. package/dist/mcp-apps/types.js.map +1 -1
  73. package/dist/mcp-apps/utils.js.map +1 -1
  74. package/dist/model-context/frame/useAssistantFrameHost.js +32 -14
  75. package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
  76. package/dist/model-context/makeAssistantVisible.js +64 -26
  77. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  78. package/dist/primitives/actionBar/ActionBarCopy.js +94 -20
  79. package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
  80. package/dist/primitives/actionBar/ActionBarEdit.js.map +1 -1
  81. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +105 -37
  82. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  83. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +60 -11
  84. package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
  85. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +60 -11
  86. package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
  87. package/dist/primitives/actionBar/ActionBarInteractionContext.js +3 -1
  88. package/dist/primitives/actionBar/ActionBarInteractionContext.js.map +1 -1
  89. package/dist/primitives/actionBar/ActionBarReload.js.map +1 -1
  90. package/dist/primitives/actionBar/ActionBarRoot.js +84 -25
  91. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  92. package/dist/primitives/actionBar/ActionBarSpeak.js.map +1 -1
  93. package/dist/primitives/actionBar/ActionBarStopSpeaking.js +45 -14
  94. package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
  95. package/dist/primitives/actionBar/useActionBarFloatStatus.js +22 -10
  96. package/dist/primitives/actionBar/useActionBarFloatStatus.js.map +1 -1
  97. package/dist/primitives/actionBar.js.map +1 -1
  98. package/dist/primitives/actionBarMore/ActionBarMoreContent.js +44 -7
  99. package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
  100. package/dist/primitives/actionBarMore/ActionBarMoreItem.js +28 -6
  101. package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
  102. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +103 -36
  103. package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
  104. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +28 -6
  105. package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
  106. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +28 -6
  107. package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
  108. package/dist/primitives/actionBarMore/scope.js.map +1 -1
  109. package/dist/primitives/actionBarMore.js.map +1 -1
  110. package/dist/primitives/assistantModal/AssistantModalAnchor.js +27 -6
  111. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  112. package/dist/primitives/assistantModal/AssistantModalContent.js +71 -10
  113. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  114. package/dist/primitives/assistantModal/AssistantModalRoot.js +93 -26
  115. package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
  116. package/dist/primitives/assistantModal/AssistantModalTrigger.js +27 -6
  117. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  118. package/dist/primitives/assistantModal/scope.js.map +1 -1
  119. package/dist/primitives/assistantModal.js.map +1 -1
  120. package/dist/primitives/attachment/AttachmentName.js +13 -1
  121. package/dist/primitives/attachment/AttachmentName.js.map +1 -1
  122. package/dist/primitives/attachment/AttachmentRemove.js +11 -4
  123. package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
  124. package/dist/primitives/attachment/AttachmentRoot.js +13 -4
  125. package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
  126. package/dist/primitives/attachment/AttachmentThumb.js +20 -9
  127. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  128. package/dist/primitives/attachment.js.map +1 -1
  129. package/dist/primitives/branchPicker/BranchPickerCount.js +14 -2
  130. package/dist/primitives/branchPicker/BranchPickerCount.js.map +1 -1
  131. package/dist/primitives/branchPicker/BranchPickerNext.js.map +1 -1
  132. package/dist/primitives/branchPicker/BranchPickerNumber.js +14 -2
  133. package/dist/primitives/branchPicker/BranchPickerNumber.js.map +1 -1
  134. package/dist/primitives/branchPicker/BranchPickerPrevious.js.map +1 -1
  135. package/dist/primitives/branchPicker/BranchPickerRoot.js +34 -6
  136. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  137. package/dist/primitives/branchPicker.js.map +1 -1
  138. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +16 -5
  139. package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
  140. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +13 -4
  141. package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js.map +1 -1
  142. package/dist/primitives/chainOfThought.js.map +1 -1
  143. package/dist/primitives/composer/ComposerAddAttachment.js +37 -24
  144. package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
  145. package/dist/primitives/composer/ComposerAttachmentDropzone.js +124 -49
  146. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  147. package/dist/primitives/composer/ComposerCancel.js.map +1 -1
  148. package/dist/primitives/composer/ComposerDictate.js.map +1 -1
  149. package/dist/primitives/composer/ComposerDictationTranscript.js +32 -7
  150. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  151. package/dist/primitives/composer/ComposerInput.js +26 -26
  152. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  153. package/dist/primitives/composer/ComposerInputPluginContext.js +71 -25
  154. package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
  155. package/dist/primitives/composer/ComposerQuote.js +92 -23
  156. package/dist/primitives/composer/ComposerQuote.js.map +1 -1
  157. package/dist/primitives/composer/ComposerRoot.js +45 -11
  158. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  159. package/dist/primitives/composer/ComposerSend.js +9 -2
  160. package/dist/primitives/composer/ComposerSend.js.map +1 -1
  161. package/dist/primitives/composer/ComposerStopDictation.js +15 -5
  162. package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
  163. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  164. package/dist/primitives/composer/trigger/TriggerPopover.js +215 -75
  165. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  166. package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
  167. package/dist/primitives/composer/trigger/TriggerPopoverBack.js +35 -7
  168. package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
  169. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +134 -28
  170. package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
  171. package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
  172. package/dist/primitives/composer/trigger/TriggerPopoverItems.js +132 -28
  173. package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
  174. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +124 -52
  175. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  176. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +181 -78
  177. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  178. package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
  179. package/dist/primitives/composer/trigger/index.js.map +1 -1
  180. package/dist/primitives/composer/trigger/triggerDetectionResource.js +28 -14
  181. package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
  182. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +115 -58
  183. package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
  184. package/dist/primitives/composer/trigger/triggerNavigationResource.js +202 -70
  185. package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
  186. package/dist/primitives/composer/trigger/triggerSelectionResource.js +49 -13
  187. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  188. package/dist/primitives/composer.js.map +1 -1
  189. package/dist/primitives/dropdownMenuRenderPrimitives.js.map +1 -1
  190. package/dist/primitives/error/ErrorMessage.js +28 -6
  191. package/dist/primitives/error/ErrorMessage.js.map +1 -1
  192. package/dist/primitives/error/ErrorRoot.js +14 -5
  193. package/dist/primitives/error/ErrorRoot.js.map +1 -1
  194. package/dist/primitives/error.js.map +1 -1
  195. package/dist/primitives/message/MessageError.js +2 -1
  196. package/dist/primitives/message/MessageError.js.map +1 -1
  197. package/dist/primitives/message/MessageIf.js +50 -20
  198. package/dist/primitives/message/MessageIf.js.map +1 -1
  199. package/dist/primitives/message/MessageParts.js +41 -7
  200. package/dist/primitives/message/MessageParts.js.map +1 -1
  201. package/dist/primitives/message/MessagePartsGrouped.js +399 -94
  202. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  203. package/dist/primitives/message/MessageRoot.js +197 -65
  204. package/dist/primitives/message/MessageRoot.js.map +1 -1
  205. package/dist/primitives/message.js.map +1 -1
  206. package/dist/primitives/messagePart/MessagePartImage.js +15 -5
  207. package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
  208. package/dist/primitives/messagePart/MessagePartText.js +35 -7
  209. package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
  210. package/dist/primitives/messagePart/useMessagePartData.js +5 -4
  211. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  212. package/dist/primitives/messagePart/useMessagePartFile.js +5 -4
  213. package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -1
  214. package/dist/primitives/messagePart/useMessagePartImage.js +5 -4
  215. package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -1
  216. package/dist/primitives/messagePart/useMessagePartReasoning.js +5 -4
  217. package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -1
  218. package/dist/primitives/messagePart/useMessagePartSource.js +5 -4
  219. package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -1
  220. package/dist/primitives/messagePart/useMessagePartText.js +5 -4
  221. package/dist/primitives/messagePart/useMessagePartText.js.map +1 -1
  222. package/dist/primitives/messagePart.js.map +1 -1
  223. package/dist/primitives/queueItem/QueueItemRemove.js +11 -4
  224. package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
  225. package/dist/primitives/queueItem/QueueItemSteer.js +11 -4
  226. package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
  227. package/dist/primitives/queueItem/QueueItemText.js +20 -6
  228. package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
  229. package/dist/primitives/queueItem.js.map +1 -1
  230. package/dist/primitives/reasoning/useScrollLock.js +61 -43
  231. package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
  232. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +56 -16
  233. package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
  234. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +120 -59
  235. package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
  236. package/dist/primitives/selectionToolbar.js.map +1 -1
  237. package/dist/primitives/suggestion/SuggestionDescription.js +20 -6
  238. package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
  239. package/dist/primitives/suggestion/SuggestionTitle.js +20 -6
  240. package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
  241. package/dist/primitives/suggestion/SuggestionTrigger.js +39 -26
  242. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  243. package/dist/primitives/suggestion.js.map +1 -1
  244. package/dist/primitives/thread/ThreadEmpty.js +6 -2
  245. package/dist/primitives/thread/ThreadEmpty.js.map +1 -1
  246. package/dist/primitives/thread/ThreadIf.js +32 -10
  247. package/dist/primitives/thread/ThreadIf.js.map +1 -1
  248. package/dist/primitives/thread/ThreadRoot.js +13 -4
  249. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  250. package/dist/primitives/thread/ThreadScrollToBottom.js +24 -6
  251. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  252. package/dist/primitives/thread/ThreadSuggestion.js +18 -6
  253. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  254. package/dist/primitives/thread/ThreadViewport.js +185 -47
  255. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  256. package/dist/primitives/thread/ThreadViewportFooter.js +22 -9
  257. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  258. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js.map +1 -1
  259. package/dist/primitives/thread/topAnchor/createReserveObservers.js.map +1 -1
  260. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -1
  261. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
  262. package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -1
  263. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +19 -4
  264. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -1
  265. package/dist/primitives/thread/useThreadViewportAutoScroll.js +16 -16
  266. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  267. package/dist/primitives/thread.js.map +1 -1
  268. package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -1
  269. package/dist/primitives/threadList/ThreadListNew.js +53 -11
  270. package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
  271. package/dist/primitives/threadList/ThreadListRoot.js +13 -4
  272. package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
  273. package/dist/primitives/threadList.js.map +1 -1
  274. package/dist/primitives/threadListItem/ThreadListItemArchive.js.map +1 -1
  275. package/dist/primitives/threadListItem/ThreadListItemDelete.js.map +1 -1
  276. package/dist/primitives/threadListItem/ThreadListItemRoot.js +26 -7
  277. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  278. package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
  279. package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
  280. package/dist/primitives/threadListItem.js.map +1 -1
  281. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +44 -7
  282. package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
  283. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +28 -6
  284. package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
  285. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +25 -5
  286. package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
  287. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +28 -6
  288. package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
  289. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +28 -6
  290. package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
  291. package/dist/primitives/threadListItemMore/scope.js.map +1 -1
  292. package/dist/primitives/threadListItemMore.js.map +1 -1
  293. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  294. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  295. package/dist/tests/setup.js.map +1 -1
  296. package/dist/unstable/useComposerInputHistory.js.map +1 -1
  297. package/dist/unstable/useMentionAdapter.js.map +1 -1
  298. package/dist/unstable/useMessageStallDetection.d.ts +29 -0
  299. package/dist/unstable/useMessageStallDetection.d.ts.map +1 -0
  300. package/dist/unstable/useMessageStallDetection.js +69 -0
  301. package/dist/unstable/useMessageStallDetection.js.map +1 -0
  302. package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
  303. package/dist/utils/Primitive.js +57 -12
  304. package/dist/utils/Primitive.js.map +1 -1
  305. package/dist/utils/createActionButton.js +23 -7
  306. package/dist/utils/createActionButton.js.map +1 -1
  307. package/dist/utils/getSelectionMessageId.js.map +1 -1
  308. package/dist/utils/hooks/useManagedRef.js +16 -8
  309. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  310. package/dist/utils/hooks/useMediaQuery.js +25 -10
  311. package/dist/utils/hooks/useMediaQuery.js.map +1 -1
  312. package/dist/utils/hooks/useOnResizeContent.js +29 -19
  313. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  314. package/dist/utils/hooks/useOnScrollToBottom.js +20 -4
  315. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  316. package/dist/utils/hooks/useSizeHandle.js +23 -15
  317. package/dist/utils/hooks/useSizeHandle.js.map +1 -1
  318. package/dist/utils/json/is-json-equal.js.map +1 -1
  319. package/dist/utils/json/is-json.js.map +1 -1
  320. package/dist/utils/smooth/SmoothContext.js +41 -11
  321. package/dist/utils/smooth/SmoothContext.js.map +1 -1
  322. package/dist/utils/smooth/useSmooth.js +5 -5
  323. package/dist/utils/smooth/useSmooth.js.map +1 -1
  324. package/dist/utils/useToolArgsFieldStatus.js +13 -5
  325. package/dist/utils/useToolArgsFieldStatus.js.map +1 -1
  326. package/package.json +9 -9
  327. package/src/client/ExternalThread.ts +81 -52
  328. package/src/client/InMemoryThreadList.ts +12 -14
  329. package/src/hooks/useToolCallElapsed.ts +52 -0
  330. package/src/index.ts +11 -0
  331. package/src/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.test.ts +10 -6
  332. package/src/primitives/composer/trigger/TriggerPopover.tsx +4 -5
  333. package/src/tests/toolCallTiming.test.tsx +221 -0
  334. package/src/unstable/useMessageStallDetection.ts +91 -0
@@ -1,18 +1,36 @@
1
1
  "use client";
2
2
  import { useThreadViewport, useThreadViewportStore } from "../../context/react/ThreadViewportContext.js";
3
3
  import { createActionButton } from "../../utils/createActionButton.js";
4
- import { useCallback } from "@assistant-ui/tap/react-shim";
4
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
5
5
  //#region src/primitives/thread/ThreadScrollToBottom.ts
6
- const useThreadScrollToBottom = ({ behavior } = {}) => {
7
- const isAtBottom = useThreadViewport((s) => s.isAtBottom);
6
+ const useThreadScrollToBottom = (t0) => {
7
+ const $ = c(5);
8
+ let t1;
9
+ if ($[0] !== t0) {
10
+ t1 = t0 === void 0 ? {} : t0;
11
+ $[0] = t0;
12
+ $[1] = t1;
13
+ } else t1 = $[1];
14
+ const { behavior } = t1;
15
+ const isAtBottom = useThreadViewport(_temp);
8
16
  const threadViewportStore = useThreadViewportStore();
9
- const handleScrollToBottom = useCallback(() => {
10
- threadViewportStore.getState().scrollToBottom({ behavior });
11
- }, [threadViewportStore, behavior]);
17
+ let t2;
18
+ if ($[2] !== behavior || $[3] !== threadViewportStore) {
19
+ t2 = () => {
20
+ threadViewportStore.getState().scrollToBottom({ behavior });
21
+ };
22
+ $[2] = behavior;
23
+ $[3] = threadViewportStore;
24
+ $[4] = t2;
25
+ } else t2 = $[4];
26
+ const handleScrollToBottom = t2;
12
27
  if (isAtBottom) return null;
13
28
  return handleScrollToBottom;
14
29
  };
15
30
  const ThreadPrimitiveScrollToBottom = createActionButton("ThreadPrimitive.ScrollToBottom", useThreadScrollToBottom, ["behavior"]);
31
+ function _temp(s) {
32
+ return s.isAtBottom;
33
+ }
16
34
  //#endregion
17
35
  export { ThreadPrimitiveScrollToBottom };
18
36
 
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadScrollToBottom.js","names":[],"sources":["../../../src/primitives/thread/ThreadScrollToBottom.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useCallback } from \"react\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\n\nexport namespace useThreadScrollToBottom {\n export type Options = {\n behavior?: ScrollBehavior | undefined;\n };\n}\n\nconst useThreadScrollToBottom = ({\n behavior,\n}: useThreadScrollToBottom.Options = {}) => {\n const isAtBottom = useThreadViewport((s) => s.isAtBottom);\n\n const threadViewportStore = useThreadViewportStore();\n\n const handleScrollToBottom = useCallback(() => {\n threadViewportStore.getState().scrollToBottom({ behavior });\n }, [threadViewportStore, behavior]);\n\n if (isAtBottom) return null;\n return handleScrollToBottom;\n};\n\nexport namespace ThreadPrimitiveScrollToBottom {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useThreadScrollToBottom>;\n}\n\nexport const ThreadPrimitiveScrollToBottom = createActionButton(\n \"ThreadPrimitive.ScrollToBottom\",\n useThreadScrollToBottom,\n [\"behavior\"],\n);\n"],"mappings":";;;;;AAmBA,MAAM,2BAA2B,EAC/B,aACmC,CAAC,MAAM;CAC1C,MAAM,aAAa,mBAAmB,MAAM,EAAE,UAAU;CAExD,MAAM,sBAAsB,uBAAuB;CAEnD,MAAM,uBAAuB,kBAAkB;EAC7C,oBAAoB,SAAS,CAAC,CAAC,eAAe,EAAE,SAAS,CAAC;CAC5D,GAAG,CAAC,qBAAqB,QAAQ,CAAC;CAElC,IAAI,YAAY,OAAO;CACvB,OAAO;AACT;AAOA,MAAa,gCAAgC,mBAC3C,kCACA,yBACA,CAAC,UAAU,CACb"}
1
+ {"version":3,"file":"ThreadScrollToBottom.js","names":["c","_c","ActionButtonElement","ActionButtonProps","createActionButton","useCallback","useThreadViewport","useThreadViewportStore","useThreadScrollToBottom","Options","behavior","ScrollBehavior","t0","$","t1","undefined","isAtBottom","_temp","threadViewportStore","t2","getState","scrollToBottom","handleScrollToBottom","ThreadPrimitiveScrollToBottom","Element","Props","s"],"sources":["../../../src/primitives/thread/ThreadScrollToBottom.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useCallback } from \"react\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\n\nexport namespace useThreadScrollToBottom {\n export type Options = {\n behavior?: ScrollBehavior | undefined;\n };\n}\n\nconst useThreadScrollToBottom = ({\n behavior,\n}: useThreadScrollToBottom.Options = {}) => {\n const isAtBottom = useThreadViewport((s) => s.isAtBottom);\n\n const threadViewportStore = useThreadViewportStore();\n\n const handleScrollToBottom = useCallback(() => {\n threadViewportStore.getState().scrollToBottom({ behavior });\n }, [threadViewportStore, behavior]);\n\n if (isAtBottom) return null;\n return handleScrollToBottom;\n};\n\nexport namespace ThreadPrimitiveScrollToBottom {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useThreadScrollToBottom>;\n}\n\nexport const ThreadPrimitiveScrollToBottom = createActionButton(\n \"ThreadPrimitive.ScrollToBottom\",\n useThreadScrollToBottom,\n [\"behavior\"],\n);\n"],"mappings":";;;;;AAmBA,MAAMQ,2BAA0BI,OAAA;CAAA,MAAAC,IAAAZ,EAAA,CAAA;CAAA,IAAAa;CAAA,IAAAD,EAAA,OAAAD,IAAA;EAACE,KAAAF,OAAAG,KAAAA,IAAA,CAEK,IAFLH;EAEMC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;CAAA,OAAAA,KAAAD,EAAA;CAFN,MAAA,EAAAH,aAAAI;CAG/B,MAAAE,aAAmBV,kBAAkBW,KAAmB;CAExD,MAAAC,sBAA4BX,uBAAuB;CAAE,IAAAY;CAAA,IAAAN,EAAA,OAAAH,YAAAG,EAAA,OAAAK,qBAAA;EAEZC,WAAA;GACvCD,oBAAmBE,SAAU,CAAC,CAAAC,eAAgB,EAAAX,SAAW,CAAC;EAAC;EAC5DG,EAAA,KAAAH;EAAAG,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAFD,MAAAS,uBAA6BH;CAI7B,IAAIH,YAAU,OAAS;CAAK,OACrBM;AAAoB;AAQ7B,MAAaC,gCAAgCnB,mBAC3C,kCACAI,yBACA,CAAC,UAAU,CACb;AAxBgC,SAAAS,MAAAS,GAAA;CAAA,OAGcA,EAACV;AAAW"}
@@ -1,13 +1,25 @@
1
1
  "use client";
2
2
  import { createActionButton } from "../../utils/createActionButton.js";
3
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
4
  import { useSuggestionTrigger } from "@assistant-ui/core/react";
4
5
  //#region src/primitives/thread/ThreadSuggestion.ts
5
- const useThreadSuggestion = ({ prompt, send, clearComposer, autoSend, method: _method }) => {
6
- const { disabled, trigger } = useSuggestionTrigger({
7
- prompt,
8
- send: send ?? autoSend ?? false,
9
- clearComposer
10
- });
6
+ const useThreadSuggestion = (t0) => {
7
+ const $ = c(4);
8
+ const { prompt, send, clearComposer, autoSend } = t0;
9
+ const resolvedSend = send ?? autoSend ?? false;
10
+ let t1;
11
+ if ($[0] !== clearComposer || $[1] !== prompt || $[2] !== resolvedSend) {
12
+ t1 = {
13
+ prompt,
14
+ send: resolvedSend,
15
+ clearComposer
16
+ };
17
+ $[0] = clearComposer;
18
+ $[1] = prompt;
19
+ $[2] = resolvedSend;
20
+ $[3] = t1;
21
+ } else t1 = $[3];
22
+ const { disabled, trigger } = useSuggestionTrigger(t1);
11
23
  if (disabled) return null;
12
24
  return trigger;
13
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadSuggestion.js","names":["useSuggestionTriggerBehavior"],"sources":["../../../src/primitives/thread/ThreadSuggestion.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useSuggestionTrigger as useSuggestionTriggerBehavior } from \"@assistant-ui/core/react\";\n\nconst useThreadSuggestion = ({\n prompt,\n send,\n clearComposer,\n autoSend,\n method: _method,\n}: {\n /** The suggestion prompt. */\n prompt: string;\n\n /**\n * When true, automatically sends the message.\n * When false, replaces or appends the composer text with the suggestion - depending on the value of `clearComposer`.\n */\n send?: boolean | undefined;\n\n /**\n * Whether to clear the composer after sending.\n * When send is set to false, determines if composer text is replaced with suggestion (true, default),\n * or if it's appended to the composer text (false).\n *\n * @default true\n */\n clearComposer?: boolean | undefined;\n\n /** @deprecated Use `send` instead. */\n autoSend?: boolean | undefined;\n\n /** @deprecated Use `clearComposer` instead. */\n method?: \"replace\";\n}) => {\n const resolvedSend = send ?? autoSend ?? false;\n\n const { disabled, trigger } = useSuggestionTriggerBehavior({\n prompt,\n send: resolvedSend,\n clearComposer,\n });\n if (disabled) return null;\n return trigger;\n};\n\nexport namespace ThreadPrimitiveSuggestion {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useThreadSuggestion>;\n}\n\nexport const ThreadPrimitiveSuggestion = createActionButton(\n \"ThreadPrimitive.Suggestion\",\n useThreadSuggestion,\n [\"prompt\", \"send\", \"clearComposer\", \"autoSend\", \"method\"],\n);\n"],"mappings":";;;;AASA,MAAM,uBAAuB,EAC3B,QACA,MACA,eACA,UACA,QAAQ,cAyBJ;CAGJ,MAAM,EAAE,UAAU,YAAYA,qBAA6B;EACzD;EACA,MAJmB,QAAQ,YAAY;EAKvC;CACF,CAAC;CACD,IAAI,UAAU,OAAO;CACrB,OAAO;AACT;AAOA,MAAa,4BAA4B,mBACvC,8BACA,qBACA;CAAC;CAAU;CAAQ;CAAiB;CAAY;AAAQ,CAC1D"}
1
+ {"version":3,"file":"ThreadSuggestion.js","names":["c","_c","ActionButtonElement","ActionButtonProps","createActionButton","useSuggestionTrigger","useSuggestionTriggerBehavior","useThreadSuggestion","t0","$","prompt","send","clearComposer","autoSend","resolvedSend","t1","disabled","trigger","ThreadPrimitiveSuggestion","Element","Props"],"sources":["../../../src/primitives/thread/ThreadSuggestion.ts"],"sourcesContent":["\"use client\";\n\nimport {\n type ActionButtonElement,\n type ActionButtonProps,\n createActionButton,\n} from \"../../utils/createActionButton\";\nimport { useSuggestionTrigger as useSuggestionTriggerBehavior } from \"@assistant-ui/core/react\";\n\nconst useThreadSuggestion = ({\n prompt,\n send,\n clearComposer,\n autoSend,\n method: _method,\n}: {\n /** The suggestion prompt. */\n prompt: string;\n\n /**\n * When true, automatically sends the message.\n * When false, replaces or appends the composer text with the suggestion - depending on the value of `clearComposer`.\n */\n send?: boolean | undefined;\n\n /**\n * Whether to clear the composer after sending.\n * When send is set to false, determines if composer text is replaced with suggestion (true, default),\n * or if it's appended to the composer text (false).\n *\n * @default true\n */\n clearComposer?: boolean | undefined;\n\n /** @deprecated Use `send` instead. */\n autoSend?: boolean | undefined;\n\n /** @deprecated Use `clearComposer` instead. */\n method?: \"replace\";\n}) => {\n const resolvedSend = send ?? autoSend ?? false;\n\n const { disabled, trigger } = useSuggestionTriggerBehavior({\n prompt,\n send: resolvedSend,\n clearComposer,\n });\n if (disabled) return null;\n return trigger;\n};\n\nexport namespace ThreadPrimitiveSuggestion {\n export type Element = ActionButtonElement;\n export type Props = ActionButtonProps<typeof useThreadSuggestion>;\n}\n\nexport const ThreadPrimitiveSuggestion = createActionButton(\n \"ThreadPrimitive.Suggestion\",\n useThreadSuggestion,\n [\"prompt\", \"send\", \"clearComposer\", \"autoSend\", \"method\"],\n);\n"],"mappings":";;;;;AASA,MAAMO,uBAAsBC,OAAA;CAAA,MAAAC,IAAAR,EAAA,CAAA;CAAC,MAAA,EAAAS,QAAAC,MAAAC,eAAAC,aAAAL;CA+B3B,MAAAM,eAAqBH,QAAAE,YAAA;CAA0B,IAAAE;CAAA,IAAAN,EAAA,OAAAG,iBAAAH,EAAA,OAAAC,UAAAD,EAAA,OAAAK,cAAA;EAEYC,KAAA;GAAAL;GAAAC,MAEnDG;GAAYF;EAEpB;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAC;EAAAD,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAJD,MAAA,EAAAO,UAAAC,YAA8BX,qBAA6BS,EAI1D;CACD,IAAIC,UAAQ,OAAS;CAAK,OACnBC;AAAO;AAQhB,MAAaC,4BAA4Bd,mBACvC,8BACAG,qBACA;CAAC;CAAU;CAAQ;CAAiB;CAAY;AAAQ,CAC1D"}
@@ -8,64 +8,157 @@ import { useSizeHandle } from "../../utils/hooks/useSizeHandle.js";
8
8
  import { useTopAnchorReserve } from "./topAnchor/useTopAnchorReserve.js";
9
9
  import { getActiveTopAnchorAnchorId, getActiveTopAnchorTargetId } from "./topAnchor/topAnchorTurn.js";
10
10
  import { useAuiEvent, useAuiState } from "@assistant-ui/store";
11
- import { forwardRef, useCallback, useLayoutEffect, useMemo } from "@assistant-ui/tap/react-shim";
11
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
12
+ import { forwardRef, useLayoutEffect } from "@assistant-ui/tap/react-shim";
12
13
  import { jsx } from "react/jsx-runtime";
13
14
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
14
15
  //#region src/primitives/thread/ThreadViewport.tsx
15
16
  const useViewportSizeRef = () => {
16
- return useSizeHandle(useThreadViewport((s) => s.registerViewport), useCallback((el) => el.clientHeight, []));
17
+ return useSizeHandle(useThreadViewport(_temp), _temp2);
17
18
  };
18
19
  const useViewportElementRef = () => {
19
- return useManagedRef(useThreadViewport((s) => s.registerViewportElement));
20
+ return useManagedRef(useThreadViewport(_temp3));
20
21
  };
21
22
  const useTopAnchorTurn = (enabled) => {
23
+ const $ = c(13);
22
24
  const threadViewportStore = useThreadViewportStore();
23
- const activeAnchorId = useAuiState((s) => {
24
- if (!enabled) return void 0;
25
- return getActiveTopAnchorAnchorId(s.thread);
26
- });
27
- const activeTargetId = useAuiState((s) => {
28
- if (!enabled) return void 0;
29
- return getActiveTopAnchorTargetId(s.thread);
30
- });
31
- const activeTurn = useMemo(() => {
32
- if (!activeAnchorId || !activeTargetId) return null;
33
- return {
34
- anchorId: activeAnchorId,
35
- targetId: activeTargetId
25
+ let t0;
26
+ if ($[0] !== enabled) {
27
+ t0 = (s) => {
28
+ if (!enabled) return;
29
+ return getActiveTopAnchorAnchorId(s.thread);
36
30
  };
37
- }, [activeAnchorId, activeTargetId]);
38
- useLayoutEffect(() => {
39
- if (!activeTurn) return;
40
- const state = threadViewportStore.getState();
41
- const current = state.topAnchorTurn;
42
- if (current?.anchorId === activeTurn.anchorId && current.targetId === activeTurn.targetId) return;
43
- state.setTopAnchorTurn(activeTurn);
44
- }, [activeTurn, threadViewportStore]);
45
- const clearTopAnchorTurn = useCallback(() => {
46
- threadViewportStore.getState().setTopAnchorTurn(null);
47
- }, [threadViewportStore]);
31
+ $[0] = enabled;
32
+ $[1] = t0;
33
+ } else t0 = $[1];
34
+ const activeAnchorId = useAuiState(t0);
35
+ let t1;
36
+ if ($[2] !== enabled) {
37
+ t1 = (s_0) => {
38
+ if (!enabled) return;
39
+ return getActiveTopAnchorTargetId(s_0.thread);
40
+ };
41
+ $[2] = enabled;
42
+ $[3] = t1;
43
+ } else t1 = $[3];
44
+ const activeTargetId = useAuiState(t1);
45
+ let t2;
46
+ bb0: {
47
+ if (!activeAnchorId || !activeTargetId) {
48
+ t2 = null;
49
+ break bb0;
50
+ }
51
+ let t3;
52
+ if ($[4] !== activeAnchorId || $[5] !== activeTargetId) {
53
+ t3 = {
54
+ anchorId: activeAnchorId,
55
+ targetId: activeTargetId
56
+ };
57
+ $[4] = activeAnchorId;
58
+ $[5] = activeTargetId;
59
+ $[6] = t3;
60
+ } else t3 = $[6];
61
+ t2 = t3;
62
+ }
63
+ const activeTurn = t2;
64
+ let t3;
65
+ let t4;
66
+ if ($[7] !== activeTurn || $[8] !== threadViewportStore) {
67
+ t3 = () => {
68
+ if (!activeTurn) return;
69
+ const state = threadViewportStore.getState();
70
+ const current = state.topAnchorTurn;
71
+ if (current?.anchorId === activeTurn.anchorId && current.targetId === activeTurn.targetId) return;
72
+ state.setTopAnchorTurn(activeTurn);
73
+ };
74
+ t4 = [activeTurn, threadViewportStore];
75
+ $[7] = activeTurn;
76
+ $[8] = threadViewportStore;
77
+ $[9] = t3;
78
+ $[10] = t4;
79
+ } else {
80
+ t3 = $[9];
81
+ t4 = $[10];
82
+ }
83
+ useLayoutEffect(t3, t4);
84
+ let t5;
85
+ if ($[11] !== threadViewportStore) {
86
+ t5 = () => {
87
+ threadViewportStore.getState().setTopAnchorTurn(null);
88
+ };
89
+ $[11] = threadViewportStore;
90
+ $[12] = t5;
91
+ } else t5 = $[12];
92
+ const clearTopAnchorTurn = t5;
48
93
  useAuiEvent("thread.initialize", clearTopAnchorTurn);
49
94
  useAuiEvent("threadListItem.switchedTo", clearTopAnchorTurn);
50
95
  };
51
- const ThreadPrimitiveViewportScrollable = forwardRef(({ autoScroll, scrollToBottomOnRunStart, scrollToBottomOnInitialize, scrollToBottomOnThreadSwitch, children, ...rest }, forwardedRef) => {
52
- const autoScrollRef = useThreadViewportAutoScroll({
53
- autoScroll,
54
- scrollToBottomOnRunStart,
55
- scrollToBottomOnInitialize,
56
- scrollToBottomOnThreadSwitch
57
- });
96
+ const ThreadPrimitiveViewportScrollable = forwardRef((t0, forwardedRef) => {
97
+ const $ = c(18);
98
+ let autoScroll;
99
+ let children;
100
+ let rest;
101
+ let scrollToBottomOnInitialize;
102
+ let scrollToBottomOnRunStart;
103
+ let scrollToBottomOnThreadSwitch;
104
+ if ($[0] !== t0) {
105
+ ({autoScroll, scrollToBottomOnRunStart, scrollToBottomOnInitialize, scrollToBottomOnThreadSwitch, children, ...rest} = t0);
106
+ $[0] = t0;
107
+ $[1] = autoScroll;
108
+ $[2] = children;
109
+ $[3] = rest;
110
+ $[4] = scrollToBottomOnInitialize;
111
+ $[5] = scrollToBottomOnRunStart;
112
+ $[6] = scrollToBottomOnThreadSwitch;
113
+ } else {
114
+ autoScroll = $[1];
115
+ children = $[2];
116
+ rest = $[3];
117
+ scrollToBottomOnInitialize = $[4];
118
+ scrollToBottomOnRunStart = $[5];
119
+ scrollToBottomOnThreadSwitch = $[6];
120
+ }
121
+ let t1;
122
+ if ($[7] !== autoScroll || $[8] !== scrollToBottomOnInitialize || $[9] !== scrollToBottomOnRunStart || $[10] !== scrollToBottomOnThreadSwitch) {
123
+ t1 = {
124
+ autoScroll,
125
+ scrollToBottomOnRunStart,
126
+ scrollToBottomOnInitialize,
127
+ scrollToBottomOnThreadSwitch
128
+ };
129
+ $[7] = autoScroll;
130
+ $[8] = scrollToBottomOnInitialize;
131
+ $[9] = scrollToBottomOnRunStart;
132
+ $[10] = scrollToBottomOnThreadSwitch;
133
+ $[11] = t1;
134
+ } else t1 = $[11];
135
+ const autoScrollRef = useThreadViewportAutoScroll(t1);
58
136
  const viewportSizeRef = useViewportSizeRef();
59
137
  const viewportElementRef = useViewportElementRef();
60
- const topAnchorEnabled = useThreadViewportStore().getState().turnAnchor === "top";
138
+ const threadViewportStore = useThreadViewportStore();
139
+ let t2;
140
+ if ($[12] !== threadViewportStore) {
141
+ t2 = threadViewportStore.getState();
142
+ $[12] = threadViewportStore;
143
+ $[13] = t2;
144
+ } else t2 = $[13];
145
+ const topAnchorEnabled = t2.turnAnchor === "top";
61
146
  useTopAnchorTurn(topAnchorEnabled);
62
147
  useTopAnchorReserve(topAnchorEnabled);
63
148
  const ref = useComposedRefs(forwardedRef, autoScrollRef, viewportSizeRef, viewportElementRef);
64
- return /* @__PURE__ */ jsx(Primitive.div, {
65
- ...rest,
66
- ref,
67
- children
68
- });
149
+ let t3;
150
+ if ($[14] !== children || $[15] !== ref || $[16] !== rest) {
151
+ t3 = /* @__PURE__ */ jsx(Primitive.div, {
152
+ ...rest,
153
+ ref,
154
+ children
155
+ });
156
+ $[14] = children;
157
+ $[15] = ref;
158
+ $[16] = rest;
159
+ $[17] = t3;
160
+ } else t3 = $[17];
161
+ return t3;
69
162
  });
70
163
  ThreadPrimitiveViewportScrollable.displayName = "ThreadPrimitive.ViewportScrollable";
71
164
  /**
@@ -84,19 +177,64 @@ ThreadPrimitiveViewportScrollable.displayName = "ThreadPrimitive.ViewportScrolla
84
177
  * </ThreadPrimitive.Viewport>
85
178
  * ```
86
179
  */
87
- const ThreadPrimitiveViewport = forwardRef(({ turnAnchor, topAnchorMessageClamp, ...props }, ref) => {
88
- return /* @__PURE__ */ jsx(ThreadPrimitiveViewportProvider, {
89
- options: {
180
+ const ThreadPrimitiveViewport = forwardRef((t0, ref) => {
181
+ const $ = c(13);
182
+ let props;
183
+ let topAnchorMessageClamp;
184
+ let turnAnchor;
185
+ if ($[0] !== t0) {
186
+ ({turnAnchor, topAnchorMessageClamp, ...props} = t0);
187
+ $[0] = t0;
188
+ $[1] = props;
189
+ $[2] = topAnchorMessageClamp;
190
+ $[3] = turnAnchor;
191
+ } else {
192
+ props = $[1];
193
+ topAnchorMessageClamp = $[2];
194
+ turnAnchor = $[3];
195
+ }
196
+ let t1;
197
+ if ($[4] !== topAnchorMessageClamp || $[5] !== turnAnchor) {
198
+ t1 = {
90
199
  turnAnchor,
91
200
  topAnchorMessageClamp
92
- },
93
- children: /* @__PURE__ */ jsx(ThreadPrimitiveViewportScrollable, {
201
+ };
202
+ $[4] = topAnchorMessageClamp;
203
+ $[5] = turnAnchor;
204
+ $[6] = t1;
205
+ } else t1 = $[6];
206
+ let t2;
207
+ if ($[7] !== props || $[8] !== ref) {
208
+ t2 = /* @__PURE__ */ jsx(ThreadPrimitiveViewportScrollable, {
94
209
  ...props,
95
210
  ref
96
- })
97
- });
211
+ });
212
+ $[7] = props;
213
+ $[8] = ref;
214
+ $[9] = t2;
215
+ } else t2 = $[9];
216
+ let t3;
217
+ if ($[10] !== t1 || $[11] !== t2) {
218
+ t3 = /* @__PURE__ */ jsx(ThreadPrimitiveViewportProvider, {
219
+ options: t1,
220
+ children: t2
221
+ });
222
+ $[10] = t1;
223
+ $[11] = t2;
224
+ $[12] = t3;
225
+ } else t3 = $[12];
226
+ return t3;
98
227
  });
99
228
  ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
229
+ function _temp(s) {
230
+ return s.registerViewport;
231
+ }
232
+ function _temp2(el) {
233
+ return el.clientHeight;
234
+ }
235
+ function _temp3(s) {
236
+ return s.registerViewportElement;
237
+ }
100
238
  //#endregion
101
239
  export { ThreadPrimitiveViewport };
102
240
 
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewport.js","names":[],"sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n useCallback,\n useLayoutEffect,\n useMemo,\n} from \"react\";\nimport { useAuiEvent, useAuiState } from \"@assistant-ui/store\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { useThreadViewportAutoScroll } from \"./useThreadViewportAutoScroll\";\nimport { ThreadPrimitiveViewportProvider } from \"../../context/providers/ThreadViewportProvider\";\nimport { useSizeHandle } from \"../../utils/hooks/useSizeHandle\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\nimport { useTopAnchorReserve } from \"./topAnchor/useTopAnchorReserve\";\nimport {\n getActiveTopAnchorAnchorId,\n getActiveTopAnchorTargetId,\n} from \"./topAnchor/topAnchorTurn\";\n\nexport namespace ThreadPrimitiveViewport {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {\n /**\n * Whether to automatically scroll to the bottom when new messages are added.\n * When enabled, the viewport will automatically scroll to show the latest content.\n *\n * Default false if `turnAnchor` is \"top\", otherwise defaults to true.\n */\n autoScroll?: boolean | undefined;\n\n /**\n * Controls scroll anchoring behavior for new messages.\n * - \"bottom\" (default): Messages anchor at the bottom, classic chat behavior.\n * - \"top\": New user messages anchor at the top of the viewport for a focused reading experience.\n */\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n\n /**\n * Clamps tall user messages so the assistant response stays in view.\n *\n * @default { tallerThan: \"10em\", visibleHeight: \"6em\" }\n */\n topAnchorMessageClamp?: {\n /**\n * Clamp messages taller than this. Supports `px`, `em`, and `rem`.\n *\n * @default \"10em\"\n */\n tallerThan?: string;\n /**\n * Visible portion of clamped messages. Supports `px`, `em`, and `rem`.\n *\n * @default \"6em\"\n */\n visibleHeight?: string;\n };\n\n /**\n * Whether to scroll to bottom when a new run starts.\n *\n * Defaults to true.\n */\n scrollToBottomOnRunStart?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when thread history is first loaded.\n *\n * Defaults to true.\n */\n scrollToBottomOnInitialize?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when switching to a different thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n}\n\nconst useViewportSizeRef = () => {\n const register = useThreadViewport((s) => s.registerViewport);\n const getHeight = useCallback((el: HTMLElement) => el.clientHeight, []);\n return useSizeHandle(register, getHeight);\n};\n\nconst useViewportElementRef = () => {\n const registerViewportElement = useThreadViewport(\n (s) => s.registerViewportElement,\n );\n\n return useManagedRef(registerViewportElement);\n};\n\nconst useTopAnchorTurn = (enabled: boolean) => {\n const threadViewportStore = useThreadViewportStore();\n const activeAnchorId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorAnchorId(s.thread);\n });\n const activeTargetId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorTargetId(s.thread);\n });\n const activeTurn = useMemo(() => {\n if (!activeAnchorId || !activeTargetId) return null;\n return { anchorId: activeAnchorId, targetId: activeTargetId };\n }, [activeAnchorId, activeTargetId]);\n\n useLayoutEffect(() => {\n if (!activeTurn) return;\n\n const state = threadViewportStore.getState();\n const current = state.topAnchorTurn;\n if (\n current?.anchorId === activeTurn.anchorId &&\n current.targetId === activeTurn.targetId\n ) {\n return;\n }\n\n state.setTopAnchorTurn(activeTurn);\n }, [activeTurn, threadViewportStore]);\n\n const clearTopAnchorTurn = useCallback(() => {\n threadViewportStore.getState().setTopAnchorTurn(null);\n }, [threadViewportStore]);\n\n useAuiEvent(\"thread.initialize\", clearTopAnchorTurn);\n useAuiEvent(\"threadListItem.switchedTo\", clearTopAnchorTurn);\n};\n\nconst ThreadPrimitiveViewportScrollable = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(\n (\n {\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n children,\n ...rest\n },\n forwardedRef,\n ) => {\n const autoScrollRef = useThreadViewportAutoScroll<HTMLDivElement>({\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n });\n const viewportSizeRef = useViewportSizeRef();\n const viewportElementRef = useViewportElementRef();\n const threadViewportStore = useThreadViewportStore();\n const turnAnchor = threadViewportStore.getState().turnAnchor;\n const topAnchorEnabled = turnAnchor === \"top\";\n useTopAnchorTurn(topAnchorEnabled);\n useTopAnchorReserve(topAnchorEnabled);\n const ref = useComposedRefs(\n forwardedRef,\n autoScrollRef,\n viewportSizeRef,\n viewportElementRef,\n );\n\n return (\n <Primitive.div {...rest} ref={ref}>\n {children}\n </Primitive.div>\n );\n },\n);\n\nThreadPrimitiveViewportScrollable.displayName =\n \"ThreadPrimitive.ViewportScrollable\";\n\n/**\n * A scrollable viewport container for thread messages.\n *\n * This component provides a scrollable area for displaying thread messages with\n * automatic scrolling capabilities. It manages the viewport state and provides\n * context for child components to access viewport-related functionality.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Viewport turnAnchor=\"top\">\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * </ThreadPrimitive.Viewport>\n * ```\n */\nexport const ThreadPrimitiveViewport = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(({ turnAnchor, topAnchorMessageClamp, ...props }, ref) => {\n return (\n <ThreadPrimitiveViewportProvider\n options={{ turnAnchor, topAnchorMessageClamp }}\n >\n <ThreadPrimitiveViewportScrollable {...props} ref={ref} />\n </ThreadPrimitiveViewportProvider>\n );\n});\n\nThreadPrimitiveViewport.displayName = \"ThreadPrimitive.Viewport\";\n"],"mappings":";;;;;;;;;;;;;;AAwFA,MAAM,2BAA2B;CAG/B,OAAO,cAFU,mBAAmB,MAAM,EAAE,gBAEhB,GADV,aAAa,OAAoB,GAAG,cAAc,CAAC,CAC9B,CAAC;AAC1C;AAEA,MAAM,8BAA8B;CAKlC,OAAO,cAJyB,mBAC7B,MAAM,EAAE,uBAGgC,CAAC;AAC9C;AAEA,MAAM,oBAAoB,YAAqB;CAC7C,MAAM,sBAAsB,uBAAuB;CACnD,MAAM,iBAAiB,aAAa,MAAM;EACxC,IAAI,CAAC,SAAS,OAAO,KAAA;EACrB,OAAO,2BAA2B,EAAE,MAAM;CAC5C,CAAC;CACD,MAAM,iBAAiB,aAAa,MAAM;EACxC,IAAI,CAAC,SAAS,OAAO,KAAA;EACrB,OAAO,2BAA2B,EAAE,MAAM;CAC5C,CAAC;CACD,MAAM,aAAa,cAAc;EAC/B,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,OAAO;EAC/C,OAAO;GAAE,UAAU;GAAgB,UAAU;EAAe;CAC9D,GAAG,CAAC,gBAAgB,cAAc,CAAC;CAEnC,sBAAsB;EACpB,IAAI,CAAC,YAAY;EAEjB,MAAM,QAAQ,oBAAoB,SAAS;EAC3C,MAAM,UAAU,MAAM;EACtB,IACE,SAAS,aAAa,WAAW,YACjC,QAAQ,aAAa,WAAW,UAEhC;EAGF,MAAM,iBAAiB,UAAU;CACnC,GAAG,CAAC,YAAY,mBAAmB,CAAC;CAEpC,MAAM,qBAAqB,kBAAkB;EAC3C,oBAAoB,SAAS,CAAC,CAAC,iBAAiB,IAAI;CACtD,GAAG,CAAC,mBAAmB,CAAC;CAExB,YAAY,qBAAqB,kBAAkB;CACnD,YAAY,6BAA6B,kBAAkB;AAC7D;AAEA,MAAM,oCAAoC,YAKtC,EACE,YACA,0BACA,4BACA,8BACA,UACA,GAAG,QAEL,iBACG;CACH,MAAM,gBAAgB,4BAA4C;EAChE;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,kBAAkB,mBAAmB;CAC3C,MAAM,qBAAqB,sBAAsB;CAGjD,MAAM,mBAFsB,uBACS,CAAC,CAAC,SAAS,CAAC,CAAC,eACV;CACxC,iBAAiB,gBAAgB;CACjC,oBAAoB,gBAAgB;CACpC,MAAM,MAAM,gBACV,cACA,eACA,iBACA,kBACF;CAEA,OACE,oBAAC,UAAU,KAAX;EAAe,GAAI;EAAW;EAC3B;CACY,CAAA;AAEnB,CACF;AAEA,kCAAkC,cAChC;;;;;;;;;;;;;;;;;AAkBF,MAAa,0BAA0B,YAGpC,EAAE,YAAY,uBAAuB,GAAG,SAAS,QAAQ;CAC1D,OACE,oBAAC,iCAAD;EACE,SAAS;GAAE;GAAY;EAAsB;YAE7C,oBAAC,mCAAD;GAAmC,GAAI;GAAY;EAAM,CAAA;CAC1B,CAAA;AAErC,CAAC;AAED,wBAAwB,cAAc"}
1
+ {"version":3,"file":"ThreadViewport.js","names":["c","_c","useComposedRefs","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useCallback","useLayoutEffect","useMemo","useAuiEvent","useAuiState","useManagedRef","useThreadViewportAutoScroll","ThreadPrimitiveViewportProvider","useSizeHandle","useThreadViewport","useThreadViewportStore","useTopAnchorReserve","getActiveTopAnchorAnchorId","getActiveTopAnchorTargetId","ThreadPrimitiveViewport","Element","div","Props","autoScroll","turnAnchor","topAnchorMessageClamp","tallerThan","visibleHeight","scrollToBottomOnRunStart","scrollToBottomOnInitialize","scrollToBottomOnThreadSwitch","useViewportSizeRef","register","_temp","getHeight","_temp2","useViewportElementRef","registerViewportElement","_temp3","useTopAnchorTurn","enabled","$","threadViewportStore","t0","s","thread","activeAnchorId","t1","s_0","activeTargetId","t2","bb0","t3","anchorId","targetId","activeTurn","t4","state","getState","current","topAnchorTurn","setTopAnchorTurn","t5","clearTopAnchorTurn","ThreadPrimitiveViewportScrollable","forwardedRef","children","rest","autoScrollRef","viewportSizeRef","viewportElementRef","topAnchorEnabled","ref","displayName","props","registerViewport","el","clientHeight"],"sources":["../../../src/primitives/thread/ThreadViewport.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n useCallback,\n useLayoutEffect,\n useMemo,\n} from \"react\";\nimport { useAuiEvent, useAuiState } from \"@assistant-ui/store\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { useThreadViewportAutoScroll } from \"./useThreadViewportAutoScroll\";\nimport { ThreadPrimitiveViewportProvider } from \"../../context/providers/ThreadViewportProvider\";\nimport { useSizeHandle } from \"../../utils/hooks/useSizeHandle\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\nimport { useTopAnchorReserve } from \"./topAnchor/useTopAnchorReserve\";\nimport {\n getActiveTopAnchorAnchorId,\n getActiveTopAnchorTargetId,\n} from \"./topAnchor/topAnchorTurn\";\n\nexport namespace ThreadPrimitiveViewport {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {\n /**\n * Whether to automatically scroll to the bottom when new messages are added.\n * When enabled, the viewport will automatically scroll to show the latest content.\n *\n * Default false if `turnAnchor` is \"top\", otherwise defaults to true.\n */\n autoScroll?: boolean | undefined;\n\n /**\n * Controls scroll anchoring behavior for new messages.\n * - \"bottom\" (default): Messages anchor at the bottom, classic chat behavior.\n * - \"top\": New user messages anchor at the top of the viewport for a focused reading experience.\n */\n turnAnchor?: \"top\" | \"bottom\" | undefined;\n\n /**\n * Clamps tall user messages so the assistant response stays in view.\n *\n * @default { tallerThan: \"10em\", visibleHeight: \"6em\" }\n */\n topAnchorMessageClamp?: {\n /**\n * Clamp messages taller than this. Supports `px`, `em`, and `rem`.\n *\n * @default \"10em\"\n */\n tallerThan?: string;\n /**\n * Visible portion of clamped messages. Supports `px`, `em`, and `rem`.\n *\n * @default \"6em\"\n */\n visibleHeight?: string;\n };\n\n /**\n * Whether to scroll to bottom when a new run starts.\n *\n * Defaults to true.\n */\n scrollToBottomOnRunStart?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when thread history is first loaded.\n *\n * Defaults to true.\n */\n scrollToBottomOnInitialize?: boolean | undefined;\n\n /**\n * Whether to scroll to bottom when switching to a different thread.\n *\n * Defaults to true.\n */\n scrollToBottomOnThreadSwitch?: boolean | undefined;\n };\n}\n\nconst useViewportSizeRef = () => {\n const register = useThreadViewport((s) => s.registerViewport);\n const getHeight = useCallback((el: HTMLElement) => el.clientHeight, []);\n return useSizeHandle(register, getHeight);\n};\n\nconst useViewportElementRef = () => {\n const registerViewportElement = useThreadViewport(\n (s) => s.registerViewportElement,\n );\n\n return useManagedRef(registerViewportElement);\n};\n\nconst useTopAnchorTurn = (enabled: boolean) => {\n const threadViewportStore = useThreadViewportStore();\n const activeAnchorId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorAnchorId(s.thread);\n });\n const activeTargetId = useAuiState((s) => {\n if (!enabled) return undefined;\n return getActiveTopAnchorTargetId(s.thread);\n });\n const activeTurn = useMemo(() => {\n if (!activeAnchorId || !activeTargetId) return null;\n return { anchorId: activeAnchorId, targetId: activeTargetId };\n }, [activeAnchorId, activeTargetId]);\n\n useLayoutEffect(() => {\n if (!activeTurn) return;\n\n const state = threadViewportStore.getState();\n const current = state.topAnchorTurn;\n if (\n current?.anchorId === activeTurn.anchorId &&\n current.targetId === activeTurn.targetId\n ) {\n return;\n }\n\n state.setTopAnchorTurn(activeTurn);\n }, [activeTurn, threadViewportStore]);\n\n const clearTopAnchorTurn = useCallback(() => {\n threadViewportStore.getState().setTopAnchorTurn(null);\n }, [threadViewportStore]);\n\n useAuiEvent(\"thread.initialize\", clearTopAnchorTurn);\n useAuiEvent(\"threadListItem.switchedTo\", clearTopAnchorTurn);\n};\n\nconst ThreadPrimitiveViewportScrollable = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(\n (\n {\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n children,\n ...rest\n },\n forwardedRef,\n ) => {\n const autoScrollRef = useThreadViewportAutoScroll<HTMLDivElement>({\n autoScroll,\n scrollToBottomOnRunStart,\n scrollToBottomOnInitialize,\n scrollToBottomOnThreadSwitch,\n });\n const viewportSizeRef = useViewportSizeRef();\n const viewportElementRef = useViewportElementRef();\n const threadViewportStore = useThreadViewportStore();\n const turnAnchor = threadViewportStore.getState().turnAnchor;\n const topAnchorEnabled = turnAnchor === \"top\";\n useTopAnchorTurn(topAnchorEnabled);\n useTopAnchorReserve(topAnchorEnabled);\n const ref = useComposedRefs(\n forwardedRef,\n autoScrollRef,\n viewportSizeRef,\n viewportElementRef,\n );\n\n return (\n <Primitive.div {...rest} ref={ref}>\n {children}\n </Primitive.div>\n );\n },\n);\n\nThreadPrimitiveViewportScrollable.displayName =\n \"ThreadPrimitive.ViewportScrollable\";\n\n/**\n * A scrollable viewport container for thread messages.\n *\n * This component provides a scrollable area for displaying thread messages with\n * automatic scrolling capabilities. It manages the viewport state and provides\n * context for child components to access viewport-related functionality.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Viewport turnAnchor=\"top\">\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * </ThreadPrimitive.Viewport>\n * ```\n */\nexport const ThreadPrimitiveViewport = forwardRef<\n ThreadPrimitiveViewport.Element,\n ThreadPrimitiveViewport.Props\n>(({ turnAnchor, topAnchorMessageClamp, ...props }, ref) => {\n return (\n <ThreadPrimitiveViewportProvider\n options={{ turnAnchor, topAnchorMessageClamp }}\n >\n <ThreadPrimitiveViewportScrollable {...props} ref={ref} />\n </ThreadPrimitiveViewportProvider>\n );\n});\n\nThreadPrimitiveViewport.displayName = \"ThreadPrimitive.Viewport\";\n"],"mappings":";;;;;;;;;;;;;;;AAwFA,MAAMiC,2BAAqB;CAE+C,OACjElB,cAFUC,kBAAkBmB,KAEdD,GAAUE,MAAS;AAAC;AAG3C,MAAME,8BAAwB;CAG1B,OAEK1B,cAJyBI,kBAC9BwB,MAGmBD,CAAuB;AAAC;AAG/C,MAAME,oBAAmBC,YAAA;CAAA,MAAAC,IAAA1C,EAAA,EAAA;CACvB,MAAA2C,sBAA4B3B,uBAAuB;CAAE,IAAA4B;CAAA,IAAAF,EAAA,OAAAD,SAAA;EAClBG,MAAAC,MAAA;GACjC,IAAI,CAACJ,SAAO;GAAmB,OACxBvB,2BAA2B2B,EAACC,MAAO;EAAC;EAC5CJ,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAHD,MAAAK,iBAAuBrC,YAAYkC,EAGlC;CAAE,IAAAI;CAAA,IAAAN,EAAA,OAAAD,SAAA;EACgCO,MAAAC,QAAA;GACjC,IAAI,CAACR,SAAO;GAAmB,OACxBtB,2BAA2B0B,IAACC,MAAO;EAAC;EAC5CJ,EAAA,KAAAD;EAAAC,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAHD,MAAAQ,iBAAuBxC,YAAYsC,EAGlC;CAAE,IAAAG;CAAAC,KAAA;EAED,IAAI,CAACL,kBAAD,CAAoBG,gBAAc;GAAEC,KAAO;GAAP,MAAAC;EAAY;EAAA,IAAAC;EAAA,IAAAX,EAAA,OAAAK,kBAAAL,EAAA,OAAAQ,gBAAA;GAC7CG,KAAA;IAAAC,UAAYP;IAAcQ,UAAYL;GAAe;GAACR,EAAA,KAAAK;GAAAL,EAAA,KAAAQ;GAAAR,EAAA,KAAAW;EAAA,OAAAA,KAAAX,EAAA;EAA7DS,KAAOE;CAAuD;CAFhE,MAAAG,aAAmBL;CAGkB,IAAAE;CAAA,IAAAI;CAAA,IAAAf,EAAA,OAAAc,cAAAd,EAAA,OAAAC,qBAAA;EAErBU,WAAA;GACd,IAAI,CAACG,YAAU;GAEf,MAAAE,QAAcf,oBAAmBgB,SAAU;GAC3C,MAAAC,UAAgBF,MAAKG;GACrB,IACED,SAAON,aAAeE,WAAUF,YAChCM,QAAOL,aAAcC,WAAUD,UAAS;GAK1CG,MAAKI,iBAAkBN,UAAU;EAAC;EACjCC,KAAA,CAACD,YAAYb,mBAAmB;EAACD,EAAA,KAAAc;EAAAd,EAAA,KAAAC;EAAAD,EAAA,KAAAW;EAAAX,EAAA,MAAAe;CAAA,OAAA;EAAAJ,KAAAX,EAAA;EAAAe,KAAAf,EAAA;CAAA;CAbpCnC,gBAAgB8C,IAabI,EAAiC;CAAC,IAAAM;CAAA,IAAArB,EAAA,QAAAC,qBAAA;EAEEoB,WAAA;GACrCpB,oBAAmBgB,SAAU,CAAC,CAAAG,iBAAkB,IAAI;EAAC;EACtDpB,EAAA,MAAAC;EAAAD,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAFD,MAAAsB,qBAA2BD;CAI3BtD,YAAY,qBAAqBuD,kBAAkB;CACnDvD,YAAY,6BAA6BuD,kBAAkB;AAAC;AAG9D,MAAMC,oCAAoC7D,YAIxCwC,IAAAsB,iBAAA;CAAA,MAAAxB,IAAA1C,EAAA,EAAA;CAAA,IAAAwB;CAAA,IAAA2C;CAAA,IAAAC;CAAA,IAAAtC;CAAA,IAAAD;CAAA,IAAAE;CAAA,IAAAW,EAAA,OAAAE,IAAA;EACE,CAAA,CAAApB,YAAAK,0BAAAC,4BAAAC,8BAAAoC,aAAAC,QAAAxB;EAOCF,EAAA,KAAAE;EAAAF,EAAA,KAAAlB;EAAAkB,EAAA,KAAAyB;EAAAzB,EAAA,KAAA0B;EAAA1B,EAAA,KAAAZ;EAAAY,EAAA,KAAAb;EAAAa,EAAA,KAAAX;CAAA,OAAA;EAAAP,aAAAkB,EAAA;EAAAyB,WAAAzB,EAAA;EAAA0B,OAAA1B,EAAA;EAAAZ,6BAAAY,EAAA;EAAAb,2BAAAa,EAAA;EAAAX,+BAAAW,EAAA;CAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAlB,cAAAkB,EAAA,OAAAZ,8BAAAY,EAAA,OAAAb,4BAAAa,EAAA,QAAAX,8BAAA;EAGiEiB,KAAA;GAAAxB;GAAAK;GAAAC;GAAAC;EAKlE;EAACW,EAAA,KAAAlB;EAAAkB,EAAA,KAAAZ;EAAAY,EAAA,KAAAb;EAAAa,EAAA,MAAAX;EAAAW,EAAA,MAAAM;CAAA,OAAAA,KAAAN,EAAA;CALD,MAAA2B,gBAAsBzD,4BAA4CoC,EAKjE;CACD,MAAAsB,kBAAwBtC,mBAAmB;CAC3C,MAAAuC,qBAA2BlC,sBAAsB;CACjD,MAAAM,sBAA4B3B,uBAAuB;CAAE,IAAAmC;CAAA,IAAAT,EAAA,QAAAC,qBAAA;EAClCQ,KAAAR,oBAAmBgB,SAAU;EAACjB,EAAA,MAAAC;EAAAD,EAAA,MAAAS;CAAA,OAAAA,KAAAT,EAAA;CACjD,MAAA8B,mBADmBrB,GAA8B1B,eACT;CACxCe,iBAAiBgC,gBAAgB;CACjCvD,oBAAoBuD,gBAAgB;CACpC,MAAAC,MAAYxE,gBACViE,cACAG,eACAC,iBACAC,kBACF;CAAE,IAAAlB;CAAA,IAAAX,EAAA,QAAAyB,YAAAzB,EAAA,QAAA+B,OAAA/B,EAAA,QAAA0B,MAAA;EAGAf,KAAA,oBAAA,UAAA,KAAA;GAAA,GAAmBe;GAAWK;GAC3BN;EACH,CAAA;EAAgBzB,EAAA,MAAAyB;EAAAzB,EAAA,MAAA+B;EAAA/B,EAAA,MAAA0B;EAAA1B,EAAA,MAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OAFhBW;AAEgB,CAGtB;AAEAY,kCAAkCS,cAChC;;;;;;;;;;;;;;;;;AAkBF,MAAatD,0BAA0BhB,YAGrCwC,IAAA6B,QAAA;CAAA,MAAA/B,IAAA1C,EAAA,EAAA;CAAA,IAAA2E;CAAA,IAAAjD;CAAA,IAAAD;CAAA,IAAAiB,EAAA,OAAAE,IAAA;EAAC,CAAA,CAAAnB,YAAAC,0BAAAiD,SAAA/B;EAA+CF,EAAA,KAAAE;EAAAF,EAAA,KAAAiC;EAAAjC,EAAA,KAAAhB;EAAAgB,EAAA,KAAAjB;CAAA,OAAA;EAAAkD,QAAAjC,EAAA;EAAAhB,wBAAAgB,EAAA;EAAAjB,aAAAiB,EAAA;CAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAhB,yBAAAgB,EAAA,OAAAjB,YAAA;EAGnCuB,KAAA;GAAAvB;GAAAC;EAAoC;EAACgB,EAAA,KAAAhB;EAAAgB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAiC,SAAAjC,EAAA,OAAA+B,KAAA;EAE9CtB,KAAA,oBAAC,mCAAD;GAAkC,GAAKwB;GAAYF;EAAG,CAAA;EAAI/B,EAAA,KAAAiC;EAAAjC,EAAA,KAAA+B;EAAA/B,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,QAAAM,MAAAN,EAAA,QAAAS,IAAA;EAH5DE,KAAA,oBAAC,iCAAD;GACW,SAAAL;aAETG;EAH8B,CAAA;EAIET,EAAA,MAAAM;EAAAN,EAAA,MAAAS;EAAAT,EAAA,MAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OAJlCW;AAIkC,CAErC;AAEDjC,wBAAwBsD,cAAc;AA/HX,SAAAxC,MAAAW,GAAA;CAAA,OACiBA,EAAC+B;AAAiB;AADnC,SAAAxC,OAAAyC,IAAA;CAAA,OAE0BA,GAAEC;AAAa;AAItC,SAAAvC,OAAAM,GAAA;CAAA,OAEnBA,EAACP;AAAwB"}
@@ -2,7 +2,8 @@
2
2
  import { useThreadViewport } from "../../context/react/ThreadViewportContext.js";
3
3
  import { Primitive } from "../../utils/Primitive.js";
4
4
  import { useSizeHandle } from "../../utils/hooks/useSizeHandle.js";
5
- import { forwardRef, useCallback } from "@assistant-ui/tap/react-shim";
5
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
6
+ import { forwardRef } from "@assistant-ui/tap/react-shim";
6
7
  import { jsx } from "react/jsx-runtime";
7
8
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
8
9
  //#region src/primitives/thread/ThreadViewportFooter.tsx
@@ -31,16 +32,28 @@ import { useComposedRefs } from "@radix-ui/react-compose-refs";
31
32
  * ```
32
33
  */
33
34
  const ThreadPrimitiveViewportFooter = forwardRef((props, forwardedRef) => {
34
- const ref = useComposedRefs(forwardedRef, useSizeHandle(useThreadViewport((s) => s.registerContentInset), useCallback((el) => {
35
- const marginTop = parseFloat(getComputedStyle(el).marginTop) || 0;
36
- return el.offsetHeight + marginTop;
37
- }, [])));
38
- return /* @__PURE__ */ jsx(Primitive.div, {
39
- ...props,
40
- ref
41
- });
35
+ const $ = c(3);
36
+ const ref = useComposedRefs(forwardedRef, useSizeHandle(useThreadViewport(_temp), _temp2));
37
+ let t0;
38
+ if ($[0] !== props || $[1] !== ref) {
39
+ t0 = /* @__PURE__ */ jsx(Primitive.div, {
40
+ ...props,
41
+ ref
42
+ });
43
+ $[0] = props;
44
+ $[1] = ref;
45
+ $[2] = t0;
46
+ } else t0 = $[2];
47
+ return t0;
42
48
  });
43
49
  ThreadPrimitiveViewportFooter.displayName = "ThreadPrimitive.ViewportFooter";
50
+ function _temp(s) {
51
+ return s.registerContentInset;
52
+ }
53
+ function _temp2(el) {
54
+ const marginTop = parseFloat(getComputedStyle(el).marginTop) || 0;
55
+ return el.offsetHeight + marginTop;
56
+ }
44
57
  //#endregion
45
58
  export { ThreadPrimitiveViewportFooter };
46
59
 
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadViewportFooter.js","names":[],"sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n useCallback,\n} from \"react\";\nimport { useSizeHandle } from \"../../utils/hooks/useSizeHandle\";\nimport { useThreadViewport } from \"../../context/react/ThreadViewportContext\";\n\nexport namespace ThreadPrimitiveViewportFooter {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * A footer container that measures its height for scroll calculations.\n *\n * This component measures its height and provides it to the viewport context\n * so the auto-scroll system can account for any sticky footer overlapping the\n * message list.\n *\n * Multiple ViewportFooter components can be used - their heights are summed.\n *\n * Typically used with `className=\"sticky bottom-0\"` to keep the footer\n * visible at the bottom of the viewport while scrolling.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Viewport>\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * <ThreadPrimitive.ViewportFooter className=\"sticky bottom-0\">\n * <Composer />\n * </ThreadPrimitive.ViewportFooter>\n * </ThreadPrimitive.Viewport>\n * ```\n */\nexport const ThreadPrimitiveViewportFooter = forwardRef<\n ThreadPrimitiveViewportFooter.Element,\n ThreadPrimitiveViewportFooter.Props\n>((props, forwardedRef) => {\n const register = useThreadViewport((s) => s.registerContentInset);\n const getHeight = useCallback((el: HTMLElement) => {\n const marginTop = parseFloat(getComputedStyle(el).marginTop) || 0;\n return el.offsetHeight + marginTop;\n }, []);\n\n const resizeRef = useSizeHandle(register, getHeight);\n\n const ref = useComposedRefs(forwardedRef, resizeRef);\n\n return <Primitive.div {...props} ref={ref} />;\n});\n\nThreadPrimitiveViewportFooter.displayName = \"ThreadPrimitive.ViewportFooter\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAa,gCAAgC,YAG1C,OAAO,iBAAiB;CASzB,MAAM,MAAM,gBAAgB,cAFV,cAND,mBAAmB,MAAM,EAAE,oBAML,GALrB,aAAa,OAAoB;EACjD,MAAM,YAAY,WAAW,iBAAiB,EAAE,CAAC,CAAC,SAAS,KAAK;EAChE,OAAO,GAAG,eAAe;CAC3B,GAAG,CAAC,CAE8C,CAEA,CAAC;CAEnD,OAAO,oBAAC,UAAU,KAAX;EAAe,GAAI;EAAY;CAAM,CAAA;AAC9C,CAAC;AAED,8BAA8B,cAAc"}
1
+ {"version":3,"file":"ThreadViewportFooter.js","names":["c","_c","useComposedRefs","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useCallback","useSizeHandle","useThreadViewport","ThreadPrimitiveViewportFooter","Element","div","Props","props","forwardedRef","$","register","_temp","getHeight","_temp2","resizeRef","ref","t0","displayName","s","registerContentInset","el","marginTop","parseFloat","getComputedStyle","offsetHeight"],"sources":["../../../src/primitives/thread/ThreadViewportFooter.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n useCallback,\n} from \"react\";\nimport { useSizeHandle } from \"../../utils/hooks/useSizeHandle\";\nimport { useThreadViewport } from \"../../context/react/ThreadViewportContext\";\n\nexport namespace ThreadPrimitiveViewportFooter {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\n/**\n * A footer container that measures its height for scroll calculations.\n *\n * This component measures its height and provides it to the viewport context\n * so the auto-scroll system can account for any sticky footer overlapping the\n * message list.\n *\n * Multiple ViewportFooter components can be used - their heights are summed.\n *\n * Typically used with `className=\"sticky bottom-0\"` to keep the footer\n * visible at the bottom of the viewport while scrolling.\n *\n * @example\n * ```tsx\n * <ThreadPrimitive.Viewport>\n * <ThreadPrimitive.Messages>\n * {() => <MyMessage />}\n * </ThreadPrimitive.Messages>\n * <ThreadPrimitive.ViewportFooter className=\"sticky bottom-0\">\n * <Composer />\n * </ThreadPrimitive.ViewportFooter>\n * </ThreadPrimitive.Viewport>\n * ```\n */\nexport const ThreadPrimitiveViewportFooter = forwardRef<\n ThreadPrimitiveViewportFooter.Element,\n ThreadPrimitiveViewportFooter.Props\n>((props, forwardedRef) => {\n const register = useThreadViewport((s) => s.registerContentInset);\n const getHeight = useCallback((el: HTMLElement) => {\n const marginTop = parseFloat(getComputedStyle(el).marginTop) || 0;\n return el.offsetHeight + marginTop;\n }, []);\n\n const resizeRef = useSizeHandle(register, getHeight);\n\n const ref = useComposedRefs(forwardedRef, resizeRef);\n\n return <Primitive.div {...props} ref={ref} />;\n});\n\nThreadPrimitiveViewportFooter.displayName = \"ThreadPrimitive.ViewportFooter\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAaU,gCAAgCL,YAG3CS,OAAAC,iBAAA;CAAA,MAAAC,IAAAf,EAAA,CAAA;CASA,MAAAqB,MAAYpB,gBAAgBa,cAFVP,cANDC,kBAAkBS,KAMHD,GAAUE,MAEAE,CAAS;CAAE,IAAAE;CAAA,IAAAP,EAAA,OAAAF,SAAAE,EAAA,OAAAM,KAAA;EAE9CC,KAAA,oBAAA,UAAA,KAAA;GAAA,GAAmBT;GAAYQ;EAAG,CAAA;EAAIN,EAAA,KAAAF;EAAAE,EAAA,KAAAM;EAAAN,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAAtCO;AAAsC,CAC9C;AAEDb,8BAA8Bc,cAAc;AAd1C,SAAAN,MAAAO,GAAA;CAAA,OAC0CA,EAACC;AAAqB;AADhE,SAAAN,OAAAO,IAAA;CAGE,MAAAC,YAAkBC,WAAWC,iBAAiBH,EAAE,CAAC,CAAAC,SAAe,KAA9C;CAAgD,OAC3DD,GAAEI,eAAgBH;AAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"computeTopAnchorSlack.js","names":[],"sources":["../../../../src/primitives/thread/topAnchor/computeTopAnchorSlack.ts"],"sourcesContent":["\"use client\";\n\nexport type ComputeTopAnchorTargetOptions = {\n viewport: HTMLElement;\n anchor: HTMLElement;\n tallerThan: number;\n visibleHeight: number;\n};\n\nexport type ComputeTopAnchorReserveOptions = ComputeTopAnchorTargetOptions & {\n reserve: HTMLElement;\n};\n\ntype ComputeTopAnchorSlackOptions = ComputeTopAnchorTargetOptions & {\n scrollHeight: number;\n};\n\nconst getDocumentOffsetTop = (element: HTMLElement): number => {\n let top = 0;\n let current: HTMLElement | null = element;\n\n while (current) {\n top += current.offsetTop;\n current = current.offsetParent as HTMLElement | null;\n }\n\n return top;\n};\n\nconst getLayoutOffsetTop = (\n element: HTMLElement,\n ancestor: HTMLElement,\n): number => {\n // Use layout geometry, not visual rects, so entrance transforms/animations\n // on the anchor do not shift the scroll target while they settle.\n let top = 0;\n let current: HTMLElement | null = element;\n\n while (current && current !== ancestor) {\n top += current.offsetTop;\n current = current.offsetParent as HTMLElement | null;\n }\n\n if (current === ancestor) return top;\n\n return getDocumentOffsetTop(element) - getDocumentOffsetTop(ancestor);\n};\n\n/**\n * Compute the scroll position that pins the anchor (last user message) to the\n * top of the viewport. For tall user messages the anchor is intentionally\n * over-scrolled so only `visibleHeight` of it remains visible, leaving room\n * for the assistant message below.\n *\n * Depends only on the anchor's offset within the scroll content; never reads\n * `viewport.scrollHeight` (which is volatile while the assistant message\n * streams in).\n */\nexport const computeTopAnchorTargetScrollTop = ({\n viewport,\n anchor,\n tallerThan,\n visibleHeight,\n}: ComputeTopAnchorTargetOptions): number => {\n const anchorTop = getLayoutOffsetTop(anchor, viewport);\n const anchorHeight = anchor.offsetHeight;\n const visibleAnchorHeight =\n anchorHeight <= tallerThan ? anchorHeight : visibleHeight;\n\n return anchorTop + Math.max(0, anchorHeight - visibleAnchorHeight);\n};\n\nconst computeTopAnchorSlack = ({\n scrollHeight,\n ...targetOptions\n}: ComputeTopAnchorSlackOptions): number => {\n const { viewport } = targetOptions;\n const targetScrollTop = computeTopAnchorTargetScrollTop(targetOptions);\n const targetScrollHeight = targetScrollTop + viewport.clientHeight;\n\n return Math.max(0, targetScrollHeight - scrollHeight);\n};\n\nexport const computeTopAnchorReserve = ({\n viewport,\n reserve,\n ...targetOptions\n}: ComputeTopAnchorReserveOptions): number => {\n return computeTopAnchorSlack({\n viewport,\n ...targetOptions,\n scrollHeight: viewport.scrollHeight - reserve.offsetHeight,\n });\n};\n"],"mappings":";;AAiBA,MAAM,wBAAwB,YAAiC;CAC7D,IAAI,MAAM;CACV,IAAI,UAA8B;CAElC,OAAO,SAAS;EACd,OAAO,QAAQ;EACf,UAAU,QAAQ;CACpB;CAEA,OAAO;AACT;AAEA,MAAM,sBACJ,SACA,aACW;CAGX,IAAI,MAAM;CACV,IAAI,UAA8B;CAElC,OAAO,WAAW,YAAY,UAAU;EACtC,OAAO,QAAQ;EACf,UAAU,QAAQ;CACpB;CAEA,IAAI,YAAY,UAAU,OAAO;CAEjC,OAAO,qBAAqB,OAAO,IAAI,qBAAqB,QAAQ;AACtE;;;;;;;;;;;AAYA,MAAa,mCAAmC,EAC9C,UACA,QACA,YACA,oBAC2C;CAC3C,MAAM,YAAY,mBAAmB,QAAQ,QAAQ;CACrD,MAAM,eAAe,OAAO;CAI5B,OAAO,YAAY,KAAK,IAAI,GAAG,gBAF7B,gBAAgB,aAAa,eAAe,cAEmB;AACnE;AAEA,MAAM,yBAAyB,EAC7B,cACA,GAAG,oBACuC;CAC1C,MAAM,EAAE,aAAa;CAErB,MAAM,qBADkB,gCAAgC,aACf,IAAI,SAAS;CAEtD,OAAO,KAAK,IAAI,GAAG,qBAAqB,YAAY;AACtD;AAEA,MAAa,2BAA2B,EACtC,UACA,SACA,GAAG,oBACyC;CAC5C,OAAO,sBAAsB;EAC3B;EACA,GAAG;EACH,cAAc,SAAS,eAAe,QAAQ;CAChD,CAAC;AACH"}
1
+ {"version":3,"file":"computeTopAnchorSlack.js","names":["ComputeTopAnchorTargetOptions","viewport","HTMLElement","anchor","tallerThan","visibleHeight","ComputeTopAnchorReserveOptions","reserve","ComputeTopAnchorSlackOptions","scrollHeight","getDocumentOffsetTop","element","top","current","offsetTop","offsetParent","getLayoutOffsetTop","ancestor","computeTopAnchorTargetScrollTop","anchorTop","anchorHeight","offsetHeight","visibleAnchorHeight","Math","max","computeTopAnchorSlack","targetOptions","targetScrollTop","targetScrollHeight","clientHeight","computeTopAnchorReserve"],"sources":["../../../../src/primitives/thread/topAnchor/computeTopAnchorSlack.ts"],"sourcesContent":["\"use client\";\n\nexport type ComputeTopAnchorTargetOptions = {\n viewport: HTMLElement;\n anchor: HTMLElement;\n tallerThan: number;\n visibleHeight: number;\n};\n\nexport type ComputeTopAnchorReserveOptions = ComputeTopAnchorTargetOptions & {\n reserve: HTMLElement;\n};\n\ntype ComputeTopAnchorSlackOptions = ComputeTopAnchorTargetOptions & {\n scrollHeight: number;\n};\n\nconst getDocumentOffsetTop = (element: HTMLElement): number => {\n let top = 0;\n let current: HTMLElement | null = element;\n\n while (current) {\n top += current.offsetTop;\n current = current.offsetParent as HTMLElement | null;\n }\n\n return top;\n};\n\nconst getLayoutOffsetTop = (\n element: HTMLElement,\n ancestor: HTMLElement,\n): number => {\n // Use layout geometry, not visual rects, so entrance transforms/animations\n // on the anchor do not shift the scroll target while they settle.\n let top = 0;\n let current: HTMLElement | null = element;\n\n while (current && current !== ancestor) {\n top += current.offsetTop;\n current = current.offsetParent as HTMLElement | null;\n }\n\n if (current === ancestor) return top;\n\n return getDocumentOffsetTop(element) - getDocumentOffsetTop(ancestor);\n};\n\n/**\n * Compute the scroll position that pins the anchor (last user message) to the\n * top of the viewport. For tall user messages the anchor is intentionally\n * over-scrolled so only `visibleHeight` of it remains visible, leaving room\n * for the assistant message below.\n *\n * Depends only on the anchor's offset within the scroll content; never reads\n * `viewport.scrollHeight` (which is volatile while the assistant message\n * streams in).\n */\nexport const computeTopAnchorTargetScrollTop = ({\n viewport,\n anchor,\n tallerThan,\n visibleHeight,\n}: ComputeTopAnchorTargetOptions): number => {\n const anchorTop = getLayoutOffsetTop(anchor, viewport);\n const anchorHeight = anchor.offsetHeight;\n const visibleAnchorHeight =\n anchorHeight <= tallerThan ? anchorHeight : visibleHeight;\n\n return anchorTop + Math.max(0, anchorHeight - visibleAnchorHeight);\n};\n\nconst computeTopAnchorSlack = ({\n scrollHeight,\n ...targetOptions\n}: ComputeTopAnchorSlackOptions): number => {\n const { viewport } = targetOptions;\n const targetScrollTop = computeTopAnchorTargetScrollTop(targetOptions);\n const targetScrollHeight = targetScrollTop + viewport.clientHeight;\n\n return Math.max(0, targetScrollHeight - scrollHeight);\n};\n\nexport const computeTopAnchorReserve = ({\n viewport,\n reserve,\n ...targetOptions\n}: ComputeTopAnchorReserveOptions): number => {\n return computeTopAnchorSlack({\n viewport,\n ...targetOptions,\n scrollHeight: viewport.scrollHeight - reserve.offsetHeight,\n });\n};\n"],"mappings":";;AAiBA,MAAMU,wBAAwBC,YAAiC;CAC7D,IAAIC,MAAM;CACV,IAAIC,UAA8BF;CAElC,OAAOE,SAAS;EACdD,OAAOC,QAAQC;EACfD,UAAUA,QAAQE;CACpB;CAEA,OAAOH;AACT;AAEA,MAAMI,sBACJL,SACAM,aACW;CAGX,IAAIL,MAAM;CACV,IAAIC,UAA8BF;CAElC,OAAOE,WAAWA,YAAYI,UAAU;EACtCL,OAAOC,QAAQC;EACfD,UAAUA,QAAQE;CACpB;CAEA,IAAIF,YAAYI,UAAU,OAAOL;CAEjC,OAAOF,qBAAqBC,OAAO,IAAID,qBAAqBO,QAAQ;AACtE;;;;;;;;;;;AAYA,MAAaC,mCAAmC,EAC9CjB,UACAE,QACAC,YACAC,oBAC2C;CAC3C,MAAMc,YAAYH,mBAAmBb,QAAQF,QAAQ;CACrD,MAAMmB,eAAejB,OAAOkB;CAI5B,OAAOF,YAAYI,KAAKC,IAAI,GAAGJ,gBAF7BA,gBAAgBhB,aAAagB,eAAef,cAEmB;AACnE;AAEA,MAAMoB,yBAAyB,EAC7BhB,cACA,GAAGiB,oBACuC;CAC1C,MAAM,EAAEzB,aAAayB;CAErB,MAAME,qBADkBV,gCAAgCQ,aAC7BC,IAAkB1B,SAAS4B;CAEtD,OAAON,KAAKC,IAAI,GAAGI,qBAAqBnB,YAAY;AACtD;AAEA,MAAaqB,2BAA2B,EACtC7B,UACAM,SACA,GAAGmB,oBACyC;CAC5C,OAAOD,sBAAsB;EAC3BxB;EACA,GAAGyB;EACHjB,cAAcR,SAASQ,eAAeF,QAAQc;CAChD,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"createReserveObservers.js","names":[],"sources":["../../../../src/primitives/thread/topAnchor/createReserveObservers.ts"],"sourcesContent":["\"use client\";\n\nexport const createReserveObservers = (onChange: () => void) => {\n const resizeObserver = new ResizeObserver(onChange);\n const mutationObserver = new MutationObserver(onChange);\n\n let observedViewport: HTMLElement | null = null;\n let observedAnchor: HTMLElement | null = null;\n let observedTarget: HTMLElement | null = null;\n\n const disconnect = () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n observedViewport = null;\n observedAnchor = null;\n observedTarget = null;\n };\n\n return {\n target: (\n viewport: HTMLElement,\n anchor: HTMLElement,\n target: HTMLElement,\n ) => {\n if (\n observedViewport === viewport &&\n observedAnchor === anchor &&\n observedTarget === target\n ) {\n return;\n }\n\n disconnect();\n\n resizeObserver.observe(viewport);\n resizeObserver.observe(anchor);\n resizeObserver.observe(target);\n mutationObserver.observe(target, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n observedViewport = viewport;\n observedAnchor = anchor;\n observedTarget = target;\n },\n disconnect,\n };\n};\n"],"mappings":";;AAEA,MAAa,0BAA0B,aAAyB;CAC9D,MAAM,iBAAiB,IAAI,eAAe,QAAQ;CAClD,MAAM,mBAAmB,IAAI,iBAAiB,QAAQ;CAEtD,IAAI,mBAAuC;CAC3C,IAAI,iBAAqC;CACzC,IAAI,iBAAqC;CAEzC,MAAM,mBAAmB;EACvB,eAAe,WAAW;EAC1B,iBAAiB,WAAW;EAC5B,mBAAmB;EACnB,iBAAiB;EACjB,iBAAiB;CACnB;CAEA,OAAO;EACL,SACE,UACA,QACA,WACG;GACH,IACE,qBAAqB,YACrB,mBAAmB,UACnB,mBAAmB,QAEnB;GAGF,WAAW;GAEX,eAAe,QAAQ,QAAQ;GAC/B,eAAe,QAAQ,MAAM;GAC7B,eAAe,QAAQ,MAAM;GAC7B,iBAAiB,QAAQ,QAAQ;IAC/B,WAAW;IACX,SAAS;IACT,eAAe;GACjB,CAAC;GAED,mBAAmB;GACnB,iBAAiB;GACjB,iBAAiB;EACnB;EACA;CACF;AACF"}
1
+ {"version":3,"file":"createReserveObservers.js","names":["createReserveObservers","onChange","resizeObserver","ResizeObserver","mutationObserver","MutationObserver","observedViewport","HTMLElement","observedAnchor","observedTarget","disconnect","target","viewport","anchor","observe","childList","subtree","characterData"],"sources":["../../../../src/primitives/thread/topAnchor/createReserveObservers.ts"],"sourcesContent":["\"use client\";\n\nexport const createReserveObservers = (onChange: () => void) => {\n const resizeObserver = new ResizeObserver(onChange);\n const mutationObserver = new MutationObserver(onChange);\n\n let observedViewport: HTMLElement | null = null;\n let observedAnchor: HTMLElement | null = null;\n let observedTarget: HTMLElement | null = null;\n\n const disconnect = () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n observedViewport = null;\n observedAnchor = null;\n observedTarget = null;\n };\n\n return {\n target: (\n viewport: HTMLElement,\n anchor: HTMLElement,\n target: HTMLElement,\n ) => {\n if (\n observedViewport === viewport &&\n observedAnchor === anchor &&\n observedTarget === target\n ) {\n return;\n }\n\n disconnect();\n\n resizeObserver.observe(viewport);\n resizeObserver.observe(anchor);\n resizeObserver.observe(target);\n mutationObserver.observe(target, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n observedViewport = viewport;\n observedAnchor = anchor;\n observedTarget = target;\n },\n disconnect,\n };\n};\n"],"mappings":";;AAEA,MAAaA,0BAA0BC,aAAyB;CAC9D,MAAMC,iBAAiB,IAAIC,eAAeF,QAAQ;CAClD,MAAMG,mBAAmB,IAAIC,iBAAiBJ,QAAQ;CAEtD,IAAIK,mBAAuC;CAC3C,IAAIE,iBAAqC;CACzC,IAAIC,iBAAqC;CAEzC,MAAMC,mBAAmB;EACvBR,eAAeQ,WAAW;EAC1BN,iBAAiBM,WAAW;EAC5BJ,mBAAmB;EACnBE,iBAAiB;EACjBC,iBAAiB;CACnB;CAEA,OAAO;EACLE,SACEC,UACAC,QACAF,WACG;GACH,IACEL,qBAAqBM,YACrBJ,mBAAmBK,UACnBJ,mBAAmBE,QAEnB;GAGFD,WAAW;GAEXR,eAAeY,QAAQF,QAAQ;GAC/BV,eAAeY,QAAQD,MAAM;GAC7BX,eAAeY,QAAQH,MAAM;GAC7BP,iBAAiBU,QAAQH,QAAQ;IAC/BI,WAAW;IACXC,SAAS;IACTC,eAAe;GACjB,CAAC;GAEDX,mBAAmBM;GACnBJ,iBAAiBK;GACjBJ,iBAAiBE;EACnB;EACAD;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"mountTopAnchorReserve.js","names":[],"sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"sourcesContent":["\"use client\";\n\nimport {\n computeTopAnchorReserve,\n computeTopAnchorTargetScrollTop,\n} from \"./computeTopAnchorSlack\";\nimport { createReserveObservers } from \"./createReserveObservers\";\nimport {\n createReserveElement,\n getAnchorId,\n setReserveHeight,\n snapScrollTop,\n} from \"./topAnchorUtils\";\n\n/**\n * Minimal slice of `ThreadViewportStore` that the top-anchor reserve needs.\n * Decoupling from the full store keeps `mountTopAnchorReserve` testable in\n * isolation and re-usable from any consumer that can adapt to this shape.\n */\nexport type TopAnchorStore = {\n getState(): {\n turnAnchor: \"top\" | \"bottom\";\n element: {\n viewport: HTMLElement | null;\n anchor: HTMLElement | null;\n target: HTMLElement | null;\n };\n targetConfig: {\n tallerThan: number;\n visibleHeight: number;\n } | null;\n };\n subscribe(fn: () => void): () => void;\n};\n\nconst createFrameScheduler = (fn: () => void) => {\n let frame: number | null = null;\n\n return {\n schedule: () => {\n if (frame !== null) return;\n frame = requestAnimationFrame(() => {\n frame = null;\n fn();\n });\n },\n cancel: () => {\n if (frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n }\n },\n };\n};\n\nexport const mountTopAnchorReserve = (store: TopAnchorStore) => {\n let reserve: HTMLElement | null = null;\n let lastScrolledAnchorId: string | undefined;\n\n function apply() {\n const state = store.getState();\n const { viewport, anchor, target } = state.element;\n const clamp = state.targetConfig;\n\n if (\n state.turnAnchor !== \"top\" ||\n !viewport ||\n !anchor ||\n !target ||\n !clamp\n ) {\n observers.disconnect();\n if (reserve) {\n setReserveHeight(reserve, 0);\n reserve.remove();\n }\n return;\n }\n\n reserve ??= createReserveElement();\n\n if (\n reserve.parentElement !== target.parentElement ||\n reserve.previousElementSibling !== target\n ) {\n target.after(reserve);\n }\n\n observers.target(viewport, anchor, target);\n\n const reserveChanged = setReserveHeight(\n reserve,\n computeTopAnchorReserve({ viewport, anchor, reserve, ...clamp }),\n );\n\n if (reserveChanged) {\n scheduler.schedule();\n return;\n }\n\n const anchorId = getAnchorId(anchor);\n if (anchorId !== undefined && lastScrolledAnchorId === anchorId) return;\n\n const targetScrollTop = snapScrollTop(\n computeTopAnchorTargetScrollTop({ viewport, anchor, ...clamp }),\n );\n\n if (Math.abs(viewport.scrollTop - targetScrollTop) > 1) {\n viewport.scrollTo({ top: targetScrollTop, behavior: \"smooth\" });\n }\n\n if (anchorId !== undefined) lastScrolledAnchorId = anchorId;\n }\n\n const scheduler = createFrameScheduler(apply);\n const observers = createReserveObservers(scheduler.schedule);\n\n scheduler.schedule();\n const unsubscribe = store.subscribe(scheduler.schedule);\n\n return () => {\n scheduler.cancel();\n unsubscribe();\n observers.disconnect();\n reserve?.remove();\n };\n};\n"],"mappings":";;;;;AAmCA,MAAM,wBAAwB,OAAmB;CAC/C,IAAI,QAAuB;CAE3B,OAAO;EACL,gBAAgB;GACd,IAAI,UAAU,MAAM;GACpB,QAAQ,4BAA4B;IAClC,QAAQ;IACR,GAAG;GACL,CAAC;EACH;EACA,cAAc;GACZ,IAAI,UAAU,MAAM;IAClB,qBAAqB,KAAK;IAC1B,QAAQ;GACV;EACF;CACF;AACF;AAEA,MAAa,yBAAyB,UAA0B;CAC9D,IAAI,UAA8B;CAClC,IAAI;CAEJ,SAAS,QAAQ;EACf,MAAM,QAAQ,MAAM,SAAS;EAC7B,MAAM,EAAE,UAAU,QAAQ,WAAW,MAAM;EAC3C,MAAM,QAAQ,MAAM;EAEpB,IACE,MAAM,eAAe,SACrB,CAAC,YACD,CAAC,UACD,CAAC,UACD,CAAC,OACD;GACA,UAAU,WAAW;GACrB,IAAI,SAAS;IACX,iBAAiB,SAAS,CAAC;IAC3B,QAAQ,OAAO;GACjB;GACA;EACF;EAEA,YAAY,qBAAqB;EAEjC,IACE,QAAQ,kBAAkB,OAAO,iBACjC,QAAQ,2BAA2B,QAEnC,OAAO,MAAM,OAAO;EAGtB,UAAU,OAAO,UAAU,QAAQ,MAAM;EAOzC,IALuB,iBACrB,SACA,wBAAwB;GAAE;GAAU;GAAQ;GAAS,GAAG;EAAM,CAAC,CAGhD,GAAG;GAClB,UAAU,SAAS;GACnB;EACF;EAEA,MAAM,WAAW,YAAY,MAAM;EACnC,IAAI,aAAa,KAAA,KAAa,yBAAyB,UAAU;EAEjE,MAAM,kBAAkB,cACtB,gCAAgC;GAAE;GAAU;GAAQ,GAAG;EAAM,CAAC,CAChE;EAEA,IAAI,KAAK,IAAI,SAAS,YAAY,eAAe,IAAI,GACnD,SAAS,SAAS;GAAE,KAAK;GAAiB,UAAU;EAAS,CAAC;EAGhE,IAAI,aAAa,KAAA,GAAW,uBAAuB;CACrD;CAEA,MAAM,YAAY,qBAAqB,KAAK;CAC5C,MAAM,YAAY,uBAAuB,UAAU,QAAQ;CAE3D,UAAU,SAAS;CACnB,MAAM,cAAc,MAAM,UAAU,UAAU,QAAQ;CAEtD,aAAa;EACX,UAAU,OAAO;EACjB,YAAY;EACZ,UAAU,WAAW;EACrB,SAAS,OAAO;CAClB;AACF"}
1
+ {"version":3,"file":"mountTopAnchorReserve.js","names":["computeTopAnchorReserve","computeTopAnchorTargetScrollTop","createReserveObservers","createReserveElement","getAnchorId","setReserveHeight","snapScrollTop","TopAnchorStore","getState","turnAnchor","element","viewport","HTMLElement","anchor","target","targetConfig","tallerThan","visibleHeight","subscribe","fn","createFrameScheduler","frame","schedule","requestAnimationFrame","cancel","cancelAnimationFrame","mountTopAnchorReserve","store","reserve","lastScrolledAnchorId","apply","state","clamp","observers","disconnect","remove","parentElement","previousElementSibling","after","reserveChanged","scheduler","anchorId","undefined","targetScrollTop","Math","abs","scrollTop","scrollTo","top","behavior","unsubscribe"],"sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"sourcesContent":["\"use client\";\n\nimport {\n computeTopAnchorReserve,\n computeTopAnchorTargetScrollTop,\n} from \"./computeTopAnchorSlack\";\nimport { createReserveObservers } from \"./createReserveObservers\";\nimport {\n createReserveElement,\n getAnchorId,\n setReserveHeight,\n snapScrollTop,\n} from \"./topAnchorUtils\";\n\n/**\n * Minimal slice of `ThreadViewportStore` that the top-anchor reserve needs.\n * Decoupling from the full store keeps `mountTopAnchorReserve` testable in\n * isolation and re-usable from any consumer that can adapt to this shape.\n */\nexport type TopAnchorStore = {\n getState(): {\n turnAnchor: \"top\" | \"bottom\";\n element: {\n viewport: HTMLElement | null;\n anchor: HTMLElement | null;\n target: HTMLElement | null;\n };\n targetConfig: {\n tallerThan: number;\n visibleHeight: number;\n } | null;\n };\n subscribe(fn: () => void): () => void;\n};\n\nconst createFrameScheduler = (fn: () => void) => {\n let frame: number | null = null;\n\n return {\n schedule: () => {\n if (frame !== null) return;\n frame = requestAnimationFrame(() => {\n frame = null;\n fn();\n });\n },\n cancel: () => {\n if (frame !== null) {\n cancelAnimationFrame(frame);\n frame = null;\n }\n },\n };\n};\n\nexport const mountTopAnchorReserve = (store: TopAnchorStore) => {\n let reserve: HTMLElement | null = null;\n let lastScrolledAnchorId: string | undefined;\n\n function apply() {\n const state = store.getState();\n const { viewport, anchor, target } = state.element;\n const clamp = state.targetConfig;\n\n if (\n state.turnAnchor !== \"top\" ||\n !viewport ||\n !anchor ||\n !target ||\n !clamp\n ) {\n observers.disconnect();\n if (reserve) {\n setReserveHeight(reserve, 0);\n reserve.remove();\n }\n return;\n }\n\n reserve ??= createReserveElement();\n\n if (\n reserve.parentElement !== target.parentElement ||\n reserve.previousElementSibling !== target\n ) {\n target.after(reserve);\n }\n\n observers.target(viewport, anchor, target);\n\n const reserveChanged = setReserveHeight(\n reserve,\n computeTopAnchorReserve({ viewport, anchor, reserve, ...clamp }),\n );\n\n if (reserveChanged) {\n scheduler.schedule();\n return;\n }\n\n const anchorId = getAnchorId(anchor);\n if (anchorId !== undefined && lastScrolledAnchorId === anchorId) return;\n\n const targetScrollTop = snapScrollTop(\n computeTopAnchorTargetScrollTop({ viewport, anchor, ...clamp }),\n );\n\n if (Math.abs(viewport.scrollTop - targetScrollTop) > 1) {\n viewport.scrollTo({ top: targetScrollTop, behavior: \"smooth\" });\n }\n\n if (anchorId !== undefined) lastScrolledAnchorId = anchorId;\n }\n\n const scheduler = createFrameScheduler(apply);\n const observers = createReserveObservers(scheduler.schedule);\n\n scheduler.schedule();\n const unsubscribe = store.subscribe(scheduler.schedule);\n\n return () => {\n scheduler.cancel();\n unsubscribe();\n observers.disconnect();\n reserve?.remove();\n };\n};\n"],"mappings":";;;;;AAmCA,MAAMoB,wBAAwBD,OAAmB;CAC/C,IAAIE,QAAuB;CAE3B,OAAO;EACLC,gBAAgB;GACd,IAAID,UAAU,MAAM;GACpBA,QAAQE,4BAA4B;IAClCF,QAAQ;IACRF,GAAG;GACL,CAAC;EACH;EACAK,cAAc;GACZ,IAAIH,UAAU,MAAM;IAClBI,qBAAqBJ,KAAK;IAC1BA,QAAQ;GACV;EACF;CACF;AACF;AAEA,MAAaK,yBAAyBC,UAA0B;CAC9D,IAAIC,UAA8B;CAClC,IAAIC;CAEJ,SAASC,QAAQ;EACf,MAAMC,QAAQJ,MAAMnB,SAAS;EAC7B,MAAM,EAAEG,UAAUE,QAAQC,WAAWiB,MAAMrB;EAC3C,MAAMsB,QAAQD,MAAMhB;EAEpB,IACEgB,MAAMtB,eAAe,SACrB,CAACE,YACD,CAACE,UACD,CAACC,UACD,CAACkB,OACD;GACAC,UAAUC,WAAW;GACrB,IAAIN,SAAS;IACXvB,iBAAiBuB,SAAS,CAAC;IAC3BA,QAAQO,OAAO;GACjB;GACA;EACF;EAEAP,YAAYzB,qBAAqB;EAEjC,IACEyB,QAAQQ,kBAAkBtB,OAAOsB,iBACjCR,QAAQS,2BAA2BvB,QAEnCA,OAAOwB,MAAMV,OAAO;EAGtBK,UAAUnB,OAAOH,UAAUE,QAAQC,MAAM;EAOzC,IALuBT,iBACrBuB,SACA5B,wBAAwB;GAAEW;GAAUE;GAAQe;GAAS,GAAGI;EAAM,CAAC,CAG7DO,GAAgB;GAClBC,UAAUlB,SAAS;GACnB;EACF;EAEA,MAAMmB,WAAWrC,YAAYS,MAAM;EACnC,IAAI4B,aAAaC,KAAAA,KAAab,yBAAyBY,UAAU;EAEjE,MAAME,kBAAkBrC,cACtBL,gCAAgC;GAAEU;GAAUE;GAAQ,GAAGmB;EAAM,CAAC,CAChE;EAEA,IAAIY,KAAKC,IAAIlC,SAASmC,YAAYH,eAAe,IAAI,GACnDhC,SAASoC,SAAS;GAAEC,KAAKL;GAAiBM,UAAU;EAAS,CAAC;EAGhE,IAAIR,aAAaC,KAAAA,GAAWb,uBAAuBY;CACrD;CAEA,MAAMD,YAAYpB,qBAAqBU,KAAK;CAC5C,MAAMG,YAAY/B,uBAAuBsC,UAAUlB,QAAQ;CAE3DkB,UAAUlB,SAAS;CACnB,MAAM4B,cAAcvB,MAAMT,UAAUsB,UAAUlB,QAAQ;CAEtD,aAAa;EACXkB,UAAUhB,OAAO;EACjB0B,YAAY;EACZjB,UAAUC,WAAW;EACrBN,SAASO,OAAO;CAClB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"topAnchorTurn.js","names":[],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"sourcesContent":["\"use client\";\n\ntype TopAnchorTurnMessage = {\n readonly id: string;\n readonly role: string;\n};\n\nexport const getActiveTopAnchorTurn = ({\n isRunning,\n messages,\n}: {\n readonly isRunning: boolean;\n readonly messages: readonly TopAnchorTurnMessage[];\n}) => {\n if (!isRunning) return null;\n\n const target = messages.at(-1);\n const anchor = messages.at(-2);\n if (anchor?.role !== \"user\" || target?.role !== \"assistant\") return null;\n\n return { anchorId: anchor.id, targetId: target.id };\n};\n\nexport const getActiveTopAnchorAnchorId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.anchorId;\n\nexport const getActiveTopAnchorTargetId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.targetId;\n"],"mappings":";;AAOA,MAAa,0BAA0B,EACrC,WACA,eAII;CACJ,IAAI,CAAC,WAAW,OAAO;CAEvB,MAAM,SAAS,SAAS,GAAG,EAAE;CAC7B,MAAM,SAAS,SAAS,GAAG,EAAE;CAC7B,IAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,aAAa,OAAO;CAEpE,OAAO;EAAE,UAAU,OAAO;EAAI,UAAU,OAAO;CAAG;AACpD;AAEA,MAAa,8BACX,YACG,uBAAuB,OAAO,CAAC,EAAE;AAEtC,MAAa,8BACX,YACG,uBAAuB,OAAO,CAAC,EAAE"}
1
+ {"version":3,"file":"topAnchorTurn.js","names":["TopAnchorTurnMessage","id","role","getActiveTopAnchorTurn","isRunning","messages","target","at","anchor","anchorId","targetId","getActiveTopAnchorAnchorId","options","Parameters","getActiveTopAnchorTargetId"],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"sourcesContent":["\"use client\";\n\ntype TopAnchorTurnMessage = {\n readonly id: string;\n readonly role: string;\n};\n\nexport const getActiveTopAnchorTurn = ({\n isRunning,\n messages,\n}: {\n readonly isRunning: boolean;\n readonly messages: readonly TopAnchorTurnMessage[];\n}) => {\n if (!isRunning) return null;\n\n const target = messages.at(-1);\n const anchor = messages.at(-2);\n if (anchor?.role !== \"user\" || target?.role !== \"assistant\") return null;\n\n return { anchorId: anchor.id, targetId: target.id };\n};\n\nexport const getActiveTopAnchorAnchorId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.anchorId;\n\nexport const getActiveTopAnchorTargetId = (\n options: Parameters<typeof getActiveTopAnchorTurn>[0],\n) => getActiveTopAnchorTurn(options)?.targetId;\n"],"mappings":";;AAOA,MAAaG,0BAA0B,EACrCC,WACAC,eAII;CACJ,IAAI,CAACD,WAAW,OAAO;CAEvB,MAAME,SAASD,SAASE,GAAG,EAAE;CAC7B,MAAMC,SAASH,SAASE,GAAG,EAAE;CAC7B,IAAIC,QAAQN,SAAS,UAAUI,QAAQJ,SAAS,aAAa,OAAO;CAEpE,OAAO;EAAEO,UAAUD,OAAOP;EAAIS,UAAUJ,OAAOL;CAAG;AACpD;AAEA,MAAaU,8BACXC,YACGT,uBAAuBS,OAAO,CAAC,EAAEH;AAEtC,MAAaK,8BACXF,YACGT,uBAAuBS,OAAO,CAAC,EAAEF"}
@@ -1 +1 @@
1
- {"version":3,"file":"topAnchorUtils.js","names":[],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorUtils.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Convert a supported CSS length string (`px`, `em`, `rem`) into pixels,\n * resolving font-relative units against the supplied element's computed style.\n * Unsupported or malformed values disable the tall-message clamp.\n *\n * Part of the top-anchor package's public input contract: consumers may pass\n * clamp configuration as supported CSS-length strings, and this function is the\n * single place that converts them into the pixel values the package operates on.\n */\nexport const parseCssLength = (value: string, element: HTMLElement): number => {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?|\\.\\d+)(em|px|rem)$/);\n if (!match) return Number.POSITIVE_INFINITY;\n\n const num = Number(match[1]);\n const unit = match[2];\n\n if (unit === \"px\") return num;\n if (unit === \"em\") {\n const fontSize = parseFloat(getComputedStyle(element).fontSize) || 16;\n return num * fontSize;\n }\n if (unit === \"rem\") {\n const rootFontSize =\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n return num * rootFontSize;\n }\n return Number.POSITIVE_INFINITY;\n};\n\nexport const getAnchorId = (anchor: HTMLElement) => anchor.dataset.messageId;\n\nexport const createReserveElement = () => {\n const reserve = document.createElement(\"div\");\n reserve.dataset.auiTopAnchorReserve = \"\";\n reserve.style.height = \"0px\";\n reserve.style.flexShrink = \"0\";\n reserve.style.pointerEvents = \"none\";\n reserve.setAttribute(\"aria-hidden\", \"true\");\n\n return reserve;\n};\n\nexport const setReserveHeight = (reserve: HTMLElement, height: number) => {\n const nextHeight = `${height}px`;\n if (reserve.style.height !== nextHeight) {\n reserve.style.height = nextHeight;\n return true;\n }\n\n return false;\n};\n\nexport const snapScrollTop = (top: number) => {\n const pixelRatio = window.devicePixelRatio || 1;\n return Math.round(top * pixelRatio) / pixelRatio;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAa,kBAAkB,OAAe,YAAiC;CAC7E,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC,MAAM,oCAAoC;CACrE,IAAI,CAAC,OAAO,OAAO,OAAO;CAE1B,MAAM,MAAM,OAAO,MAAM,EAAE;CAC3B,MAAM,OAAO,MAAM;CAEnB,IAAI,SAAS,MAAM,OAAO;CAC1B,IAAI,SAAS,MAEX,OAAO,OADU,WAAW,iBAAiB,OAAO,CAAC,CAAC,QAAQ,KAAK;CAGrE,IAAI,SAAS,OAGX,OAAO,OADL,WAAW,iBAAiB,SAAS,eAAe,CAAC,CAAC,QAAQ,KAAK;CAGvE,OAAO,OAAO;AAChB;AAEA,MAAa,eAAe,WAAwB,OAAO,QAAQ;AAEnE,MAAa,6BAA6B;CACxC,MAAM,UAAU,SAAS,cAAc,KAAK;CAC5C,QAAQ,QAAQ,sBAAsB;CACtC,QAAQ,MAAM,SAAS;CACvB,QAAQ,MAAM,aAAa;CAC3B,QAAQ,MAAM,gBAAgB;CAC9B,QAAQ,aAAa,eAAe,MAAM;CAE1C,OAAO;AACT;AAEA,MAAa,oBAAoB,SAAsB,WAAmB;CACxE,MAAM,aAAa,GAAG,OAAO;CAC7B,IAAI,QAAQ,MAAM,WAAW,YAAY;EACvC,QAAQ,MAAM,SAAS;EACvB,OAAO;CACT;CAEA,OAAO;AACT;AAEA,MAAa,iBAAiB,QAAgB;CAC5C,MAAM,aAAa,OAAO,oBAAoB;CAC9C,OAAO,KAAK,MAAM,MAAM,UAAU,IAAI;AACxC"}
1
+ {"version":3,"file":"topAnchorUtils.js","names":["parseCssLength","value","element","HTMLElement","match","trim","Number","POSITIVE_INFINITY","num","unit","fontSize","parseFloat","getComputedStyle","rootFontSize","document","documentElement","getAnchorId","anchor","dataset","messageId","createReserveElement","reserve","createElement","auiTopAnchorReserve","style","height","flexShrink","pointerEvents","setAttribute","setReserveHeight","nextHeight","snapScrollTop","top","pixelRatio","window","devicePixelRatio","Math","round"],"sources":["../../../../src/primitives/thread/topAnchor/topAnchorUtils.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Convert a supported CSS length string (`px`, `em`, `rem`) into pixels,\n * resolving font-relative units against the supplied element's computed style.\n * Unsupported or malformed values disable the tall-message clamp.\n *\n * Part of the top-anchor package's public input contract: consumers may pass\n * clamp configuration as supported CSS-length strings, and this function is the\n * single place that converts them into the pixel values the package operates on.\n */\nexport const parseCssLength = (value: string, element: HTMLElement): number => {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?|\\.\\d+)(em|px|rem)$/);\n if (!match) return Number.POSITIVE_INFINITY;\n\n const num = Number(match[1]);\n const unit = match[2];\n\n if (unit === \"px\") return num;\n if (unit === \"em\") {\n const fontSize = parseFloat(getComputedStyle(element).fontSize) || 16;\n return num * fontSize;\n }\n if (unit === \"rem\") {\n const rootFontSize =\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n return num * rootFontSize;\n }\n return Number.POSITIVE_INFINITY;\n};\n\nexport const getAnchorId = (anchor: HTMLElement) => anchor.dataset.messageId;\n\nexport const createReserveElement = () => {\n const reserve = document.createElement(\"div\");\n reserve.dataset.auiTopAnchorReserve = \"\";\n reserve.style.height = \"0px\";\n reserve.style.flexShrink = \"0\";\n reserve.style.pointerEvents = \"none\";\n reserve.setAttribute(\"aria-hidden\", \"true\");\n\n return reserve;\n};\n\nexport const setReserveHeight = (reserve: HTMLElement, height: number) => {\n const nextHeight = `${height}px`;\n if (reserve.style.height !== nextHeight) {\n reserve.style.height = nextHeight;\n return true;\n }\n\n return false;\n};\n\nexport const snapScrollTop = (top: number) => {\n const pixelRatio = window.devicePixelRatio || 1;\n return Math.round(top * pixelRatio) / pixelRatio;\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAaA,kBAAkBC,OAAeC,YAAiC;CAC7E,MAAME,QAAQH,MAAMI,KAAK,CAAC,CAACD,MAAM,oCAAoC;CACrE,IAAI,CAACA,OAAO,OAAOE,OAAOC;CAE1B,MAAMC,MAAMF,OAAOF,MAAM,EAAE;CAC3B,MAAMK,OAAOL,MAAM;CAEnB,IAAIK,SAAS,MAAM,OAAOD;CAC1B,IAAIC,SAAS,MAEX,OAAOD,OADUG,WAAWC,iBAAiBV,OAAO,CAAC,CAACQ,QAAQ,KAAK;CAGrE,IAAID,SAAS,OAGX,OAAOD,OADLG,WAAWC,iBAAiBE,SAASC,eAAe,CAAC,CAACL,QAAQ,KAAK;CAGvE,OAAOJ,OAAOC;AAChB;AAEA,MAAaS,eAAeC,WAAwBA,OAAOC,QAAQC;AAEnE,MAAaC,6BAA6B;CACxC,MAAMC,UAAUP,SAASQ,cAAc,KAAK;CAC5CD,QAAQH,QAAQK,sBAAsB;CACtCF,QAAQG,MAAMC,SAAS;CACvBJ,QAAQG,MAAME,aAAa;CAC3BL,QAAQG,MAAMG,gBAAgB;CAC9BN,QAAQO,aAAa,eAAe,MAAM;CAE1C,OAAOP;AACT;AAEA,MAAaQ,oBAAoBR,SAAsBI,WAAmB;CACxE,MAAMK,aAAa,GAAGL,OAAM;CAC5B,IAAIJ,QAAQG,MAAMC,WAAWK,YAAY;EACvCT,QAAQG,MAAMC,SAASK;EACvB,OAAO;CACT;CAEA,OAAO;AACT;AAEA,MAAaC,iBAAiBC,QAAgB;CAC5C,MAAMC,aAAaC,OAAOC,oBAAoB;CAC9C,OAAOC,KAAKC,MAAML,MAAMC,UAAU,IAAIA;AACxC"}