From c3d6efa6d9c91a1b02db33c585b5209a9bb6488d Mon Sep 17 00:00:00 2001 From: klopez4212 Date: Mon, 29 Jun 2026 16:16:50 +0100 Subject: [PATCH] Fix task agent routing and scroll restore --- .../agents/ui/AgentConversationScreen.tsx | 13 ++++- .../features/channels/ui/ChannelScreen.tsx | 24 ++------- .../ui/filterAgentConversationMessages.ts | 54 +++++++++++++++++++ 3 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 desktop/src/features/channels/ui/filterAgentConversationMessages.ts diff --git a/desktop/src/features/agents/ui/AgentConversationScreen.tsx b/desktop/src/features/agents/ui/AgentConversationScreen.tsx index 5e067b35b..78d797f64 100644 --- a/desktop/src/features/agents/ui/AgentConversationScreen.tsx +++ b/desktop/src/features/agents/ui/AgentConversationScreen.tsx @@ -13,6 +13,7 @@ import { type AgentConversation, publishAgentConversationMarker, } from "@/features/agents/agentConversations"; +import { mergeAutoRouteMentionPubkeys } from "@/features/channels/ui/ChannelPane.helpers"; import { useManagedAgentsQuery, useRelayAgentsQuery, @@ -499,6 +500,10 @@ export function AgentConversationScreen({ .map((participant) => participant.pubkey), [agentParticipants], ); + const autoRouteAgentPubkeys = React.useMemo( + () => (routeableAgentPubkeys.length === 1 ? routeableAgentPubkeys : []), + [routeableAgentPubkeys], + ); const canMessageAnyAgent = routeableAgentPubkeys.length > 0; const restrictedAgentNames = React.useMemo( () => @@ -564,17 +569,23 @@ export function AgentConversationScreen({ mentionPubkeys: string[], mediaTags?: string[][], ) => { + const routedMentionPubkeys = mergeAutoRouteMentionPubkeys({ + autoRouteAgentPubkeys, + mentionPubkeys, + }); + await sendMessageMutation.mutateAsync({ clientTags: [ ["client", "agent-conversation", conversation.agentReply.id], ], content, mediaTags, - mentionPubkeys, + mentionPubkeys: routedMentionPubkeys, parentEventId: replyParentEventId, }); }, [ + autoRouteAgentPubkeys, conversation.agentReply.id, replyParentEventId, sendMessageMutation, diff --git a/desktop/src/features/channels/ui/ChannelScreen.tsx b/desktop/src/features/channels/ui/ChannelScreen.tsx index 17d3850b3..623bd9408 100644 --- a/desktop/src/features/channels/ui/ChannelScreen.tsx +++ b/desktop/src/features/channels/ui/ChannelScreen.tsx @@ -4,10 +4,6 @@ import { cacheSearchHitEvent } from "@/app/navigation/searchHitEventCache"; import { useAppNavigation } from "@/app/navigation/useAppNavigation"; import { useActiveChannelHeader } from "@/features/channels/useActiveChannelHeader"; import { useChannelPaneHandlers } from "@/features/channels/useChannelPaneHandlers"; -import { - buildAgentConversationMarkers, - getHiddenAgentConversationMessageIds, -} from "@/features/agents/agentConversations"; import { useChannelMembersQuery, useJoinChannelMutation, @@ -84,6 +80,7 @@ import { useChannelPanelHistoryState } from "./useChannelPanelHistoryState"; import { useChannelProfilePanel } from "./useChannelProfilePanel"; import { useChannelRouteTarget } from "./useChannelRouteTarget"; import { useChannelUnreadState } from "./useChannelUnreadState"; +import { useAgentConversationTimelineState } from "./filterAgentConversationMessages"; import { useResetChannelSurfaceTabOnRouteOpen } from "./useResetChannelSurfaceTabOnRouteOpen"; import type { ChannelScreenProps } from "./ChannelScreen.types"; const HEADER_ACTIONS_COMPACT_BREAKPOINT_PX = 760; @@ -490,23 +487,8 @@ export function ChannelScreen({ : [...currentEvents, event], ); }, []); - const agentConversationMarkers = React.useMemo( - () => buildAgentConversationMarkers(resolvedMessages), - [resolvedMessages], - ); - const unreadTimelineMessages = React.useMemo(() => { - const hiddenMessageIds = getHiddenAgentConversationMessageIds( - timelineMessages, - agentConversationMarkers, - ); - if (hiddenMessageIds.size === 0) { - return timelineMessages; - } - - return timelineMessages.filter( - (message) => !hiddenMessageIds.has(message.id), - ); - }, [agentConversationMarkers, timelineMessages]); + const { agentConversationMarkers, unreadTimelineMessages } = + useAgentConversationTimelineState(resolvedMessages, timelineMessages); const channelFind = useChannelFind({ channelId: activeChannelId, messages: timelineMessages, diff --git a/desktop/src/features/channels/ui/filterAgentConversationMessages.ts b/desktop/src/features/channels/ui/filterAgentConversationMessages.ts new file mode 100644 index 000000000..65153ee2a --- /dev/null +++ b/desktop/src/features/channels/ui/filterAgentConversationMessages.ts @@ -0,0 +1,54 @@ +import * as React from "react"; +import { + buildAgentConversationMarkers, + getHiddenAgentConversationMessageIds, + type AgentConversationMarker, +} from "@/features/agents/agentConversations"; +import type { TimelineMessage } from "@/features/messages/types"; +import type { RelayEvent } from "@/shared/api/types"; + +function filterHiddenAgentConversationMessages( + messages: TimelineMessage[], + markers: readonly AgentConversationMarker[] | undefined, +): TimelineMessage[] { + const hiddenMessageIds = getHiddenAgentConversationMessageIds( + messages, + markers, + ); + if (hiddenMessageIds.size === 0) { + return messages; + } + + return messages.filter((message) => !hiddenMessageIds.has(message.id)); +} + +export function useUnreadTimelineMessages( + messages: TimelineMessage[], + markers: readonly AgentConversationMarker[] | undefined, +): TimelineMessage[] { + return React.useMemo( + () => filterHiddenAgentConversationMessages(messages, markers), + [markers, messages], + ); +} + +export function useAgentConversationMarkers( + messages: RelayEvent[], +): AgentConversationMarker[] { + return React.useMemo( + () => buildAgentConversationMarkers(messages), + [messages], + ); +} + +export function useAgentConversationTimelineState( + events: RelayEvent[], + messages: TimelineMessage[], +) { + const agentConversationMarkers = useAgentConversationMarkers(events); + const unreadTimelineMessages = useUnreadTimelineMessages( + messages, + agentConversationMarkers, + ); + return { agentConversationMarkers, unreadTimelineMessages }; +}