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
}
>
);
}