@assistant-ui/react 0.14.16 → 0.14.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/ExternalThread.d.ts +5 -3
- package/dist/client/ExternalThread.d.ts.map +1 -1
- package/dist/client/ExternalThread.js +745 -255
- package/dist/client/ExternalThread.js.map +1 -1
- package/dist/client/InMemoryThreadList.d.ts +1 -1
- package/dist/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/client/InMemoryThreadList.js +299 -113
- package/dist/client/InMemoryThreadList.js.map +1 -1
- package/dist/client/SingleThreadList.d.ts +1 -6
- package/dist/client/SingleThreadList.d.ts.map +1 -1
- package/dist/client/SingleThreadList.js +143 -55
- package/dist/client/SingleThreadList.js.map +1 -1
- package/dist/context/ReadonlyStore.js.map +1 -1
- package/dist/context/providers/MessageProvider.js +38 -5
- package/dist/context/providers/MessageProvider.js.map +1 -1
- package/dist/context/providers/ThreadViewportProvider.js +76 -20
- package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
- package/dist/context/react/ThreadViewportContext.js.map +1 -1
- package/dist/context/react/utils/createContextHook.js.map +1 -1
- package/dist/context/react/utils/createContextStoreHook.js +17 -2
- package/dist/context/react/utils/createContextStoreHook.js.map +1 -1
- package/dist/context/react/utils/createStateHookForRuntime.js.map +1 -1
- package/dist/context/react/utils/ensureBinding.js.map +1 -1
- package/dist/context/react/utils/useRuntimeState.js +18 -2
- package/dist/context/react/utils/useRuntimeState.js.map +1 -1
- package/dist/context/stores/ThreadViewport.js.map +1 -1
- package/dist/devtools/DevToolsHooks.js.map +1 -1
- package/dist/hooks/useMessageQuote.js.map +1 -1
- package/dist/hooks/useMessageTiming.js +4 -1
- package/dist/hooks/useMessageTiming.js.map +1 -1
- package/dist/hooks/useToolCallElapsed.d.ts +23 -0
- package/dist/hooks/useToolCallElapsed.d.ts.map +1 -0
- package/dist/hooks/useToolCallElapsed.js +72 -0
- package/dist/hooks/useToolCallElapsed.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -1
- package/dist/internal.js.map +1 -1
- package/dist/legacy-runtime/AssistantRuntimeProvider.js +46 -10
- package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
- package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
- package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js +27 -6
- package/dist/legacy-runtime/cloud/useCloudThreadListRuntime.js.map +1 -1
- package/dist/legacy-runtime/hooks/AssistantContext.js +13 -2
- package/dist/legacy-runtime/hooks/AssistantContext.js.map +1 -1
- package/dist/legacy-runtime/hooks/AttachmentContext.js +9 -1
- package/dist/legacy-runtime/hooks/AttachmentContext.js.map +1 -1
- package/dist/legacy-runtime/hooks/ComposerContext.js +9 -1
- package/dist/legacy-runtime/hooks/ComposerContext.js.map +1 -1
- package/dist/legacy-runtime/hooks/MessageContext.js +12 -2
- package/dist/legacy-runtime/hooks/MessageContext.js.map +1 -1
- package/dist/legacy-runtime/hooks/MessagePartContext.js +9 -1
- package/dist/legacy-runtime/hooks/MessagePartContext.js.map +1 -1
- package/dist/legacy-runtime/hooks/ThreadContext.js +33 -5
- package/dist/legacy-runtime/hooks/ThreadContext.js.map +1 -1
- package/dist/legacy-runtime/hooks/ThreadListItemContext.js +9 -1
- package/dist/legacy-runtime/hooks/ThreadListItemContext.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js +3 -3
- package/dist/legacy-runtime/runtime-cores/assistant-transport/commandQueue.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js +71 -31
- package/dist/legacy-runtime/runtime-cores/assistant-transport/replayBoundaryStream.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +24 -16
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js +17 -12
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useConvertedState.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js +17 -3
- package/dist/legacy-runtime/runtime-cores/assistant-transport/useLatestRef.js.map +1 -1
- package/dist/mcp-apps/McpAppRenderer.d.ts +2 -10
- package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppRenderer.js +9 -8
- package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/mcp-apps/McpAppsRemoteHost.d.ts +1 -8
- package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppsRemoteHost.js +6 -5
- package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
- package/dist/mcp-apps/app-frame.js +33 -14
- package/dist/mcp-apps/app-frame.js.map +1 -1
- package/dist/mcp-apps/bridge.js.map +1 -1
- package/dist/mcp-apps/types.js.map +1 -1
- package/dist/mcp-apps/utils.js.map +1 -1
- package/dist/model-context/frame/useAssistantFrameHost.js +32 -14
- package/dist/model-context/frame/useAssistantFrameHost.js.map +1 -1
- package/dist/model-context/makeAssistantVisible.js +64 -26
- package/dist/model-context/makeAssistantVisible.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarCopy.js +94 -20
- package/dist/primitives/actionBar/ActionBarCopy.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarEdit.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarExportMarkdown.js +105 -37
- package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +60 -11
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +60 -11
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarInteractionContext.js +3 -1
- package/dist/primitives/actionBar/ActionBarInteractionContext.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarReload.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarRoot.js +84 -25
- package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarSpeak.js.map +1 -1
- package/dist/primitives/actionBar/ActionBarStopSpeaking.js +45 -14
- package/dist/primitives/actionBar/ActionBarStopSpeaking.js.map +1 -1
- package/dist/primitives/actionBar/useActionBarFloatStatus.js +22 -10
- package/dist/primitives/actionBar/useActionBarFloatStatus.js.map +1 -1
- package/dist/primitives/actionBar.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreContent.js +44 -7
- package/dist/primitives/actionBarMore/ActionBarMoreContent.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreItem.js +28 -6
- package/dist/primitives/actionBarMore/ActionBarMoreItem.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +103 -36
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +28 -6
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js.map +1 -1
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +28 -6
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js.map +1 -1
- package/dist/primitives/actionBarMore/scope.js.map +1 -1
- package/dist/primitives/actionBarMore.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalAnchor.js +27 -6
- package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalContent.js +71 -10
- package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalRoot.js +93 -26
- package/dist/primitives/assistantModal/AssistantModalRoot.js.map +1 -1
- package/dist/primitives/assistantModal/AssistantModalTrigger.js +27 -6
- package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
- package/dist/primitives/assistantModal/scope.js.map +1 -1
- package/dist/primitives/assistantModal.js.map +1 -1
- package/dist/primitives/attachment/AttachmentName.js +13 -1
- package/dist/primitives/attachment/AttachmentName.js.map +1 -1
- package/dist/primitives/attachment/AttachmentRemove.js +11 -4
- package/dist/primitives/attachment/AttachmentRemove.js.map +1 -1
- package/dist/primitives/attachment/AttachmentRoot.js +13 -4
- package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
- package/dist/primitives/attachment/AttachmentThumb.js +20 -9
- package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
- package/dist/primitives/attachment.js.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerCount.js +14 -2
- package/dist/primitives/branchPicker/BranchPickerCount.js.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerNext.js.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerNumber.js +14 -2
- package/dist/primitives/branchPicker/BranchPickerNumber.js.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerPrevious.js.map +1 -1
- package/dist/primitives/branchPicker/BranchPickerRoot.js +34 -6
- package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
- package/dist/primitives/branchPicker.js.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +16 -5
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +13 -4
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js.map +1 -1
- package/dist/primitives/chainOfThought.js.map +1 -1
- package/dist/primitives/composer/ComposerAddAttachment.js +37 -24
- package/dist/primitives/composer/ComposerAddAttachment.js.map +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.js +124 -49
- package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
- package/dist/primitives/composer/ComposerCancel.js.map +1 -1
- package/dist/primitives/composer/ComposerDictate.js.map +1 -1
- package/dist/primitives/composer/ComposerDictationTranscript.js +32 -7
- package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
- package/dist/primitives/composer/ComposerInput.js +29 -29
- package/dist/primitives/composer/ComposerInput.js.map +1 -1
- package/dist/primitives/composer/ComposerInputPluginContext.js +71 -25
- package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
- package/dist/primitives/composer/ComposerQuote.js +92 -23
- package/dist/primitives/composer/ComposerQuote.js.map +1 -1
- package/dist/primitives/composer/ComposerRoot.js +45 -11
- package/dist/primitives/composer/ComposerRoot.js.map +1 -1
- package/dist/primitives/composer/ComposerSend.js +9 -2
- package/dist/primitives/composer/ComposerSend.js.map +1 -1
- package/dist/primitives/composer/ComposerStopDictation.js +15 -5
- package/dist/primitives/composer/ComposerStopDictation.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopover.js +215 -75
- package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js +35 -7
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +134 -28
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js +132 -28
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +2 -10
- package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js +126 -53
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +181 -78
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
- package/dist/primitives/composer/trigger/detectTrigger.js.map +1 -1
- package/dist/primitives/composer/trigger/index.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts +2 -6
- package/dist/primitives/composer/trigger/triggerDetectionResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerDetectionResource.js +30 -15
- package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts +2 -17
- package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js +117 -59
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts +2 -10
- package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerNavigationResource.js +204 -71
- package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts +2 -10
- package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.js +51 -14
- package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
- package/dist/primitives/composer.js.map +1 -1
- package/dist/primitives/dropdownMenuRenderPrimitives.js.map +1 -1
- package/dist/primitives/error/ErrorMessage.js +28 -6
- package/dist/primitives/error/ErrorMessage.js.map +1 -1
- package/dist/primitives/error/ErrorRoot.js +14 -5
- package/dist/primitives/error/ErrorRoot.js.map +1 -1
- package/dist/primitives/error.js.map +1 -1
- package/dist/primitives/message/MessageError.js +2 -1
- package/dist/primitives/message/MessageError.js.map +1 -1
- package/dist/primitives/message/MessageIf.js +50 -20
- package/dist/primitives/message/MessageIf.js.map +1 -1
- package/dist/primitives/message/MessageParts.js +41 -7
- package/dist/primitives/message/MessageParts.js.map +1 -1
- package/dist/primitives/message/MessagePartsGrouped.js +399 -94
- package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
- package/dist/primitives/message/MessageRoot.js +197 -65
- package/dist/primitives/message/MessageRoot.js.map +1 -1
- package/dist/primitives/message.js.map +1 -1
- package/dist/primitives/messagePart/MessagePartImage.js +15 -5
- package/dist/primitives/messagePart/MessagePartImage.js.map +1 -1
- package/dist/primitives/messagePart/MessagePartText.d.ts +5 -2
- package/dist/primitives/messagePart/MessagePartText.d.ts.map +1 -1
- package/dist/primitives/messagePart/MessagePartText.js +35 -7
- package/dist/primitives/messagePart/MessagePartText.js.map +1 -1
- package/dist/primitives/messagePart/useMessagePartData.js +5 -4
- package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
- package/dist/primitives/messagePart/useMessagePartFile.js +5 -4
- package/dist/primitives/messagePart/useMessagePartFile.js.map +1 -1
- package/dist/primitives/messagePart/useMessagePartImage.js +5 -4
- package/dist/primitives/messagePart/useMessagePartImage.js.map +1 -1
- package/dist/primitives/messagePart/useMessagePartReasoning.js +5 -4
- package/dist/primitives/messagePart/useMessagePartReasoning.js.map +1 -1
- package/dist/primitives/messagePart/useMessagePartSource.js +5 -4
- package/dist/primitives/messagePart/useMessagePartSource.js.map +1 -1
- package/dist/primitives/messagePart/useMessagePartText.js +5 -4
- package/dist/primitives/messagePart/useMessagePartText.js.map +1 -1
- package/dist/primitives/messagePart.js.map +1 -1
- package/dist/primitives/queueItem/QueueItemRemove.js +11 -4
- package/dist/primitives/queueItem/QueueItemRemove.js.map +1 -1
- package/dist/primitives/queueItem/QueueItemSteer.js +11 -4
- package/dist/primitives/queueItem/QueueItemSteer.js.map +1 -1
- package/dist/primitives/queueItem/QueueItemText.js +20 -6
- package/dist/primitives/queueItem/QueueItemText.js.map +1 -1
- package/dist/primitives/queueItem.js.map +1 -1
- package/dist/primitives/reasoning/useScrollLock.js +61 -34
- package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
- package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +56 -16
- package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js.map +1 -1
- package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +120 -59
- package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js.map +1 -1
- package/dist/primitives/selectionToolbar.js.map +1 -1
- package/dist/primitives/suggestion/SuggestionDescription.js +20 -6
- package/dist/primitives/suggestion/SuggestionDescription.js.map +1 -1
- package/dist/primitives/suggestion/SuggestionTitle.js +20 -6
- package/dist/primitives/suggestion/SuggestionTitle.js.map +1 -1
- package/dist/primitives/suggestion/SuggestionTrigger.js +39 -26
- package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
- package/dist/primitives/suggestion.js.map +1 -1
- package/dist/primitives/thread/ThreadEmpty.js +6 -2
- package/dist/primitives/thread/ThreadEmpty.js.map +1 -1
- package/dist/primitives/thread/ThreadIf.js +32 -10
- package/dist/primitives/thread/ThreadIf.js.map +1 -1
- package/dist/primitives/thread/ThreadRoot.js +13 -4
- package/dist/primitives/thread/ThreadRoot.js.map +1 -1
- package/dist/primitives/thread/ThreadScrollToBottom.js +24 -6
- package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
- package/dist/primitives/thread/ThreadSuggestion.js +18 -6
- package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
- package/dist/primitives/thread/ThreadViewport.js +185 -47
- package/dist/primitives/thread/ThreadViewport.js.map +1 -1
- package/dist/primitives/thread/ThreadViewportFooter.js +22 -9
- package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
- package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js.map +1 -1
- package/dist/primitives/thread/topAnchor/createReserveObservers.js.map +1 -1
- package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -1
- package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -1
- package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -1
- package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +19 -4
- package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.js +21 -16
- package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
- package/dist/primitives/thread.js.map +1 -1
- package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -1
- package/dist/primitives/threadList/ThreadListNew.js +53 -11
- package/dist/primitives/threadList/ThreadListNew.js.map +1 -1
- package/dist/primitives/threadList/ThreadListRoot.js +13 -4
- package/dist/primitives/threadList/ThreadListRoot.js.map +1 -1
- package/dist/primitives/threadList.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemArchive.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemDelete.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.js +26 -7
- package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemUnarchive.js.map +1 -1
- package/dist/primitives/threadListItem.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +44 -7
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +28 -6
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +25 -5
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +28 -6
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js.map +1 -1
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +28 -6
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js.map +1 -1
- package/dist/primitives/threadListItemMore/scope.js.map +1 -1
- package/dist/primitives/threadListItemMore.js.map +1 -1
- package/dist/sandbox-host/SandboxHost.js.map +1 -1
- package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
- package/dist/tests/setup.js.map +1 -1
- package/dist/unstable/useComposerInputHistory.d.ts +30 -0
- package/dist/unstable/useComposerInputHistory.d.ts.map +1 -0
- package/dist/unstable/useComposerInputHistory.js +117 -0
- package/dist/unstable/useComposerInputHistory.js.map +1 -0
- package/dist/unstable/useMentionAdapter.js.map +1 -1
- package/dist/unstable/useMessageStallDetection.d.ts +29 -0
- package/dist/unstable/useMessageStallDetection.d.ts.map +1 -0
- package/dist/unstable/useMessageStallDetection.js +69 -0
- package/dist/unstable/useMessageStallDetection.js.map +1 -0
- package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
- package/dist/utils/Primitive.js +57 -12
- package/dist/utils/Primitive.js.map +1 -1
- package/dist/utils/createActionButton.js +23 -7
- package/dist/utils/createActionButton.js.map +1 -1
- package/dist/utils/getSelectionMessageId.js.map +1 -1
- package/dist/utils/hooks/useManagedRef.js +16 -8
- package/dist/utils/hooks/useManagedRef.js.map +1 -1
- package/dist/utils/hooks/useMediaQuery.js +25 -10
- package/dist/utils/hooks/useMediaQuery.js.map +1 -1
- package/dist/utils/hooks/useOnResizeContent.js +29 -19
- package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
- package/dist/utils/hooks/useOnScrollToBottom.js +20 -4
- package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
- package/dist/utils/hooks/useSizeHandle.js +23 -15
- package/dist/utils/hooks/useSizeHandle.js.map +1 -1
- package/dist/utils/json/is-json-equal.js.map +1 -1
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/smooth/SmoothContext.js +41 -11
- package/dist/utils/smooth/SmoothContext.js.map +1 -1
- package/dist/utils/smooth/useSmooth.d.ts +40 -2
- package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
- package/dist/utils/smooth/useSmooth.js +52 -13
- package/dist/utils/smooth/useSmooth.js.map +1 -1
- package/dist/utils/useToolArgsFieldStatus.d.ts +2 -2
- package/dist/utils/useToolArgsFieldStatus.d.ts.map +1 -1
- package/dist/utils/useToolArgsFieldStatus.js +13 -5
- package/dist/utils/useToolArgsFieldStatus.js.map +1 -1
- package/package.json +6 -6
- package/src/client/ExternalThread.ts +146 -74
- package/src/client/InMemoryThreadList.ts +23 -21
- package/src/client/SingleThreadList.ts +29 -27
- package/src/hooks/useToolCallElapsed.ts +52 -0
- package/src/index.ts +19 -0
- package/src/mcp-apps/McpAppRenderer.tsx +5 -3
- package/src/mcp-apps/McpAppsRemoteHost.ts +5 -3
- package/src/primitives/composer/ComposerInput.test.tsx +1 -1
- package/src/primitives/composer/ComposerInput.tsx +3 -3
- package/src/primitives/composer/trigger/TriggerPopover.tsx +4 -5
- package/src/primitives/composer/trigger/TriggerPopoverResource.ts +5 -3
- package/src/primitives/composer/trigger/triggerDetectionResource.ts +21 -21
- package/src/primitives/composer/trigger/triggerKeyboardResource.test.ts +5 -4
- package/src/primitives/composer/trigger/triggerKeyboardResource.ts +99 -101
- package/src/primitives/composer/trigger/triggerNavigationResource.ts +92 -98
- package/src/primitives/composer/trigger/triggerSelectionResource.ts +76 -76
- package/src/primitives/messagePart/MessagePartText.tsx +3 -2
- package/src/primitives/reasoning/useScrollLock.ts +25 -2
- package/src/primitives/thread/useThreadViewportAutoScroll.ts +8 -0
- package/src/tests/external-thread-branches.test.tsx +160 -0
- package/src/tests/shouldContinue.test.ts +33 -0
- package/src/tests/toolCallTiming.test.tsx +221 -0
- package/src/unstable/useComposerInputHistory.test.tsx +201 -0
- package/src/unstable/useComposerInputHistory.ts +160 -0
- package/src/unstable/useMessageStallDetection.ts +91 -0
- package/src/utils/smooth/useSmooth.test.tsx +95 -0
- package/src/utils/smooth/useSmooth.ts +82 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessagePartsGrouped.js","names":[],"sources":["../../../src/primitives/message/MessagePartsGrouped.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ComponentType,\n type FC,\n memo,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport { useAuiState, useAui } from \"@assistant-ui/store\";\nimport { PartByIndexProvider } from \"../../context/providers/PartByIndexProvider\";\nimport { TextMessagePartProvider } from \"../../context/providers/TextMessagePartProvider\";\nimport { MessagePartPrimitiveText } from \"../messagePart/MessagePartText\";\nimport { MessagePartPrimitiveImage } from \"../messagePart/MessagePartImage\";\nimport type {\n Unstable_AudioMessagePartComponent,\n DataMessagePartComponent,\n DataMessagePartProps,\n EmptyMessagePartComponent,\n TextMessagePartComponent,\n ImageMessagePartComponent,\n SourceMessagePartComponent,\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n FileMessagePartComponent,\n ReasoningMessagePartComponent,\n} from \"@assistant-ui/core/react\";\nimport { MessagePartPrimitiveInProgress } from \"../messagePart/MessagePartInProgress\";\nimport type { MessagePartStatus } from \"@assistant-ui/core\";\n\ntype MessagePartGroup = {\n groupKey: string | undefined;\n indices: number[];\n};\n\nexport type GroupingFunction = (parts: readonly any[]) => MessagePartGroup[];\n\n/**\n * Groups message parts by their parent ID.\n * Parts without a parent ID appear in their chronological position as individual groups.\n * Parts with the same parent ID are grouped together at the position of their first occurrence.\n */\nconst groupMessagePartsByParentId: GroupingFunction = (\n parts: readonly any[],\n): MessagePartGroup[] => {\n // Map maintains insertion order, so groups appear in order of first occurrence\n const groupMap = new Map<string, number[]>();\n\n // Process each part in order\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const parentId = part?.parentId as string | undefined;\n\n // For parts without parentId, assign a unique group ID to maintain their position\n const groupId = parentId ?? `__ungrouped_${i}`;\n\n // Get or create the indices array for this group\n const indices = groupMap.get(groupId) ?? [];\n indices.push(i);\n groupMap.set(groupId, indices);\n }\n\n // Convert map to array of groups\n const groups: MessagePartGroup[] = [];\n for (const [groupId, indices] of groupMap) {\n // Extract parentId (undefined for ungrouped parts)\n const groupKey = groupId.startsWith(\"__ungrouped_\") ? undefined : groupId;\n groups.push({ groupKey, indices });\n }\n\n return groups;\n};\n\nconst useMessagePartsGrouped = (\n groupingFunction: GroupingFunction,\n): MessagePartGroup[] => {\n const parts = useAuiState((s) => s.message.parts);\n\n return useMemo(() => {\n if (parts.length === 0) {\n return [];\n }\n return groupingFunction(parts);\n }, [parts, groupingFunction]);\n};\n\nexport namespace MessagePrimitiveUnstable_PartsGrouped {\n export type Props = {\n /**\n * Function that takes an array of message parts and returns an array of groups.\n * Each group contains a key (for identification) and an array of indices.\n *\n * @example\n * ```tsx\n * // Group by parent ID (default behavior)\n * groupingFunction={(parts) => {\n * const groups = new Map<string, number[]>();\n * parts.forEach((part, i) => {\n * const key = part.parentId ?? `__ungrouped_${i}`;\n * const indices = groups.get(key) ?? [];\n * indices.push(i);\n * groups.set(key, indices);\n * });\n * return Array.from(groups.entries()).map(([key, indices]) => ({\n * key: key.startsWith(\"__ungrouped_\") ? undefined : key,\n * indices\n * }));\n * }}\n * ```\n *\n * @example\n * ```tsx\n * // Group by tool name\n * import { groupMessagePartsByToolName } from \"@assistant-ui/react\";\n *\n * <MessagePrimitive.Unstable_PartsGrouped\n * groupingFunction={groupMessagePartsByToolName}\n * components={{\n * Group: ({ key, indices, children }) => {\n * if (!key) return <>{children}</>;\n * return (\n * <div className=\"tool-group\">\n * <h4>Tool: {key}</h4>\n * {children}\n * </div>\n * );\n * }\n * }}\n * />\n * ```\n */\n groupingFunction: GroupingFunction;\n\n /**\n * Component configuration for rendering different types of message content.\n *\n * You can provide custom components for each content type (text, image, file, etc.)\n * and configure tool rendering behavior. If not provided, default components will be used.\n */\n components:\n | {\n /** Component for rendering empty messages */\n Empty?: EmptyMessagePartComponent | undefined;\n /** Component for rendering text content */\n Text?: TextMessagePartComponent | undefined;\n /** Component for rendering reasoning content (typically hidden) */\n Reasoning?: ReasoningMessagePartComponent | undefined;\n /** Component for rendering source content */\n Source?: SourceMessagePartComponent | undefined;\n /** Component for rendering image content */\n Image?: ImageMessagePartComponent | undefined;\n /** Component for rendering file content */\n File?: FileMessagePartComponent | undefined;\n /** Component for rendering audio content (experimental) */\n Unstable_Audio?: Unstable_AudioMessagePartComponent | undefined;\n /** Configuration for data part rendering */\n data?:\n | {\n /** Map data event names to specific components */\n by_name?:\n | Record<string, DataMessagePartComponent | undefined>\n | undefined;\n /** Fallback component for unmatched data events */\n Fallback?: DataMessagePartComponent | undefined;\n }\n | undefined;\n /** Configuration for tool call rendering */\n tools?:\n | {\n /** Map of tool names to their specific components */\n by_name?:\n | Record<string, ToolCallMessagePartComponent | undefined>\n | undefined;\n /** Fallback component for unregistered tools */\n Fallback?: ComponentType<ToolCallMessagePartProps> | undefined;\n }\n | {\n /** Override component that handles all tool calls */\n Override: ComponentType<ToolCallMessagePartProps>;\n }\n | undefined;\n\n /**\n * Component for rendering grouped message parts.\n *\n * When provided, this component will automatically wrap message parts that share\n * the same group key as determined by the groupingFunction.\n *\n * The component receives:\n * - `groupKey`: The group key (or undefined for ungrouped parts)\n * - `indices`: Array of indices for the parts in this group\n * - `children`: The rendered message part components\n *\n * @example\n * ```tsx\n * // Collapsible group\n * Group: ({ groupKey, indices, children }) => {\n * if (!groupKey) return <>{children}</>;\n * return (\n * <details className=\"message-group\">\n * <summary>\n * Group {groupKey} ({indices.length} parts)\n * </summary>\n * <div className=\"group-content\">\n * {children}\n * </div>\n * </details>\n * );\n * }\n * ```\n *\n * @param groupKey - The group key (undefined for ungrouped parts)\n * @param indices - Array of indices for the parts in this group\n * @param children - Rendered message part components to display within the group\n */\n Group?: ComponentType<\n PropsWithChildren<{\n groupKey: string | undefined;\n indices: number[];\n }>\n >;\n }\n | undefined;\n };\n}\n\nconst ToolUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: ToolCallMessagePartComponent | undefined;\n} & ToolCallMessagePartProps) => {\n const Render = useAuiState((s) => {\n const Render = s.tools.tools[props.toolName] ?? Fallback;\n if (Array.isArray(Render)) return Render[0] ?? Fallback;\n return Render;\n });\n if (!Render) return null;\n return <Render {...props} />;\n};\n\nconst DataUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: DataMessagePartComponent | undefined;\n} & DataMessagePartProps) => {\n const Render = useAuiState((s) => {\n const Render = s.dataRenderers.renderers[props.name] ?? Fallback;\n if (Array.isArray(Render)) return Render[0] ?? Fallback;\n return Render;\n });\n if (!Render) return null;\n return <Render {...props} />;\n};\n\nconst defaultComponents = {\n Text: () => (\n <p style={{ whiteSpace: \"pre-line\" }}>\n <MessagePartPrimitiveText />\n <MessagePartPrimitiveInProgress>\n <span style={{ fontFamily: \"revert\" }}>{\" \\u25CF\"}</span>\n </MessagePartPrimitiveInProgress>\n </p>\n ),\n Reasoning: () => null,\n Source: () => null,\n Image: () => <MessagePartPrimitiveImage />,\n File: () => null,\n Unstable_Audio: () => null,\n Group: ({ children }) => children,\n} satisfies MessagePrimitiveUnstable_PartsGrouped.Props[\"components\"];\n\ntype MessagePartComponentProps = {\n components: MessagePrimitiveUnstable_PartsGrouped.Props[\"components\"];\n};\n\nconst MessagePartComponent: FC<MessagePartComponentProps> = ({\n components: {\n Text = defaultComponents.Text,\n Reasoning = defaultComponents.Reasoning,\n Image = defaultComponents.Image,\n Source = defaultComponents.Source,\n File = defaultComponents.File,\n Unstable_Audio: Audio = defaultComponents.Unstable_Audio,\n tools = {},\n data,\n } = {},\n}) => {\n const aui = useAui();\n const part = useAuiState((s) => s.part);\n\n const type = part.type;\n if (type === \"tool-call\") {\n const addResult = aui.part().addToolResult;\n const resume = aui.part().resumeToolCall;\n const respondToApproval = aui.part().respondToToolApproval;\n if (\"Override\" in tools)\n return (\n <tools.Override\n {...part}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n const Tool = tools.by_name?.[part.toolName] ?? tools.Fallback;\n return (\n <ToolUIDisplay\n {...part}\n Fallback={Tool}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n }\n\n if (part.status?.type === \"requires-action\")\n throw new Error(\"Encountered unexpected requires-action status\");\n\n switch (type) {\n case \"text\":\n return <Text {...part} />;\n\n case \"reasoning\":\n return <Reasoning {...part} />;\n\n case \"source\":\n return <Source {...part} />;\n\n case \"image\":\n return <Image {...part} />;\n\n case \"file\":\n return <File {...part} />;\n\n case \"audio\":\n return <Audio {...part} />;\n\n case \"data\": {\n const Data = data?.by_name?.[part.name] ?? data?.Fallback;\n return <DataUIDisplay {...part} Fallback={Data} />;\n }\n\n default:\n console.warn(`Unknown message part type: ${type}`);\n return null;\n }\n};\n\ntype MessagePartProps = {\n partIndex: number;\n components: MessagePrimitiveUnstable_PartsGrouped.Props[\"components\"];\n};\n\nconst MessagePartImpl: FC<MessagePartProps> = ({ partIndex, components }) => {\n return (\n <PartByIndexProvider index={partIndex}>\n <MessagePartComponent components={components} />\n </PartByIndexProvider>\n );\n};\n\nconst MessagePart = memo(\n MessagePartImpl,\n (prev, next) =>\n prev.partIndex === next.partIndex &&\n prev.components?.Text === next.components?.Text &&\n prev.components?.Reasoning === next.components?.Reasoning &&\n prev.components?.Source === next.components?.Source &&\n prev.components?.Image === next.components?.Image &&\n prev.components?.File === next.components?.File &&\n prev.components?.Unstable_Audio === next.components?.Unstable_Audio &&\n prev.components?.tools === next.components?.tools &&\n prev.components?.data === next.components?.data &&\n prev.components?.Group === next.components?.Group,\n);\n\nconst EmptyPartFallback: FC<{\n status: MessagePartStatus;\n component: TextMessagePartComponent;\n}> = ({ status, component: Component }) => {\n return (\n <TextMessagePartProvider text=\"\" isRunning={status.type === \"running\"}>\n <Component type=\"text\" text=\"\" status={status} />\n </TextMessagePartProvider>\n );\n};\n\nconst COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\n\nconst EmptyPartsImpl: FC<MessagePartComponentProps> = ({ components }) => {\n const status = useAuiState(\n (s) => (s.message.status ?? COMPLETE_STATUS) as MessagePartStatus,\n );\n\n if (components?.Empty) return <components.Empty status={status} />;\n\n return (\n <EmptyPartFallback\n status={status}\n component={components?.Text ?? defaultComponents.Text}\n />\n );\n};\n\nconst EmptyParts = memo(\n EmptyPartsImpl,\n (prev, next) =>\n prev.components?.Empty === next.components?.Empty &&\n prev.components?.Text === next.components?.Text,\n);\n\n/**\n * Renders the parts of a message grouped by a custom grouping function.\n *\n * This component allows you to group message parts based on any criteria you define.\n * The grouping function receives all message parts and returns an array of groups,\n * where each group has a key and an array of part indices.\n *\n * @deprecated Prefer `<MessagePrimitive.GroupedParts>` for adjacent\n * grouping — it dispatches all rendering through one `switch (part.type)`\n * and supports nested group paths. Keep this primitive only for\n * non-adjacent clustering (e.g., gathering parts with the same parent-id\n * across the message).\n *\n * @example\n * ```tsx\n * // Group by parent ID (default behavior)\n * <MessagePrimitive.Unstable_PartsGrouped\n * components={{\n * Text: ({ text }) => <p className=\"message-text\">{text}</p>,\n * Image: ({ image }) => <img src={image} alt=\"Message image\" />,\n * Group: ({ groupKey, indices, children }) => {\n * if (!groupKey) return <>{children}</>;\n * return (\n * <div className=\"parent-group border rounded p-4\">\n * <h4>Parent ID: {groupKey}</h4>\n * {children}\n * </div>\n * );\n * }\n * }}\n * />\n * ```\n */\nexport const MessagePrimitiveUnstable_PartsGrouped: FC<\n MessagePrimitiveUnstable_PartsGrouped.Props\n> = ({ groupingFunction, components }) => {\n const contentLength = useAuiState((s) => s.message.parts.length);\n const messageGroups = useMessagePartsGrouped(groupingFunction);\n\n const partsElements = useMemo(() => {\n if (contentLength === 0) {\n return <EmptyParts components={components} />;\n }\n\n return messageGroups.map((group, groupIndex) => {\n const GroupComponent = components?.Group ?? defaultComponents.Group;\n\n return (\n <GroupComponent\n key={`group-${groupIndex}-${group.groupKey ?? \"ungrouped\"}`}\n groupKey={group.groupKey}\n indices={group.indices}\n >\n {group.indices.map((partIndex) => (\n <MessagePart\n key={partIndex}\n partIndex={partIndex}\n components={components}\n />\n ))}\n </GroupComponent>\n );\n });\n }, [messageGroups, components, contentLength]);\n\n return <>{partsElements}</>;\n};\n\nMessagePrimitiveUnstable_PartsGrouped.displayName =\n \"MessagePrimitive.Unstable_PartsGrouped\";\n\n/**\n * Renders the parts of a message grouped by their parent ID.\n * This is a convenience wrapper around Unstable_PartsGrouped with parent ID grouping.\n *\n * @deprecated Use MessagePrimitive.Unstable_PartsGrouped instead for more flexibility\n */\nexport const MessagePrimitiveUnstable_PartsGroupedByParentId: FC<\n Omit<MessagePrimitiveUnstable_PartsGrouped.Props, \"groupingFunction\">\n> = ({ components, ...props }) => {\n return (\n <MessagePrimitiveUnstable_PartsGrouped\n {...props}\n components={components}\n groupingFunction={groupMessagePartsByParentId}\n />\n );\n};\n\nMessagePrimitiveUnstable_PartsGroupedByParentId.displayName =\n \"MessagePrimitive.Unstable_PartsGroupedByParentId\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MessagePartsGrouped.js","names":["c","_c","ComponentType","FC","memo","PropsWithChildren","useMemo","useAuiState","useAui","PartByIndexProvider","TextMessagePartProvider","MessagePartPrimitiveText","MessagePartPrimitiveImage","Unstable_AudioMessagePartComponent","DataMessagePartComponent","DataMessagePartProps","EmptyMessagePartComponent","TextMessagePartComponent","ImageMessagePartComponent","SourceMessagePartComponent","ToolCallMessagePartComponent","ToolCallMessagePartProps","FileMessagePartComponent","ReasoningMessagePartComponent","MessagePartPrimitiveInProgress","MessagePartStatus","MessagePartGroup","groupKey","indices","GroupingFunction","parts","groupMessagePartsByParentId","groupMap","Map","i","length","part","parentId","groupId","get","push","set","groups","startsWith","undefined","useMessagePartsGrouped","groupingFunction","$","_temp","t0","bb0","t1","Symbol","for","MessagePrimitiveUnstable_PartsGrouped","Props","components","Empty","Text","Reasoning","Source","Image","File","Unstable_Audio","data","by_name","Record","Fallback","tools","Override","Group","ToolUIDisplay","props","toolName","s","Render","Array","isArray","Render_0","t2","DataUIDisplay","name","dataRenderers","renderers","defaultComponents","whiteSpace","fontFamily","children","MessagePartComponentProps","MessagePartComponent","t3","t4","t5","t6","t7","t8","t9","Audio","t10","aui","_temp2","type","t11","addResult","addToolResult","t12","resume","resumeToolCall","t13","respondToApproval","respondToToolApproval","t14","Tool","status","Error","Data","console","warn","MessagePartProps","partIndex","MessagePartImpl","MessagePart","prev","next","EmptyPartFallback","component","Component","COMPLETE_STATUS","Object","freeze","EmptyPartsImpl","_temp3","EmptyParts","contentLength","_temp4","messageGroups","group","groupIndex","GroupComponent","map","partsElements","displayName","MessagePrimitiveUnstable_PartsGroupedByParentId","Omit","message"],"sources":["../../../src/primitives/message/MessagePartsGrouped.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ComponentType,\n type FC,\n memo,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport { useAuiState, useAui } from \"@assistant-ui/store\";\nimport { PartByIndexProvider } from \"../../context/providers/PartByIndexProvider\";\nimport { TextMessagePartProvider } from \"../../context/providers/TextMessagePartProvider\";\nimport { MessagePartPrimitiveText } from \"../messagePart/MessagePartText\";\nimport { MessagePartPrimitiveImage } from \"../messagePart/MessagePartImage\";\nimport type {\n Unstable_AudioMessagePartComponent,\n DataMessagePartComponent,\n DataMessagePartProps,\n EmptyMessagePartComponent,\n TextMessagePartComponent,\n ImageMessagePartComponent,\n SourceMessagePartComponent,\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n FileMessagePartComponent,\n ReasoningMessagePartComponent,\n} from \"@assistant-ui/core/react\";\nimport { MessagePartPrimitiveInProgress } from \"../messagePart/MessagePartInProgress\";\nimport type { MessagePartStatus } from \"@assistant-ui/core\";\n\ntype MessagePartGroup = {\n groupKey: string | undefined;\n indices: number[];\n};\n\nexport type GroupingFunction = (parts: readonly any[]) => MessagePartGroup[];\n\n/**\n * Groups message parts by their parent ID.\n * Parts without a parent ID appear in their chronological position as individual groups.\n * Parts with the same parent ID are grouped together at the position of their first occurrence.\n */\nconst groupMessagePartsByParentId: GroupingFunction = (\n parts: readonly any[],\n): MessagePartGroup[] => {\n // Map maintains insertion order, so groups appear in order of first occurrence\n const groupMap = new Map<string, number[]>();\n\n // Process each part in order\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const parentId = part?.parentId as string | undefined;\n\n // For parts without parentId, assign a unique group ID to maintain their position\n const groupId = parentId ?? `__ungrouped_${i}`;\n\n // Get or create the indices array for this group\n const indices = groupMap.get(groupId) ?? [];\n indices.push(i);\n groupMap.set(groupId, indices);\n }\n\n // Convert map to array of groups\n const groups: MessagePartGroup[] = [];\n for (const [groupId, indices] of groupMap) {\n // Extract parentId (undefined for ungrouped parts)\n const groupKey = groupId.startsWith(\"__ungrouped_\") ? undefined : groupId;\n groups.push({ groupKey, indices });\n }\n\n return groups;\n};\n\nconst useMessagePartsGrouped = (\n groupingFunction: GroupingFunction,\n): MessagePartGroup[] => {\n const parts = useAuiState((s) => s.message.parts);\n\n return useMemo(() => {\n if (parts.length === 0) {\n return [];\n }\n return groupingFunction(parts);\n }, [parts, groupingFunction]);\n};\n\nexport namespace MessagePrimitiveUnstable_PartsGrouped {\n export type Props = {\n /**\n * Function that takes an array of message parts and returns an array of groups.\n * Each group contains a key (for identification) and an array of indices.\n *\n * @example\n * ```tsx\n * // Group by parent ID (default behavior)\n * groupingFunction={(parts) => {\n * const groups = new Map<string, number[]>();\n * parts.forEach((part, i) => {\n * const key = part.parentId ?? `__ungrouped_${i}`;\n * const indices = groups.get(key) ?? [];\n * indices.push(i);\n * groups.set(key, indices);\n * });\n * return Array.from(groups.entries()).map(([key, indices]) => ({\n * key: key.startsWith(\"__ungrouped_\") ? undefined : key,\n * indices\n * }));\n * }}\n * ```\n *\n * @example\n * ```tsx\n * // Group by tool name\n * import { groupMessagePartsByToolName } from \"@assistant-ui/react\";\n *\n * <MessagePrimitive.Unstable_PartsGrouped\n * groupingFunction={groupMessagePartsByToolName}\n * components={{\n * Group: ({ key, indices, children }) => {\n * if (!key) return <>{children}</>;\n * return (\n * <div className=\"tool-group\">\n * <h4>Tool: {key}</h4>\n * {children}\n * </div>\n * );\n * }\n * }}\n * />\n * ```\n */\n groupingFunction: GroupingFunction;\n\n /**\n * Component configuration for rendering different types of message content.\n *\n * You can provide custom components for each content type (text, image, file, etc.)\n * and configure tool rendering behavior. If not provided, default components will be used.\n */\n components:\n | {\n /** Component for rendering empty messages */\n Empty?: EmptyMessagePartComponent | undefined;\n /** Component for rendering text content */\n Text?: TextMessagePartComponent | undefined;\n /** Component for rendering reasoning content (typically hidden) */\n Reasoning?: ReasoningMessagePartComponent | undefined;\n /** Component for rendering source content */\n Source?: SourceMessagePartComponent | undefined;\n /** Component for rendering image content */\n Image?: ImageMessagePartComponent | undefined;\n /** Component for rendering file content */\n File?: FileMessagePartComponent | undefined;\n /** Component for rendering audio content (experimental) */\n Unstable_Audio?: Unstable_AudioMessagePartComponent | undefined;\n /** Configuration for data part rendering */\n data?:\n | {\n /** Map data event names to specific components */\n by_name?:\n | Record<string, DataMessagePartComponent | undefined>\n | undefined;\n /** Fallback component for unmatched data events */\n Fallback?: DataMessagePartComponent | undefined;\n }\n | undefined;\n /** Configuration for tool call rendering */\n tools?:\n | {\n /** Map of tool names to their specific components */\n by_name?:\n | Record<string, ToolCallMessagePartComponent | undefined>\n | undefined;\n /** Fallback component for unregistered tools */\n Fallback?: ComponentType<ToolCallMessagePartProps> | undefined;\n }\n | {\n /** Override component that handles all tool calls */\n Override: ComponentType<ToolCallMessagePartProps>;\n }\n | undefined;\n\n /**\n * Component for rendering grouped message parts.\n *\n * When provided, this component will automatically wrap message parts that share\n * the same group key as determined by the groupingFunction.\n *\n * The component receives:\n * - `groupKey`: The group key (or undefined for ungrouped parts)\n * - `indices`: Array of indices for the parts in this group\n * - `children`: The rendered message part components\n *\n * @example\n * ```tsx\n * // Collapsible group\n * Group: ({ groupKey, indices, children }) => {\n * if (!groupKey) return <>{children}</>;\n * return (\n * <details className=\"message-group\">\n * <summary>\n * Group {groupKey} ({indices.length} parts)\n * </summary>\n * <div className=\"group-content\">\n * {children}\n * </div>\n * </details>\n * );\n * }\n * ```\n *\n * @param groupKey - The group key (undefined for ungrouped parts)\n * @param indices - Array of indices for the parts in this group\n * @param children - Rendered message part components to display within the group\n */\n Group?: ComponentType<\n PropsWithChildren<{\n groupKey: string | undefined;\n indices: number[];\n }>\n >;\n }\n | undefined;\n };\n}\n\nconst ToolUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: ToolCallMessagePartComponent | undefined;\n} & ToolCallMessagePartProps) => {\n const Render = useAuiState((s) => {\n const Render = s.tools.tools[props.toolName] ?? Fallback;\n if (Array.isArray(Render)) return Render[0] ?? Fallback;\n return Render;\n });\n if (!Render) return null;\n return <Render {...props} />;\n};\n\nconst DataUIDisplay = ({\n Fallback,\n ...props\n}: {\n Fallback: DataMessagePartComponent | undefined;\n} & DataMessagePartProps) => {\n const Render = useAuiState((s) => {\n const Render = s.dataRenderers.renderers[props.name] ?? Fallback;\n if (Array.isArray(Render)) return Render[0] ?? Fallback;\n return Render;\n });\n if (!Render) return null;\n return <Render {...props} />;\n};\n\nconst defaultComponents = {\n Text: () => (\n <p style={{ whiteSpace: \"pre-line\" }}>\n <MessagePartPrimitiveText />\n <MessagePartPrimitiveInProgress>\n <span style={{ fontFamily: \"revert\" }}>{\" \\u25CF\"}</span>\n </MessagePartPrimitiveInProgress>\n </p>\n ),\n Reasoning: () => null,\n Source: () => null,\n Image: () => <MessagePartPrimitiveImage />,\n File: () => null,\n Unstable_Audio: () => null,\n Group: ({ children }) => children,\n} satisfies MessagePrimitiveUnstable_PartsGrouped.Props[\"components\"];\n\ntype MessagePartComponentProps = {\n components: MessagePrimitiveUnstable_PartsGrouped.Props[\"components\"];\n};\n\nconst MessagePartComponent: FC<MessagePartComponentProps> = ({\n components: {\n Text = defaultComponents.Text,\n Reasoning = defaultComponents.Reasoning,\n Image = defaultComponents.Image,\n Source = defaultComponents.Source,\n File = defaultComponents.File,\n Unstable_Audio: Audio = defaultComponents.Unstable_Audio,\n tools = {},\n data,\n } = {},\n}) => {\n const aui = useAui();\n const part = useAuiState((s) => s.part);\n\n const type = part.type;\n if (type === \"tool-call\") {\n const addResult = aui.part().addToolResult;\n const resume = aui.part().resumeToolCall;\n const respondToApproval = aui.part().respondToToolApproval;\n if (\"Override\" in tools)\n return (\n <tools.Override\n {...part}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n const Tool = tools.by_name?.[part.toolName] ?? tools.Fallback;\n return (\n <ToolUIDisplay\n {...part}\n Fallback={Tool}\n addResult={addResult}\n resume={resume}\n respondToApproval={respondToApproval}\n />\n );\n }\n\n if (part.status?.type === \"requires-action\")\n throw new Error(\"Encountered unexpected requires-action status\");\n\n switch (type) {\n case \"text\":\n return <Text {...part} />;\n\n case \"reasoning\":\n return <Reasoning {...part} />;\n\n case \"source\":\n return <Source {...part} />;\n\n case \"image\":\n return <Image {...part} />;\n\n case \"file\":\n return <File {...part} />;\n\n case \"audio\":\n return <Audio {...part} />;\n\n case \"data\": {\n const Data = data?.by_name?.[part.name] ?? data?.Fallback;\n return <DataUIDisplay {...part} Fallback={Data} />;\n }\n\n default:\n console.warn(`Unknown message part type: ${type}`);\n return null;\n }\n};\n\ntype MessagePartProps = {\n partIndex: number;\n components: MessagePrimitiveUnstable_PartsGrouped.Props[\"components\"];\n};\n\nconst MessagePartImpl: FC<MessagePartProps> = ({ partIndex, components }) => {\n return (\n <PartByIndexProvider index={partIndex}>\n <MessagePartComponent components={components} />\n </PartByIndexProvider>\n );\n};\n\nconst MessagePart = memo(\n MessagePartImpl,\n (prev, next) =>\n prev.partIndex === next.partIndex &&\n prev.components?.Text === next.components?.Text &&\n prev.components?.Reasoning === next.components?.Reasoning &&\n prev.components?.Source === next.components?.Source &&\n prev.components?.Image === next.components?.Image &&\n prev.components?.File === next.components?.File &&\n prev.components?.Unstable_Audio === next.components?.Unstable_Audio &&\n prev.components?.tools === next.components?.tools &&\n prev.components?.data === next.components?.data &&\n prev.components?.Group === next.components?.Group,\n);\n\nconst EmptyPartFallback: FC<{\n status: MessagePartStatus;\n component: TextMessagePartComponent;\n}> = ({ status, component: Component }) => {\n return (\n <TextMessagePartProvider text=\"\" isRunning={status.type === \"running\"}>\n <Component type=\"text\" text=\"\" status={status} />\n </TextMessagePartProvider>\n );\n};\n\nconst COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\n\nconst EmptyPartsImpl: FC<MessagePartComponentProps> = ({ components }) => {\n const status = useAuiState(\n (s) => (s.message.status ?? COMPLETE_STATUS) as MessagePartStatus,\n );\n\n if (components?.Empty) return <components.Empty status={status} />;\n\n return (\n <EmptyPartFallback\n status={status}\n component={components?.Text ?? defaultComponents.Text}\n />\n );\n};\n\nconst EmptyParts = memo(\n EmptyPartsImpl,\n (prev, next) =>\n prev.components?.Empty === next.components?.Empty &&\n prev.components?.Text === next.components?.Text,\n);\n\n/**\n * Renders the parts of a message grouped by a custom grouping function.\n *\n * This component allows you to group message parts based on any criteria you define.\n * The grouping function receives all message parts and returns an array of groups,\n * where each group has a key and an array of part indices.\n *\n * @deprecated Prefer `<MessagePrimitive.GroupedParts>` for adjacent\n * grouping — it dispatches all rendering through one `switch (part.type)`\n * and supports nested group paths. Keep this primitive only for\n * non-adjacent clustering (e.g., gathering parts with the same parent-id\n * across the message).\n *\n * @example\n * ```tsx\n * // Group by parent ID (default behavior)\n * <MessagePrimitive.Unstable_PartsGrouped\n * components={{\n * Text: ({ text }) => <p className=\"message-text\">{text}</p>,\n * Image: ({ image }) => <img src={image} alt=\"Message image\" />,\n * Group: ({ groupKey, indices, children }) => {\n * if (!groupKey) return <>{children}</>;\n * return (\n * <div className=\"parent-group border rounded p-4\">\n * <h4>Parent ID: {groupKey}</h4>\n * {children}\n * </div>\n * );\n * }\n * }}\n * />\n * ```\n */\nexport const MessagePrimitiveUnstable_PartsGrouped: FC<\n MessagePrimitiveUnstable_PartsGrouped.Props\n> = ({ groupingFunction, components }) => {\n const contentLength = useAuiState((s) => s.message.parts.length);\n const messageGroups = useMessagePartsGrouped(groupingFunction);\n\n const partsElements = useMemo(() => {\n if (contentLength === 0) {\n return <EmptyParts components={components} />;\n }\n\n return messageGroups.map((group, groupIndex) => {\n const GroupComponent = components?.Group ?? defaultComponents.Group;\n\n return (\n <GroupComponent\n key={`group-${groupIndex}-${group.groupKey ?? \"ungrouped\"}`}\n groupKey={group.groupKey}\n indices={group.indices}\n >\n {group.indices.map((partIndex) => (\n <MessagePart\n key={partIndex}\n partIndex={partIndex}\n components={components}\n />\n ))}\n </GroupComponent>\n );\n });\n }, [messageGroups, components, contentLength]);\n\n return <>{partsElements}</>;\n};\n\nMessagePrimitiveUnstable_PartsGrouped.displayName =\n \"MessagePrimitive.Unstable_PartsGrouped\";\n\n/**\n * Renders the parts of a message grouped by their parent ID.\n * This is a convenience wrapper around Unstable_PartsGrouped with parent ID grouping.\n *\n * @deprecated Use MessagePrimitive.Unstable_PartsGrouped instead for more flexibility\n */\nexport const MessagePrimitiveUnstable_PartsGroupedByParentId: FC<\n Omit<MessagePrimitiveUnstable_PartsGrouped.Props, \"groupingFunction\">\n> = ({ components, ...props }) => {\n return (\n <MessagePrimitiveUnstable_PartsGrouped\n {...props}\n components={components}\n groupingFunction={groupMessagePartsByParentId}\n />\n );\n};\n\nMessagePrimitiveUnstable_PartsGroupedByParentId.displayName =\n \"MessagePrimitive.Unstable_PartsGroupedByParentId\";\n"],"mappings":";;;;;;;;;;;;;;;;AA0CA,MAAM+B,+BACJD,UACuB;CAEvB,MAAME,2BAAW,IAAIC,IAAsB;CAG3C,KAAK,IAAIC,IAAI,GAAGA,IAAIJ,MAAMK,QAAQD,KAAK;EAKrC,MAAMI,UAJOR,MAAMI,EACE,EAAEG,YAGK,eAAeH;EAG3C,MAAMN,UAAUI,SAASO,IAAID,OAAO,KAAK,CAAA;EACzCV,QAAQY,KAAKN,CAAC;EACdF,SAASS,IAAIH,SAASV,OAAO;CAC/B;CAGA,MAAMc,SAA6B,CAAA;CACnC,KAAK,MAAM,CAACJ,SAASV,YAAYI,UAAU;EAEzC,MAAML,WAAWW,QAAQK,WAAW,cAAc,IAAIC,KAAAA,IAAYN;EAClEI,OAAOF,KAAK;GAAEb;GAAUC;EAAQ,CAAC;CACnC;CAEA,OAAOc;AACT;AAEA,MAAMG,0BAAyBC,qBAAA;CAAA,MAAAC,IAAA9C,EAAA,CAAA;CAG7B,MAAA6B,QAAcvB,YAAYyC,KAAsB;CAAE,IAAAC;CAAAC,KAAA;EAGhD,IAAIpB,MAAKK,WAAY,GAAC;GAAA,IAAAgB;GAAA,IAAAJ,EAAA,OAAAK,OAAAC,IAAA,2BAAA,GAAA;IACbF,KAAA,CAAA;IAAEJ,EAAA,KAAAI;GAAA,OAAAA,KAAAJ,EAAA;GAATE,KAAOE;GAAP,MAAAD;EAAU;EACX,IAAAC;EAAA,IAAAJ,EAAA,OAAAD,oBAAAC,EAAA,OAAAjB,OAAA;GACMqB,KAAAL,iBAAiBhB,KAAK;GAACiB,EAAA,KAAAD;GAAAC,EAAA,KAAAjB;GAAAiB,EAAA,KAAAI;EAAA,OAAAA,KAAAJ,EAAA;EAA9BE,KAAOE;CAAwB;CAAA,OAJ1BF;AAKsB;AA+I/B,MAAMsB,iBAAgBtB,OAAA;CAAA,MAAAF,IAAA9C,EAAA,CAAA;CAAA,IAAAkE;CAAA,IAAAK;CAAA,IAAAzB,EAAA,OAAAE,IAAA;EAAC,CAAA,CAAAkB,aAAAK,SAAAvB;EAKKF,EAAA,KAAAE;EAAAF,EAAA,KAAAoB;EAAApB,EAAA,KAAAyB;CAAA,OAAA;EAAAL,WAAApB,EAAA;EAAAyB,QAAAzB,EAAA;CAAA;CAAA,IAAAI;CAAA,IAAAJ,EAAA,OAAAoB,YAAApB,EAAA,OAAAyB,MAAAC,UAAA;EACCtB,MAAAuB,MAAA;GACzB,MAAAC,SAAeD,EAACN,MAAMA,MAAOI,MAAKC,aAAnBN;GACf,IAAIS,MAAKC,QAASF,MAAM,GAAC,OAASA,OAAM,MAANR;GAAsB,OACjDQ;EAAM;EACd5B,EAAA,KAAAoB;EAAApB,EAAA,KAAAyB,MAAAC;EAAA1B,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAJD,MAAA+B,WAAevE,YAAY4C,EAI1B;CACD,IAAI,CAACwB,UAAM,OAAS;CAAK,IAAAI;CAAA,IAAAhC,EAAA,OAAA+B,YAAA/B,EAAA,OAAAyB,OAAA;EAClBO,KAAA,oBAAC,UAAD,EAAO,GAAKP,MAAK,CAAA;EAAIzB,EAAA,KAAA+B;EAAA/B,EAAA,KAAAyB;EAAAzB,EAAA,KAAAgC;CAAA,OAAAA,KAAAhC,EAAA;CAAA,OAArBgC;AAAqB;AAG9B,MAAMC,iBAAgB/B,OAAA;CAAA,MAAAF,IAAA9C,EAAA,CAAA;CAAA,IAAAkE;CAAA,IAAAK;CAAA,IAAAzB,EAAA,OAAAE,IAAA;EAAC,CAAA,CAAAkB,aAAAK,SAAAvB;EAKCF,EAAA,KAAAE;EAAAF,EAAA,KAAAoB;EAAApB,EAAA,KAAAyB;CAAA,OAAA;EAAAL,WAAApB,EAAA;EAAAyB,QAAAzB,EAAA;CAAA;CAAA,IAAAI;CAAA,IAAAJ,EAAA,OAAAoB,YAAApB,EAAA,OAAAyB,MAAAS,MAAA;EACK9B,MAAAuB,MAAA;GACzB,MAAAC,SAAeD,EAACQ,cAAcC,UAAWX,MAAKS,SAA/Bd;GACf,IAAIS,MAAKC,QAASF,MAAM,GAAC,OAASA,OAAM,MAANR;GAAsB,OACjDQ;EAAM;EACd5B,EAAA,KAAAoB;EAAApB,EAAA,KAAAyB,MAAAS;EAAAlC,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAJD,MAAA+B,WAAevE,YAAY4C,EAI1B;CACD,IAAI,CAACwB,UAAM,OAAS;CAAK,IAAAI;CAAA,IAAAhC,EAAA,OAAA+B,YAAA/B,EAAA,OAAAyB,OAAA;EAClBO,KAAA,oBAAC,UAAD,EAAO,GAAKP,MAAK,CAAA;EAAIzB,EAAA,KAAA+B;EAAA/B,EAAA,KAAAyB;EAAAzB,EAAA,KAAAgC;CAAA,OAAAA,KAAAhC,EAAA;CAAA,OAArBgC;AAAqB;AAG9B,MAAMK,oBAAoB;CACxB1B,YACE,qBAAC,KAAD;EAAG,OAAO,EAAE2B,YAAY,WAAW;YAAnC,CACE,oBAAC,0BAAD,CAAyB,CAAA,GACzB,oBAAC,gCAAD,EAAA,UACE,oBAAC,QAAD;GAAM,OAAO,EAAEC,YAAY,SAAS;aAAI;EAAgB,CAAA,EAC1B,CAAA,CAC/B;;CAEL3B,iBAAiB;CACjBC,cAAc;CACdC,aAAa,oBAAC,2BAAD,CAA0B,CAAA;CACvCC,YAAY;CACZC,sBAAsB;CACtBO,QAAQ,EAAEiB,eAAeA;AAC3B;AAMA,MAAME,wBAAsDxC,OAAA;CAAA,MAAAF,IAAA9C,EAAA,EAAA;CAAC,MAAA,EAAAuD,YAAAL,OAAAF;CAW5D,IAAA8B;CAAA,IAAAhC,EAAA,OAAAI,IAAA;EAVa4B,KAAA5B,OAAAP,KAAAA,IAAA,CASP,IATOO;EASNJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAgC;CAAA,OAAAA,KAAAhC,EAAA;CATM,MAAA,EAAAW,MAAAgC,IAAA/B,WAAAgC,IAAA9B,OAAA+B,IAAAhC,QAAAiC,IAAA/B,MAAAgC,IAAA/B,gBAAAgC,IAAA3B,OAAA4B,IAAAhC,SAAAe;CACV,MAAArB,OAAAgC,OAAA9C,KAAAA,IAAOwC,kBAAiB1B,OAAxBgC;CACA,MAAA/B,YAAAgC,OAAA/C,KAAAA,IAAYwC,kBAAiBzB,YAA7BgC;CACA,MAAA9B,QAAA+B,OAAAhD,KAAAA,IAAQwC,kBAAiBvB,QAAzB+B;CACA,MAAAhC,SAAAiC,OAAAjD,KAAAA,IAASwC,kBAAiBxB,SAA1BiC;CACA,MAAA/B,OAAAgC,OAAAlD,KAAAA,IAAOwC,kBAAiBtB,OAAxBgC;CACgB,MAAAG,QAAAF,OAAAnD,KAAAA,IAAQwC,kBAAiBrB,iBAAzBgC;CAAwC,IAAAG;CAAA,IAAAnD,EAAA,OAAAiD,IAAA;EACxDE,MAAAF,OAAApD,KAAAA,IAAA,CAAS,IAAToD;EAAUjD,EAAA,KAAAiD;EAAAjD,EAAA,KAAAmD;CAAA,OAAAA,MAAAnD,EAAA;CAAV,MAAAqB,QAAA8B;CAIF,MAAAC,MAAY3F,OAAO;CACnB,MAAA4B,OAAa7B,YAAY6F,MAAa;CAEtC,MAAAC,OAAajE,KAAIiE;CACjB,IAAIA,SAAS,aAAW;EAAA,IAAAC;EAAA,IAAAvD,EAAA,OAAAoD,KAAA;GACJG,MAAAH,IAAG/D,KAAM;GAACW,EAAA,KAAAoD;GAAApD,EAAA,KAAAuD;EAAA,OAAAA,MAAAvD,EAAA;EAA5B,MAAAwD,YAAkBD,IAAUE;EAAe,IAAAC;EAAA,IAAA1D,EAAA,OAAAoD,KAAA;GAC5BM,MAAAN,IAAG/D,KAAM;GAACW,EAAA,KAAAoD;GAAApD,EAAA,KAAA0D;EAAA,OAAAA,MAAA1D,EAAA;EAAzB,MAAA2D,SAAeD,IAAUE;EAAgB,IAAAC;EAAA,IAAA7D,EAAA,OAAAoD,KAAA;GACfS,MAAAT,IAAG/D,KAAM;GAACW,EAAA,KAAAoD;GAAApD,EAAA,KAAA6D;EAAA,OAAAA,MAAA7D,EAAA;EAApC,MAAA8D,oBAA0BD,IAAUE;EACpC,IAAI,cAAc1C,OAAK;GAAA,IAAA2C;GAAA,IAAAhE,EAAA,QAAAwD,aAAAxD,EAAA,QAAAX,QAAAW,EAAA,QAAA8D,qBAAA9D,EAAA,QAAA2D,UAAA3D,EAAA,QAAAqB,MAAAC,UAAA;IAEnB0C,MAAA,oBAAA,MAAA,UAAA;KAAA,GACM3E;KACOmE;KACHG;KACWG;IAAiB,CAAA;IACpC9D,EAAA,MAAAwD;IAAAxD,EAAA,MAAAX;IAAAW,EAAA,MAAA8D;IAAA9D,EAAA,MAAA2D;IAAA3D,EAAA,MAAAqB,MAAAC;IAAAtB,EAAA,MAAAgE;GAAA,OAAAA,MAAAhE,EAAA;GAAA,OALFgE;EAKE;EAEN,MAAAC,OAAa5C,MAAKH,UAAW7B,KAAIqC,aAAcL,MAAKD;EAAU,IAAA4C;EAAA,IAAAhE,EAAA,QAAAiE,QAAAjE,EAAA,QAAAwD,aAAAxD,EAAA,QAAAX,QAAAW,EAAA,QAAA8D,qBAAA9D,EAAA,QAAA2D,QAAA;GAE5DK,MAAA,oBAAC,eAAD;IAAc,GACR3E;IACM4E,UAAAA;IACCT;IACHG;IACWG;GAAiB,CAAA;GACpC9D,EAAA,MAAAiE;GAAAjE,EAAA,MAAAwD;GAAAxD,EAAA,MAAAX;GAAAW,EAAA,MAAA8D;GAAA9D,EAAA,MAAA2D;GAAA3D,EAAA,MAAAgE;EAAA,OAAAA,MAAAhE,EAAA;EAAA,OANFgE;CAME;CAIN,IAAI3E,KAAI6E,QAAaZ,SAAK,mBACxB,MAAM,IAAIa,MAAM,+CAA+C;CAEjE,QAAQb,MAAR;EAAY,KACL,QAAM;GAAA,IAAAC;GAAA,IAAAvD,EAAA,QAAAW,QAAAX,EAAA,QAAAX,MAAA;IACFkE,MAAA,oBAAC,MAAD,EAAK,GAAKlE,KAAI,CAAA;IAAIW,EAAA,MAAAW;IAAAX,EAAA,MAAAX;IAAAW,EAAA,MAAAuD;GAAA,OAAAA,MAAAvD,EAAA;GAAA,OAAlBuD;EAAkB;EAAA,KAEtB,aAAW;GAAA,IAAAA;GAAA,IAAAvD,EAAA,QAAAY,aAAAZ,EAAA,QAAAX,MAAA;IACPkE,MAAA,oBAAC,WAAD,EAAU,GAAKlE,KAAI,CAAA;IAAIW,EAAA,MAAAY;IAAAZ,EAAA,MAAAX;IAAAW,EAAA,MAAAuD;GAAA,OAAAA,MAAAvD,EAAA;GAAA,OAAvBuD;EAAuB;EAAA,KAE3B,UAAQ;GAAA,IAAAA;GAAA,IAAAvD,EAAA,QAAAa,UAAAb,EAAA,QAAAX,MAAA;IACJkE,MAAA,oBAAC,QAAD,EAAO,GAAKlE,KAAI,CAAA;IAAIW,EAAA,MAAAa;IAAAb,EAAA,MAAAX;IAAAW,EAAA,MAAAuD;GAAA,OAAAA,MAAAvD,EAAA;GAAA,OAApBuD;EAAoB;EAAA,KAExB,SAAO;GAAA,IAAAA;GAAA,IAAAvD,EAAA,QAAAc,SAAAd,EAAA,QAAAX,MAAA;IACHkE,MAAA,oBAAC,OAAD,EAAM,GAAKlE,KAAI,CAAA;IAAIW,EAAA,MAAAc;IAAAd,EAAA,MAAAX;IAAAW,EAAA,MAAAuD;GAAA,OAAAA,MAAAvD,EAAA;GAAA,OAAnBuD;EAAmB;EAAA,KAEvB,QAAM;GAAA,IAAAA;GAAA,IAAAvD,EAAA,QAAAe,QAAAf,EAAA,QAAAX,MAAA;IACFkE,MAAA,oBAAC,MAAD,EAAK,GAAKlE,KAAI,CAAA;IAAIW,EAAA,MAAAe;IAAAf,EAAA,MAAAX;IAAAW,EAAA,MAAAuD;GAAA,OAAAA,MAAAvD,EAAA;GAAA,OAAlBuD;EAAkB;EAAA,KAEtB,SAAO;GAAA,IAAAA;GAAA,IAAAvD,EAAA,QAAAkD,SAAAlD,EAAA,QAAAX,MAAA;IACHkE,MAAA,oBAAC,OAAD,EAAM,GAAKlE,KAAI,CAAA;IAAIW,EAAA,MAAAkD;IAAAlD,EAAA,MAAAX;IAAAW,EAAA,MAAAuD;GAAA,OAAAA,MAAAvD,EAAA;GAAA,OAAnBuD;EAAmB;EAAA,KAEvB,QAAM;GACT,MAAAa,OAAanD,MAAIC,UAAY7B,KAAI6C,SAAUjB,MAAIG;GAAW,IAAAmC;GAAA,IAAAvD,EAAA,QAAAoE,QAAApE,EAAA,QAAAX,MAAA;IACnDkE,MAAA,oBAAC,eAAD;KAAc,GAAKlE;KAAgB+E,UAAAA;IAAI,CAAA;IAAIpE,EAAA,MAAAoE;IAAApE,EAAA,MAAAX;IAAAW,EAAA,MAAAuD;GAAA,OAAAA,MAAAvD,EAAA;GAAA,OAA3CuD;EAA2C;EAAA;GAIlDc,QAAOC,KAAM,8BAA8BhB,MAAM;GAAC,OAC3C;CACX;AAAC;AAQH,MAAMmB,mBAAwCvE,OAAA;CAAA,MAAAF,IAAA9C,EAAA,CAAA;CAAC,MAAA,EAAAsH,WAAA/D,eAAAP;CAAyB,IAAAE;CAAA,IAAAJ,EAAA,OAAAS,YAAA;EAGlEL,KAAA,oBAAC,sBAAD,EAAkCK,WAAU,CAAA;EAAIT,EAAA,KAAAS;EAAAT,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAgC;CAAA,IAAAhC,EAAA,OAAAwE,aAAAxE,EAAA,OAAAI,IAAA;EADlD4B,KAAA,oBAAC,qBAAD;GAA4BwC,OAAAA;aAC1BpE;EADkB,CAAA;EAEEJ,EAAA,KAAAwE;EAAAxE,EAAA,KAAAI;EAAAJ,EAAA,KAAAgC;CAAA,OAAAA,KAAAhC,EAAA;CAAA,OAFtBgC;AAEsB;AAI1B,MAAM0C,cAAcrH,KAClBoH,kBACCE,MAAMC,SACLD,KAAKH,cAAcI,KAAKJ,aACxBG,KAAKlE,YAAYE,SAASiE,KAAKnE,YAAYE,QAC3CgE,KAAKlE,YAAYG,cAAcgE,KAAKnE,YAAYG,aAChD+D,KAAKlE,YAAYI,WAAW+D,KAAKnE,YAAYI,UAC7C8D,KAAKlE,YAAYK,UAAU8D,KAAKnE,YAAYK,SAC5C6D,KAAKlE,YAAYM,SAAS6D,KAAKnE,YAAYM,QAC3C4D,KAAKlE,YAAYO,mBAAmB4D,KAAKnE,YAAYO,kBACrD2D,KAAKlE,YAAYY,UAAUuD,KAAKnE,YAAYY,SAC5CsD,KAAKlE,YAAYQ,SAAS2D,KAAKnE,YAAYQ,QAC3C0D,KAAKlE,YAAYc,UAAUqD,KAAKnE,YAAYc,KAChD;AAEA,MAAMsD,qBAGD3E,OAAA;CAAA,MAAAF,IAAA9C,EAAA,CAAA;CAAC,MAAA,EAAAgH,QAAAY,WAAAC,cAAA7E;CAE0C,MAAAE,KAAA8D,OAAMZ,SAAU;CAAS,IAAAtB;CAAA,IAAAhC,EAAA,OAAA+E,aAAA/E,EAAA,OAAAkE,QAAA;EACnElC,KAAA,oBAAC,WAAD;GAAgB,MAAA;GAAY,MAAA;GAAWkC;EAAM,CAAA;EAAIlE,EAAA,KAAA+E;EAAA/E,EAAA,KAAAkE;EAAAlE,EAAA,KAAAgC;CAAA,OAAAA,KAAAhC,EAAA;CAAA,IAAA2C;CAAA,IAAA3C,EAAA,OAAAI,MAAAJ,EAAA,OAAAgC,IAAA;EADnDW,KAAA,oBAAC,yBAAD;GAA8B,MAAA;GAAc,WAAAvC;aAC1C4B;EADsB,CAAA;EAEEhC,EAAA,KAAAI;EAAAJ,EAAA,KAAAgC;EAAAhC,EAAA,KAAA2C;CAAA,OAAAA,KAAA3C,EAAA;CAAA,OAF1B2C;AAE0B;AAI9B,MAAMqC,kBAAqCC,OAAOC,OAAO,EACvD5B,MAAM,WACR,CAAC;AAED,MAAM6B,kBAAgDjF,OAAA;CAAA,MAAAF,IAAA9C,EAAA,CAAA;CAAC,MAAA,EAAAuD,eAAAP;CACrD,MAAAgE,SAAe1G,YACb4H,MACF;CAEA,IAAI3E,YAAUC,OAAO;EAAA,IAAAN;EAAA,IAAAJ,EAAA,OAAAS,WAAAC,SAAAV,EAAA,OAAAkE,QAAA;GAAS9D,KAAA,oBAAA,WAAA,OAAA,EAA0B8D,OAAM,CAAA;GAAIlE,EAAA,KAAAS,WAAAC;GAAAV,EAAA,KAAAkE;GAAAlE,EAAA,KAAAI;EAAA,OAAAA,KAAAJ,EAAA;EAAA,OAApCI;CAAoC;CAKnD,MAAAA,KAAAK,YAAUE,QAAU0B,kBAAiB1B;CAAK,IAAAqB;CAAA,IAAAhC,EAAA,OAAAkE,UAAAlE,EAAA,OAAAI,IAAA;EAFvD4B,KAAA,oBAAC,mBAAD;GACUkC;GACG,WAAA9D;EAA0C,CAAA;EACrDJ,EAAA,KAAAkE;EAAAlE,EAAA,KAAAI;EAAAJ,EAAA,KAAAgC;CAAA,OAAAA,KAAAhC,EAAA;CAAA,OAHFgC;AAGE;AAIN,MAAMqD,aAAahI,KACjB8H,iBACCR,MAAMC,SACLD,KAAKlE,YAAYC,UAAUkE,KAAKnE,YAAYC,SAC5CiE,KAAKlE,YAAYE,SAASiE,KAAKnE,YAAYE,IAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,MAAaJ,yCAETL,OAAA;CAAA,MAAAF,IAAA9C,EAAA,CAAA;CAAC,MAAA,EAAA6C,kBAAAU,eAAAP;CACH,MAAAoF,gBAAsB9H,YAAY+H,MAA6B;CAC/D,MAAAC,gBAAsB1F,uBAAuBC,gBAAgB;CAAE,IAAAK;CAAAD,KAAA;EAG7D,IAAImF,kBAAkB,GAAC;GAAA,IAAAtD;GAAA,IAAAhC,EAAA,OAAAS,YAAA;IACduB,KAAA,oBAAC,YAAD,EAAwBvB,WAAU,CAAA;IAAIT,EAAA,KAAAS;IAAAT,EAAA,KAAAgC;GAAA,OAAAA,KAAAhC,EAAA;GAA7CI,KAAO4B;GAAP,MAAA7B;EAA8C;EAC/C,IAAA6B;EAAA,IAAAhC,EAAA,OAAAS,cAAAT,EAAA,OAAAwF,eAAA;GAAA,IAAA7C;GAAA,IAAA3C,EAAA,OAAAS,YAAA;IAEwBkC,MAAA8C,OAAAC,eAAA;KAC6C,OAGlE,oBAHqBjF,YAAUc,SAAWc,kBAAiBd,OAG3D;MAEY,UAAAkE,MAAK7G;MACN,SAAA6G,MAAK5G;gBAEb4G,MAAK5G,QAAQ+G,KAAKpB,cACjB,oBAAC,aAAD;OAEaA;OACC/D;MAAU,GAFjB+D,SAEiB,CAEzB;KAXY,GACR,SAASkB,WAAU,GAAID,MAAK7G,YAAL,aADf;IAYE;IAEpBoB,EAAA,KAAAS;IAAAT,EAAA,KAAA2C;GAAA,OAAAA,KAAA3C,EAAA;GAlBMgC,KAAAwD,cAAaI,IAAKjD,EAkBxB;GAAC3C,EAAA,KAAAS;GAAAT,EAAA,KAAAwF;GAAAxF,EAAA,KAAAgC;EAAA,OAAAA,KAAAhC,EAAA;EAlBFI,KAAO4B;CAkBJ;CAvBL,MAAA6D,gBAAsBzF;CAwByB,IAAA4B;CAAA,IAAAhC,EAAA,OAAA6F,eAAA;EAExC7D,KAAA,oBAAA,UAAA,EAAA,UAAG6D,cAAa,CAAA;EAAI7F,EAAA,KAAA6F;EAAA7F,EAAA,KAAAgC;CAAA,OAAAA,KAAAhC,EAAA;CAAA,OAApBgC;AAAoB;AAG7BzB,sCAAsCuF,cACpC;;;;;;;AAQF,MAAaC,mDAET7F,OAAA;CAAA,MAAAF,IAAA9C,EAAA,CAAA;CAAA,IAAAuD;CAAA,IAAAgB;CAAA,IAAAzB,EAAA,OAAAE,IAAA;EAAC,CAAA,CAAAO,eAAAgB,SAAAvB;EAAwBF,EAAA,KAAAE;EAAAF,EAAA,KAAAS;EAAAT,EAAA,KAAAyB;CAAA,OAAA;EAAAhB,aAAAT,EAAA;EAAAyB,QAAAzB,EAAA;CAAA;CAAA,IAAAI;CAAA,IAAAJ,EAAA,OAAAS,cAAAT,EAAA,OAAAyB,OAAA;EAEzBrB,KAAA,oBAAC,uCAAD;GAAsC,GAChCqB;GACQhB;GACMzB,kBAAAA;EAA2B,CAAA;EAC7CgB,EAAA,KAAAS;EAAAT,EAAA,KAAAyB;EAAAzB,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,OAJFI;AAIE;AAIN2F,gDAAgDD,cAC9C;AAjb6B,SAAA7F,MAAA0B,GAAA;CAAA,OAGIA,EAACsE,QAAQlH;AAAM;AAyMU,SAAAsE,OAAA1B,GAAA;CAAA,OAa1BA,EAACtC;AAAK;AAwGc,SAAA+F,OAAAzD,GAAA;CAAA,OAE1CA,EAACsE,QAAQ/B,UAATc;AAAyD;AAuDjE,SAAAO,OAAA5D,GAAA;CAAA,OACuCA,EAACsE,QAAQlH,MAAMK;AAAO"}
|
|
@@ -4,80 +4,182 @@ import { Primitive } from "../../utils/Primitive.js";
|
|
|
4
4
|
import { useManagedRef } from "../../utils/hooks/useManagedRef.js";
|
|
5
5
|
import { parseCssLength } from "../thread/topAnchor/topAnchorUtils.js";
|
|
6
6
|
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
7
|
-
import {
|
|
7
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
8
|
+
import { forwardRef } from "@assistant-ui/tap/react-shim";
|
|
8
9
|
import { jsx } from "react/jsx-runtime";
|
|
9
10
|
import { useComposedRefs } from "@radix-ui/react-compose-refs";
|
|
10
11
|
//#region src/primitives/message/MessageRoot.tsx
|
|
11
12
|
const useIsHoveringRef = () => {
|
|
13
|
+
const $ = c(4);
|
|
12
14
|
const aui = useAui();
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
let t0;
|
|
16
|
+
if ($[0] !== aui) {
|
|
17
|
+
t0 = () => aui.message();
|
|
18
|
+
$[0] = aui;
|
|
19
|
+
$[1] = t0;
|
|
20
|
+
} else t0 = $[1];
|
|
21
|
+
const message = useAuiState(t0);
|
|
22
|
+
let t1;
|
|
23
|
+
if ($[2] !== message) {
|
|
24
|
+
t1 = (el) => {
|
|
25
|
+
const handleMouseEnter = () => {
|
|
26
|
+
message.setIsHovering(true);
|
|
27
|
+
};
|
|
28
|
+
const handleMouseLeave = () => {
|
|
29
|
+
message.setIsHovering(false);
|
|
30
|
+
};
|
|
31
|
+
el.addEventListener("mouseenter", handleMouseEnter);
|
|
32
|
+
el.addEventListener("mouseleave", handleMouseLeave);
|
|
33
|
+
if (el.matches(":hover")) queueMicrotask(() => message.setIsHovering(true));
|
|
34
|
+
return () => {
|
|
35
|
+
el.removeEventListener("mouseenter", handleMouseEnter);
|
|
36
|
+
el.removeEventListener("mouseleave", handleMouseLeave);
|
|
37
|
+
message.setIsHovering(false);
|
|
38
|
+
};
|
|
17
39
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
el.addEventListener("mouseleave", handleMouseLeave);
|
|
23
|
-
if (el.matches(":hover")) queueMicrotask(() => message.setIsHovering(true));
|
|
24
|
-
return () => {
|
|
25
|
-
el.removeEventListener("mouseenter", handleMouseEnter);
|
|
26
|
-
el.removeEventListener("mouseleave", handleMouseLeave);
|
|
27
|
-
message.setIsHovering(false);
|
|
28
|
-
};
|
|
29
|
-
}, [message]));
|
|
40
|
+
$[2] = message;
|
|
41
|
+
$[3] = t1;
|
|
42
|
+
} else t1 = $[3];
|
|
43
|
+
return useManagedRef(t1);
|
|
30
44
|
};
|
|
31
45
|
const useIsTopAnchorUser = () => {
|
|
32
|
-
const
|
|
33
|
-
|
|
46
|
+
const $ = c(2);
|
|
47
|
+
const activeAnchorId = useThreadViewport(_temp);
|
|
48
|
+
let t0;
|
|
49
|
+
if ($[0] !== activeAnchorId) {
|
|
50
|
+
t0 = (s_0) => s_0.message.role === "user" && s_0.message.index > 0 && s_0.message.index === s_0.thread.messages.length - 2 && s_0.thread.messages.at(-1)?.role === "assistant" && (s_0.message.id === activeAnchorId || s_0.thread.isRunning);
|
|
51
|
+
$[0] = activeAnchorId;
|
|
52
|
+
$[1] = t0;
|
|
53
|
+
} else t0 = $[1];
|
|
54
|
+
return useAuiState(t0);
|
|
34
55
|
};
|
|
35
56
|
const useIsTopAnchorTarget = () => {
|
|
36
|
-
const
|
|
37
|
-
|
|
57
|
+
const $ = c(2);
|
|
58
|
+
const activeTargetId = useThreadViewport(_temp2);
|
|
59
|
+
let t0;
|
|
60
|
+
if ($[0] !== activeTargetId) {
|
|
61
|
+
t0 = (s_0) => s_0.message.isLast && s_0.message.role === "assistant" && s_0.message.index >= 1 && s_0.thread.messages.at(s_0.message.index - 1)?.role === "user" && (s_0.message.id === activeTargetId || s_0.thread.isRunning);
|
|
62
|
+
$[0] = activeTargetId;
|
|
63
|
+
$[1] = t0;
|
|
64
|
+
} else t0 = $[1];
|
|
65
|
+
return useAuiState(t0);
|
|
38
66
|
};
|
|
39
67
|
const useTopAnchorUserRef = (active, threadViewportStore) => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
68
|
+
const $ = c(3);
|
|
69
|
+
let t0;
|
|
70
|
+
if ($[0] !== active || $[1] !== threadViewportStore) {
|
|
71
|
+
t0 = (el) => {
|
|
72
|
+
if (!active) return;
|
|
73
|
+
return threadViewportStore.getState().registerAnchorElement(el);
|
|
74
|
+
};
|
|
75
|
+
$[0] = active;
|
|
76
|
+
$[1] = threadViewportStore;
|
|
77
|
+
$[2] = t0;
|
|
78
|
+
} else t0 = $[2];
|
|
79
|
+
return useManagedRef(t0);
|
|
44
80
|
};
|
|
45
|
-
const useTopAnchorTargetRef = (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
81
|
+
const useTopAnchorTargetRef = (t0) => {
|
|
82
|
+
const $ = c(3);
|
|
83
|
+
const { active, threadViewportStore } = t0;
|
|
84
|
+
let t1;
|
|
85
|
+
if ($[0] !== active || $[1] !== threadViewportStore) {
|
|
86
|
+
t1 = (el) => {
|
|
87
|
+
if (!active) return;
|
|
88
|
+
const state = threadViewportStore.getState();
|
|
89
|
+
const clamp = state.topAnchorMessageClamp;
|
|
90
|
+
return state.registerAnchorTargetElement(el, {
|
|
91
|
+
tallerThan: parseCssLength(clamp.tallerThan, el),
|
|
92
|
+
visibleHeight: parseCssLength(clamp.visibleHeight, el)
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
$[0] = active;
|
|
96
|
+
$[1] = threadViewportStore;
|
|
97
|
+
$[2] = t1;
|
|
98
|
+
} else t1 = $[2];
|
|
99
|
+
return useManagedRef(t1);
|
|
55
100
|
};
|
|
56
|
-
const MessagePrimitiveRootDefault = (
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
101
|
+
const MessagePrimitiveRootDefault = (t0) => {
|
|
102
|
+
const $ = c(7);
|
|
103
|
+
let forwardedRef;
|
|
104
|
+
let props;
|
|
105
|
+
if ($[0] !== t0) {
|
|
106
|
+
({forwardedRef, ...props} = t0);
|
|
107
|
+
$[0] = t0;
|
|
108
|
+
$[1] = forwardedRef;
|
|
109
|
+
$[2] = props;
|
|
110
|
+
} else {
|
|
111
|
+
forwardedRef = $[1];
|
|
112
|
+
props = $[2];
|
|
113
|
+
}
|
|
114
|
+
const isHoveringRef = useIsHoveringRef();
|
|
115
|
+
const ref = useComposedRefs(forwardedRef, isHoveringRef);
|
|
116
|
+
const messageId = useAuiState(_temp3);
|
|
117
|
+
let t1;
|
|
118
|
+
if ($[3] !== messageId || $[4] !== props || $[5] !== ref) {
|
|
119
|
+
t1 = /* @__PURE__ */ jsx(Primitive.div, {
|
|
120
|
+
...props,
|
|
121
|
+
ref,
|
|
122
|
+
"data-message-id": messageId
|
|
123
|
+
});
|
|
124
|
+
$[3] = messageId;
|
|
125
|
+
$[4] = props;
|
|
126
|
+
$[5] = ref;
|
|
127
|
+
$[6] = t1;
|
|
128
|
+
} else t1 = $[6];
|
|
129
|
+
return t1;
|
|
64
130
|
};
|
|
65
|
-
const MessagePrimitiveRootTopAnchor = (
|
|
131
|
+
const MessagePrimitiveRootTopAnchor = (t0) => {
|
|
132
|
+
const $ = c(13);
|
|
133
|
+
let forwardedRef;
|
|
134
|
+
let props;
|
|
135
|
+
let threadViewportStore;
|
|
136
|
+
if ($[0] !== t0) {
|
|
137
|
+
({forwardedRef, threadViewportStore, ...props} = t0);
|
|
138
|
+
$[0] = t0;
|
|
139
|
+
$[1] = forwardedRef;
|
|
140
|
+
$[2] = props;
|
|
141
|
+
$[3] = threadViewportStore;
|
|
142
|
+
} else {
|
|
143
|
+
forwardedRef = $[1];
|
|
144
|
+
props = $[2];
|
|
145
|
+
threadViewportStore = $[3];
|
|
146
|
+
}
|
|
66
147
|
const isHoveringRef = useIsHoveringRef();
|
|
67
148
|
const isTopAnchorUser = useIsTopAnchorUser();
|
|
68
149
|
const isTopAnchorTarget = useIsTopAnchorTarget();
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
150
|
+
const topAnchorUserRef = useTopAnchorUserRef(isTopAnchorUser, threadViewportStore);
|
|
151
|
+
let t1;
|
|
152
|
+
if ($[4] !== isTopAnchorTarget || $[5] !== threadViewportStore) {
|
|
153
|
+
t1 = {
|
|
154
|
+
active: isTopAnchorTarget,
|
|
155
|
+
threadViewportStore
|
|
156
|
+
};
|
|
157
|
+
$[4] = isTopAnchorTarget;
|
|
158
|
+
$[5] = threadViewportStore;
|
|
159
|
+
$[6] = t1;
|
|
160
|
+
} else t1 = $[6];
|
|
161
|
+
const topAnchorTargetRef = useTopAnchorTargetRef(t1);
|
|
162
|
+
const ref = useComposedRefs(forwardedRef, isHoveringRef, topAnchorUserRef, topAnchorTargetRef);
|
|
163
|
+
const messageId = useAuiState(_temp4);
|
|
164
|
+
const t2 = isTopAnchorUser ? "" : void 0;
|
|
165
|
+
const t3 = isTopAnchorTarget ? "" : void 0;
|
|
166
|
+
let t4;
|
|
167
|
+
if ($[7] !== messageId || $[8] !== props || $[9] !== ref || $[10] !== t2 || $[11] !== t3) {
|
|
168
|
+
t4 = /* @__PURE__ */ jsx(Primitive.div, {
|
|
169
|
+
...props,
|
|
170
|
+
ref,
|
|
171
|
+
"data-message-id": messageId,
|
|
172
|
+
"data-aui-top-anchor-user": t2,
|
|
173
|
+
"data-aui-top-anchor-target": t3
|
|
174
|
+
});
|
|
175
|
+
$[7] = messageId;
|
|
176
|
+
$[8] = props;
|
|
177
|
+
$[9] = ref;
|
|
178
|
+
$[10] = t2;
|
|
179
|
+
$[11] = t3;
|
|
180
|
+
$[12] = t4;
|
|
181
|
+
} else t4 = $[12];
|
|
182
|
+
return t4;
|
|
81
183
|
};
|
|
82
184
|
/**
|
|
83
185
|
* The root container component for a message.
|
|
@@ -103,18 +205,48 @@ const MessagePrimitiveRootTopAnchor = ({ forwardedRef, threadViewportStore, ...p
|
|
|
103
205
|
* ```
|
|
104
206
|
*/
|
|
105
207
|
const MessagePrimitiveRoot = forwardRef((props, forwardedRef) => {
|
|
208
|
+
const $ = c(7);
|
|
106
209
|
const threadViewportStore = useThreadViewportStore();
|
|
107
|
-
if (threadViewportStore.getState().turnAnchor === "top")
|
|
108
|
-
|
|
109
|
-
forwardedRef
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
210
|
+
if (threadViewportStore.getState().turnAnchor === "top") {
|
|
211
|
+
let t0;
|
|
212
|
+
if ($[0] !== forwardedRef || $[1] !== props || $[2] !== threadViewportStore) {
|
|
213
|
+
t0 = /* @__PURE__ */ jsx(MessagePrimitiveRootTopAnchor, {
|
|
214
|
+
...props,
|
|
215
|
+
forwardedRef,
|
|
216
|
+
threadViewportStore
|
|
217
|
+
});
|
|
218
|
+
$[0] = forwardedRef;
|
|
219
|
+
$[1] = props;
|
|
220
|
+
$[2] = threadViewportStore;
|
|
221
|
+
$[3] = t0;
|
|
222
|
+
} else t0 = $[3];
|
|
223
|
+
return t0;
|
|
224
|
+
}
|
|
225
|
+
let t0;
|
|
226
|
+
if ($[4] !== forwardedRef || $[5] !== props) {
|
|
227
|
+
t0 = /* @__PURE__ */ jsx(MessagePrimitiveRootDefault, {
|
|
228
|
+
...props,
|
|
229
|
+
forwardedRef
|
|
230
|
+
});
|
|
231
|
+
$[4] = forwardedRef;
|
|
232
|
+
$[5] = props;
|
|
233
|
+
$[6] = t0;
|
|
234
|
+
} else t0 = $[6];
|
|
235
|
+
return t0;
|
|
116
236
|
});
|
|
117
237
|
MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
|
|
238
|
+
function _temp(s) {
|
|
239
|
+
return s.topAnchorTurn?.anchorId;
|
|
240
|
+
}
|
|
241
|
+
function _temp2(s) {
|
|
242
|
+
return s.topAnchorTurn?.targetId;
|
|
243
|
+
}
|
|
244
|
+
function _temp3(s) {
|
|
245
|
+
return s.message.id;
|
|
246
|
+
}
|
|
247
|
+
function _temp4(s) {
|
|
248
|
+
return s.message.id;
|
|
249
|
+
}
|
|
118
250
|
//#endregion
|
|
119
251
|
export { MessagePrimitiveRoot };
|
|
120
252
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageRoot.js","names":[],"sources":["../../../src/primitives/message/MessageRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n useCallback,\n} from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\nimport { parseCssLength } from \"../thread/topAnchor/topAnchorUtils\";\n\ntype ThreadViewportStore = NonNullable<\n ReturnType<typeof useThreadViewportStore>\n>;\n\nconst useIsHoveringRef = () => {\n const aui = useAui();\n const message = useAuiState(() => aui.message());\n\n const callbackRef = useCallback(\n (el: HTMLElement) => {\n const handleMouseEnter = () => {\n message.setIsHovering(true);\n };\n const handleMouseLeave = () => {\n message.setIsHovering(false);\n };\n\n el.addEventListener(\"mouseenter\", handleMouseEnter);\n el.addEventListener(\"mouseleave\", handleMouseLeave);\n\n if (el.matches(\":hover\")) {\n // TODO this is needed for SSR to work, figure out why\n queueMicrotask(() => message.setIsHovering(true));\n }\n\n return () => {\n el.removeEventListener(\"mouseenter\", handleMouseEnter);\n el.removeEventListener(\"mouseleave\", handleMouseLeave);\n message.setIsHovering(false);\n };\n },\n [message],\n );\n\n return useManagedRef(callbackRef);\n};\n\nconst useIsTopAnchorUser = () => {\n const activeAnchorId = useThreadViewport((s) => s.topAnchorTurn?.anchorId);\n return useAuiState(\n (s) =>\n s.message.role === \"user\" &&\n s.message.index > 0 &&\n s.message.index === s.thread.messages.length - 2 &&\n s.thread.messages.at(-1)?.role === \"assistant\" &&\n (s.message.id === activeAnchorId || s.thread.isRunning),\n );\n};\n\nconst useIsTopAnchorTarget = () => {\n const activeTargetId = useThreadViewport((s) => s.topAnchorTurn?.targetId);\n return useAuiState(\n (s) =>\n s.message.isLast &&\n s.message.role === \"assistant\" &&\n s.message.index >= 1 &&\n s.thread.messages.at(s.message.index - 1)?.role === \"user\" &&\n (s.message.id === activeTargetId || s.thread.isRunning),\n );\n};\n\nconst useTopAnchorUserRef = (\n active: boolean,\n threadViewportStore: ThreadViewportStore,\n) => {\n const callback = useCallback(\n (el: HTMLElement) => {\n if (!active) return;\n return threadViewportStore.getState().registerAnchorElement(el);\n },\n [active, threadViewportStore],\n );\n\n return useManagedRef<HTMLElement>(callback);\n};\n\nconst useTopAnchorTargetRef = ({\n active,\n threadViewportStore,\n}: {\n active: boolean;\n threadViewportStore: ThreadViewportStore;\n}) => {\n const targetRefCallback = useCallback(\n (el: HTMLElement) => {\n if (!active) return;\n const state = threadViewportStore.getState();\n const clamp = state.topAnchorMessageClamp;\n\n return state.registerAnchorTargetElement(el, {\n tallerThan: parseCssLength(clamp.tallerThan, el),\n visibleHeight: parseCssLength(clamp.visibleHeight, el),\n });\n },\n [active, threadViewportStore],\n );\n\n return useManagedRef<HTMLElement>(targetRefCallback);\n};\n\nexport namespace MessagePrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\ntype MessagePrimitiveRootInternalProps = MessagePrimitiveRoot.Props & {\n forwardedRef: ForwardedRef<MessagePrimitiveRoot.Element>;\n};\n\nconst MessagePrimitiveRootDefault = ({\n forwardedRef,\n ...props\n}: MessagePrimitiveRootInternalProps) => {\n const isHoveringRef = useIsHoveringRef();\n const ref = useComposedRefs<HTMLDivElement>(forwardedRef, isHoveringRef);\n const messageId = useAuiState((s) => s.message.id);\n\n return <Primitive.div {...props} ref={ref} data-message-id={messageId} />;\n};\n\nconst MessagePrimitiveRootTopAnchor = ({\n forwardedRef,\n threadViewportStore,\n ...props\n}: MessagePrimitiveRootInternalProps & {\n threadViewportStore: ThreadViewportStore;\n}) => {\n const isHoveringRef = useIsHoveringRef();\n const isTopAnchorUser = useIsTopAnchorUser();\n const isTopAnchorTarget = useIsTopAnchorTarget();\n const topAnchorUserRef = useTopAnchorUserRef(\n isTopAnchorUser,\n threadViewportStore,\n );\n const topAnchorTargetRef = useTopAnchorTargetRef({\n active: isTopAnchorTarget,\n threadViewportStore,\n });\n const ref = useComposedRefs<HTMLDivElement>(\n forwardedRef,\n isHoveringRef,\n topAnchorUserRef,\n topAnchorTargetRef,\n );\n const messageId = useAuiState((s) => s.message.id);\n\n return (\n <Primitive.div\n {...props}\n ref={ref}\n data-message-id={messageId}\n data-aui-top-anchor-user={isTopAnchorUser ? \"\" : undefined}\n data-aui-top-anchor-target={isTopAnchorTarget ? \"\" : undefined}\n />\n );\n};\n\n/**\n * The root container component for a message.\n *\n * This component provides the foundational wrapper for message content and handles\n * hover state management for the message. It automatically tracks when the user\n * is hovering over the message, which can be used by child components like action bars.\n *\n * When `turnAnchor=\"top\"` is set on the viewport, this component automatically\n * registers itself as the top-anchor user message (when it's the previous user\n * message) or as the top-anchor target (when it's the streaming assistant\n * response). No additional component is required.\n *\n * @example\n * ```tsx\n * <MessagePrimitive.Root>\n * <MessagePrimitive.Content />\n * <ActionBarPrimitive.Root>\n * <ActionBarPrimitive.Copy />\n * <ActionBarPrimitive.Edit />\n * </ActionBarPrimitive.Root>\n * </MessagePrimitive.Root>\n * ```\n */\nexport const MessagePrimitiveRoot = forwardRef<\n MessagePrimitiveRoot.Element,\n MessagePrimitiveRoot.Props\n>((props, forwardedRef) => {\n const threadViewportStore = useThreadViewportStore();\n // turnAnchor is initial-only viewport config (see ThreadViewportProvider).\n const turnAnchor = threadViewportStore.getState().turnAnchor;\n\n if (turnAnchor === \"top\") {\n return (\n <MessagePrimitiveRootTopAnchor\n {...props}\n forwardedRef={forwardedRef}\n threadViewportStore={threadViewportStore}\n />\n );\n }\n return <MessagePrimitiveRootDefault {...props} forwardedRef={forwardedRef} />;\n});\n\nMessagePrimitiveRoot.displayName = \"MessagePrimitive.Root\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MessageRoot.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","ForwardedRef","useCallback","useAui","useAuiState","useManagedRef","useComposedRefs","useThreadViewport","useThreadViewportStore","parseCssLength","ThreadViewportStore","NonNullable","ReturnType","useIsHoveringRef","$","aui","t0","message","t1","el","handleMouseEnter","setIsHovering","handleMouseLeave","addEventListener","matches","queueMicrotask","removeEventListener","callbackRef","useIsTopAnchorUser","activeAnchorId","_temp","s_0","s","role","index","thread","messages","length","at","id","isRunning","useIsTopAnchorTarget","activeTargetId","_temp2","isLast","useTopAnchorUserRef","active","threadViewportStore","getState","registerAnchorElement","callback","useTopAnchorTargetRef","state","clamp","topAnchorMessageClamp","registerAnchorTargetElement","tallerThan","visibleHeight","targetRefCallback","MessagePrimitiveRoot","Element","div","Props","MessagePrimitiveRootInternalProps","forwardedRef","MessagePrimitiveRootDefault","props","isHoveringRef","ref","messageId","_temp3","MessagePrimitiveRootTopAnchor","isTopAnchorUser","isTopAnchorTarget","topAnchorUserRef","topAnchorTargetRef","_temp4","t2","undefined","t3","t4","turnAnchor","displayName","topAnchorTurn","anchorId","targetId"],"sources":["../../../src/primitives/message/MessageRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n useCallback,\n} from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport {\n useThreadViewport,\n useThreadViewportStore,\n} from \"../../context/react/ThreadViewportContext\";\nimport { parseCssLength } from \"../thread/topAnchor/topAnchorUtils\";\n\ntype ThreadViewportStore = NonNullable<\n ReturnType<typeof useThreadViewportStore>\n>;\n\nconst useIsHoveringRef = () => {\n const aui = useAui();\n const message = useAuiState(() => aui.message());\n\n const callbackRef = useCallback(\n (el: HTMLElement) => {\n const handleMouseEnter = () => {\n message.setIsHovering(true);\n };\n const handleMouseLeave = () => {\n message.setIsHovering(false);\n };\n\n el.addEventListener(\"mouseenter\", handleMouseEnter);\n el.addEventListener(\"mouseleave\", handleMouseLeave);\n\n if (el.matches(\":hover\")) {\n // TODO this is needed for SSR to work, figure out why\n queueMicrotask(() => message.setIsHovering(true));\n }\n\n return () => {\n el.removeEventListener(\"mouseenter\", handleMouseEnter);\n el.removeEventListener(\"mouseleave\", handleMouseLeave);\n message.setIsHovering(false);\n };\n },\n [message],\n );\n\n return useManagedRef(callbackRef);\n};\n\nconst useIsTopAnchorUser = () => {\n const activeAnchorId = useThreadViewport((s) => s.topAnchorTurn?.anchorId);\n return useAuiState(\n (s) =>\n s.message.role === \"user\" &&\n s.message.index > 0 &&\n s.message.index === s.thread.messages.length - 2 &&\n s.thread.messages.at(-1)?.role === \"assistant\" &&\n (s.message.id === activeAnchorId || s.thread.isRunning),\n );\n};\n\nconst useIsTopAnchorTarget = () => {\n const activeTargetId = useThreadViewport((s) => s.topAnchorTurn?.targetId);\n return useAuiState(\n (s) =>\n s.message.isLast &&\n s.message.role === \"assistant\" &&\n s.message.index >= 1 &&\n s.thread.messages.at(s.message.index - 1)?.role === \"user\" &&\n (s.message.id === activeTargetId || s.thread.isRunning),\n );\n};\n\nconst useTopAnchorUserRef = (\n active: boolean,\n threadViewportStore: ThreadViewportStore,\n) => {\n const callback = useCallback(\n (el: HTMLElement) => {\n if (!active) return;\n return threadViewportStore.getState().registerAnchorElement(el);\n },\n [active, threadViewportStore],\n );\n\n return useManagedRef<HTMLElement>(callback);\n};\n\nconst useTopAnchorTargetRef = ({\n active,\n threadViewportStore,\n}: {\n active: boolean;\n threadViewportStore: ThreadViewportStore;\n}) => {\n const targetRefCallback = useCallback(\n (el: HTMLElement) => {\n if (!active) return;\n const state = threadViewportStore.getState();\n const clamp = state.topAnchorMessageClamp;\n\n return state.registerAnchorTargetElement(el, {\n tallerThan: parseCssLength(clamp.tallerThan, el),\n visibleHeight: parseCssLength(clamp.visibleHeight, el),\n });\n },\n [active, threadViewportStore],\n );\n\n return useManagedRef<HTMLElement>(targetRefCallback);\n};\n\nexport namespace MessagePrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;\n}\n\ntype MessagePrimitiveRootInternalProps = MessagePrimitiveRoot.Props & {\n forwardedRef: ForwardedRef<MessagePrimitiveRoot.Element>;\n};\n\nconst MessagePrimitiveRootDefault = ({\n forwardedRef,\n ...props\n}: MessagePrimitiveRootInternalProps) => {\n const isHoveringRef = useIsHoveringRef();\n const ref = useComposedRefs<HTMLDivElement>(forwardedRef, isHoveringRef);\n const messageId = useAuiState((s) => s.message.id);\n\n return <Primitive.div {...props} ref={ref} data-message-id={messageId} />;\n};\n\nconst MessagePrimitiveRootTopAnchor = ({\n forwardedRef,\n threadViewportStore,\n ...props\n}: MessagePrimitiveRootInternalProps & {\n threadViewportStore: ThreadViewportStore;\n}) => {\n const isHoveringRef = useIsHoveringRef();\n const isTopAnchorUser = useIsTopAnchorUser();\n const isTopAnchorTarget = useIsTopAnchorTarget();\n const topAnchorUserRef = useTopAnchorUserRef(\n isTopAnchorUser,\n threadViewportStore,\n );\n const topAnchorTargetRef = useTopAnchorTargetRef({\n active: isTopAnchorTarget,\n threadViewportStore,\n });\n const ref = useComposedRefs<HTMLDivElement>(\n forwardedRef,\n isHoveringRef,\n topAnchorUserRef,\n topAnchorTargetRef,\n );\n const messageId = useAuiState((s) => s.message.id);\n\n return (\n <Primitive.div\n {...props}\n ref={ref}\n data-message-id={messageId}\n data-aui-top-anchor-user={isTopAnchorUser ? \"\" : undefined}\n data-aui-top-anchor-target={isTopAnchorTarget ? \"\" : undefined}\n />\n );\n};\n\n/**\n * The root container component for a message.\n *\n * This component provides the foundational wrapper for message content and handles\n * hover state management for the message. It automatically tracks when the user\n * is hovering over the message, which can be used by child components like action bars.\n *\n * When `turnAnchor=\"top\"` is set on the viewport, this component automatically\n * registers itself as the top-anchor user message (when it's the previous user\n * message) or as the top-anchor target (when it's the streaming assistant\n * response). No additional component is required.\n *\n * @example\n * ```tsx\n * <MessagePrimitive.Root>\n * <MessagePrimitive.Content />\n * <ActionBarPrimitive.Root>\n * <ActionBarPrimitive.Copy />\n * <ActionBarPrimitive.Edit />\n * </ActionBarPrimitive.Root>\n * </MessagePrimitive.Root>\n * ```\n */\nexport const MessagePrimitiveRoot = forwardRef<\n MessagePrimitiveRoot.Element,\n MessagePrimitiveRoot.Props\n>((props, forwardedRef) => {\n const threadViewportStore = useThreadViewportStore();\n // turnAnchor is initial-only viewport config (see ThreadViewportProvider).\n const turnAnchor = threadViewportStore.getState().turnAnchor;\n\n if (turnAnchor === \"top\") {\n return (\n <MessagePrimitiveRootTopAnchor\n {...props}\n forwardedRef={forwardedRef}\n threadViewportStore={threadViewportStore}\n />\n );\n }\n return <MessagePrimitiveRootDefault {...props} forwardedRef={forwardedRef} />;\n});\n\nMessagePrimitiveRoot.displayName = \"MessagePrimitive.Root\";\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","names":[],"sources":["../../src/primitives/message.ts"],"sourcesContent":["export { MessagePrimitiveRoot as Root } from \"./message/MessageRoot\";\nexport { MessagePrimitiveParts as Parts } from \"./message/MessageParts\";\nexport { MessagePrimitivePartByIndex as PartByIndex } from \"./message/MessageParts\";\nexport { MessagePrimitiveParts as Content } from \"./message/MessageParts\";\nexport { MessagePrimitiveIf as If } from \"./message/MessageIf\";\nexport { MessagePrimitiveAttachments as Attachments } from \"./message/MessageAttachments\";\nexport { MessagePrimitiveAttachmentByIndex as AttachmentByIndex } from \"./message/MessageAttachments\";\nexport { MessagePrimitiveQuote as Quote } from \"@assistant-ui/core/react\";\nexport { MessagePrimitiveError as Error } from \"./message/MessageError\";\nexport { MessagePrimitiveGroupedParts as GroupedParts } from \"@assistant-ui/core/react\";\nexport { MessagePrimitiveGenerativeUI as GenerativeUI } from \"@assistant-ui/core/react\";\nexport {\n MessagePrimitiveUnstable_PartsGrouped as Unstable_PartsGrouped,\n MessagePrimitiveUnstable_PartsGroupedByParentId as Unstable_PartsGroupedByParentId,\n} from \"./message/MessagePartsGrouped\";\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"message.js","names":["MessagePrimitiveRoot","Root","MessagePrimitiveParts","Parts","MessagePrimitivePartByIndex","PartByIndex","Content","MessagePrimitiveIf","If","MessagePrimitiveAttachments","Attachments","MessagePrimitiveAttachmentByIndex","AttachmentByIndex","MessagePrimitiveQuote","Quote","MessagePrimitiveError","Error","MessagePrimitiveGroupedParts","GroupedParts","MessagePrimitiveGenerativeUI","GenerativeUI","MessagePrimitiveUnstable_PartsGrouped","Unstable_PartsGrouped","MessagePrimitiveUnstable_PartsGroupedByParentId","Unstable_PartsGroupedByParentId"],"sources":["../../src/primitives/message.ts"],"sourcesContent":["export { MessagePrimitiveRoot as Root } from \"./message/MessageRoot\";\nexport { MessagePrimitiveParts as Parts } from \"./message/MessageParts\";\nexport { MessagePrimitivePartByIndex as PartByIndex } from \"./message/MessageParts\";\nexport { MessagePrimitiveParts as Content } from \"./message/MessageParts\";\nexport { MessagePrimitiveIf as If } from \"./message/MessageIf\";\nexport { MessagePrimitiveAttachments as Attachments } from \"./message/MessageAttachments\";\nexport { MessagePrimitiveAttachmentByIndex as AttachmentByIndex } from \"./message/MessageAttachments\";\nexport { MessagePrimitiveQuote as Quote } from \"@assistant-ui/core/react\";\nexport { MessagePrimitiveError as Error } from \"./message/MessageError\";\nexport { MessagePrimitiveGroupedParts as GroupedParts } from \"@assistant-ui/core/react\";\nexport { MessagePrimitiveGenerativeUI as GenerativeUI } from \"@assistant-ui/core/react\";\nexport {\n MessagePrimitiveUnstable_PartsGrouped as Unstable_PartsGrouped,\n MessagePrimitiveUnstable_PartsGroupedByParentId as Unstable_PartsGroupedByParentId,\n} from \"./message/MessagePartsGrouped\";\n"],"mappings":""}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Primitive } from "../../utils/Primitive.js";
|
|
3
3
|
import { useMessagePartImage } from "./useMessagePartImage.js";
|
|
4
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
4
5
|
import { forwardRef } from "@assistant-ui/tap/react-shim";
|
|
5
6
|
import { jsx } from "react/jsx-runtime";
|
|
6
7
|
//#region src/primitives/messagePart/MessagePartImage.tsx
|
|
@@ -20,12 +21,21 @@ import { jsx } from "react/jsx-runtime";
|
|
|
20
21
|
* ```
|
|
21
22
|
*/
|
|
22
23
|
const MessagePartPrimitiveImage = forwardRef((props, forwardedRef) => {
|
|
24
|
+
const $ = c(4);
|
|
23
25
|
const { image } = useMessagePartImage();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
let t0;
|
|
27
|
+
if ($[0] !== forwardedRef || $[1] !== image || $[2] !== props) {
|
|
28
|
+
t0 = /* @__PURE__ */ jsx(Primitive.img, {
|
|
29
|
+
src: image,
|
|
30
|
+
...props,
|
|
31
|
+
ref: forwardedRef
|
|
32
|
+
});
|
|
33
|
+
$[0] = forwardedRef;
|
|
34
|
+
$[1] = image;
|
|
35
|
+
$[2] = props;
|
|
36
|
+
$[3] = t0;
|
|
37
|
+
} else t0 = $[3];
|
|
38
|
+
return t0;
|
|
29
39
|
});
|
|
30
40
|
MessagePartPrimitiveImage.displayName = "MessagePartPrimitive.Image";
|
|
31
41
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessagePartImage.js","names":[],"sources":["../../../src/primitives/messagePart/MessagePartImage.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport { useMessagePartImage } from \"./useMessagePartImage\";\n\nexport namespace MessagePartPrimitiveImage {\n export type Element = ComponentRef<typeof Primitive.img>;\n /**\n * Props for the MessagePartPrimitive.Image component.\n * Accepts all standard img element props.\n */\n export type Props = ComponentPropsWithoutRef<typeof Primitive.img>;\n}\n\n/**\n * Renders an image from the current message part context.\n *\n * This component displays image content from the current message part,\n * automatically setting the src attribute from the message part's image data.\n *\n * @example\n * ```tsx\n * <MessagePartPrimitive.Image\n * alt=\"Generated image\"\n * className=\"message-image\"\n * style={{ maxWidth: '100%' }}\n * />\n * ```\n */\nexport const MessagePartPrimitiveImage = forwardRef<\n MessagePartPrimitiveImage.Element,\n MessagePartPrimitiveImage.Props\n>((props, forwardedRef) => {\n const { image } = useMessagePartImage();\n return <Primitive.img src={image} {...props} ref={forwardedRef} />;\n});\n\nMessagePartPrimitiveImage.displayName = \"MessagePartPrimitive.Image\";\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MessagePartImage.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useMessagePartImage","MessagePartPrimitiveImage","Element","img","Props","props","forwardedRef","$","image","t0","displayName"],"sources":["../../../src/primitives/messagePart/MessagePartImage.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport { useMessagePartImage } from \"./useMessagePartImage\";\n\nexport namespace MessagePartPrimitiveImage {\n export type Element = ComponentRef<typeof Primitive.img>;\n /**\n * Props for the MessagePartPrimitive.Image component.\n * Accepts all standard img element props.\n */\n export type Props = ComponentPropsWithoutRef<typeof Primitive.img>;\n}\n\n/**\n * Renders an image from the current message part context.\n *\n * This component displays image content from the current message part,\n * automatically setting the src attribute from the message part's image data.\n *\n * @example\n * ```tsx\n * <MessagePartPrimitive.Image\n * alt=\"Generated image\"\n * className=\"message-image\"\n * style={{ maxWidth: '100%' }}\n * />\n * ```\n */\nexport const MessagePartPrimitiveImage = forwardRef<\n MessagePartPrimitiveImage.Element,\n MessagePartPrimitiveImage.Props\n>((props, forwardedRef) => {\n const { image } = useMessagePartImage();\n return <Primitive.img src={image} {...props} ref={forwardedRef} />;\n});\n\nMessagePartPrimitiveImage.displayName = \"MessagePartPrimitive.Image\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAaO,4BAA4BH,YAGvCO,OAAAC,iBAAA;CAAA,MAAAC,IAAAZ,EAAA,CAAA;CACA,MAAA,EAAAa,UAAkBR,oBAAoB;CAAE,IAAAS;CAAA,IAAAF,EAAA,OAAAD,gBAAAC,EAAA,OAAAC,SAAAD,EAAA,OAAAF,OAAA;EACjCI,KAAA,oBAAA,UAAA,KAAA;GAAoBD,KAAAA;GAAK,GAAMH;GAAYC,KAAAA;EAAY,CAAA;EAAIC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAF;EAAAE,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OAA3DE;AAA2D,CACnE;AAEDR,0BAA0BS,cAAc"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Primitive } from "../../utils/Primitive.js";
|
|
2
|
+
import { SmoothOptions } from "../../utils/smooth/useSmooth.js";
|
|
2
3
|
import { ComponentPropsWithoutRef, ComponentRef, ElementType } from "react";
|
|
3
4
|
|
|
4
5
|
//#region src/primitives/messagePart/MessagePartText.d.ts
|
|
@@ -8,9 +9,10 @@ declare namespace MessagePartPrimitiveText {
|
|
|
8
9
|
/**
|
|
9
10
|
* Whether to enable smooth text streaming animation.
|
|
10
11
|
* When enabled, text appears with a typing effect as it streams in.
|
|
12
|
+
* Pass a `SmoothOptions` object to tune the reveal rate.
|
|
11
13
|
* @default true
|
|
12
14
|
*/
|
|
13
|
-
smooth?: boolean;
|
|
15
|
+
smooth?: boolean | SmoothOptions;
|
|
14
16
|
/**
|
|
15
17
|
* The HTML element or React component to render as.
|
|
16
18
|
* @default "span"
|
|
@@ -42,9 +44,10 @@ declare const MessagePartPrimitiveText: import("react").ForwardRefExoticComponen
|
|
|
42
44
|
/**
|
|
43
45
|
* Whether to enable smooth text streaming animation.
|
|
44
46
|
* When enabled, text appears with a typing effect as it streams in.
|
|
47
|
+
* Pass a `SmoothOptions` object to tune the reveal rate.
|
|
45
48
|
* @default true
|
|
46
49
|
*/
|
|
47
|
-
smooth?: boolean;
|
|
50
|
+
smooth?: boolean | SmoothOptions;
|
|
48
51
|
/**
|
|
49
52
|
* The HTML element or React component to render as.
|
|
50
53
|
* @default "span"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessagePartText.d.ts","names":[],"sources":["../../../src/primitives/messagePart/MessagePartText.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MessagePartText.d.ts","names":[],"sources":["../../../src/primitives/messagePart/MessagePartText.tsx"],"mappings":";;;;;kBAYiB,wBAAA;EAAA,KACH,OAAA,GAAU,YAAA,QAAoB,SAAA,CAAU,IAAA;EAAA,KACxC,KAAA,GAAQ,IAAA,CAClB,wBAAA,QAAgC,SAAA,CAAU,IAAA;IAHL;;;;;;IAYrC,MAAA,aAAmB,aAAA;IAAA;;;;IAKnB,SAAA,GAAY,WAAA;EAAA;AAAA;;;;;;;;;;;;AAAW;AAoB3B;;;;cAAa,wBAAA,kBAAwB,yBAAA,CAAA,IAAA,CAAA,IAAA,CAAA,IAAA,iBAAA,eAAA,CAAA,eAAA,oBAAA,cAAA,CAAA,eAAA;;;;;EAzBd;;;;;;qBAAA,aAAA;EAyBc;;;;cApBrB,WAAA;AAAA"}
|