Fix task agent routing and scroll restore

This commit is contained in:
klopez4212
2026-06-30 13:55:20 +01:00
parent 7ef2a4c229
commit c3d6efa6d9
3 changed files with 69 additions and 22 deletions
@@ -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,
@@ -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,
@@ -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 };
}