@ash-cloud/ash-ui 0.2.2 → 0.2.3
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.
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/components/Conversation.tsx","../src/components/LazyMarkdown.tsx","../src/components/Mention.tsx","../src/components/RichContent.tsx","../src/components/Message.tsx","../src/components/StatusIndicator.tsx","../src/icons.tsx","../src/components/CodeBlock.tsx","../src/components/JsonDisplay.tsx","../src/components/Tool.tsx","../src/components/Reasoning.tsx","../src/components/Task.tsx","../src/components/Attachments.tsx","../src/components/Shimmer.tsx","../src/components/LogsPanel.tsx","../src/components/EnvVarsPanel.tsx","../src/components/OptionCards.tsx","../src/components/ActionIcon.tsx","../src/design-tokens.ts","../src/types.ts","../src/hooks/useMessageQueue.ts","../src/hooks/useStopExecution.ts","../src/hooks/useFileUpload.ts","../src/hooks/middleware.ts","../src/hooks/useAgentChat.ts","../src/hooks/useChat.ts","../src/hooks/useLongTextConversion.ts"],"names":["createContext","useContext","useRef","useState","useCallback","useEffect","jsx","jsxs","lazy","useMemo","Suspense","Fragment","formatFileSize","options","error"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @ash-cloud/ash-ui - Utilities\n *\n * Utility functions for normalizing and formatting tool calls\n * for display in agentic UIs.\n */\n\nimport type {\n ActionType,\n ToolResult,\n CommandRunResult,\n NormalizedToolCall,\n TodoItem,\n AgentToolAction,\n} from './types';\n\n// =============================================================================\n// Tool Name Formatting\n// =============================================================================\n\n/**\n * Format MCP tool names from mcp__server__tool to mcp:server:tool\n */\nexport function formatToolName(name: string): string {\n if (name.startsWith('mcp__')) {\n const parts = name.split('__');\n if (parts.length >= 3) {\n return `mcp:${parts[1]}:${parts.slice(2).join(':')}`;\n }\n }\n return name;\n}\n\n/**\n * Parse MCP tool name to extract server and tool names\n */\nexport function parseMcpToolName(name: string): { serverName: string; toolName: string } | null {\n if (name.startsWith('mcp__')) {\n const parts = name.split('__');\n if (parts.length >= 3 && parts[1] !== undefined) {\n return {\n serverName: parts[1],\n toolName: parts.slice(2).join('__'),\n };\n }\n }\n return null;\n}\n\n// =============================================================================\n// Action Type Mapping\n// =============================================================================\n\n/**\n * Map a tool name and input to a structured ActionType\n */\nexport function mapToolToActionType(toolName: string, input: unknown): ActionType {\n const inputObj = (input as Record<string, unknown>) || {};\n\n switch (toolName) {\n case 'Bash':\n return {\n action: 'command_run',\n command: (inputObj.command as string) || '',\n description: inputObj.description as string | undefined,\n };\n\n case 'Read': {\n const limit = inputObj.limit as number | undefined;\n return {\n action: 'file_read',\n path: (inputObj.file_path as string) || '',\n offset: inputObj.offset as number | undefined,\n limit,\n linesRead: limit, // Use limit as approximate lines read if specified\n };\n }\n\n case 'Edit': {\n const oldStr = inputObj.old_string as string | undefined;\n const newStr = inputObj.new_string as string | undefined;\n // Calculate line diff stats\n const oldLines = oldStr ? oldStr.split('\\n').length : 0;\n const newLines = newStr ? newStr.split('\\n').length : 0;\n return {\n action: 'file_edit',\n path: (inputObj.file_path as string) || '',\n oldString: oldStr,\n newString: newStr,\n replaceAll: inputObj.replace_all as boolean | undefined,\n linesAdded: newLines,\n linesRemoved: oldLines,\n };\n }\n\n case 'Write': {\n const content = inputObj.content as string | undefined;\n return {\n action: 'file_write',\n path: (inputObj.file_path as string) || '',\n content,\n linesWritten: content ? content.split('\\n').length : undefined,\n };\n }\n\n case 'Grep':\n return {\n action: 'search',\n pattern: (inputObj.pattern as string) || '',\n path: inputObj.path as string | undefined,\n glob: inputObj.glob as string | undefined,\n type: inputObj.type as string | undefined,\n };\n\n case 'Glob':\n return {\n action: 'glob',\n pattern: (inputObj.pattern as string) || '',\n path: inputObj.path as string | undefined,\n };\n\n case 'WebFetch':\n return {\n action: 'web_fetch',\n url: (inputObj.url as string) || '',\n prompt: inputObj.prompt as string | undefined,\n };\n\n case 'WebSearch':\n return {\n action: 'web_search',\n query: (inputObj.query as string) || '',\n };\n\n case 'TodoWrite': {\n const todos = (inputObj.todos as TodoItem[]) || [];\n const stats = {\n total: todos.length,\n completed: todos.filter((t) => t.status === 'completed').length,\n inProgress: todos.filter((t) => t.status === 'in_progress').length,\n pending: todos.filter((t) => t.status === 'pending').length,\n };\n return {\n action: 'todo_write',\n todos,\n stats,\n };\n }\n\n case 'Task': {\n return {\n action: 'agent_tool',\n agentType: (inputObj.subagent_type as string) || 'general-purpose',\n description: (inputObj.description as string) || '',\n prompt: inputObj.prompt as string | undefined,\n startedAt: new Date().toISOString(),\n toolCallCount: 0,\n };\n }\n\n default: {\n // Check if it's an MCP tool\n const mcpParts = parseMcpToolName(toolName);\n if (mcpParts) {\n return {\n action: 'mcp_tool',\n serverName: mcpParts.serverName,\n toolName: mcpParts.toolName,\n arguments: input,\n };\n }\n\n // Generic tool\n return {\n action: 'generic_tool',\n toolName: formatToolName(toolName),\n arguments: input,\n };\n }\n }\n}\n\n// =============================================================================\n// Summary Generation\n// =============================================================================\n\n/**\n * Generate a human-readable summary for a tool call\n */\nexport function generateToolSummary(\n _toolName: string,\n _input: unknown,\n actionType: ActionType\n): string {\n switch (actionType.action) {\n case 'command_run': {\n const cmd = actionType.command;\n return cmd.length > 60 ? cmd.substring(0, 57) + '...' : cmd;\n }\n\n case 'file_read':\n return actionType.path;\n\n case 'file_edit':\n return actionType.path;\n\n case 'file_write':\n return actionType.path;\n\n case 'search':\n return `${actionType.pattern}${actionType.path ? ` in ${actionType.path}` : ''}`;\n\n case 'glob':\n return actionType.pattern;\n\n case 'web_fetch':\n return actionType.url;\n\n case 'web_search':\n return actionType.query;\n\n case 'mcp_tool':\n return `${actionType.serverName}:${actionType.toolName}`;\n\n case 'generic_tool':\n return actionType.toolName;\n\n case 'todo_write': {\n const { stats } = actionType;\n if (stats) {\n return `${stats.completed}/${stats.total} completed`;\n }\n return `${actionType.todos.length} tasks`;\n }\n\n case 'agent_tool':\n return actionType.description;\n\n default:\n return 'Unknown tool';\n }\n}\n\n// =============================================================================\n// Result Normalization\n// =============================================================================\n\n/**\n * Extract text content from various content formats\n */\nexport function extractTextContent(content: unknown): string {\n if (typeof content === 'string') return content;\n\n if (Array.isArray(content)) {\n return content\n .filter((item): item is { text: string } => typeof item?.text === 'string')\n .map((item) => item.text)\n .join('\\n');\n }\n\n if (content && typeof content === 'object' && 'text' in content) {\n return String((content as { text: unknown }).text);\n }\n\n return JSON.stringify(content, null, 2);\n}\n\n/**\n * Normalize tool result content to markdown or JSON format\n */\nexport function normalizeToolResult(content: unknown): ToolResult {\n if (typeof content === 'string') {\n try {\n const parsed = JSON.parse(content);\n return { type: 'json', value: parsed };\n } catch {\n return { type: 'markdown', value: content };\n }\n }\n\n if (Array.isArray(content)) {\n const texts = content\n .filter(\n (item): item is { type: 'text'; text: string } =>\n item?.type === 'text' && typeof item.text === 'string'\n )\n .map((item) => item.text);\n\n if (texts.length > 0) {\n const joined = texts.join('\\n\\n');\n try {\n return { type: 'json', value: JSON.parse(joined) };\n } catch {\n return { type: 'markdown', value: joined };\n }\n }\n }\n\n return { type: 'json', value: content };\n}\n\n/**\n * Parse command result from tool result content\n */\nexport function parseCommandResult(content: unknown): CommandRunResult {\n const output = extractTextContent(content);\n\n if (typeof content === 'string') {\n try {\n const parsed = JSON.parse(content);\n if (typeof parsed.exitCode === 'number') {\n return {\n exitCode: parsed.exitCode,\n output: parsed.output || output,\n success: parsed.exitCode === 0,\n };\n }\n } catch {\n // Not JSON, use raw output\n }\n }\n\n return {\n output,\n success: true,\n };\n}\n\n// =============================================================================\n// Tool Call Creation\n// =============================================================================\n\nexport interface ToolUseInput {\n id: string;\n name: string;\n input: unknown;\n}\n\n/**\n * Create a NormalizedToolCall from a tool_use content block\n */\nexport function createToolCall(toolUse: ToolUseInput): NormalizedToolCall {\n const actionType = mapToolToActionType(toolUse.name, toolUse.input);\n const summary = generateToolSummary(toolUse.name, toolUse.input, actionType);\n\n return {\n id: toolUse.id,\n toolName: toolUse.name,\n actionType,\n status: 'pending',\n summary,\n input: toolUse.input,\n startedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Update a NormalizedToolCall with its result\n */\nexport function updateToolCallWithResult(\n toolCall: NormalizedToolCall,\n content: unknown,\n isError?: boolean\n): NormalizedToolCall {\n const updatedToolCall = { ...toolCall };\n const actionType = { ...toolCall.actionType };\n\n updatedToolCall.status = isError ? 'failed' : 'success';\n updatedToolCall.completedAt = new Date().toISOString();\n updatedToolCall.isError = isError;\n updatedToolCall.output = content;\n\n if (actionType.action === 'command_run') {\n const result = parseCommandResult(content);\n (actionType as typeof actionType).result = result;\n if (result.exitCode !== undefined && result.exitCode !== 0) {\n updatedToolCall.status = 'failed';\n updatedToolCall.isError = true;\n }\n } else if (actionType.action === 'mcp_tool' || actionType.action === 'generic_tool') {\n (actionType as typeof actionType).result = normalizeToolResult(content);\n }\n\n updatedToolCall.actionType = actionType;\n return updatedToolCall;\n}\n\n// =============================================================================\n// Display Helpers\n// =============================================================================\n\n/**\n * Get display icon name for an action type\n */\nexport function getActionIcon(actionType: ActionType): string {\n switch (actionType.action) {\n case 'command_run':\n return 'terminal';\n case 'file_read':\n return 'file-text';\n case 'file_edit':\n return 'edit';\n case 'file_write':\n return 'file-plus';\n case 'search':\n return 'search';\n case 'glob':\n return 'folder-search';\n case 'web_fetch':\n return 'globe';\n case 'web_search':\n return 'search';\n case 'mcp_tool':\n return 'plug';\n case 'generic_tool':\n return 'tool';\n case 'todo_write':\n return 'list-checks';\n case 'agent_tool':\n return 'bot';\n default:\n return 'tool';\n }\n}\n\n/**\n * Get display label for an action type\n */\nexport function getActionLabel(actionType: ActionType): string {\n switch (actionType.action) {\n case 'command_run':\n return 'Command';\n case 'file_read':\n return 'Read';\n case 'file_edit':\n return 'Edit';\n case 'file_write':\n return 'Write';\n case 'search':\n return 'Search';\n case 'glob':\n return 'Glob';\n case 'web_fetch':\n return 'Fetch';\n case 'web_search':\n return 'Search';\n case 'mcp_tool':\n return 'MCP';\n case 'generic_tool':\n return 'Tool';\n case 'todo_write':\n return 'Tasks';\n case 'agent_tool':\n return (actionType as AgentToolAction).agentType;\n default:\n return 'Tool';\n }\n}\n\n// =============================================================================\n// Formatting Helpers\n// =============================================================================\n\n/**\n * Format a file size in bytes to a human-readable string\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Format a timestamp to a locale time string\n */\nexport function formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n });\n } catch {\n return timestamp;\n }\n}\n\n/**\n * Format elapsed time in human-readable format\n * @param startTime - ISO timestamp or Date when the operation started\n * @param endTime - Optional ISO timestamp or Date when the operation ended (defaults to now)\n * @returns Formatted string like \"2s\", \"1m 30s\", \"2m\", etc.\n */\nexport function formatElapsedTime(startTime: string | Date, endTime?: string | Date): string {\n const start = typeof startTime === 'string' ? new Date(startTime) : startTime;\n const end = endTime ? (typeof endTime === 'string' ? new Date(endTime) : endTime) : new Date();\n\n const elapsedMs = end.getTime() - start.getTime();\n const elapsedSeconds = Math.floor(elapsedMs / 1000);\n\n if (elapsedSeconds < 60) {\n return `${elapsedSeconds}s`;\n }\n\n const minutes = Math.floor(elapsedSeconds / 60);\n const seconds = elapsedSeconds % 60;\n\n if (seconds === 0) {\n return `${minutes}m`;\n }\n\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Truncate a string with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Join class names, filtering out falsy values\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\n// =============================================================================\n// =============================================================================\n// Option Parsing\n// =============================================================================\n\n/**\n * A parsed option from assistant message content\n */\nexport interface ParsedOption {\n /** Option identifier (e.g., \"1\", \"2\", \"A\", \"B\") */\n id: string;\n /** Option title/label */\n label: string;\n /** Optional description text */\n description?: string;\n}\n\n/**\n * Result of parsing options from content\n */\nexport interface ParsedOptionsResult {\n /** Text before the options */\n preamble: string;\n /** Parsed options */\n options: ParsedOption[];\n}\n\n/**\n * Parse options from assistant message content.\n * Detects patterns like:\n * - \"Option 1: Title\" / \"Option 2: Title\"\n * - \"**Option 1:** Title\" (bold markdown)\n * - Numbered lists with descriptions\n *\n * @returns ParsedOptionsResult if options found, null otherwise\n */\nexport function parseOptionsFromContent(content: string): ParsedOptionsResult | null {\n // Pattern 1: \"Option N:\" format (with or without bold markdown)\n // Matches: \"Option 1:\", \"**Option 1:**\", \"Option 1 -\", etc.\n const optionPattern = /(?:\\*\\*)?Option\\s+(\\d+)(?:\\*\\*)?[:\\-]\\s*([^\\n]+)(?:\\n((?:(?!\\n(?:\\*\\*)?Option\\s+\\d).)*?))?/gi;\n\n const options: ParsedOption[] = [];\n let firstMatchStart = -1;\n let match: RegExpExecArray | null;\n\n // Reset regex\n optionPattern.lastIndex = 0;\n\n while ((match = optionPattern.exec(content)) !== null) {\n if (firstMatchStart === -1) {\n firstMatchStart = match.index;\n }\n\n const id = match[1] ?? '';\n const labelRaw = match[2];\n const label = labelRaw ? labelRaw.trim() : '';\n // Description is everything after the label until the next option\n const descriptionRaw = match[3];\n\n // Clean up description - remove leading/trailing whitespace and normalize\n let description: string | undefined;\n if (descriptionRaw) {\n const cleaned = descriptionRaw\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .join(' ');\n if (cleaned) {\n description = cleaned;\n }\n }\n\n options.push({ id, label, description });\n }\n\n // Need at least 2 options to be considered a valid options list\n if (options.length >= 2) {\n const preamble = firstMatchStart > 0\n ? content.substring(0, firstMatchStart).trim()\n : '';\n\n return { preamble, options };\n }\n\n // Pattern 2: Simple numbered list at end of message\n // Look for \"What would you like to do?\" or similar followed by numbered items\n const questionPattern = /^(.*?(?:what would you like to do\\??|choose an option|select.*?:|here are your options.*?:))\\s*\\n+((?:\\d+\\.\\s+.+\\n?)+)/ims;\n const questionMatch = content.match(questionPattern);\n\n if (questionMatch && questionMatch[1] && questionMatch[2]) {\n const preamble = questionMatch[1].trim();\n const listSection = questionMatch[2];\n\n // Parse numbered list items\n const listPattern = /(\\d+)\\.\\s+([^\\n]+)/g;\n let listMatch: RegExpExecArray | null;\n\n while ((listMatch = listPattern.exec(listSection)) !== null) {\n const listId = listMatch[1] ?? '';\n const listLabelRaw = listMatch[2];\n const listLabel = listLabelRaw ? listLabelRaw.trim() : '';\n options.push({\n id: listId,\n label: listLabel,\n });\n }\n\n if (options.length >= 2) {\n return { preamble, options };\n }\n }\n\n return null;\n}\n","/**\n * Conversation - AI SDK Elements compatible conversation container\n *\n * A scrollable container for chat messages with auto-scroll functionality.\n *\n * @example\n * ```tsx\n * import { Conversation, ConversationContent, ConversationEmptyState } from '@ash-cloud/ash-ui';\n *\n * function Chat() {\n * const { messages } = useChat({ ... });\n *\n * return (\n * <Conversation>\n * <ConversationContent>\n * {messages.length === 0 ? (\n * <ConversationEmptyState>\n * <p>Start a conversation</p>\n * </ConversationEmptyState>\n * ) : (\n * messages.map((m) => <Message key={m.id} {...m} />)\n * )}\n * </ConversationContent>\n * </Conversation>\n * );\n * }\n * ```\n */\n\nimport React, {\n createContext,\n useContext,\n useRef,\n useEffect,\n useCallback,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ConversationContextValue {\n /** Reference to the scroll container */\n containerRef: React.RefObject<HTMLDivElement>;\n /** Scroll to the bottom of the conversation */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n /** Whether the user has scrolled up from the bottom */\n isScrolledUp: boolean;\n /** Whether auto-scroll is enabled */\n autoScroll: boolean;\n /** Set auto-scroll state */\n setAutoScroll: (value: boolean) => void;\n}\n\nconst ConversationContext = createContext<ConversationContextValue | null>(null);\n\nexport function useConversation(): ConversationContextValue {\n const context = useContext(ConversationContext);\n if (!context) {\n throw new Error('useConversation must be used within a Conversation');\n }\n return context;\n}\n\n// ============================================================================\n// Conversation\n// ============================================================================\n\nexport interface ConversationProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether to auto-scroll on new messages */\n autoScroll?: boolean;\n /** Threshold in pixels to consider \"at bottom\" */\n scrollThreshold?: number;\n}\n\nexport function Conversation({\n children,\n className,\n autoScroll: initialAutoScroll = true,\n scrollThreshold = 100,\n}: ConversationProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isScrolledUp, setIsScrolledUp] = useState(false);\n const [autoScroll, setAutoScroll] = useState(initialAutoScroll);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior = 'smooth') => {\n if (containerRef.current) {\n containerRef.current.scrollTo({\n top: containerRef.current.scrollHeight,\n behavior,\n });\n }\n }, []);\n\n // Handle scroll events to detect if user scrolled up\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return;\n\n const { scrollTop, scrollHeight, clientHeight } = containerRef.current;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n const isAtBottom = distanceFromBottom < scrollThreshold;\n\n setIsScrolledUp(!isAtBottom);\n\n // Re-enable auto-scroll when user scrolls to bottom\n if (isAtBottom && !autoScroll) {\n setAutoScroll(true);\n }\n }, [scrollThreshold, autoScroll]);\n\n // Auto-scroll on content changes\n useEffect(() => {\n if (autoScroll && !isScrolledUp) {\n scrollToBottom('instant');\n }\n });\n\n const contextValue: ConversationContextValue = {\n containerRef: containerRef as React.RefObject<HTMLDivElement>,\n scrollToBottom,\n isScrolledUp,\n autoScroll,\n setAutoScroll,\n };\n\n return (\n <ConversationContext.Provider value={contextValue}>\n <div\n ref={containerRef}\n onScroll={handleScroll}\n className={cn(\n 'ash-conversation flex flex-col overflow-y-auto',\n 'ash-scrollbar',\n className\n )}\n role=\"log\"\n aria-live=\"polite\"\n >\n {children}\n </div>\n </ConversationContext.Provider>\n );\n}\n\n// ============================================================================\n// ConversationContent\n// ============================================================================\n\nexport interface ConversationContentProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function ConversationContent({\n children,\n className,\n}: ConversationContentProps) {\n return (\n <div\n className={cn(\n 'ash-conversation-content flex flex-col',\n 'gap-[var(--ash-message-list-gap,0.25rem)]',\n 'p-[var(--ash-spacing-md,0.75rem)]',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// ConversationEmptyState\n// ============================================================================\n\nexport interface ConversationEmptyStateProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function ConversationEmptyState({\n children,\n className,\n}: ConversationEmptyStateProps) {\n return (\n <div\n className={cn(\n 'ash-conversation-empty flex flex-col items-center justify-center',\n 'flex-1 min-h-[200px] text-center',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// ConversationScrollButton\n// ============================================================================\n\nexport interface ConversationScrollButtonProps {\n /** Additional class name */\n className?: string;\n /** Custom label */\n label?: string;\n}\n\nexport function ConversationScrollButton({\n className,\n label = 'Scroll to bottom',\n}: ConversationScrollButtonProps) {\n const { isScrolledUp, scrollToBottom } = useConversation();\n\n if (!isScrolledUp) return null;\n\n return (\n <button\n onClick={() => scrollToBottom()}\n className={cn(\n 'ash-conversation-scroll-btn',\n 'fixed bottom-20 left-1/2 -translate-x-1/2',\n 'px-4 py-2 rounded-full',\n 'bg-[var(--ash-surface-elevated,#111)] border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))] text-sm',\n 'hover:bg-[var(--ash-surface-card,#0c0c0c)] hover:border-[var(--ash-border-emphasis,rgba(255,255,255,0.15))]',\n 'transition-all duration-200',\n 'shadow-lg',\n className\n )}\n aria-label={label}\n >\n <span className=\"flex items-center gap-2\">\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 14l-7 7m0 0l-7-7m7 7V3\"\n />\n </svg>\n {label}\n </span>\n </button>\n );\n}\n","import { lazy, Suspense, useState, useEffect, useMemo, type ReactNode } from 'react';\nimport type { MarkdownComponents } from '../types';\n\n// Lazy load react-markdown to avoid SSR issues with decode-named-character-reference\n// which uses document.createElement at module evaluation time\nconst ReactMarkdown = lazy(() => import('react-markdown'));\n\nexport interface LazyMarkdownProps {\n children: string;\n /** Fallback content to show while loading */\n fallback?: ReactNode;\n /** Custom component overrides for markdown elements */\n components?: MarkdownComponents;\n className?: string;\n}\n\n/**\n * LazyMarkdown - SSR-safe wrapper around react-markdown\n *\n * This component lazy-loads react-markdown to avoid the \"document is not defined\"\n * error that occurs during SSR due to the decode-named-character-reference package.\n *\n * @example\n * ```tsx\n * <LazyMarkdown>{markdownContent}</LazyMarkdown>\n *\n * // With custom components\n * <LazyMarkdown\n * components={{\n * h2: ({ children }) => <h2 className=\"custom-h2\">{children}</h2>,\n * code: ({ children, className }) => <CustomCode className={className}>{children}</CustomCode>,\n * }}\n * >\n * {markdownContent}\n * </LazyMarkdown>\n * ```\n */\nexport function LazyMarkdown({ children, fallback, components, className }: LazyMarkdownProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // Memoize components to prevent unnecessary re-renders\n const markdownComponents = useMemo(() => {\n if (!components) return undefined;\n // Cast to the format react-markdown expects\n return components as Record<string, React.ComponentType<unknown>>;\n }, [components]);\n\n // Don't render markdown on the server to avoid SSR issues\n if (!mounted) {\n // Return plain text as fallback during SSR\n return <span className={className}>{fallback ?? children}</span>;\n }\n\n return (\n <Suspense fallback={<span className={className}>{fallback ?? children}</span>}>\n <ReactMarkdown components={markdownComponents}>{children}</ReactMarkdown>\n </Suspense>\n );\n}\n\nexport default LazyMarkdown;\n","/**\n * Mention - Default mention component for rich content\n *\n * Renders an @mention badge with optional avatar and custom styling.\n * Consumers can provide their own mention component via the `components` prop.\n *\n * @example\n * ```tsx\n * import { Mention } from '@ash-cloud/ash-ui';\n *\n * <Mention name=\"ProductX\" color=\"#f59e0b\" />\n * <Mention name=\"JohnDoe\" url=\"/avatars/john.jpg\" />\n * ```\n */\n\nimport { cn } from '../utils';\nimport type { MentionProps } from '../types';\n\nexport type { MentionProps } from '../types';\n\nexport function Mention({ name, color, url }: MentionProps) {\n return (\n <span\n className={cn(\n 'ash-mention',\n 'inline-flex items-center',\n 'px-1.5 py-0.5 rounded',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'font-medium'\n )}\n style={{\n backgroundColor: color ? `${color}20` : 'var(--ash-mention-bg,rgba(255,255,255,0.1))',\n color: color || 'var(--ash-mention-text,inherit)',\n }}\n >\n {url && (\n <img\n src={url}\n alt=\"\"\n className=\"w-4 h-4 rounded mr-1 object-cover\"\n />\n )}\n @{name}\n </span>\n );\n}\n","/**\n * RichContent - Renderer for pre-parsed rich content segments\n *\n * Renders a mix of text and mention segments with support for\n * custom mention components.\n *\n * @example\n * ```tsx\n * import { RichContentRenderer } from '@ash-cloud/ash-ui';\n *\n * const content = [\n * { type: 'text', content: 'Check out ' },\n * { type: 'mention', name: 'ProductX', color: '#f59e0b' },\n * { type: 'text', content: ' for details' },\n * ];\n *\n * // With default mention component\n * <RichContentRenderer content={content} />\n *\n * // With custom mention component\n * <RichContentRenderer\n * content={content}\n * components={{\n * mention: ({ name, data }) => (\n * <Link href={`/products/${data?.id}`}>@{name}</Link>\n * ),\n * }}\n * />\n * ```\n */\n\nimport type { ComponentType } from 'react';\nimport { cn } from '../utils';\nimport type { RichContent, MentionProps, MarkdownComponents } from '../types';\nimport { Mention } from './Mention';\nimport { LazyMarkdown } from './LazyMarkdown';\n\nexport interface RichContentProps {\n /** Pre-parsed rich content segments */\n content: RichContent;\n /** Custom components for rendering */\n components?: MarkdownComponents & {\n /** Custom mention renderer */\n mention?: ComponentType<MentionProps>;\n };\n /** Additional class name */\n className?: string;\n}\n\nexport function RichContentRenderer({\n content,\n components,\n className,\n}: RichContentProps) {\n const MentionComponent = components?.mention || Mention;\n\n return (\n <span className={cn('ash-rich-content', className)}>\n {content.map((segment, index) => {\n if (segment.type === 'text') {\n return (\n <LazyMarkdown key={index} components={components}>\n {segment.content}\n </LazyMarkdown>\n );\n }\n\n if (segment.type === 'mention') {\n return (\n <MentionComponent\n key={index}\n name={segment.name}\n color={segment.color}\n url={segment.url}\n data={segment.data}\n />\n );\n }\n\n // Exhaustive check - should never reach here\n return null;\n })}\n </span>\n );\n}\n","/**\n * Message - AI SDK Elements compatible message components\n *\n * Renders individual messages in a conversation with support for\n * user/assistant/system roles, markdown content, and tool invocations.\n *\n * @example\n * ```tsx\n * import { Message, MessageContent, MessageResponse } from '@ash-cloud/ash-ui';\n *\n * <Message from=\"user\">\n * <MessageContent>Hello!</MessageContent>\n * </Message>\n *\n * <Message from=\"assistant\">\n * <MessageContent>\n * <MessageResponse content={message.content} />\n * </MessageContent>\n * </Message>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n type ReactNode,\n type ComponentType,\n} from 'react';\nimport { cn } from '../utils';\nimport type { ToolInvocation, RichContent, MentionProps, MarkdownComponents } from '../types';\nimport { LazyMarkdown } from './LazyMarkdown';\nimport { RichContentRenderer } from './RichContent';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface MessageContextValue {\n /** Message role */\n from: 'user' | 'assistant' | 'system';\n /** Whether this message is streaming */\n isStreaming?: boolean;\n /** Tool invocations in this message */\n toolInvocations?: ToolInvocation[];\n}\n\nconst MessageContext = createContext<MessageContextValue | null>(null);\n\nexport function useMessage(): MessageContextValue {\n const context = useContext(MessageContext);\n if (!context) {\n throw new Error('useMessage must be used within a Message');\n }\n return context;\n}\n\n// ============================================================================\n// Message\n// ============================================================================\n\nexport interface MessageProps {\n /** Message role */\n from: 'user' | 'assistant' | 'system';\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether this message is streaming */\n isStreaming?: boolean;\n /** Tool invocations (for assistant messages) */\n toolInvocations?: ToolInvocation[];\n /** Message ID for data attribute */\n id?: string;\n}\n\nexport function Message({\n from,\n children,\n className,\n isStreaming,\n toolInvocations,\n id,\n}: MessageProps) {\n const contextValue: MessageContextValue = {\n from,\n isStreaming,\n toolInvocations,\n };\n\n // Map role to data attribute value\n const roleMap: Record<string, string> = {\n user: 'user',\n assistant: 'assistant',\n system: 'system',\n };\n\n return (\n <MessageContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-message',\n 'flex gap-[var(--ash-message-gap,0.5rem)]',\n from === 'user' && 'flex-row-reverse',\n className\n )}\n data-message-role={roleMap[from]}\n data-message-id={id}\n >\n {children}\n </div>\n </MessageContext.Provider>\n );\n}\n\n// ============================================================================\n// MessageAvatar\n// ============================================================================\n\nexport interface MessageAvatarProps {\n /** Avatar image URL */\n src?: string;\n /** Fallback text (initials) */\n fallback?: string;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageAvatar({ src, fallback, className }: MessageAvatarProps) {\n const { from } = useMessage();\n\n // Default fallbacks based on role\n const defaultFallback = from === 'user' ? 'U' : from === 'assistant' ? 'A' : 'S';\n const displayFallback = fallback || defaultFallback;\n\n // Role-based background colors\n const bgColorMap: Record<string, string> = {\n user: 'var(--ash-avatar-user-bg,rgba(255,255,255,0.1))',\n assistant: 'var(--ash-avatar-assistant-bg,#10a37f)',\n system: 'var(--ash-avatar-user-bg,rgba(255,255,255,0.1))',\n };\n\n return (\n <div\n className={cn(\n 'ash-message-avatar flex-shrink-0',\n 'w-[var(--ash-avatar-size,1.25rem)] h-[var(--ash-avatar-size,1.25rem)]',\n 'rounded-full flex items-center justify-center',\n 'text-[var(--ash-font-size-xs,10px)] font-medium',\n from === 'assistant' ? 'text-white' : 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]',\n className\n )}\n style={{ backgroundColor: bgColorMap[from] }}\n >\n {src ? (\n <img\n src={src}\n alt={`${from} avatar`}\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : (\n displayFallback\n )}\n </div>\n );\n}\n\n// ============================================================================\n// MessageContent\n// ============================================================================\n\nexport interface MessageContentProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageContent({ children, className }: MessageContentProps) {\n const { from } = useMessage();\n\n // Role-based styling\n const roleStyles: Record<string, string> = {\n user: cn(\n 'bg-[var(--ash-user-bg,#5B6EF5)]',\n 'text-[var(--ash-user-text,#ffffff)]',\n 'border-[var(--ash-user-border,transparent)]'\n ),\n assistant: cn(\n 'bg-[var(--ash-assistant-bg,#1a1a1a)]',\n 'text-[var(--ash-assistant-text,rgba(255,255,255,0.9))]',\n 'border-[var(--ash-assistant-border,rgba(255,255,255,0.08))]'\n ),\n system: cn(\n 'bg-[var(--ash-surface-elevated,#111111)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'border-[var(--ash-border,rgba(255,255,255,0.08))]'\n ),\n };\n\n return (\n <div\n className={cn(\n 'ash-message-content',\n 'flex-1 min-w-0',\n 'rounded-[var(--ash-radius-lg,0.75rem)]',\n 'p-[var(--ash-message-padding,0.5rem_0.75rem)]',\n 'border',\n roleStyles[from],\n from === 'user' && 'rounded-tr-sm',\n from === 'assistant' && 'rounded-tl-sm',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// MessageResponse\n// ============================================================================\n\nexport interface MessageResponseProps {\n /** Plain markdown content */\n content?: string;\n /** Pre-parsed rich content segments (alternative to content) */\n richContent?: RichContent;\n /** Whether content is still streaming */\n isStreaming?: boolean;\n /** Additional class name */\n className?: string;\n /** Custom markdown components and mention renderer */\n components?: MarkdownComponents & {\n /** Custom mention renderer for rich content */\n mention?: ComponentType<MentionProps>;\n };\n}\n\nexport function MessageResponse({\n content,\n richContent,\n isStreaming,\n className,\n components,\n}: MessageResponseProps) {\n // If richContent is provided, use RichContentRenderer\n if (richContent && richContent.length > 0) {\n return (\n <div\n className={cn(\n 'ash-message-response',\n 'font-[var(--ash-font-size-base,13px)]',\n 'leading-relaxed',\n isStreaming && 'animate-pulse',\n className\n )}\n >\n <RichContentRenderer content={richContent} components={components} />\n </div>\n );\n }\n\n // Otherwise render plain markdown content\n if (!content) return null;\n\n return (\n <div\n className={cn(\n 'ash-message-response',\n 'font-[var(--ash-font-size-base,13px)]',\n 'leading-relaxed',\n isStreaming && 'animate-pulse',\n className\n )}\n >\n <LazyMarkdown components={components}>{content}</LazyMarkdown>\n </div>\n );\n}\n\n// ============================================================================\n// MessageActions\n// ============================================================================\n\nexport interface MessageActionsProps {\n /** Child elements (action buttons) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageActions({ children, className }: MessageActionsProps) {\n return (\n <div\n className={cn(\n 'ash-message-actions',\n 'flex items-center gap-1 mt-2',\n 'opacity-0 group-hover:opacity-100 transition-opacity',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// MessageAction\n// ============================================================================\n\nexport interface MessageActionProps {\n /** Action icon */\n icon?: ReactNode;\n /** Action label */\n label: string;\n /** Click handler */\n onClick?: () => void;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageAction({\n icon,\n label,\n onClick,\n className,\n}: MessageActionProps) {\n return (\n <button\n onClick={onClick}\n className={cn(\n 'ash-message-action',\n 'p-1.5 rounded-md',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'hover:text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]',\n 'hover:bg-[var(--ash-surface-elevated,#111111)]',\n 'transition-colors',\n className\n )}\n title={label}\n aria-label={label}\n >\n {icon || label}\n </button>\n );\n}\n\n// ============================================================================\n// MessageTimestamp\n// ============================================================================\n\nexport interface MessageTimestampProps {\n /** Timestamp to display */\n timestamp: Date | string;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageTimestamp({ timestamp, className }: MessageTimestampProps) {\n const date = typeof timestamp === 'string' ? new Date(timestamp) : timestamp;\n const formatted = date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n\n return (\n <span\n className={cn(\n 'ash-message-timestamp',\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-faint,rgba(255,255,255,0.3))]',\n className\n )}\n >\n {formatted}\n </span>\n );\n}\n","import type { ToolStatus } from '../types';\nimport { cn } from '../utils';\n\nexport interface StatusIndicatorProps {\n status: ToolStatus;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n className?: string;\n}\n\n/**\n * StatusIndicator - Visual indicator for tool execution status\n *\n * Uses the glassmorphism theme with animated states:\n * - pending: Yellow with pulse animation\n * - success: Accent color (lime green)\n * - failed: Red\n *\n * @example\n * ```tsx\n * <StatusIndicator status=\"pending\" />\n * <StatusIndicator status=\"success\" size=\"lg\" />\n * <StatusIndicator status=\"failed\" />\n * ```\n */\nexport function StatusIndicator({ status, size = 'sm', className }: StatusIndicatorProps) {\n const sizeClasses = {\n xs: 'w-1.5 h-1.5',\n sm: 'w-2 h-2',\n md: 'w-3 h-3',\n lg: 'w-4 h-4',\n };\n\n const statusClasses = {\n pending: 'ash-status-pending',\n success: 'ash-status-success',\n failed: 'ash-status-failed',\n };\n\n return (\n <div\n className={cn(\n 'rounded-full flex-shrink-0',\n sizeClasses[size],\n statusClasses[status],\n className\n )}\n />\n );\n}\n\nexport default StatusIndicator;\n","/**\n * @ash-cloud/ash-ui - Icon Components\n *\n * Inline SVG icons for minimal dependencies. These icons follow\n * the Feather Icons style:\n * - 24x24 viewBox\n * - 2px stroke width\n * - No fill (stroke-based)\n */\n\n// =============================================================================\n// Icon Props Type\n// =============================================================================\n\nexport interface IconProps {\n className?: string;\n}\n\n// =============================================================================\n// Navigation & UI Icons\n// =============================================================================\n\nexport function SunIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\n </svg>\n );\n}\n\nexport function MoonIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n );\n}\n\nexport function ChevronDownIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\nexport function ChevronRightIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nexport function ChevronLeftIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\nexport function ChevronUpIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Tool & Action Icons\n// =============================================================================\n\nexport function TerminalIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n );\n}\n\nexport function FileIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function EditIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n );\n}\n\nexport function FilePlusIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\" />\n <line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\nexport function SearchIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nexport function GlobeIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n );\n}\n\nexport function PlugIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 2v6\" />\n <path d=\"M6 6v4a6 6 0 0 0 12 0V6\" />\n <path d=\"M12 16v6\" />\n </svg>\n );\n}\n\nexport function ToolIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nexport function FolderSearchIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n <circle cx=\"11\" cy=\"13\" r=\"3\" />\n <line x1=\"15\" y1=\"16\" x2=\"17\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function CodeIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n );\n}\n\nexport function CopyIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nexport function CheckIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nexport function XIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function LoaderIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"6\" />\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\" />\n <line x1=\"4.93\" y1=\"4.93\" x2=\"7.76\" y2=\"7.76\" />\n <line x1=\"16.24\" y1=\"16.24\" x2=\"19.07\" y2=\"19.07\" />\n <line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" />\n <line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <line x1=\"4.93\" y1=\"19.07\" x2=\"7.76\" y2=\"16.24\" />\n <line x1=\"16.24\" y1=\"7.76\" x2=\"19.07\" y2=\"4.93\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Status & Alert Icons\n// =============================================================================\n\nexport function InfoIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n}\n\nexport function AlertTriangleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function AlertCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nexport function BugIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"6\" width=\"8\" height=\"14\" rx=\"4\" />\n <path d=\"M3 10h2\" />\n <path d=\"M19 10h2\" />\n <path d=\"M3 14h2\" />\n <path d=\"M19 14h2\" />\n <path d=\"M9 2h6\" />\n <path d=\"M12 2v4\" />\n </svg>\n );\n}\n\nexport function CheckCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n );\n}\n\nexport function XCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Communication & Misc Icons\n// =============================================================================\n\nexport function SendIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n );\n}\n\nexport function PaperclipIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n );\n}\n\nexport function StopCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n </svg>\n );\n}\n\nexport function MessageSquareIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\nexport function SparklesIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M5 19l.5 1.5L7 21l-1.5.5L5 23l-.5-1.5L3 21l1.5-.5L5 19z\" />\n <path d=\"M19 11l.5 1.5L21 13l-1.5.5L19 15l-.5-1.5L17 13l1.5-.5L19 11z\" />\n </svg>\n );\n}\n\nexport function BrainIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 4.44-1.54\" />\n <path d=\"M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-4.44-1.54\" />\n </svg>\n );\n}\n\nexport function BotIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 8V4H8\" />\n <rect x=\"5\" y=\"8\" width=\"14\" height=\"12\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M9 13v2\" />\n <path d=\"M15 13v2\" />\n </svg>\n );\n}\n\nexport function UserIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Todo & Task Icons\n// =============================================================================\n\nexport function CircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n );\n}\n\nexport function ListChecksIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M10 6h11\" />\n <path d=\"M10 12h11\" />\n <path d=\"M10 18h11\" />\n <path d=\"M3 6l2 2 4-4\" />\n <path d=\"M3 12l2 2 4-4\" />\n <path d=\"M3 18l2 2 4-4\" />\n </svg>\n );\n}\n\nexport function ClipboardListIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\" />\n <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" />\n <path d=\"M12 11h4\" />\n <path d=\"M12 16h4\" />\n <path d=\"M8 11h.01\" />\n <path d=\"M8 16h.01\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Time Icons\n// =============================================================================\n\nexport function ClockIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Spinner & Loading Icons\n// =============================================================================\n\nexport function SpinnerIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function ErrorIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ChatGPT-Style UI Icons\n// =============================================================================\n\nexport function MicrophoneIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n );\n}\n\nexport function HomeIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n <polyline points=\"9 22 9 12 15 12 15 22\" />\n </svg>\n );\n}\n\nexport function ArrowUpIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { cn } from '../utils';\nimport { CopyIcon, CheckIcon } from '../icons';\n\nexport interface CodeBlockProps {\n children: string;\n maxHeight?: number;\n language?: string;\n showLineNumbers?: boolean;\n className?: string;\n}\n\n/**\n * CodeBlock - Display code with syntax-aware styling and expand/collapse\n *\n * Uses glassmorphism dark theme styling with ChatGPT-style header containing\n * language label and copy button.\n *\n * @example\n * ```tsx\n * <CodeBlock>{`const x = 1;`}</CodeBlock>\n * <CodeBlock maxHeight={200}>{longCode}</CodeBlock>\n * <CodeBlock language=\"typescript\" showLineNumbers>{code}</CodeBlock>\n * ```\n */\nexport function CodeBlock({\n children,\n maxHeight = 200,\n language,\n showLineNumbers = false,\n className,\n}: CodeBlockProps) {\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n const lines = children.split('\\n');\n const isLong = lines.length > 10 || children.length > 500;\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(children);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }, [children]);\n\n return (\n <div className={cn('relative rounded-lg overflow-hidden border border-white/10', className)}>\n {/* Header with language label and copy button */}\n <div className=\"flex items-center justify-between px-4 py-2 bg-[var(--ash-code-header-bg)] border-b border-white/10\">\n <span className=\"text-xs text-white/60 font-medium\">\n {language || 'code'}\n </span>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1.5 text-xs text-white/60 hover:text-white transition-colors\"\n >\n {copied ? (\n <>\n <CheckIcon className=\"w-3.5 h-3.5\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <CopyIcon className=\"w-3.5 h-3.5\" />\n <span>Copy</span>\n </>\n )}\n </button>\n </div>\n <pre\n className={cn(\n 'text-xs font-mono text-white/90 p-4 bg-black/30 overflow-x-auto whitespace-pre-wrap break-words',\n !expanded && isLong && 'overflow-y-hidden'\n )}\n style={!expanded && isLong ? { maxHeight } : undefined}\n data-language={language}\n >\n {showLineNumbers ? (\n <code>\n {lines.map((line, i) => (\n <span key={i} className=\"block\">\n <span className=\"inline-block w-8 text-white/30 select-none text-right pr-2\">\n {i + 1}\n </span>\n <span className=\"text-white/80\">{line}</span>\n </span>\n ))}\n </code>\n ) : (\n <code className=\"text-white/80\">{children}</code>\n )}\n </pre>\n {isLong && !expanded && (\n <div className=\"absolute bottom-0 left-0 right-0 h-12 ash-truncate-fade flex items-end justify-center pb-2\">\n <button\n onClick={() => setExpanded(true)}\n className=\"text-xs text-[var(--ash-accent)] hover:text-[var(--ash-accent-300)] font-medium transition-colors\"\n >\n Show more\n </button>\n </div>\n )}\n {isLong && expanded && (\n <button\n onClick={() => setExpanded(false)}\n className=\"text-xs text-[var(--ash-accent)] hover:text-[var(--ash-accent-300)] font-medium mt-2 transition-colors\"\n >\n Show less\n </button>\n )}\n </div>\n );\n}\n\nexport default CodeBlock;\n","import { CodeBlock } from './CodeBlock';\n\nexport interface JsonDisplayProps {\n value: unknown;\n maxHeight?: number;\n className?: string;\n}\n\n/**\n * JsonDisplay - Display JSON data in a formatted code block\n *\n * @example\n * ```tsx\n * <JsonDisplay value={{ name: 'test', count: 42 }} />\n * <JsonDisplay value={data} maxHeight={300} />\n * ```\n */\nexport function JsonDisplay({ value, maxHeight, className }: JsonDisplayProps) {\n const formatted = JSON.stringify(value, null, 2);\n return (\n <CodeBlock maxHeight={maxHeight} className={className}>\n {formatted}\n </CodeBlock>\n );\n}\n\nexport default JsonDisplay;\n","/**\n * Tool - AI SDK Elements compatible tool display components\n *\n * Renders tool invocations with expandable details showing\n * input arguments and output results.\n *\n * @example\n * ```tsx\n * import { Tool, ToolHeader, ToolInput, ToolOutput } from '@ash-cloud/ash-ui';\n *\n * <Tool toolInvocation={inv}>\n * <ToolHeader />\n * <ToolInput />\n * <ToolOutput />\n * </Tool>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn, formatToolName } from '../utils';\nimport type { ToolInvocation } from '../types';\nimport { StatusIndicator } from './StatusIndicator';\nimport { JsonDisplay } from './JsonDisplay';\nimport { CodeBlock } from './CodeBlock';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Tool display variant\n * - 'default': Full-sized with expand/collapse\n * - 'compact': Smaller with minimal padding, no expand/collapse\n */\nexport type ToolVariant = 'default' | 'compact';\n\ninterface ToolContextValue {\n /** The tool invocation data */\n toolInvocation: ToolInvocation;\n /** Whether the tool details are expanded */\n isExpanded: boolean;\n /** Toggle expansion state */\n toggleExpanded: () => void;\n /** Display variant */\n variant: ToolVariant;\n}\n\nconst ToolContext = createContext<ToolContextValue | null>(null);\n\nexport function useTool(): ToolContextValue {\n const context = useContext(ToolContext);\n if (!context) {\n throw new Error('useTool must be used within a Tool');\n }\n return context;\n}\n\n// ============================================================================\n// Tool\n// ============================================================================\n\nexport interface ToolProps {\n /** Tool invocation data */\n toolInvocation: ToolInvocation;\n /** Child elements */\n children?: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether to start expanded */\n defaultExpanded?: boolean;\n /** Display variant: 'default' or 'compact' */\n variant?: ToolVariant;\n}\n\nexport function Tool({\n toolInvocation,\n children,\n className,\n defaultExpanded = false,\n variant = 'default',\n}: ToolProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n const toggleExpanded = () => setIsExpanded((prev) => !prev);\n\n const contextValue: ToolContextValue = {\n toolInvocation,\n isExpanded,\n toggleExpanded,\n variant,\n };\n\n // Determine status for styling\n const status = toolInvocation.state === 'result' ? 'success' : 'pending';\n const isErrorResult = Boolean(\n toolInvocation.result &&\n typeof toolInvocation.result === 'object' &&\n 'error' in (toolInvocation.result as Record<string, unknown>)\n );\n\n return (\n <ToolContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-tool',\n 'rounded-[var(--ash-radius-md,0.5rem)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'bg-[var(--ash-tool-bg,var(--ash-surface-dark,#0a0a0a))]',\n 'overflow-hidden',\n status === 'pending' && 'ash-tool-status-pending',\n isErrorResult && 'border-red-500/30',\n className\n )}\n data-tool-name={toolInvocation.toolName}\n data-tool-state={toolInvocation.state}\n >\n {children || (\n <>\n <ToolHeader />\n {isExpanded && (\n <>\n <ToolInput />\n <ToolOutput />\n </>\n )}\n </>\n )}\n </div>\n </ToolContext.Provider>\n );\n}\n\n// ============================================================================\n// ToolHeader\n// ============================================================================\n\nexport interface ToolHeaderProps {\n /** Additional class name */\n className?: string;\n /** Custom icon */\n icon?: ReactNode;\n /** Show expand/collapse button */\n showToggle?: boolean;\n}\n\nexport function ToolHeader({\n className,\n icon,\n showToggle = true,\n}: ToolHeaderProps) {\n const { toolInvocation, isExpanded, toggleExpanded, variant } = useTool();\n\n const isCompact = variant === 'compact';\n const status = toolInvocation.state === 'result' ? 'success' : 'pending';\n const formattedName = formatToolName(toolInvocation.toolName);\n\n // Get icon based on tool name - use ActionIcon component which handles the mapping\n const toolIcon = icon;\n\n // In compact mode, disable expand/collapse\n const canToggle = showToggle && !isCompact;\n\n return (\n <button\n onClick={canToggle ? toggleExpanded : undefined}\n className={cn(\n 'ash-tool-header',\n 'w-full flex items-center gap-2',\n isCompact ? 'px-2 py-1.5' : 'px-3 py-2',\n 'text-left',\n canToggle && 'cursor-pointer hover:bg-white/[0.03] transition-colors',\n !canToggle && 'cursor-default',\n className\n )}\n >\n {/* Status indicator */}\n <StatusIndicator status={status} size={isCompact ? 'xs' : 'sm'} />\n\n {/* Icon */}\n {toolIcon ? (\n <span className=\"text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\">\n {toolIcon}\n </span>\n ) : (\n <span className=\"text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\">\n <svg className={isCompact ? 'w-3 h-3' : 'w-4 h-4'} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </span>\n )}\n\n {/* Tool name */}\n <span\n className={cn(\n 'flex-1 font-medium',\n isCompact ? 'text-[var(--ash-font-size-xs,10px)]' : 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]'\n )}\n >\n {formattedName}\n </span>\n\n {/* Summary/args preview */}\n <span\n className={cn(\n isCompact ? 'text-[9px]' : 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'truncate max-w-[200px]'\n )}\n >\n {Object.keys(toolInvocation.args).length > 0 &&\n `(${Object.keys(toolInvocation.args).join(', ')})`}\n </span>\n\n {/* Expand/collapse icon - hidden in compact mode */}\n {canToggle && (\n <svg\n className={cn(\n 'w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'transition-transform',\n isExpanded && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n )}\n </button>\n );\n}\n\n// ============================================================================\n// ToolInput\n// ============================================================================\n\nexport interface ToolInputProps {\n /** Additional class name */\n className?: string;\n /** Maximum height before scroll */\n maxHeight?: number;\n}\n\nexport function ToolInput({ className, maxHeight = 200 }: ToolInputProps) {\n const { toolInvocation } = useTool();\n\n if (!toolInvocation.args || Object.keys(toolInvocation.args).length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'ash-tool-input',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n className\n )}\n >\n <div className=\"ash-tool-section-header\">Input</div>\n <div\n className=\"p-3 overflow-auto\"\n style={{ maxHeight }}\n >\n <JsonDisplay value={toolInvocation.args} />\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// ToolOutput\n// ============================================================================\n\nexport interface ToolOutputProps {\n /** Additional class name */\n className?: string;\n /** Maximum height before scroll */\n maxHeight?: number;\n}\n\nexport function ToolOutput({ className, maxHeight = 300 }: ToolOutputProps) {\n const { toolInvocation } = useTool();\n\n if (toolInvocation.state !== 'result' || !toolInvocation.result) {\n return null;\n }\n\n const result = toolInvocation.result;\n const isString = typeof result === 'string';\n const isError = typeof result === 'object' && result !== null &&\n 'error' in (result as Record<string, unknown>);\n\n return (\n <div\n className={cn(\n 'ash-tool-output',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n isError && 'bg-red-500/5',\n className\n )}\n >\n <div\n className={cn(\n 'ash-tool-section-header',\n isError && 'text-red-400'\n )}\n >\n {isError ? 'Error' : 'Output'}\n </div>\n <div\n className=\"p-3 overflow-auto\"\n style={{ maxHeight }}\n >\n {isString ? (\n <CodeBlock maxHeight={maxHeight - 24}>\n {result}\n </CodeBlock>\n ) : (\n <JsonDisplay value={result} />\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// ToolList\n// ============================================================================\n\nexport interface ToolListProps {\n /** Tool invocations to render */\n toolInvocations: ToolInvocation[];\n /** Additional class name */\n className?: string;\n /** Whether to show tools expanded by default */\n defaultExpanded?: boolean;\n /** Display variant: 'default' or 'compact' */\n variant?: ToolVariant;\n}\n\nexport function ToolList({\n toolInvocations,\n className,\n defaultExpanded = false,\n variant = 'default',\n}: ToolListProps) {\n if (!toolInvocations || toolInvocations.length === 0) {\n return null;\n }\n\n const isCompact = variant === 'compact';\n\n return (\n <div\n className={cn(\n 'ash-tool-list',\n 'flex flex-col',\n isCompact ? 'gap-1' : 'gap-2',\n className\n )}\n >\n {toolInvocations.map((inv) => (\n <Tool\n key={inv.toolCallId}\n toolInvocation={inv}\n defaultExpanded={defaultExpanded}\n variant={variant}\n />\n ))}\n </div>\n );\n}\n","/**\n * Reasoning - AI SDK Elements compatible reasoning/thinking display\n *\n * Displays chain-of-thought reasoning in a collapsible panel.\n * Auto-expands during streaming and collapses when complete.\n *\n * @example\n * ```tsx\n * import { Reasoning, ReasoningContent, ReasoningTrigger } from '@ash-cloud/ash-ui';\n *\n * <Reasoning isStreaming={isStreaming}>\n * <ReasoningTrigger />\n * <ReasoningContent>{reasoning}</ReasoningContent>\n * </Reasoning>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ReasoningContextValue {\n /** Whether the reasoning panel is open */\n isOpen: boolean;\n /** Toggle open state */\n setIsOpen: (value: boolean) => void;\n /** Whether reasoning is currently streaming */\n isStreaming: boolean;\n /** Duration of thinking in seconds */\n duration: number;\n}\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nexport function useReasoning(): ReasoningContextValue {\n const context = useContext(ReasoningContext);\n if (!context) {\n throw new Error('useReasoning must be used within a Reasoning');\n }\n return context;\n}\n\n// ============================================================================\n// Reasoning\n// ============================================================================\n\nexport interface ReasoningProps {\n /** Child elements */\n children: ReactNode;\n /** Whether reasoning is currently streaming */\n isStreaming?: boolean;\n /** Additional class name */\n className?: string;\n /** Whether to auto-expand during streaming */\n autoExpand?: boolean;\n /** Whether to auto-collapse when streaming completes */\n autoCollapse?: boolean;\n /** Initial duration in seconds (for loaded content) */\n initialDuration?: number;\n}\n\nexport function Reasoning({\n children,\n isStreaming = false,\n className,\n autoExpand = true,\n autoCollapse = true,\n initialDuration = 0,\n}: ReasoningProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [duration, setDuration] = useState(initialDuration);\n const startTimeRef = useRef<number | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Auto-expand when streaming starts\n useEffect(() => {\n if (isStreaming && autoExpand) {\n setIsOpen(true);\n startTimeRef.current = Date.now();\n\n // Start duration timer\n intervalRef.current = setInterval(() => {\n if (startTimeRef.current) {\n setDuration(Math.floor((Date.now() - startTimeRef.current) / 1000));\n }\n }, 1000);\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [isStreaming, autoExpand]);\n\n // Auto-collapse when streaming completes\n useEffect(() => {\n if (!isStreaming && autoCollapse && startTimeRef.current) {\n // Small delay before collapsing for better UX\n const timeout = setTimeout(() => {\n setIsOpen(false);\n }, 500);\n\n startTimeRef.current = null;\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n\n return () => clearTimeout(timeout);\n }\n return undefined;\n }, [isStreaming, autoCollapse]);\n\n const contextValue: ReasoningContextValue = {\n isOpen,\n setIsOpen,\n isStreaming,\n duration,\n };\n\n return (\n <ReasoningContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-reasoning',\n 'rounded-[var(--ash-radius-md,0.5rem)]',\n 'border',\n isStreaming\n ? 'border-[var(--ash-thinking-border,rgba(147,51,234,0.2))] bg-[var(--ash-thinking-bg,rgba(147,51,234,0.06))]'\n : 'border-[var(--ash-border,rgba(255,255,255,0.08))] bg-[var(--ash-surface-dark,#0a0a0a)]',\n 'overflow-hidden',\n className\n )}\n data-reasoning-streaming={isStreaming}\n data-reasoning-open={isOpen}\n >\n {children}\n </div>\n </ReasoningContext.Provider>\n );\n}\n\n// ============================================================================\n// ReasoningTrigger\n// ============================================================================\n\nexport interface ReasoningTriggerProps {\n /** Additional class name */\n className?: string;\n /** Custom label */\n label?: string;\n /** Show duration */\n showDuration?: boolean;\n}\n\nexport function ReasoningTrigger({\n className,\n label = 'Thinking',\n showDuration = true,\n}: ReasoningTriggerProps) {\n const { isOpen, setIsOpen, isStreaming, duration } = useReasoning();\n\n const formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n };\n\n return (\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'ash-reasoning-trigger',\n 'w-full flex items-center gap-2',\n 'px-3 py-2',\n 'text-left',\n 'cursor-pointer hover:bg-white/[0.03] transition-colors',\n className\n )}\n >\n {/* Thinking icon with animation */}\n <span\n className={cn(\n 'w-4 h-4 flex items-center justify-center',\n isStreaming && 'animate-pulse'\n )}\n >\n {isStreaming ? (\n <svg\n className=\"w-4 h-4 text-purple-400 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\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 <svg\n className=\"w-4 h-4 text-purple-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n />\n </svg>\n )}\n </span>\n\n {/* Label */}\n <span\n className={cn(\n 'flex-1 font-medium',\n 'text-[var(--ash-font-size-sm,12px)]',\n isStreaming\n ? 'text-[var(--ash-thinking-text,rgb(196,181,253))]'\n : 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]'\n )}\n >\n {label}\n {isStreaming && '...'}\n </span>\n\n {/* Duration */}\n {showDuration && duration > 0 && (\n <span\n className={cn(\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]'\n )}\n >\n {formatDuration(duration)}\n </span>\n )}\n\n {/* Expand/collapse icon */}\n <svg\n className={cn(\n 'w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'transition-transform',\n isOpen && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n );\n}\n\n// ============================================================================\n// ReasoningContent\n// ============================================================================\n\nexport interface ReasoningContentProps {\n /** Content to display (thinking text) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n /** Maximum height before scroll */\n maxHeight?: number;\n}\n\nexport function ReasoningContent({\n children,\n className,\n maxHeight = 300,\n}: ReasoningContentProps) {\n const { isOpen, isStreaming } = useReasoning();\n\n if (!isOpen) return null;\n\n return (\n <div\n className={cn(\n 'ash-reasoning-content',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n 'ash-accordion-content',\n className\n )}\n >\n <div\n className={cn(\n 'p-3 overflow-auto',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]',\n 'whitespace-pre-wrap font-mono',\n isStreaming && 'animate-pulse'\n )}\n style={{ maxHeight }}\n >\n {children}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Standalone ThinkingIndicator\n// ============================================================================\n\nexport interface ThinkingIndicatorProps {\n /** Whether thinking is active */\n isActive?: boolean;\n /** Label to display */\n label?: string;\n /** Additional class name */\n className?: string;\n}\n\nexport function ThinkingIndicator({\n isActive = true,\n label = 'Thinking',\n className,\n}: ThinkingIndicatorProps) {\n if (!isActive) return null;\n\n return (\n <div\n className={cn(\n 'ash-thinking-indicator',\n 'flex items-center gap-2',\n 'px-3 py-2',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-thinking-text,rgb(196,181,253))]',\n className\n )}\n >\n <span className=\"flex gap-1\">\n <span className=\"w-1.5 h-1.5 bg-current rounded-full animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 bg-current rounded-full animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 bg-current rounded-full animate-bounce\" style={{ animationDelay: '300ms' }} />\n </span>\n <span>{label}</span>\n </div>\n );\n}\n","/**\n * Task - AI SDK Elements compatible task list display\n *\n * Displays a list of tasks with status indicators and progress tracking.\n * Compatible with TodoPanel but with the Elements API style.\n *\n * @example\n * ```tsx\n * import { Task, TaskTrigger, TaskContent, TaskItem } from '@ash-cloud/ash-ui';\n *\n * <Task defaultOpen>\n * <TaskTrigger>Tasks (3/5)</TaskTrigger>\n * <TaskContent>\n * <TaskItem status=\"completed\">Setup project</TaskItem>\n * <TaskItem status=\"in_progress\">Implement feature</TaskItem>\n * <TaskItem status=\"pending\">Write tests</TaskItem>\n * </TaskContent>\n * </Task>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils';\nimport type { TodoItem, TodoStatus } from '../types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface TaskContextValue {\n /** Whether the task list is open */\n isOpen: boolean;\n /** Toggle open state */\n setIsOpen: (value: boolean) => void;\n}\n\nconst TaskContext = createContext<TaskContextValue | null>(null);\n\nexport function useTask(): TaskContextValue {\n const context = useContext(TaskContext);\n if (!context) {\n throw new Error('useTask must be used within a Task');\n }\n return context;\n}\n\n// ============================================================================\n// Task\n// ============================================================================\n\nexport interface TaskProps {\n /** Child elements */\n children: ReactNode;\n /** Whether to start open */\n defaultOpen?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nexport function Task({\n children,\n defaultOpen = false,\n className,\n}: TaskProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const contextValue: TaskContextValue = {\n isOpen,\n setIsOpen,\n };\n\n return (\n <TaskContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-task',\n 'rounded-[var(--ash-radius-md,0.5rem)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'bg-[var(--ash-surface-dark,#0a0a0a)]',\n 'overflow-hidden',\n className\n )}\n >\n {children}\n </div>\n </TaskContext.Provider>\n );\n}\n\n// ============================================================================\n// TaskTrigger\n// ============================================================================\n\nexport interface TaskTriggerProps {\n /** Trigger content (usually task count/label) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function TaskTrigger({ children, className }: TaskTriggerProps) {\n const { isOpen, setIsOpen } = useTask();\n\n return (\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'ash-task-trigger',\n 'w-full flex items-center gap-2',\n 'px-3 py-2',\n 'text-left',\n 'cursor-pointer hover:bg-white/[0.03] transition-colors',\n className\n )}\n >\n {/* Task list icon */}\n <svg\n className=\"w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"\n />\n </svg>\n\n {/* Content */}\n <span\n className={cn(\n 'flex-1 font-medium',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]'\n )}\n >\n {children}\n </span>\n\n {/* Expand/collapse icon */}\n <svg\n className={cn(\n 'w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'transition-transform',\n isOpen && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n );\n}\n\n// ============================================================================\n// TaskContent\n// ============================================================================\n\nexport interface TaskContentProps {\n /** Child elements (TaskItem components) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function TaskContent({ children, className }: TaskContentProps) {\n const { isOpen } = useTask();\n\n if (!isOpen) return null;\n\n return (\n <div\n className={cn(\n 'ash-task-content',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n 'ash-accordion-content',\n className\n )}\n >\n <div className=\"p-2 space-y-1\">\n {children}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// TaskItem\n// ============================================================================\n\nexport interface TaskItemProps {\n /** Task content */\n children: ReactNode;\n /** Task status */\n status: TodoStatus;\n /** Active form (shown when in_progress) */\n activeForm?: string;\n /** Additional class name */\n className?: string;\n}\n\nexport function TaskItem({\n children,\n status,\n activeForm,\n className,\n}: TaskItemProps) {\n const statusIcons: Record<TodoStatus, ReactNode> = {\n pending: (\n <svg\n className=\"w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeWidth={2} />\n </svg>\n ),\n in_progress: (\n <svg\n className=\"w-4 h-4 text-yellow-400 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\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 completed: (\n <svg\n className=\"w-4 h-4 text-[var(--ash-accent,#ccff00)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ),\n };\n\n const statusColors: Record<TodoStatus, string> = {\n pending: 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n in_progress: 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]',\n completed: 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))] line-through',\n };\n\n return (\n <div\n className={cn(\n 'ash-task-item',\n 'flex items-center gap-2',\n 'px-2 py-1.5 rounded-md',\n status === 'in_progress' && 'bg-yellow-400/10',\n className\n )}\n data-task-status={status}\n >\n {/* Status icon */}\n {statusIcons[status]}\n\n {/* Content */}\n <span\n className={cn(\n 'flex-1',\n 'text-[var(--ash-font-size-sm,12px)]',\n statusColors[status]\n )}\n >\n {status === 'in_progress' && activeForm ? activeForm : children}\n </span>\n </div>\n );\n}\n\n// ============================================================================\n// TaskList (convenience component)\n// ============================================================================\n\nexport interface TaskListProps {\n /** Todo items to display */\n items: TodoItem[];\n /** Whether to start open */\n defaultOpen?: boolean;\n /** Additional class name */\n className?: string;\n /** Custom title */\n title?: string;\n}\n\nexport function TaskList({\n items,\n defaultOpen = true,\n className,\n title,\n}: TaskListProps) {\n const completed = items.filter((t) => t.status === 'completed').length;\n const total = items.length;\n const displayTitle = title || `Tasks (${completed}/${total})`;\n\n return (\n <Task defaultOpen={defaultOpen} className={className}>\n <TaskTrigger>{displayTitle}</TaskTrigger>\n <TaskContent>\n {items.map((item, index) => (\n <TaskItem\n key={index}\n status={item.status}\n activeForm={item.activeForm}\n >\n {item.content}\n </TaskItem>\n ))}\n </TaskContent>\n </Task>\n );\n}\n","/**\n * Attachments - AI SDK Elements compatible file attachment display\n *\n * Displays file attachments in grid, inline, or list layouts.\n *\n * @example\n * ```tsx\n * import { Attachments, Attachment, AttachmentPreview } from '@ash-cloud/ash-ui';\n *\n * <Attachments layout=\"grid\">\n * {files.map((file) => (\n * <Attachment key={file.name} file={file}>\n * <AttachmentPreview />\n * </Attachment>\n * ))}\n * </Attachments>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\nimport { cn, formatFileSize } from '../utils';\nimport type { FileAttachment } from '../types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface AttachmentContextValue {\n /** The file attachment data */\n file: FileAttachment | AttachmentFile;\n /** Whether the attachment can be removed */\n removable?: boolean;\n /** Remove callback */\n onRemove?: () => void;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue | null>(null);\n\nexport function useAttachment(): AttachmentContextValue {\n const context = useContext(AttachmentContext);\n if (!context) {\n throw new Error('useAttachment must be used within an Attachment');\n }\n return context;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AttachmentFile {\n /** File name */\n name: string;\n /** MIME type */\n type: string;\n /** File size in bytes */\n size: number;\n /** URL or data URL for preview */\n url?: string;\n /** Base64 data (for upload) */\n base64?: string;\n}\n\n// ============================================================================\n// Attachments Container\n// ============================================================================\n\nexport interface AttachmentsProps {\n /** Child elements (Attachment components) */\n children: ReactNode;\n /** Layout style */\n layout?: 'grid' | 'inline' | 'list';\n /** Additional class name */\n className?: string;\n}\n\nexport function Attachments({\n children,\n layout = 'inline',\n className,\n}: AttachmentsProps) {\n const layoutStyles: Record<string, string> = {\n grid: 'grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2',\n inline: 'flex flex-wrap gap-2',\n list: 'flex flex-col gap-1',\n };\n\n return (\n <div\n className={cn(\n 'ash-attachments',\n layoutStyles[layout],\n className\n )}\n data-layout={layout}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// Attachment\n// ============================================================================\n\nexport interface AttachmentProps {\n /** File data */\n file: FileAttachment | AttachmentFile;\n /** Child elements (AttachmentPreview, etc.) */\n children?: ReactNode;\n /** Whether the attachment can be removed */\n removable?: boolean;\n /** Remove callback */\n onRemove?: () => void;\n /** Additional class name */\n className?: string;\n}\n\nexport function Attachment({\n file,\n children,\n removable = false,\n onRemove,\n className,\n}: AttachmentProps) {\n const contextValue: AttachmentContextValue = {\n file,\n removable,\n onRemove,\n };\n\n return (\n <AttachmentContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-attachment relative group',\n 'rounded-[var(--ash-radius-sm,0.375rem)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'bg-[var(--ash-surface-elevated,#111111)]',\n 'overflow-hidden',\n 'hover:border-[var(--ash-border-emphasis,rgba(255,255,255,0.15))]',\n 'transition-colors',\n className\n )}\n data-file-type={file.type}\n >\n {children || (\n <>\n <AttachmentPreview />\n <AttachmentInfo />\n {removable && <AttachmentRemove />}\n </>\n )}\n </div>\n </AttachmentContext.Provider>\n );\n}\n\n// ============================================================================\n// AttachmentPreview\n// ============================================================================\n\nexport interface AttachmentPreviewProps {\n /** Additional class name */\n className?: string;\n /** Preview height */\n height?: number;\n}\n\nexport function AttachmentPreview({\n className,\n height = 80,\n}: AttachmentPreviewProps) {\n const { file } = useAttachment();\n\n const isImage = file.type.startsWith('image/');\n const url = 'url' in file ? file.url : ('base64' in file ? `data:${file.type};base64,${file.base64}` : undefined);\n\n if (isImage && url) {\n return (\n <div\n className={cn(\n 'ash-attachment-preview',\n 'w-full bg-black/20 overflow-hidden',\n className\n )}\n style={{ height }}\n >\n <img\n src={url}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n );\n }\n\n // Generic file icon\n const iconForType = (): ReactNode => {\n if (file.type.includes('pdf')) {\n return (\n <svg className=\"w-8 h-8\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n <text x=\"7\" y=\"16\" fontSize=\"6\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">PDF</text>\n </svg>\n );\n }\n if (file.type.includes('text') || file.type.includes('json')) {\n return (\n <svg className=\"w-8 h-8\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} 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 </svg>\n );\n }\n return (\n <svg className=\"w-8 h-8\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n );\n };\n\n return (\n <div\n className={cn(\n 'ash-attachment-preview',\n 'w-full flex items-center justify-center',\n 'bg-[var(--ash-surface-dark,#0a0a0a)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n className\n )}\n style={{ height }}\n >\n {iconForType()}\n </div>\n );\n}\n\n// ============================================================================\n// AttachmentInfo\n// ============================================================================\n\nexport interface AttachmentInfoProps {\n /** Additional class name */\n className?: string;\n /** Show file size */\n showSize?: boolean;\n}\n\nexport function AttachmentInfo({\n className,\n showSize = true,\n}: AttachmentInfoProps) {\n const { file } = useAttachment();\n\n return (\n <div\n className={cn(\n 'ash-attachment-info',\n 'px-2 py-1.5',\n 'truncate',\n className\n )}\n >\n <div\n className={cn(\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]',\n 'truncate font-medium'\n )}\n title={file.name}\n >\n {file.name}\n </div>\n {showSize && (\n <div\n className={cn(\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]'\n )}\n >\n {formatFileSize(file.size)}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// AttachmentRemove\n// ============================================================================\n\nexport interface AttachmentRemoveProps {\n /** Additional class name */\n className?: string;\n}\n\nexport function AttachmentRemove({ className }: AttachmentRemoveProps) {\n const { onRemove, removable } = useAttachment();\n\n if (!removable || !onRemove) return null;\n\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className={cn(\n 'ash-attachment-remove',\n 'absolute top-1 right-1',\n 'w-5 h-5 rounded-full',\n 'flex items-center justify-center',\n 'bg-black/60 text-white/80',\n 'hover:bg-black/80 hover:text-white',\n 'opacity-0 group-hover:opacity-100',\n 'transition-opacity',\n className\n )}\n aria-label=\"Remove attachment\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n );\n}\n\n// ============================================================================\n// Compact FileBadge (for inline display)\n// ============================================================================\n\nexport interface FileBadgeProps {\n /** File data */\n file: FileAttachment | AttachmentFile;\n /** Whether the file can be removed */\n removable?: boolean;\n /** Remove callback */\n onRemove?: () => void;\n /** Additional class name */\n className?: string;\n}\n\nexport function FileBadgeCompact({\n file,\n removable = false,\n onRemove,\n className,\n}: FileBadgeProps) {\n const isImage = file.type.startsWith('image/');\n\n return (\n <div\n className={cn(\n 'ash-file-badge group inline-flex items-center gap-1.5',\n 'px-2 py-1 rounded-md',\n 'bg-[var(--ash-surface-elevated,#111111)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'text-[var(--ash-font-size-xs,10px)]',\n className\n )}\n >\n {/* Icon */}\n {isImage ? (\n <svg className=\"w-3 h-3 text-[var(--ash-text-muted)]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-[var(--ash-text-muted)]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n )}\n\n {/* Name */}\n <span className=\"text-[var(--ash-text-primary)] truncate max-w-[100px]\">\n {file.name}\n </span>\n\n {/* Size */}\n <span className=\"text-[var(--ash-text-muted)]\">\n {formatFileSize(file.size)}\n </span>\n\n {/* Remove button */}\n {removable && onRemove && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className={cn(\n 'ml-0.5 text-[var(--ash-text-muted)]',\n 'hover:text-red-400 transition-colors',\n 'opacity-0 group-hover:opacity-100'\n )}\n aria-label=\"Remove\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","/**\n * Shimmer - AI SDK Elements compatible loading indicator\n *\n * Provides various loading state displays including shimmer effects\n * and animated indicators.\n *\n * @example\n * ```tsx\n * import { Shimmer, ShimmerLine, ShimmerBlock } from '@ash-cloud/ash-ui';\n *\n * <Shimmer>\n * <ShimmerLine width=\"80%\" />\n * <ShimmerLine width=\"60%\" />\n * <ShimmerBlock height={100} />\n * </Shimmer>\n * ```\n */\n\nimport { type ReactNode } from 'react';\nimport { cn } from '../utils';\n\n// ============================================================================\n// Shimmer Container\n// ============================================================================\n\nexport interface ShimmerProps {\n /** Child elements */\n children?: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether shimmer is active */\n isActive?: boolean;\n}\n\nexport function Shimmer({\n children,\n className,\n isActive = true,\n}: ShimmerProps) {\n if (!isActive) return null;\n\n return (\n <div\n className={cn(\n 'ash-shimmer',\n 'flex flex-col gap-2',\n className\n )}\n role=\"status\"\n aria-label=\"Loading\"\n >\n {children || (\n <>\n <ShimmerLine width=\"100%\" />\n <ShimmerLine width=\"80%\" />\n <ShimmerLine width=\"60%\" />\n </>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// ShimmerLine\n// ============================================================================\n\nexport interface ShimmerLineProps {\n /** Width (CSS value or percentage) */\n width?: string | number;\n /** Height in pixels */\n height?: number;\n /** Additional class name */\n className?: string;\n}\n\nexport function ShimmerLine({\n width = '100%',\n height = 16,\n className,\n}: ShimmerLineProps) {\n return (\n <div\n className={cn(\n 'ash-shimmer-line',\n 'rounded-md',\n 'bg-gradient-to-r from-white/5 via-white/10 to-white/5',\n 'bg-[length:200%_100%]',\n 'animate-[shimmer_1.5s_ease-in-out_infinite]',\n className\n )}\n style={{\n width: typeof width === 'number' ? `${width}px` : width,\n height,\n }}\n />\n );\n}\n\n// ============================================================================\n// ShimmerBlock\n// ============================================================================\n\nexport interface ShimmerBlockProps {\n /** Width (CSS value or percentage) */\n width?: string | number;\n /** Height in pixels */\n height?: number;\n /** Border radius */\n rounded?: 'sm' | 'md' | 'lg' | 'full' | 'none';\n /** Additional class name */\n className?: string;\n}\n\nexport function ShimmerBlock({\n width = '100%',\n height = 100,\n rounded = 'md',\n className,\n}: ShimmerBlockProps) {\n const roundedStyles: Record<string, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n };\n\n return (\n <div\n className={cn(\n 'ash-shimmer-block',\n roundedStyles[rounded],\n 'bg-gradient-to-r from-white/5 via-white/10 to-white/5',\n 'bg-[length:200%_100%]',\n 'animate-[shimmer_1.5s_ease-in-out_infinite]',\n className\n )}\n style={{\n width: typeof width === 'number' ? `${width}px` : width,\n height,\n }}\n />\n );\n}\n\n// ============================================================================\n// ShimmerText (inline shimmer for text placeholders)\n// ============================================================================\n\nexport interface ShimmerTextProps {\n /** Number of characters to approximate width */\n chars?: number;\n /** Additional class name */\n className?: string;\n}\n\nexport function ShimmerText({\n chars = 20,\n className,\n}: ShimmerTextProps) {\n return (\n <span\n className={cn(\n 'ash-shimmer-text inline-block',\n 'rounded',\n 'bg-gradient-to-r from-white/5 via-white/10 to-white/5',\n 'bg-[length:200%_100%]',\n 'animate-[shimmer_1.5s_ease-in-out_infinite]',\n className\n )}\n style={{\n width: `${chars}ch`,\n height: '1em',\n verticalAlign: 'middle',\n }}\n />\n );\n}\n\n// ============================================================================\n// LoadingDots\n// ============================================================================\n\nexport interface LoadingDotsProps {\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional class name */\n className?: string;\n}\n\nexport function LoadingDots({\n size = 'md',\n className,\n}: LoadingDotsProps) {\n const sizeStyles: Record<string, string> = {\n sm: 'w-1 h-1',\n md: 'w-1.5 h-1.5',\n lg: 'w-2 h-2',\n };\n\n const gapStyles: Record<string, string> = {\n sm: 'gap-0.5',\n md: 'gap-1',\n lg: 'gap-1.5',\n };\n\n return (\n <span\n className={cn(\n 'ash-loading-dots inline-flex items-center',\n gapStyles[size],\n className\n )}\n role=\"status\"\n aria-label=\"Loading\"\n >\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={cn(\n sizeStyles[size],\n 'rounded-full',\n 'bg-current',\n 'animate-bounce'\n )}\n style={{ animationDelay: `${i * 150}ms` }}\n />\n ))}\n </span>\n );\n}\n\n// ============================================================================\n// LoadingSpinner\n// ============================================================================\n\nexport interface LoadingSpinnerProps {\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional class name */\n className?: string;\n}\n\nexport function LoadingSpinner({\n size = 'md',\n className,\n}: LoadingSpinnerProps) {\n const sizeStyles: Record<string, string> = {\n sm: 'w-4 h-4',\n md: 'w-6 h-6',\n lg: 'w-8 h-8',\n };\n\n return (\n <svg\n className={cn(\n 'ash-loading-spinner animate-spin',\n sizeStyles[size],\n className\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n role=\"status\"\n aria-label=\"Loading\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\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// ============================================================================\n// MessageShimmer (pre-built message loading state)\n// ============================================================================\n\nexport interface MessageShimmerProps {\n /** Message role to style appropriately */\n role?: 'user' | 'assistant';\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageShimmer({\n role = 'assistant',\n className,\n}: MessageShimmerProps) {\n return (\n <div\n className={cn(\n 'ash-message-shimmer flex gap-2',\n role === 'user' && 'flex-row-reverse',\n className\n )}\n >\n {/* Avatar shimmer */}\n <ShimmerBlock\n width={20}\n height={20}\n rounded=\"full\"\n />\n\n {/* Content shimmer */}\n <div className=\"flex-1 space-y-2 max-w-[80%]\">\n <ShimmerLine width=\"100%\" height={14} />\n <ShimmerLine width=\"85%\" height={14} />\n <ShimmerLine width=\"70%\" height={14} />\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { LogEntry, LogLevel, LogCategory } from '../types';\nimport { cn, formatTimestamp } from '../utils';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n InfoIcon,\n AlertTriangleIcon,\n AlertCircleIcon,\n BugIcon,\n TerminalIcon,\n} from '../icons';\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction getLevelIcon(level: LogLevel) {\n switch (level) {\n case 'info':\n return <InfoIcon className=\"w-3.5 h-3.5\" />;\n case 'warn':\n return <AlertTriangleIcon className=\"w-3.5 h-3.5\" />;\n case 'error':\n return <AlertCircleIcon className=\"w-3.5 h-3.5\" />;\n case 'debug':\n return <BugIcon className=\"w-3.5 h-3.5\" />;\n }\n}\n\nfunction getLevelColor(level: LogLevel) {\n switch (level) {\n case 'info':\n return 'text-blue-400';\n case 'warn':\n return 'text-yellow-500';\n case 'error':\n return 'text-red-400';\n case 'debug':\n return 'text-white/50';\n }\n}\n\nfunction getLevelBgColor(level: LogLevel) {\n switch (level) {\n case 'info':\n return 'bg-blue-900/20';\n case 'warn':\n return 'bg-yellow-900/20';\n case 'error':\n return 'bg-red-900/20';\n case 'debug':\n return 'bg-white/5';\n }\n}\n\nfunction getCategoryLabel(category: LogCategory) {\n switch (category) {\n case 'setup':\n return 'Setup';\n case 'skills':\n return 'Skills';\n case 'execution':\n return 'Execution';\n case 'process':\n return 'Process';\n case 'startup':\n return 'Startup';\n }\n}\n\n// =============================================================================\n// Log Entry Component\n// =============================================================================\n\ninterface LogEntryRowProps {\n log: LogEntry;\n}\n\nfunction LogEntryRow({ log }: LogEntryRowProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasData = log.data && Object.keys(log.data).length > 0;\n\n return (\n <div\n className={cn(\n 'px-3 py-2 border-b border-white/10 last:border-b-0',\n getLevelBgColor(log.level)\n )}\n >\n <div\n className={cn('flex items-start gap-2', hasData && 'cursor-pointer')}\n onClick={() => hasData && setIsExpanded(!isExpanded)}\n >\n {/* Expand indicator */}\n <div className=\"w-4 flex-shrink-0 pt-0.5\">\n {hasData &&\n (isExpanded ? (\n <ChevronDownIcon className=\"w-3 h-3 text-white/40\" />\n ) : (\n <ChevronRightIcon className=\"w-3 h-3 text-white/40\" />\n ))}\n </div>\n\n {/* Level icon */}\n <div className={cn('flex-shrink-0 pt-0.5', getLevelColor(log.level))}>\n {getLevelIcon(log.level)}\n </div>\n\n {/* Timestamp */}\n <span className=\"text-xs text-white/40 font-mono flex-shrink-0 pt-0.5\">\n {formatTimestamp(log.timestamp)}\n </span>\n\n {/* Category badge */}\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-white/10 text-white/70 font-medium flex-shrink-0\">\n {getCategoryLabel(log.category)}\n </span>\n\n {/* Message */}\n <span className=\"text-sm text-white/80 flex-1 break-words\">\n {log.message}\n </span>\n </div>\n\n {/* Expanded data */}\n {isExpanded && hasData && (\n <div className=\"mt-2 ml-6 pl-4 border-l-2 border-white/20\">\n <pre className=\"text-xs text-white/50 font-mono whitespace-pre-wrap overflow-x-auto\">\n {JSON.stringify(log.data, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// LogsPanel Component\n// =============================================================================\n\nexport interface LogsPanelProps {\n logs: LogEntry[];\n title?: string;\n isLoading?: boolean;\n defaultCollapsed?: boolean;\n maxHeight?: number;\n className?: string;\n}\n\n/**\n * LogsPanel - Collapsible panel for displaying log entries\n *\n * Features:\n * - Collapsible header with log count\n * - Error/warning count badges\n * - Level-based coloring and icons\n * - Expandable entries with JSON data\n *\n * @example\n * ```tsx\n * <LogsPanel logs={logEntries} />\n * <LogsPanel logs={logs} title=\"Execution Logs\" defaultCollapsed={false} />\n * ```\n */\nexport function LogsPanel({\n logs,\n title = 'Logs',\n isLoading,\n defaultCollapsed = true,\n maxHeight = 256,\n className,\n}: LogsPanelProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const errorCount = logs.filter((l) => l.level === 'error').length;\n const warnCount = logs.filter((l) => l.level === 'warn').length;\n\n if (logs.length === 0 && !isLoading) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'border-t border-white/10 bg-[var(--ash-surface-dark,#0a0a0a)]',\n className\n )}\n >\n {/* Header */}\n <button\n onClick={() => setIsCollapsed(!isCollapsed)}\n className=\"w-full flex items-center justify-between px-4 py-2 hover:bg-white/5 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <TerminalIcon className=\"w-4 h-4 text-white/50\" />\n <span className=\"text-sm font-medium text-white/80\">{title}</span>\n <span className=\"text-xs text-white/40\">({logs.length})</span>\n {errorCount > 0 && (\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-red-900/50 text-red-400 font-medium\">\n {errorCount} error{errorCount > 1 ? 's' : ''}\n </span>\n )}\n {warnCount > 0 && (\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-yellow-900/50 text-yellow-400 font-medium\">\n {warnCount} warning{warnCount > 1 ? 's' : ''}\n </span>\n )}\n {isLoading && (\n <span className=\"text-xs text-white/40 animate-pulse\">\n Loading...\n </span>\n )}\n </div>\n {isCollapsed ? (\n <ChevronRightIcon className=\"w-4 h-4 text-white/40\" />\n ) : (\n <ChevronDownIcon className=\"w-4 h-4 text-white/40\" />\n )}\n </button>\n\n {/* Log entries */}\n {!isCollapsed && (\n <div\n className=\"overflow-y-auto border-t border-white/10\"\n style={{ maxHeight }}\n >\n {logs.length === 0 ? (\n <div className=\"px-4 py-6 text-center text-sm text-white/50\">\n No logs yet\n </div>\n ) : (\n logs.map((log, index) => (\n <LogEntryRow key={`${log.timestamp}-${index}`} log={log} />\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default LogsPanel;\n","'use client';\n\nimport { useState, useCallback, type KeyboardEvent } from 'react';\nimport { cn } from '../utils';\n\nexport interface EnvVarsPanelProps {\n /** Current environment variables */\n envVars: Record<string, string>;\n /** Callback when environment variables change */\n onChange: (envVars: Record<string, string>) => void;\n /** Whether the panel is collapsed initially (default: true) */\n defaultCollapsed?: boolean;\n /** Additional class name */\n className?: string;\n /** Label for the panel header */\n label?: string;\n /** Helper text shown below the input */\n helperText?: string;\n}\n\n/**\n * EnvVarsPanel - Collapsible panel for managing environment variables\n *\n * Provides a UI for adding, viewing, and removing environment variables.\n * Commonly used to set environment variables for sandbox/agent execution.\n *\n * @example\n * ```tsx\n * function ChatSettings() {\n * const [envVars, setEnvVars] = useState<Record<string, string>>({});\n *\n * return (\n * <EnvVarsPanel\n * envVars={envVars}\n * onChange={setEnvVars}\n * helperText=\"These variables will be available in the sandbox.\"\n * />\n * );\n * }\n * ```\n */\nexport function EnvVarsPanel({\n envVars,\n onChange,\n defaultCollapsed = true,\n className,\n label = 'Environment Variables',\n helperText = 'These environment variables will be available in the sandbox for new sessions.',\n}: EnvVarsPanelProps) {\n const [expanded, setExpanded] = useState(!defaultCollapsed);\n const [newEnvKey, setNewEnvKey] = useState('');\n const [newEnvValue, setNewEnvValue] = useState('');\n\n const hasEnvVars = Object.keys(envVars).length > 0;\n\n const handleAddEnvVar = useCallback(() => {\n const key = newEnvKey.trim();\n const val = newEnvValue.trim();\n if (key) {\n onChange({ ...envVars, [key]: val });\n setNewEnvKey('');\n setNewEnvValue('');\n }\n }, [envVars, newEnvKey, newEnvValue, onChange]);\n\n const handleRemoveEnvVar = useCallback(\n (key: string) => {\n const newEnvVars = { ...envVars };\n delete newEnvVars[key];\n onChange(newEnvVars);\n },\n [envVars, onChange]\n );\n\n const handleEnvKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddEnvVar();\n }\n },\n [handleAddEnvVar]\n );\n\n return (\n <div className={cn('ash-env-vars-panel', className)}>\n {/* Header toggle */}\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"ash-env-vars-header\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('ash-env-vars-chevron', expanded && 'ash-env-vars-chevron-expanded')}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"ash-env-vars-label\">{label}</span>\n {hasEnvVars && !expanded && (\n <span className=\"ash-env-vars-badge\">{Object.keys(envVars).length}</span>\n )}\n </button>\n\n {/* Expanded content */}\n {expanded && (\n <div className=\"ash-env-vars-content\">\n {/* Existing env vars */}\n {Object.entries(envVars).map(([key, val]) => (\n <div key={key} className=\"ash-env-vars-item\">\n <span className=\"ash-env-vars-key\">{key}</span>\n <span className=\"ash-env-vars-equals\">=</span>\n <span className=\"ash-env-vars-value\">{val || '(empty)'}</span>\n <button\n type=\"button\"\n onClick={() => handleRemoveEnvVar(key)}\n className=\"ash-env-vars-remove\"\n title=\"Remove variable\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"w-4 h-4\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n ))}\n\n {/* Add new env var */}\n <div className=\"ash-env-vars-add\">\n <input\n type=\"text\"\n value={newEnvKey}\n onChange={(e) =>\n setNewEnvKey(e.target.value.toUpperCase().replace(/[^A-Z0-9_]/g, ''))\n }\n onKeyDown={handleEnvKeyDown}\n placeholder=\"KEY\"\n className=\"ash-env-vars-input ash-env-vars-input-key\"\n />\n <span className=\"ash-env-vars-equals\">=</span>\n <input\n type=\"text\"\n value={newEnvValue}\n onChange={(e) => setNewEnvValue(e.target.value)}\n onKeyDown={handleEnvKeyDown}\n placeholder=\"value\"\n className=\"ash-env-vars-input ash-env-vars-input-value\"\n />\n <button\n type=\"button\"\n onClick={handleAddEnvVar}\n disabled={!newEnvKey.trim()}\n className=\"ash-env-vars-add-button\"\n >\n Add\n </button>\n </div>\n\n {helperText && <p className=\"ash-env-vars-helper\">{helperText}</p>}\n </div>\n )}\n </div>\n );\n}\n\nexport default EnvVarsPanel;\n","import type { ParsedOption } from '../utils';\nimport { cn } from '../utils';\n\nexport interface OptionCardsProps {\n /** Parsed options to display */\n options: ParsedOption[];\n /** Callback when an option is selected */\n onSelect: (option: ParsedOption) => void;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * OptionCards - Display clickable option cards for interactive selection\n *\n * Renders a grid of glassmorphic cards that users can click to select an option.\n * Used when assistant messages contain structured options for the user to choose from.\n *\n * @example\n * ```tsx\n * <OptionCards\n * options={[\n * { id: '1', label: 'Add Product', description: 'Upload a new product' },\n * { id: '2', label: 'Browse Existing', description: 'View your products' },\n * ]}\n * onSelect={(opt) => sendMessage(opt.label)}\n * />\n * ```\n */\nexport function OptionCards({ options, onSelect, className }: OptionCardsProps) {\n return (\n <div className={cn('grid gap-2 mt-3', className)} style={{\n gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))',\n }}>\n {options.map((option) => (\n <button\n key={option.id}\n onClick={() => onSelect(option)}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-xl text-left',\n 'bg-white/5 border border-white/10',\n 'hover:bg-[var(--ash-accent)]/10 hover:border-[var(--ash-accent)]/30',\n 'focus:outline-none focus:ring-2 focus:ring-[var(--ash-accent)]/50',\n 'transition-all duration-200 cursor-pointer',\n 'group'\n )}\n >\n {/* Option number badge */}\n <span className={cn(\n 'flex-shrink-0 w-6 h-6 rounded-lg',\n 'bg-[var(--ash-accent)]/20 text-[var(--ash-accent)]',\n 'flex items-center justify-center',\n 'text-xs font-semibold',\n 'group-hover:bg-[var(--ash-accent)]/30',\n 'transition-colors duration-200'\n )}>\n {option.id}\n </span>\n\n {/* Option content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-white/90 group-hover:text-white transition-colors\">\n {option.label}\n </div>\n {option.description && (\n <div className=\"text-xs text-white/50 mt-0.5 line-clamp-2 group-hover:text-white/60 transition-colors\">\n {option.description}\n </div>\n )}\n </div>\n\n {/* Arrow indicator */}\n <svg\n className={cn(\n 'w-4 h-4 text-white/30 flex-shrink-0 mt-0.5',\n 'group-hover:text-[var(--ash-accent)] group-hover:translate-x-0.5',\n 'transition-all duration-200'\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n ))}\n </div>\n );\n}\n\nexport default OptionCards;\n","import type { ActionType } from '../types';\nimport {\n TerminalIcon,\n FileIcon,\n EditIcon,\n FilePlusIcon,\n SearchIcon,\n GlobeIcon,\n PlugIcon,\n ToolIcon,\n FolderSearchIcon,\n ListChecksIcon,\n BotIcon,\n} from '../icons';\n\nexport interface ActionIconProps {\n actionType: ActionType;\n className?: string;\n}\n\n/**\n * ActionIcon - Display the appropriate icon for a tool action type\n *\n * @example\n * ```tsx\n * <ActionIcon actionType={{ action: 'command_run', command: 'ls' }} />\n * <ActionIcon actionType={{ action: 'file_read', path: '/file.txt' }} className=\"w-5 h-5\" />\n * ```\n */\nexport function ActionIcon({ actionType, className = 'w-4 h-4' }: ActionIconProps) {\n switch (actionType.action) {\n case 'command_run':\n return <TerminalIcon className={className} />;\n case 'file_read':\n return <FileIcon className={className} />;\n case 'file_edit':\n return <EditIcon className={className} />;\n case 'file_write':\n return <FilePlusIcon className={className} />;\n case 'search':\n return <SearchIcon className={className} />;\n case 'glob':\n return <FolderSearchIcon className={className} />;\n case 'web_fetch':\n return <GlobeIcon className={className} />;\n case 'web_search':\n return <SearchIcon className={className} />;\n case 'mcp_tool':\n return <PlugIcon className={className} />;\n case 'todo_write':\n return <ListChecksIcon className={className} />;\n case 'agent_tool':\n return <BotIcon className={className} />;\n case 'generic_tool':\n default:\n return <ToolIcon className={className} />;\n }\n}\n\nexport default ActionIcon;\n","/**\n * ASH UI Design Tokens\n *\n * Single source of truth for colors, spacing, animations, and other design values.\n * Used by both ash-ui components (via Tailwind/CSS) and the embed widget (via inline styles).\n *\n * @example\n * ```ts\n * import { colors, animations, shadows } from '@ash-cloud/ash-ui/tokens';\n *\n * // In embed widget (inline styles)\n * const style = { backgroundColor: colors.surface.dark };\n *\n * // In Tailwind config\n * module.exports = {\n * theme: {\n * extend: {\n * colors: colors,\n * }\n * }\n * };\n * ```\n */\n\n// =============================================================================\n// Colors\n// =============================================================================\n\nexport const colors = {\n // Primary accent color (lime green)\n accent: {\n DEFAULT: '#ccff00',\n 50: '#f8ffe5',\n 100: '#eeffb8',\n 200: '#e0ff85',\n 300: '#d4ff52',\n 400: '#ccff00',\n 500: '#b8e600',\n 600: '#99cc00',\n 700: '#739900',\n 800: '#4d6600',\n 900: '#263300',\n },\n\n // Surface colors (dark theme)\n surface: {\n dark: '#0a0a0a',\n darker: '#050505',\n card: '#0c0c0c',\n elevated: '#111111',\n },\n\n // Text colors\n text: {\n primary: '#ffffff',\n secondary: 'rgba(255, 255, 255, 0.7)',\n muted: 'rgba(255, 255, 255, 0.5)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n },\n\n // Border colors\n border: {\n DEFAULT: 'rgba(255, 255, 255, 0.1)',\n hover: 'rgba(255, 255, 255, 0.2)',\n accent: 'rgba(204, 255, 0, 0.3)',\n accentHover: 'rgba(204, 255, 0, 0.5)',\n },\n\n // Status colors\n status: {\n success: '#10b981',\n warning: '#eab308',\n error: '#ef4444',\n info: '#3b82f6',\n },\n\n // User message background\n user: {\n bg: 'rgba(204, 255, 0, 0.1)',\n border: 'rgba(204, 255, 0, 0.2)',\n },\n\n // Assistant message background\n assistant: {\n bg: 'rgba(255, 255, 255, 0.05)',\n border: 'rgba(255, 255, 255, 0.1)',\n },\n} as const;\n\n// =============================================================================\n// Spacing\n// =============================================================================\n\nexport const spacing = {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '24px',\n '2xl': '32px',\n '3xl': '48px',\n} as const;\n\n// =============================================================================\n// Border Radius\n// =============================================================================\n\nexport const borderRadius = {\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '20px',\n '2xl': '24px',\n full: '9999px',\n} as const;\n\n// =============================================================================\n// Shadows\n// =============================================================================\n\nexport const shadows = {\n sm: '0 1px 2px rgba(0, 0, 0, 0.3)',\n md: '0 4px 6px rgba(0, 0, 0, 0.4)',\n lg: '0 10px 15px rgba(0, 0, 0, 0.5)',\n xl: '0 20px 25px rgba(0, 0, 0, 0.6)',\n glow: {\n sm: '0 0 10px rgba(204, 255, 0, 0.2)',\n md: '0 0 20px rgba(204, 255, 0, 0.3)',\n lg: '0 0 30px rgba(204, 255, 0, 0.5)',\n },\n panel: '0 25px 50px rgba(0, 0, 0, 0.5)',\n} as const;\n\n// =============================================================================\n// Typography\n// =============================================================================\n\nexport const typography = {\n fontFamily: {\n sans: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n mono: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n },\n fontSize: {\n xs: '12px',\n sm: '14px',\n base: '16px',\n lg: '18px',\n xl: '20px',\n '2xl': '24px',\n },\n lineHeight: {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n },\n} as const;\n\n// =============================================================================\n// CSS Variable Names\n// =============================================================================\n\n/**\n * CSS custom property names for font sizes.\n * Override these in your CSS to customize typography.\n *\n * @example\n * ```css\n * :root {\n * --ash-font-size-base: 16px;\n * --ash-font-size-sm: 14px;\n * --ash-font-size-xs: 12px;\n * --ash-font-size-code: 14px;\n * }\n * ```\n */\nexport const cssVars = {\n fontSize: {\n base: '--ash-font-size-base',\n sm: '--ash-font-size-sm',\n xs: '--ash-font-size-xs',\n code: '--ash-font-size-code',\n },\n accent: '--ash-accent',\n accentForeground: '--ash-accent-foreground',\n surfaceDark: '--ash-surface-dark',\n surfaceDarker: '--ash-surface-darker',\n surfaceCard: '--ash-surface-card',\n surfaceElevated: '--ash-surface-elevated',\n surfaceBorder: '--ash-surface-border',\n} as const;\n\n// =============================================================================\n// Animations - Keyframes as objects for inline style injection\n// =============================================================================\n\nexport const keyframes = {\n slideUp: {\n from: { opacity: '0', transform: 'translateY(20px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n fadeIn: {\n from: { opacity: '0', transform: 'translateY(10px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n blink: {\n '0%, 50%': { opacity: '1' },\n '51%, 100%': { opacity: '0' },\n },\n bounce: {\n '0%, 80%, 100%': { transform: 'scale(0)' },\n '40%': { transform: 'scale(1)' },\n },\n pulse: {\n '0%, 100%': { opacity: '1' },\n '50%': { opacity: '0.5' },\n },\n glowPulse: {\n '0%, 100%': { boxShadow: '0 0 20px rgba(204, 255, 0, 0.3)' },\n '50%': { boxShadow: '0 0 40px rgba(204, 255, 0, 0.5)' },\n },\n} as const;\n\n// CSS keyframe strings for injection into style tags\nexport const keyframesCss = {\n slideUp: `\n @keyframes ash-slide-up {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `,\n fadeIn: `\n @keyframes ash-fade-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `,\n blink: `\n @keyframes ash-blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n `,\n bounce: `\n @keyframes ash-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `,\n pulse: `\n @keyframes ash-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `,\n glowPulse: `\n @keyframes ash-glow-pulse {\n 0%, 100% { box-shadow: 0 0 20px rgba(204, 255, 0, 0.3); }\n 50% { box-shadow: 0 0 40px rgba(204, 255, 0, 0.5); }\n }\n `,\n} as const;\n\n// All keyframes combined for easy injection\nexport const allKeyframesCss = Object.values(keyframesCss).join('\\n');\n\n// =============================================================================\n// Transitions\n// =============================================================================\n\nexport const transitions = {\n fast: '150ms ease-out',\n normal: '300ms ease-out',\n slow: '500ms ease-out',\n spring: '400ms cubic-bezier(0.16, 1, 0.3, 1)',\n} as const;\n\n// =============================================================================\n// Z-Index Scale\n// =============================================================================\n\nexport const zIndex = {\n base: 0,\n dropdown: 100,\n modal: 200,\n tooltip: 300,\n widget: 999999,\n} as const;\n\n// =============================================================================\n// Widget-Specific Dimensions\n// =============================================================================\n\nexport const widget = {\n launcher: {\n size: '60px',\n iconSize: '28px',\n },\n panel: {\n width: '400px',\n height: '600px',\n maxHeight: '80vh',\n },\n header: {\n height: '60px',\n },\n input: {\n minHeight: '60px',\n maxHeight: '150px',\n },\n message: {\n maxWidth: '85%',\n avatarSize: '32px',\n },\n gap: '20px', // Gap from edge of screen\n} as const;\n\n// =============================================================================\n// Helper: Convert tokens to CSS variables\n// =============================================================================\n\nexport function tokensToCssVariables(prefix = 'ash'): Record<string, string> {\n const vars: Record<string, string> = {};\n\n // Colors\n vars[`--${prefix}-accent`] = colors.accent.DEFAULT;\n Object.entries(colors.accent).forEach(([key, value]) => {\n if (key !== 'DEFAULT') vars[`--${prefix}-accent-${key}`] = value;\n });\n\n Object.entries(colors.surface).forEach(([key, value]) => {\n vars[`--${prefix}-surface-${key}`] = value;\n });\n\n Object.entries(colors.text).forEach(([key, value]) => {\n vars[`--${prefix}-text-${key}`] = value;\n });\n\n Object.entries(colors.border).forEach(([key, value]) => {\n if (key !== 'DEFAULT') vars[`--${prefix}-border-${key}`] = value;\n else vars[`--${prefix}-border`] = value;\n });\n\n // Font sizes (default values that can be overridden)\n vars[`--${prefix}-font-size-base`] = '14px';\n vars[`--${prefix}-font-size-sm`] = '12px';\n vars[`--${prefix}-font-size-xs`] = '11px';\n vars[`--${prefix}-font-size-code`] = '13px';\n\n return vars;\n}\n\n// =============================================================================\n// Helper: Generate inline styles from token names\n// =============================================================================\n\nexport const inlineStyles = {\n // Glass panel effect\n glassPanel: {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n backdropFilter: 'blur(24px)',\n WebkitBackdropFilter: 'blur(24px)',\n border: `1px solid ${colors.border.DEFAULT}`,\n },\n\n // Accent button\n accentButton: {\n backgroundColor: colors.accent.DEFAULT,\n color: '#000000',\n border: `1px solid ${colors.accent.DEFAULT}`,\n boxShadow: shadows.glow.md,\n },\n\n // Ghost button\n ghostButton: {\n backgroundColor: 'transparent',\n color: colors.text.secondary,\n border: '1px solid transparent',\n },\n\n // User message bubble\n userMessage: {\n backgroundColor: colors.user.bg,\n border: `1px solid ${colors.user.border}`,\n borderRadius: borderRadius.lg,\n },\n\n // Assistant message bubble\n assistantMessage: {\n backgroundColor: colors.assistant.bg,\n border: `1px solid ${colors.assistant.border}`,\n borderRadius: borderRadius.lg,\n },\n} as const;\n\n// =============================================================================\n// Type exports\n// =============================================================================\n\nexport type Colors = typeof colors;\nexport type Spacing = typeof spacing;\nexport type BorderRadius = typeof borderRadius;\nexport type Shadows = typeof shadows;\nexport type Typography = typeof typography;\nexport type CssVars = typeof cssVars;\nexport type Keyframes = typeof keyframes;\nexport type Transitions = typeof transitions;\nexport type ZIndex = typeof zIndex;\nexport type Widget = typeof widget;\n","/**\n * @ash-cloud/ash-ui - Types\n *\n * Normalized types for structured tool call display in agentic UIs.\n * These types provide a unified representation for displaying tool calls\n * with their arguments and results together.\n */\n\nimport type { ReactNode } from 'react';\n\n// =============================================================================\n// Tool Status\n// =============================================================================\n\n/**\n * Status of a tool call execution\n */\nexport type ToolStatus = 'pending' | 'success' | 'failed';\n\n// =============================================================================\n// Action-Specific Result Types\n// =============================================================================\n\n/**\n * Result from a command/bash execution\n */\nexport interface CommandRunResult {\n exitCode?: number;\n success?: boolean;\n output?: string;\n}\n\n/**\n * Generic tool result that can be markdown or structured JSON\n */\nexport interface ToolResult {\n type: 'markdown' | 'json';\n value: unknown;\n}\n\n// =============================================================================\n// Action Types (Discriminated Union)\n// =============================================================================\n\n/**\n * Bash/command execution action\n */\nexport interface CommandRunAction {\n action: 'command_run';\n command: string;\n description?: string;\n result?: CommandRunResult;\n}\n\n/**\n * File read action\n */\nexport interface FileReadAction {\n action: 'file_read';\n path: string;\n offset?: number;\n limit?: number;\n /** Number of lines read (for display) */\n linesRead?: number;\n}\n\n/**\n * File edit action\n */\nexport interface FileEditAction {\n action: 'file_edit';\n path: string;\n oldString?: string;\n newString?: string;\n replaceAll?: boolean;\n /** Number of lines added */\n linesAdded?: number;\n /** Number of lines removed */\n linesRemoved?: number;\n}\n\n/**\n * File write action\n */\nexport interface FileWriteAction {\n action: 'file_write';\n path: string;\n content?: string;\n /** Number of lines written */\n linesWritten?: number;\n}\n\n/**\n * Search/grep action\n */\nexport interface SearchAction {\n action: 'search';\n pattern: string;\n path?: string;\n glob?: string;\n type?: string;\n}\n\n/**\n * Glob/file pattern matching action\n */\nexport interface GlobAction {\n action: 'glob';\n pattern: string;\n path?: string;\n}\n\n/**\n * Web fetch action\n */\nexport interface WebFetchAction {\n action: 'web_fetch';\n url: string;\n prompt?: string;\n}\n\n/**\n * Web search action\n */\nexport interface WebSearchAction {\n action: 'web_search';\n query: string;\n}\n\n/**\n * MCP (Model Context Protocol) tool action\n */\nexport interface McpToolAction {\n action: 'mcp_tool';\n serverName: string;\n toolName: string;\n arguments?: unknown;\n result?: ToolResult;\n}\n\n/**\n * Generic/unknown tool action\n */\nexport interface GenericToolAction {\n action: 'generic_tool';\n toolName: string;\n arguments?: unknown;\n result?: ToolResult;\n}\n\n/**\n * Agent/Task tool action - represents a sub-agent that can have nested tool calls\n */\nexport interface AgentToolAction {\n action: 'agent_tool';\n /** Agent type (e.g., 'Explore', 'Plan', 'Bash', 'general-purpose') */\n agentType: string;\n /** Description of what the agent is doing */\n description: string;\n /** Full prompt given to the agent */\n prompt?: string;\n /** Nested tool calls made by this agent */\n nestedToolCalls?: NormalizedToolCall[];\n /** Current count of tool calls (updates during streaming) */\n toolCallCount?: number;\n /** When the agent started */\n startedAt?: string;\n /** When the agent completed */\n completedAt?: string;\n /** Result/output from the agent */\n result?: ToolResult;\n}\n\n// =============================================================================\n// Todo Types\n// =============================================================================\n\n/**\n * Status of a todo item\n */\nexport type TodoStatus = 'pending' | 'in_progress' | 'completed';\n\n/**\n * A single todo item from TodoWrite tool\n */\nexport interface TodoItem {\n /** Task content - imperative form (e.g., \"Run tests\") */\n content: string;\n /** Current status of the todo */\n status: TodoStatus;\n /** Active form shown during execution (e.g., \"Running tests\") */\n activeForm: string;\n}\n\n/**\n * TodoWrite tool action - tracks task progress\n */\nexport interface TodoWriteAction {\n action: 'todo_write';\n /** All todos in the current list */\n todos: TodoItem[];\n /** Summary statistics */\n stats?: {\n total: number;\n completed: number;\n inProgress: number;\n pending: number;\n };\n}\n\n/**\n * Discriminated union of all action types\n */\nexport type ActionType =\n | CommandRunAction\n | FileReadAction\n | FileEditAction\n | FileWriteAction\n | SearchAction\n | GlobAction\n | WebFetchAction\n | WebSearchAction\n | McpToolAction\n | GenericToolAction\n | TodoWriteAction\n | AgentToolAction;\n\n// =============================================================================\n// Normalized Tool Call\n// =============================================================================\n\n/**\n * A normalized tool call that combines tool_use and tool_result data\n */\nexport interface NormalizedToolCall {\n /** Unique ID from the tool_use block */\n id: string;\n\n /** Original tool name (e.g., 'Bash', 'Read', 'mcp__server__tool') */\n toolName: string;\n\n /** Parsed action type with structured arguments and result */\n actionType: ActionType;\n\n /** Current execution status */\n status: ToolStatus;\n\n /** Human-readable one-liner summary */\n summary: string;\n\n /** Raw input from tool_use event (for display in UI) */\n input?: unknown;\n\n /** Raw output/result from tool_result event (for display in UI) */\n output?: unknown;\n\n /** When the tool call started */\n startedAt?: string;\n\n /** When the tool call completed */\n completedAt?: string;\n\n /** Whether this tool call resulted in an error */\n isError?: boolean;\n\n /** Nested tool calls (for agent/sub-agent tools like Task) */\n nestedToolCalls?: NormalizedToolCall[];\n\n /** Current count of nested tool calls (updates during streaming) */\n nestedToolCallCount?: number;\n}\n\n// =============================================================================\n// Normalized Entry Types\n// =============================================================================\n\n/**\n * User message entry\n */\nexport interface UserMessageEntry {\n type: 'user_message';\n}\n\n/**\n * Assistant message entry\n */\nexport interface AssistantMessageEntry {\n type: 'assistant_message';\n}\n\n/**\n * Thinking/reasoning entry (extended thinking)\n */\nexport interface ThinkingEntry {\n type: 'thinking';\n}\n\n/**\n * Tool call entry with full tool call data\n */\nexport interface ToolCallEntry {\n type: 'tool_call';\n toolCall: NormalizedToolCall;\n}\n\n/**\n * Error entry\n */\nexport interface ErrorEntry {\n type: 'error';\n message: string;\n code?: string;\n}\n\n/**\n * Custom widget entry - rendered via consumer-provided render function\n *\n * Use this for interactive UI components like:\n * - Image grid selectors\n * - Product carousels\n * - Form inputs\n * - Data visualizations\n * - Any custom interactive widget\n *\n * @example\n * ```tsx\n * const entry: NormalizedEntry = {\n * id: 'widget-1',\n * entryType: {\n * type: 'widget',\n * widgetType: 'image-grid',\n * widgetData: { images: [...], selected: null },\n * },\n * content: 'Select an image',\n * };\n * ```\n */\nexport interface WidgetEntry {\n type: 'widget';\n /** Widget type identifier (e.g., 'image-grid', 'product-selector') */\n widgetType: string;\n /** Widget-specific data passed to the render function */\n widgetData: unknown;\n}\n\n/**\n * Discriminated union of all entry types\n */\nexport type NormalizedEntryType =\n | UserMessageEntry\n | AssistantMessageEntry\n | ThinkingEntry\n | ToolCallEntry\n | ErrorEntry\n | WidgetEntry;\n\n// =============================================================================\n// Normalized Entry\n// =============================================================================\n\n/**\n * A normalized conversation entry for display\n */\nexport interface NormalizedEntry {\n /** Unique entry ID */\n id: string;\n\n /** ISO timestamp */\n timestamp?: string;\n\n /** Entry type with type-specific data */\n entryType: NormalizedEntryType;\n\n /** Text content for display (plain text or markdown) */\n content: string;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isCommandRunAction(action: ActionType): action is CommandRunAction {\n return action.action === 'command_run';\n}\n\nexport function isFileReadAction(action: ActionType): action is FileReadAction {\n return action.action === 'file_read';\n}\n\nexport function isFileEditAction(action: ActionType): action is FileEditAction {\n return action.action === 'file_edit';\n}\n\nexport function isFileWriteAction(action: ActionType): action is FileWriteAction {\n return action.action === 'file_write';\n}\n\nexport function isSearchAction(action: ActionType): action is SearchAction {\n return action.action === 'search';\n}\n\nexport function isGlobAction(action: ActionType): action is GlobAction {\n return action.action === 'glob';\n}\n\nexport function isWebFetchAction(action: ActionType): action is WebFetchAction {\n return action.action === 'web_fetch';\n}\n\nexport function isWebSearchAction(action: ActionType): action is WebSearchAction {\n return action.action === 'web_search';\n}\n\nexport function isMcpToolAction(action: ActionType): action is McpToolAction {\n return action.action === 'mcp_tool';\n}\n\nexport function isGenericToolAction(action: ActionType): action is GenericToolAction {\n return action.action === 'generic_tool';\n}\n\nexport function isTodoWriteAction(action: ActionType): action is TodoWriteAction {\n return action.action === 'todo_write';\n}\n\nexport function isAgentToolAction(action: ActionType): action is AgentToolAction {\n return action.action === 'agent_tool';\n}\n\nexport function isToolCallEntry(entry: NormalizedEntryType): entry is ToolCallEntry {\n return entry.type === 'tool_call';\n}\n\nexport function isErrorEntry(entry: NormalizedEntryType): entry is ErrorEntry {\n return entry.type === 'error';\n}\n\nexport function isWidgetEntry(entry: NormalizedEntryType): entry is WidgetEntry {\n return entry.type === 'widget';\n}\n\n// =============================================================================\n// Widget Rendering\n// =============================================================================\n\n/**\n * Props passed to the widget render function\n */\nexport interface WidgetRenderProps<T = unknown> {\n /** The widget entry being rendered */\n entry: NormalizedEntry;\n /** Widget type identifier */\n widgetType: string;\n /** Widget-specific data */\n widgetData: T;\n /** Callback for widget interactions (e.g., selection, submit) */\n onAction?: (action: WidgetAction) => void;\n}\n\n/**\n * Action dispatched from a widget interaction\n */\nexport interface WidgetAction {\n /** Action type (e.g., 'select', 'submit', 'cancel') */\n type: string;\n /** Widget type that dispatched the action */\n widgetType: string;\n /** Entry ID of the widget */\n entryId: string;\n /** Action-specific payload */\n payload?: unknown;\n}\n\n/**\n * Function type for rendering custom widgets\n *\n * @example\n * ```tsx\n * const renderWidget: WidgetRenderFunction = ({ widgetType, widgetData, onAction }) => {\n * switch (widgetType) {\n * case 'image-grid':\n * return (\n * <ImageGrid\n * images={widgetData.images}\n * onSelect={(id) => onAction?.({ type: 'select', widgetType, entryId, payload: { id } })}\n * />\n * );\n * case 'product-selector':\n * return <ProductSelector data={widgetData} onAction={onAction} />;\n * default:\n * return null;\n * }\n * };\n *\n * <MessageList entries={entries} renderWidget={renderWidget} />\n * ```\n */\nexport type WidgetRenderFunction = (props: WidgetRenderProps) => ReactNode;\n\n// =============================================================================\n// Log Types (for SandboxLogsPanel)\n// =============================================================================\n\nexport type LogLevel = 'info' | 'warn' | 'error' | 'debug';\nexport type LogCategory = 'setup' | 'skills' | 'execution' | 'process' | 'startup';\n\nexport interface LogEntry {\n timestamp: string;\n level: LogLevel;\n category: LogCategory;\n message: string;\n data?: Record<string, unknown>;\n}\n\n// =============================================================================\n// File Attachment\n// =============================================================================\n\nexport interface FileAttachment {\n name: string;\n type: string;\n size: number;\n base64: string;\n}\n\n// =============================================================================\n// Rich Content (Mention Rendering)\n// =============================================================================\n\n/**\n * A plain text segment in rich content\n */\nexport interface RichTextSegment {\n type: 'text';\n content: string;\n}\n\n/**\n * A mention segment in rich content (e.g., @ProductX, @JohnDoe)\n */\nexport interface RichMentionSegment {\n type: 'mention';\n /** Display name for the mention */\n name: string;\n /** Optional color for the mention badge */\n color?: string;\n /** Optional avatar/icon URL */\n url?: string;\n /** Optional custom data (e.g., entity ID for click handling) */\n data?: Record<string, unknown>;\n}\n\n/**\n * A single segment of rich content\n */\nexport type RichContentSegment = RichTextSegment | RichMentionSegment;\n\n/**\n * Pre-parsed rich content array for custom rendering\n *\n * @example\n * ```tsx\n * const richContent: RichContent = [\n * { type: 'text', content: 'Check out ' },\n * { type: 'mention', name: 'ProductX', color: '#f59e0b', data: { id: 123 } },\n * { type: 'text', content: ' for details' },\n * ];\n * ```\n */\nexport type RichContent = RichContentSegment[];\n\n/**\n * Props for rendering a mention component\n */\nexport interface MentionProps {\n /** Display name for the mention */\n name: string;\n /** Optional color for the mention badge */\n color?: string;\n /** Optional avatar/icon URL */\n url?: string;\n /** Optional custom data (e.g., entity ID for click handling) */\n data?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Display Mode Configuration\n// =============================================================================\n\n// =============================================================================\n// Theming & Customization\n// =============================================================================\n\n/**\n * Message visual style variant\n *\n * - 'bubble': Rounded card with padding and background (default for user messages)\n * - 'plain': No background, just text with subtle styling\n * - 'minimal': Bare text, no decoration\n */\nexport type MessageVariant = 'bubble' | 'plain' | 'minimal';\n\n/**\n * Typography scale/density preset\n *\n * - 'dense': Minimal spacing, smallest fonts (12px base) - for maximum information density\n * - 'compact': Tighter spacing, smaller fonts (13px base)\n * - 'default': Standard sizing (14px base)\n * - 'comfortable': More generous spacing (15px base)\n */\nexport type TypographyScale = 'dense' | 'compact' | 'default' | 'comfortable';\n\n/**\n * Message role for data attribute targeting\n */\nexport type MessageRole = 'user' | 'assistant' | 'thinking' | 'tool' | 'error' | 'widget';\n\n/**\n * Metadata to display with a message\n */\nexport interface MessageMetadata {\n /** Timestamp to display */\n timestamp?: string;\n /** Model name/info to display */\n model?: string;\n /** Custom label */\n label?: string;\n /** Any additional metadata */\n extra?: Record<string, unknown>;\n}\n\n/**\n * Function to render custom message metadata\n */\nexport type RenderMetadataFunction = (props: {\n entry: NormalizedEntry;\n metadata?: MessageMetadata;\n}) => ReactNode;\n\n/**\n * Custom markdown component overrides\n *\n * @example\n * ```tsx\n * const components: MarkdownComponents = {\n * h2: ({ children }) => <h2 className=\"custom-h2\">{children}</h2>,\n * code: ({ children, className }) => <CustomCode className={className}>{children}</CustomCode>,\n * };\n * ```\n */\nexport interface MarkdownComponents {\n h1?: React.ComponentType<{ children?: ReactNode }>;\n h2?: React.ComponentType<{ children?: ReactNode }>;\n h3?: React.ComponentType<{ children?: ReactNode }>;\n h4?: React.ComponentType<{ children?: ReactNode }>;\n h5?: React.ComponentType<{ children?: ReactNode }>;\n h6?: React.ComponentType<{ children?: ReactNode }>;\n p?: React.ComponentType<{ children?: ReactNode }>;\n a?: React.ComponentType<{ children?: ReactNode; href?: string }>;\n ul?: React.ComponentType<{ children?: ReactNode }>;\n ol?: React.ComponentType<{ children?: ReactNode }>;\n li?: React.ComponentType<{ children?: ReactNode }>;\n code?: React.ComponentType<{ children?: ReactNode; className?: string }>;\n pre?: React.ComponentType<{ children?: ReactNode }>;\n blockquote?: React.ComponentType<{ children?: ReactNode }>;\n strong?: React.ComponentType<{ children?: ReactNode }>;\n em?: React.ComponentType<{ children?: ReactNode }>;\n hr?: React.ComponentType<Record<string, never>>;\n img?: React.ComponentType<{ src?: string; alt?: string }>;\n table?: React.ComponentType<{ children?: ReactNode }>;\n thead?: React.ComponentType<{ children?: ReactNode }>;\n tbody?: React.ComponentType<{ children?: ReactNode }>;\n tr?: React.ComponentType<{ children?: ReactNode }>;\n th?: React.ComponentType<{ children?: ReactNode }>;\n td?: React.ComponentType<{ children?: ReactNode }>;\n}\n\n/**\n * Style configuration for message display\n */\nexport interface MessageStyleConfig {\n /** Variant for user messages */\n userVariant?: MessageVariant;\n /** Variant for assistant messages */\n assistantVariant?: MessageVariant;\n /** Typography/density scale */\n scale?: TypographyScale;\n /** Show timestamps with messages */\n showTimestamp?: boolean;\n /** Show avatars */\n showAvatars?: boolean;\n /** Custom class name for messages */\n messageClassName?: string;\n}\n\n/**\n * Default style configuration\n */\nexport const DEFAULT_STYLE_CONFIG: MessageStyleConfig = {\n userVariant: 'bubble',\n assistantVariant: 'bubble',\n scale: 'compact',\n showTimestamp: true,\n showAvatars: true,\n}\n\n// =============================================================================\n// AI SDK Compatible Types\n// =============================================================================\n\n/**\n * Tool invocation status - matches AI SDK ToolInvocation\n */\nexport type ToolInvocationState = 'partial-call' | 'call' | 'result';\n\n/**\n * Tool invocation - matches AI SDK ToolInvocation type\n */\nexport interface ToolInvocation {\n /** Tool invocation state */\n state: ToolInvocationState;\n /** Unique tool call ID */\n toolCallId: string;\n /** Tool name */\n toolName: string;\n /** Arguments passed to the tool (parsed JSON) */\n args: Record<string, unknown>;\n /** Result from tool execution (only present when state is 'result') */\n result?: unknown;\n}\n\n/**\n * AI SDK message role - matches AI SDK Message role\n */\nexport type AIMessageRole = 'user' | 'assistant' | 'system' | 'data';\n\n/**\n * AI SDK compatible message type\n * This is the primary type used by the new useChat hook\n */\nexport interface Message {\n /** Unique message ID */\n id: string;\n /** Message role */\n role: AIMessageRole;\n /** Message content (text) */\n content: string;\n /** Tool invocations for this message */\n toolInvocations?: ToolInvocation[];\n /** When the message was created */\n createdAt?: Date;\n /** Optional reasoning/thinking content */\n reasoning?: string;\n /** Experimental attachments (for file uploads) */\n experimental_attachments?: MessageAttachment[];\n}\n\n/**\n * Message attachment for file uploads\n */\nexport interface MessageAttachment {\n /** Attachment name */\n name: string;\n /** MIME type */\n contentType: string;\n /** URL to the attachment */\n url: string;\n}\n\n// =============================================================================\n// Type Conversion Functions\n// =============================================================================\n\n/**\n * Convert a NormalizedEntry to an AI SDK Message\n */\nexport function normalizedEntryToMessage(entry: NormalizedEntry): Message | null {\n const { id, entryType, content, timestamp } = entry;\n const createdAt = timestamp ? new Date(timestamp) : undefined;\n\n switch (entryType.type) {\n case 'user_message':\n return {\n id,\n role: 'user',\n content,\n createdAt,\n };\n\n case 'assistant_message':\n return {\n id,\n role: 'assistant',\n content,\n createdAt,\n };\n\n case 'thinking':\n // Thinking is represented as reasoning on the previous assistant message\n // Return as assistant message with reasoning\n return {\n id,\n role: 'assistant',\n content: '',\n reasoning: content,\n createdAt,\n };\n\n case 'tool_call': {\n const { toolCall } = entryType;\n const toolInvocation: ToolInvocation = {\n state: toolCall.status === 'pending' ? 'call' : 'result',\n toolCallId: toolCall.id,\n toolName: toolCall.toolName,\n args: (toolCall.input as Record<string, unknown>) || {},\n result: toolCall.output,\n };\n // Tool calls are attached to assistant messages\n return {\n id,\n role: 'assistant',\n content: '',\n toolInvocations: [toolInvocation],\n createdAt,\n };\n }\n\n case 'error':\n // Errors can be represented as system messages\n return {\n id,\n role: 'system',\n content: `Error: ${entryType.message}${entryType.code ? ` (${entryType.code})` : ''}`,\n createdAt,\n };\n\n case 'widget':\n // Widgets are data messages\n return {\n id,\n role: 'data',\n content: JSON.stringify({\n widgetType: entryType.widgetType,\n widgetData: entryType.widgetData,\n }),\n createdAt,\n };\n\n default:\n return null;\n }\n}\n\n/**\n * Convert an AI SDK Message to a NormalizedEntry\n */\nexport function messageToNormalizedEntry(message: Message): NormalizedEntry {\n const { id, role, content, createdAt, toolInvocations, reasoning } = message;\n const timestamp = createdAt?.toISOString();\n\n // If there are tool invocations, create tool call entries\n if (toolInvocations && toolInvocations.length > 0) {\n // For simplicity, take the first tool invocation\n // In practice, multiple tool invocations would need multiple entries\n const inv = toolInvocations[0]!;\n const toolCall: NormalizedToolCall = {\n id: inv.toolCallId,\n toolName: inv.toolName,\n actionType: {\n action: 'generic_tool',\n toolName: inv.toolName,\n arguments: inv.args,\n result: inv.result ? { type: 'json', value: inv.result } : undefined,\n },\n status: inv.state === 'result' ? 'success' : 'pending',\n summary: `${inv.toolName}(${Object.keys(inv.args).join(', ')})`,\n input: inv.args,\n output: inv.result,\n };\n\n return {\n id,\n timestamp,\n entryType: { type: 'tool_call', toolCall },\n content: toolCall.summary,\n };\n }\n\n // If there's reasoning, create a thinking entry\n if (reasoning) {\n return {\n id,\n timestamp,\n entryType: { type: 'thinking' },\n content: reasoning,\n };\n }\n\n // Standard message types based on role\n if (role === 'user') {\n return {\n id,\n timestamp,\n entryType: { type: 'user_message' },\n content,\n };\n }\n\n if (role === 'assistant') {\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n }\n\n if (role === 'system') {\n // System messages that look like errors\n if (content.startsWith('Error:')) {\n return {\n id,\n timestamp,\n entryType: { type: 'error', message: content.replace('Error: ', '') },\n content,\n };\n }\n // Otherwise treat as assistant message\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n }\n\n if (role === 'data') {\n // Try to parse as widget\n try {\n const data = JSON.parse(content);\n if (data.widgetType) {\n return {\n id,\n timestamp,\n entryType: {\n type: 'widget',\n widgetType: data.widgetType,\n widgetData: data.widgetData,\n },\n content: '',\n };\n }\n } catch {\n // Not valid JSON, treat as assistant message\n }\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n }\n\n // Default fallback\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n}\n\n/**\n * Convert an array of NormalizedEntry to AI SDK Messages\n * Merges consecutive assistant entries (text + tool calls) into single messages\n */\nexport function normalizedEntriesToMessages(entries: NormalizedEntry[]): Message[] {\n const messages: Message[] = [];\n let currentAssistantMessage: Message | null = null;\n\n for (const entry of entries) {\n const message = normalizedEntryToMessage(entry);\n if (!message) continue;\n\n if (message.role === 'assistant') {\n // Check if we should merge with current assistant message\n if (currentAssistantMessage) {\n // Merge tool invocations\n if (message.toolInvocations) {\n currentAssistantMessage.toolInvocations = [\n ...(currentAssistantMessage.toolInvocations || []),\n ...message.toolInvocations,\n ];\n }\n // Merge content\n if (message.content) {\n currentAssistantMessage.content = currentAssistantMessage.content\n ? `${currentAssistantMessage.content}\\n${message.content}`\n : message.content;\n }\n // Merge reasoning\n if (message.reasoning) {\n currentAssistantMessage.reasoning = currentAssistantMessage.reasoning\n ? `${currentAssistantMessage.reasoning}\\n${message.reasoning}`\n : message.reasoning;\n }\n } else {\n currentAssistantMessage = { ...message };\n }\n } else {\n // Flush current assistant message\n if (currentAssistantMessage) {\n messages.push(currentAssistantMessage);\n currentAssistantMessage = null;\n }\n messages.push(message);\n }\n }\n\n // Flush any remaining assistant message\n if (currentAssistantMessage) {\n messages.push(currentAssistantMessage);\n }\n\n return messages;\n}\n\n/**\n * Convert AI SDK Messages back to NormalizedEntry array\n * Expands tool invocations into separate entries\n */\nexport function messagesToNormalizedEntries(messages: Message[]): NormalizedEntry[] {\n const entries: NormalizedEntry[] = [];\n\n for (const message of messages) {\n // If message has reasoning, add thinking entry first\n if (message.reasoning) {\n entries.push({\n id: `${message.id}-thinking`,\n timestamp: message.createdAt?.toISOString(),\n entryType: { type: 'thinking' },\n content: message.reasoning,\n });\n }\n\n // If message has content, add the content entry\n if (message.content || !message.toolInvocations?.length) {\n entries.push(messageToNormalizedEntry({\n ...message,\n toolInvocations: undefined,\n reasoning: undefined,\n }));\n }\n\n // Add separate entries for each tool invocation\n if (message.toolInvocations) {\n for (const inv of message.toolInvocations) {\n const toolMessage: Message = {\n id: inv.toolCallId,\n role: 'assistant',\n content: '',\n toolInvocations: [inv],\n createdAt: message.createdAt,\n };\n entries.push(messageToNormalizedEntry(toolMessage));\n }\n }\n }\n\n return entries;\n}\n","'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\n/**\n * A queued message waiting to be sent\n */\nexport interface QueuedMessage {\n /** Unique ID for this queued message */\n id: string;\n /** The message text */\n text: string;\n /** Optional file attachments */\n files?: FileAttachment[];\n /** Timestamp when queued */\n queuedAt: number;\n}\n\n/**\n * File attachment for upload\n */\nexport interface FileAttachment {\n /** Original filename */\n filename: string;\n /** Base64-encoded file content */\n content: string;\n /** MIME type of the file */\n mimeType: string;\n /** File size in bytes */\n size: number;\n}\n\nexport interface UseMessageQueueOptions {\n /** Callback to process a message - should return when processing is complete */\n onProcessMessage: (message: QueuedMessage) => Promise<void>;\n /** Whether messages can currently be processed (e.g., agent selected) */\n canProcess?: boolean;\n}\n\nexport interface UseMessageQueueReturn {\n /** Current queue of pending messages */\n queue: QueuedMessage[];\n /** Whether a message is currently being processed */\n isProcessing: boolean;\n /** Add a message to the queue (or process immediately if idle) */\n enqueue: (text: string, files?: FileAttachment[]) => void;\n /** Cancel a queued message by ID */\n cancel: (id: string) => void;\n /** Clear all queued messages */\n clearQueue: () => void;\n /** Number of messages in queue */\n queueLength: number;\n}\n\n/**\n * Hook for managing a message queue with sequential processing.\n *\n * Messages are queued when the agent is busy and processed sequentially.\n * Users can continue typing while the agent processes previous messages.\n *\n * @example\n * ```tsx\n * function ChatInput() {\n * const { queue, isProcessing, enqueue, cancel } = useMessageQueue({\n * onProcessMessage: async (msg) => {\n * for await (const event of client.agents.run(agentId, msg.text)) {\n * // handle events\n * }\n * }\n * });\n *\n * return (\n * <div>\n * {queue.map(msg => (\n * <div key={msg.id}>\n * Queued: {msg.text}\n * <button onClick={() => cancel(msg.id)}>Cancel</button>\n * </div>\n * ))}\n * <input onSubmit={(text) => enqueue(text)} />\n * <button>{isProcessing ? `Queue (${queue.length})` : 'Send'}</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useMessageQueue({\n onProcessMessage,\n canProcess = true,\n}: UseMessageQueueOptions): UseMessageQueueReturn {\n const [queue, setQueue] = useState<QueuedMessage[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const isProcessingRef = useRef(false);\n const onProcessMessageRef = useRef(onProcessMessage);\n\n // Keep callback ref in sync\n useEffect(() => {\n onProcessMessageRef.current = onProcessMessage;\n }, [onProcessMessage]);\n\n // Process queue sequentially\n const processQueue = useCallback(async () => {\n if (isProcessingRef.current || !canProcess) return;\n\n isProcessingRef.current = true;\n setIsProcessing(true);\n\n while (true) {\n // Get next message from queue\n let nextMessage: QueuedMessage | undefined;\n setQueue((prev) => {\n if (prev.length === 0) return prev;\n nextMessage = prev[0];\n return prev.slice(1);\n });\n\n // Wait a tick for state to update\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n if (!nextMessage) break;\n\n try {\n await onProcessMessageRef.current(nextMessage);\n } catch (error) {\n console.error('Error processing queued message:', error);\n // Continue processing queue even if one message fails\n }\n }\n\n isProcessingRef.current = false;\n setIsProcessing(false);\n }, [canProcess]);\n\n // Watch for queue changes and process\n useEffect(() => {\n if (queue.length > 0 && !isProcessingRef.current && canProcess) {\n processQueue();\n }\n }, [queue, processQueue, canProcess]);\n\n // Enqueue a new message\n const enqueue = useCallback((text: string, files?: FileAttachment[]) => {\n const message: QueuedMessage = {\n id: `queue-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n text,\n files,\n queuedAt: Date.now(),\n };\n\n setQueue((prev) => [...prev, message]);\n }, []);\n\n // Cancel a queued message\n const cancel = useCallback((id: string) => {\n setQueue((prev) => prev.filter((m) => m.id !== id));\n }, []);\n\n // Clear all queued messages\n const clearQueue = useCallback(() => {\n setQueue([]);\n }, []);\n\n return {\n queue,\n isProcessing,\n enqueue,\n cancel,\n clearQueue,\n queueLength: queue.length,\n };\n}\n\nexport default useMessageQueue;\n","'use client';\n\nimport { useState, useCallback, useRef } from 'react';\n\nexport interface UseStopExecutionOptions {\n /** Callback to stop server-side execution (e.g., client.sessions.stop) */\n onServerStop?: (sessionId: string) => Promise<void>;\n}\n\nexport interface UseStopExecutionReturn {\n /** Whether execution can currently be stopped */\n canStop: boolean;\n /** The AbortSignal to pass to fetch requests */\n signal: AbortSignal | undefined;\n /** Start tracking a new execution (call when starting a request) */\n startExecution: () => void;\n /** Mark execution as complete (call when request finishes) */\n endExecution: () => void;\n /** Stop the current execution (aborts client + optionally server) */\n stop: (sessionId?: string) => Promise<void>;\n /** Set the current session ID for server-side stop */\n setSessionId: (sessionId: string | null) => void;\n}\n\n/**\n * Hook for managing execution stopping with AbortController.\n *\n * Handles both client-side request abortion and optional server-side stop calls.\n * Use this to implement stop/cancel buttons for long-running agent executions.\n *\n * @example\n * ```tsx\n * function Chat() {\n * const { canStop, signal, startExecution, endExecution, stop, setSessionId } = useStopExecution({\n * onServerStop: (sessionId) => client.sessions.stop(sessionId)\n * });\n *\n * async function sendMessage(text: string) {\n * startExecution();\n * try {\n * for await (const event of client.agents.run(agentId, text, { signal })) {\n * if (event.type === 'session_start') {\n * setSessionId(event.sessionId);\n * }\n * // handle events...\n * }\n * } catch (err) {\n * if (err.name === 'AbortError') {\n * console.log('Request aborted');\n * }\n * } finally {\n * endExecution();\n * }\n * }\n *\n * return (\n * <div>\n * {canStop && <button onClick={() => stop()}>Stop</button>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useStopExecution({\n onServerStop,\n}: UseStopExecutionOptions = {}): UseStopExecutionReturn {\n const [canStop, setCanStop] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n const sessionIdRef = useRef<string | null>(null);\n const onServerStopRef = useRef(onServerStop);\n\n // Keep callback ref in sync\n onServerStopRef.current = onServerStop;\n\n // Start a new execution\n const startExecution = useCallback(() => {\n // Create new AbortController\n abortControllerRef.current = new AbortController();\n setCanStop(true);\n }, []);\n\n // End the current execution\n const endExecution = useCallback(() => {\n abortControllerRef.current = null;\n sessionIdRef.current = null;\n setCanStop(false);\n }, []);\n\n // Set the session ID for server-side stop\n const setSessionId = useCallback((sessionId: string | null) => {\n sessionIdRef.current = sessionId;\n }, []);\n\n // Stop execution (client + server)\n const stop = useCallback(async (explicitSessionId?: string) => {\n // 1. Abort client-side request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // 2. Call server-side stop if we have a session\n const sessionId = explicitSessionId || sessionIdRef.current;\n if (sessionId && onServerStopRef.current) {\n try {\n await onServerStopRef.current(sessionId);\n } catch (err) {\n // Log but don't throw - the abort already happened\n console.warn('Server stop failed:', err);\n }\n }\n\n // Mark as stopped\n setCanStop(false);\n }, []);\n\n return {\n canStop,\n signal: abortControllerRef.current?.signal,\n startExecution,\n endExecution,\n stop,\n setSessionId,\n };\n}\n\nexport default useStopExecution;\n","'use client';\n\nimport { useState, useCallback, useRef, DragEvent, ChangeEvent } from 'react';\n\n/**\n * File attachment ready for upload\n */\nexport interface FileAttachment {\n /** Original filename */\n filename: string;\n /** Base64-encoded file content (without data URL prefix) */\n content: string;\n /** MIME type of the file */\n mimeType: string;\n /** File size in bytes */\n size: number;\n}\n\nexport interface UseFileUploadOptions {\n /** Maximum file size in bytes (default: 100MB) */\n maxFileSize?: number;\n /** Maximum number of files (default: 10) */\n maxFiles?: number;\n /** Callback when file validation fails */\n onValidationError?: (filename: string, error: string) => void;\n}\n\nexport interface UseFileUploadReturn {\n /** Current list of attached files */\n files: FileAttachment[];\n /** Whether drag is currently over the drop zone */\n isDragOver: boolean;\n /** Add files from a FileList (e.g., from input or drop) */\n addFiles: (fileList: FileList | null) => Promise<void>;\n /** Remove a file by index */\n removeFile: (index: number) => void;\n /** Clear all files */\n clearFiles: () => void;\n /** Whether more files can be added */\n canAddMore: boolean;\n /** Props to spread on a drop zone element */\n dropZoneProps: {\n onDragOver: (e: DragEvent) => void;\n onDragLeave: (e: DragEvent) => void;\n onDrop: (e: DragEvent) => void;\n };\n /** Handler for file input onChange */\n handleFileInputChange: (e: ChangeEvent<HTMLInputElement>) => void;\n /** Ref for a hidden file input */\n fileInputRef: React.RefObject<HTMLInputElement | null>;\n /** Click handler to trigger file input */\n openFilePicker: () => void;\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Read a file as base64\n */\nasync function readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Remove data URL prefix to get pure base64\n const base64 = result.split(',')[1];\n resolve(base64 || '');\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Hook for managing file uploads with drag & drop support.\n *\n * Handles file selection, validation, base64 encoding, and drag/drop UI state.\n *\n * @example\n * ```tsx\n * function FileUploadArea() {\n * const {\n * files,\n * isDragOver,\n * addFiles,\n * removeFile,\n * dropZoneProps,\n * fileInputRef,\n * openFilePicker,\n * canAddMore,\n * } = useFileUpload({\n * maxFileSize: 50 * 1024 * 1024, // 50MB\n * maxFiles: 5,\n * onValidationError: (filename, error) => {\n * toast.error(`${filename}: ${error}`);\n * }\n * });\n *\n * return (\n * <div {...dropZoneProps} className={isDragOver ? 'drag-over' : ''}>\n * <input ref={fileInputRef} type=\"file\" multiple hidden />\n * <button onClick={openFilePicker} disabled={!canAddMore}>\n * Add Files\n * </button>\n * {files.map((file, i) => (\n * <div key={i}>\n * {file.filename} ({formatFileSize(file.size)})\n * <button onClick={() => removeFile(i)}>Remove</button>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFileUpload({\n maxFileSize = 100 * 1024 * 1024, // 100MB\n maxFiles = 10,\n onValidationError,\n}: UseFileUploadOptions = {}): UseFileUploadReturn {\n const [files, setFiles] = useState<FileAttachment[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n // Process and add files\n const addFiles = useCallback(\n async (fileList: FileList | null) => {\n if (!fileList) return;\n\n const newFiles: FileAttachment[] = [];\n const currentCount = files.length;\n\n for (\n let i = 0;\n i < fileList.length && currentCount + newFiles.length < maxFiles;\n i++\n ) {\n const file = fileList.item(i);\n if (!file) continue;\n\n // Check file size\n if (file.size > maxFileSize) {\n onValidationError?.(\n file.name,\n `Exceeds maximum size of ${formatFileSize(maxFileSize)}`\n );\n continue;\n }\n\n try {\n const content = await readFileAsBase64(file);\n newFiles.push({\n filename: file.name,\n content,\n mimeType: file.type || 'application/octet-stream',\n size: file.size,\n });\n } catch (error) {\n console.error(`Failed to read file ${file.name}:`, error);\n onValidationError?.(file.name, 'Failed to read file');\n }\n }\n\n // Check if we hit the max files limit\n if (\n fileList.length > maxFiles - currentCount &&\n currentCount + newFiles.length >= maxFiles\n ) {\n onValidationError?.('', `Maximum ${maxFiles} files allowed`);\n }\n\n if (newFiles.length > 0) {\n setFiles((prev) => [...prev, ...newFiles]);\n }\n },\n [files.length, maxFiles, maxFileSize, onValidationError]\n );\n\n // Remove a file by index\n const removeFile = useCallback((index: number) => {\n setFiles((prev) => prev.filter((_, i) => i !== index));\n }, []);\n\n // Clear all files\n const clearFiles = useCallback(() => {\n setFiles([]);\n }, []);\n\n // Drag event handlers\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n addFiles(e.dataTransfer.files);\n },\n [addFiles]\n );\n\n // File input change handler\n const handleFileInputChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n addFiles(e.target.files);\n // Reset input to allow selecting the same file again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n },\n [addFiles]\n );\n\n // Open file picker\n const openFilePicker = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n return {\n files,\n isDragOver,\n addFiles,\n removeFile,\n clearFiles,\n canAddMore: files.length < maxFiles,\n dropZoneProps: {\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n },\n handleFileInputChange,\n fileInputRef,\n openFilePicker,\n };\n}\n\nexport default useFileUpload;\n","/**\n * Middleware utilities for useAgentChat\n *\n * Provides composable request and event transformation capabilities.\n * Middleware functions are called in order, and each can transform or filter\n * the request/event before passing it to the next middleware.\n *\n * @example\n * ```tsx\n * const loggingMiddleware: ChatMiddleware = {\n * onRequest: (request) => {\n * console.log('Sending:', request.prompt);\n * return request;\n * },\n * onEvent: (event) => {\n * console.log('Received:', event.type);\n * return event;\n * },\n * };\n *\n * const { send } = useAgentChat({\n * middleware: [loggingMiddleware],\n * // ...\n * });\n * ```\n */\n\nimport type { StreamEvent } from './useAgentChat';\n\n/**\n * Request object passed through middleware chain\n */\nexport interface MiddlewareRequest {\n /** The user's prompt */\n prompt: string;\n /** Current session ID (if resuming a conversation) */\n sessionId: string | null;\n /** Additional metadata to send with the request */\n metadata?: Record<string, unknown>;\n /** Additional context to prepend to the session */\n sessionContext?: string;\n}\n\n/**\n * Result returned from request middleware\n * Return void or omit fields to keep original values\n */\nexport interface MiddlewareRequestResult {\n /** Modified prompt */\n prompt?: string;\n /** Modified metadata (merged with existing) */\n metadata?: Record<string, unknown>;\n /** Modified session context */\n sessionContext?: string;\n /** If set, cancels the request and shows this error */\n error?: string;\n}\n\n/**\n * Middleware interface for composable request/event transforms\n */\nexport interface ChatMiddleware {\n /** Called before the request is sent. Can modify request or return error to cancel. */\n onRequest?: (\n request: MiddlewareRequest\n ) => Promise<MiddlewareRequestResult | void> | MiddlewareRequestResult | void;\n\n /** Called for each event. Return null to filter out the event. */\n onEvent?: (event: StreamEvent) => Promise<StreamEvent | null> | StreamEvent | null;\n\n /** Called when the stream completes successfully */\n onComplete?: (sessionId: string) => void | Promise<void>;\n\n /** Called when an error occurs */\n onError?: (error: string) => void | Promise<void>;\n}\n\n/**\n * Apply request middleware chain\n *\n * Executes each middleware's onRequest handler in order.\n * Each middleware can modify the request or return an error to cancel.\n *\n * @param middlewares - Array of middleware to apply\n * @param request - Initial request object\n * @returns Modified request and optional error\n */\nexport async function applyRequestMiddleware(\n middlewares: ChatMiddleware[],\n request: MiddlewareRequest\n): Promise<{ request: MiddlewareRequest; error?: string }> {\n let current = { ...request };\n\n for (const mw of middlewares) {\n if (mw.onRequest) {\n try {\n const result = await mw.onRequest(current);\n if (result?.error) {\n return { request: current, error: result.error };\n }\n if (result) {\n current = {\n ...current,\n prompt: result.prompt ?? current.prompt,\n sessionContext: result.sessionContext ?? current.sessionContext,\n metadata: {\n ...current.metadata,\n ...result.metadata,\n },\n };\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Middleware error';\n return { request: current, error: errorMessage };\n }\n }\n }\n\n return { request: current };\n}\n\n/**\n * Apply event middleware chain\n *\n * Executes each middleware's onEvent handler in order.\n * If any middleware returns null, the event is filtered out.\n *\n * @param middlewares - Array of middleware to apply\n * @param event - Stream event to process\n * @returns Processed event or null if filtered\n */\nexport async function applyEventMiddleware(\n middlewares: ChatMiddleware[],\n event: StreamEvent\n): Promise<StreamEvent | null> {\n let current: StreamEvent | null = event;\n\n for (const mw of middlewares) {\n if (!current) break;\n if (mw.onEvent) {\n try {\n current = await mw.onEvent(current);\n } catch (err) {\n console.error('[middleware] onEvent error:', err);\n // Don't filter on error, let the event pass through\n }\n }\n }\n\n return current;\n}\n\n/**\n * Call completion handlers on all middleware\n *\n * @param middlewares - Array of middleware\n * @param sessionId - Completed session ID\n */\nexport async function callMiddlewareComplete(\n middlewares: ChatMiddleware[],\n sessionId: string\n): Promise<void> {\n for (const mw of middlewares) {\n if (mw.onComplete) {\n try {\n await mw.onComplete(sessionId);\n } catch (err) {\n console.error('[middleware] onComplete error:', err);\n }\n }\n }\n}\n\n/**\n * Call error handlers on all middleware\n *\n * @param middlewares - Array of middleware\n * @param error - Error message\n */\nexport async function callMiddlewareError(\n middlewares: ChatMiddleware[],\n error: string\n): Promise<void> {\n for (const mw of middlewares) {\n if (mw.onError) {\n try {\n await mw.onError(error);\n } catch (err) {\n console.error('[middleware] onError error:', err);\n }\n }\n }\n}\n","/**\n * useAgentChat - A React hook for streaming agent conversations\n *\n * This hook handles all the complexity of streaming agent responses:\n * - Real-time text streaming via text_delta events\n * - Tool call tracking and correlation\n * - Proper deduplication (no duplicate messages)\n * - Seamless transition from streaming to finalized state\n *\n * @example\n * ```tsx\n * import { useAgentChat } from '@ash-cloud/ash-ui';\n * import { AgentCloudClient } from '@ash-cloud/client';\n *\n * const client = new AgentCloudClient({ apiKey: '...' });\n *\n * function Chat() {\n * const {\n * entries,\n * isStreaming,\n * error,\n * sessionId,\n * send,\n * stop,\n * } = useAgentChat({\n * client,\n * agentId: 'my-agent-id',\n * });\n *\n * return (\n * <div>\n * <MessageList entries={entries} loading={isStreaming} />\n * <input onSubmit={(e) => send(e.target.value)} />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { NormalizedEntry, NormalizedToolCall } from '../types';\nimport { createToolCall, updateToolCallWithResult } from '../utils';\nimport {\n applyRequestMiddleware,\n applyEventMiddleware,\n callMiddlewareComplete,\n callMiddlewareError,\n} from './middleware';\nimport type { ChatMiddleware, MiddlewareRequest } from './middleware';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Stream event type - matches @ash-cloud/client StreamEvent\n * We define it here to avoid a hard dependency on the client package\n */\nexport interface StreamEvent {\n type: string;\n sessionId?: string;\n claudeSessionId?: string;\n delta?: string;\n text?: string;\n /** Message content array (for 'message' events) */\n content?: unknown;\n toolId?: string;\n toolName?: string;\n input?: unknown;\n toolResult?: unknown;\n isError?: boolean;\n error?: string;\n code?: string;\n status?: string;\n result?: string;\n totalCost?: number;\n totalTokens?: number;\n /** SSE event ID (sequence number from relay) for reconnection */\n id?: string;\n entry?: {\n timestamp: string;\n level: string;\n category: string;\n message: string;\n data?: Record<string, unknown>;\n };\n}\n\n/**\n * Async generator that yields StreamEvent objects\n */\nexport type StreamGenerator = AsyncGenerator<StreamEvent, void, unknown>;\n\n/**\n * Options passed to CreateStreamFn\n */\nexport interface CreateStreamOptions {\n /** AbortSignal to cancel the request */\n signal?: AbortSignal;\n /** Additional metadata from onBeforeSend/middleware */\n metadata?: Record<string, unknown>;\n /** Session context from onBeforeSend/middleware */\n sessionContext?: string;\n}\n\n/**\n * Function that creates a stream of events\n * This matches the signature of client.agents.run() and client.sessions.send()\n *\n * @example\n * ```tsx\n * createStream: (prompt, sessionId, options) => {\n * if (sessionId) {\n * return client.sessions.send(sessionId, prompt, {\n * signal: options?.signal,\n * sessionContext: options?.sessionContext,\n * metadata: options?.metadata,\n * });\n * }\n * return client.agents.run(agentId, prompt, {\n * signal: options?.signal,\n * sessionContext: options?.sessionContext,\n * metadata: options?.metadata,\n * });\n * }\n * ```\n */\nexport type CreateStreamFn = (\n prompt: string,\n sessionId?: string,\n options?: CreateStreamOptions\n) => StreamGenerator;\n\n/**\n * Function that subscribes to an existing session's events\n * This is used for auto-reconnection when the primary stream is interrupted\n */\nexport type SubscribeToSessionFn = (sessionId: string, signal?: AbortSignal) => StreamGenerator;\n\n/**\n * Context passed to onBeforeSend hook\n */\nexport interface BeforeSendContext {\n /** The user's prompt */\n prompt: string;\n /** Current session ID (null for new conversations) */\n sessionId: string | null;\n /** Current entries in the conversation */\n entries: NormalizedEntry[];\n}\n\n/**\n * Result returned from onBeforeSend hook\n * Return void or omit fields to keep original values\n */\nexport interface BeforeSendResult {\n /** Modified prompt to send */\n prompt?: string;\n /** Additional metadata to include with the request */\n metadata?: Record<string, unknown>;\n /** Additional context to prepend to the session */\n sessionContext?: string;\n /** If true, cancels the send operation */\n cancel?: boolean;\n}\n\n/**\n * Options for useAgentChat\n */\nexport interface UseAgentChatOptions {\n /**\n * Function to create a stream of events.\n * Can wrap client.agents.run() or client.sessions.send()\n *\n * @example\n * ```tsx\n * createStream: (prompt, sessionId, signal) => {\n * if (sessionId) {\n * return client.sessions.send(sessionId, prompt, { signal });\n * }\n * return client.agents.run(agentId, prompt, { signal });\n * }\n * ```\n */\n createStream: CreateStreamFn;\n\n /**\n * Function to subscribe to an existing session for reconnection.\n * If provided, enables auto-reconnection when the stream is interrupted.\n *\n * @example\n * ```tsx\n * subscribeToSession: (sessionId, signal) => {\n * return client.sessions.subscribe(sessionId, { signal });\n * }\n * ```\n */\n subscribeToSession?: SubscribeToSessionFn;\n\n /**\n * Initial session ID (for resuming a conversation)\n */\n initialSessionId?: string;\n\n /**\n * Initial entries to display (e.g., from loading history)\n */\n initialEntries?: NormalizedEntry[];\n\n /**\n * Callback when session starts\n */\n onSessionStart?: (sessionId: string) => void;\n\n /**\n * Callback when session ends\n */\n onSessionEnd?: (sessionId: string, status: string) => void;\n\n /**\n * Callback when an error occurs\n */\n onError?: (error: string) => void;\n\n /**\n * Callback for sandbox log events\n */\n onSandboxLog?: (entry: NonNullable<StreamEvent['entry']>) => void;\n\n /**\n * Callback when reconnection is attempted\n */\n onReconnect?: (attempt: number, sessionId: string) => void;\n\n /**\n * Maximum number of reconnection attempts (default: 3)\n */\n maxReconnectAttempts?: number;\n\n /**\n * Base delay for exponential backoff in ms (default: 1000)\n */\n reconnectBaseDelay?: number;\n\n /**\n * Called before each message is sent.\n * Use for pre-flight work like file synchronization, validation, or adding context.\n * Return { cancel: true } to prevent the message from being sent.\n *\n * @example\n * ```tsx\n * onBeforeSend: async ({ prompt, sessionId }) => {\n * await syncFilesToSandbox(sessionId);\n * return {\n * sessionContext: `Current file: ${currentFile}`,\n * metadata: { version: '1.0' },\n * };\n * }\n * ```\n */\n onBeforeSend?: (context: BeforeSendContext) => Promise<BeforeSendResult | void> | BeforeSendResult | void;\n\n /**\n * Called for every raw stream event before internal processing.\n * Use for logging, analytics, or detecting specific events.\n *\n * @example\n * ```tsx\n * onEvent: (event) => {\n * if (event.type === 'tool_result' && event.toolName === 'browser_navigate') {\n * updatePreview(event.toolResult?.url);\n * }\n * }\n * ```\n */\n onEvent?: (event: StreamEvent) => void | Promise<void>;\n\n /**\n * Array of middleware for composable request/event transforms.\n * Middleware are executed in order. Each can modify requests,\n * transform events, or filter events by returning null.\n *\n * @example\n * ```tsx\n * middleware: [\n * {\n * onRequest: async (req) => ({\n * metadata: { ...req.metadata, timestamp: Date.now() },\n * }),\n * onEvent: (event) => {\n * // Filter out sandbox_log events\n * if (event.type === 'sandbox_log') return null;\n * return event;\n * },\n * },\n * ]\n * ```\n */\n middleware?: ChatMiddleware[];\n}\n\n/**\n * Return type for useAgentChat\n */\nexport interface UseAgentChatReturn {\n /**\n * All entries to display (history + streaming content)\n * This is the single source of truth for rendering\n */\n entries: NormalizedEntry[];\n\n /**\n * Whether a message is currently being streamed\n */\n isStreaming: boolean;\n\n /**\n * Whether the hook is attempting to reconnect after a stream interruption\n */\n isReconnecting: boolean;\n\n /**\n * Current error message (if any)\n */\n error: string | null;\n\n /**\n * Current session ID\n */\n sessionId: string | null;\n\n /**\n * Send a message to the agent\n */\n send: (prompt: string) => Promise<void>;\n\n /**\n * Stop the current streaming request\n */\n stop: () => void;\n\n /**\n * Clear all entries and start fresh\n */\n clear: () => void;\n\n /**\n * Set entries from external source (e.g., loading from server)\n * This replaces all entries and clears streaming state\n */\n setEntries: (entries: NormalizedEntry[]) => void;\n\n /**\n * Last seen SSE sequence number.\n * Use this for reconnection via the relay endpoint: GET /sessions/:id/stream?after=lastSequence\n */\n lastSequence: number;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\nexport function useAgentChat(options: UseAgentChatOptions): UseAgentChatReturn {\n const {\n createStream,\n subscribeToSession,\n initialSessionId,\n initialEntries = [],\n onSessionStart,\n onSessionEnd,\n onError,\n onSandboxLog,\n onReconnect,\n maxReconnectAttempts = 3,\n reconnectBaseDelay = 1000,\n onBeforeSend,\n onEvent,\n middleware,\n } = options;\n\n // Core state\n const [historyEntries, setHistoryEntries] = useState<NormalizedEntry[]>(initialEntries);\n const [streamingEntries, setStreamingEntries] = useState<NormalizedEntry[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isReconnecting, setIsReconnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [sessionId, setSessionId] = useState<string | null>(initialSessionId || null);\n\n // Refs for streaming state management\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentTextRef = useRef<string>('');\n const currentTextIdRef = useRef<string | null>(null);\n const pendingToolCallsRef = useRef<Map<string, { entryIndex: number; toolCall: NormalizedToolCall }>>(new Map());\n const hadToolCallSinceTextRef = useRef<boolean>(false);\n const reconnectAttemptsRef = useRef<number>(0);\n const eventCountRef = useRef<number>(0);\n const sessionIdRef = useRef<string | null>(sessionId);\n const streamingEntriesRef = useRef<NormalizedEntry[]>([]);\n /** Track the last SSE sequence number for relay reconnection */\n const lastSequenceRef = useRef<number>(0);\n\n // Keep refs in sync with state\n useEffect(() => {\n sessionIdRef.current = sessionId;\n }, [sessionId]);\n\n useEffect(() => {\n streamingEntriesRef.current = streamingEntries;\n }, [streamingEntries]);\n\n // Combined entries (history + streaming) - no duplicates\n const entries = [...historyEntries, ...streamingEntries];\n\n // Helper to emit streaming entries\n const emitStreamingEntries = useCallback((newEntries: NormalizedEntry[]) => {\n setStreamingEntries([...newEntries]);\n }, []);\n\n // Helper to create a text entry\n const createTextEntry = useCallback((id: string, content: string): NormalizedEntry => ({\n id,\n timestamp: new Date().toISOString(),\n entryType: { type: 'assistant_message' },\n content,\n }), []);\n\n // Reset streaming state\n const resetStreamingState = useCallback(() => {\n currentTextRef.current = '';\n currentTextIdRef.current = null;\n pendingToolCallsRef.current.clear();\n hadToolCallSinceTextRef.current = false;\n setStreamingEntries([]);\n }, []);\n\n // Process a streaming event\n const processEvent = useCallback((event: StreamEvent, streamEntries: NormalizedEntry[]): NormalizedEntry[] => {\n // Track sequence number for relay reconnection\n if (event.id) {\n const seq = parseInt(event.id, 10);\n if (!isNaN(seq)) {\n lastSequenceRef.current = seq;\n }\n }\n\n const newEntries = [...streamEntries];\n\n switch (event.type) {\n case 'session_start':\n if (event.sessionId) {\n setSessionId(event.sessionId);\n onSessionStart?.(event.sessionId);\n }\n break;\n\n case 'text_delta':\n if (event.delta) {\n // If there was a tool call since last text, start a new text entry\n if (hadToolCallSinceTextRef.current && currentTextIdRef.current) {\n currentTextRef.current = '';\n currentTextIdRef.current = null;\n hadToolCallSinceTextRef.current = false;\n }\n\n currentTextRef.current += event.delta;\n\n if (!currentTextIdRef.current) {\n // Create new text entry\n currentTextIdRef.current = `text-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n newEntries.push(createTextEntry(currentTextIdRef.current, currentTextRef.current));\n } else {\n // Update existing text entry\n const entryIndex = newEntries.findIndex((e) => e.id === currentTextIdRef.current);\n if (entryIndex !== -1) {\n newEntries[entryIndex] = createTextEntry(currentTextIdRef.current, currentTextRef.current);\n }\n }\n }\n break;\n\n case 'tool_use':\n if (event.toolId && event.toolName) {\n // Finalize current text\n currentTextRef.current = '';\n currentTextIdRef.current = null;\n hadToolCallSinceTextRef.current = true;\n\n const toolCall = createToolCall({\n id: event.toolId,\n name: event.toolName,\n input: event.input,\n });\n\n const entry: NormalizedEntry = {\n id: event.toolId,\n timestamp: new Date().toISOString(),\n entryType: { type: 'tool_call', toolCall },\n content: toolCall.summary,\n };\n\n const entryIndex = newEntries.length;\n newEntries.push(entry);\n\n pendingToolCallsRef.current.set(event.toolId, { entryIndex, toolCall });\n }\n break;\n\n case 'tool_result':\n if (event.toolId) {\n const pending = pendingToolCallsRef.current.get(event.toolId);\n if (pending) {\n const updatedToolCall = updateToolCallWithResult(\n pending.toolCall,\n event.toolResult,\n event.isError\n );\n\n const existingEntry = newEntries[pending.entryIndex];\n if (existingEntry && existingEntry.entryType.type === 'tool_call') {\n newEntries[pending.entryIndex] = {\n ...existingEntry,\n entryType: { type: 'tool_call', toolCall: updatedToolCall },\n };\n }\n\n pendingToolCallsRef.current.delete(event.toolId);\n }\n }\n break;\n\n case 'text':\n // Complete text block - only use if no text_delta events were received\n // This is a fallback for non-streaming responses or loading past messages\n if (event.text && !currentTextRef.current) {\n currentTextIdRef.current = `text-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n currentTextRef.current = event.text;\n newEntries.push(createTextEntry(currentTextIdRef.current, currentTextRef.current));\n }\n // If we already have text from text_delta, ignore to avoid duplication\n break;\n\n case 'message':\n // Complete message - only use if no text_delta events were received\n // This handles loading past messages or non-streaming responses\n if (event.content && !currentTextRef.current) {\n const messageContent = event.content as Array<{ type: string; text?: string }>;\n const textBlock = messageContent?.find((c) => c.type === 'text');\n if (textBlock?.text) {\n currentTextIdRef.current = `text-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n currentTextRef.current = textBlock.text;\n newEntries.push(createTextEntry(currentTextIdRef.current, currentTextRef.current));\n }\n }\n // If we already have text from text_delta, ignore to avoid duplication\n break;\n\n case 'sandbox_log':\n if (event.entry) {\n onSandboxLog?.(event.entry);\n }\n break;\n\n case 'error':\n if (event.error) {\n setError(event.error);\n onError?.(event.error);\n\n // Add error entry\n newEntries.push({\n id: `error-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n timestamp: new Date().toISOString(),\n entryType: { type: 'error', message: event.error, code: event.code },\n content: event.error,\n });\n }\n break;\n\n case 'session_end':\n onSessionEnd?.(event.sessionId || sessionId || '', event.status || 'completed');\n break;\n\n case 'complete':\n // Streaming is complete - finalize entries\n // Move streaming entries to history\n if (newEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...newEntries]);\n }\n resetStreamingState();\n return []; // Return empty - entries moved to history\n }\n\n return newEntries;\n }, [sessionId, onSessionStart, onSessionEnd, onError, onSandboxLog, createTextEntry, resetStreamingState]);\n\n // Attempt to reconnect to an existing session\n const attemptReconnect = useCallback(async (\n targetSessionId: string,\n currentEntries: NormalizedEntry[]\n ): Promise<boolean> => {\n if (!subscribeToSession) {\n return false;\n }\n\n const attempt = reconnectAttemptsRef.current + 1;\n if (attempt > maxReconnectAttempts) {\n console.warn(`[useAgentChat] Max reconnection attempts (${maxReconnectAttempts}) exceeded`);\n return false;\n }\n\n reconnectAttemptsRef.current = attempt;\n setIsReconnecting(true);\n onReconnect?.(attempt, targetSessionId);\n\n // Exponential backoff: 1s, 2s, 4s, etc.\n const delay = reconnectBaseDelay * Math.pow(2, attempt - 1);\n console.log(`[useAgentChat] Reconnection attempt ${attempt}/${maxReconnectAttempts} in ${delay}ms`);\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n // Create new abort controller for reconnection\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n try {\n const stream = subscribeToSession(targetSessionId, controller.signal);\n let localStreamingEntries = [...currentEntries];\n\n for await (const event of stream) {\n if (controller.signal.aborted) break;\n\n // Track events to know if we're receiving data\n eventCountRef.current++;\n\n localStreamingEntries = processEvent(event, localStreamingEntries);\n emitStreamingEntries(localStreamingEntries);\n\n // Check for terminal events\n if (event.type === 'complete' || event.type === 'session_end' || event.type === 'error') {\n // Successfully completed - reset reconnect counter\n reconnectAttemptsRef.current = 0;\n setIsReconnecting(false);\n\n // Move entries to history if complete\n if (event.type === 'complete' && localStreamingEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...localStreamingEntries]);\n setStreamingEntries([]);\n }\n return true;\n }\n }\n\n // Stream ended normally\n reconnectAttemptsRef.current = 0;\n setIsReconnecting(false);\n if (localStreamingEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...localStreamingEntries]);\n setStreamingEntries([]);\n }\n return true;\n } catch (err) {\n const isAbort = (err as Error).name === 'AbortError' ||\n (err as Error).message?.includes('aborted') ||\n (err as Error).message?.includes('BodyStreamBuffer');\n\n if (isAbort && !controller.signal.aborted) {\n // Connection dropped again, try another reconnect\n console.log(`[useAgentChat] Reconnection stream interrupted, will retry...`);\n setIsReconnecting(false);\n return attemptReconnect(targetSessionId, streamingEntriesRef.current);\n }\n\n // Non-abort error or user-initiated abort\n setIsReconnecting(false);\n if (!controller.signal.aborted) {\n const errorMessage = err instanceof Error ? err.message : 'Reconnection failed';\n console.error(`[useAgentChat] Reconnection failed:`, errorMessage);\n }\n return false;\n }\n }, [subscribeToSession, maxReconnectAttempts, reconnectBaseDelay, onReconnect, processEvent, emitStreamingEntries]);\n\n // Send a message\n const send = useCallback(async (prompt: string) => {\n if (isStreaming) return;\n\n // Prepare request variables\n let finalPrompt = prompt;\n let additionalMetadata: Record<string, unknown> = {};\n let additionalContext: string | undefined;\n\n // 1. Call onBeforeSend hook\n if (onBeforeSend) {\n try {\n const result = await onBeforeSend({\n prompt,\n sessionId,\n entries: [...historyEntries, ...streamingEntries],\n });\n if (result?.cancel) {\n return; // Cancel the send\n }\n if (result?.prompt !== undefined) finalPrompt = result.prompt;\n if (result?.metadata) additionalMetadata = result.metadata;\n if (result?.sessionContext) additionalContext = result.sessionContext;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Send cancelled';\n setError(errorMessage);\n onError?.(errorMessage);\n return;\n }\n }\n\n // 2. Apply request middleware\n if (middleware?.length) {\n const middlewareRequest: MiddlewareRequest = {\n prompt: finalPrompt,\n sessionId,\n metadata: additionalMetadata,\n sessionContext: additionalContext,\n };\n const { request, error: middlewareError } = await applyRequestMiddleware(middleware, middlewareRequest);\n if (middlewareError) {\n setError(middlewareError);\n onError?.(middlewareError);\n await callMiddlewareError(middleware, middlewareError);\n return;\n }\n finalPrompt = request.prompt;\n additionalMetadata = request.metadata || {};\n additionalContext = request.sessionContext;\n }\n\n setIsStreaming(true);\n setError(null);\n reconnectAttemptsRef.current = 0;\n eventCountRef.current = 0;\n\n // Add user message to history (use original prompt for display)\n const userEntry: NormalizedEntry = {\n id: `user-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n timestamp: new Date().toISOString(),\n entryType: { type: 'user_message' },\n content: prompt,\n };\n setHistoryEntries((prev) => [...prev, userEntry]);\n\n // Reset streaming state\n resetStreamingState();\n\n // Create abort controller\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n let localStreamingEntries: NormalizedEntry[] = [];\n let completedSessionId: string | null = null;\n\n try {\n // Pass metadata and sessionContext through to createStream\n const stream = createStream(finalPrompt, sessionId || undefined, {\n signal: controller.signal,\n metadata: Object.keys(additionalMetadata).length > 0 ? additionalMetadata : undefined,\n sessionContext: additionalContext,\n });\n\n for await (const event of stream) {\n if (controller.signal.aborted) break;\n\n // Track events received\n eventCountRef.current++;\n\n // Capture session ID for middleware completion callback\n if (event.type === 'session_start' && event.sessionId) {\n completedSessionId = event.sessionId;\n }\n\n // 3. Call onEvent hook (raw event)\n if (onEvent) {\n try {\n await onEvent(event);\n } catch (err) {\n console.error('[useAgentChat] onEvent error:', err);\n }\n }\n\n // 4. Apply event middleware\n let processedEvent: StreamEvent | null = event;\n if (middleware?.length) {\n processedEvent = await applyEventMiddleware(middleware, event);\n }\n\n // Skip filtered events\n if (!processedEvent) continue;\n\n localStreamingEntries = processEvent(processedEvent, localStreamingEntries);\n emitStreamingEntries(localStreamingEntries);\n }\n\n // Streaming completed - move remaining entries to history\n if (localStreamingEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...localStreamingEntries]);\n setStreamingEntries([]);\n }\n\n // Reset reconnect counter on successful completion\n reconnectAttemptsRef.current = 0;\n\n // 5. Call middleware completion handlers\n if (middleware?.length && (completedSessionId || sessionIdRef.current)) {\n await callMiddlewareComplete(middleware, completedSessionId || sessionIdRef.current || '');\n }\n } catch (err) {\n const isAbort = (err as Error).name === 'AbortError' ||\n (err as Error).message?.includes('aborted') ||\n (err as Error).message?.includes('BodyStreamBuffer');\n\n if (isAbort && !controller.signal.aborted) {\n // Stream was interrupted (not user-initiated abort)\n // Check if we have a session and received events - if so, try to reconnect\n const currentSessionId = sessionIdRef.current;\n const hadEvents = eventCountRef.current > 0;\n\n console.log(`[useAgentChat] Stream interrupted. sessionId=${currentSessionId}, events=${eventCountRef.current}`);\n\n if (currentSessionId && hadEvents && subscribeToSession) {\n console.log(`[useAgentChat] Attempting auto-reconnection...`);\n const reconnected = await attemptReconnect(currentSessionId, streamingEntriesRef.current);\n if (reconnected) {\n // Reconnection successful, don't set error\n return;\n }\n // Reconnection failed, fall through to set error\n const errorMsg = 'Connection lost. Please try again.';\n setError(errorMsg);\n onError?.(errorMsg);\n if (middleware?.length) {\n await callMiddlewareError(middleware, errorMsg);\n }\n }\n // No session or no events yet - just let it end silently (user probably aborted)\n } else if (!isAbort) {\n // Non-abort error\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n onError?.(errorMessage);\n if (middleware?.length) {\n await callMiddlewareError(middleware, errorMessage);\n }\n }\n } finally {\n setIsStreaming(false);\n setIsReconnecting(false);\n abortControllerRef.current = null;\n resetStreamingState();\n }\n }, [isStreaming, sessionId, historyEntries, streamingEntries, createStream, subscribeToSession, processEvent, emitStreamingEntries, resetStreamingState, onError, attemptReconnect, onBeforeSend, onEvent, middleware]);\n\n // Stop streaming (also cancels any reconnection attempts)\n const stop = useCallback(() => {\n // Reset reconnection state to prevent further attempts\n reconnectAttemptsRef.current = maxReconnectAttempts + 1;\n setIsReconnecting(false);\n\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, [maxReconnectAttempts]);\n\n // Clear all entries\n const clear = useCallback(() => {\n setHistoryEntries([]);\n resetStreamingState();\n setSessionId(initialSessionId || null);\n setError(null);\n setIsReconnecting(false);\n reconnectAttemptsRef.current = 0;\n eventCountRef.current = 0;\n }, [initialSessionId, resetStreamingState]);\n\n // Set entries from external source\n const setEntries = useCallback((newEntries: NormalizedEntry[]) => {\n resetStreamingState();\n setHistoryEntries(newEntries);\n }, [resetStreamingState]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return {\n entries,\n isStreaming,\n isReconnecting,\n error,\n sessionId,\n send,\n stop,\n clear,\n setEntries,\n lastSequence: lastSequenceRef.current,\n };\n}\n\nexport default useAgentChat;\n","/**\n * useChat - AI SDK compatible chat hook for ash-cloud\n *\n * This hook provides an interface compatible with AI SDK's useChat hook\n * while using ash-cloud's streaming infrastructure under the hood.\n *\n * @example\n * ```tsx\n * import { useChat } from '@ash-cloud/ash-ui';\n *\n * function Chat() {\n * const {\n * messages,\n * isLoading,\n * append,\n * stop,\n * setMessages,\n * } = useChat({\n * createStream: (prompt, sessionId) => client.agents.run(agentId, prompt),\n * onToolCall: ({ toolCall }) => console.log('Tool called:', toolCall.toolName),\n * });\n *\n * return (\n * <Conversation>\n * {messages.map((m) => (\n * <Message key={m.id} from={m.role}>{m.content}</Message>\n * ))}\n * </Conversation>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type {\n Message,\n ToolInvocation,\n NormalizedEntry,\n} from '../types';\nimport {\n messagesToNormalizedEntries,\n} from '../types';\nimport {\n applyRequestMiddleware,\n applyEventMiddleware,\n callMiddlewareComplete,\n callMiddlewareError,\n} from './middleware';\nimport type { ChatMiddleware, MiddlewareRequest } from './middleware';\nimport type { StreamEvent, StreamGenerator, CreateStreamFn, CreateStreamOptions } from './useAgentChat';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Message to append to the conversation\n */\nexport interface CreateMessage {\n /** Message ID (auto-generated if not provided) */\n id?: string;\n /** Message role */\n role: 'user' | 'assistant' | 'system' | 'data';\n /** Message content */\n content: string;\n /** Tool invocations */\n toolInvocations?: ToolInvocation[];\n /** Reasoning content */\n reasoning?: string;\n}\n\n/**\n * Options for appending a message\n */\nexport interface ChatRequestOptions {\n /** Additional data to include with the request */\n data?: Record<string, unknown>;\n /** Additional body parameters */\n body?: Record<string, unknown>;\n}\n\n/**\n * Tool call handler callback\n */\nexport interface ToolCallHandler {\n /** The tool invocation */\n toolCall: ToolInvocation;\n}\n\n/**\n * Options for useChat hook\n */\nexport interface UseChatOptions {\n /**\n * Function to create a stream of events.\n * Can wrap client.agents.run() or client.sessions.send()\n */\n createStream: CreateStreamFn;\n\n /**\n * Function to subscribe to an existing session for reconnection.\n */\n subscribeToSession?: (sessionId: string, signal?: AbortSignal) => StreamGenerator;\n\n /**\n * Initial session ID (for resuming a conversation)\n */\n initialSessionId?: string;\n\n /**\n * Initial messages to display\n */\n initialMessages?: Message[];\n\n /**\n * Callback when a tool is called\n */\n onToolCall?: (handler: ToolCallHandler) => void;\n\n /**\n * Callback when streaming finishes\n */\n onFinish?: (message: Message) => void;\n\n /**\n * Callback when an error occurs\n */\n onError?: (error: Error) => void;\n\n /**\n * Callback when session starts\n */\n onSessionStart?: (sessionId: string) => void;\n\n /**\n * Maximum number of reconnection attempts\n */\n maxReconnectAttempts?: number;\n\n /**\n * Base delay for exponential backoff in ms\n */\n reconnectBaseDelay?: number;\n\n /**\n * Middleware for composable request/event transforms\n */\n middleware?: ChatMiddleware[];\n}\n\n/**\n * Return type for useChat\n */\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: Message[];\n\n /** Whether a message is currently being streamed */\n isLoading: boolean;\n\n /** Current error (if any) */\n error: Error | undefined;\n\n /** Current session ID */\n sessionId: string | null;\n\n /** Append a message to the conversation and stream response */\n append: (\n message: CreateMessage | string,\n options?: ChatRequestOptions\n ) => Promise<string | null | undefined>;\n\n /** Stop the current streaming request */\n stop: () => void;\n\n /** Set messages (replace all) */\n setMessages: (messages: Message[]) => void;\n\n /** Reload the last assistant message */\n reload: () => Promise<string | null | undefined>;\n\n /** The current input value (for controlled input) */\n input: string;\n\n /** Set the input value */\n setInput: (input: string) => void;\n\n /** Handle input change (for form inputs) */\n handleInputChange: (\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => void;\n\n /** Handle form submission */\n handleSubmit: (\n e?: React.FormEvent<HTMLFormElement>,\n options?: ChatRequestOptions\n ) => void;\n\n /** Whether currently reconnecting after stream interruption */\n isReconnecting: boolean;\n\n /**\n * Legacy: Get entries in NormalizedEntry format\n * For backwards compatibility during migration\n */\n entries: NormalizedEntry[];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction generateId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const {\n createStream,\n // subscribeToSession, // TODO: implement reconnection support\n initialSessionId,\n initialMessages = [],\n onToolCall,\n onFinish,\n onError,\n onSessionStart,\n maxReconnectAttempts = 3,\n // reconnectBaseDelay = 1000, // TODO: implement reconnection support\n middleware,\n } = options;\n\n // Core state\n const [messages, setMessages] = useState<Message[]>(initialMessages);\n const [isLoading, setIsLoading] = useState(false);\n const [isReconnecting, setIsReconnecting] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [sessionId, setSessionId] = useState<string | null>(initialSessionId || null);\n const [input, setInput] = useState('');\n\n // Refs for streaming state management\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentAssistantMessageRef = useRef<Message | null>(null);\n const reconnectAttemptsRef = useRef<number>(0);\n const sessionIdRef = useRef<string | null>(sessionId);\n\n // Keep session ref in sync\n useEffect(() => {\n sessionIdRef.current = sessionId;\n }, [sessionId]);\n\n // Convert messages to entries for backwards compatibility\n const entries = messagesToNormalizedEntries(messages);\n\n // Helper to update the current streaming assistant message\n const updateStreamingMessage = useCallback((updater: (msg: Message) => Message) => {\n if (!currentAssistantMessageRef.current) return;\n\n currentAssistantMessageRef.current = updater(currentAssistantMessageRef.current);\n\n const currentMsg = currentAssistantMessageRef.current;\n setMessages((prev) => {\n const lastIndex = prev.length - 1;\n const lastMessage = prev[lastIndex];\n if (lastIndex >= 0 && lastMessage && currentMsg && lastMessage.id === currentMsg.id) {\n return [...prev.slice(0, lastIndex), currentMsg];\n }\n return prev;\n });\n }, []);\n\n // Process a streaming event\n const processEvent = useCallback((event: StreamEvent) => {\n switch (event.type) {\n case 'session_start':\n if (event.sessionId) {\n setSessionId(event.sessionId);\n onSessionStart?.(event.sessionId);\n }\n break;\n\n case 'text_delta':\n if (event.delta) {\n updateStreamingMessage((msg) => ({\n ...msg,\n content: msg.content + event.delta,\n }));\n }\n break;\n\n case 'tool_use':\n if (event.toolId && event.toolName) {\n const toolInvocation: ToolInvocation = {\n state: 'call',\n toolCallId: event.toolId,\n toolName: event.toolName,\n args: (event.input as Record<string, unknown>) || {},\n };\n\n updateStreamingMessage((msg) => ({\n ...msg,\n toolInvocations: [...(msg.toolInvocations || []), toolInvocation],\n }));\n\n onToolCall?.({ toolCall: toolInvocation });\n }\n break;\n\n case 'tool_result':\n if (event.toolId) {\n updateStreamingMessage((msg) => ({\n ...msg,\n toolInvocations: msg.toolInvocations?.map((inv) =>\n inv.toolCallId === event.toolId\n ? { ...inv, state: 'result' as const, result: event.toolResult }\n : inv\n ),\n }));\n }\n break;\n\n case 'text':\n // Complete text block - fallback for non-streaming\n if (event.text && !currentAssistantMessageRef.current?.content) {\n updateStreamingMessage((msg) => ({\n ...msg,\n content: event.text || '',\n }));\n }\n break;\n\n case 'error':\n if (event.error) {\n const err = new Error(event.error);\n setError(err);\n onError?.(err);\n }\n break;\n\n case 'complete':\n if (currentAssistantMessageRef.current) {\n onFinish?.(currentAssistantMessageRef.current);\n }\n break;\n }\n }, [updateStreamingMessage, onToolCall, onFinish, onError, onSessionStart]);\n\n // Append a message and stream response\n const append = useCallback(async (\n messageOrContent: CreateMessage | string,\n options?: ChatRequestOptions\n ): Promise<string | null | undefined> => {\n if (isLoading) return null;\n\n // Create user message\n const userMessage: Message = typeof messageOrContent === 'string'\n ? {\n id: generateId(),\n role: 'user',\n content: messageOrContent,\n createdAt: new Date(),\n }\n : {\n id: messageOrContent.id || generateId(),\n role: messageOrContent.role,\n content: messageOrContent.content,\n toolInvocations: messageOrContent.toolInvocations,\n reasoning: messageOrContent.reasoning,\n createdAt: new Date(),\n };\n\n // Add user message to state\n setMessages((prev) => [...prev, userMessage]);\n\n // Start streaming\n setIsLoading(true);\n setError(undefined);\n reconnectAttemptsRef.current = 0;\n\n // Create assistant message placeholder\n const assistantMessage: Message = {\n id: generateId(),\n role: 'assistant',\n content: '',\n createdAt: new Date(),\n };\n currentAssistantMessageRef.current = assistantMessage;\n setMessages((prev) => [...prev, assistantMessage]);\n\n // Create abort controller\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n try {\n // Apply middleware to request\n let finalPrompt = userMessage.content;\n let additionalMetadata: Record<string, unknown> = options?.body || {};\n\n if (middleware?.length) {\n const middlewareRequest: MiddlewareRequest = {\n prompt: finalPrompt,\n sessionId: sessionIdRef.current,\n metadata: additionalMetadata,\n };\n const { request, error: middlewareError } = await applyRequestMiddleware(middleware, middlewareRequest);\n if (middlewareError) {\n const err = new Error(middlewareError);\n setError(err);\n onError?.(err);\n setIsLoading(false);\n return null;\n }\n finalPrompt = request.prompt;\n additionalMetadata = request.metadata || {};\n }\n\n // Create stream\n const streamOptions: CreateStreamOptions = {\n signal: controller.signal,\n metadata: Object.keys(additionalMetadata).length > 0 ? additionalMetadata : undefined,\n };\n const stream = createStream(finalPrompt, sessionIdRef.current || undefined, streamOptions);\n\n // Process stream events\n for await (const event of stream) {\n if (controller.signal.aborted) break;\n\n // Apply event middleware\n let processedEvent: StreamEvent | null = event;\n if (middleware?.length) {\n processedEvent = await applyEventMiddleware(middleware, event);\n }\n\n if (processedEvent) {\n processEvent(processedEvent);\n }\n }\n\n // Call middleware completion\n if (middleware?.length && sessionIdRef.current) {\n await callMiddlewareComplete(middleware, sessionIdRef.current);\n }\n\n return assistantMessage.id;\n } catch (err) {\n const isAbort = (err as Error).name === 'AbortError';\n\n if (!isAbort) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n\n if (middleware?.length) {\n await callMiddlewareError(middleware, error.message);\n }\n }\n\n return null;\n } finally {\n setIsLoading(false);\n setIsReconnecting(false);\n abortControllerRef.current = null;\n currentAssistantMessageRef.current = null;\n }\n }, [isLoading, createStream, processEvent, middleware, onError]);\n\n // Stop streaming\n const stop = useCallback(() => {\n reconnectAttemptsRef.current = maxReconnectAttempts + 1;\n setIsReconnecting(false);\n\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, [maxReconnectAttempts]);\n\n // Reload last assistant message\n const reload = useCallback(async (): Promise<string | null | undefined> => {\n // Find the last user message (iterate backwards)\n let lastUserMessageIndex = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === 'user') {\n lastUserMessageIndex = i;\n break;\n }\n }\n if (lastUserMessageIndex === -1) return null;\n\n const lastUserMessage = messages[lastUserMessageIndex];\n if (!lastUserMessage) return null;\n\n // Remove messages after the last user message\n setMessages(messages.slice(0, lastUserMessageIndex + 1));\n\n // Re-send the message\n return append(lastUserMessage);\n }, [messages, append]);\n\n // Handle input change\n const handleInputChange = useCallback((\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => {\n setInput(e.target.value);\n }, []);\n\n // Handle form submission\n const handleSubmit = useCallback((\n e?: React.FormEvent<HTMLFormElement>,\n options?: ChatRequestOptions\n ) => {\n e?.preventDefault();\n\n if (!input.trim()) return;\n\n const message = input;\n setInput('');\n append(message, options);\n }, [input, append]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return {\n messages,\n isLoading,\n error,\n sessionId,\n append,\n stop,\n setMessages,\n reload,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isReconnecting,\n entries,\n };\n}\n\nexport default useChat;\n","'use client';\n\nimport { useCallback, useState, ClipboardEvent } from 'react';\n\n/**\n * Configuration for long text auto-conversion\n */\nexport interface LongTextConversionOptions {\n /** Character threshold to trigger conversion (default: 5000) */\n threshold?: number;\n /** Filename template for converted attachments (default: 'pasted-text-{timestamp}.txt') */\n filenameTemplate?: string;\n /** Callback when text is converted to attachment */\n onConversion?: (info: ConversionInfo) => void;\n}\n\n/**\n * Information about a converted text attachment\n */\nexport interface ConversionInfo {\n /** Original text length */\n originalLength: number;\n /** Generated filename */\n filename: string;\n /** Truncated preview of the text (first 100 chars) */\n preview: string;\n /** Number of lines in the text */\n lineCount: number;\n}\n\n/**\n * Text attachment created from long pasted text\n */\nexport interface TextAttachment {\n /** Filename for the attachment */\n filename: string;\n /** Base64-encoded text content */\n content: string;\n /** MIME type (always 'text/plain') */\n mimeType: 'text/plain';\n /** Size in bytes */\n size: number;\n}\n\n/**\n * Result from the useLongTextConversion hook\n */\nexport interface UseLongTextConversionReturn {\n /**\n * Process text and convert to attachment if over threshold.\n * Returns the text if under threshold, or empty string if converted.\n */\n processText: (text: string) => { text: string; attachment?: TextAttachment };\n\n /**\n * Paste event handler that auto-converts long pasted text.\n * Use this on input elements: onPaste={handlePaste}\n */\n handlePaste: (\n event: ClipboardEvent<HTMLTextAreaElement | HTMLInputElement>,\n currentValue: string,\n setValue: (value: string) => void,\n addAttachment: (attachment: TextAttachment) => void\n ) => void;\n\n /**\n * Last conversion info (for showing notifications)\n */\n lastConversion: ConversionInfo | null;\n\n /**\n * Clear the last conversion info\n */\n clearLastConversion: () => void;\n\n /**\n * Current threshold value\n */\n threshold: number;\n}\n\n/**\n * Encode text to base64 (browser-safe for unicode)\n */\nfunction textToBase64(text: string): string {\n // Use TextEncoder for proper unicode handling\n const encoder = new TextEncoder();\n const bytes = encoder.encode(text);\n\n // Convert to base64\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n if (byte !== undefined) {\n binary += String.fromCharCode(byte);\n }\n }\n return btoa(binary);\n}\n\n/**\n * Generate filename from template\n */\nfunction generateFilename(template: string): string {\n const timestamp = Date.now();\n const date = new Date(timestamp);\n const dateStr = date.toISOString().split('T')[0] ?? 'unknown-date'; // YYYY-MM-DD\n const timeStr = (date.toTimeString().split(' ')[0] ?? '00-00-00').replace(/:/g, '-'); // HH-MM-SS\n\n return template\n .replace('{timestamp}', String(timestamp))\n .replace('{date}', dateStr)\n .replace('{time}', timeStr);\n}\n\n/**\n * Hook for automatically converting long pasted text into text file attachments.\n *\n * When users paste text over a certain threshold (default: 5000 characters),\n * the text is automatically converted to a .txt file attachment instead of\n * being inserted into the input field.\n *\n * @example\n * ```tsx\n * function ChatInput({ onSend }) {\n * const [value, setValue] = useState('');\n * const [files, setFiles] = useState<TextAttachment[]>([]);\n *\n * const { handlePaste, lastConversion, clearLastConversion } = useLongTextConversion({\n * threshold: 5000,\n * onConversion: (info) => {\n * console.log(`Converted ${info.originalLength} chars to ${info.filename}`);\n * }\n * });\n *\n * return (\n * <>\n * {lastConversion && (\n * <div className=\"notification\">\n * Long text ({lastConversion.originalLength} chars) converted to attachment\n * <button onClick={clearLastConversion}>Dismiss</button>\n * </div>\n * )}\n * <textarea\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * onPaste={(e) => handlePaste(e, value, setValue, (attachment) => {\n * setFiles(prev => [...prev, attachment]);\n * })}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function useLongTextConversion({\n threshold = 5000,\n filenameTemplate = 'pasted-text-{timestamp}.txt',\n onConversion,\n}: LongTextConversionOptions = {}): UseLongTextConversionReturn {\n const [lastConversion, setLastConversion] = useState<ConversionInfo | null>(null);\n\n /**\n * Process text and optionally convert to attachment\n */\n const processText = useCallback((text: string): { text: string; attachment?: TextAttachment } => {\n if (text.length <= threshold) {\n return { text };\n }\n\n const filename = generateFilename(filenameTemplate);\n const content = textToBase64(text);\n const encoder = new TextEncoder();\n const size = encoder.encode(text).length;\n const lineCount = text.split('\\n').length;\n\n const attachment: TextAttachment = {\n filename,\n content,\n mimeType: 'text/plain',\n size,\n };\n\n const preview = text.slice(0, 100) + (text.length > 100 ? '...' : '');\n const conversionInfo: ConversionInfo = {\n originalLength: text.length,\n filename,\n preview,\n lineCount,\n };\n\n setLastConversion(conversionInfo);\n onConversion?.(conversionInfo);\n\n return { text: '', attachment };\n }, [threshold, filenameTemplate, onConversion]);\n\n /**\n * Handle paste event with auto-conversion\n */\n const handlePaste = useCallback((\n event: ClipboardEvent<HTMLTextAreaElement | HTMLInputElement>,\n _currentValue: string,\n _setValue: (value: string) => void,\n addAttachment: (attachment: TextAttachment) => void\n ) => {\n const pastedText = event.clipboardData.getData('text/plain');\n\n if (pastedText.length > threshold) {\n // Prevent default paste behavior\n event.preventDefault();\n\n const result = processText(pastedText);\n\n if (result.attachment) {\n addAttachment(result.attachment);\n\n // Optionally add a placeholder or keep current value\n // Don't modify the input value - the attachment badge will show instead\n }\n }\n // For text under threshold, let the default paste behavior happen\n }, [threshold, processText]);\n\n /**\n * Clear the last conversion notification\n */\n const clearLastConversion = useCallback(() => {\n setLastConversion(null);\n }, []);\n\n return {\n processText,\n handlePaste,\n lastConversion,\n clearLastConversion,\n threshold,\n };\n}\n\nexport default useLongTextConversion;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/components/Conversation.tsx","../src/components/LazyMarkdown.tsx","../src/components/Mention.tsx","../src/components/RichContent.tsx","../src/components/Message.tsx","../src/components/StatusIndicator.tsx","../src/icons.tsx","../src/components/CodeBlock.tsx","../src/components/JsonDisplay.tsx","../src/components/Tool.tsx","../src/components/Reasoning.tsx","../src/components/Task.tsx","../src/components/Attachments.tsx","../src/components/Shimmer.tsx","../src/components/LogsPanel.tsx","../src/components/EnvVarsPanel.tsx","../src/components/OptionCards.tsx","../src/components/ActionIcon.tsx","../src/design-tokens.ts","../src/types.ts","../src/hooks/useMessageQueue.ts","../src/hooks/useStopExecution.ts","../src/hooks/useFileUpload.ts","../src/hooks/middleware.ts","../src/hooks/useAgentChat.ts","../src/hooks/useChat.ts","../src/hooks/useLongTextConversion.ts"],"names":["createContext","useContext","useRef","useState","useCallback","useEffect","jsx","jsxs","lazy","useMemo","Suspense","Fragment","formatFileSize","options","error"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @ash-cloud/ash-ui - Utilities\n *\n * Utility functions for normalizing and formatting tool calls\n * for display in agentic UIs.\n */\n\nimport type {\n ActionType,\n ToolResult,\n CommandRunResult,\n NormalizedToolCall,\n TodoItem,\n AgentToolAction,\n} from './types';\n\n// =============================================================================\n// Tool Name Formatting\n// =============================================================================\n\n/**\n * Format MCP tool names from mcp__server__tool to mcp:server:tool\n */\nexport function formatToolName(name: string): string {\n if (name.startsWith('mcp__')) {\n const parts = name.split('__');\n if (parts.length >= 3) {\n return `mcp:${parts[1]}:${parts.slice(2).join(':')}`;\n }\n }\n return name;\n}\n\n/**\n * Parse MCP tool name to extract server and tool names\n */\nexport function parseMcpToolName(name: string): { serverName: string; toolName: string } | null {\n if (name.startsWith('mcp__')) {\n const parts = name.split('__');\n if (parts.length >= 3 && parts[1] !== undefined) {\n return {\n serverName: parts[1],\n toolName: parts.slice(2).join('__'),\n };\n }\n }\n return null;\n}\n\n// =============================================================================\n// Action Type Mapping\n// =============================================================================\n\n/**\n * Map a tool name and input to a structured ActionType\n */\nexport function mapToolToActionType(toolName: string, input: unknown): ActionType {\n const inputObj = (input as Record<string, unknown>) || {};\n\n switch (toolName) {\n case 'Bash':\n return {\n action: 'command_run',\n command: (inputObj.command as string) || '',\n description: inputObj.description as string | undefined,\n };\n\n case 'Read': {\n const limit = inputObj.limit as number | undefined;\n return {\n action: 'file_read',\n path: (inputObj.file_path as string) || '',\n offset: inputObj.offset as number | undefined,\n limit,\n linesRead: limit, // Use limit as approximate lines read if specified\n };\n }\n\n case 'Edit': {\n const oldStr = inputObj.old_string as string | undefined;\n const newStr = inputObj.new_string as string | undefined;\n // Calculate line diff stats\n const oldLines = oldStr ? oldStr.split('\\n').length : 0;\n const newLines = newStr ? newStr.split('\\n').length : 0;\n return {\n action: 'file_edit',\n path: (inputObj.file_path as string) || '',\n oldString: oldStr,\n newString: newStr,\n replaceAll: inputObj.replace_all as boolean | undefined,\n linesAdded: newLines,\n linesRemoved: oldLines,\n };\n }\n\n case 'Write': {\n const content = inputObj.content as string | undefined;\n return {\n action: 'file_write',\n path: (inputObj.file_path as string) || '',\n content,\n linesWritten: content ? content.split('\\n').length : undefined,\n };\n }\n\n case 'Grep':\n return {\n action: 'search',\n pattern: (inputObj.pattern as string) || '',\n path: inputObj.path as string | undefined,\n glob: inputObj.glob as string | undefined,\n type: inputObj.type as string | undefined,\n };\n\n case 'Glob':\n return {\n action: 'glob',\n pattern: (inputObj.pattern as string) || '',\n path: inputObj.path as string | undefined,\n };\n\n case 'WebFetch':\n return {\n action: 'web_fetch',\n url: (inputObj.url as string) || '',\n prompt: inputObj.prompt as string | undefined,\n };\n\n case 'WebSearch':\n return {\n action: 'web_search',\n query: (inputObj.query as string) || '',\n };\n\n case 'TodoWrite': {\n const todos = (inputObj.todos as TodoItem[]) || [];\n const stats = {\n total: todos.length,\n completed: todos.filter((t) => t.status === 'completed').length,\n inProgress: todos.filter((t) => t.status === 'in_progress').length,\n pending: todos.filter((t) => t.status === 'pending').length,\n };\n return {\n action: 'todo_write',\n todos,\n stats,\n };\n }\n\n case 'Task': {\n return {\n action: 'agent_tool',\n agentType: (inputObj.subagent_type as string) || 'general-purpose',\n description: (inputObj.description as string) || '',\n prompt: inputObj.prompt as string | undefined,\n startedAt: new Date().toISOString(),\n toolCallCount: 0,\n };\n }\n\n default: {\n // Check if it's an MCP tool\n const mcpParts = parseMcpToolName(toolName);\n if (mcpParts) {\n return {\n action: 'mcp_tool',\n serverName: mcpParts.serverName,\n toolName: mcpParts.toolName,\n arguments: input,\n };\n }\n\n // Generic tool\n return {\n action: 'generic_tool',\n toolName: formatToolName(toolName),\n arguments: input,\n };\n }\n }\n}\n\n// =============================================================================\n// Summary Generation\n// =============================================================================\n\n/**\n * Generate a human-readable summary for a tool call\n */\nexport function generateToolSummary(\n _toolName: string,\n _input: unknown,\n actionType: ActionType\n): string {\n switch (actionType.action) {\n case 'command_run': {\n const cmd = actionType.command;\n return cmd.length > 60 ? cmd.substring(0, 57) + '...' : cmd;\n }\n\n case 'file_read':\n return actionType.path;\n\n case 'file_edit':\n return actionType.path;\n\n case 'file_write':\n return actionType.path;\n\n case 'search':\n return `${actionType.pattern}${actionType.path ? ` in ${actionType.path}` : ''}`;\n\n case 'glob':\n return actionType.pattern;\n\n case 'web_fetch':\n return actionType.url;\n\n case 'web_search':\n return actionType.query;\n\n case 'mcp_tool':\n return `${actionType.serverName}:${actionType.toolName}`;\n\n case 'generic_tool':\n return actionType.toolName;\n\n case 'todo_write': {\n const { stats } = actionType;\n if (stats) {\n return `${stats.completed}/${stats.total} completed`;\n }\n return `${actionType.todos.length} tasks`;\n }\n\n case 'agent_tool':\n return actionType.description;\n\n default:\n return 'Unknown tool';\n }\n}\n\n// =============================================================================\n// Result Normalization\n// =============================================================================\n\n/**\n * Extract text content from various content formats\n */\nexport function extractTextContent(content: unknown): string {\n if (typeof content === 'string') return content;\n\n if (Array.isArray(content)) {\n return content\n .filter((item): item is { text: string } => typeof item?.text === 'string')\n .map((item) => item.text)\n .join('\\n');\n }\n\n if (content && typeof content === 'object' && 'text' in content) {\n return String((content as { text: unknown }).text);\n }\n\n return JSON.stringify(content, null, 2);\n}\n\n/**\n * Normalize tool result content to markdown or JSON format\n */\nexport function normalizeToolResult(content: unknown): ToolResult {\n if (typeof content === 'string') {\n try {\n const parsed = JSON.parse(content);\n return { type: 'json', value: parsed };\n } catch {\n return { type: 'markdown', value: content };\n }\n }\n\n if (Array.isArray(content)) {\n const texts = content\n .filter(\n (item): item is { type: 'text'; text: string } =>\n item?.type === 'text' && typeof item.text === 'string'\n )\n .map((item) => item.text);\n\n if (texts.length > 0) {\n const joined = texts.join('\\n\\n');\n try {\n return { type: 'json', value: JSON.parse(joined) };\n } catch {\n return { type: 'markdown', value: joined };\n }\n }\n }\n\n return { type: 'json', value: content };\n}\n\n/**\n * Parse command result from tool result content\n */\nexport function parseCommandResult(content: unknown): CommandRunResult {\n const output = extractTextContent(content);\n\n if (typeof content === 'string') {\n try {\n const parsed = JSON.parse(content);\n if (typeof parsed.exitCode === 'number') {\n return {\n exitCode: parsed.exitCode,\n output: parsed.output || output,\n success: parsed.exitCode === 0,\n };\n }\n } catch {\n // Not JSON, use raw output\n }\n }\n\n return {\n output,\n success: true,\n };\n}\n\n// =============================================================================\n// Tool Call Creation\n// =============================================================================\n\nexport interface ToolUseInput {\n id: string;\n name: string;\n input: unknown;\n}\n\n/**\n * Create a NormalizedToolCall from a tool_use content block\n */\nexport function createToolCall(toolUse: ToolUseInput): NormalizedToolCall {\n const actionType = mapToolToActionType(toolUse.name, toolUse.input);\n const summary = generateToolSummary(toolUse.name, toolUse.input, actionType);\n\n return {\n id: toolUse.id,\n toolName: toolUse.name,\n actionType,\n status: 'pending',\n summary,\n input: toolUse.input,\n startedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Update a NormalizedToolCall with its result\n */\nexport function updateToolCallWithResult(\n toolCall: NormalizedToolCall,\n content: unknown,\n isError?: boolean\n): NormalizedToolCall {\n const updatedToolCall = { ...toolCall };\n const actionType = { ...toolCall.actionType };\n\n updatedToolCall.status = isError ? 'failed' : 'success';\n updatedToolCall.completedAt = new Date().toISOString();\n updatedToolCall.isError = isError;\n updatedToolCall.output = content;\n\n if (actionType.action === 'command_run') {\n const result = parseCommandResult(content);\n (actionType as typeof actionType).result = result;\n if (result.exitCode !== undefined && result.exitCode !== 0) {\n updatedToolCall.status = 'failed';\n updatedToolCall.isError = true;\n }\n } else if (actionType.action === 'mcp_tool' || actionType.action === 'generic_tool') {\n (actionType as typeof actionType).result = normalizeToolResult(content);\n }\n\n updatedToolCall.actionType = actionType;\n return updatedToolCall;\n}\n\n// =============================================================================\n// Display Helpers\n// =============================================================================\n\n/**\n * Get display icon name for an action type\n */\nexport function getActionIcon(actionType: ActionType): string {\n switch (actionType.action) {\n case 'command_run':\n return 'terminal';\n case 'file_read':\n return 'file-text';\n case 'file_edit':\n return 'edit';\n case 'file_write':\n return 'file-plus';\n case 'search':\n return 'search';\n case 'glob':\n return 'folder-search';\n case 'web_fetch':\n return 'globe';\n case 'web_search':\n return 'search';\n case 'mcp_tool':\n return 'plug';\n case 'generic_tool':\n return 'tool';\n case 'todo_write':\n return 'list-checks';\n case 'agent_tool':\n return 'bot';\n default:\n return 'tool';\n }\n}\n\n/**\n * Get display label for an action type\n */\nexport function getActionLabel(actionType: ActionType): string {\n switch (actionType.action) {\n case 'command_run':\n return 'Command';\n case 'file_read':\n return 'Read';\n case 'file_edit':\n return 'Edit';\n case 'file_write':\n return 'Write';\n case 'search':\n return 'Search';\n case 'glob':\n return 'Glob';\n case 'web_fetch':\n return 'Fetch';\n case 'web_search':\n return 'Search';\n case 'mcp_tool':\n return 'MCP';\n case 'generic_tool':\n return 'Tool';\n case 'todo_write':\n return 'Tasks';\n case 'agent_tool':\n return (actionType as AgentToolAction).agentType;\n default:\n return 'Tool';\n }\n}\n\n// =============================================================================\n// Formatting Helpers\n// =============================================================================\n\n/**\n * Format a file size in bytes to a human-readable string\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Format a timestamp to a locale time string\n */\nexport function formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n });\n } catch {\n return timestamp;\n }\n}\n\n/**\n * Format elapsed time in human-readable format\n * @param startTime - ISO timestamp or Date when the operation started\n * @param endTime - Optional ISO timestamp or Date when the operation ended (defaults to now)\n * @returns Formatted string like \"2s\", \"1m 30s\", \"2m\", etc.\n */\nexport function formatElapsedTime(startTime: string | Date, endTime?: string | Date): string {\n const start = typeof startTime === 'string' ? new Date(startTime) : startTime;\n const end = endTime ? (typeof endTime === 'string' ? new Date(endTime) : endTime) : new Date();\n\n const elapsedMs = end.getTime() - start.getTime();\n const elapsedSeconds = Math.floor(elapsedMs / 1000);\n\n if (elapsedSeconds < 60) {\n return `${elapsedSeconds}s`;\n }\n\n const minutes = Math.floor(elapsedSeconds / 60);\n const seconds = elapsedSeconds % 60;\n\n if (seconds === 0) {\n return `${minutes}m`;\n }\n\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Truncate a string with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Join class names, filtering out falsy values\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\n// =============================================================================\n// =============================================================================\n// Option Parsing\n// =============================================================================\n\n/**\n * A parsed option from assistant message content\n */\nexport interface ParsedOption {\n /** Option identifier (e.g., \"1\", \"2\", \"A\", \"B\") */\n id: string;\n /** Option title/label */\n label: string;\n /** Optional description text */\n description?: string;\n}\n\n/**\n * Result of parsing options from content\n */\nexport interface ParsedOptionsResult {\n /** Text before the options */\n preamble: string;\n /** Parsed options */\n options: ParsedOption[];\n}\n\n/**\n * Parse options from assistant message content.\n * Detects patterns like:\n * - \"Option 1: Title\" / \"Option 2: Title\"\n * - \"**Option 1:** Title\" (bold markdown)\n * - Numbered lists with descriptions\n *\n * @returns ParsedOptionsResult if options found, null otherwise\n */\nexport function parseOptionsFromContent(content: string): ParsedOptionsResult | null {\n // Pattern 1: \"Option N:\" format (with or without bold markdown)\n // Matches: \"Option 1:\", \"**Option 1:**\", \"Option 1 -\", etc.\n const optionPattern = /(?:\\*\\*)?Option\\s+(\\d+)(?:\\*\\*)?[:\\-]\\s*([^\\n]+)(?:\\n((?:(?!\\n(?:\\*\\*)?Option\\s+\\d).)*?))?/gi;\n\n const options: ParsedOption[] = [];\n let firstMatchStart = -1;\n let match: RegExpExecArray | null;\n\n // Reset regex\n optionPattern.lastIndex = 0;\n\n while ((match = optionPattern.exec(content)) !== null) {\n if (firstMatchStart === -1) {\n firstMatchStart = match.index;\n }\n\n const id = match[1] ?? '';\n const labelRaw = match[2];\n const label = labelRaw ? labelRaw.trim() : '';\n // Description is everything after the label until the next option\n const descriptionRaw = match[3];\n\n // Clean up description - remove leading/trailing whitespace and normalize\n let description: string | undefined;\n if (descriptionRaw) {\n const cleaned = descriptionRaw\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .join(' ');\n if (cleaned) {\n description = cleaned;\n }\n }\n\n options.push({ id, label, description });\n }\n\n // Need at least 2 options to be considered a valid options list\n if (options.length >= 2) {\n const preamble = firstMatchStart > 0\n ? content.substring(0, firstMatchStart).trim()\n : '';\n\n return { preamble, options };\n }\n\n // Pattern 2: Simple numbered list at end of message\n // Look for \"What would you like to do?\" or similar followed by numbered items\n const questionPattern = /^(.*?(?:what would you like to do\\??|choose an option|select.*?:|here are your options.*?:))\\s*\\n+((?:\\d+\\.\\s+.+\\n?)+)/ims;\n const questionMatch = content.match(questionPattern);\n\n if (questionMatch && questionMatch[1] && questionMatch[2]) {\n const preamble = questionMatch[1].trim();\n const listSection = questionMatch[2];\n\n // Parse numbered list items\n const listPattern = /(\\d+)\\.\\s+([^\\n]+)/g;\n let listMatch: RegExpExecArray | null;\n\n while ((listMatch = listPattern.exec(listSection)) !== null) {\n const listId = listMatch[1] ?? '';\n const listLabelRaw = listMatch[2];\n const listLabel = listLabelRaw ? listLabelRaw.trim() : '';\n options.push({\n id: listId,\n label: listLabel,\n });\n }\n\n if (options.length >= 2) {\n return { preamble, options };\n }\n }\n\n return null;\n}\n","/**\n * Conversation - AI SDK Elements compatible conversation container\n *\n * A scrollable container for chat messages with auto-scroll functionality.\n *\n * @example\n * ```tsx\n * import { Conversation, ConversationContent, ConversationEmptyState } from '@ash-cloud/ash-ui';\n *\n * function Chat() {\n * const { messages } = useChat({ ... });\n *\n * return (\n * <Conversation>\n * <ConversationContent>\n * {messages.length === 0 ? (\n * <ConversationEmptyState>\n * <p>Start a conversation</p>\n * </ConversationEmptyState>\n * ) : (\n * messages.map((m) => <Message key={m.id} {...m} />)\n * )}\n * </ConversationContent>\n * </Conversation>\n * );\n * }\n * ```\n */\n\nimport React, {\n createContext,\n useContext,\n useRef,\n useEffect,\n useCallback,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ConversationContextValue {\n /** Reference to the scroll container */\n containerRef: React.RefObject<HTMLDivElement>;\n /** Scroll to the bottom of the conversation */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n /** Whether the user has scrolled up from the bottom */\n isScrolledUp: boolean;\n /** Whether auto-scroll is enabled */\n autoScroll: boolean;\n /** Set auto-scroll state */\n setAutoScroll: (value: boolean) => void;\n}\n\nconst ConversationContext = createContext<ConversationContextValue | null>(null);\n\nexport function useConversation(): ConversationContextValue {\n const context = useContext(ConversationContext);\n if (!context) {\n throw new Error('useConversation must be used within a Conversation');\n }\n return context;\n}\n\n// ============================================================================\n// Conversation\n// ============================================================================\n\nexport interface ConversationProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether to auto-scroll on new messages */\n autoScroll?: boolean;\n /** Threshold in pixels to consider \"at bottom\" */\n scrollThreshold?: number;\n}\n\nexport function Conversation({\n children,\n className,\n autoScroll: initialAutoScroll = true,\n scrollThreshold = 100,\n}: ConversationProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isScrolledUp, setIsScrolledUp] = useState(false);\n const [autoScroll, setAutoScroll] = useState(initialAutoScroll);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior = 'smooth') => {\n if (containerRef.current) {\n containerRef.current.scrollTo({\n top: containerRef.current.scrollHeight,\n behavior,\n });\n }\n }, []);\n\n // Handle scroll events to detect if user scrolled up\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return;\n\n const { scrollTop, scrollHeight, clientHeight } = containerRef.current;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n const isAtBottom = distanceFromBottom < scrollThreshold;\n\n setIsScrolledUp(!isAtBottom);\n\n // Re-enable auto-scroll when user scrolls to bottom\n if (isAtBottom && !autoScroll) {\n setAutoScroll(true);\n }\n }, [scrollThreshold, autoScroll]);\n\n // Auto-scroll on content changes\n useEffect(() => {\n if (autoScroll && !isScrolledUp) {\n scrollToBottom('instant');\n }\n });\n\n const contextValue: ConversationContextValue = {\n containerRef: containerRef as React.RefObject<HTMLDivElement>,\n scrollToBottom,\n isScrolledUp,\n autoScroll,\n setAutoScroll,\n };\n\n return (\n <ConversationContext.Provider value={contextValue}>\n <div\n ref={containerRef}\n onScroll={handleScroll}\n className={cn(\n 'ash-conversation flex flex-col overflow-y-auto',\n 'ash-scrollbar',\n className\n )}\n role=\"log\"\n aria-live=\"polite\"\n >\n {children}\n </div>\n </ConversationContext.Provider>\n );\n}\n\n// ============================================================================\n// ConversationContent\n// ============================================================================\n\nexport interface ConversationContentProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function ConversationContent({\n children,\n className,\n}: ConversationContentProps) {\n return (\n <div\n className={cn(\n 'ash-conversation-content flex flex-col',\n 'gap-[var(--ash-message-list-gap,0.25rem)]',\n 'p-[var(--ash-spacing-md,0.75rem)]',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// ConversationEmptyState\n// ============================================================================\n\nexport interface ConversationEmptyStateProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function ConversationEmptyState({\n children,\n className,\n}: ConversationEmptyStateProps) {\n return (\n <div\n className={cn(\n 'ash-conversation-empty flex flex-col items-center justify-center',\n 'flex-1 min-h-[200px] text-center',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// ConversationScrollButton\n// ============================================================================\n\nexport interface ConversationScrollButtonProps {\n /** Additional class name */\n className?: string;\n /** Custom label */\n label?: string;\n}\n\nexport function ConversationScrollButton({\n className,\n label = 'Scroll to bottom',\n}: ConversationScrollButtonProps) {\n const { isScrolledUp, scrollToBottom } = useConversation();\n\n if (!isScrolledUp) return null;\n\n return (\n <button\n onClick={() => scrollToBottom()}\n className={cn(\n 'ash-conversation-scroll-btn',\n 'fixed bottom-20 left-1/2 -translate-x-1/2',\n 'px-4 py-2 rounded-full',\n 'bg-[var(--ash-surface-elevated,#111)] border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))] text-sm',\n 'hover:bg-[var(--ash-surface-card,#0c0c0c)] hover:border-[var(--ash-border-emphasis,rgba(255,255,255,0.15))]',\n 'transition-all duration-200',\n 'shadow-lg',\n className\n )}\n aria-label={label}\n >\n <span className=\"flex items-center gap-2\">\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 14l-7 7m0 0l-7-7m7 7V3\"\n />\n </svg>\n {label}\n </span>\n </button>\n );\n}\n","import { lazy, Suspense, useState, useEffect, useMemo, type ReactNode } from 'react';\nimport type { MarkdownComponents } from '../types';\n\n// Lazy load react-markdown to avoid SSR issues with decode-named-character-reference\n// which uses document.createElement at module evaluation time\nconst ReactMarkdown = lazy(() => import('react-markdown'));\n\nexport interface LazyMarkdownProps {\n children: string;\n /** Fallback content to show while loading */\n fallback?: ReactNode;\n /** Custom component overrides for markdown elements */\n components?: MarkdownComponents;\n className?: string;\n}\n\n/**\n * LazyMarkdown - SSR-safe wrapper around react-markdown\n *\n * This component lazy-loads react-markdown to avoid the \"document is not defined\"\n * error that occurs during SSR due to the decode-named-character-reference package.\n *\n * @example\n * ```tsx\n * <LazyMarkdown>{markdownContent}</LazyMarkdown>\n *\n * // With custom components\n * <LazyMarkdown\n * components={{\n * h2: ({ children }) => <h2 className=\"custom-h2\">{children}</h2>,\n * code: ({ children, className }) => <CustomCode className={className}>{children}</CustomCode>,\n * }}\n * >\n * {markdownContent}\n * </LazyMarkdown>\n * ```\n */\nexport function LazyMarkdown({ children, fallback, components, className }: LazyMarkdownProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // Memoize components to prevent unnecessary re-renders\n const markdownComponents = useMemo(() => {\n if (!components) return undefined;\n // Cast to the format react-markdown expects\n return components as Record<string, React.ComponentType<unknown>>;\n }, [components]);\n\n // Don't render markdown on the server to avoid SSR issues\n if (!mounted) {\n // Return plain text as fallback during SSR\n return <span className={className}>{fallback ?? children}</span>;\n }\n\n return (\n <Suspense fallback={<span className={className}>{fallback ?? children}</span>}>\n <ReactMarkdown components={markdownComponents}>{children}</ReactMarkdown>\n </Suspense>\n );\n}\n\nexport default LazyMarkdown;\n","/**\n * Mention - Default mention component for rich content\n *\n * Renders an @mention badge with optional avatar and custom styling.\n * Consumers can provide their own mention component via the `components` prop.\n *\n * @example\n * ```tsx\n * import { Mention } from '@ash-cloud/ash-ui';\n *\n * <Mention name=\"ProductX\" color=\"#f59e0b\" />\n * <Mention name=\"JohnDoe\" url=\"/avatars/john.jpg\" />\n * ```\n */\n\nimport { cn } from '../utils';\nimport type { MentionProps } from '../types';\n\nexport type { MentionProps } from '../types';\n\nexport function Mention({ name, color, url }: MentionProps) {\n return (\n <span\n className={cn(\n 'ash-mention',\n 'inline-flex items-center',\n 'px-1.5 py-0.5 rounded',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'font-medium'\n )}\n style={{\n backgroundColor: color ? `${color}20` : 'var(--ash-mention-bg,rgba(255,255,255,0.1))',\n color: color || 'var(--ash-mention-text,inherit)',\n }}\n >\n {url && (\n <img\n src={url}\n alt=\"\"\n className=\"w-4 h-4 rounded mr-1 object-cover\"\n />\n )}\n @{name}\n </span>\n );\n}\n","/**\n * RichContent - Renderer for pre-parsed rich content segments\n *\n * Renders a mix of text and mention segments with support for\n * custom mention components.\n *\n * @example\n * ```tsx\n * import { RichContentRenderer } from '@ash-cloud/ash-ui';\n *\n * const content = [\n * { type: 'text', content: 'Check out ' },\n * { type: 'mention', name: 'ProductX', color: '#f59e0b' },\n * { type: 'text', content: ' for details' },\n * ];\n *\n * // With default mention component\n * <RichContentRenderer content={content} />\n *\n * // With custom mention component\n * <RichContentRenderer\n * content={content}\n * components={{\n * mention: ({ name, data }) => (\n * <Link href={`/products/${data?.id}`}>@{name}</Link>\n * ),\n * }}\n * />\n * ```\n */\n\nimport type { ComponentType } from 'react';\nimport { cn } from '../utils';\nimport type { RichContent, MentionProps, MarkdownComponents } from '../types';\nimport { Mention } from './Mention';\nimport { LazyMarkdown } from './LazyMarkdown';\n\nexport interface RichContentProps {\n /** Pre-parsed rich content segments */\n content: RichContent;\n /** Custom components for rendering */\n components?: MarkdownComponents & {\n /** Custom mention renderer */\n mention?: ComponentType<MentionProps>;\n };\n /** Additional class name */\n className?: string;\n}\n\nexport function RichContentRenderer({\n content,\n components,\n className,\n}: RichContentProps) {\n const MentionComponent = components?.mention || Mention;\n\n return (\n <span className={cn('ash-rich-content', className)}>\n {content.map((segment, index) => {\n if (segment.type === 'text') {\n return (\n <LazyMarkdown key={index} components={components}>\n {segment.content}\n </LazyMarkdown>\n );\n }\n\n if (segment.type === 'mention') {\n return (\n <MentionComponent\n key={index}\n name={segment.name}\n color={segment.color}\n url={segment.url}\n data={segment.data}\n />\n );\n }\n\n // Exhaustive check - should never reach here\n return null;\n })}\n </span>\n );\n}\n","/**\n * Message - AI SDK Elements compatible message components\n *\n * Renders individual messages in a conversation with support for\n * user/assistant/system roles, markdown content, and tool invocations.\n *\n * @example\n * ```tsx\n * import { Message, MessageContent, MessageResponse } from '@ash-cloud/ash-ui';\n *\n * <Message from=\"user\">\n * <MessageContent>Hello!</MessageContent>\n * </Message>\n *\n * <Message from=\"assistant\">\n * <MessageContent>\n * <MessageResponse content={message.content} />\n * </MessageContent>\n * </Message>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n type ReactNode,\n type ComponentType,\n} from 'react';\nimport { cn } from '../utils';\nimport type { ToolInvocation, RichContent, MentionProps, MarkdownComponents } from '../types';\nimport { LazyMarkdown } from './LazyMarkdown';\nimport { RichContentRenderer } from './RichContent';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface MessageContextValue {\n /** Message role */\n from: 'user' | 'assistant' | 'system';\n /** Whether this message is streaming */\n isStreaming?: boolean;\n /** Tool invocations in this message */\n toolInvocations?: ToolInvocation[];\n}\n\nconst MessageContext = createContext<MessageContextValue | null>(null);\n\nexport function useMessage(): MessageContextValue {\n const context = useContext(MessageContext);\n if (!context) {\n throw new Error('useMessage must be used within a Message');\n }\n return context;\n}\n\n// ============================================================================\n// Message\n// ============================================================================\n\nexport interface MessageProps {\n /** Message role */\n from: 'user' | 'assistant' | 'system';\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether this message is streaming */\n isStreaming?: boolean;\n /** Tool invocations (for assistant messages) */\n toolInvocations?: ToolInvocation[];\n /** Message ID for data attribute */\n id?: string;\n}\n\nexport function Message({\n from,\n children,\n className,\n isStreaming,\n toolInvocations,\n id,\n}: MessageProps) {\n const contextValue: MessageContextValue = {\n from,\n isStreaming,\n toolInvocations,\n };\n\n // Map role to data attribute value\n const roleMap: Record<string, string> = {\n user: 'user',\n assistant: 'assistant',\n system: 'system',\n };\n\n return (\n <MessageContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-message',\n 'flex gap-[var(--ash-message-gap,0.5rem)]',\n from === 'user' && 'flex-row-reverse',\n className\n )}\n data-message-role={roleMap[from]}\n data-message-id={id}\n >\n {children}\n </div>\n </MessageContext.Provider>\n );\n}\n\n// ============================================================================\n// MessageAvatar\n// ============================================================================\n\nexport interface MessageAvatarProps {\n /** Avatar image URL */\n src?: string;\n /** Fallback text (initials) */\n fallback?: string;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageAvatar({ src, fallback, className }: MessageAvatarProps) {\n const { from } = useMessage();\n\n // Default fallbacks based on role\n const defaultFallback = from === 'user' ? 'U' : from === 'assistant' ? 'A' : 'S';\n const displayFallback = fallback || defaultFallback;\n\n // Role-based background colors\n const bgColorMap: Record<string, string> = {\n user: 'var(--ash-avatar-user-bg,rgba(255,255,255,0.1))',\n assistant: 'var(--ash-avatar-assistant-bg,#10a37f)',\n system: 'var(--ash-avatar-user-bg,rgba(255,255,255,0.1))',\n };\n\n return (\n <div\n className={cn(\n 'ash-message-avatar flex-shrink-0',\n 'w-[var(--ash-avatar-size,1.25rem)] h-[var(--ash-avatar-size,1.25rem)]',\n 'rounded-full flex items-center justify-center',\n 'text-[var(--ash-font-size-xs,10px)] font-medium',\n from === 'assistant' ? 'text-white' : 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]',\n className\n )}\n style={{ backgroundColor: bgColorMap[from] }}\n >\n {src ? (\n <img\n src={src}\n alt={`${from} avatar`}\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : (\n displayFallback\n )}\n </div>\n );\n}\n\n// ============================================================================\n// MessageContent\n// ============================================================================\n\nexport interface MessageContentProps {\n /** Child elements */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageContent({ children, className }: MessageContentProps) {\n const { from } = useMessage();\n\n // Role-based styling\n const roleStyles: Record<string, string> = {\n user: cn(\n 'bg-[var(--ash-user-bg,#5B6EF5)]',\n 'text-[var(--ash-user-text,#ffffff)]',\n 'border-[var(--ash-user-border,transparent)]'\n ),\n assistant: cn(\n 'bg-[var(--ash-assistant-bg,#1a1a1a)]',\n 'text-[var(--ash-assistant-text,rgba(255,255,255,0.9))]',\n 'border-[var(--ash-assistant-border,rgba(255,255,255,0.08))]'\n ),\n system: cn(\n 'bg-[var(--ash-surface-elevated,#111111)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'border-[var(--ash-border,rgba(255,255,255,0.08))]'\n ),\n };\n\n return (\n <div\n className={cn(\n 'ash-message-content',\n 'flex-1 min-w-0',\n 'rounded-[var(--ash-radius-lg,0.75rem)]',\n 'p-[var(--ash-message-padding,0.5rem_0.75rem)]',\n 'border',\n roleStyles[from],\n from === 'user' && 'rounded-tr-sm',\n from === 'assistant' && 'rounded-tl-sm',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// MessageResponse\n// ============================================================================\n\nexport interface MessageResponseProps {\n /** Plain markdown content */\n content?: string;\n /** Pre-parsed rich content segments (alternative to content) */\n richContent?: RichContent;\n /** Whether content is still streaming */\n isStreaming?: boolean;\n /** Additional class name */\n className?: string;\n /** Custom markdown components and mention renderer */\n components?: MarkdownComponents & {\n /** Custom mention renderer for rich content */\n mention?: ComponentType<MentionProps>;\n };\n}\n\nexport function MessageResponse({\n content,\n richContent,\n isStreaming,\n className,\n components,\n}: MessageResponseProps) {\n // If richContent is provided, use RichContentRenderer\n if (richContent && richContent.length > 0) {\n return (\n <div\n className={cn(\n 'ash-message-response',\n 'font-[var(--ash-font-size-base,13px)]',\n 'leading-relaxed',\n isStreaming && 'animate-pulse',\n className\n )}\n >\n <RichContentRenderer content={richContent} components={components} />\n </div>\n );\n }\n\n // Otherwise render plain markdown content\n if (!content) return null;\n\n return (\n <div\n className={cn(\n 'ash-message-response',\n 'font-[var(--ash-font-size-base,13px)]',\n 'leading-relaxed',\n isStreaming && 'animate-pulse',\n className\n )}\n >\n <LazyMarkdown components={components}>{content}</LazyMarkdown>\n </div>\n );\n}\n\n// ============================================================================\n// MessageActions\n// ============================================================================\n\nexport interface MessageActionsProps {\n /** Child elements (action buttons) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageActions({ children, className }: MessageActionsProps) {\n return (\n <div\n className={cn(\n 'ash-message-actions',\n 'flex items-center gap-1 mt-2',\n 'opacity-0 group-hover:opacity-100 transition-opacity',\n className\n )}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// MessageAction\n// ============================================================================\n\nexport interface MessageActionProps {\n /** Action icon */\n icon?: ReactNode;\n /** Action label */\n label: string;\n /** Click handler */\n onClick?: () => void;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageAction({\n icon,\n label,\n onClick,\n className,\n}: MessageActionProps) {\n return (\n <button\n onClick={onClick}\n className={cn(\n 'ash-message-action',\n 'p-1.5 rounded-md',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'hover:text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]',\n 'hover:bg-[var(--ash-surface-elevated,#111111)]',\n 'transition-colors',\n className\n )}\n title={label}\n aria-label={label}\n >\n {icon || label}\n </button>\n );\n}\n\n// ============================================================================\n// MessageTimestamp\n// ============================================================================\n\nexport interface MessageTimestampProps {\n /** Timestamp to display */\n timestamp: Date | string;\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageTimestamp({ timestamp, className }: MessageTimestampProps) {\n const date = typeof timestamp === 'string' ? new Date(timestamp) : timestamp;\n const formatted = date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n\n return (\n <span\n className={cn(\n 'ash-message-timestamp',\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-faint,rgba(255,255,255,0.3))]',\n className\n )}\n >\n {formatted}\n </span>\n );\n}\n","import type { ToolStatus } from '../types';\nimport { cn } from '../utils';\n\nexport interface StatusIndicatorProps {\n status: ToolStatus;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n className?: string;\n}\n\n/**\n * StatusIndicator - Visual indicator for tool execution status\n *\n * Uses the glassmorphism theme with animated states:\n * - pending: Yellow with pulse animation\n * - success: Accent color (lime green)\n * - failed: Red\n *\n * @example\n * ```tsx\n * <StatusIndicator status=\"pending\" />\n * <StatusIndicator status=\"success\" size=\"lg\" />\n * <StatusIndicator status=\"failed\" />\n * ```\n */\nexport function StatusIndicator({ status, size = 'sm', className }: StatusIndicatorProps) {\n const sizeClasses = {\n xs: 'w-1.5 h-1.5',\n sm: 'w-2 h-2',\n md: 'w-3 h-3',\n lg: 'w-4 h-4',\n };\n\n const statusClasses = {\n pending: 'ash-status-pending',\n success: 'ash-status-success',\n failed: 'ash-status-failed',\n };\n\n return (\n <div\n className={cn(\n 'rounded-full flex-shrink-0',\n sizeClasses[size],\n statusClasses[status],\n className\n )}\n />\n );\n}\n\nexport default StatusIndicator;\n","/**\n * @ash-cloud/ash-ui - Icon Components\n *\n * Inline SVG icons for minimal dependencies. These icons follow\n * the Feather Icons style:\n * - 24x24 viewBox\n * - 2px stroke width\n * - No fill (stroke-based)\n */\n\n// =============================================================================\n// Icon Props Type\n// =============================================================================\n\nexport interface IconProps {\n className?: string;\n}\n\n// =============================================================================\n// Navigation & UI Icons\n// =============================================================================\n\nexport function SunIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\n </svg>\n );\n}\n\nexport function MoonIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n );\n}\n\nexport function ChevronDownIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\nexport function ChevronRightIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nexport function ChevronLeftIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\nexport function ChevronUpIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Tool & Action Icons\n// =============================================================================\n\nexport function TerminalIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n );\n}\n\nexport function FileIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function EditIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n );\n}\n\nexport function FilePlusIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\" />\n <line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\nexport function SearchIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nexport function GlobeIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n );\n}\n\nexport function PlugIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 2v6\" />\n <path d=\"M6 6v4a6 6 0 0 0 12 0V6\" />\n <path d=\"M12 16v6\" />\n </svg>\n );\n}\n\nexport function ToolIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nexport function FolderSearchIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\n <circle cx=\"11\" cy=\"13\" r=\"3\" />\n <line x1=\"15\" y1=\"16\" x2=\"17\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function CodeIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n );\n}\n\nexport function CopyIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nexport function CheckIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nexport function XIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function LoaderIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"6\" />\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\" />\n <line x1=\"4.93\" y1=\"4.93\" x2=\"7.76\" y2=\"7.76\" />\n <line x1=\"16.24\" y1=\"16.24\" x2=\"19.07\" y2=\"19.07\" />\n <line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" />\n <line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <line x1=\"4.93\" y1=\"19.07\" x2=\"7.76\" y2=\"16.24\" />\n <line x1=\"16.24\" y1=\"7.76\" x2=\"19.07\" y2=\"4.93\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Status & Alert Icons\n// =============================================================================\n\nexport function InfoIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n}\n\nexport function AlertTriangleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function AlertCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nexport function BugIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"6\" width=\"8\" height=\"14\" rx=\"4\" />\n <path d=\"M3 10h2\" />\n <path d=\"M19 10h2\" />\n <path d=\"M3 14h2\" />\n <path d=\"M19 14h2\" />\n <path d=\"M9 2h6\" />\n <path d=\"M12 2v4\" />\n </svg>\n );\n}\n\nexport function CheckCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n );\n}\n\nexport function XCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Communication & Misc Icons\n// =============================================================================\n\nexport function SendIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n );\n}\n\nexport function PaperclipIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n );\n}\n\nexport function StopCircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n </svg>\n );\n}\n\nexport function MessageSquareIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\nexport function SparklesIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M5 19l.5 1.5L7 21l-1.5.5L5 23l-.5-1.5L3 21l1.5-.5L5 19z\" />\n <path d=\"M19 11l.5 1.5L21 13l-1.5.5L19 15l-.5-1.5L17 13l1.5-.5L19 11z\" />\n </svg>\n );\n}\n\nexport function BrainIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 4.44-1.54\" />\n <path d=\"M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-4.44-1.54\" />\n </svg>\n );\n}\n\nexport function BotIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 8V4H8\" />\n <rect x=\"5\" y=\"8\" width=\"14\" height=\"12\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M9 13v2\" />\n <path d=\"M15 13v2\" />\n </svg>\n );\n}\n\nexport function UserIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Todo & Task Icons\n// =============================================================================\n\nexport function CircleIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n );\n}\n\nexport function ListChecksIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M10 6h11\" />\n <path d=\"M10 12h11\" />\n <path d=\"M10 18h11\" />\n <path d=\"M3 6l2 2 4-4\" />\n <path d=\"M3 12l2 2 4-4\" />\n <path d=\"M3 18l2 2 4-4\" />\n </svg>\n );\n}\n\nexport function ClipboardListIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\" />\n <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" />\n <path d=\"M12 11h4\" />\n <path d=\"M12 16h4\" />\n <path d=\"M8 11h.01\" />\n <path d=\"M8 16h.01\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Time Icons\n// =============================================================================\n\nexport function ClockIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\n// =============================================================================\n// Spinner & Loading Icons\n// =============================================================================\n\nexport function SpinnerIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function ErrorIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ChatGPT-Style UI Icons\n// =============================================================================\n\nexport function MicrophoneIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n </svg>\n );\n}\n\nexport function HomeIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n <polyline points=\"9 22 9 12 15 12 15 22\" />\n </svg>\n );\n}\n\nexport function ArrowUpIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { cn } from '../utils';\nimport { CopyIcon, CheckIcon } from '../icons';\n\nexport interface CodeBlockProps {\n children: string;\n maxHeight?: number;\n language?: string;\n showLineNumbers?: boolean;\n className?: string;\n}\n\n/**\n * CodeBlock - Display code with syntax-aware styling and expand/collapse\n *\n * Uses glassmorphism dark theme styling with ChatGPT-style header containing\n * language label and copy button.\n *\n * @example\n * ```tsx\n * <CodeBlock>{`const x = 1;`}</CodeBlock>\n * <CodeBlock maxHeight={200}>{longCode}</CodeBlock>\n * <CodeBlock language=\"typescript\" showLineNumbers>{code}</CodeBlock>\n * ```\n */\nexport function CodeBlock({\n children,\n maxHeight = 200,\n language,\n showLineNumbers = false,\n className,\n}: CodeBlockProps) {\n const [expanded, setExpanded] = useState(false);\n const [copied, setCopied] = useState(false);\n const lines = children.split('\\n');\n const isLong = lines.length > 10 || children.length > 500;\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(children);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }, [children]);\n\n return (\n <div className={cn('relative rounded-lg overflow-hidden border border-white/10', className)}>\n {/* Header with language label and copy button */}\n <div className=\"flex items-center justify-between px-4 py-2 bg-[var(--ash-code-header-bg)] border-b border-white/10\">\n <span className=\"text-xs text-white/60 font-medium\">\n {language || 'code'}\n </span>\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1.5 text-xs text-white/60 hover:text-white transition-colors\"\n >\n {copied ? (\n <>\n <CheckIcon className=\"w-3.5 h-3.5\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <CopyIcon className=\"w-3.5 h-3.5\" />\n <span>Copy</span>\n </>\n )}\n </button>\n </div>\n <pre\n className={cn(\n 'text-xs font-mono text-white/90 p-4 bg-black/30 overflow-x-auto whitespace-pre-wrap break-words',\n !expanded && isLong && 'overflow-y-hidden'\n )}\n style={!expanded && isLong ? { maxHeight } : undefined}\n data-language={language}\n >\n {showLineNumbers ? (\n <code>\n {lines.map((line, i) => (\n <span key={i} className=\"block\">\n <span className=\"inline-block w-8 text-white/30 select-none text-right pr-2\">\n {i + 1}\n </span>\n <span className=\"text-white/80\">{line}</span>\n </span>\n ))}\n </code>\n ) : (\n <code className=\"text-white/80\">{children}</code>\n )}\n </pre>\n {isLong && !expanded && (\n <div className=\"absolute bottom-0 left-0 right-0 h-12 ash-truncate-fade flex items-end justify-center pb-2\">\n <button\n onClick={() => setExpanded(true)}\n className=\"text-xs text-[var(--ash-accent)] hover:text-[var(--ash-accent-300)] font-medium transition-colors\"\n >\n Show more\n </button>\n </div>\n )}\n {isLong && expanded && (\n <button\n onClick={() => setExpanded(false)}\n className=\"text-xs text-[var(--ash-accent)] hover:text-[var(--ash-accent-300)] font-medium mt-2 transition-colors\"\n >\n Show less\n </button>\n )}\n </div>\n );\n}\n\nexport default CodeBlock;\n","import { CodeBlock } from './CodeBlock';\n\nexport interface JsonDisplayProps {\n value: unknown;\n maxHeight?: number;\n className?: string;\n}\n\n/**\n * JsonDisplay - Display JSON data in a formatted code block\n *\n * @example\n * ```tsx\n * <JsonDisplay value={{ name: 'test', count: 42 }} />\n * <JsonDisplay value={data} maxHeight={300} />\n * ```\n */\nexport function JsonDisplay({ value, maxHeight, className }: JsonDisplayProps) {\n const formatted = JSON.stringify(value, null, 2);\n return (\n <CodeBlock maxHeight={maxHeight} className={className}>\n {formatted}\n </CodeBlock>\n );\n}\n\nexport default JsonDisplay;\n","/**\n * Tool - AI SDK Elements compatible tool display components\n *\n * Renders tool invocations with expandable details showing\n * input arguments and output results.\n *\n * @example\n * ```tsx\n * import { Tool, ToolHeader, ToolInput, ToolOutput } from '@ash-cloud/ash-ui';\n *\n * <Tool toolInvocation={inv}>\n * <ToolHeader />\n * <ToolInput />\n * <ToolOutput />\n * </Tool>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn, formatToolName } from '../utils';\nimport type { ToolInvocation } from '../types';\nimport { StatusIndicator } from './StatusIndicator';\nimport { JsonDisplay } from './JsonDisplay';\nimport { CodeBlock } from './CodeBlock';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Tool display variant\n * - 'default': Full-sized with expand/collapse\n * - 'compact': Smaller with minimal padding, no expand/collapse\n */\nexport type ToolVariant = 'default' | 'compact';\n\ninterface ToolContextValue {\n /** The tool invocation data */\n toolInvocation: ToolInvocation;\n /** Whether the tool details are expanded */\n isExpanded: boolean;\n /** Toggle expansion state */\n toggleExpanded: () => void;\n /** Display variant */\n variant: ToolVariant;\n}\n\nconst ToolContext = createContext<ToolContextValue | null>(null);\n\nexport function useTool(): ToolContextValue {\n const context = useContext(ToolContext);\n if (!context) {\n throw new Error('useTool must be used within a Tool');\n }\n return context;\n}\n\n// ============================================================================\n// Tool\n// ============================================================================\n\nexport interface ToolProps {\n /** Tool invocation data */\n toolInvocation: ToolInvocation;\n /** Child elements */\n children?: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether to start expanded */\n defaultExpanded?: boolean;\n /** Display variant: 'default' or 'compact' */\n variant?: ToolVariant;\n}\n\nexport function Tool({\n toolInvocation,\n children,\n className,\n defaultExpanded = false,\n variant = 'default',\n}: ToolProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n const toggleExpanded = () => setIsExpanded((prev) => !prev);\n\n const contextValue: ToolContextValue = {\n toolInvocation,\n isExpanded,\n toggleExpanded,\n variant,\n };\n\n // Determine status for styling\n const status = toolInvocation.state === 'result' ? 'success' : 'pending';\n const isErrorResult = Boolean(\n toolInvocation.result &&\n typeof toolInvocation.result === 'object' &&\n 'error' in (toolInvocation.result as Record<string, unknown>)\n );\n\n return (\n <ToolContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-tool',\n 'rounded-[var(--ash-radius-md,0.5rem)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'bg-[var(--ash-tool-bg,var(--ash-surface-dark,#0a0a0a))]',\n 'overflow-hidden',\n status === 'pending' && 'ash-tool-status-pending',\n isErrorResult && 'border-red-500/30',\n className\n )}\n data-tool-name={toolInvocation.toolName}\n data-tool-state={toolInvocation.state}\n >\n {children || (\n <>\n <ToolHeader />\n {isExpanded && (\n <>\n <ToolInput />\n <ToolOutput />\n </>\n )}\n </>\n )}\n </div>\n </ToolContext.Provider>\n );\n}\n\n// ============================================================================\n// ToolHeader\n// ============================================================================\n\nexport interface ToolHeaderProps {\n /** Additional class name */\n className?: string;\n /** Custom icon */\n icon?: ReactNode;\n /** Show expand/collapse button */\n showToggle?: boolean;\n}\n\nexport function ToolHeader({\n className,\n icon,\n showToggle = true,\n}: ToolHeaderProps) {\n const { toolInvocation, isExpanded, toggleExpanded, variant } = useTool();\n\n const isCompact = variant === 'compact';\n const status = toolInvocation.state === 'result' ? 'success' : 'pending';\n const formattedName = formatToolName(toolInvocation.toolName);\n\n // Get icon based on tool name - use ActionIcon component which handles the mapping\n const toolIcon = icon;\n\n // In compact mode, disable expand/collapse\n const canToggle = showToggle && !isCompact;\n\n return (\n <button\n onClick={canToggle ? toggleExpanded : undefined}\n className={cn(\n 'ash-tool-header',\n 'w-full flex items-center gap-2',\n isCompact ? 'px-2 py-1.5' : 'px-3 py-2',\n 'text-left',\n canToggle && 'cursor-pointer hover:bg-white/[0.03] transition-colors',\n !canToggle && 'cursor-default',\n className\n )}\n >\n {/* Status indicator */}\n <StatusIndicator status={status} size={isCompact ? 'xs' : 'sm'} />\n\n {/* Icon */}\n {toolIcon ? (\n <span className=\"text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\">\n {toolIcon}\n </span>\n ) : (\n <span className=\"text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\">\n <svg className={isCompact ? 'w-3 h-3' : 'w-4 h-4'} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </span>\n )}\n\n {/* Tool name */}\n <span\n className={cn(\n 'flex-1 font-medium',\n isCompact ? 'text-[var(--ash-font-size-xs,10px)]' : 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]'\n )}\n >\n {formattedName}\n </span>\n\n {/* Summary/args preview */}\n <span\n className={cn(\n isCompact ? 'text-[9px]' : 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'truncate max-w-[200px]'\n )}\n >\n {Object.keys(toolInvocation.args).length > 0 &&\n `(${Object.keys(toolInvocation.args).join(', ')})`}\n </span>\n\n {/* Expand/collapse icon - hidden in compact mode */}\n {canToggle && (\n <svg\n className={cn(\n 'w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'transition-transform',\n isExpanded && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n )}\n </button>\n );\n}\n\n// ============================================================================\n// ToolInput\n// ============================================================================\n\nexport interface ToolInputProps {\n /** Additional class name */\n className?: string;\n /** Maximum height before scroll */\n maxHeight?: number;\n}\n\nexport function ToolInput({ className, maxHeight = 200 }: ToolInputProps) {\n const { toolInvocation } = useTool();\n\n if (!toolInvocation.args || Object.keys(toolInvocation.args).length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'ash-tool-input',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n className\n )}\n >\n <div className=\"ash-tool-section-header\">Input</div>\n <div\n className=\"p-3 overflow-auto\"\n style={{ maxHeight }}\n >\n <JsonDisplay value={toolInvocation.args} />\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// ToolOutput\n// ============================================================================\n\nexport interface ToolOutputProps {\n /** Additional class name */\n className?: string;\n /** Maximum height before scroll */\n maxHeight?: number;\n}\n\nexport function ToolOutput({ className, maxHeight = 300 }: ToolOutputProps) {\n const { toolInvocation } = useTool();\n\n if (toolInvocation.state !== 'result' || !toolInvocation.result) {\n return null;\n }\n\n const result = toolInvocation.result;\n const isString = typeof result === 'string';\n const isError = typeof result === 'object' && result !== null &&\n 'error' in (result as Record<string, unknown>);\n\n return (\n <div\n className={cn(\n 'ash-tool-output',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n isError && 'bg-red-500/5',\n className\n )}\n >\n <div\n className={cn(\n 'ash-tool-section-header',\n isError && 'text-red-400'\n )}\n >\n {isError ? 'Error' : 'Output'}\n </div>\n <div\n className=\"p-3 overflow-auto\"\n style={{ maxHeight }}\n >\n {isString ? (\n <CodeBlock maxHeight={maxHeight - 24}>\n {result}\n </CodeBlock>\n ) : (\n <JsonDisplay value={result} />\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// ToolList\n// ============================================================================\n\nexport interface ToolListProps {\n /** Tool invocations to render */\n toolInvocations: ToolInvocation[];\n /** Additional class name */\n className?: string;\n /** Whether to show tools expanded by default */\n defaultExpanded?: boolean;\n /** Display variant: 'default' or 'compact' */\n variant?: ToolVariant;\n}\n\nexport function ToolList({\n toolInvocations,\n className,\n defaultExpanded = false,\n variant = 'default',\n}: ToolListProps) {\n if (!toolInvocations || toolInvocations.length === 0) {\n return null;\n }\n\n const isCompact = variant === 'compact';\n\n return (\n <div\n className={cn(\n 'ash-tool-list',\n 'flex flex-col',\n isCompact ? 'gap-1' : 'gap-2',\n className\n )}\n >\n {toolInvocations.map((inv) => (\n <Tool\n key={inv.toolCallId}\n toolInvocation={inv}\n defaultExpanded={defaultExpanded}\n variant={variant}\n />\n ))}\n </div>\n );\n}\n","/**\n * Reasoning - AI SDK Elements compatible reasoning/thinking display\n *\n * Displays chain-of-thought reasoning in a collapsible panel.\n * Auto-expands during streaming and collapses when complete.\n *\n * @example\n * ```tsx\n * import { Reasoning, ReasoningContent, ReasoningTrigger } from '@ash-cloud/ash-ui';\n *\n * <Reasoning isStreaming={isStreaming}>\n * <ReasoningTrigger />\n * <ReasoningContent>{reasoning}</ReasoningContent>\n * </Reasoning>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ReasoningContextValue {\n /** Whether the reasoning panel is open */\n isOpen: boolean;\n /** Toggle open state */\n setIsOpen: (value: boolean) => void;\n /** Whether reasoning is currently streaming */\n isStreaming: boolean;\n /** Duration of thinking in seconds */\n duration: number;\n}\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nexport function useReasoning(): ReasoningContextValue {\n const context = useContext(ReasoningContext);\n if (!context) {\n throw new Error('useReasoning must be used within a Reasoning');\n }\n return context;\n}\n\n// ============================================================================\n// Reasoning\n// ============================================================================\n\nexport interface ReasoningProps {\n /** Child elements */\n children: ReactNode;\n /** Whether reasoning is currently streaming */\n isStreaming?: boolean;\n /** Additional class name */\n className?: string;\n /** Whether to auto-expand during streaming */\n autoExpand?: boolean;\n /** Whether to auto-collapse when streaming completes */\n autoCollapse?: boolean;\n /** Initial duration in seconds (for loaded content) */\n initialDuration?: number;\n}\n\nexport function Reasoning({\n children,\n isStreaming = false,\n className,\n autoExpand = true,\n autoCollapse = true,\n initialDuration = 0,\n}: ReasoningProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [duration, setDuration] = useState(initialDuration);\n const startTimeRef = useRef<number | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Auto-expand when streaming starts\n useEffect(() => {\n if (isStreaming && autoExpand) {\n setIsOpen(true);\n startTimeRef.current = Date.now();\n\n // Start duration timer\n intervalRef.current = setInterval(() => {\n if (startTimeRef.current) {\n setDuration(Math.floor((Date.now() - startTimeRef.current) / 1000));\n }\n }, 1000);\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [isStreaming, autoExpand]);\n\n // Auto-collapse when streaming completes\n useEffect(() => {\n if (!isStreaming && autoCollapse && startTimeRef.current) {\n // Small delay before collapsing for better UX\n const timeout = setTimeout(() => {\n setIsOpen(false);\n }, 500);\n\n startTimeRef.current = null;\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n\n return () => clearTimeout(timeout);\n }\n return undefined;\n }, [isStreaming, autoCollapse]);\n\n const contextValue: ReasoningContextValue = {\n isOpen,\n setIsOpen,\n isStreaming,\n duration,\n };\n\n return (\n <ReasoningContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-reasoning',\n 'rounded-[var(--ash-radius-md,0.5rem)]',\n 'border',\n isStreaming\n ? 'border-[var(--ash-thinking-border,rgba(147,51,234,0.2))] bg-[var(--ash-thinking-bg,rgba(147,51,234,0.06))]'\n : 'border-[var(--ash-border,rgba(255,255,255,0.08))] bg-[var(--ash-surface-dark,#0a0a0a)]',\n 'overflow-hidden',\n className\n )}\n data-reasoning-streaming={isStreaming}\n data-reasoning-open={isOpen}\n >\n {children}\n </div>\n </ReasoningContext.Provider>\n );\n}\n\n// ============================================================================\n// ReasoningTrigger\n// ============================================================================\n\nexport interface ReasoningTriggerProps {\n /** Additional class name */\n className?: string;\n /** Custom label */\n label?: string;\n /** Show duration */\n showDuration?: boolean;\n}\n\nexport function ReasoningTrigger({\n className,\n label = 'Thinking',\n showDuration = true,\n}: ReasoningTriggerProps) {\n const { isOpen, setIsOpen, isStreaming, duration } = useReasoning();\n\n const formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n };\n\n return (\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'ash-reasoning-trigger',\n 'w-full flex items-center gap-2',\n 'px-3 py-2',\n 'text-left',\n 'cursor-pointer hover:bg-white/[0.03] transition-colors',\n className\n )}\n >\n {/* Thinking icon with animation */}\n <span\n className={cn(\n 'w-4 h-4 flex items-center justify-center',\n isStreaming && 'animate-pulse'\n )}\n >\n {isStreaming ? (\n <svg\n className=\"w-4 h-4 text-purple-400 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\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 <svg\n className=\"w-4 h-4 text-purple-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n />\n </svg>\n )}\n </span>\n\n {/* Label */}\n <span\n className={cn(\n 'flex-1 font-medium',\n 'text-[var(--ash-font-size-sm,12px)]',\n isStreaming\n ? 'text-[var(--ash-thinking-text,rgb(196,181,253))]'\n : 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]'\n )}\n >\n {label}\n {isStreaming && '...'}\n </span>\n\n {/* Duration */}\n {showDuration && duration > 0 && (\n <span\n className={cn(\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]'\n )}\n >\n {formatDuration(duration)}\n </span>\n )}\n\n {/* Expand/collapse icon */}\n <svg\n className={cn(\n 'w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'transition-transform',\n isOpen && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n );\n}\n\n// ============================================================================\n// ReasoningContent\n// ============================================================================\n\nexport interface ReasoningContentProps {\n /** Content to display (thinking text) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n /** Maximum height before scroll */\n maxHeight?: number;\n}\n\nexport function ReasoningContent({\n children,\n className,\n maxHeight = 300,\n}: ReasoningContentProps) {\n const { isOpen, isStreaming } = useReasoning();\n\n if (!isOpen) return null;\n\n return (\n <div\n className={cn(\n 'ash-reasoning-content',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n 'ash-accordion-content',\n className\n )}\n >\n <div\n className={cn(\n 'p-3 overflow-auto',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))]',\n 'whitespace-pre-wrap font-mono',\n isStreaming && 'animate-pulse'\n )}\n style={{ maxHeight }}\n >\n {children}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Standalone ThinkingIndicator\n// ============================================================================\n\nexport interface ThinkingIndicatorProps {\n /** Whether thinking is active */\n isActive?: boolean;\n /** Label to display */\n label?: string;\n /** Additional class name */\n className?: string;\n}\n\nexport function ThinkingIndicator({\n isActive = true,\n label = 'Thinking',\n className,\n}: ThinkingIndicatorProps) {\n if (!isActive) return null;\n\n return (\n <div\n className={cn(\n 'ash-thinking-indicator',\n 'flex items-center gap-2',\n 'px-3 py-2',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-thinking-text,rgb(196,181,253))]',\n className\n )}\n >\n <span className=\"flex gap-1\">\n <span className=\"w-1.5 h-1.5 bg-current rounded-full animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 bg-current rounded-full animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 bg-current rounded-full animate-bounce\" style={{ animationDelay: '300ms' }} />\n </span>\n <span>{label}</span>\n </div>\n );\n}\n","/**\n * Task - AI SDK Elements compatible task list display\n *\n * Displays a list of tasks with status indicators and progress tracking.\n * Compatible with TodoPanel but with the Elements API style.\n *\n * @example\n * ```tsx\n * import { Task, TaskTrigger, TaskContent, TaskItem } from '@ash-cloud/ash-ui';\n *\n * <Task defaultOpen>\n * <TaskTrigger>Tasks (3/5)</TaskTrigger>\n * <TaskContent>\n * <TaskItem status=\"completed\">Setup project</TaskItem>\n * <TaskItem status=\"in_progress\">Implement feature</TaskItem>\n * <TaskItem status=\"pending\">Write tests</TaskItem>\n * </TaskContent>\n * </Task>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n useState,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils';\nimport type { TodoItem, TodoStatus } from '../types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface TaskContextValue {\n /** Whether the task list is open */\n isOpen: boolean;\n /** Toggle open state */\n setIsOpen: (value: boolean) => void;\n}\n\nconst TaskContext = createContext<TaskContextValue | null>(null);\n\nexport function useTask(): TaskContextValue {\n const context = useContext(TaskContext);\n if (!context) {\n throw new Error('useTask must be used within a Task');\n }\n return context;\n}\n\n// ============================================================================\n// Task\n// ============================================================================\n\nexport interface TaskProps {\n /** Child elements */\n children: ReactNode;\n /** Whether to start open */\n defaultOpen?: boolean;\n /** Additional class name */\n className?: string;\n}\n\nexport function Task({\n children,\n defaultOpen = false,\n className,\n}: TaskProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const contextValue: TaskContextValue = {\n isOpen,\n setIsOpen,\n };\n\n return (\n <TaskContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-task',\n 'rounded-[var(--ash-radius-md,0.5rem)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'bg-[var(--ash-surface-dark,#0a0a0a)]',\n 'overflow-hidden',\n className\n )}\n >\n {children}\n </div>\n </TaskContext.Provider>\n );\n}\n\n// ============================================================================\n// TaskTrigger\n// ============================================================================\n\nexport interface TaskTriggerProps {\n /** Trigger content (usually task count/label) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function TaskTrigger({ children, className }: TaskTriggerProps) {\n const { isOpen, setIsOpen } = useTask();\n\n return (\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'ash-task-trigger',\n 'w-full flex items-center gap-2',\n 'px-3 py-2',\n 'text-left',\n 'cursor-pointer hover:bg-white/[0.03] transition-colors',\n className\n )}\n >\n {/* Task list icon */}\n <svg\n className=\"w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"\n />\n </svg>\n\n {/* Content */}\n <span\n className={cn(\n 'flex-1 font-medium',\n 'text-[var(--ash-font-size-sm,12px)]',\n 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]'\n )}\n >\n {children}\n </span>\n\n {/* Expand/collapse icon */}\n <svg\n className={cn(\n 'w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n 'transition-transform',\n isOpen && 'rotate-180'\n )}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n );\n}\n\n// ============================================================================\n// TaskContent\n// ============================================================================\n\nexport interface TaskContentProps {\n /** Child elements (TaskItem components) */\n children: ReactNode;\n /** Additional class name */\n className?: string;\n}\n\nexport function TaskContent({ children, className }: TaskContentProps) {\n const { isOpen } = useTask();\n\n if (!isOpen) return null;\n\n return (\n <div\n className={cn(\n 'ash-task-content',\n 'border-t border-[var(--ash-border-subtle,rgba(255,255,255,0.04))]',\n 'ash-accordion-content',\n className\n )}\n >\n <div className=\"p-2 space-y-1\">\n {children}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// TaskItem\n// ============================================================================\n\nexport interface TaskItemProps {\n /** Task content */\n children: ReactNode;\n /** Task status */\n status: TodoStatus;\n /** Active form (shown when in_progress) */\n activeForm?: string;\n /** Additional class name */\n className?: string;\n}\n\nexport function TaskItem({\n children,\n status,\n activeForm,\n className,\n}: TaskItemProps) {\n const statusIcons: Record<TodoStatus, ReactNode> = {\n pending: (\n <svg\n className=\"w-4 h-4 text-[var(--ash-text-muted,rgba(255,255,255,0.5))]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeWidth={2} />\n </svg>\n ),\n in_progress: (\n <svg\n className=\"w-4 h-4 text-yellow-400 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\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 completed: (\n <svg\n className=\"w-4 h-4 text-[var(--ash-accent,#ccff00)]\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n ),\n };\n\n const statusColors: Record<TodoStatus, string> = {\n pending: 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n in_progress: 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]',\n completed: 'text-[var(--ash-text-secondary,rgba(255,255,255,0.7))] line-through',\n };\n\n return (\n <div\n className={cn(\n 'ash-task-item',\n 'flex items-center gap-2',\n 'px-2 py-1.5 rounded-md',\n status === 'in_progress' && 'bg-yellow-400/10',\n className\n )}\n data-task-status={status}\n >\n {/* Status icon */}\n {statusIcons[status]}\n\n {/* Content */}\n <span\n className={cn(\n 'flex-1',\n 'text-[var(--ash-font-size-sm,12px)]',\n statusColors[status]\n )}\n >\n {status === 'in_progress' && activeForm ? activeForm : children}\n </span>\n </div>\n );\n}\n\n// ============================================================================\n// TaskList (convenience component)\n// ============================================================================\n\nexport interface TaskListProps {\n /** Todo items to display */\n items: TodoItem[];\n /** Whether to start open */\n defaultOpen?: boolean;\n /** Additional class name */\n className?: string;\n /** Custom title */\n title?: string;\n}\n\nexport function TaskList({\n items,\n defaultOpen = true,\n className,\n title,\n}: TaskListProps) {\n const completed = items.filter((t) => t.status === 'completed').length;\n const total = items.length;\n const displayTitle = title || `Tasks (${completed}/${total})`;\n\n return (\n <Task defaultOpen={defaultOpen} className={className}>\n <TaskTrigger>{displayTitle}</TaskTrigger>\n <TaskContent>\n {items.map((item, index) => (\n <TaskItem\n key={index}\n status={item.status}\n activeForm={item.activeForm}\n >\n {item.content}\n </TaskItem>\n ))}\n </TaskContent>\n </Task>\n );\n}\n","/**\n * Attachments - AI SDK Elements compatible file attachment display\n *\n * Displays file attachments in grid, inline, or list layouts.\n *\n * @example\n * ```tsx\n * import { Attachments, Attachment, AttachmentPreview } from '@ash-cloud/ash-ui';\n *\n * <Attachments layout=\"grid\">\n * {files.map((file) => (\n * <Attachment key={file.name} file={file}>\n * <AttachmentPreview />\n * </Attachment>\n * ))}\n * </Attachments>\n * ```\n */\n\nimport {\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\nimport { cn, formatFileSize } from '../utils';\nimport type { FileAttachment } from '../types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface AttachmentContextValue {\n /** The file attachment data */\n file: FileAttachment | AttachmentFile;\n /** Whether the attachment can be removed */\n removable?: boolean;\n /** Remove callback */\n onRemove?: () => void;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue | null>(null);\n\nexport function useAttachment(): AttachmentContextValue {\n const context = useContext(AttachmentContext);\n if (!context) {\n throw new Error('useAttachment must be used within an Attachment');\n }\n return context;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AttachmentFile {\n /** File name */\n name: string;\n /** MIME type */\n type: string;\n /** File size in bytes */\n size: number;\n /** URL or data URL for preview */\n url?: string;\n /** Base64 data (for upload) */\n base64?: string;\n}\n\n// ============================================================================\n// Attachments Container\n// ============================================================================\n\nexport interface AttachmentsProps {\n /** Child elements (Attachment components) */\n children: ReactNode;\n /** Layout style */\n layout?: 'grid' | 'inline' | 'list';\n /** Additional class name */\n className?: string;\n}\n\nexport function Attachments({\n children,\n layout = 'inline',\n className,\n}: AttachmentsProps) {\n const layoutStyles: Record<string, string> = {\n grid: 'grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2',\n inline: 'flex flex-wrap gap-2',\n list: 'flex flex-col gap-1',\n };\n\n return (\n <div\n className={cn(\n 'ash-attachments',\n layoutStyles[layout],\n className\n )}\n data-layout={layout}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// Attachment\n// ============================================================================\n\nexport interface AttachmentProps {\n /** File data */\n file: FileAttachment | AttachmentFile;\n /** Child elements (AttachmentPreview, etc.) */\n children?: ReactNode;\n /** Whether the attachment can be removed */\n removable?: boolean;\n /** Remove callback */\n onRemove?: () => void;\n /** Additional class name */\n className?: string;\n}\n\nexport function Attachment({\n file,\n children,\n removable = false,\n onRemove,\n className,\n}: AttachmentProps) {\n const contextValue: AttachmentContextValue = {\n file,\n removable,\n onRemove,\n };\n\n return (\n <AttachmentContext.Provider value={contextValue}>\n <div\n className={cn(\n 'ash-attachment relative group',\n 'rounded-[var(--ash-radius-sm,0.375rem)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'bg-[var(--ash-surface-elevated,#111111)]',\n 'overflow-hidden',\n 'hover:border-[var(--ash-border-emphasis,rgba(255,255,255,0.15))]',\n 'transition-colors',\n className\n )}\n data-file-type={file.type}\n >\n {children || (\n <>\n <AttachmentPreview />\n <AttachmentInfo />\n {removable && <AttachmentRemove />}\n </>\n )}\n </div>\n </AttachmentContext.Provider>\n );\n}\n\n// ============================================================================\n// AttachmentPreview\n// ============================================================================\n\nexport interface AttachmentPreviewProps {\n /** Additional class name */\n className?: string;\n /** Preview height */\n height?: number;\n}\n\nexport function AttachmentPreview({\n className,\n height = 80,\n}: AttachmentPreviewProps) {\n const { file } = useAttachment();\n\n const isImage = file.type.startsWith('image/');\n const url = 'url' in file ? file.url : ('base64' in file ? `data:${file.type};base64,${file.base64}` : undefined);\n\n if (isImage && url) {\n return (\n <div\n className={cn(\n 'ash-attachment-preview',\n 'w-full bg-black/20 overflow-hidden',\n className\n )}\n style={{ height }}\n >\n <img\n src={url}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n );\n }\n\n // Generic file icon\n const iconForType = (): ReactNode => {\n if (file.type.includes('pdf')) {\n return (\n <svg className=\"w-8 h-8\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n <text x=\"7\" y=\"16\" fontSize=\"6\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">PDF</text>\n </svg>\n );\n }\n if (file.type.includes('text') || file.type.includes('json')) {\n return (\n <svg className=\"w-8 h-8\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} 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 </svg>\n );\n }\n return (\n <svg className=\"w-8 h-8\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n );\n };\n\n return (\n <div\n className={cn(\n 'ash-attachment-preview',\n 'w-full flex items-center justify-center',\n 'bg-[var(--ash-surface-dark,#0a0a0a)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]',\n className\n )}\n style={{ height }}\n >\n {iconForType()}\n </div>\n );\n}\n\n// ============================================================================\n// AttachmentInfo\n// ============================================================================\n\nexport interface AttachmentInfoProps {\n /** Additional class name */\n className?: string;\n /** Show file size */\n showSize?: boolean;\n}\n\nexport function AttachmentInfo({\n className,\n showSize = true,\n}: AttachmentInfoProps) {\n const { file } = useAttachment();\n\n return (\n <div\n className={cn(\n 'ash-attachment-info',\n 'px-2 py-1.5',\n 'truncate',\n className\n )}\n >\n <div\n className={cn(\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-primary,rgba(255,255,255,0.9))]',\n 'truncate font-medium'\n )}\n title={file.name}\n >\n {file.name}\n </div>\n {showSize && (\n <div\n className={cn(\n 'text-[var(--ash-font-size-xs,10px)]',\n 'text-[var(--ash-text-muted,rgba(255,255,255,0.5))]'\n )}\n >\n {formatFileSize(file.size)}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// AttachmentRemove\n// ============================================================================\n\nexport interface AttachmentRemoveProps {\n /** Additional class name */\n className?: string;\n}\n\nexport function AttachmentRemove({ className }: AttachmentRemoveProps) {\n const { onRemove, removable } = useAttachment();\n\n if (!removable || !onRemove) return null;\n\n return (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className={cn(\n 'ash-attachment-remove',\n 'absolute top-1 right-1',\n 'w-5 h-5 rounded-full',\n 'flex items-center justify-center',\n 'bg-black/60 text-white/80',\n 'hover:bg-black/80 hover:text-white',\n 'opacity-0 group-hover:opacity-100',\n 'transition-opacity',\n className\n )}\n aria-label=\"Remove attachment\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n );\n}\n\n// ============================================================================\n// Compact FileBadge (for inline display)\n// ============================================================================\n\nexport interface FileBadgeProps {\n /** File data */\n file: FileAttachment | AttachmentFile;\n /** Whether the file can be removed */\n removable?: boolean;\n /** Remove callback */\n onRemove?: () => void;\n /** Additional class name */\n className?: string;\n}\n\nexport function FileBadgeCompact({\n file,\n removable = false,\n onRemove,\n className,\n}: FileBadgeProps) {\n const isImage = file.type.startsWith('image/');\n\n return (\n <div\n className={cn(\n 'ash-file-badge group inline-flex items-center gap-1.5',\n 'px-2 py-1 rounded-md',\n 'bg-[var(--ash-surface-elevated,#111111)]',\n 'border border-[var(--ash-border,rgba(255,255,255,0.08))]',\n 'text-[var(--ash-font-size-xs,10px)]',\n className\n )}\n >\n {/* Icon */}\n {isImage ? (\n <svg className=\"w-3 h-3 text-[var(--ash-text-muted)]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-[var(--ash-text-muted)]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n )}\n\n {/* Name */}\n <span className=\"text-[var(--ash-text-primary)] truncate max-w-[100px]\">\n {file.name}\n </span>\n\n {/* Size */}\n <span className=\"text-[var(--ash-text-muted)]\">\n {formatFileSize(file.size)}\n </span>\n\n {/* Remove button */}\n {removable && onRemove && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className={cn(\n 'ml-0.5 text-[var(--ash-text-muted)]',\n 'hover:text-red-400 transition-colors',\n 'opacity-0 group-hover:opacity-100'\n )}\n aria-label=\"Remove\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","/**\n * Shimmer - AI SDK Elements compatible loading indicator\n *\n * Provides various loading state displays including shimmer effects\n * and animated indicators.\n *\n * @example\n * ```tsx\n * import { Shimmer, ShimmerLine, ShimmerBlock } from '@ash-cloud/ash-ui';\n *\n * <Shimmer>\n * <ShimmerLine width=\"80%\" />\n * <ShimmerLine width=\"60%\" />\n * <ShimmerBlock height={100} />\n * </Shimmer>\n * ```\n */\n\nimport { type ReactNode } from 'react';\nimport { cn } from '../utils';\n\n// ============================================================================\n// Shimmer Container\n// ============================================================================\n\nexport interface ShimmerProps {\n /** Child elements */\n children?: ReactNode;\n /** Additional class name */\n className?: string;\n /** Whether shimmer is active */\n isActive?: boolean;\n}\n\nexport function Shimmer({\n children,\n className,\n isActive = true,\n}: ShimmerProps) {\n if (!isActive) return null;\n\n return (\n <div\n className={cn(\n 'ash-shimmer',\n 'flex flex-col gap-2',\n className\n )}\n role=\"status\"\n aria-label=\"Loading\"\n >\n {children || (\n <>\n <ShimmerLine width=\"100%\" />\n <ShimmerLine width=\"80%\" />\n <ShimmerLine width=\"60%\" />\n </>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// ShimmerLine\n// ============================================================================\n\nexport interface ShimmerLineProps {\n /** Width (CSS value or percentage) */\n width?: string | number;\n /** Height in pixels */\n height?: number;\n /** Additional class name */\n className?: string;\n}\n\nexport function ShimmerLine({\n width = '100%',\n height = 16,\n className,\n}: ShimmerLineProps) {\n return (\n <div\n className={cn(\n 'ash-shimmer-line',\n 'rounded-md',\n 'bg-gradient-to-r from-white/5 via-white/10 to-white/5',\n 'bg-[length:200%_100%]',\n 'animate-[shimmer_1.5s_ease-in-out_infinite]',\n className\n )}\n style={{\n width: typeof width === 'number' ? `${width}px` : width,\n height,\n }}\n />\n );\n}\n\n// ============================================================================\n// ShimmerBlock\n// ============================================================================\n\nexport interface ShimmerBlockProps {\n /** Width (CSS value or percentage) */\n width?: string | number;\n /** Height in pixels */\n height?: number;\n /** Border radius */\n rounded?: 'sm' | 'md' | 'lg' | 'full' | 'none';\n /** Additional class name */\n className?: string;\n}\n\nexport function ShimmerBlock({\n width = '100%',\n height = 100,\n rounded = 'md',\n className,\n}: ShimmerBlockProps) {\n const roundedStyles: Record<string, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n };\n\n return (\n <div\n className={cn(\n 'ash-shimmer-block',\n roundedStyles[rounded],\n 'bg-gradient-to-r from-white/5 via-white/10 to-white/5',\n 'bg-[length:200%_100%]',\n 'animate-[shimmer_1.5s_ease-in-out_infinite]',\n className\n )}\n style={{\n width: typeof width === 'number' ? `${width}px` : width,\n height,\n }}\n />\n );\n}\n\n// ============================================================================\n// ShimmerText (inline shimmer for text placeholders)\n// ============================================================================\n\nexport interface ShimmerTextProps {\n /** Number of characters to approximate width */\n chars?: number;\n /** Additional class name */\n className?: string;\n}\n\nexport function ShimmerText({\n chars = 20,\n className,\n}: ShimmerTextProps) {\n return (\n <span\n className={cn(\n 'ash-shimmer-text inline-block',\n 'rounded',\n 'bg-gradient-to-r from-white/5 via-white/10 to-white/5',\n 'bg-[length:200%_100%]',\n 'animate-[shimmer_1.5s_ease-in-out_infinite]',\n className\n )}\n style={{\n width: `${chars}ch`,\n height: '1em',\n verticalAlign: 'middle',\n }}\n />\n );\n}\n\n// ============================================================================\n// LoadingDots\n// ============================================================================\n\nexport interface LoadingDotsProps {\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional class name */\n className?: string;\n}\n\nexport function LoadingDots({\n size = 'md',\n className,\n}: LoadingDotsProps) {\n const sizeStyles: Record<string, string> = {\n sm: 'w-1 h-1',\n md: 'w-1.5 h-1.5',\n lg: 'w-2 h-2',\n };\n\n const gapStyles: Record<string, string> = {\n sm: 'gap-0.5',\n md: 'gap-1',\n lg: 'gap-1.5',\n };\n\n return (\n <span\n className={cn(\n 'ash-loading-dots inline-flex items-center',\n gapStyles[size],\n className\n )}\n role=\"status\"\n aria-label=\"Loading\"\n >\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={cn(\n sizeStyles[size],\n 'rounded-full',\n 'bg-current',\n 'animate-bounce'\n )}\n style={{ animationDelay: `${i * 150}ms` }}\n />\n ))}\n </span>\n );\n}\n\n// ============================================================================\n// LoadingSpinner\n// ============================================================================\n\nexport interface LoadingSpinnerProps {\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional class name */\n className?: string;\n}\n\nexport function LoadingSpinner({\n size = 'md',\n className,\n}: LoadingSpinnerProps) {\n const sizeStyles: Record<string, string> = {\n sm: 'w-4 h-4',\n md: 'w-6 h-6',\n lg: 'w-8 h-8',\n };\n\n return (\n <svg\n className={cn(\n 'ash-loading-spinner animate-spin',\n sizeStyles[size],\n className\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n role=\"status\"\n aria-label=\"Loading\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\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// ============================================================================\n// MessageShimmer (pre-built message loading state)\n// ============================================================================\n\nexport interface MessageShimmerProps {\n /** Message role to style appropriately */\n role?: 'user' | 'assistant';\n /** Additional class name */\n className?: string;\n}\n\nexport function MessageShimmer({\n role = 'assistant',\n className,\n}: MessageShimmerProps) {\n return (\n <div\n className={cn(\n 'ash-message-shimmer flex gap-2',\n role === 'user' && 'flex-row-reverse',\n className\n )}\n >\n {/* Avatar shimmer */}\n <ShimmerBlock\n width={20}\n height={20}\n rounded=\"full\"\n />\n\n {/* Content shimmer */}\n <div className=\"flex-1 space-y-2 max-w-[80%]\">\n <ShimmerLine width=\"100%\" height={14} />\n <ShimmerLine width=\"85%\" height={14} />\n <ShimmerLine width=\"70%\" height={14} />\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { LogEntry, LogLevel, LogCategory } from '../types';\nimport { cn, formatTimestamp } from '../utils';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n InfoIcon,\n AlertTriangleIcon,\n AlertCircleIcon,\n BugIcon,\n TerminalIcon,\n} from '../icons';\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction getLevelIcon(level: LogLevel) {\n switch (level) {\n case 'info':\n return <InfoIcon className=\"w-3.5 h-3.5\" />;\n case 'warn':\n return <AlertTriangleIcon className=\"w-3.5 h-3.5\" />;\n case 'error':\n return <AlertCircleIcon className=\"w-3.5 h-3.5\" />;\n case 'debug':\n return <BugIcon className=\"w-3.5 h-3.5\" />;\n }\n}\n\nfunction getLevelColor(level: LogLevel) {\n switch (level) {\n case 'info':\n return 'text-blue-400';\n case 'warn':\n return 'text-yellow-500';\n case 'error':\n return 'text-red-400';\n case 'debug':\n return 'text-white/50';\n }\n}\n\nfunction getLevelBgColor(level: LogLevel) {\n switch (level) {\n case 'info':\n return 'bg-blue-900/20';\n case 'warn':\n return 'bg-yellow-900/20';\n case 'error':\n return 'bg-red-900/20';\n case 'debug':\n return 'bg-white/5';\n }\n}\n\nfunction getCategoryLabel(category: LogCategory) {\n switch (category) {\n case 'setup':\n return 'Setup';\n case 'skills':\n return 'Skills';\n case 'execution':\n return 'Execution';\n case 'process':\n return 'Process';\n case 'startup':\n return 'Startup';\n }\n}\n\n// =============================================================================\n// Log Entry Component\n// =============================================================================\n\ninterface LogEntryRowProps {\n log: LogEntry;\n}\n\nfunction LogEntryRow({ log }: LogEntryRowProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasData = log.data && Object.keys(log.data).length > 0;\n\n return (\n <div\n className={cn(\n 'px-3 py-2 border-b border-white/10 last:border-b-0',\n getLevelBgColor(log.level)\n )}\n >\n <div\n className={cn('flex items-start gap-2', hasData && 'cursor-pointer')}\n onClick={() => hasData && setIsExpanded(!isExpanded)}\n >\n {/* Expand indicator */}\n <div className=\"w-4 flex-shrink-0 pt-0.5\">\n {hasData &&\n (isExpanded ? (\n <ChevronDownIcon className=\"w-3 h-3 text-white/40\" />\n ) : (\n <ChevronRightIcon className=\"w-3 h-3 text-white/40\" />\n ))}\n </div>\n\n {/* Level icon */}\n <div className={cn('flex-shrink-0 pt-0.5', getLevelColor(log.level))}>\n {getLevelIcon(log.level)}\n </div>\n\n {/* Timestamp */}\n <span className=\"text-xs text-white/40 font-mono flex-shrink-0 pt-0.5\">\n {formatTimestamp(log.timestamp)}\n </span>\n\n {/* Category badge */}\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-white/10 text-white/70 font-medium flex-shrink-0\">\n {getCategoryLabel(log.category)}\n </span>\n\n {/* Message */}\n <span className=\"text-sm text-white/80 flex-1 break-words\">\n {log.message}\n </span>\n </div>\n\n {/* Expanded data */}\n {isExpanded && hasData && (\n <div className=\"mt-2 ml-6 pl-4 border-l-2 border-white/20\">\n <pre className=\"text-xs text-white/50 font-mono whitespace-pre-wrap overflow-x-auto\">\n {JSON.stringify(log.data, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// LogsPanel Component\n// =============================================================================\n\nexport interface LogsPanelProps {\n logs: LogEntry[];\n title?: string;\n isLoading?: boolean;\n defaultCollapsed?: boolean;\n maxHeight?: number;\n className?: string;\n}\n\n/**\n * LogsPanel - Collapsible panel for displaying log entries\n *\n * Features:\n * - Collapsible header with log count\n * - Error/warning count badges\n * - Level-based coloring and icons\n * - Expandable entries with JSON data\n *\n * @example\n * ```tsx\n * <LogsPanel logs={logEntries} />\n * <LogsPanel logs={logs} title=\"Execution Logs\" defaultCollapsed={false} />\n * ```\n */\nexport function LogsPanel({\n logs,\n title = 'Logs',\n isLoading,\n defaultCollapsed = true,\n maxHeight = 256,\n className,\n}: LogsPanelProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const errorCount = logs.filter((l) => l.level === 'error').length;\n const warnCount = logs.filter((l) => l.level === 'warn').length;\n\n if (logs.length === 0 && !isLoading) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'border-t border-white/10 bg-[var(--ash-surface-dark,#0a0a0a)]',\n className\n )}\n >\n {/* Header */}\n <button\n onClick={() => setIsCollapsed(!isCollapsed)}\n className=\"w-full flex items-center justify-between px-4 py-2 hover:bg-white/5 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <TerminalIcon className=\"w-4 h-4 text-white/50\" />\n <span className=\"text-sm font-medium text-white/80\">{title}</span>\n <span className=\"text-xs text-white/40\">({logs.length})</span>\n {errorCount > 0 && (\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-red-900/50 text-red-400 font-medium\">\n {errorCount} error{errorCount > 1 ? 's' : ''}\n </span>\n )}\n {warnCount > 0 && (\n <span className=\"text-xs px-1.5 py-0.5 rounded bg-yellow-900/50 text-yellow-400 font-medium\">\n {warnCount} warning{warnCount > 1 ? 's' : ''}\n </span>\n )}\n {isLoading && (\n <span className=\"text-xs text-white/40 animate-pulse\">\n Loading...\n </span>\n )}\n </div>\n {isCollapsed ? (\n <ChevronRightIcon className=\"w-4 h-4 text-white/40\" />\n ) : (\n <ChevronDownIcon className=\"w-4 h-4 text-white/40\" />\n )}\n </button>\n\n {/* Log entries */}\n {!isCollapsed && (\n <div\n className=\"overflow-y-auto border-t border-white/10\"\n style={{ maxHeight }}\n >\n {logs.length === 0 ? (\n <div className=\"px-4 py-6 text-center text-sm text-white/50\">\n No logs yet\n </div>\n ) : (\n logs.map((log, index) => (\n <LogEntryRow key={`${log.timestamp}-${index}`} log={log} />\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default LogsPanel;\n","'use client';\n\nimport { useState, useCallback, type KeyboardEvent } from 'react';\nimport { cn } from '../utils';\n\nexport interface EnvVarsPanelProps {\n /** Current environment variables */\n envVars: Record<string, string>;\n /** Callback when environment variables change */\n onChange: (envVars: Record<string, string>) => void;\n /** Whether the panel is collapsed initially (default: true) */\n defaultCollapsed?: boolean;\n /** Additional class name */\n className?: string;\n /** Label for the panel header */\n label?: string;\n /** Helper text shown below the input */\n helperText?: string;\n}\n\n/**\n * EnvVarsPanel - Collapsible panel for managing environment variables\n *\n * Provides a UI for adding, viewing, and removing environment variables.\n * Commonly used to set environment variables for sandbox/agent execution.\n *\n * @example\n * ```tsx\n * function ChatSettings() {\n * const [envVars, setEnvVars] = useState<Record<string, string>>({});\n *\n * return (\n * <EnvVarsPanel\n * envVars={envVars}\n * onChange={setEnvVars}\n * helperText=\"These variables will be available in the sandbox.\"\n * />\n * );\n * }\n * ```\n */\nexport function EnvVarsPanel({\n envVars,\n onChange,\n defaultCollapsed = true,\n className,\n label = 'Environment Variables',\n helperText = 'These environment variables will be available in the sandbox for new sessions.',\n}: EnvVarsPanelProps) {\n const [expanded, setExpanded] = useState(!defaultCollapsed);\n const [newEnvKey, setNewEnvKey] = useState('');\n const [newEnvValue, setNewEnvValue] = useState('');\n\n const hasEnvVars = Object.keys(envVars).length > 0;\n\n const handleAddEnvVar = useCallback(() => {\n const key = newEnvKey.trim();\n const val = newEnvValue.trim();\n if (key) {\n onChange({ ...envVars, [key]: val });\n setNewEnvKey('');\n setNewEnvValue('');\n }\n }, [envVars, newEnvKey, newEnvValue, onChange]);\n\n const handleRemoveEnvVar = useCallback(\n (key: string) => {\n const newEnvVars = { ...envVars };\n delete newEnvVars[key];\n onChange(newEnvVars);\n },\n [envVars, onChange]\n );\n\n const handleEnvKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddEnvVar();\n }\n },\n [handleAddEnvVar]\n );\n\n return (\n <div className={cn('ash-env-vars-panel', className)}>\n {/* Header toggle */}\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"ash-env-vars-header\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('ash-env-vars-chevron', expanded && 'ash-env-vars-chevron-expanded')}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"ash-env-vars-label\">{label}</span>\n {hasEnvVars && !expanded && (\n <span className=\"ash-env-vars-badge\">{Object.keys(envVars).length}</span>\n )}\n </button>\n\n {/* Expanded content */}\n {expanded && (\n <div className=\"ash-env-vars-content\">\n {/* Existing env vars */}\n {Object.entries(envVars).map(([key, val]) => (\n <div key={key} className=\"ash-env-vars-item\">\n <span className=\"ash-env-vars-key\">{key}</span>\n <span className=\"ash-env-vars-equals\">=</span>\n <span className=\"ash-env-vars-value\">{val || '(empty)'}</span>\n <button\n type=\"button\"\n onClick={() => handleRemoveEnvVar(key)}\n className=\"ash-env-vars-remove\"\n title=\"Remove variable\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"w-4 h-4\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n ))}\n\n {/* Add new env var */}\n <div className=\"ash-env-vars-add\">\n <input\n type=\"text\"\n value={newEnvKey}\n onChange={(e) =>\n setNewEnvKey(e.target.value.toUpperCase().replace(/[^A-Z0-9_]/g, ''))\n }\n onKeyDown={handleEnvKeyDown}\n placeholder=\"KEY\"\n className=\"ash-env-vars-input ash-env-vars-input-key\"\n />\n <span className=\"ash-env-vars-equals\">=</span>\n <input\n type=\"text\"\n value={newEnvValue}\n onChange={(e) => setNewEnvValue(e.target.value)}\n onKeyDown={handleEnvKeyDown}\n placeholder=\"value\"\n className=\"ash-env-vars-input ash-env-vars-input-value\"\n />\n <button\n type=\"button\"\n onClick={handleAddEnvVar}\n disabled={!newEnvKey.trim()}\n className=\"ash-env-vars-add-button\"\n >\n Add\n </button>\n </div>\n\n {helperText && <p className=\"ash-env-vars-helper\">{helperText}</p>}\n </div>\n )}\n </div>\n );\n}\n\nexport default EnvVarsPanel;\n","import type { ParsedOption } from '../utils';\nimport { cn } from '../utils';\n\nexport interface OptionCardsProps {\n /** Parsed options to display */\n options: ParsedOption[];\n /** Callback when an option is selected */\n onSelect: (option: ParsedOption) => void;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * OptionCards - Display clickable option cards for interactive selection\n *\n * Renders a grid of glassmorphic cards that users can click to select an option.\n * Used when assistant messages contain structured options for the user to choose from.\n *\n * @example\n * ```tsx\n * <OptionCards\n * options={[\n * { id: '1', label: 'Add Product', description: 'Upload a new product' },\n * { id: '2', label: 'Browse Existing', description: 'View your products' },\n * ]}\n * onSelect={(opt) => sendMessage(opt.label)}\n * />\n * ```\n */\nexport function OptionCards({ options, onSelect, className }: OptionCardsProps) {\n return (\n <div className={cn('grid gap-2 mt-3', className)} style={{\n gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))',\n }}>\n {options.map((option) => (\n <button\n key={option.id}\n onClick={() => onSelect(option)}\n className={cn(\n 'flex items-start gap-3 p-3 rounded-xl text-left',\n 'bg-white/5 border border-white/10',\n 'hover:bg-[var(--ash-accent)]/10 hover:border-[var(--ash-accent)]/30',\n 'focus:outline-none focus:ring-2 focus:ring-[var(--ash-accent)]/50',\n 'transition-all duration-200 cursor-pointer',\n 'group'\n )}\n >\n {/* Option number badge */}\n <span className={cn(\n 'flex-shrink-0 w-6 h-6 rounded-lg',\n 'bg-[var(--ash-accent)]/20 text-[var(--ash-accent)]',\n 'flex items-center justify-center',\n 'text-xs font-semibold',\n 'group-hover:bg-[var(--ash-accent)]/30',\n 'transition-colors duration-200'\n )}>\n {option.id}\n </span>\n\n {/* Option content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-white/90 group-hover:text-white transition-colors\">\n {option.label}\n </div>\n {option.description && (\n <div className=\"text-xs text-white/50 mt-0.5 line-clamp-2 group-hover:text-white/60 transition-colors\">\n {option.description}\n </div>\n )}\n </div>\n\n {/* Arrow indicator */}\n <svg\n className={cn(\n 'w-4 h-4 text-white/30 flex-shrink-0 mt-0.5',\n 'group-hover:text-[var(--ash-accent)] group-hover:translate-x-0.5',\n 'transition-all duration-200'\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n ))}\n </div>\n );\n}\n\nexport default OptionCards;\n","import type { ActionType } from '../types';\nimport {\n TerminalIcon,\n FileIcon,\n EditIcon,\n FilePlusIcon,\n SearchIcon,\n GlobeIcon,\n PlugIcon,\n ToolIcon,\n FolderSearchIcon,\n ListChecksIcon,\n BotIcon,\n} from '../icons';\n\nexport interface ActionIconProps {\n actionType: ActionType;\n className?: string;\n}\n\n/**\n * ActionIcon - Display the appropriate icon for a tool action type\n *\n * @example\n * ```tsx\n * <ActionIcon actionType={{ action: 'command_run', command: 'ls' }} />\n * <ActionIcon actionType={{ action: 'file_read', path: '/file.txt' }} className=\"w-5 h-5\" />\n * ```\n */\nexport function ActionIcon({ actionType, className = 'w-4 h-4' }: ActionIconProps) {\n switch (actionType.action) {\n case 'command_run':\n return <TerminalIcon className={className} />;\n case 'file_read':\n return <FileIcon className={className} />;\n case 'file_edit':\n return <EditIcon className={className} />;\n case 'file_write':\n return <FilePlusIcon className={className} />;\n case 'search':\n return <SearchIcon className={className} />;\n case 'glob':\n return <FolderSearchIcon className={className} />;\n case 'web_fetch':\n return <GlobeIcon className={className} />;\n case 'web_search':\n return <SearchIcon className={className} />;\n case 'mcp_tool':\n return <PlugIcon className={className} />;\n case 'todo_write':\n return <ListChecksIcon className={className} />;\n case 'agent_tool':\n return <BotIcon className={className} />;\n case 'generic_tool':\n default:\n return <ToolIcon className={className} />;\n }\n}\n\nexport default ActionIcon;\n","/**\n * ASH UI Design Tokens\n *\n * Single source of truth for colors, spacing, animations, and other design values.\n * Used by both ash-ui components (via Tailwind/CSS) and the embed widget (via inline styles).\n *\n * @example\n * ```ts\n * import { colors, animations, shadows } from '@ash-cloud/ash-ui/tokens';\n *\n * // In embed widget (inline styles)\n * const style = { backgroundColor: colors.surface.dark };\n *\n * // In Tailwind config\n * module.exports = {\n * theme: {\n * extend: {\n * colors: colors,\n * }\n * }\n * };\n * ```\n */\n\n// =============================================================================\n// Colors\n// =============================================================================\n\nexport const colors = {\n // Primary accent color (lime green)\n accent: {\n DEFAULT: '#ccff00',\n 50: '#f8ffe5',\n 100: '#eeffb8',\n 200: '#e0ff85',\n 300: '#d4ff52',\n 400: '#ccff00',\n 500: '#b8e600',\n 600: '#99cc00',\n 700: '#739900',\n 800: '#4d6600',\n 900: '#263300',\n },\n\n // Surface colors (dark theme)\n surface: {\n dark: '#0a0a0a',\n darker: '#050505',\n card: '#0c0c0c',\n elevated: '#111111',\n },\n\n // Text colors\n text: {\n primary: '#ffffff',\n secondary: 'rgba(255, 255, 255, 0.7)',\n muted: 'rgba(255, 255, 255, 0.5)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n },\n\n // Border colors\n border: {\n DEFAULT: 'rgba(255, 255, 255, 0.1)',\n hover: 'rgba(255, 255, 255, 0.2)',\n accent: 'rgba(204, 255, 0, 0.3)',\n accentHover: 'rgba(204, 255, 0, 0.5)',\n },\n\n // Status colors\n status: {\n success: '#10b981',\n warning: '#eab308',\n error: '#ef4444',\n info: '#3b82f6',\n },\n\n // User message background\n user: {\n bg: 'rgba(204, 255, 0, 0.1)',\n border: 'rgba(204, 255, 0, 0.2)',\n },\n\n // Assistant message background\n assistant: {\n bg: 'rgba(255, 255, 255, 0.05)',\n border: 'rgba(255, 255, 255, 0.1)',\n },\n} as const;\n\n// =============================================================================\n// Spacing\n// =============================================================================\n\nexport const spacing = {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '24px',\n '2xl': '32px',\n '3xl': '48px',\n} as const;\n\n// =============================================================================\n// Border Radius\n// =============================================================================\n\nexport const borderRadius = {\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '20px',\n '2xl': '24px',\n full: '9999px',\n} as const;\n\n// =============================================================================\n// Shadows\n// =============================================================================\n\nexport const shadows = {\n sm: '0 1px 2px rgba(0, 0, 0, 0.3)',\n md: '0 4px 6px rgba(0, 0, 0, 0.4)',\n lg: '0 10px 15px rgba(0, 0, 0, 0.5)',\n xl: '0 20px 25px rgba(0, 0, 0, 0.6)',\n glow: {\n sm: '0 0 10px rgba(204, 255, 0, 0.2)',\n md: '0 0 20px rgba(204, 255, 0, 0.3)',\n lg: '0 0 30px rgba(204, 255, 0, 0.5)',\n },\n panel: '0 25px 50px rgba(0, 0, 0, 0.5)',\n} as const;\n\n// =============================================================================\n// Typography\n// =============================================================================\n\nexport const typography = {\n fontFamily: {\n sans: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n mono: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace',\n },\n fontSize: {\n xs: '12px',\n sm: '14px',\n base: '16px',\n lg: '18px',\n xl: '20px',\n '2xl': '24px',\n },\n lineHeight: {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n },\n} as const;\n\n// =============================================================================\n// CSS Variable Names\n// =============================================================================\n\n/**\n * CSS custom property names for font sizes.\n * Override these in your CSS to customize typography.\n *\n * @example\n * ```css\n * :root {\n * --ash-font-size-base: 16px;\n * --ash-font-size-sm: 14px;\n * --ash-font-size-xs: 12px;\n * --ash-font-size-code: 14px;\n * }\n * ```\n */\nexport const cssVars = {\n fontSize: {\n base: '--ash-font-size-base',\n sm: '--ash-font-size-sm',\n xs: '--ash-font-size-xs',\n code: '--ash-font-size-code',\n },\n accent: '--ash-accent',\n accentForeground: '--ash-accent-foreground',\n surfaceDark: '--ash-surface-dark',\n surfaceDarker: '--ash-surface-darker',\n surfaceCard: '--ash-surface-card',\n surfaceElevated: '--ash-surface-elevated',\n surfaceBorder: '--ash-surface-border',\n} as const;\n\n// =============================================================================\n// Animations - Keyframes as objects for inline style injection\n// =============================================================================\n\nexport const keyframes = {\n slideUp: {\n from: { opacity: '0', transform: 'translateY(20px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n fadeIn: {\n from: { opacity: '0', transform: 'translateY(10px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n blink: {\n '0%, 50%': { opacity: '1' },\n '51%, 100%': { opacity: '0' },\n },\n bounce: {\n '0%, 80%, 100%': { transform: 'scale(0)' },\n '40%': { transform: 'scale(1)' },\n },\n pulse: {\n '0%, 100%': { opacity: '1' },\n '50%': { opacity: '0.5' },\n },\n glowPulse: {\n '0%, 100%': { boxShadow: '0 0 20px rgba(204, 255, 0, 0.3)' },\n '50%': { boxShadow: '0 0 40px rgba(204, 255, 0, 0.5)' },\n },\n} as const;\n\n// CSS keyframe strings for injection into style tags\nexport const keyframesCss = {\n slideUp: `\n @keyframes ash-slide-up {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `,\n fadeIn: `\n @keyframes ash-fade-in {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `,\n blink: `\n @keyframes ash-blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n `,\n bounce: `\n @keyframes ash-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `,\n pulse: `\n @keyframes ash-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `,\n glowPulse: `\n @keyframes ash-glow-pulse {\n 0%, 100% { box-shadow: 0 0 20px rgba(204, 255, 0, 0.3); }\n 50% { box-shadow: 0 0 40px rgba(204, 255, 0, 0.5); }\n }\n `,\n} as const;\n\n// All keyframes combined for easy injection\nexport const allKeyframesCss = Object.values(keyframesCss).join('\\n');\n\n// =============================================================================\n// Transitions\n// =============================================================================\n\nexport const transitions = {\n fast: '150ms ease-out',\n normal: '300ms ease-out',\n slow: '500ms ease-out',\n spring: '400ms cubic-bezier(0.16, 1, 0.3, 1)',\n} as const;\n\n// =============================================================================\n// Z-Index Scale\n// =============================================================================\n\nexport const zIndex = {\n base: 0,\n dropdown: 100,\n modal: 200,\n tooltip: 300,\n widget: 999999,\n} as const;\n\n// =============================================================================\n// Widget-Specific Dimensions\n// =============================================================================\n\nexport const widget = {\n launcher: {\n size: '60px',\n iconSize: '28px',\n },\n panel: {\n width: '400px',\n height: '600px',\n maxHeight: '80vh',\n },\n header: {\n height: '60px',\n },\n input: {\n minHeight: '60px',\n maxHeight: '150px',\n },\n message: {\n maxWidth: '85%',\n avatarSize: '32px',\n },\n gap: '20px', // Gap from edge of screen\n} as const;\n\n// =============================================================================\n// Helper: Convert tokens to CSS variables\n// =============================================================================\n\nexport function tokensToCssVariables(prefix = 'ash'): Record<string, string> {\n const vars: Record<string, string> = {};\n\n // Colors\n vars[`--${prefix}-accent`] = colors.accent.DEFAULT;\n Object.entries(colors.accent).forEach(([key, value]) => {\n if (key !== 'DEFAULT') vars[`--${prefix}-accent-${key}`] = value;\n });\n\n Object.entries(colors.surface).forEach(([key, value]) => {\n vars[`--${prefix}-surface-${key}`] = value;\n });\n\n Object.entries(colors.text).forEach(([key, value]) => {\n vars[`--${prefix}-text-${key}`] = value;\n });\n\n Object.entries(colors.border).forEach(([key, value]) => {\n if (key !== 'DEFAULT') vars[`--${prefix}-border-${key}`] = value;\n else vars[`--${prefix}-border`] = value;\n });\n\n // Font sizes (default values that can be overridden)\n vars[`--${prefix}-font-size-base`] = '14px';\n vars[`--${prefix}-font-size-sm`] = '12px';\n vars[`--${prefix}-font-size-xs`] = '11px';\n vars[`--${prefix}-font-size-code`] = '13px';\n\n return vars;\n}\n\n// =============================================================================\n// Helper: Generate inline styles from token names\n// =============================================================================\n\nexport const inlineStyles = {\n // Glass panel effect\n glassPanel: {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n backdropFilter: 'blur(24px)',\n WebkitBackdropFilter: 'blur(24px)',\n border: `1px solid ${colors.border.DEFAULT}`,\n },\n\n // Accent button\n accentButton: {\n backgroundColor: colors.accent.DEFAULT,\n color: '#000000',\n border: `1px solid ${colors.accent.DEFAULT}`,\n boxShadow: shadows.glow.md,\n },\n\n // Ghost button\n ghostButton: {\n backgroundColor: 'transparent',\n color: colors.text.secondary,\n border: '1px solid transparent',\n },\n\n // User message bubble\n userMessage: {\n backgroundColor: colors.user.bg,\n border: `1px solid ${colors.user.border}`,\n borderRadius: borderRadius.lg,\n },\n\n // Assistant message bubble\n assistantMessage: {\n backgroundColor: colors.assistant.bg,\n border: `1px solid ${colors.assistant.border}`,\n borderRadius: borderRadius.lg,\n },\n} as const;\n\n// =============================================================================\n// Type exports\n// =============================================================================\n\nexport type Colors = typeof colors;\nexport type Spacing = typeof spacing;\nexport type BorderRadius = typeof borderRadius;\nexport type Shadows = typeof shadows;\nexport type Typography = typeof typography;\nexport type CssVars = typeof cssVars;\nexport type Keyframes = typeof keyframes;\nexport type Transitions = typeof transitions;\nexport type ZIndex = typeof zIndex;\nexport type Widget = typeof widget;\n","/**\n * @ash-cloud/ash-ui - Types\n *\n * Normalized types for structured tool call display in agentic UIs.\n * These types provide a unified representation for displaying tool calls\n * with their arguments and results together.\n */\n\nimport type { ReactNode } from 'react';\n\n// =============================================================================\n// Tool Status\n// =============================================================================\n\n/**\n * Status of a tool call execution\n */\nexport type ToolStatus = 'pending' | 'success' | 'failed';\n\n// =============================================================================\n// Action-Specific Result Types\n// =============================================================================\n\n/**\n * Result from a command/bash execution\n */\nexport interface CommandRunResult {\n exitCode?: number;\n success?: boolean;\n output?: string;\n}\n\n/**\n * Generic tool result that can be markdown or structured JSON\n */\nexport interface ToolResult {\n type: 'markdown' | 'json';\n value: unknown;\n}\n\n// =============================================================================\n// Action Types (Discriminated Union)\n// =============================================================================\n\n/**\n * Bash/command execution action\n */\nexport interface CommandRunAction {\n action: 'command_run';\n command: string;\n description?: string;\n result?: CommandRunResult;\n}\n\n/**\n * File read action\n */\nexport interface FileReadAction {\n action: 'file_read';\n path: string;\n offset?: number;\n limit?: number;\n /** Number of lines read (for display) */\n linesRead?: number;\n}\n\n/**\n * File edit action\n */\nexport interface FileEditAction {\n action: 'file_edit';\n path: string;\n oldString?: string;\n newString?: string;\n replaceAll?: boolean;\n /** Number of lines added */\n linesAdded?: number;\n /** Number of lines removed */\n linesRemoved?: number;\n}\n\n/**\n * File write action\n */\nexport interface FileWriteAction {\n action: 'file_write';\n path: string;\n content?: string;\n /** Number of lines written */\n linesWritten?: number;\n}\n\n/**\n * Search/grep action\n */\nexport interface SearchAction {\n action: 'search';\n pattern: string;\n path?: string;\n glob?: string;\n type?: string;\n}\n\n/**\n * Glob/file pattern matching action\n */\nexport interface GlobAction {\n action: 'glob';\n pattern: string;\n path?: string;\n}\n\n/**\n * Web fetch action\n */\nexport interface WebFetchAction {\n action: 'web_fetch';\n url: string;\n prompt?: string;\n}\n\n/**\n * Web search action\n */\nexport interface WebSearchAction {\n action: 'web_search';\n query: string;\n}\n\n/**\n * MCP (Model Context Protocol) tool action\n */\nexport interface McpToolAction {\n action: 'mcp_tool';\n serverName: string;\n toolName: string;\n arguments?: unknown;\n result?: ToolResult;\n}\n\n/**\n * Generic/unknown tool action\n */\nexport interface GenericToolAction {\n action: 'generic_tool';\n toolName: string;\n arguments?: unknown;\n result?: ToolResult;\n}\n\n/**\n * Agent/Task tool action - represents a sub-agent that can have nested tool calls\n */\nexport interface AgentToolAction {\n action: 'agent_tool';\n /** Agent type (e.g., 'Explore', 'Plan', 'Bash', 'general-purpose') */\n agentType: string;\n /** Description of what the agent is doing */\n description: string;\n /** Full prompt given to the agent */\n prompt?: string;\n /** Nested tool calls made by this agent */\n nestedToolCalls?: NormalizedToolCall[];\n /** Current count of tool calls (updates during streaming) */\n toolCallCount?: number;\n /** When the agent started */\n startedAt?: string;\n /** When the agent completed */\n completedAt?: string;\n /** Result/output from the agent */\n result?: ToolResult;\n}\n\n// =============================================================================\n// Todo Types\n// =============================================================================\n\n/**\n * Status of a todo item\n */\nexport type TodoStatus = 'pending' | 'in_progress' | 'completed';\n\n/**\n * A single todo item from TodoWrite tool\n */\nexport interface TodoItem {\n /** Task content - imperative form (e.g., \"Run tests\") */\n content: string;\n /** Current status of the todo */\n status: TodoStatus;\n /** Active form shown during execution (e.g., \"Running tests\") */\n activeForm: string;\n}\n\n/**\n * TodoWrite tool action - tracks task progress\n */\nexport interface TodoWriteAction {\n action: 'todo_write';\n /** All todos in the current list */\n todos: TodoItem[];\n /** Summary statistics */\n stats?: {\n total: number;\n completed: number;\n inProgress: number;\n pending: number;\n };\n}\n\n/**\n * Discriminated union of all action types\n */\nexport type ActionType =\n | CommandRunAction\n | FileReadAction\n | FileEditAction\n | FileWriteAction\n | SearchAction\n | GlobAction\n | WebFetchAction\n | WebSearchAction\n | McpToolAction\n | GenericToolAction\n | TodoWriteAction\n | AgentToolAction;\n\n// =============================================================================\n// Normalized Tool Call\n// =============================================================================\n\n/**\n * A normalized tool call that combines tool_use and tool_result data\n */\nexport interface NormalizedToolCall {\n /** Unique ID from the tool_use block */\n id: string;\n\n /** Original tool name (e.g., 'Bash', 'Read', 'mcp__server__tool') */\n toolName: string;\n\n /** Parsed action type with structured arguments and result */\n actionType: ActionType;\n\n /** Current execution status */\n status: ToolStatus;\n\n /** Human-readable one-liner summary */\n summary: string;\n\n /** Raw input from tool_use event (for display in UI) */\n input?: unknown;\n\n /** Raw output/result from tool_result event (for display in UI) */\n output?: unknown;\n\n /** When the tool call started */\n startedAt?: string;\n\n /** When the tool call completed */\n completedAt?: string;\n\n /** Whether this tool call resulted in an error */\n isError?: boolean;\n\n /** Nested tool calls (for agent/sub-agent tools like Task) */\n nestedToolCalls?: NormalizedToolCall[];\n\n /** Current count of nested tool calls (updates during streaming) */\n nestedToolCallCount?: number;\n}\n\n// =============================================================================\n// Normalized Entry Types\n// =============================================================================\n\n/**\n * User message entry\n */\nexport interface UserMessageEntry {\n type: 'user_message';\n}\n\n/**\n * Assistant message entry\n */\nexport interface AssistantMessageEntry {\n type: 'assistant_message';\n}\n\n/**\n * Thinking/reasoning entry (extended thinking)\n */\nexport interface ThinkingEntry {\n type: 'thinking';\n}\n\n/**\n * Tool call entry with full tool call data\n */\nexport interface ToolCallEntry {\n type: 'tool_call';\n toolCall: NormalizedToolCall;\n}\n\n/**\n * Error entry\n */\nexport interface ErrorEntry {\n type: 'error';\n message: string;\n code?: string;\n}\n\n/**\n * Custom widget entry - rendered via consumer-provided render function\n *\n * Use this for interactive UI components like:\n * - Image grid selectors\n * - Product carousels\n * - Form inputs\n * - Data visualizations\n * - Any custom interactive widget\n *\n * @example\n * ```tsx\n * const entry: NormalizedEntry = {\n * id: 'widget-1',\n * entryType: {\n * type: 'widget',\n * widgetType: 'image-grid',\n * widgetData: { images: [...], selected: null },\n * },\n * content: 'Select an image',\n * };\n * ```\n */\nexport interface WidgetEntry {\n type: 'widget';\n /** Widget type identifier (e.g., 'image-grid', 'product-selector') */\n widgetType: string;\n /** Widget-specific data passed to the render function */\n widgetData: unknown;\n}\n\n/**\n * Discriminated union of all entry types\n */\nexport type NormalizedEntryType =\n | UserMessageEntry\n | AssistantMessageEntry\n | ThinkingEntry\n | ToolCallEntry\n | ErrorEntry\n | WidgetEntry;\n\n// =============================================================================\n// Normalized Entry\n// =============================================================================\n\n/**\n * A normalized conversation entry for display\n */\nexport interface NormalizedEntry {\n /** Unique entry ID */\n id: string;\n\n /** ISO timestamp */\n timestamp?: string;\n\n /** Entry type with type-specific data */\n entryType: NormalizedEntryType;\n\n /** Text content for display (plain text or markdown) */\n content: string;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isCommandRunAction(action: ActionType): action is CommandRunAction {\n return action.action === 'command_run';\n}\n\nexport function isFileReadAction(action: ActionType): action is FileReadAction {\n return action.action === 'file_read';\n}\n\nexport function isFileEditAction(action: ActionType): action is FileEditAction {\n return action.action === 'file_edit';\n}\n\nexport function isFileWriteAction(action: ActionType): action is FileWriteAction {\n return action.action === 'file_write';\n}\n\nexport function isSearchAction(action: ActionType): action is SearchAction {\n return action.action === 'search';\n}\n\nexport function isGlobAction(action: ActionType): action is GlobAction {\n return action.action === 'glob';\n}\n\nexport function isWebFetchAction(action: ActionType): action is WebFetchAction {\n return action.action === 'web_fetch';\n}\n\nexport function isWebSearchAction(action: ActionType): action is WebSearchAction {\n return action.action === 'web_search';\n}\n\nexport function isMcpToolAction(action: ActionType): action is McpToolAction {\n return action.action === 'mcp_tool';\n}\n\nexport function isGenericToolAction(action: ActionType): action is GenericToolAction {\n return action.action === 'generic_tool';\n}\n\nexport function isTodoWriteAction(action: ActionType): action is TodoWriteAction {\n return action.action === 'todo_write';\n}\n\nexport function isAgentToolAction(action: ActionType): action is AgentToolAction {\n return action.action === 'agent_tool';\n}\n\nexport function isToolCallEntry(entry: NormalizedEntryType): entry is ToolCallEntry {\n return entry.type === 'tool_call';\n}\n\nexport function isErrorEntry(entry: NormalizedEntryType): entry is ErrorEntry {\n return entry.type === 'error';\n}\n\nexport function isWidgetEntry(entry: NormalizedEntryType): entry is WidgetEntry {\n return entry.type === 'widget';\n}\n\n// =============================================================================\n// Widget Rendering\n// =============================================================================\n\n/**\n * Props passed to the widget render function\n */\nexport interface WidgetRenderProps<T = unknown> {\n /** The widget entry being rendered */\n entry: NormalizedEntry;\n /** Widget type identifier */\n widgetType: string;\n /** Widget-specific data */\n widgetData: T;\n /** Callback for widget interactions (e.g., selection, submit) */\n onAction?: (action: WidgetAction) => void;\n}\n\n/**\n * Action dispatched from a widget interaction\n */\nexport interface WidgetAction {\n /** Action type (e.g., 'select', 'submit', 'cancel') */\n type: string;\n /** Widget type that dispatched the action */\n widgetType: string;\n /** Entry ID of the widget */\n entryId: string;\n /** Action-specific payload */\n payload?: unknown;\n}\n\n/**\n * Function type for rendering custom widgets\n *\n * @example\n * ```tsx\n * const renderWidget: WidgetRenderFunction = ({ widgetType, widgetData, onAction }) => {\n * switch (widgetType) {\n * case 'image-grid':\n * return (\n * <ImageGrid\n * images={widgetData.images}\n * onSelect={(id) => onAction?.({ type: 'select', widgetType, entryId, payload: { id } })}\n * />\n * );\n * case 'product-selector':\n * return <ProductSelector data={widgetData} onAction={onAction} />;\n * default:\n * return null;\n * }\n * };\n *\n * <MessageList entries={entries} renderWidget={renderWidget} />\n * ```\n */\nexport type WidgetRenderFunction = (props: WidgetRenderProps) => ReactNode;\n\n// =============================================================================\n// Log Types (for SandboxLogsPanel)\n// =============================================================================\n\nexport type LogLevel = 'info' | 'warn' | 'error' | 'debug';\nexport type LogCategory = 'setup' | 'skills' | 'execution' | 'process' | 'startup';\n\nexport interface LogEntry {\n timestamp: string;\n level: LogLevel;\n category: LogCategory;\n message: string;\n data?: Record<string, unknown>;\n}\n\n// =============================================================================\n// File Attachment\n// =============================================================================\n\nexport interface FileAttachment {\n name: string;\n type: string;\n size: number;\n base64: string;\n}\n\n// =============================================================================\n// Rich Content (Mention Rendering)\n// =============================================================================\n\n/**\n * A plain text segment in rich content\n */\nexport interface RichTextSegment {\n type: 'text';\n content: string;\n}\n\n/**\n * A mention segment in rich content (e.g., @ProductX, @JohnDoe)\n */\nexport interface RichMentionSegment {\n type: 'mention';\n /** Display name for the mention */\n name: string;\n /** Optional color for the mention badge */\n color?: string;\n /** Optional avatar/icon URL */\n url?: string;\n /** Optional custom data (e.g., entity ID for click handling) */\n data?: Record<string, unknown>;\n}\n\n/**\n * A single segment of rich content\n */\nexport type RichContentSegment = RichTextSegment | RichMentionSegment;\n\n/**\n * Pre-parsed rich content array for custom rendering\n *\n * @example\n * ```tsx\n * const richContent: RichContent = [\n * { type: 'text', content: 'Check out ' },\n * { type: 'mention', name: 'ProductX', color: '#f59e0b', data: { id: 123 } },\n * { type: 'text', content: ' for details' },\n * ];\n * ```\n */\nexport type RichContent = RichContentSegment[];\n\n/**\n * Props for rendering a mention component\n */\nexport interface MentionProps {\n /** Display name for the mention */\n name: string;\n /** Optional color for the mention badge */\n color?: string;\n /** Optional avatar/icon URL */\n url?: string;\n /** Optional custom data (e.g., entity ID for click handling) */\n data?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Display Mode Configuration\n// =============================================================================\n\n// =============================================================================\n// Theming & Customization\n// =============================================================================\n\n/**\n * Message visual style variant\n *\n * - 'bubble': Rounded card with padding and background (default for user messages)\n * - 'plain': No background, just text with subtle styling\n * - 'minimal': Bare text, no decoration\n */\nexport type MessageVariant = 'bubble' | 'plain' | 'minimal';\n\n/**\n * Typography scale/density preset\n *\n * - 'dense': Minimal spacing, smallest fonts (12px base) - for maximum information density\n * - 'compact': Tighter spacing, smaller fonts (13px base)\n * - 'default': Standard sizing (14px base)\n * - 'comfortable': More generous spacing (15px base)\n */\nexport type TypographyScale = 'dense' | 'compact' | 'default' | 'comfortable';\n\n/**\n * Message role for data attribute targeting\n */\nexport type MessageRole = 'user' | 'assistant' | 'thinking' | 'tool' | 'error' | 'widget';\n\n/**\n * Metadata to display with a message\n */\nexport interface MessageMetadata {\n /** Timestamp to display */\n timestamp?: string;\n /** Model name/info to display */\n model?: string;\n /** Custom label */\n label?: string;\n /** Any additional metadata */\n extra?: Record<string, unknown>;\n}\n\n/**\n * Function to render custom message metadata\n */\nexport type RenderMetadataFunction = (props: {\n entry: NormalizedEntry;\n metadata?: MessageMetadata;\n}) => ReactNode;\n\n/**\n * Custom markdown component overrides\n *\n * @example\n * ```tsx\n * const components: MarkdownComponents = {\n * h2: ({ children }) => <h2 className=\"custom-h2\">{children}</h2>,\n * code: ({ children, className }) => <CustomCode className={className}>{children}</CustomCode>,\n * };\n * ```\n */\nexport interface MarkdownComponents {\n h1?: React.ComponentType<{ children?: ReactNode }>;\n h2?: React.ComponentType<{ children?: ReactNode }>;\n h3?: React.ComponentType<{ children?: ReactNode }>;\n h4?: React.ComponentType<{ children?: ReactNode }>;\n h5?: React.ComponentType<{ children?: ReactNode }>;\n h6?: React.ComponentType<{ children?: ReactNode }>;\n p?: React.ComponentType<{ children?: ReactNode }>;\n a?: React.ComponentType<{ children?: ReactNode; href?: string }>;\n ul?: React.ComponentType<{ children?: ReactNode }>;\n ol?: React.ComponentType<{ children?: ReactNode }>;\n li?: React.ComponentType<{ children?: ReactNode }>;\n code?: React.ComponentType<{ children?: ReactNode; className?: string }>;\n pre?: React.ComponentType<{ children?: ReactNode }>;\n blockquote?: React.ComponentType<{ children?: ReactNode }>;\n strong?: React.ComponentType<{ children?: ReactNode }>;\n em?: React.ComponentType<{ children?: ReactNode }>;\n hr?: React.ComponentType<Record<string, never>>;\n img?: React.ComponentType<{ src?: string; alt?: string }>;\n table?: React.ComponentType<{ children?: ReactNode }>;\n thead?: React.ComponentType<{ children?: ReactNode }>;\n tbody?: React.ComponentType<{ children?: ReactNode }>;\n tr?: React.ComponentType<{ children?: ReactNode }>;\n th?: React.ComponentType<{ children?: ReactNode }>;\n td?: React.ComponentType<{ children?: ReactNode }>;\n}\n\n/**\n * Style configuration for message display\n */\nexport interface MessageStyleConfig {\n /** Variant for user messages */\n userVariant?: MessageVariant;\n /** Variant for assistant messages */\n assistantVariant?: MessageVariant;\n /** Typography/density scale */\n scale?: TypographyScale;\n /** Show timestamps with messages */\n showTimestamp?: boolean;\n /** Show avatars */\n showAvatars?: boolean;\n /** Custom class name for messages */\n messageClassName?: string;\n}\n\n/**\n * Default style configuration\n */\nexport const DEFAULT_STYLE_CONFIG: MessageStyleConfig = {\n userVariant: 'bubble',\n assistantVariant: 'bubble',\n scale: 'compact',\n showTimestamp: true,\n showAvatars: true,\n}\n\n// =============================================================================\n// AI SDK Compatible Types\n// =============================================================================\n\n/**\n * Tool invocation status - matches AI SDK ToolInvocation\n */\nexport type ToolInvocationState = 'partial-call' | 'call' | 'result';\n\n/**\n * Tool invocation - matches AI SDK ToolInvocation type\n */\nexport interface ToolInvocation {\n /** Tool invocation state */\n state: ToolInvocationState;\n /** Unique tool call ID */\n toolCallId: string;\n /** Tool name */\n toolName: string;\n /** Arguments passed to the tool (parsed JSON) */\n args: Record<string, unknown>;\n /** Result from tool execution (only present when state is 'result') */\n result?: unknown;\n}\n\n/**\n * AI SDK message role - matches AI SDK Message role\n */\nexport type AIMessageRole = 'user' | 'assistant' | 'system' | 'data';\n\n/**\n * AI SDK compatible message type\n * This is the primary type used by the new useChat hook\n */\nexport interface Message {\n /** Unique message ID */\n id: string;\n /** Message role */\n role: AIMessageRole;\n /** Message content (text) */\n content: string;\n /** Tool invocations for this message */\n toolInvocations?: ToolInvocation[];\n /** When the message was created */\n createdAt?: Date;\n /** Optional reasoning/thinking content */\n reasoning?: string;\n /** Experimental attachments (for file uploads) */\n experimental_attachments?: MessageAttachment[];\n}\n\n/**\n * Message attachment for file uploads\n */\nexport interface MessageAttachment {\n /** Attachment name */\n name: string;\n /** MIME type */\n contentType: string;\n /** URL to the attachment */\n url: string;\n}\n\n// =============================================================================\n// Type Conversion Functions\n// =============================================================================\n\n/**\n * Convert a NormalizedEntry to an AI SDK Message\n */\nexport function normalizedEntryToMessage(entry: NormalizedEntry): Message | null {\n const { id, entryType, content, timestamp } = entry;\n const createdAt = timestamp ? new Date(timestamp) : undefined;\n\n switch (entryType.type) {\n case 'user_message':\n return {\n id,\n role: 'user',\n content,\n createdAt,\n };\n\n case 'assistant_message':\n return {\n id,\n role: 'assistant',\n content,\n createdAt,\n };\n\n case 'thinking':\n // Thinking is represented as reasoning on the previous assistant message\n // Return as assistant message with reasoning\n return {\n id,\n role: 'assistant',\n content: '',\n reasoning: content,\n createdAt,\n };\n\n case 'tool_call': {\n const { toolCall } = entryType;\n const toolInvocation: ToolInvocation = {\n state: toolCall.status === 'pending' ? 'call' : 'result',\n toolCallId: toolCall.id,\n toolName: toolCall.toolName,\n args: (toolCall.input as Record<string, unknown>) || {},\n result: toolCall.output,\n };\n // Tool calls are attached to assistant messages\n return {\n id,\n role: 'assistant',\n content: '',\n toolInvocations: [toolInvocation],\n createdAt,\n };\n }\n\n case 'error':\n // Errors can be represented as system messages\n return {\n id,\n role: 'system',\n content: `Error: ${entryType.message}${entryType.code ? ` (${entryType.code})` : ''}`,\n createdAt,\n };\n\n case 'widget':\n // Widgets are data messages\n return {\n id,\n role: 'data',\n content: JSON.stringify({\n widgetType: entryType.widgetType,\n widgetData: entryType.widgetData,\n }),\n createdAt,\n };\n\n default:\n return null;\n }\n}\n\n/**\n * Convert an AI SDK Message to a NormalizedEntry\n */\nexport function messageToNormalizedEntry(message: Message): NormalizedEntry {\n const { id, role, content, createdAt, toolInvocations, reasoning } = message;\n const timestamp = createdAt?.toISOString();\n\n // If there are tool invocations, create tool call entries\n if (toolInvocations && toolInvocations.length > 0) {\n // For simplicity, take the first tool invocation\n // In practice, multiple tool invocations would need multiple entries\n const inv = toolInvocations[0]!;\n const toolCall: NormalizedToolCall = {\n id: inv.toolCallId,\n toolName: inv.toolName,\n actionType: {\n action: 'generic_tool',\n toolName: inv.toolName,\n arguments: inv.args,\n result: inv.result ? { type: 'json', value: inv.result } : undefined,\n },\n status: inv.state === 'result' ? 'success' : 'pending',\n summary: `${inv.toolName}(${Object.keys(inv.args).join(', ')})`,\n input: inv.args,\n output: inv.result,\n };\n\n return {\n id,\n timestamp,\n entryType: { type: 'tool_call', toolCall },\n content: toolCall.summary,\n };\n }\n\n // If there's reasoning, create a thinking entry\n if (reasoning) {\n return {\n id,\n timestamp,\n entryType: { type: 'thinking' },\n content: reasoning,\n };\n }\n\n // Standard message types based on role\n if (role === 'user') {\n return {\n id,\n timestamp,\n entryType: { type: 'user_message' },\n content,\n };\n }\n\n if (role === 'assistant') {\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n }\n\n if (role === 'system') {\n // System messages that look like errors\n if (content.startsWith('Error:')) {\n return {\n id,\n timestamp,\n entryType: { type: 'error', message: content.replace('Error: ', '') },\n content,\n };\n }\n // Otherwise treat as assistant message\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n }\n\n if (role === 'data') {\n // Try to parse as widget\n try {\n const data = JSON.parse(content);\n if (data.widgetType) {\n return {\n id,\n timestamp,\n entryType: {\n type: 'widget',\n widgetType: data.widgetType,\n widgetData: data.widgetData,\n },\n content: '',\n };\n }\n } catch {\n // Not valid JSON, treat as assistant message\n }\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n }\n\n // Default fallback\n return {\n id,\n timestamp,\n entryType: { type: 'assistant_message' },\n content,\n };\n}\n\n/**\n * Convert an array of NormalizedEntry to AI SDK Messages\n * Merges consecutive assistant entries (text + tool calls) into single messages\n */\nexport function normalizedEntriesToMessages(entries: NormalizedEntry[]): Message[] {\n const messages: Message[] = [];\n let currentAssistantMessage: Message | null = null;\n\n for (const entry of entries) {\n const message = normalizedEntryToMessage(entry);\n if (!message) continue;\n\n if (message.role === 'assistant') {\n // Check if we should merge with current assistant message\n if (currentAssistantMessage) {\n // Merge tool invocations\n if (message.toolInvocations) {\n currentAssistantMessage.toolInvocations = [\n ...(currentAssistantMessage.toolInvocations || []),\n ...message.toolInvocations,\n ];\n }\n // Merge content\n if (message.content) {\n currentAssistantMessage.content = currentAssistantMessage.content\n ? `${currentAssistantMessage.content}\\n${message.content}`\n : message.content;\n }\n // Merge reasoning\n if (message.reasoning) {\n currentAssistantMessage.reasoning = currentAssistantMessage.reasoning\n ? `${currentAssistantMessage.reasoning}\\n${message.reasoning}`\n : message.reasoning;\n }\n } else {\n currentAssistantMessage = { ...message };\n }\n } else {\n // Flush current assistant message\n if (currentAssistantMessage) {\n messages.push(currentAssistantMessage);\n currentAssistantMessage = null;\n }\n messages.push(message);\n }\n }\n\n // Flush any remaining assistant message\n if (currentAssistantMessage) {\n messages.push(currentAssistantMessage);\n }\n\n return messages;\n}\n\n/**\n * Convert AI SDK Messages back to NormalizedEntry array\n * Expands tool invocations into separate entries\n */\nexport function messagesToNormalizedEntries(messages: Message[]): NormalizedEntry[] {\n const entries: NormalizedEntry[] = [];\n\n for (const message of messages) {\n // If message has reasoning, add thinking entry first\n if (message.reasoning) {\n entries.push({\n id: `${message.id}-thinking`,\n timestamp: message.createdAt?.toISOString(),\n entryType: { type: 'thinking' },\n content: message.reasoning,\n });\n }\n\n // If message has content, add the content entry\n if (message.content || !message.toolInvocations?.length) {\n entries.push(messageToNormalizedEntry({\n ...message,\n toolInvocations: undefined,\n reasoning: undefined,\n }));\n }\n\n // Add separate entries for each tool invocation\n if (message.toolInvocations) {\n for (const inv of message.toolInvocations) {\n const toolMessage: Message = {\n id: inv.toolCallId,\n role: 'assistant',\n content: '',\n toolInvocations: [inv],\n createdAt: message.createdAt,\n };\n entries.push(messageToNormalizedEntry(toolMessage));\n }\n }\n }\n\n return entries;\n}\n","'use client';\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\n\n/**\n * A queued message waiting to be sent\n */\nexport interface QueuedMessage {\n /** Unique ID for this queued message */\n id: string;\n /** The message text */\n text: string;\n /** Optional file attachments */\n files?: FileAttachment[];\n /** Timestamp when queued */\n queuedAt: number;\n}\n\n/**\n * File attachment for upload\n */\nexport interface FileAttachment {\n /** Original filename */\n filename: string;\n /** Base64-encoded file content */\n content: string;\n /** MIME type of the file */\n mimeType: string;\n /** File size in bytes */\n size: number;\n}\n\nexport interface UseMessageQueueOptions {\n /** Callback to process a message - should return when processing is complete */\n onProcessMessage: (message: QueuedMessage) => Promise<void>;\n /** Whether messages can currently be processed (e.g., agent selected) */\n canProcess?: boolean;\n}\n\nexport interface UseMessageQueueReturn {\n /** Current queue of pending messages */\n queue: QueuedMessage[];\n /** Whether a message is currently being processed */\n isProcessing: boolean;\n /** Add a message to the queue (or process immediately if idle) */\n enqueue: (text: string, files?: FileAttachment[]) => void;\n /** Cancel a queued message by ID */\n cancel: (id: string) => void;\n /** Clear all queued messages */\n clearQueue: () => void;\n /** Number of messages in queue */\n queueLength: number;\n}\n\n/**\n * Hook for managing a message queue with sequential processing.\n *\n * Messages are queued when the agent is busy and processed sequentially.\n * Users can continue typing while the agent processes previous messages.\n *\n * @example\n * ```tsx\n * function ChatInput() {\n * const { queue, isProcessing, enqueue, cancel } = useMessageQueue({\n * onProcessMessage: async (msg) => {\n * for await (const event of client.agents.run(agentId, msg.text)) {\n * // handle events\n * }\n * }\n * });\n *\n * return (\n * <div>\n * {queue.map(msg => (\n * <div key={msg.id}>\n * Queued: {msg.text}\n * <button onClick={() => cancel(msg.id)}>Cancel</button>\n * </div>\n * ))}\n * <input onSubmit={(text) => enqueue(text)} />\n * <button>{isProcessing ? `Queue (${queue.length})` : 'Send'}</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useMessageQueue({\n onProcessMessage,\n canProcess = true,\n}: UseMessageQueueOptions): UseMessageQueueReturn {\n const [queue, setQueue] = useState<QueuedMessage[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const isProcessingRef = useRef(false);\n const onProcessMessageRef = useRef(onProcessMessage);\n\n // Keep callback ref in sync\n useEffect(() => {\n onProcessMessageRef.current = onProcessMessage;\n }, [onProcessMessage]);\n\n // Process queue sequentially\n const processQueue = useCallback(async () => {\n if (isProcessingRef.current || !canProcess) return;\n\n isProcessingRef.current = true;\n setIsProcessing(true);\n\n while (true) {\n // Get next message from queue\n let nextMessage: QueuedMessage | undefined;\n setQueue((prev) => {\n if (prev.length === 0) return prev;\n nextMessage = prev[0];\n return prev.slice(1);\n });\n\n // Wait a tick for state to update\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n if (!nextMessage) break;\n\n try {\n await onProcessMessageRef.current(nextMessage);\n } catch (error) {\n console.error('Error processing queued message:', error);\n // Continue processing queue even if one message fails\n }\n }\n\n isProcessingRef.current = false;\n setIsProcessing(false);\n }, [canProcess]);\n\n // Watch for queue changes and process\n useEffect(() => {\n if (queue.length > 0 && !isProcessingRef.current && canProcess) {\n processQueue();\n }\n }, [queue, processQueue, canProcess]);\n\n // Enqueue a new message\n const enqueue = useCallback((text: string, files?: FileAttachment[]) => {\n const message: QueuedMessage = {\n id: `queue-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n text,\n files,\n queuedAt: Date.now(),\n };\n\n setQueue((prev) => [...prev, message]);\n }, []);\n\n // Cancel a queued message\n const cancel = useCallback((id: string) => {\n setQueue((prev) => prev.filter((m) => m.id !== id));\n }, []);\n\n // Clear all queued messages\n const clearQueue = useCallback(() => {\n setQueue([]);\n }, []);\n\n return {\n queue,\n isProcessing,\n enqueue,\n cancel,\n clearQueue,\n queueLength: queue.length,\n };\n}\n\nexport default useMessageQueue;\n","'use client';\n\nimport { useState, useCallback, useRef } from 'react';\n\nexport interface UseStopExecutionOptions {\n /** Callback to stop server-side execution (e.g., client.sessions.stop) */\n onServerStop?: (sessionId: string) => Promise<void>;\n}\n\nexport interface UseStopExecutionReturn {\n /** Whether execution can currently be stopped */\n canStop: boolean;\n /** The AbortSignal to pass to fetch requests */\n signal: AbortSignal | undefined;\n /** Start tracking a new execution (call when starting a request) */\n startExecution: () => void;\n /** Mark execution as complete (call when request finishes) */\n endExecution: () => void;\n /** Stop the current execution (aborts client + optionally server) */\n stop: (sessionId?: string) => Promise<void>;\n /** Set the current session ID for server-side stop */\n setSessionId: (sessionId: string | null) => void;\n}\n\n/**\n * Hook for managing execution stopping with AbortController.\n *\n * Handles both client-side request abortion and optional server-side stop calls.\n * Use this to implement stop/cancel buttons for long-running agent executions.\n *\n * @example\n * ```tsx\n * function Chat() {\n * const { canStop, signal, startExecution, endExecution, stop, setSessionId } = useStopExecution({\n * onServerStop: (sessionId) => client.sessions.stop(sessionId)\n * });\n *\n * async function sendMessage(text: string) {\n * startExecution();\n * try {\n * for await (const event of client.agents.run(agentId, text, { signal })) {\n * if (event.type === 'session_start') {\n * setSessionId(event.sessionId);\n * }\n * // handle events...\n * }\n * } catch (err) {\n * if (err.name === 'AbortError') {\n * console.log('Request aborted');\n * }\n * } finally {\n * endExecution();\n * }\n * }\n *\n * return (\n * <div>\n * {canStop && <button onClick={() => stop()}>Stop</button>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useStopExecution({\n onServerStop,\n}: UseStopExecutionOptions = {}): UseStopExecutionReturn {\n const [canStop, setCanStop] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n const sessionIdRef = useRef<string | null>(null);\n const onServerStopRef = useRef(onServerStop);\n\n // Keep callback ref in sync\n onServerStopRef.current = onServerStop;\n\n // Start a new execution\n const startExecution = useCallback(() => {\n // Create new AbortController\n abortControllerRef.current = new AbortController();\n setCanStop(true);\n }, []);\n\n // End the current execution\n const endExecution = useCallback(() => {\n abortControllerRef.current = null;\n sessionIdRef.current = null;\n setCanStop(false);\n }, []);\n\n // Set the session ID for server-side stop\n const setSessionId = useCallback((sessionId: string | null) => {\n sessionIdRef.current = sessionId;\n }, []);\n\n // Stop execution (client + server)\n const stop = useCallback(async (explicitSessionId?: string) => {\n // 1. Abort client-side request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // 2. Call server-side stop if we have a session\n const sessionId = explicitSessionId || sessionIdRef.current;\n if (sessionId && onServerStopRef.current) {\n try {\n await onServerStopRef.current(sessionId);\n } catch (err) {\n // Log but don't throw - the abort already happened\n console.warn('Server stop failed:', err);\n }\n }\n\n // Mark as stopped\n setCanStop(false);\n }, []);\n\n return {\n canStop,\n signal: abortControllerRef.current?.signal,\n startExecution,\n endExecution,\n stop,\n setSessionId,\n };\n}\n\nexport default useStopExecution;\n","'use client';\n\nimport { useState, useCallback, useRef, DragEvent, ChangeEvent } from 'react';\n\n/**\n * File attachment ready for upload\n */\nexport interface FileAttachment {\n /** Original filename */\n filename: string;\n /** Base64-encoded file content (without data URL prefix) */\n content: string;\n /** MIME type of the file */\n mimeType: string;\n /** File size in bytes */\n size: number;\n}\n\nexport interface UseFileUploadOptions {\n /** Maximum file size in bytes (default: 100MB) */\n maxFileSize?: number;\n /** Maximum number of files (default: 10) */\n maxFiles?: number;\n /** Callback when file validation fails */\n onValidationError?: (filename: string, error: string) => void;\n}\n\nexport interface UseFileUploadReturn {\n /** Current list of attached files */\n files: FileAttachment[];\n /** Whether drag is currently over the drop zone */\n isDragOver: boolean;\n /** Add files from a FileList (e.g., from input or drop) */\n addFiles: (fileList: FileList | null) => Promise<void>;\n /** Remove a file by index */\n removeFile: (index: number) => void;\n /** Clear all files */\n clearFiles: () => void;\n /** Whether more files can be added */\n canAddMore: boolean;\n /** Props to spread on a drop zone element */\n dropZoneProps: {\n onDragOver: (e: DragEvent) => void;\n onDragLeave: (e: DragEvent) => void;\n onDrop: (e: DragEvent) => void;\n };\n /** Handler for file input onChange */\n handleFileInputChange: (e: ChangeEvent<HTMLInputElement>) => void;\n /** Ref for a hidden file input */\n fileInputRef: React.RefObject<HTMLInputElement | null>;\n /** Click handler to trigger file input */\n openFilePicker: () => void;\n}\n\n/**\n * Format file size for display\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Read a file as base64\n */\nasync function readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n // Remove data URL prefix to get pure base64\n const base64 = result.split(',')[1];\n resolve(base64 || '');\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Hook for managing file uploads with drag & drop support.\n *\n * Handles file selection, validation, base64 encoding, and drag/drop UI state.\n *\n * @example\n * ```tsx\n * function FileUploadArea() {\n * const {\n * files,\n * isDragOver,\n * addFiles,\n * removeFile,\n * dropZoneProps,\n * fileInputRef,\n * openFilePicker,\n * canAddMore,\n * } = useFileUpload({\n * maxFileSize: 50 * 1024 * 1024, // 50MB\n * maxFiles: 5,\n * onValidationError: (filename, error) => {\n * toast.error(`${filename}: ${error}`);\n * }\n * });\n *\n * return (\n * <div {...dropZoneProps} className={isDragOver ? 'drag-over' : ''}>\n * <input ref={fileInputRef} type=\"file\" multiple hidden />\n * <button onClick={openFilePicker} disabled={!canAddMore}>\n * Add Files\n * </button>\n * {files.map((file, i) => (\n * <div key={i}>\n * {file.filename} ({formatFileSize(file.size)})\n * <button onClick={() => removeFile(i)}>Remove</button>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFileUpload({\n maxFileSize = 100 * 1024 * 1024, // 100MB\n maxFiles = 10,\n onValidationError,\n}: UseFileUploadOptions = {}): UseFileUploadReturn {\n const [files, setFiles] = useState<FileAttachment[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n // Process and add files\n const addFiles = useCallback(\n async (fileList: FileList | null) => {\n if (!fileList) return;\n\n const newFiles: FileAttachment[] = [];\n const currentCount = files.length;\n\n for (\n let i = 0;\n i < fileList.length && currentCount + newFiles.length < maxFiles;\n i++\n ) {\n const file = fileList.item(i);\n if (!file) continue;\n\n // Check file size\n if (file.size > maxFileSize) {\n onValidationError?.(\n file.name,\n `Exceeds maximum size of ${formatFileSize(maxFileSize)}`\n );\n continue;\n }\n\n try {\n const content = await readFileAsBase64(file);\n newFiles.push({\n filename: file.name,\n content,\n mimeType: file.type || 'application/octet-stream',\n size: file.size,\n });\n } catch (error) {\n console.error(`Failed to read file ${file.name}:`, error);\n onValidationError?.(file.name, 'Failed to read file');\n }\n }\n\n // Check if we hit the max files limit\n if (\n fileList.length > maxFiles - currentCount &&\n currentCount + newFiles.length >= maxFiles\n ) {\n onValidationError?.('', `Maximum ${maxFiles} files allowed`);\n }\n\n if (newFiles.length > 0) {\n setFiles((prev) => [...prev, ...newFiles]);\n }\n },\n [files.length, maxFiles, maxFileSize, onValidationError]\n );\n\n // Remove a file by index\n const removeFile = useCallback((index: number) => {\n setFiles((prev) => prev.filter((_, i) => i !== index));\n }, []);\n\n // Clear all files\n const clearFiles = useCallback(() => {\n setFiles([]);\n }, []);\n\n // Drag event handlers\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n addFiles(e.dataTransfer.files);\n },\n [addFiles]\n );\n\n // File input change handler\n const handleFileInputChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n addFiles(e.target.files);\n // Reset input to allow selecting the same file again\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n },\n [addFiles]\n );\n\n // Open file picker\n const openFilePicker = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n return {\n files,\n isDragOver,\n addFiles,\n removeFile,\n clearFiles,\n canAddMore: files.length < maxFiles,\n dropZoneProps: {\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n },\n handleFileInputChange,\n fileInputRef,\n openFilePicker,\n };\n}\n\nexport default useFileUpload;\n","/**\n * Middleware utilities for useAgentChat\n *\n * Provides composable request and event transformation capabilities.\n * Middleware functions are called in order, and each can transform or filter\n * the request/event before passing it to the next middleware.\n *\n * @example\n * ```tsx\n * const loggingMiddleware: ChatMiddleware = {\n * onRequest: (request) => {\n * console.log('Sending:', request.prompt);\n * return request;\n * },\n * onEvent: (event) => {\n * console.log('Received:', event.type);\n * return event;\n * },\n * };\n *\n * const { send } = useAgentChat({\n * middleware: [loggingMiddleware],\n * // ...\n * });\n * ```\n */\n\nimport type { StreamEvent } from './useAgentChat';\n\n/**\n * Request object passed through middleware chain\n */\nexport interface MiddlewareRequest {\n /** The user's prompt */\n prompt: string;\n /** Current session ID (if resuming a conversation) */\n sessionId: string | null;\n /** Additional metadata to send with the request */\n metadata?: Record<string, unknown>;\n /** Additional context to prepend to the session */\n sessionContext?: string;\n}\n\n/**\n * Result returned from request middleware\n * Return void or omit fields to keep original values\n */\nexport interface MiddlewareRequestResult {\n /** Modified prompt */\n prompt?: string;\n /** Modified metadata (merged with existing) */\n metadata?: Record<string, unknown>;\n /** Modified session context */\n sessionContext?: string;\n /** If set, cancels the request and shows this error */\n error?: string;\n}\n\n/**\n * Middleware interface for composable request/event transforms\n */\nexport interface ChatMiddleware {\n /** Called before the request is sent. Can modify request or return error to cancel. */\n onRequest?: (\n request: MiddlewareRequest\n ) => Promise<MiddlewareRequestResult | void> | MiddlewareRequestResult | void;\n\n /** Called for each event. Return null to filter out the event. */\n onEvent?: (event: StreamEvent) => Promise<StreamEvent | null> | StreamEvent | null;\n\n /** Called when the stream completes successfully */\n onComplete?: (sessionId: string) => void | Promise<void>;\n\n /** Called when an error occurs */\n onError?: (error: string) => void | Promise<void>;\n}\n\n/**\n * Apply request middleware chain\n *\n * Executes each middleware's onRequest handler in order.\n * Each middleware can modify the request or return an error to cancel.\n *\n * @param middlewares - Array of middleware to apply\n * @param request - Initial request object\n * @returns Modified request and optional error\n */\nexport async function applyRequestMiddleware(\n middlewares: ChatMiddleware[],\n request: MiddlewareRequest\n): Promise<{ request: MiddlewareRequest; error?: string }> {\n let current = { ...request };\n\n for (const mw of middlewares) {\n if (mw.onRequest) {\n try {\n const result = await mw.onRequest(current);\n if (result?.error) {\n return { request: current, error: result.error };\n }\n if (result) {\n current = {\n ...current,\n prompt: result.prompt ?? current.prompt,\n sessionContext: result.sessionContext ?? current.sessionContext,\n metadata: {\n ...current.metadata,\n ...result.metadata,\n },\n };\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Middleware error';\n return { request: current, error: errorMessage };\n }\n }\n }\n\n return { request: current };\n}\n\n/**\n * Apply event middleware chain\n *\n * Executes each middleware's onEvent handler in order.\n * If any middleware returns null, the event is filtered out.\n *\n * @param middlewares - Array of middleware to apply\n * @param event - Stream event to process\n * @returns Processed event or null if filtered\n */\nexport async function applyEventMiddleware(\n middlewares: ChatMiddleware[],\n event: StreamEvent\n): Promise<StreamEvent | null> {\n let current: StreamEvent | null = event;\n\n for (const mw of middlewares) {\n if (!current) break;\n if (mw.onEvent) {\n try {\n current = await mw.onEvent(current);\n } catch (err) {\n console.error('[middleware] onEvent error:', err);\n // Don't filter on error, let the event pass through\n }\n }\n }\n\n return current;\n}\n\n/**\n * Call completion handlers on all middleware\n *\n * @param middlewares - Array of middleware\n * @param sessionId - Completed session ID\n */\nexport async function callMiddlewareComplete(\n middlewares: ChatMiddleware[],\n sessionId: string\n): Promise<void> {\n for (const mw of middlewares) {\n if (mw.onComplete) {\n try {\n await mw.onComplete(sessionId);\n } catch (err) {\n console.error('[middleware] onComplete error:', err);\n }\n }\n }\n}\n\n/**\n * Call error handlers on all middleware\n *\n * @param middlewares - Array of middleware\n * @param error - Error message\n */\nexport async function callMiddlewareError(\n middlewares: ChatMiddleware[],\n error: string\n): Promise<void> {\n for (const mw of middlewares) {\n if (mw.onError) {\n try {\n await mw.onError(error);\n } catch (err) {\n console.error('[middleware] onError error:', err);\n }\n }\n }\n}\n","/**\n * useAgentChat - A React hook for streaming agent conversations\n *\n * This hook handles all the complexity of streaming agent responses:\n * - Real-time text streaming via text_delta events\n * - Tool call tracking and correlation\n * - Proper deduplication (no duplicate messages)\n * - Seamless transition from streaming to finalized state\n *\n * @example\n * ```tsx\n * import { useAgentChat } from '@ash-cloud/ash-ui';\n * import { AgentCloudClient } from '@ash-cloud/client';\n *\n * const client = new AgentCloudClient({ apiKey: '...' });\n *\n * function Chat() {\n * const {\n * entries,\n * isStreaming,\n * error,\n * sessionId,\n * send,\n * stop,\n * } = useAgentChat({\n * client,\n * agentId: 'my-agent-id',\n * });\n *\n * return (\n * <div>\n * <MessageList entries={entries} loading={isStreaming} />\n * <input onSubmit={(e) => send(e.target.value)} />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type { NormalizedEntry, NormalizedToolCall } from '../types';\nimport { createToolCall, updateToolCallWithResult } from '../utils';\nimport {\n applyRequestMiddleware,\n applyEventMiddleware,\n callMiddlewareComplete,\n callMiddlewareError,\n} from './middleware';\nimport type { ChatMiddleware, MiddlewareRequest } from './middleware';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Stream event type - matches @ash-cloud/client StreamEvent\n * We define it here to avoid a hard dependency on the client package\n */\nexport interface StreamEvent {\n type: string;\n sessionId?: string;\n claudeSessionId?: string;\n delta?: string;\n text?: string;\n /** Message content array (for 'message' events) */\n content?: unknown;\n toolId?: string;\n toolName?: string;\n input?: unknown;\n toolResult?: unknown;\n isError?: boolean;\n error?: string;\n code?: string;\n status?: string;\n message?: string;\n result?: string;\n totalCost?: number;\n totalTokens?: number;\n /** SSE event ID (sequence number from relay) for reconnection */\n id?: string;\n entry?: {\n timestamp: string;\n level: string;\n category: string;\n message: string;\n data?: Record<string, unknown>;\n };\n}\n\n/**\n * Async generator that yields StreamEvent objects\n */\nexport type StreamGenerator = AsyncGenerator<StreamEvent, void, unknown>;\n\n/**\n * Options passed to CreateStreamFn\n */\nexport interface CreateStreamOptions {\n /** AbortSignal to cancel the request */\n signal?: AbortSignal;\n /** Additional metadata from onBeforeSend/middleware */\n metadata?: Record<string, unknown>;\n /** Session context from onBeforeSend/middleware */\n sessionContext?: string;\n}\n\n/**\n * Function that creates a stream of events\n * This matches the signature of client.agents.run() and client.sessions.send()\n *\n * @example\n * ```tsx\n * createStream: (prompt, sessionId, options) => {\n * if (sessionId) {\n * return client.sessions.send(sessionId, prompt, {\n * signal: options?.signal,\n * sessionContext: options?.sessionContext,\n * metadata: options?.metadata,\n * });\n * }\n * return client.agents.run(agentId, prompt, {\n * signal: options?.signal,\n * sessionContext: options?.sessionContext,\n * metadata: options?.metadata,\n * });\n * }\n * ```\n */\nexport type CreateStreamFn = (\n prompt: string,\n sessionId?: string,\n options?: CreateStreamOptions\n) => StreamGenerator;\n\n/**\n * Function that subscribes to an existing session's events\n * This is used for auto-reconnection when the primary stream is interrupted\n */\nexport type SubscribeToSessionFn = (sessionId: string, signal?: AbortSignal) => StreamGenerator;\n\n/**\n * Context passed to onBeforeSend hook\n */\nexport interface BeforeSendContext {\n /** The user's prompt */\n prompt: string;\n /** Current session ID (null for new conversations) */\n sessionId: string | null;\n /** Current entries in the conversation */\n entries: NormalizedEntry[];\n}\n\n/**\n * Result returned from onBeforeSend hook\n * Return void or omit fields to keep original values\n */\nexport interface BeforeSendResult {\n /** Modified prompt to send */\n prompt?: string;\n /** Additional metadata to include with the request */\n metadata?: Record<string, unknown>;\n /** Additional context to prepend to the session */\n sessionContext?: string;\n /** If true, cancels the send operation */\n cancel?: boolean;\n}\n\n/**\n * Options for useAgentChat\n */\nexport interface UseAgentChatOptions {\n /**\n * Function to create a stream of events.\n * Can wrap client.agents.run() or client.sessions.send()\n *\n * @example\n * ```tsx\n * createStream: (prompt, sessionId, signal) => {\n * if (sessionId) {\n * return client.sessions.send(sessionId, prompt, { signal });\n * }\n * return client.agents.run(agentId, prompt, { signal });\n * }\n * ```\n */\n createStream: CreateStreamFn;\n\n /**\n * Function to subscribe to an existing session for reconnection.\n * If provided, enables auto-reconnection when the stream is interrupted.\n *\n * @example\n * ```tsx\n * subscribeToSession: (sessionId, signal) => {\n * return client.sessions.subscribe(sessionId, { signal });\n * }\n * ```\n */\n subscribeToSession?: SubscribeToSessionFn;\n\n /**\n * Initial session ID (for resuming a conversation)\n */\n initialSessionId?: string;\n\n /**\n * Initial entries to display (e.g., from loading history)\n */\n initialEntries?: NormalizedEntry[];\n\n /**\n * Callback when session starts\n */\n onSessionStart?: (sessionId: string) => void;\n\n /**\n * Callback when session ends\n */\n onSessionEnd?: (sessionId: string, status: string) => void;\n\n /**\n * Callback when an error occurs\n */\n onError?: (error: string) => void;\n\n /**\n * Callback for sandbox log events\n */\n onSandboxLog?: (entry: NonNullable<StreamEvent['entry']>) => void;\n\n /**\n * Callback when reconnection is attempted\n */\n onReconnect?: (attempt: number, sessionId: string) => void;\n\n /**\n * Maximum number of reconnection attempts (default: 3)\n */\n maxReconnectAttempts?: number;\n\n /**\n * Base delay for exponential backoff in ms (default: 1000)\n */\n reconnectBaseDelay?: number;\n\n /**\n * Called before each message is sent.\n * Use for pre-flight work like file synchronization, validation, or adding context.\n * Return { cancel: true } to prevent the message from being sent.\n *\n * @example\n * ```tsx\n * onBeforeSend: async ({ prompt, sessionId }) => {\n * await syncFilesToSandbox(sessionId);\n * return {\n * sessionContext: `Current file: ${currentFile}`,\n * metadata: { version: '1.0' },\n * };\n * }\n * ```\n */\n onBeforeSend?: (context: BeforeSendContext) => Promise<BeforeSendResult | void> | BeforeSendResult | void;\n\n /**\n * Called for every raw stream event before internal processing.\n * Use for logging, analytics, or detecting specific events.\n *\n * @example\n * ```tsx\n * onEvent: (event) => {\n * if (event.type === 'tool_result' && event.toolName === 'browser_navigate') {\n * updatePreview(event.toolResult?.url);\n * }\n * }\n * ```\n */\n onEvent?: (event: StreamEvent) => void | Promise<void>;\n\n /**\n * Array of middleware for composable request/event transforms.\n * Middleware are executed in order. Each can modify requests,\n * transform events, or filter events by returning null.\n *\n * @example\n * ```tsx\n * middleware: [\n * {\n * onRequest: async (req) => ({\n * metadata: { ...req.metadata, timestamp: Date.now() },\n * }),\n * onEvent: (event) => {\n * // Filter out sandbox_log events\n * if (event.type === 'sandbox_log') return null;\n * return event;\n * },\n * },\n * ]\n * ```\n */\n middleware?: ChatMiddleware[];\n}\n\n/**\n * Return type for useAgentChat\n */\nexport interface UseAgentChatReturn {\n /**\n * All entries to display (history + streaming content)\n * This is the single source of truth for rendering\n */\n entries: NormalizedEntry[];\n\n /**\n * Whether a message is currently being streamed\n */\n isStreaming: boolean;\n\n /**\n * Whether the hook is attempting to reconnect after a stream interruption\n */\n isReconnecting: boolean;\n\n /**\n * Current error message (if any)\n */\n error: string | null;\n\n /**\n * Current session ID\n */\n sessionId: string | null;\n\n /**\n * Send a message to the agent\n */\n send: (prompt: string) => Promise<void>;\n\n /**\n * Stop the current streaming request\n */\n stop: () => void;\n\n /**\n * Clear all entries and start fresh\n */\n clear: () => void;\n\n /**\n * Set entries from external source (e.g., loading from server)\n * This replaces all entries and clears streaming state\n */\n setEntries: (entries: NormalizedEntry[]) => void;\n\n /**\n * Last seen SSE sequence number.\n * Use this for reconnection via the relay endpoint: GET /sessions/:id/stream?after=lastSequence\n */\n lastSequence: number;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\nexport function useAgentChat(options: UseAgentChatOptions): UseAgentChatReturn {\n const {\n createStream,\n subscribeToSession,\n initialSessionId,\n initialEntries = [],\n onSessionStart,\n onSessionEnd,\n onError,\n onSandboxLog,\n onReconnect,\n maxReconnectAttempts = 3,\n reconnectBaseDelay = 1000,\n onBeforeSend,\n onEvent,\n middleware,\n } = options;\n\n // Core state\n const [historyEntries, setHistoryEntries] = useState<NormalizedEntry[]>(initialEntries);\n const [streamingEntries, setStreamingEntries] = useState<NormalizedEntry[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isReconnecting, setIsReconnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [sessionId, setSessionId] = useState<string | null>(initialSessionId || null);\n\n // Refs for streaming state management\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentTextRef = useRef<string>('');\n const currentTextIdRef = useRef<string | null>(null);\n const pendingToolCallsRef = useRef<Map<string, { entryIndex: number; toolCall: NormalizedToolCall }>>(new Map());\n const hadToolCallSinceTextRef = useRef<boolean>(false);\n const reconnectAttemptsRef = useRef<number>(0);\n const eventCountRef = useRef<number>(0);\n const sessionIdRef = useRef<string | null>(sessionId);\n const streamingEntriesRef = useRef<NormalizedEntry[]>([]);\n /** Track the last SSE sequence number for relay reconnection */\n const lastSequenceRef = useRef<number>(0);\n\n // Keep refs in sync with state\n useEffect(() => {\n sessionIdRef.current = sessionId;\n }, [sessionId]);\n\n useEffect(() => {\n streamingEntriesRef.current = streamingEntries;\n }, [streamingEntries]);\n\n // Combined entries (history + streaming) - no duplicates\n const entries = [...historyEntries, ...streamingEntries];\n\n // Helper to emit streaming entries\n const emitStreamingEntries = useCallback((newEntries: NormalizedEntry[]) => {\n setStreamingEntries([...newEntries]);\n }, []);\n\n // Helper to create a text entry\n const createTextEntry = useCallback((id: string, content: string): NormalizedEntry => ({\n id,\n timestamp: new Date().toISOString(),\n entryType: { type: 'assistant_message' },\n content,\n }), []);\n\n // Reset streaming state\n const resetStreamingState = useCallback(() => {\n currentTextRef.current = '';\n currentTextIdRef.current = null;\n pendingToolCallsRef.current.clear();\n hadToolCallSinceTextRef.current = false;\n setStreamingEntries([]);\n }, []);\n\n // Process a streaming event\n const processEvent = useCallback((event: StreamEvent, streamEntries: NormalizedEntry[]): NormalizedEntry[] => {\n // Track sequence number for relay reconnection\n if (event.id) {\n const seq = parseInt(event.id, 10);\n if (!isNaN(seq)) {\n lastSequenceRef.current = seq;\n }\n }\n\n const newEntries = [...streamEntries];\n\n switch (event.type) {\n case 'session_start':\n if (event.sessionId) {\n setSessionId(event.sessionId);\n onSessionStart?.(event.sessionId);\n }\n break;\n\n case 'text_delta':\n if (event.delta) {\n // If there was a tool call since last text, start a new text entry\n if (hadToolCallSinceTextRef.current && currentTextIdRef.current) {\n currentTextRef.current = '';\n currentTextIdRef.current = null;\n hadToolCallSinceTextRef.current = false;\n }\n\n currentTextRef.current += event.delta;\n\n if (!currentTextIdRef.current) {\n // Create new text entry\n currentTextIdRef.current = `text-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n newEntries.push(createTextEntry(currentTextIdRef.current, currentTextRef.current));\n } else {\n // Update existing text entry\n const entryIndex = newEntries.findIndex((e) => e.id === currentTextIdRef.current);\n if (entryIndex !== -1) {\n newEntries[entryIndex] = createTextEntry(currentTextIdRef.current, currentTextRef.current);\n }\n }\n }\n break;\n\n case 'tool_use':\n if (event.toolId && event.toolName) {\n // Finalize current text\n currentTextRef.current = '';\n currentTextIdRef.current = null;\n hadToolCallSinceTextRef.current = true;\n\n const toolCall = createToolCall({\n id: event.toolId,\n name: event.toolName,\n input: event.input,\n });\n\n const entry: NormalizedEntry = {\n id: event.toolId,\n timestamp: new Date().toISOString(),\n entryType: { type: 'tool_call', toolCall },\n content: toolCall.summary,\n };\n\n const entryIndex = newEntries.length;\n newEntries.push(entry);\n\n pendingToolCallsRef.current.set(event.toolId, { entryIndex, toolCall });\n }\n break;\n\n case 'tool_result':\n if (event.toolId) {\n const pending = pendingToolCallsRef.current.get(event.toolId);\n if (pending) {\n const updatedToolCall = updateToolCallWithResult(\n pending.toolCall,\n event.toolResult,\n event.isError\n );\n\n const existingEntry = newEntries[pending.entryIndex];\n if (existingEntry && existingEntry.entryType.type === 'tool_call') {\n newEntries[pending.entryIndex] = {\n ...existingEntry,\n entryType: { type: 'tool_call', toolCall: updatedToolCall },\n };\n }\n\n pendingToolCallsRef.current.delete(event.toolId);\n }\n }\n break;\n\n case 'text':\n // Complete text block - only use if no text_delta events were received\n // This is a fallback for non-streaming responses or loading past messages\n if (event.text && !currentTextRef.current) {\n currentTextIdRef.current = `text-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n currentTextRef.current = event.text;\n newEntries.push(createTextEntry(currentTextIdRef.current, currentTextRef.current));\n }\n // If we already have text from text_delta, ignore to avoid duplication\n break;\n\n case 'message':\n // Complete message - only use if no text_delta events were received\n // This handles loading past messages or non-streaming responses\n if (event.content && !currentTextRef.current) {\n const messageContent = event.content as Array<{ type: string; text?: string }>;\n const textBlock = messageContent?.find((c) => c.type === 'text');\n if (textBlock?.text) {\n currentTextIdRef.current = `text-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n currentTextRef.current = textBlock.text;\n newEntries.push(createTextEntry(currentTextIdRef.current, currentTextRef.current));\n }\n }\n // If we already have text from text_delta, ignore to avoid duplication\n break;\n\n case 'sandbox_log':\n if (event.entry) {\n onSandboxLog?.(event.entry);\n }\n break;\n\n case 'error':\n if (event.error) {\n setError(event.error);\n onError?.(event.error);\n\n // Add error entry\n newEntries.push({\n id: `error-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n timestamp: new Date().toISOString(),\n entryType: { type: 'error', message: event.error, code: event.code },\n content: event.error,\n });\n }\n break;\n\n case 'session_end':\n onSessionEnd?.(event.sessionId || sessionId || '', event.status || 'completed');\n break;\n\n case 'complete':\n // Streaming is complete - finalize entries\n // Move streaming entries to history\n if (newEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...newEntries]);\n }\n resetStreamingState();\n return []; // Return empty - entries moved to history\n }\n\n return newEntries;\n }, [sessionId, onSessionStart, onSessionEnd, onError, onSandboxLog, createTextEntry, resetStreamingState]);\n\n // Attempt to reconnect to an existing session\n const attemptReconnect = useCallback(async (\n targetSessionId: string,\n currentEntries: NormalizedEntry[]\n ): Promise<boolean> => {\n if (!subscribeToSession) {\n return false;\n }\n\n const attempt = reconnectAttemptsRef.current + 1;\n if (attempt > maxReconnectAttempts) {\n console.warn(`[useAgentChat] Max reconnection attempts (${maxReconnectAttempts}) exceeded`);\n return false;\n }\n\n reconnectAttemptsRef.current = attempt;\n setIsReconnecting(true);\n onReconnect?.(attempt, targetSessionId);\n\n // Exponential backoff: 1s, 2s, 4s, etc.\n const delay = reconnectBaseDelay * Math.pow(2, attempt - 1);\n console.log(`[useAgentChat] Reconnection attempt ${attempt}/${maxReconnectAttempts} in ${delay}ms`);\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n // Create new abort controller for reconnection\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n try {\n const stream = subscribeToSession(targetSessionId, controller.signal);\n let localStreamingEntries = [...currentEntries];\n\n for await (const event of stream) {\n if (controller.signal.aborted) break;\n\n // Track events to know if we're receiving data\n eventCountRef.current++;\n\n localStreamingEntries = processEvent(event, localStreamingEntries);\n emitStreamingEntries(localStreamingEntries);\n\n // Check for terminal events\n if (event.type === 'complete' || event.type === 'session_end' || event.type === 'error') {\n // Successfully completed - reset reconnect counter\n reconnectAttemptsRef.current = 0;\n setIsReconnecting(false);\n\n // Move entries to history if complete\n if (event.type === 'complete' && localStreamingEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...localStreamingEntries]);\n setStreamingEntries([]);\n }\n return true;\n }\n }\n\n // Stream ended normally\n reconnectAttemptsRef.current = 0;\n setIsReconnecting(false);\n if (localStreamingEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...localStreamingEntries]);\n setStreamingEntries([]);\n }\n return true;\n } catch (err) {\n const isAbort = (err as Error).name === 'AbortError' ||\n (err as Error).message?.includes('aborted') ||\n (err as Error).message?.includes('BodyStreamBuffer');\n\n if (isAbort && !controller.signal.aborted) {\n // Connection dropped again, try another reconnect\n console.log(`[useAgentChat] Reconnection stream interrupted, will retry...`);\n setIsReconnecting(false);\n return attemptReconnect(targetSessionId, streamingEntriesRef.current);\n }\n\n // Non-abort error or user-initiated abort\n setIsReconnecting(false);\n if (!controller.signal.aborted) {\n const errorMessage = err instanceof Error ? err.message : 'Reconnection failed';\n console.error(`[useAgentChat] Reconnection failed:`, errorMessage);\n }\n return false;\n }\n }, [subscribeToSession, maxReconnectAttempts, reconnectBaseDelay, onReconnect, processEvent, emitStreamingEntries]);\n\n // Send a message\n const send = useCallback(async (prompt: string) => {\n if (isStreaming) return;\n\n // Prepare request variables\n let finalPrompt = prompt;\n let additionalMetadata: Record<string, unknown> = {};\n let additionalContext: string | undefined;\n\n // 1. Call onBeforeSend hook\n if (onBeforeSend) {\n try {\n const result = await onBeforeSend({\n prompt,\n sessionId,\n entries: [...historyEntries, ...streamingEntries],\n });\n if (result?.cancel) {\n return; // Cancel the send\n }\n if (result?.prompt !== undefined) finalPrompt = result.prompt;\n if (result?.metadata) additionalMetadata = result.metadata;\n if (result?.sessionContext) additionalContext = result.sessionContext;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Send cancelled';\n setError(errorMessage);\n onError?.(errorMessage);\n return;\n }\n }\n\n // 2. Apply request middleware\n if (middleware?.length) {\n const middlewareRequest: MiddlewareRequest = {\n prompt: finalPrompt,\n sessionId,\n metadata: additionalMetadata,\n sessionContext: additionalContext,\n };\n const { request, error: middlewareError } = await applyRequestMiddleware(middleware, middlewareRequest);\n if (middlewareError) {\n setError(middlewareError);\n onError?.(middlewareError);\n await callMiddlewareError(middleware, middlewareError);\n return;\n }\n finalPrompt = request.prompt;\n additionalMetadata = request.metadata || {};\n additionalContext = request.sessionContext;\n }\n\n setIsStreaming(true);\n setError(null);\n reconnectAttemptsRef.current = 0;\n eventCountRef.current = 0;\n\n // Add user message to history (use original prompt for display)\n const userEntry: NormalizedEntry = {\n id: `user-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n timestamp: new Date().toISOString(),\n entryType: { type: 'user_message' },\n content: prompt,\n };\n setHistoryEntries((prev) => [...prev, userEntry]);\n\n // Reset streaming state\n resetStreamingState();\n\n // Create abort controller\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n let localStreamingEntries: NormalizedEntry[] = [];\n let completedSessionId: string | null = null;\n\n try {\n // Pass metadata and sessionContext through to createStream\n const stream = createStream(finalPrompt, sessionId || undefined, {\n signal: controller.signal,\n metadata: Object.keys(additionalMetadata).length > 0 ? additionalMetadata : undefined,\n sessionContext: additionalContext,\n });\n\n for await (const event of stream) {\n if (controller.signal.aborted) break;\n\n // Track events received\n eventCountRef.current++;\n\n // Capture session ID for middleware completion callback\n if (event.type === 'session_start' && event.sessionId) {\n completedSessionId = event.sessionId;\n }\n\n // 3. Call onEvent hook (raw event)\n if (onEvent) {\n try {\n await onEvent(event);\n } catch (err) {\n console.error('[useAgentChat] onEvent error:', err);\n }\n }\n\n // 4. Apply event middleware\n let processedEvent: StreamEvent | null = event;\n if (middleware?.length) {\n processedEvent = await applyEventMiddleware(middleware, event);\n }\n\n // Skip filtered events\n if (!processedEvent) continue;\n\n localStreamingEntries = processEvent(processedEvent, localStreamingEntries);\n emitStreamingEntries(localStreamingEntries);\n }\n\n // Streaming completed - move remaining entries to history\n if (localStreamingEntries.length > 0) {\n setHistoryEntries((prev) => [...prev, ...localStreamingEntries]);\n setStreamingEntries([]);\n }\n\n // Reset reconnect counter on successful completion\n reconnectAttemptsRef.current = 0;\n\n // 5. Call middleware completion handlers\n if (middleware?.length && (completedSessionId || sessionIdRef.current)) {\n await callMiddlewareComplete(middleware, completedSessionId || sessionIdRef.current || '');\n }\n } catch (err) {\n const isAbort = (err as Error).name === 'AbortError' ||\n (err as Error).message?.includes('aborted') ||\n (err as Error).message?.includes('BodyStreamBuffer');\n\n if (isAbort && !controller.signal.aborted) {\n // Stream was interrupted (not user-initiated abort)\n // Check if we have a session and received events - if so, try to reconnect\n const currentSessionId = sessionIdRef.current;\n const hadEvents = eventCountRef.current > 0;\n\n console.log(`[useAgentChat] Stream interrupted. sessionId=${currentSessionId}, events=${eventCountRef.current}`);\n\n if (currentSessionId && hadEvents && subscribeToSession) {\n console.log(`[useAgentChat] Attempting auto-reconnection...`);\n const reconnected = await attemptReconnect(currentSessionId, streamingEntriesRef.current);\n if (reconnected) {\n // Reconnection successful, don't set error\n return;\n }\n // Reconnection failed, fall through to set error\n const errorMsg = 'Connection lost. Please try again.';\n setError(errorMsg);\n onError?.(errorMsg);\n if (middleware?.length) {\n await callMiddlewareError(middleware, errorMsg);\n }\n }\n // No session or no events yet - just let it end silently (user probably aborted)\n } else if (!isAbort) {\n // Non-abort error\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n onError?.(errorMessage);\n if (middleware?.length) {\n await callMiddlewareError(middleware, errorMessage);\n }\n }\n } finally {\n setIsStreaming(false);\n setIsReconnecting(false);\n abortControllerRef.current = null;\n resetStreamingState();\n }\n }, [isStreaming, sessionId, historyEntries, streamingEntries, createStream, subscribeToSession, processEvent, emitStreamingEntries, resetStreamingState, onError, attemptReconnect, onBeforeSend, onEvent, middleware]);\n\n // Stop streaming (also cancels any reconnection attempts)\n const stop = useCallback(() => {\n // Reset reconnection state to prevent further attempts\n reconnectAttemptsRef.current = maxReconnectAttempts + 1;\n setIsReconnecting(false);\n\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, [maxReconnectAttempts]);\n\n // Clear all entries\n const clear = useCallback(() => {\n setHistoryEntries([]);\n resetStreamingState();\n setSessionId(initialSessionId || null);\n setError(null);\n setIsReconnecting(false);\n reconnectAttemptsRef.current = 0;\n eventCountRef.current = 0;\n }, [initialSessionId, resetStreamingState]);\n\n // Set entries from external source\n const setEntries = useCallback((newEntries: NormalizedEntry[]) => {\n resetStreamingState();\n setHistoryEntries(newEntries);\n }, [resetStreamingState]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return {\n entries,\n isStreaming,\n isReconnecting,\n error,\n sessionId,\n send,\n stop,\n clear,\n setEntries,\n lastSequence: lastSequenceRef.current,\n };\n}\n\nexport default useAgentChat;\n","/**\n * useChat - AI SDK compatible chat hook for ash-cloud\n *\n * This hook provides an interface compatible with AI SDK's useChat hook\n * while using ash-cloud's streaming infrastructure under the hood.\n *\n * @example\n * ```tsx\n * import { useChat } from '@ash-cloud/ash-ui';\n *\n * function Chat() {\n * const {\n * messages,\n * isLoading,\n * append,\n * stop,\n * setMessages,\n * } = useChat({\n * createStream: (prompt, sessionId) => client.agents.run(agentId, prompt),\n * onToolCall: ({ toolCall }) => console.log('Tool called:', toolCall.toolName),\n * });\n *\n * return (\n * <Conversation>\n * {messages.map((m) => (\n * <Message key={m.id} from={m.role}>{m.content}</Message>\n * ))}\n * </Conversation>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport type {\n Message,\n ToolInvocation,\n NormalizedEntry,\n} from '../types';\nimport {\n messagesToNormalizedEntries,\n} from '../types';\nimport {\n applyRequestMiddleware,\n applyEventMiddleware,\n callMiddlewareComplete,\n callMiddlewareError,\n} from './middleware';\nimport type { ChatMiddleware, MiddlewareRequest } from './middleware';\nimport type { StreamEvent, StreamGenerator, CreateStreamFn, CreateStreamOptions } from './useAgentChat';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Message to append to the conversation\n */\nexport interface CreateMessage {\n /** Message ID (auto-generated if not provided) */\n id?: string;\n /** Message role */\n role: 'user' | 'assistant' | 'system' | 'data';\n /** Message content */\n content: string;\n /** Tool invocations */\n toolInvocations?: ToolInvocation[];\n /** Reasoning content */\n reasoning?: string;\n}\n\n/**\n * Options for appending a message\n */\nexport interface ChatRequestOptions {\n /** Additional data to include with the request */\n data?: Record<string, unknown>;\n /** Additional body parameters */\n body?: Record<string, unknown>;\n}\n\n/**\n * Tool call handler callback\n */\nexport interface ToolCallHandler {\n /** The tool invocation */\n toolCall: ToolInvocation;\n}\n\n/**\n * Options for useChat hook\n */\nexport interface UseChatOptions {\n /**\n * Function to create a stream of events.\n * Can wrap client.agents.run() or client.sessions.send()\n */\n createStream: CreateStreamFn;\n\n /**\n * Function to subscribe to an existing session for reconnection.\n */\n subscribeToSession?: (sessionId: string, signal?: AbortSignal) => StreamGenerator;\n\n /**\n * Initial session ID (for resuming a conversation)\n */\n initialSessionId?: string;\n\n /**\n * Initial messages to display\n */\n initialMessages?: Message[];\n\n /**\n * Callback when a tool is called\n */\n onToolCall?: (handler: ToolCallHandler) => void;\n\n /**\n * Callback when streaming finishes\n */\n onFinish?: (message: Message) => void;\n\n /**\n * Callback when an error occurs\n */\n onError?: (error: Error) => void;\n\n /**\n * Callback when session starts\n */\n onSessionStart?: (sessionId: string) => void;\n\n /**\n * Maximum number of reconnection attempts\n */\n maxReconnectAttempts?: number;\n\n /**\n * Base delay for exponential backoff in ms\n */\n reconnectBaseDelay?: number;\n\n /**\n * Middleware for composable request/event transforms\n */\n middleware?: ChatMiddleware[];\n}\n\n/**\n * Return type for useChat\n */\nexport interface UseChatReturn {\n /** All messages in the conversation */\n messages: Message[];\n\n /** Whether a message is currently being streamed */\n isLoading: boolean;\n\n /** Current error (if any) */\n error: Error | undefined;\n\n /** Current session ID */\n sessionId: string | null;\n\n /** Append a message to the conversation and stream response */\n append: (\n message: CreateMessage | string,\n options?: ChatRequestOptions\n ) => Promise<string | null | undefined>;\n\n /** Stop the current streaming request */\n stop: () => void;\n\n /** Set messages (replace all) */\n setMessages: (messages: Message[]) => void;\n\n /** Reload the last assistant message */\n reload: () => Promise<string | null | undefined>;\n\n /** The current input value (for controlled input) */\n input: string;\n\n /** Set the input value */\n setInput: (input: string) => void;\n\n /** Handle input change (for form inputs) */\n handleInputChange: (\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => void;\n\n /** Handle form submission */\n handleSubmit: (\n e?: React.FormEvent<HTMLFormElement>,\n options?: ChatRequestOptions\n ) => void;\n\n /** Whether currently reconnecting after stream interruption */\n isReconnecting: boolean;\n\n /**\n * Legacy: Get entries in NormalizedEntry format\n * For backwards compatibility during migration\n */\n entries: NormalizedEntry[];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction generateId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n// ============================================================================\n// Hook Implementation\n// ============================================================================\n\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const {\n createStream,\n // subscribeToSession, // TODO: implement reconnection support\n initialSessionId,\n initialMessages = [],\n onToolCall,\n onFinish,\n onError,\n onSessionStart,\n maxReconnectAttempts = 3,\n // reconnectBaseDelay = 1000, // TODO: implement reconnection support\n middleware,\n } = options;\n\n // Core state\n const [messages, setMessages] = useState<Message[]>(initialMessages);\n const [isLoading, setIsLoading] = useState(false);\n const [isReconnecting, setIsReconnecting] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [sessionId, setSessionId] = useState<string | null>(initialSessionId || null);\n const [input, setInput] = useState('');\n\n // Refs for streaming state management\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentAssistantMessageRef = useRef<Message | null>(null);\n const reconnectAttemptsRef = useRef<number>(0);\n const sessionIdRef = useRef<string | null>(sessionId);\n\n // Keep session ref in sync\n useEffect(() => {\n sessionIdRef.current = sessionId;\n }, [sessionId]);\n\n // Convert messages to entries for backwards compatibility\n const entries = messagesToNormalizedEntries(messages);\n\n // Helper to update the current streaming assistant message\n const updateStreamingMessage = useCallback((updater: (msg: Message) => Message) => {\n if (!currentAssistantMessageRef.current) return;\n\n currentAssistantMessageRef.current = updater(currentAssistantMessageRef.current);\n\n const currentMsg = currentAssistantMessageRef.current;\n setMessages((prev) => {\n const lastIndex = prev.length - 1;\n const lastMessage = prev[lastIndex];\n if (lastIndex >= 0 && lastMessage && currentMsg && lastMessage.id === currentMsg.id) {\n return [...prev.slice(0, lastIndex), currentMsg];\n }\n return prev;\n });\n }, []);\n\n // Process a streaming event\n const processEvent = useCallback((event: StreamEvent) => {\n switch (event.type) {\n case 'session_start':\n if (event.sessionId) {\n setSessionId(event.sessionId);\n onSessionStart?.(event.sessionId);\n }\n break;\n\n case 'text_delta':\n if (event.delta) {\n updateStreamingMessage((msg) => ({\n ...msg,\n content: msg.content + event.delta,\n }));\n }\n break;\n\n case 'tool_use':\n if (event.toolId && event.toolName) {\n const toolInvocation: ToolInvocation = {\n state: 'call',\n toolCallId: event.toolId,\n toolName: event.toolName,\n args: (event.input as Record<string, unknown>) || {},\n };\n\n updateStreamingMessage((msg) => ({\n ...msg,\n toolInvocations: [...(msg.toolInvocations || []), toolInvocation],\n }));\n\n onToolCall?.({ toolCall: toolInvocation });\n }\n break;\n\n case 'tool_result':\n if (event.toolId) {\n updateStreamingMessage((msg) => ({\n ...msg,\n toolInvocations: msg.toolInvocations?.map((inv) =>\n inv.toolCallId === event.toolId\n ? { ...inv, state: 'result' as const, result: event.toolResult }\n : inv\n ),\n }));\n }\n break;\n\n case 'text':\n // Complete text block - fallback for non-streaming\n if (event.text && !currentAssistantMessageRef.current?.content) {\n updateStreamingMessage((msg) => ({\n ...msg,\n content: event.text || '',\n }));\n }\n break;\n\n case 'error':\n if (event.error) {\n const err = new Error(event.error);\n setError(err);\n onError?.(err);\n }\n break;\n\n case 'complete':\n if (currentAssistantMessageRef.current) {\n onFinish?.(currentAssistantMessageRef.current);\n }\n break;\n }\n }, [updateStreamingMessage, onToolCall, onFinish, onError, onSessionStart]);\n\n // Append a message and stream response\n const append = useCallback(async (\n messageOrContent: CreateMessage | string,\n options?: ChatRequestOptions\n ): Promise<string | null | undefined> => {\n if (isLoading) return null;\n\n // Create user message\n const userMessage: Message = typeof messageOrContent === 'string'\n ? {\n id: generateId(),\n role: 'user',\n content: messageOrContent,\n createdAt: new Date(),\n }\n : {\n id: messageOrContent.id || generateId(),\n role: messageOrContent.role,\n content: messageOrContent.content,\n toolInvocations: messageOrContent.toolInvocations,\n reasoning: messageOrContent.reasoning,\n createdAt: new Date(),\n };\n\n // Add user message to state\n setMessages((prev) => [...prev, userMessage]);\n\n // Start streaming\n setIsLoading(true);\n setError(undefined);\n reconnectAttemptsRef.current = 0;\n\n // Create assistant message placeholder\n const assistantMessage: Message = {\n id: generateId(),\n role: 'assistant',\n content: '',\n createdAt: new Date(),\n };\n currentAssistantMessageRef.current = assistantMessage;\n setMessages((prev) => [...prev, assistantMessage]);\n\n // Create abort controller\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n try {\n // Apply middleware to request\n let finalPrompt = userMessage.content;\n let additionalMetadata: Record<string, unknown> = options?.body || {};\n\n if (middleware?.length) {\n const middlewareRequest: MiddlewareRequest = {\n prompt: finalPrompt,\n sessionId: sessionIdRef.current,\n metadata: additionalMetadata,\n };\n const { request, error: middlewareError } = await applyRequestMiddleware(middleware, middlewareRequest);\n if (middlewareError) {\n const err = new Error(middlewareError);\n setError(err);\n onError?.(err);\n setIsLoading(false);\n return null;\n }\n finalPrompt = request.prompt;\n additionalMetadata = request.metadata || {};\n }\n\n // Create stream\n const streamOptions: CreateStreamOptions = {\n signal: controller.signal,\n metadata: Object.keys(additionalMetadata).length > 0 ? additionalMetadata : undefined,\n };\n const stream = createStream(finalPrompt, sessionIdRef.current || undefined, streamOptions);\n\n // Process stream events\n for await (const event of stream) {\n if (controller.signal.aborted) break;\n\n // Apply event middleware\n let processedEvent: StreamEvent | null = event;\n if (middleware?.length) {\n processedEvent = await applyEventMiddleware(middleware, event);\n }\n\n if (processedEvent) {\n processEvent(processedEvent);\n }\n }\n\n // Call middleware completion\n if (middleware?.length && sessionIdRef.current) {\n await callMiddlewareComplete(middleware, sessionIdRef.current);\n }\n\n return assistantMessage.id;\n } catch (err) {\n const isAbort = (err as Error).name === 'AbortError';\n\n if (!isAbort) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n\n if (middleware?.length) {\n await callMiddlewareError(middleware, error.message);\n }\n }\n\n return null;\n } finally {\n setIsLoading(false);\n setIsReconnecting(false);\n abortControllerRef.current = null;\n currentAssistantMessageRef.current = null;\n }\n }, [isLoading, createStream, processEvent, middleware, onError]);\n\n // Stop streaming\n const stop = useCallback(() => {\n reconnectAttemptsRef.current = maxReconnectAttempts + 1;\n setIsReconnecting(false);\n\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, [maxReconnectAttempts]);\n\n // Reload last assistant message\n const reload = useCallback(async (): Promise<string | null | undefined> => {\n // Find the last user message (iterate backwards)\n let lastUserMessageIndex = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === 'user') {\n lastUserMessageIndex = i;\n break;\n }\n }\n if (lastUserMessageIndex === -1) return null;\n\n const lastUserMessage = messages[lastUserMessageIndex];\n if (!lastUserMessage) return null;\n\n // Remove messages after the last user message\n setMessages(messages.slice(0, lastUserMessageIndex + 1));\n\n // Re-send the message\n return append(lastUserMessage);\n }, [messages, append]);\n\n // Handle input change\n const handleInputChange = useCallback((\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => {\n setInput(e.target.value);\n }, []);\n\n // Handle form submission\n const handleSubmit = useCallback((\n e?: React.FormEvent<HTMLFormElement>,\n options?: ChatRequestOptions\n ) => {\n e?.preventDefault();\n\n if (!input.trim()) return;\n\n const message = input;\n setInput('');\n append(message, options);\n }, [input, append]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n };\n }, []);\n\n return {\n messages,\n isLoading,\n error,\n sessionId,\n append,\n stop,\n setMessages,\n reload,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n isReconnecting,\n entries,\n };\n}\n\nexport default useChat;\n","'use client';\n\nimport { useCallback, useState, ClipboardEvent } from 'react';\n\n/**\n * Configuration for long text auto-conversion\n */\nexport interface LongTextConversionOptions {\n /** Character threshold to trigger conversion (default: 5000) */\n threshold?: number;\n /** Filename template for converted attachments (default: 'pasted-text-{timestamp}.txt') */\n filenameTemplate?: string;\n /** Callback when text is converted to attachment */\n onConversion?: (info: ConversionInfo) => void;\n}\n\n/**\n * Information about a converted text attachment\n */\nexport interface ConversionInfo {\n /** Original text length */\n originalLength: number;\n /** Generated filename */\n filename: string;\n /** Truncated preview of the text (first 100 chars) */\n preview: string;\n /** Number of lines in the text */\n lineCount: number;\n}\n\n/**\n * Text attachment created from long pasted text\n */\nexport interface TextAttachment {\n /** Filename for the attachment */\n filename: string;\n /** Base64-encoded text content */\n content: string;\n /** MIME type (always 'text/plain') */\n mimeType: 'text/plain';\n /** Size in bytes */\n size: number;\n}\n\n/**\n * Result from the useLongTextConversion hook\n */\nexport interface UseLongTextConversionReturn {\n /**\n * Process text and convert to attachment if over threshold.\n * Returns the text if under threshold, or empty string if converted.\n */\n processText: (text: string) => { text: string; attachment?: TextAttachment };\n\n /**\n * Paste event handler that auto-converts long pasted text.\n * Use this on input elements: onPaste={handlePaste}\n */\n handlePaste: (\n event: ClipboardEvent<HTMLTextAreaElement | HTMLInputElement>,\n currentValue: string,\n setValue: (value: string) => void,\n addAttachment: (attachment: TextAttachment) => void\n ) => void;\n\n /**\n * Last conversion info (for showing notifications)\n */\n lastConversion: ConversionInfo | null;\n\n /**\n * Clear the last conversion info\n */\n clearLastConversion: () => void;\n\n /**\n * Current threshold value\n */\n threshold: number;\n}\n\n/**\n * Encode text to base64 (browser-safe for unicode)\n */\nfunction textToBase64(text: string): string {\n // Use TextEncoder for proper unicode handling\n const encoder = new TextEncoder();\n const bytes = encoder.encode(text);\n\n // Convert to base64\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n if (byte !== undefined) {\n binary += String.fromCharCode(byte);\n }\n }\n return btoa(binary);\n}\n\n/**\n * Generate filename from template\n */\nfunction generateFilename(template: string): string {\n const timestamp = Date.now();\n const date = new Date(timestamp);\n const dateStr = date.toISOString().split('T')[0] ?? 'unknown-date'; // YYYY-MM-DD\n const timeStr = (date.toTimeString().split(' ')[0] ?? '00-00-00').replace(/:/g, '-'); // HH-MM-SS\n\n return template\n .replace('{timestamp}', String(timestamp))\n .replace('{date}', dateStr)\n .replace('{time}', timeStr);\n}\n\n/**\n * Hook for automatically converting long pasted text into text file attachments.\n *\n * When users paste text over a certain threshold (default: 5000 characters),\n * the text is automatically converted to a .txt file attachment instead of\n * being inserted into the input field.\n *\n * @example\n * ```tsx\n * function ChatInput({ onSend }) {\n * const [value, setValue] = useState('');\n * const [files, setFiles] = useState<TextAttachment[]>([]);\n *\n * const { handlePaste, lastConversion, clearLastConversion } = useLongTextConversion({\n * threshold: 5000,\n * onConversion: (info) => {\n * console.log(`Converted ${info.originalLength} chars to ${info.filename}`);\n * }\n * });\n *\n * return (\n * <>\n * {lastConversion && (\n * <div className=\"notification\">\n * Long text ({lastConversion.originalLength} chars) converted to attachment\n * <button onClick={clearLastConversion}>Dismiss</button>\n * </div>\n * )}\n * <textarea\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * onPaste={(e) => handlePaste(e, value, setValue, (attachment) => {\n * setFiles(prev => [...prev, attachment]);\n * })}\n * />\n * </>\n * );\n * }\n * ```\n */\nexport function useLongTextConversion({\n threshold = 5000,\n filenameTemplate = 'pasted-text-{timestamp}.txt',\n onConversion,\n}: LongTextConversionOptions = {}): UseLongTextConversionReturn {\n const [lastConversion, setLastConversion] = useState<ConversionInfo | null>(null);\n\n /**\n * Process text and optionally convert to attachment\n */\n const processText = useCallback((text: string): { text: string; attachment?: TextAttachment } => {\n if (text.length <= threshold) {\n return { text };\n }\n\n const filename = generateFilename(filenameTemplate);\n const content = textToBase64(text);\n const encoder = new TextEncoder();\n const size = encoder.encode(text).length;\n const lineCount = text.split('\\n').length;\n\n const attachment: TextAttachment = {\n filename,\n content,\n mimeType: 'text/plain',\n size,\n };\n\n const preview = text.slice(0, 100) + (text.length > 100 ? '...' : '');\n const conversionInfo: ConversionInfo = {\n originalLength: text.length,\n filename,\n preview,\n lineCount,\n };\n\n setLastConversion(conversionInfo);\n onConversion?.(conversionInfo);\n\n return { text: '', attachment };\n }, [threshold, filenameTemplate, onConversion]);\n\n /**\n * Handle paste event with auto-conversion\n */\n const handlePaste = useCallback((\n event: ClipboardEvent<HTMLTextAreaElement | HTMLInputElement>,\n _currentValue: string,\n _setValue: (value: string) => void,\n addAttachment: (attachment: TextAttachment) => void\n ) => {\n const pastedText = event.clipboardData.getData('text/plain');\n\n if (pastedText.length > threshold) {\n // Prevent default paste behavior\n event.preventDefault();\n\n const result = processText(pastedText);\n\n if (result.attachment) {\n addAttachment(result.attachment);\n\n // Optionally add a placeholder or keep current value\n // Don't modify the input value - the attachment badge will show instead\n }\n }\n // For text under threshold, let the default paste behavior happen\n }, [threshold, processText]);\n\n /**\n * Clear the last conversion notification\n */\n const clearLastConversion = useCallback(() => {\n setLastConversion(null);\n }, []);\n\n return {\n processText,\n handlePaste,\n lastConversion,\n clearLastConversion,\n threshold,\n };\n}\n\nexport default useLongTextConversion;\n"]}
|