import { useMemo } from "react"; import { AgentAvatar } from "./AgentAvatar"; import "./AgentMentionPopup.css"; import type { Agent } from "@fusion/core"; import { matchesAgentMentionFilter } from "./mentionMatching"; interface AgentMentionPopupProps { /** List of agents to show */ agents: Agent[]; /** Current search filter text (the text typed after @) */ filter: string; /** Currently highlighted index for keyboard navigation */ highlightedIndex: number; /** Whether popup is visible */ visible: boolean; /** Callback when an agent is selected */ onSelect: (agent: Agent) => void; /** Positioning anchor: "above" | "below" the input */ position?: "above" | "below"; /** Room-member ids when mentioning from a room context */ roomMemberIds?: ReadonlySet; /** Optional room name for room section labels */ roomName?: string; } export function AgentMentionPopup({ agents, filter, highlightedIndex, visible, onSelect, position = "below", roomMemberIds, roomName, }: AgentMentionPopupProps) { const filteredAgents = useMemo(() => agents.filter((agent) => matchesAgentMentionFilter(agent.name, filter)), [agents, filter]); const roomMode = Boolean(roomMemberIds); const showOtherSection = roomMode && filter.trim().length > 0; const memberAgents = useMemo( () => roomMode ? filteredAgents.filter((agent) => roomMemberIds?.has(agent.id)) : filteredAgents, [filteredAgents, roomMemberIds, roomMode], ); const otherAgents = useMemo( () => roomMode ? filteredAgents.filter((agent) => !roomMemberIds?.has(agent.id)) : [], [filteredAgents, roomMemberIds, roomMode], ); const visibleAgents = showOtherSection ? [...memberAgents, ...otherAgents] : memberAgents; if (!visible) { return null; } return (
{visibleAgents.length === 0 ? (
No agents found
) : ( <> {roomMode && (
{roomName ? `Members of #${roomName}` : "Room members"}
)} {memberAgents.map((agent, index) => ( ))} {roomMode && !showOtherSection && otherAgents.length > 0 && (
Type to search other agents
)} {roomMode && showOtherSection && otherAgents.length > 0 && ( <>
Other agents
{otherAgents.map((agent, index) => { const globalIndex = memberAgents.length + index; return ( ); })} )} )}
); }