import { agentAvatarUrl } from "@/lib/agent-avatar-url"; import { useState } from "react"; import { resolveAgentAppearance, type AgentAppearance, type AgentAvatarSize, type CharacterState } from "@paperclipai/shared"; import { cn } from "@/lib/utils"; import { deriveInitials } from "./Identity"; import { useAvatarInitials } from "./ui/avatar-initials"; export type AvatarAgent = { id?: string; name?: string; appearance?: AgentAppearance | null; avatarUrl?: string | null }; export const avatarSizeClasses: Record = { 16: "size-4", 20: "size-5", 24: "size-6", 32: "size-8", 40: "size-10", 48: "size-12", 64: "size-16", 96: "size-24", 128: "size-32", 256: "size-64", 512: "size-128", }; export interface AgentAvatarProps { agent?: AvatarAgent | null; appearance?: AgentAppearance | null; size?: AgentAvatarSize; name?: string; label?: string; pose?: CharacterState; muted?: boolean; className?: string; } export function AgentAvatar({ agent, appearance, size = 24, name, label, pose = "rest", muted = false, className }: AgentAvatarProps) { const identity = resolveAgentAppearance(appearance ?? agent?.appearance, agent?.id); const src = agentAvatarUrl(identity, size, 1, pose, muted); const [failedUrl, setFailedUrl] = useState(null); const initials = useAvatarInitials(deriveInitials(name ?? agent?.name ?? "Agent")); return ( {failedUrl === src ? {initials} : setFailedUrl(src)} />} ); }