@assistant-ui/react 0.14.18 → 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 +3 -2
- package/dist/client/ExternalThread.d.ts.map +1 -1
- package/dist/client/ExternalThread.js +721 -256
- package/dist/client/ExternalThread.js.map +1 -1
- package/dist/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/client/InMemoryThreadList.js +292 -108
- package/dist/client/InMemoryThreadList.js.map +1 -1
- package/dist/client/SingleThreadList.js +139 -53
- 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 +4 -2
- package/dist/index.js +3 -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.js +6 -6
- package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/mcp-apps/McpAppsRemoteHost.js +3 -3
- 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 +26 -26
- 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.js +124 -52
- 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.js +28 -14
- package/dist/primitives/composer/trigger/triggerDetectionResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js +115 -58
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerNavigationResource.js +202 -70
- package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
- package/dist/primitives/composer/trigger/triggerSelectionResource.js +49 -13
- 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.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 -43
- 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.js +16 -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.js.map +1 -1
- 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.js +5 -5
- 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 +81 -52
- package/src/client/InMemoryThreadList.ts +12 -14
- package/src/hooks/useToolCallElapsed.ts +52 -0
- package/src/index.ts +11 -0
- package/src/primitives/composer/trigger/TriggerPopover.tsx +4 -5
- package/src/tests/toolCallTiming.test.tsx +221 -0
- package/src/unstable/useMessageStallDetection.ts +91 -0
|
@@ -1,22 +1,36 @@
|
|
|
1
1
|
import { detectTrigger } from "./detectTrigger.js";
|
|
2
|
-
import {
|
|
2
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
3
|
+
import { useState } from "@assistant-ui/tap/react-shim";
|
|
3
4
|
import { resource } from "@assistant-ui/tap";
|
|
4
5
|
//#region src/primitives/composer/trigger/triggerDetectionResource.ts
|
|
5
6
|
/** Tracks cursor position and derives the active trigger + query from composer text. */
|
|
6
|
-
const useTriggerDetectionResource = (
|
|
7
|
+
const useTriggerDetectionResource = (t0) => {
|
|
8
|
+
const $ = c(7);
|
|
9
|
+
const { text, triggerChar } = t0;
|
|
7
10
|
const [cursorPosition, setCursorPosition] = useState(text.length);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
const pos = Math.min(cursorPosition, text.length);
|
|
12
|
+
let t1;
|
|
13
|
+
if ($[0] !== pos || $[1] !== text || $[2] !== triggerChar) {
|
|
14
|
+
t1 = detectTrigger(text, triggerChar, pos);
|
|
15
|
+
$[0] = pos;
|
|
16
|
+
$[1] = text;
|
|
17
|
+
$[2] = triggerChar;
|
|
18
|
+
$[3] = t1;
|
|
19
|
+
} else t1 = $[3];
|
|
20
|
+
const trigger = t1;
|
|
21
|
+
const query = trigger?.query ?? "";
|
|
22
|
+
let t2;
|
|
23
|
+
if ($[4] !== query || $[5] !== trigger) {
|
|
24
|
+
t2 = {
|
|
25
|
+
trigger,
|
|
26
|
+
query,
|
|
27
|
+
setCursorPosition
|
|
28
|
+
};
|
|
29
|
+
$[4] = query;
|
|
30
|
+
$[5] = trigger;
|
|
31
|
+
$[6] = t2;
|
|
32
|
+
} else t2 = $[6];
|
|
33
|
+
return t2;
|
|
20
34
|
};
|
|
21
35
|
const TriggerDetectionResource = resource(useTriggerDetectionResource);
|
|
22
36
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggerDetectionResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport { detectTrigger } from \"./detectTrigger\";\n\n/** Detected trigger position within the composer text. */\nexport type DetectedTrigger = {\n readonly offset: number;\n readonly query: string;\n};\n\nexport type TriggerDetectionResourceOutput = {\n /** Detected trigger (or `null` when inactive). */\n readonly trigger: DetectedTrigger | null;\n /** Current query string (empty when no trigger active). */\n readonly query: string;\n /** Update the tracked cursor position (wired to composer input). */\n setCursorPosition(pos: number): void;\n};\n\n/** Tracks cursor position and derives the active trigger + query from composer text. */\nconst useTriggerDetectionResource = ({\n text,\n triggerChar,\n}: {\n text: string;\n triggerChar: string;\n}): TriggerDetectionResourceOutput => {\n const [cursorPosition, setCursorPosition] = useState(text.length);\n\n const trigger = useMemo(() => {\n const pos = Math.min(cursorPosition, text.length);\n return detectTrigger(text, triggerChar, pos);\n }, [cursorPosition, text, triggerChar]);\n\n const query = trigger?.query ?? \"\";\n\n return {\n trigger,\n query,\n setCursorPosition,\n };\n};\n\nexport const TriggerDetectionResource = resource(useTriggerDetectionResource);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"triggerDetectionResource.js","names":["useMemo","useState","resource","detectTrigger","DetectedTrigger","offset","query","TriggerDetectionResourceOutput","trigger","setCursorPosition","pos","useTriggerDetectionResource","t0","$","_c","text","triggerChar","cursorPosition","length","Math","min","t1","t2","TriggerDetectionResource"],"sources":["../../../../src/primitives/composer/trigger/triggerDetectionResource.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport { detectTrigger } from \"./detectTrigger\";\n\n/** Detected trigger position within the composer text. */\nexport type DetectedTrigger = {\n readonly offset: number;\n readonly query: string;\n};\n\nexport type TriggerDetectionResourceOutput = {\n /** Detected trigger (or `null` when inactive). */\n readonly trigger: DetectedTrigger | null;\n /** Current query string (empty when no trigger active). */\n readonly query: string;\n /** Update the tracked cursor position (wired to composer input). */\n setCursorPosition(pos: number): void;\n};\n\n/** Tracks cursor position and derives the active trigger + query from composer text. */\nconst useTriggerDetectionResource = ({\n text,\n triggerChar,\n}: {\n text: string;\n triggerChar: string;\n}): TriggerDetectionResourceOutput => {\n const [cursorPosition, setCursorPosition] = useState(text.length);\n\n const trigger = useMemo(() => {\n const pos = Math.min(cursorPosition, text.length);\n return detectTrigger(text, triggerChar, pos);\n }, [cursorPosition, text, triggerChar]);\n\n const query = trigger?.query ?? \"\";\n\n return {\n trigger,\n query,\n setCursorPosition,\n };\n};\n\nexport const TriggerDetectionResource = resource(useTriggerDetectionResource);\n"],"mappings":";;;;;;AAoBA,MAAMW,+BAA8BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,MAAAC,gBAAAJ;CAOnC,MAAA,CAAAK,gBAAAR,qBAA4CR,SAASc,KAAIG,MAAO;CAG9D,MAAAR,MAAYS,KAAIC,IAAKH,gBAAgBF,KAAIG,MAAO;CAAE,IAAAG;CAAA,IAAAR,EAAA,OAAAH,OAAAG,EAAA,OAAAE,QAAAF,EAAA,OAAAG,aAAA;EAC3CK,KAAAlB,cAAcY,MAAMC,aAAaN,GAAG;EAACG,EAAA,KAAAH;EAAAG,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAF9C,MAAAL,UAEEa;CAGF,MAAAf,QAAcE,SAAOF,SAAP;CAAqB,IAAAgB;CAAA,IAAAT,EAAA,OAAAP,SAAAO,EAAA,OAAAL,SAAA;EAE5Bc,KAAA;GAAAd;GAAAF;GAAAG;EAIP;EAACI,EAAA,KAAAP;EAAAO,EAAA,KAAAL;EAAAK,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAJMS;AAIN;AAGH,MAAaC,2BAA2BrB,SAASS,2BAA2B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
1
2
|
import { useEffect, useEffectEvent, useState } from "@assistant-ui/tap/react-shim";
|
|
2
3
|
import { resource } from "@assistant-ui/tap";
|
|
3
4
|
//#region src/primitives/composer/trigger/triggerKeyboardResource.ts
|
|
@@ -9,69 +10,125 @@ function isTriggerItem(x) {
|
|
|
9
10
|
* Owns keyboard-driven highlight state for the popover. Delegates selection,
|
|
10
11
|
* category drill-in, back, and close to the callbacks supplied by the parent.
|
|
11
12
|
*/
|
|
12
|
-
const useTriggerKeyboardResource = (
|
|
13
|
+
const useTriggerKeyboardResource = (t0) => {
|
|
14
|
+
const $ = c(25);
|
|
15
|
+
const { navigableList, isSearchMode, activeCategoryId, query, popoverId, open, selectItem, selectCategory, goBack, close } = t0;
|
|
13
16
|
const [highlightedIndex, setHighlightedIndex] = useState(0);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
17
|
+
let t1;
|
|
18
|
+
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
19
|
+
t1 = () => {
|
|
20
|
+
setHighlightedIndex(0);
|
|
21
|
+
};
|
|
22
|
+
$[0] = t1;
|
|
23
|
+
} else t1 = $[0];
|
|
24
|
+
let t2;
|
|
25
|
+
if ($[1] !== navigableList) {
|
|
26
|
+
t2 = [navigableList];
|
|
27
|
+
$[1] = navigableList;
|
|
28
|
+
$[2] = t2;
|
|
29
|
+
} else t2 = $[2];
|
|
30
|
+
useEffect(t1, t2);
|
|
31
|
+
let t3;
|
|
32
|
+
if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
|
|
33
|
+
t3 = () => {
|
|
34
|
+
setHighlightedIndex(0);
|
|
35
|
+
};
|
|
36
|
+
$[3] = t3;
|
|
37
|
+
} else t3 = $[3];
|
|
38
|
+
let t4;
|
|
39
|
+
if ($[4] !== activeCategoryId || $[5] !== isSearchMode) {
|
|
40
|
+
t4 = [isSearchMode, activeCategoryId];
|
|
41
|
+
$[4] = activeCategoryId;
|
|
42
|
+
$[5] = isSearchMode;
|
|
43
|
+
$[6] = t4;
|
|
44
|
+
} else t4 = $[6];
|
|
45
|
+
useEffect(t3, t4);
|
|
46
|
+
let t5;
|
|
47
|
+
if ($[7] !== highlightedIndex || $[8] !== navigableList.length) {
|
|
48
|
+
t5 = (index) => {
|
|
49
|
+
if (index < 0 || index >= navigableList.length) return;
|
|
50
|
+
if (index === highlightedIndex) return;
|
|
51
|
+
setHighlightedIndex(index);
|
|
52
|
+
};
|
|
53
|
+
$[7] = highlightedIndex;
|
|
54
|
+
$[8] = navigableList.length;
|
|
55
|
+
$[9] = t5;
|
|
56
|
+
} else t5 = $[9];
|
|
57
|
+
const highlightIndex = useEffectEvent(t5);
|
|
58
|
+
let t6;
|
|
59
|
+
if ($[10] !== activeCategoryId || $[11] !== close || $[12] !== goBack || $[13] !== highlightedIndex || $[14] !== navigableList || $[15] !== open || $[16] !== query || $[17] !== selectCategory || $[18] !== selectItem) {
|
|
60
|
+
t6 = (e) => {
|
|
61
|
+
if (!open) return false;
|
|
62
|
+
switch (e.key) {
|
|
63
|
+
case "ArrowDown":
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
setHighlightedIndex((prev_0) => {
|
|
66
|
+
const len_0 = navigableList.length;
|
|
67
|
+
if (len_0 === 0) return 0;
|
|
68
|
+
return prev_0 < len_0 - 1 ? prev_0 + 1 : 0;
|
|
69
|
+
});
|
|
70
|
+
return true;
|
|
71
|
+
case "ArrowUp":
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
setHighlightedIndex((prev) => {
|
|
74
|
+
const len = navigableList.length;
|
|
75
|
+
if (len === 0) return 0;
|
|
76
|
+
return prev > 0 ? prev - 1 : len - 1;
|
|
77
|
+
});
|
|
78
|
+
return true;
|
|
79
|
+
case "Enter":
|
|
80
|
+
case "Tab": {
|
|
81
|
+
if (e.shiftKey) return false;
|
|
60
82
|
e.preventDefault();
|
|
61
|
-
|
|
83
|
+
const item = navigableList[highlightedIndex];
|
|
84
|
+
if (!item) return true;
|
|
85
|
+
if (isTriggerItem(item)) selectItem(item);
|
|
86
|
+
else selectCategory(item.id);
|
|
62
87
|
return true;
|
|
63
88
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
89
|
+
case "Escape":
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
close();
|
|
92
|
+
return true;
|
|
93
|
+
case "Backspace":
|
|
94
|
+
if (activeCategoryId && query === "") {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
goBack();
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
default: return false;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
$[10] = activeCategoryId;
|
|
104
|
+
$[11] = close;
|
|
105
|
+
$[12] = goBack;
|
|
106
|
+
$[13] = highlightedIndex;
|
|
107
|
+
$[14] = navigableList;
|
|
108
|
+
$[15] = open;
|
|
109
|
+
$[16] = query;
|
|
110
|
+
$[17] = selectCategory;
|
|
111
|
+
$[18] = selectItem;
|
|
112
|
+
$[19] = t6;
|
|
113
|
+
} else t6 = $[19];
|
|
114
|
+
const handleKeyDown = useEffectEvent(t6);
|
|
68
115
|
const highlightedEntry = navigableList[highlightedIndex];
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
116
|
+
const highlightedItemId = open && highlightedEntry ? `${popoverId}-option-${highlightedEntry.id}` : void 0;
|
|
117
|
+
let t7;
|
|
118
|
+
if ($[20] !== handleKeyDown || $[21] !== highlightIndex || $[22] !== highlightedIndex || $[23] !== highlightedItemId) {
|
|
119
|
+
t7 = {
|
|
120
|
+
highlightedIndex,
|
|
121
|
+
highlightedItemId,
|
|
122
|
+
highlightIndex,
|
|
123
|
+
handleKeyDown
|
|
124
|
+
};
|
|
125
|
+
$[20] = handleKeyDown;
|
|
126
|
+
$[21] = highlightIndex;
|
|
127
|
+
$[22] = highlightedIndex;
|
|
128
|
+
$[23] = highlightedItemId;
|
|
129
|
+
$[24] = t7;
|
|
130
|
+
} else t7 = $[24];
|
|
131
|
+
return t7;
|
|
75
132
|
};
|
|
76
133
|
const TriggerKeyboardResource = resource(useTriggerKeyboardResource);
|
|
77
134
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggerKeyboardResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */\nfunction isTriggerItem(\n x: Unstable_TriggerItem | Unstable_TriggerCategory,\n): x is Unstable_TriggerItem {\n return \"type\" in x;\n}\n\n/** Key event shape accepted by the keyboard handler. */\nexport type TriggerPopoverKeyEvent = {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport type TriggerKeyboardResourceOutput = {\n /** Index of the currently highlighted entry within the navigable list. */\n readonly highlightedIndex: number;\n /** ID of the currently highlighted item (for `aria-activedescendant`). */\n readonly highlightedItemId: string | undefined;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n /** Handle a key event; returns `true` if it was consumed. */\n handleKeyDown(e: TriggerPopoverKeyEvent): boolean;\n};\n\n/**\n * Owns keyboard-driven highlight state for the popover. Delegates selection,\n * category drill-in, back, and close to the callbacks supplied by the parent.\n */\nconst useTriggerKeyboardResource = ({\n navigableList,\n isSearchMode,\n activeCategoryId,\n query,\n popoverId,\n open,\n selectItem,\n selectCategory,\n goBack,\n close,\n}: {\n navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];\n isSearchMode: boolean;\n activeCategoryId: string | null;\n query: string;\n popoverId: string;\n open: boolean;\n selectItem: (item: Unstable_TriggerItem) => void;\n selectCategory: (categoryId: string) => void;\n goBack: () => void;\n close: () => void;\n}): TriggerKeyboardResourceOutput => {\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [navigableList]);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [isSearchMode, activeCategoryId]);\n\n const highlightIndex = useEffectEvent((index: number) => {\n if (index < 0 || index >= navigableList.length) return;\n if (index === highlightedIndex) return;\n setHighlightedIndex(index);\n });\n\n const handleKeyDown = useEffectEvent((e: TriggerPopoverKeyEvent): boolean => {\n if (!open) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev < len - 1 ? prev + 1 : 0;\n });\n return true;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev > 0 ? prev - 1 : len - 1;\n });\n return true;\n }\n case \"Enter\":\n case \"Tab\": {\n if (e.shiftKey) return false;\n e.preventDefault();\n const item = navigableList[highlightedIndex];\n if (!item) return true;\n\n if (isTriggerItem(item)) {\n selectItem(item);\n } else {\n selectCategory(item.id);\n }\n return true;\n }\n case \"Escape\": {\n e.preventDefault();\n close();\n return true;\n }\n case \"Backspace\": {\n if (activeCategoryId && query === \"\") {\n e.preventDefault();\n goBack();\n return true;\n }\n return false;\n }\n default:\n return false;\n }\n });\n\n const highlightedEntry = navigableList[highlightedIndex];\n const highlightedItemId =\n open && highlightedEntry\n ? `${popoverId}-option-${highlightedEntry.id}`\n : undefined;\n\n return {\n highlightedIndex,\n highlightedItemId,\n highlightIndex,\n handleKeyDown,\n };\n};\n\nexport const TriggerKeyboardResource = resource(useTriggerKeyboardResource);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"triggerKeyboardResource.js","names":["useEffect","useEffectEvent","useState","resource","Unstable_TriggerCategory","Unstable_TriggerItem","isTriggerItem","x","TriggerPopoverKeyEvent","key","shiftKey","preventDefault","TriggerKeyboardResourceOutput","highlightedIndex","highlightedItemId","highlightIndex","index","handleKeyDown","e","useTriggerKeyboardResource","t0","$","_c","navigableList","isSearchMode","activeCategoryId","query","popoverId","open","selectItem","selectCategory","goBack","close","setHighlightedIndex","t1","Symbol","for","t2","t3","t4","t5","length","t6","prev_0","len_0","len","prev","item","id","highlightedEntry","undefined","t7","TriggerKeyboardResource"],"sources":["../../../../src/primitives/composer/trigger/triggerKeyboardResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\n/** Relies on `Unstable_TriggerCategory` never carrying a `type` field. */\nfunction isTriggerItem(\n x: Unstable_TriggerItem | Unstable_TriggerCategory,\n): x is Unstable_TriggerItem {\n return \"type\" in x;\n}\n\n/** Key event shape accepted by the keyboard handler. */\nexport type TriggerPopoverKeyEvent = {\n readonly key: string;\n readonly shiftKey: boolean;\n preventDefault(): void;\n};\n\nexport type TriggerKeyboardResourceOutput = {\n /** Index of the currently highlighted entry within the navigable list. */\n readonly highlightedIndex: number;\n /** ID of the currently highlighted item (for `aria-activedescendant`). */\n readonly highlightedItemId: string | undefined;\n /** Move the highlight to an entry index (e.g. from pointer hover). Out-of-range values are ignored. */\n highlightIndex(index: number): void;\n /** Handle a key event; returns `true` if it was consumed. */\n handleKeyDown(e: TriggerPopoverKeyEvent): boolean;\n};\n\n/**\n * Owns keyboard-driven highlight state for the popover. Delegates selection,\n * category drill-in, back, and close to the callbacks supplied by the parent.\n */\nconst useTriggerKeyboardResource = ({\n navigableList,\n isSearchMode,\n activeCategoryId,\n query,\n popoverId,\n open,\n selectItem,\n selectCategory,\n goBack,\n close,\n}: {\n navigableList: readonly (Unstable_TriggerCategory | Unstable_TriggerItem)[];\n isSearchMode: boolean;\n activeCategoryId: string | null;\n query: string;\n popoverId: string;\n open: boolean;\n selectItem: (item: Unstable_TriggerItem) => void;\n selectCategory: (categoryId: string) => void;\n goBack: () => void;\n close: () => void;\n}): TriggerKeyboardResourceOutput => {\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [navigableList]);\n\n useEffect(() => {\n setHighlightedIndex(0);\n }, [isSearchMode, activeCategoryId]);\n\n const highlightIndex = useEffectEvent((index: number) => {\n if (index < 0 || index >= navigableList.length) return;\n if (index === highlightedIndex) return;\n setHighlightedIndex(index);\n });\n\n const handleKeyDown = useEffectEvent((e: TriggerPopoverKeyEvent): boolean => {\n if (!open) return false;\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev < len - 1 ? prev + 1 : 0;\n });\n return true;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n setHighlightedIndex((prev) => {\n const len = navigableList.length;\n if (len === 0) return 0;\n return prev > 0 ? prev - 1 : len - 1;\n });\n return true;\n }\n case \"Enter\":\n case \"Tab\": {\n if (e.shiftKey) return false;\n e.preventDefault();\n const item = navigableList[highlightedIndex];\n if (!item) return true;\n\n if (isTriggerItem(item)) {\n selectItem(item);\n } else {\n selectCategory(item.id);\n }\n return true;\n }\n case \"Escape\": {\n e.preventDefault();\n close();\n return true;\n }\n case \"Backspace\": {\n if (activeCategoryId && query === \"\") {\n e.preventDefault();\n goBack();\n return true;\n }\n return false;\n }\n default:\n return false;\n }\n });\n\n const highlightedEntry = navigableList[highlightedIndex];\n const highlightedItemId =\n open && highlightedEntry\n ? `${popoverId}-option-${highlightedEntry.id}`\n : undefined;\n\n return {\n highlightedIndex,\n highlightedItemId,\n highlightIndex,\n handleKeyDown,\n };\n};\n\nexport const TriggerKeyboardResource = resource(useTriggerKeyboardResource);\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
2
|
+
import { useEffect, useEffectEvent, useState } from "@assistant-ui/tap/react-shim";
|
|
2
3
|
import { resource } from "@assistant-ui/tap";
|
|
3
4
|
//#region src/primitives/composer/trigger/triggerNavigationResource.ts
|
|
4
5
|
function matchesQuery(item, lower) {
|
|
@@ -8,80 +9,211 @@ function matchesQuery(item, lower) {
|
|
|
8
9
|
* Computes categories, items, search results, and navigation state from the
|
|
9
10
|
* adapter + current query. Pure derivation — no side effects on the composer.
|
|
10
11
|
*/
|
|
11
|
-
const useTriggerNavigationResource = (
|
|
12
|
+
const useTriggerNavigationResource = (t0) => {
|
|
13
|
+
const $ = c(38);
|
|
14
|
+
const { adapter, query, open } = t0;
|
|
12
15
|
const [activeCategoryId, setActiveCategoryId] = useState(null);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
let t1;
|
|
17
|
+
let t2;
|
|
18
|
+
if ($[0] !== open) {
|
|
19
|
+
t1 = () => {
|
|
20
|
+
if (!open) setActiveCategoryId(null);
|
|
21
|
+
};
|
|
22
|
+
t2 = [open];
|
|
23
|
+
$[0] = open;
|
|
24
|
+
$[1] = t1;
|
|
25
|
+
$[2] = t2;
|
|
26
|
+
} else {
|
|
27
|
+
t1 = $[1];
|
|
28
|
+
t2 = $[2];
|
|
29
|
+
}
|
|
30
|
+
useEffect(t1, t2);
|
|
31
|
+
let t3;
|
|
32
|
+
bb0: {
|
|
33
|
+
if (!open || !adapter) {
|
|
34
|
+
let t4;
|
|
35
|
+
if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
|
|
36
|
+
t4 = [];
|
|
37
|
+
$[3] = t4;
|
|
38
|
+
} else t4 = $[3];
|
|
39
|
+
t3 = t4;
|
|
40
|
+
break bb0;
|
|
41
|
+
}
|
|
42
|
+
let t4;
|
|
43
|
+
if ($[4] !== adapter) {
|
|
44
|
+
t4 = adapter.categories();
|
|
45
|
+
$[4] = adapter;
|
|
46
|
+
$[5] = t4;
|
|
47
|
+
} else t4 = $[5];
|
|
48
|
+
t3 = t4;
|
|
49
|
+
}
|
|
50
|
+
const categories = t3;
|
|
20
51
|
const effectiveActiveCategoryId = open ? activeCategoryId : null;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
let t4;
|
|
53
|
+
bb1: {
|
|
54
|
+
if (!effectiveActiveCategoryId || !adapter) {
|
|
55
|
+
let t5;
|
|
56
|
+
if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
|
|
57
|
+
t5 = [];
|
|
58
|
+
$[6] = t5;
|
|
59
|
+
} else t5 = $[6];
|
|
60
|
+
t4 = t5;
|
|
61
|
+
break bb1;
|
|
62
|
+
}
|
|
63
|
+
let t5;
|
|
64
|
+
if ($[7] !== adapter || $[8] !== effectiveActiveCategoryId) {
|
|
65
|
+
t5 = adapter.categoryItems(effectiveActiveCategoryId);
|
|
66
|
+
$[7] = adapter;
|
|
67
|
+
$[8] = effectiveActiveCategoryId;
|
|
68
|
+
$[9] = t5;
|
|
69
|
+
} else t5 = $[9];
|
|
70
|
+
t4 = t5;
|
|
71
|
+
}
|
|
72
|
+
const allItems = t4;
|
|
73
|
+
let t5;
|
|
74
|
+
bb2: {
|
|
75
|
+
if (!open || !adapter || effectiveActiveCategoryId) {
|
|
76
|
+
t5 = null;
|
|
77
|
+
break bb2;
|
|
78
|
+
}
|
|
79
|
+
if (!query && categories.length > 0) {
|
|
80
|
+
t5 = null;
|
|
81
|
+
break bb2;
|
|
82
|
+
}
|
|
83
|
+
if (adapter.search) {
|
|
84
|
+
let t6;
|
|
85
|
+
if ($[10] !== adapter || $[11] !== query) {
|
|
86
|
+
t6 = adapter.search(query);
|
|
87
|
+
$[10] = adapter;
|
|
88
|
+
$[11] = query;
|
|
89
|
+
$[12] = t6;
|
|
90
|
+
} else t6 = $[12];
|
|
91
|
+
t5 = t6;
|
|
92
|
+
break bb2;
|
|
93
|
+
}
|
|
94
|
+
let all;
|
|
95
|
+
if ($[13] !== adapter || $[14] !== categories || $[15] !== query) {
|
|
96
|
+
all = [];
|
|
97
|
+
const lower = query.toLowerCase();
|
|
98
|
+
for (const cat of categories) for (const item of adapter.categoryItems(cat.id)) if (matchesQuery(item, lower)) all.push(item);
|
|
99
|
+
$[13] = adapter;
|
|
100
|
+
$[14] = categories;
|
|
101
|
+
$[15] = query;
|
|
102
|
+
$[16] = all;
|
|
103
|
+
} else all = $[16];
|
|
104
|
+
t5 = all;
|
|
105
|
+
}
|
|
106
|
+
const searchResults = t5;
|
|
40
107
|
const isSearchMode = searchResults !== null;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
108
|
+
let t6;
|
|
109
|
+
bb3: {
|
|
110
|
+
if (isSearchMode) {
|
|
111
|
+
let t7;
|
|
112
|
+
if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
|
|
113
|
+
t7 = [];
|
|
114
|
+
$[17] = t7;
|
|
115
|
+
} else t7 = $[17];
|
|
116
|
+
t6 = t7;
|
|
117
|
+
break bb3;
|
|
118
|
+
}
|
|
119
|
+
if (!query) {
|
|
120
|
+
t6 = categories;
|
|
121
|
+
break bb3;
|
|
122
|
+
}
|
|
123
|
+
let t7;
|
|
124
|
+
if ($[18] !== categories || $[19] !== query) {
|
|
125
|
+
const lower_0 = query.toLowerCase();
|
|
126
|
+
t7 = categories.filter((cat_0) => cat_0.label.toLowerCase().includes(lower_0));
|
|
127
|
+
$[18] = categories;
|
|
128
|
+
$[19] = query;
|
|
129
|
+
$[20] = t7;
|
|
130
|
+
} else t7 = $[20];
|
|
131
|
+
t6 = t7;
|
|
132
|
+
}
|
|
133
|
+
const filteredCategories = t6;
|
|
134
|
+
let t7;
|
|
135
|
+
bb4: {
|
|
136
|
+
if (isSearchMode) {
|
|
137
|
+
let t8;
|
|
138
|
+
if ($[21] !== searchResults) {
|
|
139
|
+
t8 = searchResults ?? [];
|
|
140
|
+
$[21] = searchResults;
|
|
141
|
+
$[22] = t8;
|
|
142
|
+
} else t8 = $[22];
|
|
143
|
+
t7 = t8;
|
|
144
|
+
break bb4;
|
|
145
|
+
}
|
|
146
|
+
if (!query) {
|
|
147
|
+
t7 = allItems;
|
|
148
|
+
break bb4;
|
|
149
|
+
}
|
|
150
|
+
let t8;
|
|
151
|
+
if ($[23] !== allItems || $[24] !== query) {
|
|
152
|
+
const lower_1 = query.toLowerCase();
|
|
153
|
+
t8 = allItems.filter((item_0) => matchesQuery(item_0, lower_1));
|
|
154
|
+
$[23] = allItems;
|
|
155
|
+
$[24] = query;
|
|
156
|
+
$[25] = t8;
|
|
157
|
+
} else t8 = $[25];
|
|
158
|
+
t7 = t8;
|
|
159
|
+
}
|
|
160
|
+
const filteredItems = t7;
|
|
161
|
+
let t8;
|
|
162
|
+
bb5: {
|
|
163
|
+
if (isSearchMode) {
|
|
164
|
+
let t9;
|
|
165
|
+
if ($[26] !== searchResults) {
|
|
166
|
+
t9 = searchResults ?? [];
|
|
167
|
+
$[26] = searchResults;
|
|
168
|
+
$[27] = t9;
|
|
169
|
+
} else t9 = $[27];
|
|
170
|
+
t8 = t9;
|
|
171
|
+
break bb5;
|
|
172
|
+
}
|
|
173
|
+
if (effectiveActiveCategoryId) {
|
|
174
|
+
t8 = filteredItems;
|
|
175
|
+
break bb5;
|
|
176
|
+
}
|
|
177
|
+
t8 = filteredCategories;
|
|
178
|
+
}
|
|
179
|
+
const navigableList = t8;
|
|
180
|
+
let t9;
|
|
181
|
+
if ($[28] === Symbol.for("react.memo_cache_sentinel")) {
|
|
182
|
+
t9 = (categoryId) => {
|
|
79
183
|
setActiveCategoryId(categoryId);
|
|
80
|
-
}
|
|
81
|
-
|
|
184
|
+
};
|
|
185
|
+
$[28] = t9;
|
|
186
|
+
} else t9 = $[28];
|
|
187
|
+
const selectCategory = useEffectEvent(t9);
|
|
188
|
+
let t10;
|
|
189
|
+
if ($[29] === Symbol.for("react.memo_cache_sentinel")) {
|
|
190
|
+
t10 = () => {
|
|
82
191
|
setActiveCategoryId(null);
|
|
83
|
-
}
|
|
84
|
-
|
|
192
|
+
};
|
|
193
|
+
$[29] = t10;
|
|
194
|
+
} else t10 = $[29];
|
|
195
|
+
const goBack = useEffectEvent(t10);
|
|
196
|
+
let t11;
|
|
197
|
+
if ($[30] !== effectiveActiveCategoryId || $[31] !== filteredCategories || $[32] !== filteredItems || $[33] !== goBack || $[34] !== isSearchMode || $[35] !== navigableList || $[36] !== selectCategory) {
|
|
198
|
+
t11 = {
|
|
199
|
+
categories: filteredCategories,
|
|
200
|
+
items: filteredItems,
|
|
201
|
+
isSearchMode,
|
|
202
|
+
activeCategoryId: effectiveActiveCategoryId,
|
|
203
|
+
navigableList,
|
|
204
|
+
selectCategory,
|
|
205
|
+
goBack
|
|
206
|
+
};
|
|
207
|
+
$[30] = effectiveActiveCategoryId;
|
|
208
|
+
$[31] = filteredCategories;
|
|
209
|
+
$[32] = filteredItems;
|
|
210
|
+
$[33] = goBack;
|
|
211
|
+
$[34] = isSearchMode;
|
|
212
|
+
$[35] = navigableList;
|
|
213
|
+
$[36] = selectCategory;
|
|
214
|
+
$[37] = t11;
|
|
215
|
+
} else t11 = $[37];
|
|
216
|
+
return t11;
|
|
85
217
|
};
|
|
86
218
|
const TriggerNavigationResource = resource(useTriggerNavigationResource);
|
|
87
219
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggerNavigationResource.js","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerNavigationResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\nfunction matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {\n return (\n item.id.toLowerCase().includes(lower) ||\n item.label.toLowerCase().includes(lower) ||\n (item.description?.toLowerCase().includes(lower) ?? false)\n );\n}\n\nexport type TriggerNavigationResourceOutput = {\n /** Filtered categories visible in the list (empty in search mode). */\n readonly categories: readonly Unstable_TriggerCategory[];\n /** Filtered items visible in the list. */\n readonly items: readonly Unstable_TriggerItem[];\n /** `true` when the current list is search results rather than categories. */\n readonly isSearchMode: boolean;\n /** Currently drilled-into category id (or `null` for the top level). */\n readonly activeCategoryId: string | null;\n /** Flat list used for keyboard navigation (categories or items). */\n readonly navigableList: readonly (\n | Unstable_TriggerCategory\n | Unstable_TriggerItem\n )[];\n /** Drill into a category. */\n selectCategory(categoryId: string): void;\n /** Return to the top-level category list. */\n goBack(): void;\n};\n\n/**\n * Computes categories, items, search results, and navigation state from the\n * adapter + current query. Pure derivation — no side effects on the composer.\n */\nconst useTriggerNavigationResource = ({\n adapter,\n query,\n open,\n}: {\n adapter: Unstable_TriggerAdapter | undefined;\n query: string;\n open: boolean;\n}): TriggerNavigationResourceOutput => {\n const [activeCategoryId, setActiveCategoryId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) setActiveCategoryId(null);\n }, [open]);\n\n const categories = useMemo<readonly Unstable_TriggerCategory[]>(() => {\n if (!open || !adapter) return [];\n return adapter.categories();\n }, [open, adapter]);\n\n const effectiveActiveCategoryId = open ? activeCategoryId : null;\n\n const allItems = useMemo<readonly Unstable_TriggerItem[]>(() => {\n if (!effectiveActiveCategoryId || !adapter) return [];\n return adapter.categoryItems(effectiveActiveCategoryId);\n }, [effectiveActiveCategoryId, adapter]);\n\n const searchResults = useMemo<readonly Unstable_TriggerItem[] | null>(() => {\n if (!open || !adapter || effectiveActiveCategoryId) return null;\n // If categories exist and query is empty, show categories first (not search)\n if (!query && categories.length > 0) return null;\n if (adapter.search) return adapter.search(query);\n\n // fallback: no adapter.search\n const all: Unstable_TriggerItem[] = [];\n const lower = query.toLowerCase();\n for (const cat of categories) {\n for (const item of adapter.categoryItems(cat.id)) {\n if (matchesQuery(item, lower)) {\n all.push(item);\n }\n }\n }\n return all;\n }, [open, adapter, query, effectiveActiveCategoryId, categories]);\n\n const isSearchMode = searchResults !== null;\n\n const filteredCategories = useMemo(() => {\n if (isSearchMode) return [];\n if (!query) return categories;\n const lower = query.toLowerCase();\n return categories.filter((cat) => cat.label.toLowerCase().includes(lower));\n }, [categories, query, isSearchMode]);\n\n const filteredItems = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (!query) return allItems;\n const lower = query.toLowerCase();\n return allItems.filter((item) => matchesQuery(item, lower));\n }, [allItems, query, isSearchMode, searchResults]);\n\n const navigableList = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (effectiveActiveCategoryId) return filteredItems;\n return filteredCategories;\n }, [\n isSearchMode,\n searchResults,\n effectiveActiveCategoryId,\n filteredItems,\n filteredCategories,\n ]);\n\n const selectCategory = useEffectEvent((categoryId: string) => {\n setActiveCategoryId(categoryId);\n });\n\n const goBack = useEffectEvent(() => {\n setActiveCategoryId(null);\n });\n\n return {\n categories: filteredCategories,\n items: filteredItems,\n isSearchMode,\n activeCategoryId: effectiveActiveCategoryId,\n navigableList,\n selectCategory,\n goBack,\n };\n};\n\nexport const TriggerNavigationResource = resource(useTriggerNavigationResource);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"triggerNavigationResource.js","names":["useEffect","useEffectEvent","useMemo","useState","resource","Unstable_TriggerAdapter","Unstable_TriggerCategory","Unstable_TriggerItem","matchesQuery","item","lower","id","toLowerCase","includes","label","description","TriggerNavigationResourceOutput","categories","items","isSearchMode","activeCategoryId","navigableList","selectCategory","categoryId","goBack","useTriggerNavigationResource","t0","$","_c","adapter","query","open","setActiveCategoryId","t1","t2","t3","bb0","t4","Symbol","for","effectiveActiveCategoryId","bb1","t5","categoryItems","allItems","bb2","length","search","t6","all","cat","push","searchResults","bb3","t7","lower_0","filter","cat_0","filteredCategories","bb4","t8","lower_1","item_0","filteredItems","bb5","t9","t10","t11","TriggerNavigationResource"],"sources":["../../../../src/primitives/composer/trigger/triggerNavigationResource.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_TriggerAdapter,\n Unstable_TriggerCategory,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\n\nfunction matchesQuery(item: Unstable_TriggerItem, lower: string): boolean {\n return (\n item.id.toLowerCase().includes(lower) ||\n item.label.toLowerCase().includes(lower) ||\n (item.description?.toLowerCase().includes(lower) ?? false)\n );\n}\n\nexport type TriggerNavigationResourceOutput = {\n /** Filtered categories visible in the list (empty in search mode). */\n readonly categories: readonly Unstable_TriggerCategory[];\n /** Filtered items visible in the list. */\n readonly items: readonly Unstable_TriggerItem[];\n /** `true` when the current list is search results rather than categories. */\n readonly isSearchMode: boolean;\n /** Currently drilled-into category id (or `null` for the top level). */\n readonly activeCategoryId: string | null;\n /** Flat list used for keyboard navigation (categories or items). */\n readonly navigableList: readonly (\n | Unstable_TriggerCategory\n | Unstable_TriggerItem\n )[];\n /** Drill into a category. */\n selectCategory(categoryId: string): void;\n /** Return to the top-level category list. */\n goBack(): void;\n};\n\n/**\n * Computes categories, items, search results, and navigation state from the\n * adapter + current query. Pure derivation — no side effects on the composer.\n */\nconst useTriggerNavigationResource = ({\n adapter,\n query,\n open,\n}: {\n adapter: Unstable_TriggerAdapter | undefined;\n query: string;\n open: boolean;\n}): TriggerNavigationResourceOutput => {\n const [activeCategoryId, setActiveCategoryId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) setActiveCategoryId(null);\n }, [open]);\n\n const categories = useMemo<readonly Unstable_TriggerCategory[]>(() => {\n if (!open || !adapter) return [];\n return adapter.categories();\n }, [open, adapter]);\n\n const effectiveActiveCategoryId = open ? activeCategoryId : null;\n\n const allItems = useMemo<readonly Unstable_TriggerItem[]>(() => {\n if (!effectiveActiveCategoryId || !adapter) return [];\n return adapter.categoryItems(effectiveActiveCategoryId);\n }, [effectiveActiveCategoryId, adapter]);\n\n const searchResults = useMemo<readonly Unstable_TriggerItem[] | null>(() => {\n if (!open || !adapter || effectiveActiveCategoryId) return null;\n // If categories exist and query is empty, show categories first (not search)\n if (!query && categories.length > 0) return null;\n if (adapter.search) return adapter.search(query);\n\n // fallback: no adapter.search\n const all: Unstable_TriggerItem[] = [];\n const lower = query.toLowerCase();\n for (const cat of categories) {\n for (const item of adapter.categoryItems(cat.id)) {\n if (matchesQuery(item, lower)) {\n all.push(item);\n }\n }\n }\n return all;\n }, [open, adapter, query, effectiveActiveCategoryId, categories]);\n\n const isSearchMode = searchResults !== null;\n\n const filteredCategories = useMemo(() => {\n if (isSearchMode) return [];\n if (!query) return categories;\n const lower = query.toLowerCase();\n return categories.filter((cat) => cat.label.toLowerCase().includes(lower));\n }, [categories, query, isSearchMode]);\n\n const filteredItems = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (!query) return allItems;\n const lower = query.toLowerCase();\n return allItems.filter((item) => matchesQuery(item, lower));\n }, [allItems, query, isSearchMode, searchResults]);\n\n const navigableList = useMemo(() => {\n if (isSearchMode) return searchResults ?? [];\n if (effectiveActiveCategoryId) return filteredItems;\n return filteredCategories;\n }, [\n isSearchMode,\n searchResults,\n effectiveActiveCategoryId,\n filteredItems,\n filteredCategories,\n ]);\n\n const selectCategory = useEffectEvent((categoryId: string) => {\n setActiveCategoryId(categoryId);\n });\n\n const goBack = useEffectEvent(() => {\n setActiveCategoryId(null);\n });\n\n return {\n categories: filteredCategories,\n items: filteredItems,\n isSearchMode,\n activeCategoryId: effectiveActiveCategoryId,\n navigableList,\n selectCategory,\n goBack,\n };\n};\n\nexport const TriggerNavigationResource = resource(useTriggerNavigationResource);\n"],"mappings":"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"}
|