@uix-ai/agent 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Avatar.tsx","../src/utils.ts","../src/components/AgentAvatarGroup.tsx","../src/components/AgentAvatar.tsx","../src/components/MessageAvatar.tsx","../src/components/ChatBubble.tsx","../src/components/ChatInput.tsx","../src/components/ChatMessage.tsx","../src/components/StreamText.tsx","../src/components/MentionPopover.tsx","../src/components/ThinkingIndicator.tsx","../src/components/ToolResult.tsx","../src/components/MessageList.tsx","../src/components/SourceBlock.tsx","../src/components/ChatWindow.tsx","../src/components/ChatList.tsx","../src/components/AgentChat.tsx"],"sourcesContent":["/**\n * Avatar - Composable avatar components for AI agents\n *\n * Follows shadcn/Radix composition pattern.\n * Components can be freely composed to create custom avatar layouts.\n *\n * @example Basic usage\n * ```tsx\n * <Avatar>\n * <AvatarImage src=\"/claude.png\" />\n * <AvatarFallback>CL</AvatarFallback>\n * </Avatar>\n * ```\n *\n * @example With AI status animation\n * ```tsx\n * <Avatar status=\"thinking\">\n * <AvatarImage src=\"/claude.png\" />\n * <AvatarFallback variant=\"primary\">A</AvatarFallback>\n * </Avatar>\n * ```\n *\n * @example With online status indicator\n * ```tsx\n * <Avatar size=\"lg\">\n * <AvatarImage src=\"/claude.png\" />\n * <AvatarFallback>CL</AvatarFallback>\n * <AvatarStatusIndicator status=\"online\" />\n * </Avatar>\n * ```\n *\n * @example Role-based (shorthand for message scenarios)\n * ```tsx\n * <Avatar role=\"assistant\" status=\"responding\">\n * <AvatarFallback />\n * </Avatar>\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\nimport type {\n AvatarSize,\n AvatarAnimationStatus,\n AvatarVariant,\n ImageLoadingStatus,\n PresenceStatus,\n} from '../types'\n\n// Re-export types from central source\nexport type {\n AvatarSize,\n AvatarAnimationStatus,\n AvatarVariant,\n ImageLoadingStatus,\n PresenceStatus,\n} from '../types'\n\n/**\n * Message role for automatic color/symbol mapping\n */\nexport type AvatarRole = 'user' | 'assistant' | 'system' | 'tool' | 'error'\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface AvatarContextValue {\n size: AvatarSize\n role?: AvatarRole\n imageStatus: ImageLoadingStatus\n setImageStatus: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarContext = React.createContext<AvatarContextValue | null>(null)\n\nfunction useAvatarContext() {\n const context = React.useContext(AvatarContext)\n if (!context) {\n throw new Error('Avatar components must be used within <Avatar>')\n }\n return context\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst sizeClasses: Record<AvatarSize, string> = {\n xs: 'w-5 h-5 text-[10px]',\n sm: 'w-6 h-6 text-xs',\n md: 'w-8 h-8 text-sm',\n lg: 'w-10 h-10 text-base',\n xl: 'w-12 h-12 text-lg',\n}\n\nconst statusIndicatorSizes: Record<AvatarSize, string> = {\n xs: 'w-1.5 h-1.5',\n sm: 'w-2 h-2',\n md: 'w-2.5 h-2.5',\n lg: 'w-3 h-3',\n xl: 'w-3.5 h-3.5',\n}\n\nconst variantClasses: Record<AvatarVariant, string> = {\n primary: 'bg-primary-500 text-white',\n secondary: 'bg-secondary-500 text-white',\n neutral: 'bg-gray-200 text-gray-600',\n success: 'bg-green-500 text-white',\n warning: 'bg-amber-500 text-white',\n error: 'bg-red-500 text-white',\n}\n\nconst roleToVariant: Record<AvatarRole, AvatarVariant> = {\n user: 'primary',\n assistant: 'secondary',\n system: 'neutral',\n tool: 'warning',\n error: 'error',\n}\n\nconst roleSymbols: Record<AvatarRole, string> = {\n user: 'U',\n assistant: 'A',\n system: 'S',\n tool: 'T',\n error: '!',\n}\n\nconst presenceColors: Record<PresenceStatus, string> = {\n online: 'bg-green-500',\n offline: 'bg-gray-400',\n busy: 'bg-amber-500',\n}\n\n// ============================================================================\n// Avatar (Container)\n// ============================================================================\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Avatar size\n * @default \"md\"\n */\n size?: AvatarSize\n /**\n * AI animation status\n * @default \"idle\"\n */\n status?: AvatarAnimationStatus\n /**\n * Message role (provides default variant and symbol to children)\n */\n role?: AvatarRole\n}\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ size = 'md', status = 'idle', role, className, children, ...props }, ref) => {\n const [imageStatus, setImageStatus] = React.useState<ImageLoadingStatus>('idle')\n\n return (\n <AvatarContext.Provider value={{ size, role, imageStatus, setImageStatus }}>\n <div\n ref={ref}\n className={cn(\n 'relative inline-flex items-center justify-center rounded-full font-medium shrink-0',\n 'overflow-hidden',\n sizeClasses[size],\n className\n )}\n role=\"img\"\n aria-busy={status !== 'idle'}\n {...props}\n >\n {children}\n\n {/* Animation overlays */}\n {status === 'thinking' && (\n <span\n className=\"absolute inset-0 rounded-full animate-pulse bg-current opacity-20\"\n aria-hidden=\"true\"\n />\n )}\n\n {status === 'planning' && (\n <span\n className=\"absolute inset-0 rounded-full animate-breath bg-current opacity-15\"\n aria-hidden=\"true\"\n />\n )}\n\n {status === 'responding' && (\n <span\n className=\"absolute inset-0 rounded-full animate-ping bg-current opacity-20\"\n aria-hidden=\"true\"\n />\n )}\n\n {status === 'tool-calling' && (\n <span\n className=\"absolute inset-0 rounded-full border-2 border-transparent border-t-current animate-spin opacity-60\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n </AvatarContext.Provider>\n )\n }\n)\nAvatar.displayName = 'Avatar'\n\n// ============================================================================\n// AvatarImage\n// ============================================================================\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /**\n * Callback when loading status changes\n */\n onLoadingStatusChange?: (status: ImageLoadingStatus) => void\n}\n\nexport const AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ src, alt, onLoadingStatusChange, className, ...props }, ref) => {\n const { setImageStatus } = useAvatarContext()\n\n React.useEffect(() => {\n if (!src) {\n setImageStatus('idle')\n onLoadingStatusChange?.('idle')\n return\n }\n\n setImageStatus('loading')\n onLoadingStatusChange?.('loading')\n\n const img = new Image()\n\n img.onload = () => {\n setImageStatus('loaded')\n onLoadingStatusChange?.('loaded')\n }\n\n img.onerror = () => {\n setImageStatus('error')\n onLoadingStatusChange?.('error')\n }\n\n img.src = src\n\n return () => {\n img.onload = null\n img.onerror = null\n }\n }, [src, setImageStatus, onLoadingStatusChange])\n\n const { imageStatus } = useAvatarContext()\n\n if (!src || imageStatus !== 'loaded') {\n return null\n }\n\n return (\n <img\n ref={ref}\n src={src}\n alt={alt}\n className={cn('w-full h-full object-cover', className)}\n {...props}\n />\n )\n }\n)\nAvatarImage.displayName = 'AvatarImage'\n\n// ============================================================================\n// AvatarFallback\n// ============================================================================\n\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Color variant\n * @default \"neutral\" (or derived from role)\n */\n variant?: AvatarVariant\n /**\n * Delay before showing fallback (ms)\n * @default 0\n */\n delayMs?: number\n}\n\nexport const AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ variant, delayMs = 0, className, children, ...props }, ref) => {\n const { role, imageStatus } = useAvatarContext()\n const [canRender, setCanRender] = React.useState(delayMs === 0)\n\n // Determine variant from prop or role\n const resolvedVariant = variant || (role ? roleToVariant[role] : 'neutral')\n\n // Determine fallback content\n const fallbackContent = children || (role ? roleSymbols[role] : null)\n\n React.useEffect(() => {\n if (delayMs === 0) {\n setCanRender(true)\n return\n }\n\n const timer = setTimeout(() => {\n setCanRender(true)\n }, delayMs)\n\n return () => clearTimeout(timer)\n }, [delayMs])\n\n // Only show if image not loaded and delay passed\n if (imageStatus === 'loaded' || !canRender) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'w-full h-full flex items-center justify-center',\n variantClasses[resolvedVariant],\n className\n )}\n {...props}\n >\n {fallbackContent}\n </div>\n )\n }\n)\nAvatarFallback.displayName = 'AvatarFallback'\n\n// ============================================================================\n// AvatarStatusIndicator\n// ============================================================================\n\nexport interface AvatarStatusIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * Presence status\n */\n status: PresenceStatus\n}\n\nexport const AvatarStatusIndicator = React.forwardRef<HTMLSpanElement, AvatarStatusIndicatorProps>(\n ({ status, className, ...props }, ref) => {\n const { size } = useAvatarContext()\n\n return (\n <span\n ref={ref}\n className={cn(\n 'absolute bottom-0 right-0 rounded-full border-2 border-white',\n presenceColors[status],\n statusIndicatorSizes[size],\n className\n )}\n aria-label={status}\n {...props}\n />\n )\n }\n)\nAvatarStatusIndicator.displayName = 'AvatarStatusIndicator'\n\n// ============================================================================\n// Utility exports\n// ============================================================================\n\nexport {\n sizeClasses as avatarSizeClasses,\n variantClasses as avatarVariantClasses,\n roleToVariant,\n roleSymbols,\n presenceColors,\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * Creates a throttled function that only invokes the provided function\n * at most once per specified interval.\n *\n * @param fn - The function to throttle\n * @param waitMs - The minimum time between invocations in milliseconds\n * @returns A throttled version of the function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n waitMs: number\n): T {\n let lastCallTime = 0\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n let lastArgs: Parameters<T> | null = null\n\n const throttled = (...args: Parameters<T>) => {\n const now = Date.now()\n const remaining = waitMs - (now - lastCallTime)\n\n lastArgs = args\n\n if (remaining <= 0) {\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n lastCallTime = now\n fn(...args)\n } else if (!timeoutId) {\n timeoutId = setTimeout(() => {\n lastCallTime = Date.now()\n timeoutId = null\n if (lastArgs) {\n fn(...lastArgs)\n }\n }, remaining)\n }\n }\n\n return throttled as T\n}\n\n/**\n * Format a date as relative time string\n * @param date - Date object or ISO string\n * @returns Relative time string (e.g., \"刚刚\", \"5分钟前\", \"2小时前\")\n */\nexport function formatRelativeTime(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const now = new Date()\n const diff = now.getTime() - d.getTime()\n\n const minutes = Math.floor(diff / 60000)\n const hours = Math.floor(diff / 3600000)\n const days = Math.floor(diff / 86400000)\n\n if (minutes < 1) return '刚刚'\n if (minutes < 60) return `${minutes}分钟前`\n if (hours < 24) return `${hours}小时前`\n if (days < 7) return `${days}天前`\n\n return d.toLocaleDateString('zh-CN', { month: 'short', day: 'numeric' })\n}\n","/**\n * AvatarGroup - Multi-avatar stack component\n *\n * Displays multiple avatars in a stacked layout with overflow handling.\n * Uses the composable Avatar system.\n *\n * @example Basic usage\n * ```tsx\n * <AvatarGroup>\n * <Avatar><AvatarImage src=\"/a.png\" /><AvatarFallback>A</AvatarFallback></Avatar>\n * <Avatar><AvatarImage src=\"/b.png\" /><AvatarFallback>B</AvatarFallback></Avatar>\n * </AvatarGroup>\n * ```\n *\n * @example With max and overflow\n * ```tsx\n * <AvatarGroup max={3}>\n * {agents.map(agent => (\n * <Avatar key={agent.id}>\n * <AvatarImage src={agent.avatar} />\n * <AvatarFallback>{agent.initials}</AvatarFallback>\n * </Avatar>\n * ))}\n * </AvatarGroup>\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\nimport { Avatar, AvatarFallback, type AvatarSize } from './Avatar'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Maximum number of avatars to show before overflow\n * @default 4\n */\n max?: number\n /**\n * Avatar size (applied to all children)\n * @default \"sm\"\n */\n size?: AvatarSize\n /**\n * Stack direction\n * @default \"left\"\n */\n direction?: 'left' | 'right'\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst overlapClasses: Record<AvatarSize, string> = {\n xs: '-ml-1.5',\n sm: '-ml-2',\n md: '-ml-3',\n lg: '-ml-4',\n xl: '-ml-5',\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * AvatarGroup Component\n *\n * Displays a stack of avatars with:\n * - Overlap effect (later avatars partially cover earlier ones)\n * - Overflow indicator (+N) when exceeding max\n * - Hover effect to show full avatar\n */\nexport const AvatarGroup = React.forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ max = 4, size = 'sm', direction = 'left', className, children, ...props }, ref) => {\n const childArray = React.Children.toArray(children)\n const visibleChildren = childArray.slice(0, max)\n const overflowCount = childArray.length - max\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center',\n direction === 'right' && 'flex-row-reverse',\n className\n )}\n role=\"group\"\n aria-label={`${childArray.length} items`}\n {...props}\n >\n {visibleChildren.map((child, index) => {\n const isFirst = index === 0\n\n // Clone child to add size and styling\n const clonedChild = React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<{ size?: AvatarSize; className?: string }>, {\n size,\n className: cn(\n (child as React.ReactElement<{ className?: string }>).props.className,\n 'border-2 border-white transition-transform hover:z-10 hover:scale-110'\n ),\n })\n : child\n\n return (\n <div\n key={index}\n className={cn(\n 'relative',\n !isFirst && (direction === 'left' ? overlapClasses[size] : '-mr-2')\n )}\n style={{ zIndex: visibleChildren.length - index }}\n >\n {clonedChild}\n </div>\n )\n })}\n\n {/* Overflow indicator */}\n {overflowCount > 0 && (\n <Avatar\n size={size}\n className={cn(\n 'border-2 border-white',\n direction === 'left' ? overlapClasses[size] : '-mr-2'\n )}\n style={{ zIndex: 0 }}\n aria-label={`${overflowCount} more`}\n >\n <AvatarFallback variant=\"neutral\">+{overflowCount}</AvatarFallback>\n </Avatar>\n )}\n </div>\n )\n }\n)\nAvatarGroup.displayName = 'AvatarGroup'\n","/**\n * AgentAvatar - Flexible avatar for agents and users\n *\n * General-purpose avatar component supporting images, icons, and initials\n * with multiple color variants and status indicators.\n *\n * @example Basic usage\n * ```tsx\n * <AgentAvatar name=\"Claude\" />\n * <AgentAvatar src=\"/avatar.png\" name=\"Claude\" status=\"online\" />\n * ```\n *\n * @example With variants\n * ```tsx\n * <AgentAvatar name=\"AI\" variant=\"primary\" />\n * <AgentAvatar name=\"User\" variant=\"secondary\" />\n * ```\n *\n * @example With loading status callback (Radix-style)\n * ```tsx\n * <AgentAvatar\n * src=\"/avatar.png\"\n * name=\"Claude\"\n * onLoadingStatusChange={(status) => console.log(status)}\n * fallbackDelayMs={600}\n * />\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Color variants for avatar backgrounds\n * @deprecated Use AvatarVariant from './Avatar' instead\n */\ntype AvatarVariant =\n | 'primary' // Blue - AI/rational\n | 'secondary' // Amber/gold - User/sentient\n | 'success' // Green\n | 'warning' // Yellow\n | 'error' // Red\n | 'info' // Blue (alias)\n | 'neutral' // Gray (default)\n\n/**\n * Image loading status (Radix-style)\n * @deprecated Use ImageLoadingStatus from './Avatar' instead\n */\ntype ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\nexport interface AgentAvatarProps {\n /**\n * Avatar image URL\n */\n src?: string\n /**\n * Agent name (used for fallback initials)\n */\n name: string\n /**\n * Custom icon component (displayed instead of initials when no src)\n */\n icon?: React.ReactNode\n /**\n * Color variant\n * @default \"neutral\"\n */\n variant?: AvatarVariant\n /**\n * Online status indicator\n */\n status?: 'online' | 'offline' | 'busy'\n /**\n * Avatar size\n * @default \"md\"\n */\n size?: 'sm' | 'md' | 'lg'\n /**\n * Callback when image loading status changes (Radix-style)\n */\n onLoadingStatusChange?: (status: ImageLoadingStatus) => void\n /**\n * Delay in ms before showing fallback (gives image time to load)\n * @default 0\n */\n fallbackDelayMs?: number\n /**\n * Additional CSS classes\n */\n className?: string\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst sizeClasses: Record<'sm' | 'md' | 'lg', string> = {\n sm: 'w-8 h-8 text-xs',\n md: 'w-10 h-10 text-sm',\n lg: 'w-12 h-12 text-base',\n}\n\nconst variantClasses: Record<AvatarVariant, string> = {\n primary: 'bg-primary-100 text-primary-700',\n secondary: 'bg-secondary-100 text-secondary-700',\n success: 'bg-green-100 text-green-700',\n warning: 'bg-amber-100 text-amber-700',\n error: 'bg-red-100 text-red-700',\n info: 'bg-blue-100 text-blue-700',\n neutral: 'bg-gray-100 text-gray-700',\n}\n\nconst statusColors: Record<'online' | 'offline' | 'busy', string> = {\n online: 'bg-green-500',\n offline: 'bg-gray-400',\n busy: 'bg-amber-500',\n}\n\nconst statusSizes = {\n sm: 'w-2.5 h-2.5',\n md: 'w-3 h-3',\n lg: 'w-3.5 h-3.5',\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to track image loading status (Radix-style)\n */\nfunction useImageLoadingStatus(\n src: string | undefined,\n onStatusChange?: (status: ImageLoadingStatus) => void\n): ImageLoadingStatus {\n const [status, setStatus] = React.useState<ImageLoadingStatus>('idle')\n\n React.useEffect(() => {\n if (!src) {\n setStatus('idle')\n onStatusChange?.('idle')\n return\n }\n\n setStatus('loading')\n onStatusChange?.('loading')\n\n const img = new Image()\n\n img.onload = () => {\n setStatus('loaded')\n onStatusChange?.('loaded')\n }\n\n img.onerror = () => {\n setStatus('error')\n onStatusChange?.('error')\n }\n\n img.src = src\n\n return () => {\n img.onload = null\n img.onerror = null\n }\n }, [src, onStatusChange])\n\n return status\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * AgentAvatar Component\n *\n * Flexible avatar component for displaying agents and users.\n * Supports images, custom icons, and fallback initials with\n * multiple color variants and status indicators.\n *\n * Features:\n * - Image loading status tracking (Radix-style)\n * - Automatic fallback with optional delay\n * - Multiple color variants\n * - Online/offline/busy status indicators\n */\nexport const AgentAvatar = React.forwardRef<HTMLDivElement, AgentAvatarProps>(\n (\n {\n src,\n name,\n icon,\n variant = 'neutral',\n status,\n size = 'md',\n onLoadingStatusChange,\n fallbackDelayMs = 0,\n className,\n },\n ref\n ) => {\n const imageStatus = useImageLoadingStatus(src, onLoadingStatusChange)\n const [showFallback, setShowFallback] = React.useState(!src)\n\n // Handle fallback delay\n React.useEffect(() => {\n if (!src) {\n setShowFallback(true)\n return\n }\n\n if (imageStatus === 'loaded') {\n setShowFallback(false)\n return\n }\n\n if (imageStatus === 'error') {\n setShowFallback(true)\n return\n }\n\n // During loading, optionally delay showing fallback\n if (fallbackDelayMs > 0) {\n setShowFallback(false)\n const timer = setTimeout(() => {\n if (imageStatus === 'loading') {\n setShowFallback(true)\n }\n }, fallbackDelayMs)\n return () => clearTimeout(timer)\n } else {\n setShowFallback(true)\n }\n }, [src, imageStatus, fallbackDelayMs])\n\n const initials = name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n\n const showImage = src && imageStatus === 'loaded'\n\n return (\n <div ref={ref} className={cn('relative inline-block shrink-0', className)}>\n {/* Image layer */}\n {src && (\n <img\n src={src}\n alt={name}\n className={cn(\n 'rounded-full object-cover',\n sizeClasses[size],\n showImage ? 'opacity-100' : 'opacity-0 absolute inset-0'\n )}\n />\n )}\n\n {/* Fallback layer */}\n {(!src || showFallback) && !showImage && (\n <div\n className={cn(\n 'rounded-full flex items-center justify-center font-medium',\n variantClasses[variant],\n sizeClasses[size]\n )}\n role=\"img\"\n aria-label={name}\n >\n {icon || initials}\n </div>\n )}\n\n {/* Status indicator */}\n {status && (\n <span\n className={cn(\n 'absolute bottom-0 right-0 rounded-full border-2 border-white',\n statusColors[status],\n statusSizes[size]\n )}\n aria-label={status}\n />\n )}\n </div>\n )\n }\n)\nAgentAvatar.displayName = 'AgentAvatar'\n\n// ============================================================================\n// Utility exports (kept for backward compatibility, prefer Avatar.tsx exports)\n// ============================================================================\n\nexport { useImageLoadingStatus }\n","/**\n * MessageAvatar - Role-driven avatar for chat messages\n *\n * Automatically maps message role to color and symbol.\n * Based on AgentX u/a/s/t convention.\n *\n * @example Basic usage\n * ```tsx\n * <MessageAvatar role=\"user\" />\n * <MessageAvatar role=\"assistant\" />\n * <MessageAvatar role=\"tool\" />\n * ```\n *\n * @example With AI status animation\n * ```tsx\n * <MessageAvatar role=\"assistant\" status=\"thinking\" />\n * <MessageAvatar role=\"assistant\" status=\"responding\" />\n * <MessageAvatar role=\"tool\" status=\"tool-calling\" />\n * ```\n *\n * @example With custom image\n * ```tsx\n * <MessageAvatar role=\"assistant\" src=\"/claude.png\" name=\"Claude\" />\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\nimport type { MessageRole } from '../types'\n\n// Re-export for convenience\nexport type { MessageRole } from '../types'\n\n/**\n * AI-specific dynamic status for avatar animations\n * - idle: No animation (default)\n * - thinking: Pulsing animation - AI is processing\n * - responding: Breathing effect - AI is streaming response\n * - tool-calling: Spinning indicator - AI is calling tools\n */\nexport type AvatarStatus = 'idle' | 'thinking' | 'responding' | 'tool-calling'\n\nexport interface MessageAvatarProps {\n /**\n * Message role - determines color and default symbol\n */\n role: MessageRole\n /**\n * AI dynamic status - triggers animations\n * @default \"idle\"\n */\n status?: AvatarStatus\n /**\n * Custom avatar image URL (overrides default symbol)\n */\n src?: string\n /**\n * Agent/user name (used for alt text and custom initials)\n */\n name?: string\n /**\n * Custom icon component (overrides default symbol)\n */\n icon?: React.ReactNode\n /**\n * Avatar size\n * @default \"md\"\n */\n size?: 'sm' | 'md' | 'lg'\n /**\n * Additional CSS classes\n */\n className?: string\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Role to symbol mapping (U/A/S/T/!)\n */\nconst roleSymbols: Record<MessageRole, string> = {\n user: 'U',\n assistant: 'A',\n system: 'S',\n tool: 'T',\n error: '!',\n}\n\n/**\n * Role to color mapping using semantic design tokens\n * - user: primary (blue) - precise commands\n * - assistant: secondary (amber/gold) - generative thinking\n * - system: muted (gray) - neutral system info\n * - tool: accent (orange) - action/execution\n * - error: destructive (red) - errors\n */\nconst roleColors: Record<MessageRole, string> = {\n user: 'bg-primary-500 text-white',\n assistant: 'bg-secondary-500 text-white',\n system: 'bg-gray-200 text-gray-600',\n tool: 'bg-orange-500 text-white',\n error: 'bg-red-500 text-white',\n}\n\n/**\n * Size classes for avatar container\n */\nconst sizeClasses: Record<'sm' | 'md' | 'lg', string> = {\n sm: 'w-6 h-6 text-xs',\n md: 'w-8 h-8 text-sm',\n lg: 'w-10 h-10 text-base',\n}\n\n/**\n * AI status animation classes\n * - thinking: pulse animation (scale + opacity)\n * - responding: breathing glow effect\n * - tool-calling: spinning ring indicator\n */\nconst statusAnimations: Record<AvatarStatus, string> = {\n idle: '',\n thinking: 'animate-pulse',\n responding: 'animate-breath',\n 'tool-calling': '',\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * MessageAvatar Component\n *\n * Role-driven avatar that automatically applies appropriate colors and symbols\n * based on the message role (user/assistant/system/tool/error).\n *\n * Design philosophy:\n * - User messages use primary color (rational blue) - precise commands\n * - Assistant messages use secondary color (sentient gold) - generative thinking\n * - System/tool messages use neutral colors\n * - Error messages use destructive red\n *\n * AI Status animations:\n * - thinking: Pulsing effect indicating AI is processing\n * - responding: Breathing glow effect during streaming\n * - tool-calling: Spinning ring indicator for tool execution\n */\nexport const MessageAvatar = React.forwardRef<HTMLDivElement, MessageAvatarProps>(\n ({ role, status = 'idle', src, name, icon, size = 'md', className }, ref) => {\n // Determine display content priority: image > icon > name initials > role symbol\n const symbol = roleSymbols[role]\n const displayText = name ? name.charAt(0).toUpperCase() : symbol\n const isToolCalling = status === 'tool-calling'\n\n return (\n <div\n ref={ref}\n className={cn(\n 'relative inline-flex items-center justify-center rounded-full font-medium shrink-0',\n roleColors[role],\n sizeClasses[size],\n statusAnimations[status],\n className\n )}\n role=\"img\"\n aria-label={name || role}\n aria-busy={status !== 'idle'}\n >\n {src ? (\n <img\n src={src}\n alt={name || role}\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : icon ? (\n <span className=\"flex items-center justify-center\">{icon}</span>\n ) : (\n <span>{displayText}</span>\n )}\n\n {/* Tool-calling spinning ring indicator */}\n {isToolCalling && (\n <span\n className={cn(\n 'absolute inset-0 rounded-full border-2 border-transparent',\n 'border-t-white/80 animate-spin'\n )}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Responding glow effect */}\n {status === 'responding' && (\n <span\n className={cn(\n 'absolute inset-0 rounded-full',\n 'animate-ping opacity-30',\n roleColors[role]\n )}\n aria-hidden=\"true\"\n />\n )}\n </div>\n )\n }\n)\nMessageAvatar.displayName = 'MessageAvatar'\n\n// ============================================================================\n// Utility exports (roleColors and statusAnimations are unique to MessageAvatar)\n// ============================================================================\n\nexport { roleColors, statusAnimations }\n","import * as React from 'react'\nimport { cn } from '../utils'\nimport { AgentAvatar } from './AgentAvatar'\n\nexport interface ChatBubbleProps {\n /**\n * Message role\n */\n role: 'user' | 'assistant' | 'system'\n /**\n * Avatar image URL (for assistant)\n */\n avatar?: string\n /**\n * Agent/user name\n */\n name?: string\n /**\n * Message content\n */\n children: React.ReactNode\n /**\n * Timestamp\n */\n timestamp?: string | Date\n /**\n * Additional CSS classes\n */\n className?: string\n}\n\n/**\n * ChatBubble Component\n *\n * @deprecated Use `ChatMessageSimple` instead. ChatBubble will be removed in a future version.\n *\n * ChatMessageSimple provides the same functionality but is built on the composable\n * ChatMessage primitives, ensuring consistent styling and behavior.\n *\n * @example Migration\n * ```tsx\n * // Before (deprecated)\n * <ChatBubble role=\"assistant\" avatar=\"/claude.png\" name=\"Claude\">\n * Hello!\n * </ChatBubble>\n *\n * // After (recommended)\n * <ChatMessageSimple\n * role=\"assistant\"\n * avatar=\"/claude.png\"\n * name=\"Claude\"\n * content=\"Hello!\"\n * />\n * ```\n */\nexport function ChatBubble({\n role,\n avatar,\n name,\n children,\n timestamp,\n className,\n}: ChatBubbleProps) {\n const isUser = role === 'user'\n const isSystem = role === 'system'\n\n if (isSystem) {\n return (\n <div className={cn('flex justify-center my-4', className)}>\n <div className=\"text-sm text-gray-500 bg-gray-50 px-4 py-2 rounded-full\">\n {children}\n </div>\n </div>\n )\n }\n\n const formattedTime = timestamp\n ? typeof timestamp === 'string'\n ? timestamp\n : timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n : null\n\n return (\n <div\n className={cn(\n 'flex gap-3 my-4',\n isUser ? 'flex-row-reverse' : 'flex-row',\n className\n )}\n >\n {/* Avatar (only for assistant) */}\n {!isUser && (\n <div className=\"flex-shrink-0\">\n <AgentAvatar\n src={avatar}\n name={name || 'AI'}\n size=\"md\"\n />\n </div>\n )}\n\n {/* Message content */}\n <div\n className={cn(\n 'flex flex-col max-w-[70%]',\n isUser ? 'items-end' : 'items-start'\n )}\n >\n {/* Name */}\n {name && !isUser && (\n <span className=\"text-sm font-medium text-gray-900 mb-1\">\n {name}\n </span>\n )}\n\n {/* Bubble */}\n <div\n className={cn(\n 'px-4 py-3 rounded-2xl',\n isUser\n ? 'bg-primary-500 text-white rounded-br-sm'\n : 'bg-gray-100 text-gray-900 rounded-bl-sm'\n )}\n >\n {children}\n </div>\n\n {/* Timestamp */}\n {formattedTime && (\n <span className=\"text-xs text-gray-400 mt-1\">\n {formattedTime}\n </span>\n )}\n </div>\n </div>\n )\n}\n","/**\n * ChatInput - Composable input components for AI chat\n *\n * Follows the \"composition over configuration\" pattern from shadcn/ui and Vercel.\n * Components can be freely composed to create custom input layouts.\n *\n * @example Basic usage\n * ```tsx\n * <ChatInput onSubmit={handleSubmit}>\n * <ChatInputTextarea placeholder=\"Ask anything...\" />\n * <ChatInputToolbar>\n * <ChatInputTools>\n * <ChatInputButton onClick={handleAttach}>\n * <PaperclipIcon />\n * </ChatInputButton>\n * </ChatInputTools>\n * <ChatInputSubmit status={status} />\n * </ChatInputToolbar>\n * </ChatInput>\n * ```\n *\n * @example With mentions\n * ```tsx\n * <ChatInput onSubmit={handleSubmit}>\n * <ChatInputTextarea\n * onMentionQuery={searchAgents}\n * mentionTrigger=\"@\"\n * />\n * <ChatInputToolbar>\n * <ChatInputSubmit />\n * </ChatInputToolbar>\n * </ChatInput>\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ChatStatus = 'idle' | 'submitted' | 'streaming' | 'error'\n\n/**\n * @deprecated Use MentionAgent from MentionPopover instead\n */\nexport interface ChatInputMentionItem {\n id: string\n name: string\n avatar?: string\n description?: string\n}\n\n// Internal alias for backward compatibility\ntype MentionItem = ChatInputMentionItem\n\n// ============================================================================\n// ChatInput (Container)\n// ============================================================================\n\nexport interface ChatInputProps extends React.FormHTMLAttributes<HTMLFormElement> {\n /**\n * Callback when form is submitted\n */\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void\n}\n\n/**\n * Container component for chat input.\n * Renders as a form element.\n */\nexport const ChatInput = React.forwardRef<HTMLFormElement, ChatInputProps>(\n ({ className, onSubmit, ...props }, ref) => {\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n onSubmit?.(e)\n }\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n className={cn(\n 'w-full overflow-hidden rounded-xl border border-gray-200 bg-white shadow-sm',\n 'focus-within:border-primary-500 focus-within:ring-1 focus-within:ring-primary-500',\n 'transition-shadow',\n className\n )}\n {...props}\n />\n )\n }\n)\nChatInput.displayName = 'ChatInput'\n\n// ============================================================================\n// ChatInputTextarea\n// ============================================================================\n\nexport interface ChatInputTextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> {\n /**\n * Controlled value\n */\n value?: string\n /**\n * Value change callback\n */\n onChange?: (value: string) => void\n /**\n * Minimum height in pixels\n * @default 48\n */\n minHeight?: number\n /**\n * Maximum height in pixels\n * @default 200\n */\n maxHeight?: number\n /**\n * Trigger character for mentions\n * @default \"@\"\n */\n mentionTrigger?: string\n /**\n * Callback to query mention candidates\n */\n onMentionQuery?: (query: string) => MentionItem[]\n /**\n * Available mention items (used if onMentionQuery not provided)\n */\n mentionItems?: MentionItem[]\n /**\n * Callback when a mention is selected\n */\n onMentionSelect?: (item: MentionItem) => void\n}\n\n/**\n * Auto-resizing textarea with optional @mention support.\n */\nexport const ChatInputTextarea = React.forwardRef<\n HTMLTextAreaElement,\n ChatInputTextareaProps\n>(\n (\n {\n className,\n value,\n onChange,\n placeholder = 'Type a message...',\n minHeight = 48,\n maxHeight = 200,\n mentionTrigger = '@',\n onMentionQuery,\n mentionItems = [],\n onMentionSelect,\n onKeyDown,\n ...props\n },\n ref\n ) => {\n const innerRef = React.useRef<HTMLTextAreaElement>(null)\n\n // Combine forwarded ref with internal ref\n React.useImperativeHandle(ref, () => innerRef.current as HTMLTextAreaElement)\n\n // Mention state\n const [showMentions, setShowMentions] = React.useState(false)\n const [mentionQuery, setMentionQuery] = React.useState('')\n const [mentionIndex, setMentionIndex] = React.useState(0)\n const [mentionPosition, setMentionPosition] = React.useState<{\n top: number\n left: number\n } | null>(null)\n const mentionStartRef = React.useRef<number | null>(null)\n\n // Get filtered mentions\n const filteredMentions = React.useMemo(() => {\n if (onMentionQuery) {\n return onMentionQuery(mentionQuery)\n }\n if (!mentionQuery) return mentionItems.slice(0, 8)\n const query = mentionQuery.toLowerCase()\n return mentionItems\n .filter(\n (item) =>\n item.name.toLowerCase().includes(query) ||\n item.description?.toLowerCase().includes(query)\n )\n .slice(0, 8)\n }, [mentionQuery, mentionItems, onMentionQuery])\n\n // Auto-resize\n React.useEffect(() => {\n const textarea = innerRef.current\n if (textarea) {\n textarea.style.height = 'auto'\n const newHeight = Math.min(Math.max(textarea.scrollHeight, minHeight), maxHeight)\n textarea.style.height = `${newHeight}px`\n }\n }, [value, minHeight, maxHeight])\n\n // Handle input change\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n const selectionStart = e.target.selectionStart\n onChange?.(newValue)\n\n // Check for mention trigger\n const textBeforeCursor = newValue.slice(0, selectionStart)\n const lastTriggerIndex = textBeforeCursor.lastIndexOf(mentionTrigger)\n\n if (lastTriggerIndex !== -1) {\n const textAfterTrigger = textBeforeCursor.slice(lastTriggerIndex + 1)\n // Valid mention context: no space, reasonable length\n if (!textAfterTrigger.includes(' ') && textAfterTrigger.length <= 20) {\n mentionStartRef.current = lastTriggerIndex\n setMentionQuery(textAfterTrigger)\n setShowMentions(true)\n setMentionIndex(0)\n\n // Calculate popup position\n if (innerRef.current) {\n const rect = innerRef.current.getBoundingClientRect()\n setMentionPosition({\n top: rect.bottom + 4,\n left: rect.left,\n })\n }\n return\n }\n }\n\n setShowMentions(false)\n mentionStartRef.current = null\n }\n\n // Select mention\n const selectMention = React.useCallback(\n (item: MentionItem) => {\n if (mentionStartRef.current === null || value === undefined) return\n\n const before = value.slice(0, mentionStartRef.current)\n const after = value.slice(mentionStartRef.current + mentionQuery.length + 1)\n const newValue = `${before}${mentionTrigger}${item.name} ${after}`\n\n onChange?.(newValue)\n onMentionSelect?.(item)\n setShowMentions(false)\n mentionStartRef.current = null\n\n // Focus back\n setTimeout(() => {\n if (innerRef.current) {\n const newCursorPos = before.length + item.name.length + 2\n innerRef.current.focus()\n innerRef.current.setSelectionRange(newCursorPos, newCursorPos)\n }\n }, 0)\n },\n [value, mentionQuery, mentionTrigger, onChange, onMentionSelect]\n )\n\n // Handle keyboard\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Mention navigation\n if (showMentions && filteredMentions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setMentionIndex((prev) => (prev + 1) % filteredMentions.length)\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n setMentionIndex((prev) => (prev - 1 + filteredMentions.length) % filteredMentions.length)\n return\n }\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault()\n selectMention(filteredMentions[mentionIndex])\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n setShowMentions(false)\n return\n }\n }\n\n // Submit on Enter (without Shift), respecting IME\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n const form = e.currentTarget.form\n if (form) {\n form.requestSubmit()\n }\n }\n\n onKeyDown?.(e)\n }\n\n return (\n <>\n <textarea\n ref={innerRef}\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n className={cn(\n 'w-full resize-none border-none bg-transparent p-4',\n 'text-sm text-gray-900 placeholder:text-gray-400',\n 'focus:outline-none focus:ring-0',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n style={{ minHeight, maxHeight }}\n {...props}\n />\n\n {/* Mention popup */}\n {showMentions && filteredMentions.length > 0 && mentionPosition && (\n <InternalMentionPopover\n items={filteredMentions}\n selectedIndex={mentionIndex}\n onSelect={selectMention}\n style={{\n position: 'fixed',\n top: mentionPosition.top,\n left: mentionPosition.left,\n }}\n />\n )}\n </>\n )\n }\n)\nChatInputTextarea.displayName = 'ChatInputTextarea'\n\n// ============================================================================\n// ChatInputToolbar\n// ============================================================================\n\nexport interface ChatInputToolbarProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Toolbar container for input actions.\n * Typically placed below the textarea.\n */\nexport const ChatInputToolbar = React.forwardRef<HTMLDivElement, ChatInputToolbarProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center justify-between border-t border-gray-100 p-2', className)}\n {...props}\n />\n )\n)\nChatInputToolbar.displayName = 'ChatInputToolbar'\n\n// ============================================================================\n// ChatInputTools\n// ============================================================================\n\nexport interface ChatInputToolsProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Container for tool buttons (left side of toolbar).\n */\nexport const ChatInputTools = React.forwardRef<HTMLDivElement, ChatInputToolsProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center gap-1', className)} {...props} />\n )\n)\nChatInputTools.displayName = 'ChatInputTools'\n\n// ============================================================================\n// ChatInputButton\n// ============================================================================\n\nexport interface ChatInputButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Visual variant\n */\n variant?: 'ghost' | 'default'\n}\n\n/**\n * Button for toolbar actions (attach, emoji, etc.)\n */\nexport const ChatInputButton = React.forwardRef<HTMLButtonElement, ChatInputButtonProps>(\n ({ className, variant = 'ghost', type = 'button', ...props }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'inline-flex items-center justify-center rounded-lg p-2 transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-50',\n variant === 'ghost' && 'text-gray-500 hover:bg-gray-100 hover:text-gray-700',\n variant === 'default' && 'bg-primary-500 text-white hover:bg-primary-600',\n className\n )}\n {...props}\n />\n )\n)\nChatInputButton.displayName = 'ChatInputButton'\n\n// ============================================================================\n// ChatInputSubmit\n// ============================================================================\n\nexport interface ChatInputSubmitProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Current chat status\n */\n status?: ChatStatus\n /**\n * Callback when stop is clicked (during streaming)\n */\n onStop?: () => void\n}\n\n/**\n * Submit button with status-aware icons.\n */\nexport const ChatInputSubmit = React.forwardRef<HTMLButtonElement, ChatInputSubmitProps>(\n ({ className, status = 'idle', onStop, disabled, type, ...props }, ref) => {\n const isStreaming = status === 'streaming'\n const isSubmitting = status === 'submitted'\n const isDisabled = disabled || isSubmitting\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isStreaming && onStop) {\n e.preventDefault()\n onStop()\n }\n }\n\n return (\n <button\n ref={ref}\n type={isStreaming ? 'button' : 'submit'}\n disabled={isDisabled}\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center justify-center rounded-lg p-2 transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-50',\n isStreaming\n ? 'bg-red-500 text-white hover:bg-red-600'\n : 'bg-primary-500 text-white hover:bg-primary-600',\n className\n )}\n {...props}\n >\n {isSubmitting ? (\n <LoaderIcon className=\"h-5 w-5 animate-spin\" />\n ) : isStreaming ? (\n <StopIcon className=\"h-5 w-5\" />\n ) : (\n <SendIcon className=\"h-5 w-5\" />\n )}\n </button>\n )\n }\n)\nChatInputSubmit.displayName = 'ChatInputSubmit'\n\n// ============================================================================\n// Internal MentionPopover (simple version for ChatInput)\n// For full-featured MentionPopover, use the standalone component\n// ============================================================================\n\ninterface InternalMentionPopoverProps {\n items: MentionItem[]\n selectedIndex: number\n onSelect: (item: MentionItem) => void\n style?: React.CSSProperties\n className?: string\n}\n\n/**\n * Internal popup for @mention selection.\n * @internal\n */\nfunction InternalMentionPopover({\n items,\n selectedIndex,\n onSelect,\n style,\n className,\n}: InternalMentionPopoverProps) {\n return (\n <div\n className={cn(\n 'z-50 w-72 max-h-64 overflow-y-auto',\n 'bg-white rounded-xl shadow-lg border border-gray-200',\n 'py-1',\n className\n )}\n style={style}\n >\n {items.map((item, index) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => onSelect(item)}\n className={cn(\n 'w-full flex items-center gap-3 px-3 py-2.5 text-left',\n 'transition-colors',\n index === selectedIndex\n ? 'bg-primary-50 text-primary-900'\n : 'hover:bg-gray-50'\n )}\n >\n {/* Avatar */}\n {item.avatar ? (\n <img\n src={item.avatar}\n alt={item.name}\n className=\"h-9 w-9 rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex h-9 w-9 items-center justify-center rounded-full bg-primary-100\">\n <span className=\"text-sm font-medium text-primary-700\">\n {item.name.charAt(0).toUpperCase()}\n </span>\n </div>\n )}\n\n {/* Info */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-gray-900\">{item.name}</div>\n {item.description && (\n <div className=\"truncate text-xs text-gray-500\">{item.description}</div>\n )}\n </div>\n </button>\n ))}\n </div>\n )\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction SendIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\" />\n </svg>\n )\n}\n\nfunction StopIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\n </svg>\n )\n}\n\nfunction LoaderIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )\n}\n","/**\n * ChatMessage - Composable message component system\n *\n * Provides composable primitives for building chat messages.\n * Each part can be used independently or composed together.\n *\n * @example Full composition\n * ```tsx\n * <ChatMessage role=\"assistant\" status=\"streaming\">\n * <ChatMessageAvatar src=\"/claude.png\" name=\"Claude\" />\n * <ChatMessageContent>\n * <StreamText stream={stream} />\n * </ChatMessageContent>\n * <ChatMessageTimestamp time={new Date()} />\n * </ChatMessage>\n * ```\n *\n * @example Minimal composition\n * ```tsx\n * <ChatMessage role=\"user\">\n * <ChatMessageContent>Hello!</ChatMessageContent>\n * </ChatMessage>\n * ```\n *\n * @example With thinking state\n * ```tsx\n * <ChatMessage role=\"assistant\" status=\"thinking\">\n * <ChatMessageAvatar />\n * <ChatMessageContent>\n * <ChatMessageThinking label=\"Analyzing...\" />\n * </ChatMessageContent>\n * </ChatMessage>\n * ```\n *\n * @example Pre-composed simple version\n * ```tsx\n * <ChatMessageSimple\n * role=\"assistant\"\n * status=\"streaming\"\n * stream={stream}\n * avatar=\"/claude.png\"\n * name=\"Claude\"\n * />\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\nimport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n type AvatarAnimationStatus,\n} from './Avatar'\nimport { StreamText, type StreamTextProps } from './StreamText'\nimport type { MessageRole, MessageStatus } from '../types'\n\n// Re-export for convenience\nexport type { MessageRole, MessageStatus } from '../types'\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ChatMessageContextValue {\n role: MessageRole\n status: MessageStatus\n isUser: boolean\n}\n\nconst ChatMessageContext = React.createContext<ChatMessageContextValue | null>(null)\n\nfunction useChatMessageContext() {\n const context = React.useContext(ChatMessageContext)\n if (!context) {\n throw new Error('ChatMessage components must be used within <ChatMessage>')\n }\n return context\n}\n\n// Expose context hook for advanced usage\nexport { useChatMessageContext }\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst roleToVariant: Record<MessageRole, 'primary' | 'secondary' | 'neutral' | 'warning' | 'error'> = {\n user: 'primary',\n assistant: 'secondary',\n system: 'neutral',\n tool: 'warning',\n error: 'error',\n}\n\nconst statusToAnimation: Record<MessageStatus, AvatarAnimationStatus> = {\n idle: 'idle',\n thinking: 'thinking',\n streaming: 'responding',\n complete: 'idle',\n error: 'idle',\n}\n\n// ============================================================================\n// ChatMessage (Container)\n// ============================================================================\n\nexport interface ChatMessageProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Message role - determines layout direction and default styling\n */\n role: MessageRole\n /**\n * Message status - provides context to children\n * @default \"complete\"\n */\n status?: MessageStatus\n}\n\n/**\n * ChatMessage Container\n *\n * Provides context for child components and handles layout.\n * User messages align right, others align left.\n */\nexport const ChatMessage = React.forwardRef<HTMLDivElement, ChatMessageProps>(\n ({ role, status = 'complete', className, children, ...props }, ref) => {\n const isUser = role === 'user'\n const isSystem = role === 'system'\n\n const contextValue: ChatMessageContextValue = {\n role,\n status,\n isUser,\n }\n\n // System messages are centered\n if (isSystem) {\n return (\n <ChatMessageContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn('flex justify-center my-4', className)}\n data-role={role}\n data-status={status}\n {...props}\n >\n {children}\n </div>\n </ChatMessageContext.Provider>\n )\n }\n\n return (\n <ChatMessageContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn(\n 'flex gap-3 my-4',\n isUser ? 'flex-row-reverse' : 'flex-row',\n className\n )}\n data-role={role}\n data-status={status}\n {...props}\n >\n {children}\n </div>\n </ChatMessageContext.Provider>\n )\n }\n)\nChatMessage.displayName = 'ChatMessage'\n\n// ============================================================================\n// ChatMessageAvatar\n// ============================================================================\n\nexport interface ChatMessageAvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Avatar image URL\n */\n src?: string\n /**\n * Name for fallback initials\n */\n name?: string\n /**\n * Override animation status (defaults to message status)\n */\n animationStatus?: AvatarAnimationStatus\n}\n\n/**\n * ChatMessageAvatar\n *\n * Avatar with automatic animation based on message status.\n * Uses role from context for default styling.\n */\nexport const ChatMessageAvatar = React.forwardRef<HTMLDivElement, ChatMessageAvatarProps>(\n ({ src, name, animationStatus, className, ...props }, ref) => {\n const { role, status, isUser } = useChatMessageContext()\n\n // Don't render avatar for user messages by default\n if (isUser) return null\n\n const animation = animationStatus ?? statusToAnimation[status]\n const variant = roleToVariant[role]\n const fallbackChar = name?.charAt(0).toUpperCase() || role.charAt(0).toUpperCase()\n\n return (\n <div ref={ref} className={cn('flex-shrink-0', className)} {...props}>\n <Avatar size=\"md\" status={animation}>\n {src && <AvatarImage src={src} alt={name || role} />}\n <AvatarFallback variant={variant}>{fallbackChar}</AvatarFallback>\n </Avatar>\n </div>\n )\n }\n)\nChatMessageAvatar.displayName = 'ChatMessageAvatar'\n\n// ============================================================================\n// ChatMessageContent\n// ============================================================================\n\nexport interface ChatMessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Name to display above content (typically for assistant)\n */\n name?: string\n}\n\nconst contentStyles: Record<MessageRole, string> = {\n user: 'bg-primary-500 text-white rounded-2xl rounded-br-sm',\n assistant: 'bg-gray-100 text-gray-900 rounded-2xl rounded-bl-sm',\n system: 'bg-gray-50 text-gray-500 rounded-full text-sm',\n tool: 'bg-amber-50 text-amber-900 rounded-xl',\n error: 'bg-red-50 text-red-900 rounded-xl',\n}\n\n/**\n * ChatMessageContent\n *\n * Content container with role-based styling.\n * Renders children as message content.\n */\nexport const ChatMessageContent = React.forwardRef<HTMLDivElement, ChatMessageContentProps>(\n ({ name, className, children, ...props }, ref) => {\n const { role, status, isUser } = useChatMessageContext()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col max-w-[70%]',\n isUser ? 'items-end' : 'items-start',\n className\n )}\n {...props}\n >\n {/* Name label */}\n {name && !isUser && (\n <span className=\"text-sm font-medium text-gray-900 mb-1\">{name}</span>\n )}\n\n {/* Content bubble */}\n <div\n className={cn('px-4 py-3', contentStyles[role])}\n aria-busy={status === 'thinking' || status === 'streaming'}\n aria-live={status === 'streaming' ? 'polite' : undefined}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nChatMessageContent.displayName = 'ChatMessageContent'\n\n// ============================================================================\n// ChatMessageTimestamp\n// ============================================================================\n\nexport interface ChatMessageTimestampProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * Time to display\n */\n time: Date | string\n /**\n * Custom format function\n */\n format?: (time: Date) => string\n}\n\n/**\n * ChatMessageTimestamp\n *\n * Renders formatted timestamp below message content.\n */\nexport const ChatMessageTimestamp = React.forwardRef<HTMLSpanElement, ChatMessageTimestampProps>(\n ({ time, format, className, ...props }, ref) => {\n const { status } = useChatMessageContext()\n\n // Don't show timestamp during streaming\n if (status === 'thinking' || status === 'streaming') {\n return null\n }\n\n const date = typeof time === 'string' ? new Date(time) : time\n const formatted = format\n ? format(date)\n : date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n\n return (\n <span\n ref={ref}\n className={cn('text-xs text-gray-400 mt-1', className)}\n {...props}\n >\n {formatted}\n </span>\n )\n }\n)\nChatMessageTimestamp.displayName = 'ChatMessageTimestamp'\n\n// ============================================================================\n// ChatMessageThinking\n// ============================================================================\n\nexport interface ChatMessageThinkingProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * Custom thinking label\n */\n label?: string\n}\n\n/**\n * ChatMessageThinking\n *\n * Animated thinking indicator for use inside ChatMessageContent.\n */\nexport const ChatMessageThinking = React.forwardRef<HTMLSpanElement, ChatMessageThinkingProps>(\n ({ label, className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn('inline-flex items-center gap-2 text-gray-500', className)}\n {...props}\n >\n <span className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className=\"w-1.5 h-1.5 bg-secondary-500 rounded-full animate-bounce\"\n style={{ animationDelay: `${i * 150}ms`, animationDuration: '600ms' }}\n />\n ))}\n </span>\n {label && <span className=\"text-sm\">{label}</span>}\n </span>\n )\n }\n)\nChatMessageThinking.displayName = 'ChatMessageThinking'\n\n// ============================================================================\n// ChatMessageError\n// ============================================================================\n\nexport interface ChatMessageErrorProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * Error message\n */\n message?: string\n /**\n * Retry callback\n */\n onRetry?: () => void\n}\n\n/**\n * ChatMessageError\n *\n * Error display with optional retry button.\n */\nexport const ChatMessageError = React.forwardRef<HTMLSpanElement, ChatMessageErrorProps>(\n ({ message = 'Something went wrong', onRetry, className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn('flex items-center gap-2 text-red-600', className)}\n role=\"alert\"\n {...props}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span>{message}</span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"text-sm underline hover:no-underline\"\n >\n Retry\n </button>\n )}\n </span>\n )\n }\n)\nChatMessageError.displayName = 'ChatMessageError'\n\n// ============================================================================\n// ChatMessageSimple (Pre-composed convenience component)\n// ============================================================================\n\nexport interface ChatMessageSimpleProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onError'> {\n /**\n * Message role\n */\n role: MessageRole\n /**\n * Message status\n * @default \"complete\"\n */\n status?: MessageStatus\n /**\n * Static content (for complete status)\n */\n content?: string\n /**\n * Stream source (for streaming status)\n */\n stream?: StreamTextProps['stream']\n /**\n * Avatar image URL\n */\n avatar?: string\n /**\n * Agent/user name\n */\n name?: string\n /**\n * Timestamp\n */\n timestamp?: Date | string\n /**\n * Thinking label\n */\n thinkingLabel?: string\n /**\n * Error message\n */\n errorMessage?: string\n /**\n * Stream callbacks\n */\n onComplete?: () => void\n onError?: (error: Error) => void\n onRetry?: () => void\n}\n\n/**\n * ChatMessageSimple\n *\n * Pre-composed ChatMessage for common use cases.\n * Automatically handles thinking/streaming/complete/error states.\n *\n * For full customization, use the composable primitives instead.\n */\nexport const ChatMessageSimple = React.forwardRef<HTMLDivElement, ChatMessageSimpleProps>(\n (\n {\n role,\n status = 'complete',\n content,\n stream,\n avatar,\n name,\n timestamp,\n thinkingLabel,\n errorMessage,\n onComplete,\n onError,\n onRetry,\n className,\n ...props\n },\n ref\n ) => {\n const renderContent = () => {\n switch (status) {\n case 'thinking':\n return <ChatMessageThinking label={thinkingLabel} />\n case 'streaming':\n return (\n <StreamText\n stream={stream}\n cursor\n onComplete={onComplete}\n onError={onError}\n />\n )\n case 'error':\n return <ChatMessageError message={errorMessage} onRetry={onRetry} />\n case 'idle':\n case 'complete':\n default:\n return <span className=\"whitespace-pre-wrap\">{content}</span>\n }\n }\n\n return (\n <ChatMessage ref={ref} role={role} status={status} className={className} {...props}>\n <ChatMessageAvatar src={avatar} name={name} />\n <ChatMessageContent name={name}>\n {renderContent()}\n {timestamp && status === 'complete' && (\n <ChatMessageTimestamp time={timestamp} />\n )}\n </ChatMessageContent>\n </ChatMessage>\n )\n }\n)\nChatMessageSimple.displayName = 'ChatMessageSimple'\n","/**\n * StreamText - Streaming text display with cursor effect\n *\n * Core component for AI streaming responses. Supports real async streams\n * and simulated typing animation.\n *\n * @example Real streaming\n * ```tsx\n * <StreamText stream={asyncIterator} onComplete={() => setDone(true)} />\n * ```\n *\n * @example With cursor\n * ```tsx\n * <StreamText stream={stream} cursor cursorChar=\"▋\" />\n * ```\n *\n * @example Simulated typing (for non-streaming APIs)\n * ```tsx\n * <StreamText text=\"Hello, I am Claude.\" speed={30} />\n * ```\n *\n * @example Composed with custom renderer\n * ```tsx\n * <StreamText stream={stream}>\n * {(text, isStreaming) => (\n * <Markdown className={isStreaming ? 'opacity-90' : ''}>{text}</Markdown>\n * )}\n * </StreamText>\n * ```\n *\n * @example With abort controller\n * ```tsx\n * const abortRef = useRef<AbortController>()\n * <StreamText stream={stream} abortController={abortRef.current} />\n * <button onClick={() => abortRef.current?.abort()}>Stop</button>\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\nimport type { StreamSource } from '../types'\n\n// Re-export for convenience\nexport type { StreamSource } from '../types'\n\nexport interface StreamTextProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children' | 'onError'> {\n /**\n * Stream source: AsyncIterable, ReadableStream, or plain string\n */\n stream?: AsyncIterable<string> | ReadableStream<string>\n /**\n * Static text for simulated typing (mutually exclusive with stream)\n */\n text?: string\n /**\n * Show blinking cursor during streaming\n * @default true\n */\n cursor?: boolean\n /**\n * Cursor character\n * @default \"▋\"\n */\n cursorChar?: string\n /**\n * Typing speed in ms per character (only for text prop)\n * @default 30\n */\n speed?: number\n /**\n * Called when streaming/typing completes\n */\n onComplete?: () => void\n /**\n * Called on streaming error\n */\n onError?: (error: Error) => void\n /**\n * Called on each text update with current text\n */\n onUpdate?: (text: string) => void\n /**\n * AbortController for external cancellation\n */\n abortController?: AbortController\n /**\n * Custom render function for advanced use (e.g., markdown rendering)\n */\n children?: (text: string, isStreaming: boolean) => React.ReactNode\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Stable callback ref - stores the latest callback without causing re-renders\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(\n callback: T | undefined\n): React.MutableRefObject<T | undefined> {\n const ref = React.useRef(callback)\n React.useLayoutEffect(() => {\n ref.current = callback\n })\n return ref\n}\n\nexport interface UseAsyncStreamOptions {\n onComplete?: () => void\n onError?: (error: Error) => void\n onUpdate?: (text: string) => void\n abortController?: AbortController\n}\n\nexport interface UseAsyncStreamResult {\n text: string\n isStreaming: boolean\n error: Error | null\n abort: () => void\n}\n\n/**\n * Hook to consume an async iterable stream\n *\n * Uses ref pattern for callbacks to prevent dependency issues.\n * Supports external abort via AbortController.\n */\nexport function useAsyncStream(\n stream: AsyncIterable<string> | ReadableStream<string> | undefined,\n options: UseAsyncStreamOptions = {}\n): UseAsyncStreamResult {\n const [text, setText] = React.useState('')\n const [isStreaming, setIsStreaming] = React.useState(false)\n const [error, setError] = React.useState<Error | null>(null)\n\n // Use refs for callbacks to avoid dependency issues\n const onCompleteRef = useCallbackRef(options.onComplete)\n const onErrorRef = useCallbackRef(options.onError)\n const onUpdateRef = useCallbackRef(options.onUpdate)\n\n // Internal abort controller\n const internalAbortRef = React.useRef<AbortController | null>(null)\n\n // Abort function exposed to consumers\n const abort = React.useCallback(() => {\n internalAbortRef.current?.abort()\n options.abortController?.abort()\n }, [options.abortController])\n\n React.useEffect(() => {\n if (!stream) {\n setText('')\n setIsStreaming(false)\n setError(null)\n return\n }\n\n // Create internal abort controller\n const internalAbort = new AbortController()\n internalAbortRef.current = internalAbort\n\n // Combine with external abort controller\n const externalAbort = options.abortController\n const isAborted = () =>\n internalAbort.signal.aborted || (externalAbort?.signal.aborted ?? false)\n\n setIsStreaming(true)\n setText('')\n setError(null)\n\n const consume = async () => {\n try {\n // Convert ReadableStream to AsyncIterable if needed\n const iterable = isReadableStream(stream)\n ? readableStreamToAsyncIterable(stream)\n : stream\n\n let accumulated = ''\n\n for await (const chunk of iterable) {\n if (isAborted()) break\n accumulated += chunk\n setText(accumulated)\n onUpdateRef.current?.(accumulated)\n }\n\n if (!isAborted()) {\n setIsStreaming(false)\n onCompleteRef.current?.()\n }\n } catch (err) {\n if (!isAborted()) {\n const streamError = err instanceof Error ? err : new Error(String(err))\n setError(streamError)\n setIsStreaming(false)\n onErrorRef.current?.(streamError)\n }\n }\n }\n\n consume()\n\n return () => {\n internalAbort.abort()\n }\n // Only re-run when stream changes, NOT when callbacks change\n }, [stream, options.abortController])\n\n return { text, isStreaming, error, abort }\n}\n\nexport interface UseTypingAnimationOptions {\n speed?: number\n onComplete?: () => void\n onUpdate?: (text: string) => void\n}\n\nexport interface UseTypingAnimationResult {\n displayText: string\n isTyping: boolean\n}\n\n/**\n * Hook for simulated typing animation\n *\n * Uses ref pattern for callbacks to prevent dependency issues.\n */\nexport function useTypingAnimation(\n text: string | undefined,\n options: UseTypingAnimationOptions = {}\n): UseTypingAnimationResult {\n const { speed = 30 } = options\n const [displayText, setDisplayText] = React.useState('')\n const [isTyping, setIsTyping] = React.useState(false)\n\n // Use refs for callbacks\n const onCompleteRef = useCallbackRef(options.onComplete)\n const onUpdateRef = useCallbackRef(options.onUpdate)\n\n React.useEffect(() => {\n if (!text) {\n setDisplayText('')\n setIsTyping(false)\n return\n }\n\n setIsTyping(true)\n setDisplayText('')\n\n let index = 0\n const timer = setInterval(() => {\n if (index < text.length) {\n const newText = text.slice(0, index + 1)\n setDisplayText(newText)\n onUpdateRef.current?.(newText)\n index++\n } else {\n clearInterval(timer)\n setIsTyping(false)\n onCompleteRef.current?.()\n }\n }, speed)\n\n return () => clearInterval(timer)\n // Only depend on text and speed, not callbacks\n }, [text, speed])\n\n return { displayText, isTyping }\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nfunction isReadableStream(value: unknown): value is ReadableStream<string> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'getReader' in value &&\n typeof (value as ReadableStream).getReader === 'function'\n )\n}\n\nasync function* readableStreamToAsyncIterable(\n stream: ReadableStream<string>\n): AsyncIterable<string> {\n const reader = stream.getReader()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n if (value) yield value\n }\n } finally {\n reader.releaseLock()\n }\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Blinking cursor component\n */\nexport const StreamCursor = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement> & { char?: string }\n>(({ char = '▋', className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn('animate-pulse ml-0.5', className)}\n aria-hidden=\"true\"\n {...props}\n >\n {char}\n </span>\n))\nStreamCursor.displayName = 'StreamCursor'\n\n/**\n * StreamText Component\n *\n * Renders streaming text from async sources with optional cursor effect.\n * Supports both real streaming (AsyncIterable/ReadableStream) and\n * simulated typing animation for static text.\n *\n * Design notes:\n * - Uses useCallbackRef pattern to avoid useEffect dependency issues\n * - Supports external abort via AbortController\n * - Accumulated text pattern prevents state closure issues\n */\nexport const StreamText = React.forwardRef<HTMLSpanElement, StreamTextProps>(\n (\n {\n stream,\n text,\n cursor = true,\n cursorChar = '▋',\n speed = 30,\n onComplete,\n onError,\n onUpdate,\n abortController,\n children,\n className,\n ...props\n },\n ref\n ) => {\n // Use stream if provided, otherwise use typing animation\n const {\n text: streamedText,\n isStreaming,\n error,\n } = useAsyncStream(stream, {\n onComplete: stream ? onComplete : undefined,\n onError,\n onUpdate: stream ? onUpdate : undefined,\n abortController,\n })\n\n const { displayText: typedText, isTyping } = useTypingAnimation(\n stream ? undefined : text,\n {\n speed,\n onComplete: stream ? undefined : onComplete,\n onUpdate: stream ? undefined : onUpdate,\n }\n )\n\n const displayText = stream ? streamedText : typedText\n const isActive = stream ? isStreaming : isTyping\n const showCursor = cursor && isActive\n\n // Custom render function\n if (children) {\n return (\n <span ref={ref} className={className} {...props}>\n {children(displayText, isActive)}\n {showCursor && <StreamCursor char={cursorChar} />}\n </span>\n )\n }\n\n return (\n <span\n ref={ref}\n className={cn('whitespace-pre-wrap', className)}\n aria-live=\"polite\"\n aria-busy={isActive}\n {...props}\n >\n {displayText}\n {showCursor && <StreamCursor char={cursorChar} />}\n {error && (\n <span className=\"text-red-500 ml-2\" role=\"alert\">\n Error: {error.message}\n </span>\n )}\n </span>\n )\n }\n)\nStreamText.displayName = 'StreamText'\n","/**\n * MentionPopover - @mention agent selector with auto-positioning\n *\n * Popover component for selecting agents when typing @mention.\n * Uses floating-ui for automatic positioning relative to anchor element.\n *\n * @example Basic usage with anchor ref\n * ```tsx\n * const anchorRef = useRef<HTMLTextAreaElement>(null)\n *\n * <textarea ref={anchorRef} />\n *\n * <MentionPopover\n * open={open}\n * anchorRef={anchorRef}\n * query={query}\n * agents={agents}\n * onSelect={(agent) => { insertMention(agent); setOpen(false) }}\n * onClose={() => setOpen(false)}\n * />\n * ```\n *\n * @example With virtual anchor (cursor position)\n * ```tsx\n * const [virtualAnchor, setVirtualAnchor] = useState<VirtualElement | null>(null)\n *\n * // On @ trigger, create virtual anchor at cursor\n * setVirtualAnchor({\n * getBoundingClientRect: () => getCursorRect()\n * })\n *\n * <MentionPopover\n * open={open}\n * virtualAnchor={virtualAnchor}\n * agents={agents}\n * onSelect={handleSelect}\n * />\n * ```\n *\n * @example Composable with custom item renderer\n * ```tsx\n * <MentionPopover open={open} anchorRef={ref} agents={agents} onSelect={handleSelect}>\n * {(filteredAgents) => filteredAgents.map(agent => (\n * <MentionItem key={agent.id} agent={agent}>\n * <CustomAgentCard agent={agent} />\n * </MentionItem>\n * ))}\n * </MentionPopover>\n * ```\n */\n\nimport * as React from 'react'\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size as floatingSize,\n type UseFloatingReturn,\n type VirtualElement,\n type Placement,\n} from '@floating-ui/react'\nimport { cn } from '../utils'\nimport { Avatar, AvatarImage, AvatarFallback } from './Avatar'\nimport type { MentionAgent, PresenceStatus } from '../types'\n\n// Re-export for convenience\nexport type { MentionAgent, PresenceStatus }\n\nexport interface MentionPopoverProps {\n /**\n * Whether the popover is open\n */\n open: boolean\n /**\n * Reference element for positioning\n */\n anchorRef?: React.RefObject<HTMLElement>\n /**\n * Virtual anchor for custom positioning (e.g., cursor position)\n */\n virtualAnchor?: VirtualElement | null\n /**\n * Search query (text after @)\n */\n query?: string\n /**\n * Available agents to mention\n */\n agents: MentionAgent[]\n /**\n * Called when an agent is selected\n */\n onSelect?: (agent: MentionAgent) => void\n /**\n * Called when popover should close\n */\n onClose?: () => void\n /**\n * Maximum items to show\n * @default 5\n */\n maxItems?: number\n /**\n * Placement preference\n * @default \"bottom-start\"\n */\n placement?: Placement\n /**\n * Custom filter function\n */\n filter?: (agent: MentionAgent, query: string) => boolean\n /**\n * Empty state message\n * @default \"No agents found\"\n */\n emptyMessage?: string\n /**\n * Custom render function for items\n */\n children?: (filteredAgents: MentionAgent[]) => React.ReactNode\n /**\n * Additional className for popover\n */\n className?: string\n}\n\nexport interface MentionItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /**\n * Agent data\n */\n agent: MentionAgent\n /**\n * Whether this item is highlighted/focused\n */\n highlighted?: boolean\n /**\n * Called when item is selected\n */\n onSelect?: (agent: MentionAgent) => void\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface MentionContextValue {\n query: string\n highlightedIndex: number\n setHighlightedIndex: (index: number) => void\n onSelect: (agent: MentionAgent) => void\n}\n\nconst MentionContext = React.createContext<MentionContextValue | null>(null)\n\nfunction useMentionContext() {\n const context = React.useContext(MentionContext)\n if (!context) {\n throw new Error('MentionItem must be used within MentionPopover')\n }\n return context\n}\n\n// ============================================================================\n// Hook for external usage\n// ============================================================================\n\nexport interface UseMentionPopoverOptions {\n placement?: Placement\n offset?: number\n}\n\nexport interface UseMentionPopoverReturn {\n floating: UseFloatingReturn\n isPositioned: boolean\n}\n\n/**\n * Hook for manual floating control\n * Use this when you need more control over positioning\n */\nexport function useMentionPopover(\n anchorRef: React.RefObject<HTMLElement> | undefined,\n virtualAnchor: VirtualElement | null | undefined,\n options: UseMentionPopoverOptions = {}\n): UseMentionPopoverReturn {\n const { placement = 'bottom-start', offset: offsetValue = 4 } = options\n\n const floating = useFloating({\n placement,\n middleware: [\n offset(offsetValue),\n flip({ fallbackPlacements: ['top-start', 'bottom-end', 'top-end'] }),\n shift({ padding: 8 }),\n floatingSize({\n apply({ availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.min(availableHeight, 320)}px`,\n })\n },\n }),\n ],\n whileElementsMounted: autoUpdate,\n })\n\n // Update reference element\n React.useLayoutEffect(() => {\n if (virtualAnchor) {\n floating.refs.setReference(virtualAnchor)\n } else if (anchorRef?.current) {\n floating.refs.setReference(anchorRef.current)\n }\n }, [virtualAnchor, anchorRef, floating.refs])\n\n return {\n floating,\n isPositioned: floating.isPositioned,\n }\n}\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Individual mention item\n */\nexport const MentionItem = React.forwardRef<HTMLDivElement, MentionItemProps>(\n ({ agent, highlighted = false, onSelect, className, children, ...props }, ref) => {\n const context = React.useContext(MentionContext)\n const handleSelect = onSelect || context?.onSelect\n\n return (\n <div\n ref={ref}\n role=\"option\"\n aria-selected={highlighted}\n className={cn(\n 'flex items-center gap-3 px-3 py-2 cursor-pointer transition-colors',\n highlighted ? 'bg-primary-50 text-primary-900' : 'hover:bg-gray-50',\n className\n )}\n onClick={() => handleSelect?.(agent)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleSelect?.(agent)\n }\n }}\n tabIndex={0}\n {...props}\n >\n {children || (\n <>\n <Avatar size=\"sm\">\n {agent.avatar && <AvatarImage src={agent.avatar} alt={agent.name} />}\n <AvatarFallback variant=\"secondary\">\n {agent.name.charAt(0).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm truncate\">{agent.name}</div>\n {agent.description && (\n <div className=\"text-xs text-gray-500 truncate\">{agent.description}</div>\n )}\n </div>\n {agent.status && (\n <span\n className={cn(\n 'w-2 h-2 rounded-full',\n agent.status === 'online' && 'bg-green-500',\n agent.status === 'busy' && 'bg-amber-500',\n agent.status === 'offline' && 'bg-gray-300'\n )}\n />\n )}\n </>\n )}\n </div>\n )\n }\n)\nMentionItem.displayName = 'MentionItem'\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * MentionPopover Component\n *\n * Floating popover for @mention agent selection.\n * Features:\n * - Auto-positioning with floating-ui\n * - Keyboard navigation (↑/↓/Enter/Esc)\n * - Composable item rendering\n * - Virtual anchor support for cursor positioning\n */\nexport const MentionPopover = React.forwardRef<HTMLDivElement, MentionPopoverProps>(\n (\n {\n open,\n anchorRef,\n virtualAnchor,\n query = '',\n agents,\n onSelect,\n onClose,\n maxItems = 5,\n placement = 'bottom-start',\n filter,\n emptyMessage = 'No agents found',\n children,\n className,\n },\n ref\n ) => {\n const [highlightedIndex, setHighlightedIndex] = React.useState(0)\n\n // Floating UI setup\n const { floating, isPositioned } = useMentionPopover(anchorRef, virtualAnchor, {\n placement,\n })\n\n // Default filter function\n const defaultFilter = React.useCallback(\n (agent: MentionAgent, q: string) => {\n const searchLower = q.toLowerCase()\n return (\n agent.name.toLowerCase().includes(searchLower) ||\n agent.description?.toLowerCase().includes(searchLower) ||\n false\n )\n },\n []\n )\n\n // Filter agents\n const filteredAgents = React.useMemo(() => {\n const filterFn = filter || defaultFilter\n return agents.filter((agent) => filterFn(agent, query)).slice(0, maxItems)\n }, [agents, query, maxItems, filter, defaultFilter])\n\n // Reset highlight when filtered results change\n React.useEffect(() => {\n setHighlightedIndex(0)\n }, [filteredAgents.length])\n\n // Handle keyboard navigation\n React.useEffect(() => {\n if (!open) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex((prev) =>\n prev < filteredAgents.length - 1 ? prev + 1 : 0\n )\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredAgents.length - 1\n )\n break\n case 'Enter':\n e.preventDefault()\n if (filteredAgents[highlightedIndex]) {\n onSelect?.(filteredAgents[highlightedIndex])\n }\n break\n case 'Escape':\n e.preventDefault()\n onClose?.()\n break\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, filteredAgents, highlightedIndex, onSelect, onClose])\n\n // Don't render if closed\n if (!open) return null\n\n const contextValue: MentionContextValue = {\n query,\n highlightedIndex,\n setHighlightedIndex,\n onSelect: onSelect || (() => {}),\n }\n\n return (\n <MentionContext.Provider value={contextValue}>\n <div\n ref={(node) => {\n floating.refs.setFloating(node)\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n role=\"listbox\"\n aria-label=\"Select an agent to mention\"\n className={cn(\n 'z-50 min-w-[200px] max-w-[300px]',\n 'bg-white rounded-lg shadow-lg border border-gray-200',\n 'overflow-hidden overflow-y-auto',\n !isPositioned && 'invisible',\n className\n )}\n style={{\n position: floating.strategy,\n top: floating.y ?? 0,\n left: floating.x ?? 0,\n }}\n >\n {/* Content */}\n <div className=\"py-1\">\n {children ? (\n children(filteredAgents)\n ) : filteredAgents.length > 0 ? (\n filteredAgents.map((agent, index) => (\n <MentionItem\n key={agent.id}\n agent={agent}\n highlighted={index === highlightedIndex}\n onSelect={onSelect}\n />\n ))\n ) : (\n <div className=\"px-3 py-4 text-sm text-gray-500 text-center\">\n {emptyMessage}\n </div>\n )}\n </div>\n\n {/* Keyboard hint */}\n <div className=\"border-t border-gray-100 px-3 py-1.5 bg-gray-50\">\n <span className=\"text-xs text-gray-400\">\n ↑↓ to navigate · Enter to select · Esc to close\n </span>\n </div>\n </div>\n </MentionContext.Provider>\n )\n }\n)\nMentionPopover.displayName = 'MentionPopover'\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { useMentionContext }\nexport type { VirtualElement }\n","/**\n * ThinkingIndicator - AI thinking/processing state indicator\n *\n * Shows animated dots or custom loading states for AI processing.\n * Supports multiple variants and multi-agent parallel thinking display.\n *\n * @example Basic usage\n * ```tsx\n * <ThinkingIndicator />\n * <ThinkingIndicator label=\"Analyzing...\" />\n * ```\n *\n * @example Multi-agent\n * ```tsx\n * <ThinkingIndicator agents={['Claude', 'GPT']} />\n * ```\n *\n * @example Different variants\n * ```tsx\n * <ThinkingIndicator variant=\"dots\" />\n * <ThinkingIndicator variant=\"pulse\" />\n * <ThinkingIndicator variant=\"bounce\" />\n * <ThinkingIndicator variant=\"wave\" />\n * ```\n *\n * @example Inline in text\n * ```tsx\n * <p>Processing<ThinkingIndicator variant=\"dots\" inline /></p>\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\nimport type { ThinkingVariant } from '../types'\n\n// Re-export for convenience\nexport type { ThinkingVariant }\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Custom label text\n */\n label?: string\n /**\n * Multiple agents thinking in parallel\n */\n agents?: string[]\n /**\n * Animation variant\n * @default \"bounce\"\n */\n variant?: ThinkingVariant\n /**\n * Size of the indicator\n * @default \"md\"\n */\n size?: 'sm' | 'md' | 'lg'\n /**\n * Render inline (no wrapper div)\n * @default false\n */\n inline?: boolean\n /**\n * Color scheme\n * @default \"secondary\" (gold/amber)\n */\n color?: 'primary' | 'secondary' | 'neutral'\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst sizeClasses = {\n sm: { dot: 'w-1 h-1', gap: 'gap-0.5', text: 'text-xs' },\n md: { dot: 'w-1.5 h-1.5', gap: 'gap-1', text: 'text-sm' },\n lg: { dot: 'w-2 h-2', gap: 'gap-1.5', text: 'text-base' },\n}\n\nconst colorClasses = {\n primary: 'bg-primary-500',\n secondary: 'bg-secondary-500',\n neutral: 'bg-gray-400',\n}\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Animated dots (default)\n */\nfunction DotsAnimation({\n size,\n color,\n}: {\n size: 'sm' | 'md' | 'lg'\n color: 'primary' | 'secondary' | 'neutral'\n}) {\n const { dot, gap } = sizeClasses[size]\n return (\n <span className={cn('inline-flex items-center', gap)}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={cn(dot, colorClasses[color], 'rounded-full animate-pulse')}\n style={{ animationDelay: `${i * 150}ms` }}\n />\n ))}\n </span>\n )\n}\n\n/**\n * Bouncing dots\n */\nfunction BounceAnimation({\n size,\n color,\n}: {\n size: 'sm' | 'md' | 'lg'\n color: 'primary' | 'secondary' | 'neutral'\n}) {\n const { dot, gap } = sizeClasses[size]\n return (\n <span className={cn('inline-flex items-end', gap)} style={{ height: '1em' }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={cn(dot, colorClasses[color], 'rounded-full animate-bounce')}\n style={{ animationDelay: `${i * 150}ms`, animationDuration: '600ms' }}\n />\n ))}\n </span>\n )\n}\n\n/**\n * Wave animation (sequential height change)\n * Uses animate-wave from Tailwind config (defined in @uix-ai/lucid-tokens)\n */\nfunction WaveAnimation({\n size,\n color,\n}: {\n size: 'sm' | 'md' | 'lg'\n color: 'primary' | 'secondary' | 'neutral'\n}) {\n const { gap } = sizeClasses[size]\n const barWidth = size === 'sm' ? 'w-0.5' : size === 'md' ? 'w-1' : 'w-1.5'\n return (\n <span className={cn('inline-flex items-center', gap)} style={{ height: '1em' }}>\n {[0, 1, 2, 3].map((i) => (\n <span\n key={i}\n className={cn(barWidth, colorClasses[color], 'rounded-full animate-wave')}\n style={{\n animationDelay: `${i * 100}ms`,\n height: '0.5em',\n }}\n />\n ))}\n </span>\n )\n}\n\n/**\n * Pulse ring\n */\nfunction PulseAnimation({\n size,\n color,\n}: {\n size: 'sm' | 'md' | 'lg'\n color: 'primary' | 'secondary' | 'neutral'\n}) {\n const ringSize = size === 'sm' ? 'w-3 h-3' : size === 'md' ? 'w-4 h-4' : 'w-5 h-5'\n return (\n <span className=\"relative inline-flex\">\n <span className={cn(ringSize, colorClasses[color], 'rounded-full animate-ping opacity-75')} />\n <span\n className={cn(\n ringSize,\n colorClasses[color],\n 'rounded-full absolute inset-0'\n )}\n />\n </span>\n )\n}\n\n/**\n * Spinner\n */\nfunction SpinnerAnimation({\n size,\n color,\n}: {\n size: 'sm' | 'md' | 'lg'\n color: 'primary' | 'secondary' | 'neutral'\n}) {\n const spinnerSize = size === 'sm' ? 'w-3 h-3' : size === 'md' ? 'w-4 h-4' : 'w-5 h-5'\n const borderColor = color === 'primary' ? 'border-primary-500' : color === 'secondary' ? 'border-secondary-500' : 'border-gray-400'\n return (\n <span\n className={cn(\n spinnerSize,\n 'inline-block rounded-full border-2 border-transparent animate-spin',\n `border-t-2 ${borderColor}`\n )}\n />\n )\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ThinkingIndicator Component\n *\n * Flexible AI thinking state indicator with multiple animation variants.\n * Uses sentient gold (secondary-500) color by default to represent\n * AI's generative thinking process.\n */\nexport const ThinkingIndicator = React.forwardRef<HTMLDivElement, ThinkingIndicatorProps>(\n (\n {\n label,\n agents,\n variant = 'bounce',\n size = 'md',\n inline = false,\n color = 'secondary',\n className,\n ...props\n },\n ref\n ) => {\n const { text } = sizeClasses[size]\n\n // Render animation based on variant\n const renderAnimation = () => {\n switch (variant) {\n case 'dots':\n return <DotsAnimation size={size} color={color} />\n case 'pulse':\n return <PulseAnimation size={size} color={color} />\n case 'wave':\n return <WaveAnimation size={size} color={color} />\n case 'spinner':\n return <SpinnerAnimation size={size} color={color} />\n case 'bounce':\n default:\n return <BounceAnimation size={size} color={color} />\n }\n }\n\n // Generate label text\n const labelText = agents && agents.length > 0\n ? `${agents.join(', ')} ${agents.length > 1 ? 'are' : 'is'} thinking...`\n : label || 'Thinking...'\n\n // Inline mode\n if (inline) {\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={cn('inline-flex items-center gap-2', className)}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={labelText}\n {...(props as React.HTMLAttributes<HTMLSpanElement>)}\n >\n {renderAnimation()}\n </span>\n )\n }\n\n // Block mode (default)\n return (\n <div\n ref={ref}\n className={cn('flex items-center gap-3 my-4', className)}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={labelText}\n {...props}\n >\n {renderAnimation()}\n <span className={cn('text-gray-500', text)}>{labelText}</span>\n </div>\n )\n }\n)\nThinkingIndicator.displayName = 'ThinkingIndicator'\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n DotsAnimation,\n BounceAnimation,\n WaveAnimation,\n PulseAnimation,\n SpinnerAnimation,\n}\n","import * as React from 'react'\nimport type { ToolStatus } from '@uix-ai/core'\nimport { cn } from '../utils'\n\nexport interface ToolResultProps {\n /**\n * Tool name\n */\n tool: string\n /**\n * Execution status (extended to support approval workflow)\n */\n status: ToolStatus\n /**\n * Tool output content\n */\n children?: React.ReactNode\n /**\n * Whether the result is collapsed\n */\n collapsed?: boolean\n /**\n * Callback when collapse state changes\n */\n onToggle?: () => void\n /**\n * Error message (when status is 'error')\n */\n error?: string\n /**\n * Callback when user approves tool execution\n */\n onApprove?: () => void\n /**\n * Callback when user denies tool execution\n */\n onDeny?: (reason?: string) => void\n /**\n * Additional CSS classes\n */\n className?: string\n}\n\nconst statusIcons: Record<ToolStatus, string> = {\n pending: '⏳',\n streaming: '📡',\n ready: '📋',\n running: '⚡',\n 'approval-required': '🔐',\n approved: '✅',\n denied: '🚫',\n success: '✓',\n error: '✗',\n}\n\nconst statusColors: Record<ToolStatus, string> = {\n pending: 'text-gray-500 bg-gray-50 border-gray-200',\n streaming: 'text-blue-600 bg-blue-50 border-blue-200',\n ready: 'text-indigo-600 bg-indigo-50 border-indigo-200',\n running: 'text-amber-600 bg-amber-50 border-amber-200',\n 'approval-required': 'text-purple-600 bg-purple-50 border-purple-200',\n approved: 'text-green-600 bg-green-50 border-green-200',\n denied: 'text-gray-600 bg-gray-50 border-gray-200',\n success: 'text-green-600 bg-green-50 border-green-200',\n error: 'text-red-600 bg-red-50 border-red-200',\n}\n\nconst statusLabels: Record<ToolStatus, string> = {\n pending: 'Pending',\n streaming: 'Receiving parameters...',\n ready: 'Ready to execute',\n running: 'Running...',\n 'approval-required': 'Waiting for approval',\n approved: 'Approved',\n denied: 'Denied',\n success: 'Completed',\n error: 'Failed',\n}\n\n/**\n * ToolResult Component\n *\n * Displays the result of a tool/function call with support for\n * approval workflows and extended status states.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ToolResult tool=\"search\" status=\"success\">\n * Found 10 results...\n * </ToolResult>\n *\n * // With error\n * <ToolResult tool=\"code_execution\" status=\"error\" error=\"Timeout\">\n * Execution failed\n * </ToolResult>\n *\n * // With approval workflow\n * <ToolResult\n * tool=\"delete_file\"\n * status=\"approval-required\"\n * onApprove={() => handleApprove()}\n * onDeny={(reason) => handleDeny(reason)}\n * >\n * This will delete important_file.txt\n * </ToolResult>\n * ```\n */\nexport function ToolResult({\n tool,\n status,\n children,\n collapsed = false,\n onToggle,\n error,\n onApprove,\n onDeny,\n className,\n}: ToolResultProps) {\n const showApprovalButtons = status === 'approval-required' && (onApprove || onDeny)\n const isAnimating = ['streaming', 'running'].includes(status)\n\n return (\n <div\n className={cn(\n 'my-4 rounded-lg border overflow-hidden',\n statusColors[status],\n className\n )}\n >\n {/* Header */}\n <div\n className={cn(\n 'flex items-center gap-2 px-4 py-2',\n onToggle && 'cursor-pointer hover:bg-black/5'\n )}\n onClick={onToggle}\n >\n <span className=\"text-lg\">{statusIcons[status]}</span>\n <span className=\"font-mono text-sm font-medium\">{tool}</span>\n <span className={cn('text-xs', isAnimating && 'animate-pulse')}>\n {statusLabels[status]}\n </span>\n {onToggle && (\n <span className=\"ml-auto text-xs\">\n {collapsed ? '▶' : '▼'}\n </span>\n )}\n </div>\n\n {/* Approval Buttons */}\n {showApprovalButtons && (\n <div className=\"flex gap-2 px-4 py-2 bg-white border-t border-inherit\">\n {onApprove && (\n <button\n onClick={onApprove}\n className=\"px-3 py-1.5 text-sm font-medium text-white bg-green-600 rounded-md hover:bg-green-700 transition-colors\"\n >\n Approve\n </button>\n )}\n {onDeny && (\n <button\n onClick={() => onDeny()}\n className=\"px-3 py-1.5 text-sm font-medium text-gray-700 bg-gray-200 rounded-md hover:bg-gray-300 transition-colors\"\n >\n Deny\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n {!collapsed && (children || error) && (\n <div className=\"px-4 py-3 bg-white border-t border-inherit\">\n {error ? (\n <div className=\"text-sm text-red-600 font-mono\">{error}</div>\n ) : (\n <div className=\"text-sm\">{children}</div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import * as React from 'react'\nimport { cn, throttle } from '../utils'\nimport {\n ChatMessage,\n ChatMessageAvatar,\n ChatMessageContent,\n ChatMessageTimestamp,\n} from './ChatMessage'\n\nexport interface Message {\n id: string\n role: 'user' | 'assistant' | 'system'\n content: React.ReactNode\n avatar?: string\n name?: string\n timestamp?: string | Date\n}\n\nexport interface MessageListProps {\n /**\n * List of messages to display\n */\n messages: Message[]\n /**\n * Custom message renderer\n */\n renderMessage?: (message: Message) => React.ReactNode\n /**\n * Whether to auto-scroll to bottom on new messages\n */\n autoScroll?: boolean\n /**\n * Throttle interval in milliseconds for scroll updates during streaming.\n * Reduces re-renders when messages update frequently.\n * Set to 0 or undefined to disable throttling.\n * @default undefined (no throttling)\n */\n throttleMs?: number\n /**\n * Additional CSS classes\n */\n className?: string\n}\n\n/**\n * MessageList Component\n *\n * Container for displaying a list of chat messages.\n * Supports throttled scroll updates for better performance during streaming.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <MessageList\n * messages={messages}\n * autoScroll\n * />\n *\n * // With throttle for streaming (recommended: 50-100ms)\n * <MessageList\n * messages={messages}\n * autoScroll\n * throttleMs={50}\n * />\n * ```\n */\nexport function MessageList({\n messages,\n renderMessage,\n autoScroll = true,\n throttleMs,\n className,\n}: MessageListProps) {\n const containerRef = React.useRef<HTMLDivElement>(null)\n const bottomRef = React.useRef<HTMLDivElement>(null)\n\n // Create throttled scroll function\n const scrollToBottom = React.useCallback(() => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: 'smooth' })\n }\n }, [])\n\n const throttledScroll = React.useMemo(\n () =>\n throttleMs && throttleMs > 0\n ? throttle(scrollToBottom, throttleMs)\n : scrollToBottom,\n [scrollToBottom, throttleMs]\n )\n\n React.useEffect(() => {\n if (autoScroll) {\n throttledScroll()\n }\n }, [messages, autoScroll, throttledScroll])\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'flex flex-col overflow-y-auto p-4',\n className\n )}\n >\n {messages.map((message) =>\n renderMessage ? (\n <React.Fragment key={message.id}>\n {renderMessage(message)}\n </React.Fragment>\n ) : (\n <DefaultMessage key={message.id} message={message} />\n )\n )}\n <div ref={bottomRef} />\n </div>\n )\n}\n\nfunction DefaultMessage({ message }: { message: Message }) {\n return (\n <ChatMessage role={message.role}>\n <ChatMessageAvatar src={message.avatar} name={message.name} />\n <ChatMessageContent name={message.name}>\n {message.content}\n {message.timestamp && (\n <ChatMessageTimestamp time={message.timestamp} />\n )}\n </ChatMessageContent>\n </ChatMessage>\n )\n}\n","import * as React from 'react'\nimport type { SourceBlockContent } from '@uix-ai/core'\nimport { cn } from '../utils'\n\nexport interface SourceBlockProps {\n /**\n * Source content from LucidBlock\n */\n source: SourceBlockContent\n /**\n * Whether to show the excerpt/snippet\n */\n showExcerpt?: boolean\n /**\n * Additional CSS classes\n */\n className?: string\n}\n\n/**\n * SourceBlock Component\n *\n * Displays a source/citation reference, commonly used in RAG applications\n * to show where information was retrieved from.\n *\n * @example\n * ```tsx\n * // URL source\n * <SourceBlock\n * source={{\n * sourceId: 'src-1',\n * sourceType: 'url',\n * title: 'React Documentation',\n * url: 'https://react.dev/learn'\n * }}\n * />\n *\n * // Document source with excerpt\n * <SourceBlock\n * source={{\n * sourceId: 'src-2',\n * sourceType: 'document',\n * title: 'Company Policy',\n * filename: 'policy.pdf',\n * mediaType: 'application/pdf',\n * excerpt: 'All employees must...'\n * }}\n * showExcerpt\n * />\n * ```\n */\nexport function SourceBlock({\n source,\n showExcerpt = true,\n className,\n}: SourceBlockProps) {\n const isUrl = source.sourceType === 'url'\n const Icon = isUrl ? LinkIcon : DocumentIcon\n\n return (\n <div\n className={cn(\n 'my-2 rounded-lg border border-gray-200 bg-gray-50 overflow-hidden',\n className\n )}\n >\n <div className=\"flex items-start gap-3 p-3\">\n {/* Icon */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-md bg-white border border-gray-200 flex items-center justify-center\">\n <Icon className=\"w-4 h-4 text-gray-500\" />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {/* Title */}\n {isUrl && source.url ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-blue-600 hover:text-blue-800 hover:underline truncate block\"\n >\n {source.title}\n </a>\n ) : (\n <span className=\"text-sm font-medium text-gray-900 truncate block\">\n {source.title}\n </span>\n )}\n\n {/* Metadata */}\n <div className=\"flex items-center gap-2 mt-0.5 text-xs text-gray-500\">\n {source.filename && (\n <span className=\"truncate\">{source.filename}</span>\n )}\n {source.mediaType && (\n <span className=\"px-1.5 py-0.5 bg-gray-200 rounded text-gray-600\">\n {formatMediaType(source.mediaType)}\n </span>\n )}\n {isUrl && source.url && (\n <span className=\"truncate\">{new URL(source.url).hostname}</span>\n )}\n </div>\n\n {/* Excerpt */}\n {showExcerpt && source.excerpt && (\n <p className=\"mt-2 text-xs text-gray-600 line-clamp-2\">\n {source.excerpt}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Compact inline source citation\n */\nexport function SourceCitation({\n source,\n index,\n className,\n}: {\n source: SourceBlockContent\n index?: number\n className?: string\n}) {\n const isUrl = source.sourceType === 'url'\n\n if (isUrl && source.url) {\n return (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'inline-flex items-center gap-1 px-1.5 py-0.5 text-xs rounded',\n 'bg-blue-100 text-blue-700 hover:bg-blue-200 transition-colors',\n className\n )}\n >\n {index !== undefined && (\n <span className=\"font-medium\">[{index + 1}]</span>\n )}\n <span className=\"truncate max-w-[150px]\">{source.title}</span>\n </a>\n )\n }\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 px-1.5 py-0.5 text-xs rounded',\n 'bg-gray-100 text-gray-700',\n className\n )}\n >\n {index !== undefined && (\n <span className=\"font-medium\">[{index + 1}]</span>\n )}\n <span className=\"truncate max-w-[150px]\">{source.title}</span>\n </span>\n )\n}\n\n/**\n * List of sources, typically shown at the end of a response\n */\nexport function SourceList({\n sources,\n title = 'Sources',\n className,\n}: {\n sources: SourceBlockContent[]\n title?: string\n className?: string\n}) {\n if (sources.length === 0) return null\n\n return (\n <div className={cn('mt-4 pt-4 border-t border-gray-200', className)}>\n <h4 className=\"text-xs font-medium text-gray-500 uppercase tracking-wider mb-2\">\n {title}\n </h4>\n <div className=\"space-y-2\">\n {sources.map((source, index) => (\n <SourceBlock key={source.sourceId} source={source} showExcerpt={false} />\n ))}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction formatMediaType(mediaType: string): string {\n const typeMap: Record<string, string> = {\n 'application/pdf': 'PDF',\n 'application/msword': 'DOC',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'DOCX',\n 'text/plain': 'TXT',\n 'text/markdown': 'MD',\n 'text/html': 'HTML',\n 'application/json': 'JSON',\n }\n return typeMap[mediaType] || mediaType.split('/').pop()?.toUpperCase() || 'FILE'\n}\n\n// ============================================================================\n// Icons\n// ============================================================================\n\nfunction LinkIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\"\n />\n </svg>\n )\n}\n\nfunction DocumentIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../utils'\nimport type { ChatWindowAgent, ChatWindowStatus, PresenceStatus } from '../types'\nimport { Avatar, AvatarImage, AvatarFallback } from './Avatar'\nimport { MessageList } from './MessageList'\nimport {\n ChatInput,\n ChatInputTextarea,\n ChatInputToolbar,\n ChatInputTools,\n ChatInputSubmit,\n} from './ChatInput'\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ChatWindowContextValue {\n status: ChatWindowStatus\n agent: ChatWindowAgent | null\n}\n\nconst ChatWindowContext = React.createContext<ChatWindowContextValue | null>(null)\n\nfunction useChatWindowContext() {\n const context = React.useContext(ChatWindowContext)\n if (!context) {\n throw new Error('ChatWindow components must be used within <ChatWindow>')\n }\n return context\n}\n\nexport { useChatWindowContext }\n\n// ============================================================================\n// ChatWindow (Container)\n// ============================================================================\n\nexport interface ChatWindowProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent */\n agent?: ChatWindowAgent | null\n /** Window status */\n status?: ChatWindowStatus\n}\n\nexport const ChatWindow = React.forwardRef<HTMLDivElement, ChatWindowProps>(\n ({ agent = null, status = 'idle', className, children, ...props }, ref) => {\n const contextValue: ChatWindowContextValue = { status, agent }\n\n return (\n <ChatWindowContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn('flex flex-col h-full bg-white', className)}\n data-status={status}\n {...props}\n >\n {children}\n </div>\n </ChatWindowContext.Provider>\n )\n }\n)\nChatWindow.displayName = 'ChatWindow'\n\n// ============================================================================\n// ChatWindowHeader\n// ============================================================================\n\nexport interface ChatWindowHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Override agent from context */\n agent?: ChatWindowAgent\n}\n\nexport const ChatWindowHeader = React.forwardRef<HTMLDivElement, ChatWindowHeaderProps>(\n ({ agent: agentProp, className, children, ...props }, ref) => {\n const { agent: contextAgent } = useChatWindowContext()\n const agent = agentProp ?? contextAgent\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-3 px-4 py-3 border-b border-gray-200',\n 'flex-shrink-0',\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n {agent && (\n <>\n <ChatWindowHeaderAvatar agent={agent} />\n <ChatWindowHeaderInfo agent={agent} />\n </>\n )}\n </>\n )}\n </div>\n )\n }\n)\nChatWindowHeader.displayName = 'ChatWindowHeader'\n\n// ============================================================================\n// ChatWindowHeaderAvatar\n// ============================================================================\n\nexport interface ChatWindowHeaderAvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n agent: ChatWindowAgent\n}\n\nexport const ChatWindowHeaderAvatar = React.forwardRef<HTMLDivElement, ChatWindowHeaderAvatarProps>(\n ({ agent, className, ...props }, ref) => (\n <div ref={ref} className={cn('flex-shrink-0', className)} {...props}>\n <Avatar size=\"md\" status={agent.status === 'online' ? 'idle' : undefined}>\n {agent.avatar && <AvatarImage src={agent.avatar} alt={agent.name} />}\n <AvatarFallback variant=\"secondary\">\n {agent.name.charAt(0).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </div>\n )\n)\nChatWindowHeaderAvatar.displayName = 'ChatWindowHeaderAvatar'\n\n// ============================================================================\n// ChatWindowHeaderInfo\n// ============================================================================\n\nexport interface ChatWindowHeaderInfoProps extends React.HTMLAttributes<HTMLDivElement> {\n agent: ChatWindowAgent\n}\n\nconst statusTextMap: Record<PresenceStatus, string> = {\n online: '在线',\n offline: '离线',\n busy: '忙碌',\n}\n\nexport const ChatWindowHeaderInfo = React.forwardRef<HTMLDivElement, ChatWindowHeaderInfoProps>(\n ({ agent, className, ...props }, ref) => (\n <div ref={ref} className={cn('flex-1 min-w-0', className)} {...props}>\n <h2 className=\"font-semibold text-gray-900 truncate\">{agent.name}</h2>\n {agent.description && (\n <p className=\"text-sm text-gray-500 truncate\">{agent.description}</p>\n )}\n {agent.status && !agent.description && (\n <span\n className={cn(\n 'text-xs',\n agent.status === 'online' && 'text-green-500',\n agent.status === 'offline' && 'text-gray-400',\n agent.status === 'busy' && 'text-orange-500'\n )}\n >\n {statusTextMap[agent.status]}\n </span>\n )}\n </div>\n )\n)\nChatWindowHeaderInfo.displayName = 'ChatWindowHeaderInfo'\n\n// ============================================================================\n// ChatWindowHeaderActions\n// ============================================================================\n\nexport interface ChatWindowHeaderActionsProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const ChatWindowHeaderActions = React.forwardRef<\n HTMLDivElement,\n ChatWindowHeaderActionsProps\n>(({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center gap-1', className)} {...props}>\n {children}\n </div>\n))\nChatWindowHeaderActions.displayName = 'ChatWindowHeaderActions'\n\n// ============================================================================\n// ChatWindowMessages\n// ============================================================================\n\nexport interface ChatWindowMessagesProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Auto scroll to bottom */\n autoScroll?: boolean\n /** Throttle scroll in ms */\n throttleMs?: number\n}\n\nexport const ChatWindowMessages = React.forwardRef<HTMLDivElement, ChatWindowMessagesProps>(\n ({ autoScroll = true, throttleMs = 50, className, children, ...props }, ref) => {\n const bottomRef = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n if (autoScroll && bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: 'smooth' })\n }\n }, [children, autoScroll])\n\n return (\n <div\n ref={ref}\n className={cn('flex-1 overflow-y-auto p-4 space-y-4', className)}\n {...props}\n >\n {children}\n <div ref={bottomRef} />\n </div>\n )\n }\n)\nChatWindowMessages.displayName = 'ChatWindowMessages'\n\n// ============================================================================\n// ChatWindowInput\n// ============================================================================\n\nexport interface ChatWindowInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Submit callback */\n onSend?: (message: string) => void\n /** Input value (controlled) */\n value?: string\n /** Value change callback */\n onValueChange?: (value: string) => void\n /** Is disabled */\n disabled?: boolean\n /** Placeholder text */\n placeholder?: string\n}\n\nexport const ChatWindowInput = React.forwardRef<HTMLDivElement, ChatWindowInputProps>(\n (\n { onSend, value, onValueChange, disabled, placeholder, className, children, ...props },\n ref\n ) => {\n const { status } = useChatWindowContext()\n const [internalValue, setInternalValue] = React.useState('')\n\n const inputValue = value ?? internalValue\n const setInputValue = onValueChange ?? setInternalValue\n const isDisabled = disabled || status === 'streaming'\n\n const handleSubmit = () => {\n if (inputValue.trim() && onSend) {\n onSend(inputValue.trim())\n setInternalValue('')\n if (onValueChange) {\n onValueChange('')\n }\n }\n }\n\n // If custom children provided, render them\n if (children) {\n return (\n <div\n ref={ref}\n className={cn('flex-shrink-0 border-t border-gray-200 p-4', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n // Default input\n return (\n <div\n ref={ref}\n className={cn('flex-shrink-0 border-t border-gray-200 p-4', className)}\n {...props}\n >\n <ChatInput onSubmit={handleSubmit}>\n <ChatInputTextarea\n value={inputValue}\n onChange={setInputValue}\n placeholder={placeholder ?? '输入消息...'}\n disabled={isDisabled}\n />\n <ChatInputToolbar>\n <ChatInputTools />\n <ChatInputSubmit\n status={status === 'streaming' ? 'streaming' : 'idle'}\n disabled={!inputValue.trim()}\n />\n </ChatInputToolbar>\n </ChatInput>\n </div>\n )\n }\n)\nChatWindowInput.displayName = 'ChatWindowInput'\n\n// ============================================================================\n// ChatWindowEmpty\n// ============================================================================\n\nexport interface ChatWindowEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Icon element */\n icon?: React.ReactNode\n /** Title text */\n title?: string\n /** Description text */\n description?: string\n}\n\nexport const ChatWindowEmpty = React.forwardRef<HTMLDivElement, ChatWindowEmptyProps>(\n (\n { icon, title = '开始新对话', description = '向 AI 助手提问任何问题', className, children, ...props },\n ref\n ) => (\n <div\n ref={ref}\n className={cn(\n 'flex-1 flex flex-col items-center justify-center p-8 text-center',\n className\n )}\n {...props}\n >\n {icon ?? (\n <div className=\"w-16 h-16 rounded-full bg-gray-100 flex items-center justify-center mb-4\">\n <svg\n className=\"w-8 h-8 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n </div>\n )}\n <h3 className=\"text-lg font-medium text-gray-900\">{title}</h3>\n {description && <p className=\"text-sm text-gray-500 mt-1\">{description}</p>}\n {children}\n </div>\n )\n)\nChatWindowEmpty.displayName = 'ChatWindowEmpty'\n","import * as React from 'react'\nimport { cn, formatRelativeTime } from '../utils'\nimport type { Conversation, ConversationAgent } from '../types'\nimport { Avatar, AvatarImage, AvatarFallback } from './Avatar'\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ChatListContextValue {\n activeId: string | null\n onSelect: (id: string) => void\n}\n\nconst ChatListContext = React.createContext<ChatListContextValue | null>(null)\n\nfunction useChatListContext() {\n const context = React.useContext(ChatListContext)\n if (!context) {\n throw new Error('ChatList components must be used within <ChatList>')\n }\n return context\n}\n\nexport { useChatListContext }\n\n// ============================================================================\n// ChatList (Container)\n// ============================================================================\n\nexport interface ChatListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** Current active conversation ID */\n activeId?: string | null\n /** Conversation select callback */\n onSelect?: (id: string) => void\n}\n\nexport const ChatList = React.forwardRef<HTMLDivElement, ChatListProps>(\n ({ activeId = null, onSelect, className, children, ...props }, ref) => {\n const contextValue: ChatListContextValue = {\n activeId,\n onSelect: onSelect ?? (() => {}),\n }\n\n return (\n <ChatListContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn(\n 'flex flex-col h-full bg-white border-r border-gray-200',\n className\n )}\n {...props}\n >\n {children}\n </div>\n </ChatListContext.Provider>\n )\n }\n)\nChatList.displayName = 'ChatList'\n\n// ============================================================================\n// ChatListHeader\n// ============================================================================\n\nexport interface ChatListHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Title text */\n title?: string\n}\n\nexport const ChatListHeader = React.forwardRef<HTMLDivElement, ChatListHeaderProps>(\n ({ title = '会话', className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-between px-4 py-3 border-b border-gray-200',\n 'flex-shrink-0',\n className\n )}\n {...props}\n >\n {children ?? <h2 className=\"font-semibold text-gray-900\">{title}</h2>}\n </div>\n )\n)\nChatListHeader.displayName = 'ChatListHeader'\n\n// ============================================================================\n// ChatListSearch\n// ============================================================================\n\nexport interface ChatListSearchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n /** Value change callback */\n onChange?: (value: string) => void\n}\n\nexport const ChatListSearch = React.forwardRef<HTMLInputElement, ChatListSearchProps>(\n ({ placeholder = '搜索会话...', value, onChange, className, ...props }, ref) => (\n <div className={cn('p-3', className)}>\n <div className=\"relative\">\n <svg\n className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n />\n </svg>\n <input\n ref={ref}\n type=\"text\"\n value={value}\n onChange={(e) => onChange?.(e.target.value)}\n placeholder={placeholder}\n className={cn(\n 'w-full pl-9 pr-3 py-2 text-sm rounded-lg',\n 'border border-gray-200 bg-gray-50',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent',\n 'placeholder:text-gray-400'\n )}\n {...props}\n />\n </div>\n </div>\n )\n)\nChatListSearch.displayName = 'ChatListSearch'\n\n// ============================================================================\n// ChatListGroup\n// ============================================================================\n\nexport interface ChatListGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Group label */\n label?: string\n}\n\nexport const ChatListGroup = React.forwardRef<HTMLDivElement, ChatListGroupProps>(\n ({ label, className, children, ...props }, ref) => (\n <div ref={ref} className={cn('py-1', className)} {...props}>\n {label && (\n <div className=\"px-4 py-2 text-xs font-medium text-gray-500 uppercase tracking-wider\">\n {label}\n </div>\n )}\n {children}\n </div>\n )\n)\nChatListGroup.displayName = 'ChatListGroup'\n\n// ============================================================================\n// ChatListItem\n// ============================================================================\n\nexport interface ChatListItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Conversation data */\n conversation: Conversation\n}\n\nexport const ChatListItem = React.forwardRef<HTMLDivElement, ChatListItemProps>(\n ({ conversation, className, children, ...props }, ref) => {\n const { activeId, onSelect } = useChatListContext()\n const isActive = activeId === conversation.id\n\n return (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(conversation.id)}\n onKeyDown={(e) => e.key === 'Enter' && onSelect(conversation.id)}\n className={cn(\n 'flex items-center gap-3 px-4 py-3 cursor-pointer transition-colors',\n 'hover:bg-gray-50',\n isActive && 'bg-blue-50 hover:bg-blue-50',\n className\n )}\n data-active={isActive}\n {...props}\n >\n {children ?? (\n <>\n <ChatListItemAvatar agent={conversation.agent} />\n <ChatListItemContent conversation={conversation} />\n {conversation.unreadCount && conversation.unreadCount > 0 && (\n <ChatListItemBadge count={conversation.unreadCount} />\n )}\n </>\n )}\n </div>\n )\n }\n)\nChatListItem.displayName = 'ChatListItem'\n\n// ============================================================================\n// ChatListItemAvatar\n// ============================================================================\n\nexport interface ChatListItemAvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Agent data */\n agent?: ConversationAgent\n}\n\nexport const ChatListItemAvatar = React.forwardRef<HTMLDivElement, ChatListItemAvatarProps>(\n ({ agent, className, ...props }, ref) => (\n <div ref={ref} className={cn('flex-shrink-0', className)} {...props}>\n <Avatar size=\"sm\">\n {agent?.avatar && <AvatarImage src={agent.avatar} alt={agent.name} />}\n <AvatarFallback variant=\"secondary\">\n {agent?.name?.charAt(0).toUpperCase() || 'A'}\n </AvatarFallback>\n </Avatar>\n </div>\n )\n)\nChatListItemAvatar.displayName = 'ChatListItemAvatar'\n\n// ============================================================================\n// ChatListItemContent\n// ============================================================================\n\nexport interface ChatListItemContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Conversation data */\n conversation: Conversation\n}\n\nexport const ChatListItemContent = React.forwardRef<HTMLDivElement, ChatListItemContentProps>(\n ({ conversation, className, ...props }, ref) => (\n <div ref={ref} className={cn('flex-1 min-w-0', className)} {...props}>\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium text-gray-900 truncate\">{conversation.title}</span>\n {conversation.lastActiveAt && (\n <span className=\"text-xs text-gray-400 flex-shrink-0 ml-2\">\n {formatRelativeTime(conversation.lastActiveAt)}\n </span>\n )}\n </div>\n {conversation.lastMessage && (\n <p className=\"text-sm text-gray-500 truncate\">{conversation.lastMessage}</p>\n )}\n </div>\n )\n)\nChatListItemContent.displayName = 'ChatListItemContent'\n\n// ============================================================================\n// ChatListItemBadge\n// ============================================================================\n\nexport interface ChatListItemBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Unread count */\n count: number\n}\n\nexport const ChatListItemBadge = React.forwardRef<HTMLSpanElement, ChatListItemBadgeProps>(\n ({ count, className, ...props }, ref) => (\n <span\n ref={ref}\n className={cn(\n 'flex-shrink-0 min-w-[20px] h-5 px-1.5 rounded-full',\n 'bg-blue-500 text-white text-xs font-medium',\n 'flex items-center justify-center',\n className\n )}\n {...props}\n >\n {count > 99 ? '99+' : count}\n </span>\n )\n)\nChatListItemBadge.displayName = 'ChatListItemBadge'\n\n// ============================================================================\n// ChatListEmpty\n// ============================================================================\n\nexport interface ChatListEmptyProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Icon element */\n icon?: React.ReactNode\n /** Title text */\n title?: string\n /** Description text */\n description?: string\n}\n\nexport const ChatListEmpty = React.forwardRef<HTMLDivElement, ChatListEmptyProps>(\n ({ icon, title = '暂无会话', description, className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col items-center justify-center py-12 px-4', className)}\n {...props}\n >\n {icon ?? (\n <svg\n className=\"w-12 h-12 text-gray-300 mb-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n )}\n <p className=\"text-gray-900 font-medium\">{title}</p>\n {description && <p className=\"text-sm text-gray-500 mt-1\">{description}</p>}\n {children}\n </div>\n )\n)\nChatListEmpty.displayName = 'ChatListEmpty'\n","/**\n * AgentChat - One-component AI chat interface\n *\n * The fastest way to add an AI conversation UI to your app.\n * Combines ChatWindow, MessageList, and ChatInput into a single\n * pre-composed component that works out of the box.\n *\n * @example Minimal usage (3 lines)\n * ```tsx\n * import { AgentChat } from '@uix-ai/agent'\n *\n * <AgentChat\n * conversations={conversations}\n * onSend={(text) => sendToAgent(text)}\n * />\n * ```\n *\n * @example With agent info\n * ```tsx\n * <AgentChat\n * conversations={conversations}\n * agent={{ id: '1', name: 'Claude', status: 'online' }}\n * onSend={(text) => sendToAgent(text)}\n * onStop={() => abortController.abort()}\n * />\n * ```\n *\n * @example Full integration with AG-UI\n * ```tsx\n * import { AgentChat } from '@uix-ai/agent'\n * import { useAGUI } from '@uix-ai/adapter-agui/react'\n *\n * function App() {\n * const { conversations, status, send } = useAGUI({ url: '/api/agent' })\n * return <AgentChat conversations={conversations} status={status} onSend={send} />\n * }\n * ```\n *\n * @example Full integration with Vercel AI SDK\n * ```tsx\n * import { AgentChat } from '@uix-ai/agent'\n * import { useVercelChat } from '@uix-ai/adapter-vercel/react'\n *\n * function App() {\n * const chat = useVercelChat()\n * return <AgentChat conversations={chat.conversations} status={chat.status} onSend={chat.send} />\n * }\n * ```\n */\n\nimport * as React from 'react'\nimport { cn } from '../utils'\nimport type {\n ChatWindowAgent,\n ChatWindowStatus,\n} from '../types'\nimport type {\n LucidConversation,\n LucidBlock,\n TextBlockContent,\n ThinkingBlockContent,\n ToolBlockContent,\n SourceBlockContent,\n ErrorBlockContent,\n} from '@uix-ai/core'\nimport {\n isTextBlock,\n isThinkingBlock,\n isToolBlock,\n isSourceBlock,\n isErrorBlock,\n} from '@uix-ai/core'\nimport {\n ChatWindow,\n ChatWindowHeader,\n ChatWindowMessages,\n ChatWindowInput,\n ChatWindowEmpty,\n} from './ChatWindow'\nimport { ThinkingIndicator } from './ThinkingIndicator'\nimport { ToolResult } from './ToolResult'\nimport { SourceBlock, SourceList } from './SourceBlock'\nimport {\n ChatMessage,\n ChatMessageAvatar,\n ChatMessageContent,\n ChatMessageTimestamp,\n} from './ChatMessage'\n\n// ============================================================================\n// AgentChat Props\n// ============================================================================\n\nexport interface AgentChatProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onError'> {\n /**\n * UIX LucidConversation array - the universal format from any adapter.\n * Can come from @uix-ai/adapter-vercel, @uix-ai/adapter-agui, or any custom source.\n */\n conversations: LucidConversation[]\n\n /**\n * Agent information displayed in the header.\n * Omit to hide the header.\n */\n agent?: ChatWindowAgent | null\n\n /**\n * Chat status - controls input state and submit button behavior.\n * @default 'idle'\n */\n status?: ChatWindowStatus\n\n /**\n * Called when the user sends a message.\n */\n onSend?: (message: string) => void\n\n /**\n * Called when the user clicks stop during streaming.\n */\n onStop?: () => void\n\n /**\n * Called when the user clicks retry on an error message.\n */\n onRetry?: () => void\n\n /**\n * Called when the user approves a tool execution.\n */\n onToolApprove?: (toolCallId: string) => void\n\n /**\n * Called when the user denies a tool execution.\n */\n onToolDeny?: (toolCallId: string, reason?: string) => void\n\n /**\n * Input placeholder text.\n * @default '输入消息...'\n */\n placeholder?: string\n\n /**\n * Empty state configuration.\n */\n emptyState?: {\n icon?: React.ReactNode\n title?: string\n description?: string\n }\n\n /**\n * Custom block renderer. Return null to use default rendering.\n */\n renderBlock?: (block: LucidBlock, conversation: LucidConversation) => React.ReactNode | null\n\n /**\n * Whether to show the header.\n * @default true if agent is provided\n */\n showHeader?: boolean\n\n /**\n * Auto scroll to bottom on new messages.\n * @default true\n */\n autoScroll?: boolean\n}\n\n// ============================================================================\n// Default Block Renderer\n// ============================================================================\n\nfunction DefaultBlockRenderer({\n block,\n}: {\n block: LucidBlock\n}) {\n if (isTextBlock(block)) {\n const content = block.content as TextBlockContent\n return (\n <div className=\"whitespace-pre-wrap break-words\">\n {content.text}\n {block.status === 'streaming' && (\n <span className=\"inline-block w-1.5 h-4 bg-gray-400 ml-0.5 animate-pulse align-text-bottom\" />\n )}\n </div>\n )\n }\n\n if (isThinkingBlock(block)) {\n const content = block.content as ThinkingBlockContent\n if (block.status === 'streaming') {\n return <ThinkingIndicator label={content.reasoning || undefined} />\n }\n if (content.reasoning) {\n return (\n <details className=\"text-sm text-gray-500\">\n <summary className=\"cursor-pointer hover:text-gray-700\">思考过程</summary>\n <div className=\"mt-1 pl-3 border-l-2 border-gray-200 whitespace-pre-wrap\">\n {content.reasoning}\n </div>\n </details>\n )\n }\n return null\n }\n\n if (isToolBlock(block)) {\n const content = block.content as ToolBlockContent\n return (\n <ToolResult\n tool={content.name}\n status={content.status}\n error={content.error}\n >\n {content.output != null && (\n <pre className=\"text-xs overflow-x-auto\">\n {typeof content.output === 'string'\n ? content.output\n : JSON.stringify(content.output, null, 2)}\n </pre>\n )}\n </ToolResult>\n )\n }\n\n if (isSourceBlock(block)) {\n const content = block.content as SourceBlockContent\n return <SourceBlock source={content} />\n }\n\n if (isErrorBlock(block)) {\n const content = block.content as ErrorBlockContent\n return (\n <div className=\"text-sm text-red-600 bg-red-50 rounded px-3 py-2\">\n {content.message}\n </div>\n )\n }\n\n return null\n}\n\n// ============================================================================\n// Conversation-to-Message Renderer\n// ============================================================================\n\nfunction ConversationMessage({\n conversation,\n renderBlock,\n onToolApprove,\n onToolDeny,\n}: {\n conversation: LucidConversation\n renderBlock?: AgentChatProps['renderBlock']\n onToolApprove?: AgentChatProps['onToolApprove']\n onToolDeny?: AgentChatProps['onToolDeny']\n}) {\n // Collect source blocks separately for grouped rendering\n const sourceBlocks: LucidBlock[] = []\n const contentBlocks: LucidBlock[] = []\n\n for (const block of conversation.blocks) {\n if (isSourceBlock(block)) {\n sourceBlocks.push(block)\n } else {\n contentBlocks.push(block)\n }\n }\n\n return (\n <ChatMessage role={conversation.role} status={conversation.status === 'streaming' ? 'streaming' : 'complete'}>\n <ChatMessageAvatar\n name={conversation.role === 'user' ? '用户' : 'AI'}\n />\n <ChatMessageContent>\n <div className=\"space-y-2\">\n {contentBlocks.map((block) => {\n // Try custom renderer first\n if (renderBlock) {\n const custom = renderBlock(block, conversation)\n if (custom !== null) {\n return <React.Fragment key={block.id}>{custom}</React.Fragment>\n }\n }\n\n return (\n <DefaultBlockRenderer key={block.id} block={block} />\n )\n })}\n\n {/* Grouped source citations */}\n {sourceBlocks.length > 0 && (\n <SourceList\n sources={sourceBlocks.map((block) => block.content as SourceBlockContent)}\n />\n )}\n </div>\n <ChatMessageTimestamp time={new Date(conversation.timestamp)} />\n </ChatMessageContent>\n </ChatMessage>\n )\n}\n\n// ============================================================================\n// AgentChat Component\n// ============================================================================\n\nexport const AgentChat = React.forwardRef<HTMLDivElement, AgentChatProps>(\n (\n {\n conversations,\n agent,\n status = 'idle',\n onSend,\n onStop,\n onRetry,\n onToolApprove,\n onToolDeny,\n placeholder,\n emptyState,\n renderBlock,\n showHeader,\n autoScroll = true,\n className,\n ...props\n },\n ref\n ) => {\n const shouldShowHeader = showHeader ?? !!agent\n\n return (\n <ChatWindow\n ref={ref}\n agent={agent}\n status={status}\n className={cn('h-full', className)}\n {...props}\n >\n {/* Header */}\n {shouldShowHeader && <ChatWindowHeader />}\n\n {/* Messages or Empty State */}\n {conversations.length === 0 ? (\n <ChatWindowEmpty\n icon={emptyState?.icon}\n title={emptyState?.title}\n description={emptyState?.description}\n />\n ) : (\n <ChatWindowMessages autoScroll={autoScroll}>\n {conversations.map((conversation) => (\n <ConversationMessage\n key={conversation.id}\n conversation={conversation}\n renderBlock={renderBlock}\n onToolApprove={onToolApprove}\n onToolDeny={onToolDeny}\n />\n ))}\n </ChatWindowMessages>\n )}\n\n {/* Input */}\n <ChatWindowInput\n onSend={onSend}\n placeholder={placeholder}\n />\n </ChatWindow>\n )\n }\n)\nAgentChat.displayName = 'AgentChat'\n"],"mappings":"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","names":["React","jsx","jsxs","React","jsx","jsxs","sizeClasses","variantClasses","React","jsx","jsxs","roleSymbols","sizeClasses","jsx","jsxs","React","jsx","jsxs","React","React","jsx","jsxs","jsx","jsxs","roleToVariant","jsx","jsxs","React","Fragment","jsx","jsxs","React","jsx","jsxs","sizeClasses","jsx","jsxs","statusColors","React","jsx","jsxs","jsx","jsxs","React","Fragment","jsx","jsxs","jsx","Fragment","jsxs","React","Fragment","jsx","jsxs","jsx","jsxs","Fragment","React","jsx","jsxs"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@uix-ai/agent",
3
+ "version": "0.0.1",
4
+ "description": "UIX conversation and block renderers - renders LucidConversation and LucidBlock types",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "dependencies": {
24
+ "@floating-ui/react": "^0.27.16",
25
+ "@uix-ai/core": "workspace:*",
26
+ "@uix-ai/lucid-tokens": "workspace:*",
27
+ "@uix-ai/stream": "workspace:*",
28
+ "clsx": "^2.1.0",
29
+ "tailwind-merge": "^2.2.0"
30
+ },
31
+ "peerDependencies": {
32
+ "react": "^18.0.0 || ^19.0.0",
33
+ "react-dom": "^18.0.0 || ^19.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/react": "^19.0.0",
37
+ "@types/react-dom": "^19.0.0",
38
+ "react": "^19.0.0",
39
+ "react-dom": "^19.0.0",
40
+ "tsup": "^8.0.0",
41
+ "typescript": "^5.3.0"
42
+ },
43
+ "keywords": [
44
+ "react",
45
+ "uix",
46
+ "conversation",
47
+ "block-renderer",
48
+ "agent",
49
+ "declarative-ui"
50
+ ],
51
+ "license": "MIT",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/Deepractice/UIX.git",
55
+ "directory": "packages/agent"
56
+ }
57
+ }