import { useState, type JSX } from "react"; import { Select, SelectContent, SelectItem, SelectTrigger, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@tutti-os/ui-system"; import { cn } from "../../../app/renderer/lib/utils"; import type { AgentGUIAgentTarget } from "../../../types"; import styles from "../AgentGUINode.styles"; import { AgentComposerHandoffIcon, HANDOFF_SELECT_IDLE_VALUE, resolveComposerProviderTargetIconUrl } from "./AgentComposerChrome"; import { resolveHandoffTargetOwnershipLabel } from "./handoffTargetPresentation"; import { AgentGUIOwnerAvatar } from "../AgentGUIOwnerAvatar"; export interface AgentHandoffMenuLabels { action: string; deviceSource?: (deviceLabel: string) => string; menu: string; self: string; shared: string; tooltip: string; } export interface AgentHandoffMenuProps { align?: "center" | "end" | "start"; contentClassName?: string; disabled?: boolean; iconOnly?: boolean; isolateTriggerEvents?: boolean; labels: AgentHandoffMenuLabels; onSelect: (target: AgentGUIAgentTarget) => void; showOwnershipLabels?: boolean; targets: readonly AgentGUIAgentTarget[]; testId?: string; triggerClassName?: string; triggerLabel?: string; } /** * Provider-neutral handoff target menu shared by AgentGUI and host surfaces. * The host owns the authoritative target list and launch behavior; this * component owns only temporary menu disclosure, presentation, and icon motion. */ export function AgentHandoffMenu({ align = "start", contentClassName, disabled = false, iconOnly = false, isolateTriggerEvents = false, labels, onSelect, showOwnershipLabels = false, targets, testId, triggerClassName, triggerLabel = labels.action }: AgentHandoffMenuProps): JSX.Element { const [isIconPlaying, setIsIconPlaying] = useState(false); const menuDisabled = disabled || targets.length === 0; const tooltip = labels.tooltip.trim(); const trigger = ( { event.stopPropagation(); } : undefined } onKeyDown={ isolateTriggerEvents ? (event) => { event.stopPropagation(); } : undefined } onPointerDown={ isolateTriggerEvents ? (event) => { event.stopPropagation(); } : undefined } onBlur={() => { setIsIconPlaying(false); }} onFocus={() => { setIsIconPlaying(true); }} onMouseEnter={() => { setIsIconPlaying(true); }} onMouseLeave={() => { setIsIconPlaying(false); }} className={cn( styles.composerMenuTrigger, styles.composerProviderSelect, styles.composerHandoffTrigger, "w-auto max-w-[180px] [&>svg:last-child]:hidden", triggerClassName )} > {!iconOnly ? ( {triggerLabel} ) : null} ); return ( { event.stopPropagation(); } : undefined } onKeyDown={ isolateTriggerEvents ? (event) => { event.stopPropagation(); } : undefined } onPointerDown={ isolateTriggerEvents ? (event) => { event.stopPropagation(); } : undefined } > ); }