@ash-cloud/ash-ui 0.1.0 → 0.2.0
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/design-tokens.cjs +20 -0
- package/dist/design-tokens.cjs.map +1 -1
- package/dist/design-tokens.d.cts +31 -1
- package/dist/design-tokens.d.ts +31 -1
- package/dist/design-tokens.js +20 -1
- package/dist/design-tokens.js.map +1 -1
- package/dist/icons.cjs +23 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.d.cts +4 -1
- package/dist/icons.d.ts +4 -1
- package/dist/icons.js +21 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +2416 -1955
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +840 -641
- package/dist/index.d.ts +840 -641
- package/dist/index.js +2360 -1930
- package/dist/index.js.map +1 -1
- package/dist/styles-full.css +1 -1
- package/dist/styles.css +1 -1
- package/dist/types.cjs +243 -6
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +197 -121
- package/dist/types.d.ts +197 -121
- package/dist/types.js +239 -6
- package/dist/types.js.map +1 -1
- package/dist/utils.cjs +0 -35
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +2 -28
- package/dist/utils.d.ts +2 -28
- package/dist/utils.js +1 -34
- package/dist/utils.js.map +1 -1
- package/package.json +22 -16
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/icons.tsx","../src/components/StatusIndicator.tsx","../src/components/ActionIcon.tsx","../src/components/CodeBlock.tsx","../src/components/JsonDisplay.tsx","../src/components/AgentToolCard.tsx","../src/components/ToolCallCard.tsx","../src/components/LazyMarkdown.tsx","../src/components/RichContentRenderer.tsx","../src/components/OptionCards.tsx","../src/components/MessageEntry.tsx","../src/components/LoadingIndicator.tsx","../src/components/StreamingText.tsx","../src/components/CompactToolRow.tsx","../src/components/FileBadge.tsx","../src/components/ToolExecutionGroup.tsx","../src/components/StepAccordion.tsx","../src/types.ts","../src/components/DisplayModeContext.tsx","../src/components/MessageList.tsx","../src/components/LogsPanel.tsx","../src/components/CompactToolStatusLine.tsx","../src/components/TodoPanel.tsx","../src/components/EnvVarsPanel.tsx","../src/components/DisplayModeToggle.tsx","../src/components/TypewriterText.tsx","../src/components/ThemeContext.tsx","../src/design-tokens.ts","../src/hooks/useMessageQueue.ts","../src/hooks/useStopExecution.ts","../src/hooks/useFileUpload.ts","../src/hooks/useAgentChat.ts","../src/hooks/useLongTextConversion.ts"],"names":["jsxs","jsx","useState","useRef","useMemo","useEffect","Fragment","lazy","Suspense","getFileExtension","extractFileChanges","countActionTypes","getActionIconComponent","useCallback","createContext","useContext","formatFileSize"],"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 NormalizedEntry,\n ToolDisplayConfig,\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// Entry Grouping for Compact Mode\n// =============================================================================\n\n/**\n * A grouped entry that contains either a single entry or a group of consecutive tool calls\n */\nexport type GroupedEntry =\n | { type: 'single'; entry: NormalizedEntry }\n | { type: 'tool_group'; entries: NormalizedEntry[]; id: string };\n\n/**\n * Group consecutive tool call entries together based on display config.\n *\n * This is used in compact mode to merge consecutive tool calls into\n * a single ToolExecutionGroup, while keeping text content separate.\n *\n * @param entries - Array of normalized entries\n * @param config - Display configuration (uses breakEveryNToolCalls)\n * @returns Array of grouped entries\n */\nexport function groupEntriesForCompactMode(\n entries: NormalizedEntry[],\n config: ToolDisplayConfig\n): GroupedEntry[] {\n const result: GroupedEntry[] = [];\n let currentToolGroup: NormalizedEntry[] = [];\n let toolGroupCounter = 0;\n\n const flushToolGroup = () => {\n if (currentToolGroup.length > 0) {\n result.push({\n type: 'tool_group',\n entries: [...currentToolGroup],\n id: `tool-group-${toolGroupCounter++}`,\n });\n currentToolGroup = [];\n }\n };\n\n for (const entry of entries) {\n if (entry.entryType.type === 'tool_call') {\n currentToolGroup.push(entry);\n\n // Check if we should break the group\n if (\n config.breakEveryNToolCalls &&\n config.breakEveryNToolCalls > 0 &&\n currentToolGroup.length >= config.breakEveryNToolCalls\n ) {\n flushToolGroup();\n }\n } else {\n // Non-tool-call entry - flush any pending tool group\n flushToolGroup();\n result.push({ type: 'single', entry });\n }\n }\n\n // Flush any remaining tool group\n flushToolGroup();\n\n return result;\n}\n\n/**\n * Extract tool calls from a group of entries\n */\nexport function extractToolCallsFromGroup(entries: NormalizedEntry[]): NormalizedToolCall[] {\n return entries\n .filter((e): e is NormalizedEntry & { entryType: { type: 'tool_call'; toolCall: NormalizedToolCall } } =>\n e.entryType.type === 'tool_call'\n )\n .map((e) => e.entryType.toolCall);\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 * @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","import type { ToolStatus } from '../types';\nimport { cn } from '../utils';\n\nexport interface StatusIndicatorProps {\n status: ToolStatus;\n size?: '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 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","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","import { useState } from 'react';\nimport { cn } from '../utils';\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 accent-colored expand 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 lines = children.split('\\n');\n const isLong = lines.length > 10 || children.length > 500;\n\n return (\n <div className={cn('relative', className)}>\n <pre\n className={cn(\n 'ash-tool-code-block text-xs font-mono text-white/90 p-3 rounded-xl 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","'use client';\n\nimport { useState, useEffect, useRef, useMemo } from 'react';\nimport type { NormalizedToolCall, AgentToolAction } from '../types';\nimport { cn, formatElapsedTime } from '../utils';\nimport { ChevronRightIcon, BotIcon, SpinnerIcon, ClockIcon } from '../icons';\nimport { ToolCallCard } from './ToolCallCard';\n\nexport interface AgentToolCardProps {\n /** The tool call with agent_tool action type */\n toolCall: NormalizedToolCall;\n /** Whether the card starts expanded */\n defaultExpanded?: boolean;\n /** Additional class names */\n className?: string;\n /** Depth level for nested rendering (0 = top level) */\n depth?: number;\n}\n\n/**\n * AgentToolCard - Display a sub-agent/Task tool call with nested tool calls\n *\n * Features:\n * - Agent type badge (e.g., \"Explore\", \"Plan\", \"Bash\")\n * - Description of what the agent is doing\n * - Tool call count that updates during streaming\n * - Loading indicator while running (spinner)\n * - Elapsed time display while running\n * - Expandable to show nested tool calls\n * - Supports deep nesting (agents within agents)\n *\n * @example\n * ```tsx\n * <AgentToolCard\n * toolCall={agentToolCall}\n * defaultExpanded={false}\n * />\n * ```\n */\nexport function AgentToolCard({\n toolCall,\n defaultExpanded = false,\n className,\n depth = 0,\n}: AgentToolCardProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const [elapsedTime, setElapsedTime] = useState<string>('');\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const { actionType, status, summary, nestedToolCalls, nestedToolCallCount, startedAt } = toolCall;\n\n // Extract agent action data - memoized to avoid recalculation\n const agentData = useMemo(() => {\n if (actionType.action !== 'agent_tool') {\n return null;\n }\n const agentAction = actionType as AgentToolAction;\n return {\n agentType: agentAction.agentType,\n description: agentAction.description,\n prompt: agentAction.prompt,\n };\n }, [actionType]);\n\n // Count of tool calls - use the streaming count if available, otherwise use nested array length\n const toolCount = nestedToolCallCount ?? nestedToolCalls?.length ?? 0;\n\n // Is the agent still running?\n const isRunning = status === 'pending';\n\n // Update elapsed time every second while running\n useEffect(() => {\n if (isRunning && startedAt) {\n // Initial update\n setElapsedTime(formatElapsedTime(startedAt));\n\n // Update every second\n intervalRef.current = setInterval(() => {\n setElapsedTime(formatElapsedTime(startedAt));\n }, 1000);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n } else if (!isRunning) {\n // Clear interval when done\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n // Clear elapsed time when agent finishes\n setElapsedTime('');\n }\n return undefined;\n }, [isRunning, startedAt]);\n\n // Type guard - return null if not an agent_tool (after all hooks)\n if (!agentData) {\n return null;\n }\n\n const { agentType, description, prompt } = agentData;\n\n // Calculate nested depth indent\n const indentClass = depth > 0 ? 'ml-4' : '';\n\n return (\n <div\n className={cn(\n 'rounded-xl border bg-[var(--ash-surface-dark,#0a0a0a)] overflow-hidden',\n isRunning ? 'border-yellow-500/30' : status === 'failed' ? 'border-red-500/30' : 'border-white/10',\n indentClass,\n className\n )}\n >\n {/* Header */}\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full px-4 py-3 flex items-center gap-3 hover:bg-white/5 cursor-pointer transition-colors\"\n >\n {/* Chevron */}\n <ChevronRightIcon\n className={cn(\n 'w-4 h-4 text-white/40 transition-transform duration-200 shrink-0',\n expanded && 'rotate-90'\n )}\n />\n\n {/* Agent icon */}\n <div\n className={cn(\n 'w-6 h-6 rounded-lg flex items-center justify-center shrink-0',\n isRunning ? 'bg-yellow-500/20' : status === 'failed' ? 'bg-red-500/20' : 'bg-[var(--ash-accent)]/20'\n )}\n >\n {isRunning ? (\n <SpinnerIcon\n className=\"w-3.5 h-3.5 text-yellow-400 animate-spin\"\n />\n ) : (\n <BotIcon\n className={cn(\n 'w-3.5 h-3.5',\n status === 'failed' ? 'text-red-400' : 'text-[var(--ash-accent)]'\n )}\n />\n )}\n </div>\n\n {/* Agent type badge */}\n <span\n className={cn(\n 'px-2 py-0.5 rounded text-xs font-medium shrink-0',\n isRunning\n ? 'bg-yellow-500/20 text-yellow-400'\n : status === 'failed'\n ? 'bg-red-500/20 text-red-400'\n : 'bg-white/10 text-white/70'\n )}\n >\n {agentType}\n </span>\n\n {/* Description */}\n <span className=\"text-sm text-white/80 truncate flex-1 text-left\">\n {description || summary}\n </span>\n\n {/* Tool call count */}\n {toolCount > 0 && (\n <span className=\"text-xs text-white/50 shrink-0\">\n {toolCount} tool call{toolCount !== 1 ? 's' : ''}\n </span>\n )}\n\n {/* Elapsed time (only while running) */}\n {isRunning && elapsedTime && (\n <div className=\"flex items-center gap-1 text-xs text-white/40 shrink-0\">\n <ClockIcon className=\"w-3 h-3\" />\n <span>{elapsedTime}</span>\n </div>\n )}\n\n {/* Three-dot menu placeholder */}\n <span className=\"text-white/30 shrink-0\">...</span>\n </button>\n\n {/* Expanded Content */}\n {expanded && (\n <div className=\"border-t border-white/5 bg-black/20\">\n {/* Prompt (if available and not too long) */}\n {prompt && (\n <div className=\"px-4 py-3 border-b border-white/5\">\n <p className=\"text-sm text-white/70 whitespace-pre-wrap\">\n {prompt.length > 500 ? prompt.substring(0, 500) + '...' : prompt}\n </p>\n </div>\n )}\n\n {/* Nested tool calls */}\n {nestedToolCalls && nestedToolCalls.length > 0 && (\n <div className=\"p-3 space-y-2\">\n {nestedToolCalls.map((nestedCall) => (\n <div key={nestedCall.id}>\n {nestedCall.actionType.action === 'agent_tool' ? (\n <AgentToolCard\n toolCall={nestedCall}\n defaultExpanded={false}\n depth={depth + 1}\n />\n ) : (\n <ToolCallCard\n toolCall={nestedCall}\n defaultExpanded={false}\n />\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Empty state when no nested calls yet */}\n {(!nestedToolCalls || nestedToolCalls.length === 0) && isRunning && (\n <div className=\"px-4 py-6 flex items-center justify-center\">\n <div className=\"flex items-center gap-2 text-sm text-white/40\">\n <SpinnerIcon className=\"w-4 h-4 animate-spin\" />\n <span>Agent is working...</span>\n </div>\n </div>\n )}\n\n {/* Completed but no nested calls */}\n {(!nestedToolCalls || nestedToolCalls.length === 0) && !isRunning && (\n <div className=\"px-4 py-4 text-sm text-white/40 text-center\">\n No tool calls recorded\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default AgentToolCard;\n","import { useState } from 'react';\nimport type {\n NormalizedToolCall,\n ActionType,\n CommandRunAction,\n FileReadAction,\n FileEditAction,\n FileWriteAction,\n SearchAction,\n GlobAction,\n WebFetchAction,\n WebSearchAction,\n McpToolAction,\n GenericToolAction,\n TodoWriteAction,\n} from '../types';\nimport { cn, getActionLabel } from '../utils';\nimport { ChevronDownIcon, CheckIcon, CheckCircleIcon, CircleIcon, LoaderIcon } from '../icons';\nimport { StatusIndicator } from './StatusIndicator';\nimport { ActionIcon } from './ActionIcon';\nimport { CodeBlock } from './CodeBlock';\nimport { JsonDisplay } from './JsonDisplay';\nimport { AgentToolCard } from './AgentToolCard';\n\n// =============================================================================\n// Section Components\n// =============================================================================\n\nfunction SectionHeader({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"ash-tool-section-header\">\n {children}\n </div>\n );\n}\n\nfunction SectionContent({ children }: { children: React.ReactNode }) {\n return <div className=\"px-3 py-2\">{children}</div>;\n}\n\n// =============================================================================\n// Tool Details Components\n// =============================================================================\n\nfunction CommandRunDetails({ action }: { action: CommandRunAction }) {\n return (\n <>\n {action.command && (\n <>\n <SectionHeader>COMMAND</SectionHeader>\n <SectionContent>\n <CodeBlock>{action.command}</CodeBlock>\n </SectionContent>\n </>\n )}\n {action.result?.output && (\n <>\n <SectionHeader>OUTPUT</SectionHeader>\n <SectionContent>\n <CodeBlock maxHeight={300}>{action.result.output}</CodeBlock>\n {action.result.exitCode !== undefined && action.result.exitCode !== 0 && (\n <div className=\"mt-2 text-xs text-red-400\">\n Exit code: {action.result.exitCode}\n </div>\n )}\n </SectionContent>\n </>\n )}\n </>\n );\n}\n\nfunction FileReadDetails({ action }: { action: FileReadAction }) {\n return (\n <>\n <SectionHeader>PATH</SectionHeader>\n <SectionContent>\n <code className=\"text-xs font-mono bg-white/10 text-white/90 px-1 py-0.5 rounded\">\n {action.path}\n </code>\n {(action.offset !== undefined || action.limit !== undefined) && (\n <div className=\"mt-1 text-xs text-white/50\">\n {action.offset !== undefined && <span>Offset: {action.offset}</span>}\n {action.offset !== undefined && action.limit !== undefined && <span> · </span>}\n {action.limit !== undefined && <span>Limit: {action.limit}</span>}\n </div>\n )}\n </SectionContent>\n </>\n );\n}\n\nfunction FileEditDetails({ action }: { action: FileEditAction }) {\n return (\n <>\n <SectionHeader>PATH</SectionHeader>\n <SectionContent>\n <code className=\"text-xs font-mono bg-white/10 text-white/90 px-1 py-0.5 rounded\">\n {action.path}\n </code>\n </SectionContent>\n {action.oldString && (\n <>\n <SectionHeader>OLD</SectionHeader>\n <SectionContent>\n <CodeBlock>{action.oldString}</CodeBlock>\n </SectionContent>\n </>\n )}\n {action.newString && (\n <>\n <SectionHeader>NEW</SectionHeader>\n <SectionContent>\n <CodeBlock>{action.newString}</CodeBlock>\n </SectionContent>\n </>\n )}\n </>\n );\n}\n\nfunction FileWriteDetails({ action }: { action: FileWriteAction }) {\n return (\n <>\n <SectionHeader>PATH</SectionHeader>\n <SectionContent>\n <code className=\"text-xs font-mono bg-white/10 text-white/90 px-1 py-0.5 rounded\">\n {action.path}\n </code>\n </SectionContent>\n {action.content && (\n <>\n <SectionHeader>CONTENT</SectionHeader>\n <SectionContent>\n <CodeBlock maxHeight={300}>{action.content}</CodeBlock>\n </SectionContent>\n </>\n )}\n </>\n );\n}\n\nfunction SearchDetails({ action }: { action: SearchAction }) {\n return (\n <>\n <SectionHeader>PATTERN</SectionHeader>\n <SectionContent>\n <code className=\"text-xs font-mono bg-white/10 text-white/90 px-1 py-0.5 rounded\">\n {action.pattern}\n </code>\n {(action.path || action.glob || action.type) && (\n <div className=\"mt-1 text-xs text-white/50\">\n {action.path && <span>Path: {action.path}</span>}\n {action.glob && <span>Glob: {action.glob}</span>}\n {action.type && <span>Type: {action.type}</span>}\n </div>\n )}\n </SectionContent>\n </>\n );\n}\n\nfunction GlobDetails({ action }: { action: GlobAction }) {\n return (\n <>\n <SectionHeader>PATTERN</SectionHeader>\n <SectionContent>\n <code className=\"text-xs font-mono bg-white/10 text-white/90 px-1 py-0.5 rounded\">\n {action.pattern}\n </code>\n {action.path && (\n <div className=\"mt-1 text-xs text-white/50\">Path: {action.path}</div>\n )}\n </SectionContent>\n </>\n );\n}\n\nfunction WebFetchDetails({ action }: { action: WebFetchAction }) {\n return (\n <>\n <SectionHeader>URL</SectionHeader>\n <SectionContent>\n <a\n href={action.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-blue-400 hover:text-blue-300 underline break-all\"\n >\n {action.url}\n </a>\n {action.prompt && (\n <div className=\"mt-2 text-xs text-white/50\">{action.prompt}</div>\n )}\n </SectionContent>\n </>\n );\n}\n\nfunction WebSearchDetails({ action }: { action: WebSearchAction }) {\n return (\n <>\n <SectionHeader>QUERY</SectionHeader>\n <SectionContent>\n <span className=\"text-sm text-white/90\">{action.query}</span>\n </SectionContent>\n </>\n );\n}\n\nfunction McpToolDetails({ action }: { action: McpToolAction }) {\n return (\n <>\n <SectionHeader>TOOL</SectionHeader>\n <SectionContent>\n <code className=\"text-xs font-mono bg-white/10 text-white/90 px-1 py-0.5 rounded\">\n {action.serverName}:{action.toolName}\n </code>\n </SectionContent>\n {action.arguments && (\n <>\n <SectionHeader>ARGS</SectionHeader>\n <SectionContent>\n <JsonDisplay value={action.arguments} />\n </SectionContent>\n </>\n )}\n {action.result && (\n <>\n <SectionHeader>RESULT</SectionHeader>\n <SectionContent>\n {action.result.type === 'markdown' ? (\n <CodeBlock>{String(action.result.value)}</CodeBlock>\n ) : (\n <JsonDisplay value={action.result.value} />\n )}\n </SectionContent>\n </>\n )}\n </>\n );\n}\n\nfunction GenericToolDetails({ action }: { action: GenericToolAction }) {\n return (\n <>\n {action.arguments && (\n <>\n <SectionHeader>ARGS</SectionHeader>\n <SectionContent>\n <JsonDisplay value={action.arguments} />\n </SectionContent>\n </>\n )}\n {action.result && (\n <>\n <SectionHeader>RESULT</SectionHeader>\n <SectionContent>\n {action.result.type === 'markdown' ? (\n <CodeBlock>{String(action.result.value)}</CodeBlock>\n ) : (\n <JsonDisplay value={action.result.value} />\n )}\n </SectionContent>\n </>\n )}\n </>\n );\n}\n\nfunction TodoWriteDetails({ action }: { action: TodoWriteAction }) {\n const { todos, stats } = action;\n\n return (\n <>\n {/* Progress Header */}\n {stats && (\n <>\n <SectionHeader>PROGRESS</SectionHeader>\n <SectionContent>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-1 h-2 bg-white/10 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-emerald-400 rounded-full transition-all duration-500 ease-out\"\n style={{ width: `${stats.total > 0 ? (stats.completed / stats.total) * 100 : 0}%` }}\n />\n </div>\n <span className=\"text-xs text-white/60 tabular-nums\">\n {stats.completed}/{stats.total}\n </span>\n </div>\n <div className=\"flex gap-3 mt-2 text-xs\">\n {stats.inProgress > 0 && (\n <span className=\"text-yellow-400\">\n {stats.inProgress} in progress\n </span>\n )}\n {stats.pending > 0 && (\n <span className=\"text-white/40\">\n {stats.pending} pending\n </span>\n )}\n </div>\n </SectionContent>\n </>\n )}\n\n {/* Todo List */}\n <SectionHeader>TASKS</SectionHeader>\n <SectionContent>\n <div className=\"space-y-1.5\">\n {todos.map((todo, index) => {\n const displayText = todo.status === 'in_progress' ? todo.activeForm : todo.content;\n return (\n <div\n key={`${todo.content}-${index}`}\n className={cn(\n 'flex items-start gap-2 py-1 transition-all duration-200',\n todo.status === 'completed' && 'opacity-50',\n todo.status === 'in_progress' && 'bg-yellow-500/10 -mx-2 px-2 rounded'\n )}\n >\n {/* Status Icon */}\n {todo.status === 'completed' ? (\n <CheckCircleIcon className=\"w-4 h-4 text-emerald-400 shrink-0 mt-0.5\" />\n ) : todo.status === 'in_progress' ? (\n <LoaderIcon className=\"w-4 h-4 text-yellow-400 animate-spin shrink-0 mt-0.5\" />\n ) : (\n <CircleIcon className=\"w-4 h-4 text-white/30 shrink-0 mt-0.5\" />\n )}\n\n {/* Task Text */}\n <span\n className={cn(\n 'text-sm leading-relaxed',\n todo.status === 'completed' ? 'text-white/50 line-through' : 'text-white/80'\n )}\n >\n <span className=\"text-white/40 mr-1.5\">{index + 1}.</span>\n {displayText}\n </span>\n </div>\n );\n })}\n </div>\n </SectionContent>\n </>\n );\n}\n\nfunction ToolDetails({ actionType }: { actionType: ActionType }) {\n switch (actionType.action) {\n case 'command_run':\n return <CommandRunDetails action={actionType} />;\n case 'file_read':\n return <FileReadDetails action={actionType} />;\n case 'file_edit':\n return <FileEditDetails action={actionType} />;\n case 'file_write':\n return <FileWriteDetails action={actionType} />;\n case 'search':\n return <SearchDetails action={actionType} />;\n case 'glob':\n return <GlobDetails action={actionType} />;\n case 'web_fetch':\n return <WebFetchDetails action={actionType} />;\n case 'web_search':\n return <WebSearchDetails action={actionType} />;\n case 'mcp_tool':\n return <McpToolDetails action={actionType} />;\n case 'generic_tool':\n return <GenericToolDetails action={actionType} />;\n case 'todo_write':\n return <TodoWriteDetails action={actionType} />;\n default:\n return null;\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nfunction hasDetails(actionType: ActionType): boolean {\n switch (actionType.action) {\n case 'command_run':\n return Boolean(actionType.command || actionType.result?.output);\n case 'file_read':\n return true;\n case 'file_edit':\n return Boolean(actionType.oldString || actionType.newString);\n case 'file_write':\n return Boolean(actionType.content);\n case 'search':\n return true;\n case 'glob':\n return true;\n case 'web_fetch':\n return true;\n case 'web_search':\n return true;\n case 'mcp_tool':\n return Boolean(actionType.arguments || actionType.result);\n case 'generic_tool':\n return Boolean(actionType.arguments || actionType.result);\n case 'todo_write':\n return actionType.todos.length > 0;\n case 'agent_tool':\n return true; // Always expandable (handled by AgentToolCard)\n default:\n return false;\n }\n}\n\n// =============================================================================\n// ToolCallCard Component\n// =============================================================================\n\nexport interface ToolCallCardProps {\n toolCall: NormalizedToolCall;\n defaultExpanded?: boolean;\n className?: string;\n}\n\n/**\n * ToolCallCard - Display a tool call with its status, arguments, and results\n *\n * Features:\n * - Status indicator (pending/success/failed) with animated styling\n * - Action-specific icon in accent-colored badge\n * - Expandable details section with smooth animation\n * - Glassmorphism dark theme styling\n * - Execution duration display\n *\n * @example\n * ```tsx\n * <ToolCallCard toolCall={normalizedToolCall} />\n * <ToolCallCard toolCall={toolCall} defaultExpanded />\n * ```\n */\nexport function ToolCallCard({ toolCall, defaultExpanded = false, className }: ToolCallCardProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const { actionType, status, summary } = toolCall;\n\n // Delegate to AgentToolCard for agent_tool actions\n if (actionType.action === 'agent_tool') {\n return (\n <AgentToolCard\n toolCall={toolCall}\n defaultExpanded={defaultExpanded}\n className={className}\n />\n );\n }\n\n const canExpand = hasDetails(actionType);\n\n // Status-based styling for glassmorphism theme\n const statusClasses = {\n pending: 'border-yellow-500/30 ash-tool-status-pending',\n success: 'border-white/10',\n failed: 'border-red-500/30',\n };\n\n return (\n <div\n className={cn(\n 'rounded-xl border bg-[var(--ash-surface-dark,#0a0a0a)] overflow-hidden',\n statusClasses[status],\n className\n )}\n >\n {/* Header */}\n <button\n onClick={() => canExpand && setExpanded(!expanded)}\n className={cn(\n 'w-full px-4 py-3 flex items-center justify-between transition-colors',\n canExpand ? 'hover:bg-white/5 cursor-pointer' : 'cursor-default'\n )}\n disabled={!canExpand}\n >\n <div className=\"flex items-center gap-3 min-w-0 flex-1\">\n {/* Icon badge */}\n <div className={cn(\n 'w-6 h-6 rounded-lg flex items-center justify-center shrink-0',\n status === 'pending' ? 'bg-yellow-500/20' :\n status === 'failed' ? 'bg-red-500/20' : 'bg-[var(--ash-accent)]/20'\n )}>\n <ActionIcon\n actionType={actionType}\n className={cn(\n 'w-3.5 h-3.5',\n status === 'pending' ? 'text-yellow-400' :\n status === 'failed' ? 'text-red-400' : 'text-[var(--ash-accent)]'\n )}\n />\n </div>\n\n {/* Tool name and summary */}\n <span className=\"text-sm font-medium text-white shrink-0\">\n {getActionLabel(actionType)}\n </span>\n <span className=\"font-mono text-sm truncate text-white/60 min-w-0\">\n {summary}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n {/* Status indicator */}\n <StatusIndicator status={status} size=\"sm\" />\n\n {/* Chevron */}\n {canExpand && (\n <ChevronDownIcon\n className={cn(\n 'w-4 h-4 text-white/40 transition-transform duration-200',\n expanded && 'rotate-180'\n )}\n />\n )}\n </div>\n </button>\n\n {/* Expandable Details */}\n {expanded && canExpand && (\n <div className=\"border-t border-white/5 max-h-[400px] overflow-y-auto ash-scrollbar bg-black/20\">\n <ToolDetails actionType={actionType} />\n\n {/* Success result footer */}\n {status === 'success' && (\n <div className=\"px-4 py-3 border-t border-white/5 bg-[var(--ash-accent)]/5\">\n <div className=\"flex items-center gap-2\">\n <CheckIcon className=\"w-4 h-4 text-[var(--ash-accent)]\" />\n <span className=\"text-sm text-[var(--ash-accent)] font-medium\">\n Completed successfully\n </span>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default ToolCallCard;\n","import { lazy, Suspense, useState, useEffect, type ReactNode } from 'react';\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 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 */\nexport function LazyMarkdown({ children, fallback, className }: LazyMarkdownProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\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>{children}</ReactMarkdown>\n </Suspense>\n );\n}\n\nexport default LazyMarkdown;\n","import { Fragment } from 'react';\nimport type { RichContent, RichContentRenderers, RichMentionSegment } from '../types';\nimport { LazyMarkdown } from './LazyMarkdown';\nimport { cn } from '../utils';\n\nexport interface RichContentRendererProps {\n /** Rich content segments to render */\n content: RichContent;\n /** Custom renderers for segments */\n renderers?: RichContentRenderers;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Default mention badge component\n */\nfunction DefaultMentionBadge({ segment }: { segment: RichMentionSegment }) {\n const bgColor = segment.color ? `${segment.color}20` : 'rgba(34, 197, 94, 0.2)';\n const textColor = segment.color || '#22c55e';\n const borderColor = segment.color ? `${segment.color}40` : 'rgba(34, 197, 94, 0.4)';\n\n return (\n <span\n className=\"inline-flex items-center px-2 py-0.5 rounded-md text-xs font-medium mx-0.5\"\n style={{\n backgroundColor: bgColor,\n color: textColor,\n border: `1px solid ${borderColor}`,\n }}\n title={segment.id ? `ID: ${segment.id}` : undefined}\n >\n @{segment.name}\n </span>\n );\n}\n\n/**\n * RichContentRenderer - Renders structured rich content segments\n *\n * This is the preferred approach for rendering rich content within messages.\n * Each segment type can have custom rendering via the `renderers` prop.\n *\n * @example\n * ```tsx\n * <RichContentRenderer\n * content={[\n * { type: 'text', content: 'Looking at ' },\n * { type: 'mention', name: 'Scene1', color: '#ff0' },\n * { type: 'text', content: ' timeline.' },\n * ]}\n * renderers={{\n * renderMention: ({ segment }) => (\n * <MentionBadge\n * name={segment.name}\n * onClick={() => scrollTo(segment.id)}\n * />\n * ),\n * }}\n * />\n * ```\n */\nexport function RichContentRenderer({\n content,\n renderers,\n className,\n}: RichContentRendererProps) {\n return (\n <div className={cn('rich-content', className)}>\n {content.map((segment, index) => {\n const key = `segment-${index}`;\n\n switch (segment.type) {\n case 'text':\n // Render text as markdown\n return (\n <Fragment key={key}>\n <LazyMarkdown>{segment.content}</LazyMarkdown>\n </Fragment>\n );\n\n case 'mention':\n // Use custom renderer or default badge\n if (renderers?.renderMention) {\n return (\n <Fragment key={key}>\n {renderers.renderMention({ segment })}\n </Fragment>\n );\n }\n return <DefaultMentionBadge key={key} segment={segment} />;\n\n case 'component':\n // Custom components require a renderer\n if (renderers?.renderComponent) {\n return (\n <Fragment key={key}>\n {renderers.renderComponent({ segment })}\n </Fragment>\n );\n }\n // Fallback: render as JSON for debugging\n return (\n <code key={key} className=\"text-xs text-orange-400\">\n [component: {segment.componentType}]\n </code>\n );\n\n default:\n return null;\n }\n })}\n </div>\n );\n}\n\nexport default RichContentRenderer;\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 { LazyMarkdown } from './LazyMarkdown';\nimport { RichContentRenderer } from './RichContentRenderer';\nimport type { NormalizedEntry, RichContentRenderers } from '../types';\nimport { cn, formatTimestamp, parseOptionsFromContent, type ParsedOption } from '../utils';\nimport { ToolCallCard } from './ToolCallCard';\nimport { OptionCards } from './OptionCards';\nimport { BotIcon, UserIcon, PaperclipIcon, SparklesIcon, AlertTriangleIcon } from '../icons';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\nfunction parseFilesFromContent(content: string): { text: string; files: string[] } {\n const fileMarker = '[Uploaded files available at /uploads/]';\n const markerIndex = content.indexOf(fileMarker);\n\n if (markerIndex === -1) {\n return { text: content, files: [] };\n }\n\n const text = content.substring(0, markerIndex).trim();\n const fileSection = content.substring(markerIndex + fileMarker.length).trim();\n const files = fileSection\n .split('\\n')\n .filter((line) => line.startsWith('- '))\n .map((line) => line.substring(2).trim());\n\n return { text, files };\n}\n\n// =============================================================================\n// Entry Components\n// =============================================================================\n\nexport interface UserMessageProps {\n entry: NormalizedEntry;\n className?: string;\n}\n\n/**\n * UserMessage - Display a user message with optional file attachments\n *\n * Uses glassmorphism styling with animated entry.\n */\nexport function UserMessage({ entry, className }: UserMessageProps) {\n const { text, files } = parseFilesFromContent(entry.content);\n\n return (\n <div className={cn('flex gap-3 justify-end ash-animate-fade-in', className)}>\n <div className=\"max-w-[85%]\">\n <div className=\"rounded-2xl p-4 bg-[var(--ash-accent)] text-[var(--ash-accent-foreground)]\">\n <p className=\"text-sm leading-relaxed whitespace-pre-wrap\">{text || '(files attached)'}</p>\n </div>\n {files.length > 0 && (\n <div className=\"mt-2 pt-2 border-t border-[var(--ash-accent-foreground)]/20\">\n <div className=\"text-xs text-[var(--ash-accent-foreground)]/60 mb-1 flex items-center gap-1\">\n <PaperclipIcon className=\"w-3 h-3\" />\n Attached Files\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {files.map((file, index) => (\n <span\n key={index}\n className=\"inline-flex items-center px-2 py-0.5 rounded-lg bg-[var(--ash-accent-foreground)]/10 text-xs\"\n title={file}\n >\n {file.split(' (')[0]}\n </span>\n ))}\n </div>\n </div>\n )}\n {entry.timestamp && (\n <div className=\"text-xs text-white/40 mt-2\">\n {formatTimestamp(entry.timestamp)}\n </div>\n )}\n </div>\n <div className=\"w-7 h-7 rounded-full bg-white/10 flex items-center justify-center shrink-0\">\n <UserIcon className=\"w-4 h-4 text-white/50\" />\n </div>\n </div>\n );\n}\n\nexport interface AssistantMessageProps {\n entry: NormalizedEntry;\n /** Callback when user selects an option */\n onOptionSelect?: (optionText: string) => void;\n /** Custom renderers for rich content segments */\n richContentRenderers?: RichContentRenderers;\n className?: string;\n}\n\n/**\n * AssistantMessage - Display an assistant message with markdown rendering\n *\n * Uses glassmorphism styling with bot avatar and animated entry.\n * Automatically detects and renders interactive options when present.\n * Supports rich content segments for inline rendering of mentions and custom components.\n */\nexport function AssistantMessage({\n entry,\n onOptionSelect,\n richContentRenderers,\n className,\n}: AssistantMessageProps) {\n // Try to parse options from the content (only for plain text)\n const parsedOptions = !entry.richContent ? parseOptionsFromContent(entry.content) : null;\n\n const handleOptionSelect = (option: ParsedOption) => {\n if (onOptionSelect) {\n // Send \"Option N: Label\" format so the agent understands the selection\n onOptionSelect(`Option ${option.id}: ${option.label}`);\n }\n };\n\n // Helper to render content based on available data\n const renderContent = (textContent?: string) => {\n // Use rich content if available (structured segments)\n if (entry.richContent && entry.richContent.length > 0) {\n return (\n <RichContentRenderer\n content={entry.richContent}\n renderers={richContentRenderers}\n />\n );\n }\n\n // Fall back to plain markdown\n return <LazyMarkdown>{textContent || entry.content}</LazyMarkdown>;\n };\n\n return (\n <div className={cn('flex gap-3 ash-animate-fade-in', className)}>\n <div className=\"w-7 h-7 rounded-full bg-[var(--ash-accent)]/20 flex items-center justify-center shrink-0\">\n <BotIcon className=\"w-4 h-4 text-[var(--ash-accent)]\" />\n </div>\n <div className=\"flex-1 max-w-[85%]\">\n <div className=\"ash-card-glass rounded-2xl p-4\">\n <div className=\"ash-message-content prose prose-sm prose-invert max-w-none text-sm leading-relaxed\">\n {parsedOptions ? (\n <>\n {/* Render preamble text */}\n {parsedOptions.preamble && renderContent(parsedOptions.preamble)}\n {/* Render interactive options */}\n <OptionCards\n options={parsedOptions.options}\n onSelect={handleOptionSelect}\n />\n </>\n ) : (\n renderContent()\n )}\n </div>\n </div>\n {entry.timestamp && (\n <div className=\"text-xs text-white/40 mt-2\">\n {formatTimestamp(entry.timestamp)}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport interface ThinkingMessageProps {\n entry: NormalizedEntry;\n className?: string;\n}\n\n/**\n * ThinkingMessage - Display thinking/reasoning content (extended thinking)\n *\n * Uses glassmorphism styling with purple accent for thinking mode.\n */\nexport function ThinkingMessage({ entry, className }: ThinkingMessageProps) {\n return (\n <div className={cn('flex gap-3 ash-animate-fade-in', className)}>\n <div className=\"w-7 h-7 rounded-full bg-purple-500/20 flex items-center justify-center shrink-0\">\n <SparklesIcon className=\"w-4 h-4 text-purple-400\" />\n </div>\n <div className=\"flex-1 max-w-[85%]\">\n <div className=\"rounded-2xl p-4 bg-purple-500/10 border border-purple-500/30\">\n <div className=\"text-xs text-purple-400 mb-2 font-medium\">Thinking</div>\n <div className=\"text-sm text-purple-300 italic opacity-80 whitespace-pre-wrap leading-relaxed\">\n {entry.content}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport interface ToolCallMessageProps {\n entry: NormalizedEntry;\n defaultExpanded?: boolean;\n className?: string;\n}\n\n/**\n * ToolCallMessage - Display a tool call entry using ToolCallCard\n *\n * Uses glassmorphism styling with animated entry.\n */\nexport function ToolCallMessage({ entry, defaultExpanded = false, className }: ToolCallMessageProps) {\n if (entry.entryType.type !== 'tool_call') return null;\n\n return (\n <div className={cn('flex gap-3 ash-animate-fade-in', className)}>\n <div className=\"w-7 h-7 rounded-full bg-[var(--ash-accent)]/20 flex items-center justify-center shrink-0\">\n <BotIcon className=\"w-4 h-4 text-[var(--ash-accent)]\" />\n </div>\n <div className=\"flex-1\">\n <ToolCallCard toolCall={entry.entryType.toolCall} defaultExpanded={defaultExpanded} />\n </div>\n </div>\n );\n}\n\nexport interface ErrorMessageProps {\n entry: NormalizedEntry;\n className?: string;\n}\n\n/**\n * ErrorMessage - Display an error entry\n *\n * Uses glassmorphism styling with red accent for errors.\n */\nexport function ErrorMessage({ entry, className }: ErrorMessageProps) {\n if (entry.entryType.type !== 'error') return null;\n\n return (\n <div className={cn('flex gap-3 ash-animate-fade-in', className)}>\n <div className=\"w-7 h-7 rounded-full bg-red-500/20 flex items-center justify-center shrink-0\">\n <AlertTriangleIcon className=\"w-4 h-4 text-red-400\" />\n </div>\n <div className=\"flex-1 max-w-[85%]\">\n <div className=\"rounded-2xl p-4 bg-red-500/10 border border-red-500/30\">\n <div className=\"text-xs text-red-400 mb-2 font-medium\">Error</div>\n <p className=\"text-sm text-red-300\">{entry.entryType.message}</p>\n {entry.entryType.code && (\n <p className=\"text-xs text-red-400/70 mt-2 font-mono\">Code: {entry.entryType.code}</p>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Entry Renderer\n// =============================================================================\n\nexport interface MessageEntryProps {\n entry: NormalizedEntry;\n /** Callback when user selects an option from assistant message */\n onOptionSelect?: (optionText: string) => void;\n /** Whether tool calls should be expanded by default */\n defaultExpanded?: boolean;\n /** Custom renderers for rich content segments */\n richContentRenderers?: RichContentRenderers;\n className?: string;\n}\n\n/**\n * MessageEntry - Render a normalized entry based on its type\n *\n * This is a convenience component that routes to the appropriate\n * entry type component.\n *\n * @example\n * ```tsx\n * {entries.map(entry => (\n * <MessageEntry key={entry.id} entry={entry} onOptionSelect={handleSelect} />\n * ))}\n * ```\n */\nexport function MessageEntry({\n entry,\n onOptionSelect,\n defaultExpanded,\n richContentRenderers,\n className,\n}: MessageEntryProps) {\n switch (entry.entryType.type) {\n case 'user_message':\n return <UserMessage entry={entry} className={className} />;\n case 'assistant_message':\n return (\n <AssistantMessage\n entry={entry}\n onOptionSelect={onOptionSelect}\n richContentRenderers={richContentRenderers}\n className={className}\n />\n );\n case 'thinking':\n return <ThinkingMessage entry={entry} className={className} />;\n case 'tool_call':\n return <ToolCallMessage entry={entry} defaultExpanded={defaultExpanded} className={className} />;\n case 'error':\n return <ErrorMessage entry={entry} className={className} />;\n default:\n return null;\n }\n}\n\nexport default MessageEntry;\n","import { cn } from '../utils';\n\nexport interface LoadingIndicatorProps {\n variant?: 'dots' | 'pulse' | 'spinner' | 'cursor';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\n/**\n * LoadingIndicator - Display various loading states\n *\n * Uses the glassmorphism theme with accent-colored animations.\n *\n * Variants:\n * - dots: Three animated dots\n * - pulse: Single pulsing dot\n * - spinner: Rotating spinner\n * - cursor: Blinking cursor (like in the demo)\n *\n * @example\n * ```tsx\n * <LoadingIndicator />\n * <LoadingIndicator variant=\"spinner\" size=\"lg\" />\n * <LoadingIndicator variant=\"cursor\" />\n * ```\n */\nexport function LoadingIndicator({ variant = 'dots', size = 'md', className }: LoadingIndicatorProps) {\n if (variant === 'dots') {\n const dotSizes = {\n sm: 'w-1 h-1',\n md: 'w-1.5 h-1.5',\n lg: 'w-2 h-2',\n };\n return (\n <div className={cn('flex items-center gap-1', className)}>\n <span className={cn('rounded-full bg-[var(--ash-accent)] animate-pulse', dotSizes[size])} />\n <span className={cn('rounded-full bg-[var(--ash-accent)] animate-pulse', dotSizes[size])} style={{ animationDelay: '150ms' }} />\n <span className={cn('rounded-full bg-[var(--ash-accent)] animate-pulse', dotSizes[size])} style={{ animationDelay: '300ms' }} />\n </div>\n );\n }\n\n if (variant === 'pulse') {\n const dotSizes = {\n sm: 'w-1.5 h-1.5',\n md: 'w-2 h-2',\n lg: 'w-3 h-3',\n };\n return (\n <div className={cn('flex items-center gap-1', className)}>\n <span className={cn('bg-[var(--ash-accent)] rounded-full animate-pulse', dotSizes[size])} />\n </div>\n );\n }\n\n if (variant === 'cursor') {\n const cursorSizes = {\n sm: 'w-1 h-3',\n md: 'w-1.5 h-4',\n lg: 'w-2 h-5',\n };\n return (\n <span\n className={cn(\n 'inline-block bg-[var(--ash-accent)]/50 ash-tool-status-pending',\n cursorSizes[size],\n className\n )}\n />\n );\n }\n\n // Spinner variant\n const spinnerSizes = {\n sm: 'w-4 h-4',\n md: 'w-6 h-6',\n lg: 'w-8 h-8',\n };\n\n return (\n <div className={cn('animate-spin text-[var(--ash-accent)]', spinnerSizes[size], className)}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" className=\"opacity-25\" />\n <path d=\"M12 2a10 10 0 0 1 10 10\" strokeLinecap=\"round\" />\n </svg>\n </div>\n );\n}\n\nexport default LoadingIndicator;\n","import { LazyMarkdown } from './LazyMarkdown';\nimport { cn } from '../utils';\nimport { LoadingIndicator } from './LoadingIndicator';\n\nexport interface StreamingTextProps {\n content: string;\n isStreaming?: boolean;\n renderMarkdown?: boolean;\n className?: string;\n}\n\n/**\n * StreamingText - Display text that may be streaming, with optional markdown\n *\n * Shows a blinking cursor indicator when streaming is active.\n * Uses glassmorphism theme styling.\n *\n * @example\n * ```tsx\n * <StreamingText content={text} isStreaming />\n * <StreamingText content={markdown} renderMarkdown />\n * ```\n */\nexport function StreamingText({\n content,\n isStreaming = false,\n renderMarkdown = true,\n className,\n}: StreamingTextProps) {\n return (\n <div className={cn('relative', className)}>\n {renderMarkdown ? (\n <div className=\"ash-message-content prose prose-sm prose-invert max-w-none text-sm leading-relaxed\">\n <LazyMarkdown>{content}</LazyMarkdown>\n {isStreaming && (\n <LoadingIndicator variant=\"cursor\" size=\"sm\" className=\"inline-block ml-0.5\" />\n )}\n </div>\n ) : (\n <p className=\"whitespace-pre-wrap text-sm leading-relaxed\">\n {content}\n {isStreaming && (\n <LoadingIndicator variant=\"cursor\" size=\"sm\" className=\"inline-block ml-0.5\" />\n )}\n </p>\n )}\n </div>\n );\n}\n\nexport default StreamingText;\n","import type { NormalizedToolCall, ActionType, FileEditAction, FileReadAction, FileWriteAction } from '../types';\nimport { cn, getActionLabel } from '../utils';\nimport { ActionIcon } from './ActionIcon';\n\n/**\n * Get file path from an action type if it's a file operation\n */\nfunction getFilePath(actionType: ActionType): string | null {\n switch (actionType.action) {\n case 'file_read':\n case 'file_edit':\n case 'file_write':\n return actionType.path;\n default:\n return null;\n }\n}\n\n/**\n * Extract just the filename from a path\n */\nfunction getFileName(path: string): string {\n const parts = path.split('/');\n return parts[parts.length - 1] || path;\n}\n\n/**\n * Get file extension for icon coloring\n */\nfunction getFileExtension(path: string): string | null {\n const fileName = getFileName(path);\n const dotIndex = fileName.lastIndexOf('.');\n if (dotIndex === -1) return null;\n return fileName.slice(dotIndex + 1).toLowerCase();\n}\n\n/**\n * Get diff stats from an action type\n */\nfunction getDiffStats(actionType: ActionType): { added?: number; removed?: number; read?: number; written?: number } | null {\n switch (actionType.action) {\n case 'file_edit': {\n const edit = actionType as FileEditAction;\n if (edit.linesAdded !== undefined || edit.linesRemoved !== undefined) {\n return { added: edit.linesAdded, removed: edit.linesRemoved };\n }\n return null;\n }\n case 'file_read': {\n const read = actionType as FileReadAction;\n if (read.linesRead !== undefined) {\n return { read: read.linesRead };\n }\n return null;\n }\n case 'file_write': {\n const write = actionType as FileWriteAction;\n if (write.linesWritten !== undefined) {\n return { written: write.linesWritten };\n }\n return null;\n }\n default:\n return null;\n }\n}\n\n/**\n * Get color class for file type badge\n */\nfunction getFileTypeColor(ext: string | null): string {\n switch (ext) {\n case 'ts':\n case 'tsx':\n return 'text-blue-400';\n case 'js':\n case 'jsx':\n return 'text-yellow-400';\n case 'md':\n return 'text-white/60';\n case 'json':\n return 'text-orange-400';\n case 'sh':\n return 'text-green-400';\n case 'css':\n case 'scss':\n return 'text-pink-400';\n case 'py':\n return 'text-blue-300';\n default:\n return 'text-white/70';\n }\n}\n\nexport interface CompactToolRowProps {\n toolCall: NormalizedToolCall;\n /** Whether to show the full path or just filename */\n showFullPath?: boolean;\n className?: string;\n}\n\n/**\n * CompactToolRow - A single-line compact display of a tool call\n *\n * Shows: Icon | Label | File Badge | Diff Stats | Description\n *\n * @example\n * ```tsx\n * <CompactToolRow toolCall={normalizedToolCall} />\n * ```\n */\nexport function CompactToolRow({ toolCall, showFullPath = false, className }: CompactToolRowProps) {\n const { actionType, status, summary } = toolCall;\n const label = getActionLabel(actionType);\n const filePath = getFilePath(actionType);\n const diffStats = getDiffStats(actionType);\n\n const displayPath = filePath\n ? showFullPath\n ? filePath\n : getFileName(filePath)\n : null;\n\n const ext = filePath ? getFileExtension(filePath) : null;\n const fileColor = getFileTypeColor(ext);\n\n // For non-file operations, show the summary\n const showSummary = !filePath && summary;\n\n return (\n <div\n className={cn(\n 'flex items-center gap-2 py-1.5 text-sm min-w-0',\n className\n )}\n >\n {/* Icon + Label */}\n <div className=\"flex items-center gap-1.5 shrink-0\">\n <ActionIcon\n actionType={actionType}\n className={cn(\n 'w-3.5 h-3.5',\n status === 'pending' ? 'text-yellow-400' :\n status === 'failed' ? 'text-red-400' : 'text-white/50'\n )}\n />\n <span className={cn(\n 'font-medium',\n status === 'pending' ? 'text-white/90' :\n status === 'failed' ? 'text-red-400' : 'text-white/60'\n )}>\n {label}\n </span>\n </div>\n\n {/* File Badge */}\n {displayPath && (\n <code className={cn(\n 'px-1.5 py-0.5 rounded bg-white/5 font-mono text-xs truncate max-w-[200px]',\n fileColor\n )}>\n {displayPath}\n </code>\n )}\n\n {/* Diff Stats */}\n {diffStats && (\n <span className=\"flex items-center gap-1 text-xs shrink-0 font-mono\">\n {diffStats.added !== undefined && diffStats.added > 0 && (\n <span className=\"text-emerald-400\">+{diffStats.added}</span>\n )}\n {diffStats.removed !== undefined && diffStats.removed > 0 && (\n <span className=\"text-red-400\">-{diffStats.removed}</span>\n )}\n {diffStats.read !== undefined && (\n <span className=\"text-white/40\">{diffStats.read} lines</span>\n )}\n {diffStats.written !== undefined && (\n <span className=\"text-emerald-400\">+{diffStats.written}</span>\n )}\n </span>\n )}\n\n {/* Summary (for non-file operations) */}\n {showSummary && (\n <span className=\"text-white/40 truncate min-w-0 text-xs\">\n {summary}\n </span>\n )}\n </div>\n );\n}\n\nexport default CompactToolRow;\n","import { cn } from '../utils';\n\n/**\n * Get file extension for icon/styling\n */\nfunction getFileExtension(path: string): string | null {\n const fileName = path.split('/').pop() || path;\n const dotIndex = fileName.lastIndexOf('.');\n if (dotIndex === -1) return null;\n return fileName.slice(dotIndex + 1).toLowerCase();\n}\n\n/**\n * Get icon character based on file type\n */\nfunction getFileIcon(ext: string | null): string {\n switch (ext) {\n case 'ts':\n case 'tsx':\n return 'TS';\n case 'js':\n case 'jsx':\n return 'JS';\n case 'md':\n return 'MD';\n case 'json':\n return '{}';\n case 'sh':\n return '$';\n case 'css':\n case 'scss':\n return '#';\n case 'py':\n return 'PY';\n default:\n return '';\n }\n}\n\n/**\n * Get background color class for file type\n */\nfunction getFileBgColor(ext: string | null): string {\n switch (ext) {\n case 'ts':\n case 'tsx':\n return 'bg-blue-500/20';\n case 'js':\n case 'jsx':\n return 'bg-yellow-500/20';\n case 'md':\n return 'bg-white/10';\n case 'json':\n return 'bg-orange-500/20';\n case 'sh':\n return 'bg-green-500/20';\n case 'css':\n case 'scss':\n return 'bg-pink-500/20';\n case 'py':\n return 'bg-blue-400/20';\n default:\n return 'bg-white/10';\n }\n}\n\nexport interface FileBadgeProps {\n /** Full file path or filename */\n path: string;\n /** Number of lines added */\n linesAdded?: number;\n /** Number of lines removed */\n linesRemoved?: number;\n /** Show only filename instead of full path */\n showOnlyFilename?: boolean;\n className?: string;\n}\n\n/**\n * FileBadge - A compact pill showing filename with diff stats\n *\n * Used in the collapsed accordion view to show modified files.\n *\n * @example\n * ```tsx\n * <FileBadge path=\"src/utils.ts\" linesAdded={5} linesRemoved={2} />\n * <FileBadge path=\"SKILL.md\" linesAdded={0} linesRemoved={22} />\n * ```\n */\nexport function FileBadge({\n path,\n linesAdded,\n linesRemoved,\n showOnlyFilename = true,\n className,\n}: FileBadgeProps) {\n const fileName = showOnlyFilename ? (path.split('/').pop() || path) : path;\n const ext = getFileExtension(path);\n const icon = getFileIcon(ext);\n const bgColor = getFileBgColor(ext);\n\n const hasDiff = (linesAdded !== undefined && linesAdded > 0) ||\n (linesRemoved !== undefined && linesRemoved > 0);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-0.5 rounded-md text-xs font-mono',\n bgColor,\n className\n )}\n >\n {/* File type icon */}\n {icon && (\n <span className=\"text-[10px] opacity-60 font-semibold\">{icon}</span>\n )}\n\n {/* Filename */}\n <span className=\"text-white/80 truncate max-w-[120px]\">{fileName}</span>\n\n {/* Diff stats */}\n {hasDiff && (\n <span className=\"flex items-center gap-0.5\">\n {linesAdded !== undefined && linesAdded > 0 && (\n <span className=\"text-emerald-400\">+{linesAdded}</span>\n )}\n {linesRemoved !== undefined && linesRemoved > 0 && (\n <span className=\"text-red-400\">-{linesRemoved}</span>\n )}\n </span>\n )}\n </span>\n );\n}\n\nexport default FileBadge;\n","import { useState, useMemo } from 'react';\nimport type {\n NormalizedToolCall,\n FileEditAction,\n} from '../types';\nimport { cn } from '../utils';\nimport { ChevronRightIcon, FileIcon, EditIcon, TerminalIcon, SearchIcon } from '../icons';\nimport { CompactToolRow } from './CompactToolRow';\nimport { FileBadge } from './FileBadge';\nimport { ToolCallCard } from './ToolCallCard';\n\nexport interface ToolExecutionGroupProps {\n /** Tool calls in this group */\n toolCalls: NormalizedToolCall[];\n\n /** Whether the group starts expanded */\n defaultExpanded?: boolean;\n\n /** Animation duration for status line transitions (ms) */\n animationDuration?: number;\n\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Extract file changes from tool calls for display in collapsed view\n */\ninterface FileChange {\n path: string;\n linesAdded?: number;\n linesRemoved?: number;\n}\n\nfunction extractFileChanges(toolCalls: NormalizedToolCall[]): FileChange[] {\n const fileMap = new Map<string, FileChange>();\n\n for (const tc of toolCalls) {\n const { actionType } = tc;\n if (actionType.action === 'file_edit') {\n const edit = actionType as FileEditAction;\n const existing = fileMap.get(edit.path);\n if (existing) {\n // Aggregate changes\n existing.linesAdded = (existing.linesAdded || 0) + (edit.linesAdded || 0);\n existing.linesRemoved = (existing.linesRemoved || 0) + (edit.linesRemoved || 0);\n } else {\n fileMap.set(edit.path, {\n path: edit.path,\n linesAdded: edit.linesAdded,\n linesRemoved: edit.linesRemoved,\n });\n }\n } else if (actionType.action === 'file_write') {\n const write = actionType;\n if (!fileMap.has(write.path)) {\n fileMap.set(write.path, {\n path: write.path,\n linesAdded: write.linesWritten,\n });\n }\n }\n }\n\n return Array.from(fileMap.values());\n}\n\n/**\n * Count unique action types for icon display\n */\nfunction countActionTypes(toolCalls: NormalizedToolCall[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const tc of toolCalls) {\n const action = tc.actionType.action;\n counts[action] = (counts[action] || 0) + 1;\n }\n return counts;\n}\n\n/**\n * Get icon component for action type\n */\nfunction getActionIconComponent(action: string) {\n switch (action) {\n case 'file_read':\n return FileIcon;\n case 'file_edit':\n case 'file_write':\n return EditIcon;\n case 'command_run':\n return TerminalIcon;\n case 'search':\n case 'glob':\n return SearchIcon;\n default:\n return null;\n }\n}\n\n/**\n * ToolExecutionGroup - Displays multiple tool calls in a compact accordion format.\n *\n * In collapsed state, shows a summary with tool count, action type icons,\n * and file change badges. When expanded, shows compact tool rows that can\n * be further expanded into full detail cards.\n *\n * @example\n * ```tsx\n * <ToolExecutionGroup\n * toolCalls={consecutiveToolCalls}\n * defaultExpanded={false}\n * />\n * ```\n */\nexport function ToolExecutionGroup({\n toolCalls,\n defaultExpanded = false,\n className,\n}: ToolExecutionGroupProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const [expandedCardId, setExpandedCardId] = useState<string | null>(null);\n\n // Extract file changes for badges\n const fileChanges = useMemo(() => extractFileChanges(toolCalls), [toolCalls]);\n\n // Count action types for icons\n const actionCounts = useMemo(() => countActionTypes(toolCalls), [toolCalls]);\n\n // Get unique action types for icon display (max 3)\n const displayActions = useMemo(() => {\n return Object.entries(actionCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([action]) => action);\n }, [actionCounts]);\n\n const totalCount = toolCalls.length;\n\n if (toolCalls.length === 0) {\n return null;\n }\n\n return (\n <div className={cn('ash-animate-fade-in', className)}>\n {/* Collapsed Header */}\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full flex items-center gap-2 py-1 text-left group\"\n >\n {/* Chevron */}\n <ChevronRightIcon\n className={cn(\n 'w-3.5 h-3.5 text-white/40 transition-transform duration-200 shrink-0',\n expanded && 'rotate-90'\n )}\n />\n\n {/* Summary text */}\n <span className=\"text-sm text-white/60\">\n {totalCount} tool call{totalCount !== 1 ? 's' : ''}\n </span>\n\n {/* Action type icons */}\n <div className=\"flex items-center gap-1\">\n {displayActions.map((action) => {\n const IconComponent = getActionIconComponent(action);\n if (!IconComponent) return null;\n return (\n <IconComponent\n key={action}\n className=\"w-3.5 h-3.5 text-white/30\"\n />\n );\n })}\n </div>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* File change badges (collapsed view only) */}\n {!expanded && fileChanges.length > 0 && (\n <div className=\"flex items-center gap-1.5 flex-wrap justify-end\">\n {fileChanges.slice(0, 4).map((fc) => (\n <FileBadge\n key={fc.path}\n path={fc.path}\n linesAdded={fc.linesAdded}\n linesRemoved={fc.linesRemoved}\n />\n ))}\n {fileChanges.length > 4 && (\n <span className=\"text-xs text-white/40\">\n +{fileChanges.length - 4} more\n </span>\n )}\n </div>\n )}\n </button>\n\n {/* Expanded Content */}\n {expanded && (\n <div className=\"pl-5 border-l border-white/10 ml-1.5 mt-1 space-y-0.5\">\n {toolCalls.map((toolCall) => (\n <div key={toolCall.id}>\n {expandedCardId === toolCall.id ? (\n <div className=\"py-1\">\n <ToolCallCard\n toolCall={toolCall}\n defaultExpanded={true}\n />\n <button\n onClick={() => setExpandedCardId(null)}\n className=\"text-xs text-white/40 hover:text-white/60 mt-1 pl-1\"\n >\n Collapse\n </button>\n </div>\n ) : (\n <button\n onClick={() => setExpandedCardId(toolCall.id)}\n className=\"w-full text-left hover:bg-white/5 rounded px-1 -mx-1 transition-colors\"\n >\n <CompactToolRow toolCall={toolCall} />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default ToolExecutionGroup;\n","'use client';\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { NormalizedToolCall, FileEditAction } from '../types';\nimport { cn } from '../utils';\nimport { ChevronRightIcon, FileIcon, EditIcon, TerminalIcon, SearchIcon } from '../icons';\nimport { CompactToolRow } from './CompactToolRow';\nimport { FileBadge } from './FileBadge';\n\nexport type StepStatus = 'pending' | 'running' | 'success' | 'error';\n\nexport interface StepAccordionProps {\n /** Tool calls to display as steps */\n toolCalls: NormalizedToolCall[];\n /** Whether the accordion starts expanded */\n defaultExpanded?: boolean;\n /** Controlled expanded state */\n isExpanded?: boolean;\n /** Callback when expanded state changes */\n onToggle?: () => void;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Extract file changes from tool calls for display in collapsed view\n */\ninterface FileChange {\n path: string;\n linesAdded?: number;\n linesRemoved?: number;\n}\n\nfunction extractFileChanges(toolCalls: NormalizedToolCall[]): FileChange[] {\n const fileMap = new Map<string, FileChange>();\n\n for (const tc of toolCalls) {\n const { actionType } = tc;\n if (actionType.action === 'file_edit') {\n const edit = actionType as FileEditAction;\n const existing = fileMap.get(edit.path);\n if (existing) {\n existing.linesAdded = (existing.linesAdded || 0) + (edit.linesAdded || 0);\n existing.linesRemoved = (existing.linesRemoved || 0) + (edit.linesRemoved || 0);\n } else {\n fileMap.set(edit.path, {\n path: edit.path,\n linesAdded: edit.linesAdded,\n linesRemoved: edit.linesRemoved,\n });\n }\n } else if (actionType.action === 'file_write') {\n if (!fileMap.has(actionType.path)) {\n fileMap.set(actionType.path, {\n path: actionType.path,\n linesAdded: actionType.linesWritten,\n });\n }\n }\n }\n\n return Array.from(fileMap.values());\n}\n\n/**\n * Count unique action types for icon display\n */\nfunction countActionTypes(toolCalls: NormalizedToolCall[]): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const tc of toolCalls) {\n const action = tc.actionType.action;\n counts[action] = (counts[action] || 0) + 1;\n }\n return counts;\n}\n\n/**\n * Get icon component for action type\n */\nfunction getActionIconComponent(action: string) {\n switch (action) {\n case 'file_read':\n return FileIcon;\n case 'file_edit':\n case 'file_write':\n return EditIcon;\n case 'command_run':\n return TerminalIcon;\n case 'search':\n case 'glob':\n return SearchIcon;\n default:\n return null;\n }\n}\n\n/**\n * StepAccordion - Compact accordion that shows tool calls with file badges\n *\n * Features:\n * - Collapsed header shows tool count, action icons, and file change badges\n * - Expanded view shows CompactToolRow for each tool call\n * - Clean, minimal design matching the compact UI style\n *\n * @example\n * ```tsx\n * <StepAccordion\n * toolCalls={normalizedToolCalls}\n * defaultExpanded={false}\n * />\n * ```\n */\nexport function StepAccordion({\n toolCalls,\n defaultExpanded = false,\n isExpanded: controlledExpanded,\n onToggle,\n className,\n}: StepAccordionProps) {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\n // Use controlled or uncontrolled state\n const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n\n const handleToggle = useCallback(() => {\n if (onToggle) {\n onToggle();\n } else {\n setInternalExpanded((prev) => !prev);\n }\n }, [onToggle]);\n\n // Extract file changes for badges\n const fileChanges = useMemo(() => extractFileChanges(toolCalls), [toolCalls]);\n\n // Count action types for icons\n const actionCounts = useMemo(() => countActionTypes(toolCalls), [toolCalls]);\n\n // Get unique action types for icon display (max 3)\n const displayActions = useMemo(() => {\n return Object.entries(actionCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([action]) => action);\n }, [actionCounts]);\n\n if (toolCalls.length === 0) {\n return null;\n }\n\n const totalCount = toolCalls.length;\n\n return (\n <div className={cn('ash-animate-fade-in', className)}>\n {/* Collapsed Header */}\n <button\n type=\"button\"\n onClick={handleToggle}\n className=\"w-full flex items-center gap-2 py-1 text-left group\"\n >\n {/* Chevron */}\n <ChevronRightIcon\n className={cn(\n 'w-3.5 h-3.5 text-white/40 transition-transform duration-200 shrink-0',\n isExpanded && 'rotate-90'\n )}\n />\n\n {/* Summary text */}\n <span className=\"text-sm text-white/60\">\n {totalCount} tool call{totalCount !== 1 ? 's' : ''}\n </span>\n\n {/* Action type icons */}\n <div className=\"flex items-center gap-1\">\n {displayActions.map((action) => {\n const IconComponent = getActionIconComponent(action);\n if (!IconComponent) return null;\n return (\n <IconComponent\n key={action}\n className=\"w-3.5 h-3.5 text-white/30\"\n />\n );\n })}\n </div>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* File change badges (collapsed view only) */}\n {!isExpanded && fileChanges.length > 0 && (\n <div className=\"flex items-center gap-1.5 flex-wrap justify-end\">\n {fileChanges.slice(0, 4).map((fc) => (\n <FileBadge\n key={fc.path}\n path={fc.path}\n linesAdded={fc.linesAdded}\n linesRemoved={fc.linesRemoved}\n />\n ))}\n {fileChanges.length > 4 && (\n <span className=\"text-xs text-white/40\">\n +{fileChanges.length - 4} more\n </span>\n )}\n </div>\n )}\n </button>\n\n {/* Expanded Content */}\n {isExpanded && (\n <div className=\"pl-5 border-l border-white/10 ml-1.5 mt-1 space-y-0.5\">\n {toolCalls.map((toolCall) => (\n <CompactToolRow key={toolCall.id} toolCall={toolCall} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default StepAccordion;\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 * Rich content segments (structured approach - preferred over regex transformers).\n * When provided, this takes precedence over `content` for rendering.\n *\n * @example\n * ```ts\n * richContent: [\n * { type: 'text', content: 'Analyzing ' },\n * { type: 'mention', name: 'Scene1', color: '#ff0' },\n * { type: 'text', content: ' for transitions.' },\n * ]\n * ```\n */\n richContent?: RichContent;\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// Display Mode Configuration\n// =============================================================================\n\n/**\n * Display mode for tool calls in the chat interface\n *\n * - 'inline': Each tool call rendered inline as expandable cards (current behavior)\n * - 'compact': Single animated status line that updates with each tool call,\n * with accordion to expand and see execution details. Text streams unbroken.\n * - 'accordion': Simpler step-based accordion list that accumulates tool calls\n * with icons, labels, and durations (like Vidra's ThinkingIndicator).\n */\nexport type ToolDisplayMode = 'inline' | 'compact' | 'accordion';\n\n/**\n * Configuration for tool display behavior\n */\nexport interface ToolDisplayConfig {\n /**\n * Display mode for tool calls\n * @default 'inline'\n */\n mode: ToolDisplayMode;\n\n /**\n * For 'compact' mode: break into a new group every N tool calls\n * Set to 0 or undefined to never break (all tool calls in single group)\n * @default 0\n */\n breakEveryNToolCalls?: number;\n\n /**\n * Whether tool call groups start expanded\n * @default false\n */\n defaultExpanded?: boolean;\n\n /**\n * Animation duration for status line transitions (ms)\n * @default 300\n */\n animationDuration?: number;\n}\n\n/**\n * Default display configuration\n */\nexport const DEFAULT_DISPLAY_CONFIG: ToolDisplayConfig = {\n mode: 'inline',\n breakEveryNToolCalls: 0,\n defaultExpanded: false,\n animationDuration: 300,\n};\n\n// =============================================================================\n// Rich Content (Structured Approach - Preferred)\n// =============================================================================\n\n/**\n * A text segment within rich content\n */\nexport interface RichTextSegment {\n type: 'text';\n /** Plain text or markdown content */\n content: string;\n}\n\n/**\n * A mention/reference segment within rich content\n */\nexport interface RichMentionSegment {\n type: 'mention';\n /** The mentioned entity name */\n name: string;\n /** Optional identifier for the entity */\n id?: string;\n /** Optional color for styling */\n color?: string;\n /** Optional additional data */\n data?: Record<string, unknown>;\n}\n\n/**\n * A custom component segment within rich content\n */\nexport interface RichComponentSegment {\n type: 'component';\n /** Component type identifier (consumer handles rendering) */\n componentType: string;\n /** Props to pass to the component */\n props: Record<string, unknown>;\n}\n\n/**\n * Union of all rich content segment types\n */\nexport type RichContentSegment =\n | RichTextSegment\n | RichMentionSegment\n | RichComponentSegment;\n\n/**\n * Rich content array - the preferred way to send structured content\n *\n * @example\n * ```ts\n * const content: RichContent = [\n * { type: 'text', content: 'Looking at ' },\n * { type: 'mention', name: 'Scene1', color: '#ff0', id: 'seq-1' },\n * { type: 'text', content: ' timeline for the transition.' },\n * ];\n * ```\n */\nexport type RichContent = RichContentSegment[];\n\n/**\n * Props for rendering a mention segment\n */\nexport interface MentionRenderProps {\n segment: RichMentionSegment;\n}\n\n/**\n * Props for rendering a custom component segment\n */\nexport interface ComponentRenderProps {\n segment: RichComponentSegment;\n}\n\n/**\n * Custom render functions for rich content segments\n */\nexport interface RichContentRenderers {\n /**\n * Render a mention segment. If not provided, renders as styled badge.\n */\n renderMention?: (props: MentionRenderProps) => ReactNode;\n /**\n * Render a custom component segment.\n */\n renderComponent?: (props: ComponentRenderProps) => ReactNode;\n}\n\n// =============================================================================\n// Tool Execution Group (for compact mode)\n// =============================================================================\n\n/**\n * A group of consecutive tool calls that are displayed together\n * in compact mode. Text content before/after flows around the group.\n */\nexport interface ToolExecutionGroup {\n /** Unique ID for the group */\n id: string;\n\n /** Tool calls in this group (in order) */\n toolCalls: NormalizedToolCall[];\n\n /** Index of the currently active/latest tool call for status display */\n activeIndex: number;\n\n /** Whether all tool calls in this group have completed */\n isComplete: boolean;\n\n /** Overall status of the group */\n status: 'pending' | 'success' | 'partial_failure' | 'failed';\n}\n","import { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react';\nimport { DEFAULT_DISPLAY_CONFIG, type ToolDisplayConfig, type ToolDisplayMode } from '../types';\n\n/**\n * Context type for display mode configuration\n */\nexport interface DisplayModeContextType {\n /** Current display configuration */\n config: ToolDisplayConfig;\n\n /** Update the display mode */\n setMode: (mode: ToolDisplayMode) => void;\n\n /** Update the full configuration */\n setConfig: (config: Partial<ToolDisplayConfig>) => void;\n\n /** Toggle between 'inline' and 'compact' modes */\n toggleMode: () => void;\n}\n\nconst DisplayModeContext = createContext<DisplayModeContextType | null>(null);\n\nexport interface DisplayModeProviderProps {\n children: ReactNode;\n\n /** Initial display configuration */\n initialConfig?: Partial<ToolDisplayConfig>;\n}\n\n/**\n * Provider for display mode configuration.\n *\n * Wrap your chat component with this provider to enable\n * configurable tool call display modes.\n *\n * @example\n * ```tsx\n * <DisplayModeProvider initialConfig={{ mode: 'compact' }}>\n * <MessageList entries={entries} />\n * </DisplayModeProvider>\n * ```\n */\nexport function DisplayModeProvider({ children, initialConfig }: DisplayModeProviderProps) {\n const [config, setConfigState] = useState<ToolDisplayConfig>({\n ...DEFAULT_DISPLAY_CONFIG,\n ...initialConfig,\n });\n\n const setMode = useCallback((mode: ToolDisplayMode) => {\n setConfigState((prev) => ({ ...prev, mode }));\n }, []);\n\n const setConfig = useCallback((updates: Partial<ToolDisplayConfig>) => {\n setConfigState((prev) => ({ ...prev, ...updates }));\n }, []);\n\n const toggleMode = useCallback(() => {\n setConfigState((prev) => ({\n ...prev,\n mode: prev.mode === 'inline' ? 'compact' : 'inline',\n }));\n }, []);\n\n const value = useMemo(\n () => ({ config, setMode, setConfig, toggleMode }),\n [config, setMode, setConfig, toggleMode]\n );\n\n return (\n <DisplayModeContext.Provider value={value}>\n {children}\n </DisplayModeContext.Provider>\n );\n}\n\n/**\n * Hook to access display mode configuration.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { config, toggleMode } = useDisplayMode();\n *\n * return (\n * <button onClick={toggleMode}>\n * Mode: {config.mode}\n * </button>\n * );\n * }\n * ```\n */\nexport function useDisplayMode(): DisplayModeContextType {\n const context = useContext(DisplayModeContext);\n\n if (!context) {\n // Return a default context for use outside a provider\n return {\n config: DEFAULT_DISPLAY_CONFIG,\n setMode: () => {},\n setConfig: () => {},\n toggleMode: () => {},\n };\n }\n\n return context;\n}\n\n/**\n * Hook to get just the current config (for components that only read)\n */\nexport function useDisplayConfig(): ToolDisplayConfig {\n const { config } = useDisplayMode();\n return config;\n}\n","import { useMemo, useCallback, useRef, useEffect } from 'react';\nimport type { NormalizedEntry, ToolDisplayConfig, WidgetRenderFunction, WidgetAction, WidgetEntry, RichContentRenderers } from '../types';\nimport { cn, groupEntriesForCompactMode, extractToolCallsFromGroup } from '../utils';\nimport { MessageEntry } from './MessageEntry';\nimport { LoadingIndicator } from './LoadingIndicator';\nimport { StreamingText } from './StreamingText';\nimport { ToolExecutionGroup } from './ToolExecutionGroup';\nimport { StepAccordion } from './StepAccordion';\nimport { BotIcon } from '../icons';\nimport { useDisplayConfig } from './DisplayModeContext';\n\nexport interface MessageListProps {\n /** Normalized conversation entries to display */\n entries: NormalizedEntry[];\n /** Whether a response is currently loading */\n loading?: boolean;\n /** Streaming text content (displayed during real-time streaming) */\n streamingContent?: string;\n /** Display configuration override (uses context if not provided) */\n displayConfig?: ToolDisplayConfig;\n /** Callback when user selects an option from assistant message */\n onOptionSelect?: (optionText: string) => void;\n /**\n * Custom render function for widget entries.\n * When provided, widget entries will be rendered using this function.\n *\n * @example\n * ```tsx\n * <MessageList\n * entries={entries}\n * renderWidget={({ widgetType, widgetData, onAction }) => {\n * if (widgetType === 'image-grid') {\n * return <ImageGrid data={widgetData} onSelect={onAction} />;\n * }\n * return null;\n * }}\n * />\n * ```\n */\n renderWidget?: WidgetRenderFunction;\n /**\n * Callback for widget interactions (e.g., selection, submit).\n * Called when widgets dispatch actions via their onAction callback.\n */\n onWidgetAction?: (action: WidgetAction) => void;\n /**\n * Enable auto-scroll to bottom when new entries are added.\n * Scrolls within the message list container (not the page).\n * Default: true\n */\n autoScroll?: boolean;\n /**\n * Custom renderers for rich content segments.\n * Used when entries have `richContent` defined.\n *\n * @example\n * ```tsx\n * <MessageList\n * entries={entriesWithRichContent}\n * richContentRenderers={{\n * renderMention: ({ segment }) => (\n * <MentionBadge\n * name={segment.name}\n * color={segment.color}\n * onClick={() => scrollToEntity(segment.id)}\n * />\n * ),\n * }}\n * />\n * ```\n */\n richContentRenderers?: RichContentRenderers;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * MessageList - Display a list of normalized message entries\n *\n * Handles various entry types including user messages, assistant messages,\n * tool calls, thinking, and errors. Also supports streaming content display.\n *\n * Supports two display modes:\n * - 'inline': Each tool call rendered as individual expandable cards (default)\n * - 'compact': Consecutive tool calls grouped into a single accordion with\n * an animated status line showing the current tool\n *\n * Uses glassmorphism dark theme styling with animated entries.\n *\n * @example\n * ```tsx\n * <MessageList entries={normalizedEntries} />\n * <MessageList entries={entries} loading streamingContent={text} />\n * <MessageList entries={entries} displayConfig={{ mode: 'compact' }} />\n * ```\n */\nexport function MessageList({\n entries,\n loading,\n streamingContent,\n displayConfig: displayConfigProp,\n onOptionSelect,\n renderWidget,\n onWidgetAction,\n autoScroll = true,\n richContentRenderers,\n className,\n}: MessageListProps) {\n // Use provided config or context config\n const contextConfig = useDisplayConfig();\n const config = displayConfigProp || contextConfig;\n\n // Refs for auto-scroll\n const containerRef = useRef<HTMLDivElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom when entries change (scrolls within this container only)\n useEffect(() => {\n if (autoScroll && messagesEndRef.current && containerRef.current) {\n // Use scrollIntoView on the internal ref - this scrolls the container, not the page\n // because the container has overflow-y-auto\n messagesEndRef.current.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [entries, streamingContent, loading, autoScroll]);\n\n // Create a stable action handler that wraps onWidgetAction\n const createWidgetActionHandler = useCallback(\n (entryId: string, widgetType: string) => {\n if (!onWidgetAction) return undefined;\n return (action: WidgetAction) => {\n onWidgetAction({\n ...action,\n entryId,\n widgetType,\n });\n };\n },\n [onWidgetAction]\n );\n\n // Group entries based on display mode\n const groupedEntries = useMemo(() => {\n if (config.mode === 'inline') {\n // Inline mode - return entries as-is (wrapped in single type)\n return entries.map((entry) => ({\n type: 'single' as const,\n entry,\n id: entry.id,\n }));\n }\n\n // Compact and accordion modes - group consecutive tool calls\n return groupEntriesForCompactMode(entries, config);\n }, [entries, config]);\n\n return (\n <div ref={containerRef} className={cn('flex-1 overflow-y-auto p-4 space-y-4 ash-scrollbar', className)}>\n {groupedEntries.map((groupedEntry) => {\n if (groupedEntry.type === 'single') {\n const entry = groupedEntry.entry;\n\n // Handle widget entries with custom render function\n if (entry.entryType.type === 'widget' && renderWidget) {\n const widgetEntry = entry.entryType as WidgetEntry;\n const widgetContent = renderWidget({\n entry,\n widgetType: widgetEntry.widgetType,\n widgetData: widgetEntry.widgetData,\n onAction: createWidgetActionHandler(entry.id, widgetEntry.widgetType),\n });\n\n // If renderWidget returns null, fall through to default rendering\n if (widgetContent !== null) {\n return (\n <div key={entry.id} className=\"ash-animate-fade-in\">\n {widgetContent}\n </div>\n );\n }\n }\n\n return (\n <MessageEntry\n key={entry.id}\n entry={entry}\n onOptionSelect={onOptionSelect}\n defaultExpanded={config.defaultExpanded}\n richContentRenderers={richContentRenderers}\n />\n );\n }\n\n // Tool group - render as ToolExecutionGroup or StepAccordion based on mode\n const toolCalls = extractToolCallsFromGroup(groupedEntry.entries);\n return (\n <div key={groupedEntry.id} className=\"flex gap-3 ash-animate-fade-in\">\n <div className=\"w-7 h-7 rounded-full bg-[var(--ash-accent)]/20 flex items-center justify-center shrink-0\">\n <BotIcon className=\"w-4 h-4 text-[var(--ash-accent)]\" />\n </div>\n <div className=\"flex-1\">\n {config.mode === 'accordion' ? (\n <StepAccordion\n toolCalls={toolCalls}\n defaultExpanded={config.defaultExpanded}\n />\n ) : (\n <ToolExecutionGroup\n toolCalls={toolCalls}\n defaultExpanded={config.defaultExpanded}\n animationDuration={config.animationDuration}\n />\n )}\n </div>\n </div>\n );\n })}\n\n {streamingContent && (\n <div className=\"flex gap-3 ash-animate-fade-in\">\n <div className=\"w-7 h-7 rounded-full bg-[var(--ash-accent)]/20 flex items-center justify-center shrink-0\">\n <BotIcon className=\"w-4 h-4 text-[var(--ash-accent)]\" />\n </div>\n <div className=\"flex-1 max-w-[85%]\">\n <div className=\"rounded-xl p-3 bg-white/5 text-white/80\">\n <StreamingText content={streamingContent} isStreaming />\n </div>\n </div>\n </div>\n )}\n\n {loading && !streamingContent && (\n <div className=\"flex gap-3 ash-animate-fade-in\">\n <div className=\"w-7 h-7 rounded-full bg-[var(--ash-accent)]/20 flex items-center justify-center shrink-0\">\n <BotIcon className=\"w-4 h-4 text-[var(--ash-accent)]\" />\n </div>\n <div className=\"rounded-xl p-3 bg-white/5\">\n <LoadingIndicator variant=\"dots\" />\n </div>\n </div>\n )}\n\n {/* Scroll anchor - inside the scrollable container for proper auto-scroll */}\n <div ref={messagesEndRef} />\n </div>\n );\n}\n\nexport default MessageList;\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","import { useState, useEffect, useRef } from 'react';\nimport type { NormalizedToolCall } from '../types';\nimport { cn, getActionLabel } from '../utils';\nimport { StatusIndicator } from './StatusIndicator';\nimport { ActionIcon } from './ActionIcon';\n\nexport interface CompactToolStatusLineProps {\n /** The current tool call to display */\n toolCall: NormalizedToolCall;\n\n /** Previous tool call (for exit animation) */\n previousToolCall?: NormalizedToolCall | null;\n\n /** Animation duration in ms */\n animationDuration?: number;\n\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Compact status line for displaying the current tool execution.\n *\n * Features a smooth replace animation where the previous tool call\n * slides out while the new one slides in. Similar to the homepage\n * status line animation.\n *\n * @example\n * ```tsx\n * <CompactToolStatusLine\n * toolCall={currentToolCall}\n * previousToolCall={lastToolCall}\n * />\n * ```\n */\nexport function CompactToolStatusLine({\n toolCall,\n previousToolCall,\n animationDuration = 300,\n className,\n}: CompactToolStatusLineProps) {\n const [isAnimating, setIsAnimating] = useState(false);\n const [displayedToolCall, setDisplayedToolCall] = useState(toolCall);\n const [exitingToolCall, setExitingToolCall] = useState<NormalizedToolCall | null>(null);\n const prevToolCallRef = useRef<string | null>(null);\n\n useEffect(() => {\n // Detect when the tool call changes (by ID)\n if (toolCall.id !== prevToolCallRef.current) {\n if (prevToolCallRef.current !== null && previousToolCall) {\n // Trigger exit animation for previous tool call\n setExitingToolCall(previousToolCall);\n setIsAnimating(true);\n\n // After exit animation, update displayed tool call\n const timer = setTimeout(() => {\n setDisplayedToolCall(toolCall);\n setExitingToolCall(null);\n setIsAnimating(false);\n }, animationDuration);\n\n prevToolCallRef.current = toolCall.id;\n return () => clearTimeout(timer);\n } else {\n // First tool call - no exit animation\n setDisplayedToolCall(toolCall);\n prevToolCallRef.current = toolCall.id;\n }\n } else {\n // Same tool call, just update status\n setDisplayedToolCall(toolCall);\n }\n return undefined;\n }, [toolCall, previousToolCall, animationDuration]);\n\n // Status-based styling\n const statusClasses = {\n pending: 'border-yellow-500/30',\n success: 'border-[var(--ash-accent)]/30',\n failed: 'border-red-500/30',\n };\n\n const renderToolCallContent = (tc: NormalizedToolCall, isExiting: boolean) => (\n <div\n className={cn(\n 'flex items-center gap-3 px-4 py-2.5',\n isExiting ? 'ash-status-line-exit' : (isAnimating ? 'ash-status-line-enter' : '')\n )}\n style={{\n animationDuration: `${animationDuration}ms`,\n }}\n >\n {/* Icon badge */}\n <div\n className={cn(\n 'w-6 h-6 rounded-lg flex items-center justify-center shrink-0',\n tc.status === 'pending'\n ? 'bg-yellow-500/20'\n : tc.status === 'failed'\n ? 'bg-red-500/20'\n : 'bg-[var(--ash-accent)]/20'\n )}\n >\n <ActionIcon\n actionType={tc.actionType}\n className={cn(\n 'w-3.5 h-3.5',\n tc.status === 'pending'\n ? 'text-yellow-400'\n : tc.status === 'failed'\n ? 'text-red-400'\n : 'text-[var(--ash-accent)]'\n )}\n />\n </div>\n\n {/* Tool name */}\n <span className=\"text-sm font-medium text-white shrink-0\">\n {getActionLabel(tc.actionType)}\n </span>\n\n {/* Summary */}\n <span className=\"font-mono text-sm truncate text-white/60 flex-1 min-w-0\">\n {tc.summary}\n </span>\n\n {/* Status indicator */}\n <StatusIndicator status={tc.status} size=\"sm\" />\n </div>\n );\n\n return (\n <div\n className={cn(\n 'relative rounded-xl border bg-[var(--ash-surface-dark,#0a0a0a)] overflow-hidden',\n statusClasses[displayedToolCall.status],\n displayedToolCall.status === 'pending' && 'ash-tool-status-pending',\n className\n )}\n >\n {/* Exiting tool call (animating out) */}\n {exitingToolCall && (\n <div className=\"absolute inset-0\">\n {renderToolCallContent(exitingToolCall, true)}\n </div>\n )}\n\n {/* Current tool call */}\n {renderToolCallContent(displayedToolCall, false)}\n </div>\n );\n}\n\nexport default CompactToolStatusLine;\n","import { useMemo } from 'react';\nimport type { TodoItem, TodoStatus as TodoStatusType } from '../types';\nimport { cn } from '../utils';\nimport { CheckCircleIcon, CircleIcon, LoaderIcon } from '../icons';\n\n// =============================================================================\n// TodoStatusIcon Component\n// =============================================================================\n\ninterface TodoStatusIconProps {\n status: TodoStatusType;\n className?: string;\n}\n\nfunction TodoStatusIcon({ status, className = 'w-4 h-4' }: TodoStatusIconProps) {\n switch (status) {\n case 'completed':\n return <CheckCircleIcon className={cn(className, 'text-emerald-400')} />;\n case 'in_progress':\n return <LoaderIcon className={cn(className, 'text-yellow-400 animate-spin')} />;\n case 'pending':\n default:\n return <CircleIcon className={cn(className, 'text-white/30')} />;\n }\n}\n\n// =============================================================================\n// TodoListItem Component\n// =============================================================================\n\ninterface TodoListItemProps {\n todo: TodoItem;\n index: number;\n compact?: boolean;\n}\n\nfunction TodoListItem({ todo, index, compact = false }: TodoListItemProps) {\n const displayText = todo.status === 'in_progress' ? todo.activeForm : todo.content;\n\n return (\n <div\n className={cn(\n 'flex items-start gap-2 transition-all duration-200',\n compact ? 'py-1' : 'py-1.5',\n todo.status === 'completed' && 'opacity-60',\n todo.status === 'in_progress' && 'bg-yellow-500/5 -mx-2 px-2 rounded-md'\n )}\n >\n <TodoStatusIcon status={todo.status} className={compact ? 'w-3.5 h-3.5 mt-0.5' : 'w-4 h-4 mt-0.5'} />\n <span\n className={cn(\n 'flex-1 text-white/80',\n compact ? 'text-xs' : 'text-sm',\n todo.status === 'completed' && 'line-through text-white/50'\n )}\n >\n {!compact && <span className=\"text-white/40 mr-1.5\">{index + 1}.</span>}\n {displayText}\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// TodoProgress Component\n// =============================================================================\n\ninterface TodoProgressProps {\n completed: number;\n total: number;\n className?: string;\n}\n\nfunction TodoProgress({ completed, total, className }: TodoProgressProps) {\n const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;\n\n return (\n <div className={cn('flex items-center gap-2', className)}>\n <div className=\"flex-1 h-1.5 bg-white/10 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-emerald-400 rounded-full transition-all duration-500 ease-out\"\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className=\"text-xs text-white/50 tabular-nums min-w-[3rem] text-right\">\n {completed}/{total}\n </span>\n </div>\n );\n}\n\n// =============================================================================\n// TodoPanel Component\n// =============================================================================\n\nexport interface TodoPanelProps {\n /** List of todo items */\n todos: TodoItem[];\n /** Optional title for the panel */\n title?: string;\n /** Show in compact mode (less padding, smaller text) */\n compact?: boolean;\n /** Show progress bar */\n showProgress?: boolean;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * TodoPanel - Display a list of todos with status indicators\n *\n * Features:\n * - Status icons (pending/in_progress/completed)\n * - Progress bar showing completion\n * - Compact mode for inline display\n * - Animated transitions\n *\n * @example\n * ```tsx\n * <TodoPanel todos={todos} />\n * <TodoPanel todos={todos} title=\"Task Progress\" showProgress />\n * <TodoPanel todos={todos} compact />\n * ```\n */\nexport function TodoPanel({\n todos,\n title,\n compact = false,\n showProgress = true,\n className,\n}: TodoPanelProps) {\n const stats = useMemo(() => {\n return {\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 }, [todos]);\n\n if (todos.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-white/10 bg-white/5 overflow-hidden',\n className\n )}\n >\n {/* Header */}\n {(title || showProgress) && (\n <div className={cn('border-b border-white/5', compact ? 'px-2 py-1.5' : 'px-3 py-2')}>\n {title && (\n <div className={cn('font-medium text-white/90 mb-1.5', compact ? 'text-xs' : 'text-sm')}>\n {title}\n </div>\n )}\n {showProgress && (\n <TodoProgress completed={stats.completed} total={stats.total} />\n )}\n </div>\n )}\n\n {/* Todo List */}\n <div className={cn(compact ? 'px-2 py-1.5' : 'px-3 py-2')}>\n {todos.map((todo, index) => (\n <TodoListItem\n key={`${todo.content}-${index}`}\n todo={todo}\n index={index}\n compact={compact}\n />\n ))}\n </div>\n\n {/* Stats Footer */}\n {!compact && stats.inProgress > 0 && (\n <div className=\"px-3 py-2 border-t border-white/5 bg-yellow-500/5\">\n <div className=\"flex items-center gap-2 text-xs text-yellow-400\">\n <LoaderIcon className=\"w-3 h-3 animate-spin\" />\n <span>\n {stats.inProgress} task{stats.inProgress !== 1 ? 's' : ''} in progress\n </span>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default TodoPanel;\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","'use client';\n\nimport { useDisplayMode } from './DisplayModeContext';\nimport { cn } from '../utils';\nimport type { ToolDisplayMode } from '../types';\n\nexport interface DisplayModeToggleProps {\n /** Additional class name */\n className?: string;\n /** Show label text (default: true) */\n showLabel?: boolean;\n /** Custom labels for modes */\n labels?: {\n inline?: string;\n compact?: string;\n accordion?: string;\n };\n /** Which modes to cycle through (default: all three) */\n modes?: ToolDisplayMode[];\n}\n\n/**\n * DisplayModeToggle - Button to cycle through display modes\n *\n * Uses the DisplayModeContext to cycle through 'inline', 'compact', and 'accordion' modes.\n * Must be used within a DisplayModeProvider.\n *\n * @example\n * ```tsx\n * function ChatHeader() {\n * return (\n * <header>\n * <h1>Chat</h1>\n * <DisplayModeToggle />\n * </header>\n * );\n * }\n *\n * function App() {\n * return (\n * <DisplayModeProvider>\n * <ChatHeader />\n * <MessageList entries={entries} />\n * </DisplayModeProvider>\n * );\n * }\n * ```\n */\nexport function DisplayModeToggle({\n className,\n showLabel = true,\n labels = { inline: 'Inline', compact: 'Compact', accordion: 'Steps' },\n modes = ['inline', 'compact', 'accordion'],\n}: DisplayModeToggleProps) {\n const { config, setMode } = useDisplayMode();\n\n const currentMode = config.mode;\n const currentIndex = modes.indexOf(currentMode);\n // If current mode not in modes array, start from first mode\n const effectiveIndex = currentIndex === -1 ? 0 : currentIndex;\n const nextIndex = (effectiveIndex + 1) % modes.length;\n const nextMode = modes[nextIndex] as ToolDisplayMode;\n\n const handleClick = () => {\n setMode(nextMode);\n };\n\n const getIcon = (mode: ToolDisplayMode) => {\n switch (mode) {\n case 'inline':\n return (\n <svg\n className=\"ash-display-mode-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n />\n </svg>\n );\n case 'compact':\n return (\n <svg\n className=\"ash-display-mode-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3.75 6.75h16.5M3.75 12h16.5M12 17.25h8.25\"\n />\n </svg>\n );\n case 'accordion':\n return (\n <svg\n className=\"ash-display-mode-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M8.25 6.75h12M8.25 12h12M8.25 17.25h12M3.75 6.75h.007v.008H3.75V6.75zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zM3.75 12h.007v.008H3.75V12zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm-.375 5.25h.007v.008H3.75v-.008zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z\"\n />\n </svg>\n );\n }\n };\n\n const getLabel = (mode: ToolDisplayMode) => {\n return labels[mode] || mode.charAt(0).toUpperCase() + mode.slice(1);\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn('ash-display-mode-toggle', className)}\n title={`Switch to ${nextMode} mode`}\n >\n {getIcon(currentMode)}\n {showLabel && <span className=\"ash-display-mode-label\">{getLabel(currentMode)}</span>}\n </button>\n );\n}\n\nexport default DisplayModeToggle;\n","'use client';\n\nimport { useEffect, useState, useRef } from 'react';\nimport { cn } from '../utils';\n\nexport interface TypewriterTextProps {\n /** Words to cycle through */\n words?: string[];\n /** Typing speed in ms per character */\n typeSpeed?: number;\n /** Pause before erasing in ms */\n pauseBeforeErase?: number;\n /** Erasing speed in ms per character */\n eraseSpeed?: number;\n /** Pause before typing next word in ms */\n pauseBeforeType?: number;\n /** Whether to show a blinking cursor */\n showCursor?: boolean;\n /** Additional class names */\n className?: string;\n /** Cursor class names */\n cursorClassName?: string;\n}\n\n// Default words to cycle through when thinking\nconst DEFAULT_WORDS = [\n 'Thinking',\n 'Reasoning',\n 'Pondering',\n 'Analyzing',\n 'Considering',\n 'Processing',\n 'Evaluating',\n];\n\n/**\n * TypewriterText - Animated typing component that cycles through words\n *\n * Creates a typewriter effect that types out words character by character,\n * pauses, then erases them before moving to the next word.\n *\n * @example\n * ```tsx\n * // Default thinking words\n * <TypewriterText />\n *\n * // Custom words\n * <TypewriterText words={['Loading', 'Processing', 'Almost done']} />\n *\n * // Custom speeds\n * <TypewriterText typeSpeed={30} pauseBeforeErase={1000} />\n * ```\n */\nexport function TypewriterText({\n words = DEFAULT_WORDS,\n typeSpeed = 50,\n pauseBeforeErase = 800,\n eraseSpeed = 30,\n pauseBeforeType = 200,\n showCursor = true,\n className,\n cursorClassName,\n}: TypewriterTextProps) {\n const [displayText, setDisplayText] = useState('');\n const [wordIndex, setWordIndex] = useState(0);\n const [isTyping, setIsTyping] = useState(true);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n const currentWord = words[wordIndex] ?? '';\n\n if (isTyping) {\n // Typing phase\n if (displayText.length < currentWord.length) {\n timeoutRef.current = setTimeout(() => {\n setDisplayText(currentWord.slice(0, displayText.length + 1));\n }, typeSpeed);\n } else {\n // Finished typing, pause then erase\n timeoutRef.current = setTimeout(() => {\n setIsTyping(false);\n }, pauseBeforeErase);\n }\n } else {\n // Erasing phase\n if (displayText.length > 0) {\n timeoutRef.current = setTimeout(() => {\n setDisplayText(displayText.slice(0, -1));\n }, eraseSpeed);\n } else {\n // Finished erasing, move to next word\n timeoutRef.current = setTimeout(() => {\n setWordIndex((prev) => (prev + 1) % words.length);\n setIsTyping(true);\n }, pauseBeforeType);\n }\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [displayText, wordIndex, isTyping, words, typeSpeed, pauseBeforeErase, eraseSpeed, pauseBeforeType]);\n\n return (\n <span className={cn('inline-flex items-center', className)}>\n <span>{displayText}</span>\n {showCursor && (\n <span\n className={cn(\n 'w-0.5 h-4 bg-current ml-0.5 animate-pulse',\n cursorClassName\n )}\n />\n )}\n </span>\n );\n}\n\nexport default TypewriterText;\n","import { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react';\n\nexport type Theme = 'light' | 'dark';\n\nexport interface ThemeContextType {\n theme: Theme;\n toggleTheme: () => void;\n setTheme: (theme: Theme) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nconst DEFAULT_STORAGE_KEY = 'ash-ui-theme';\n\nexport interface ThemeProviderProps {\n children: ReactNode;\n /** Default theme to use when no stored preference exists. Defaults to system preference, then 'light'. */\n defaultTheme?: Theme;\n /** localStorage key for persisting theme. Defaults to 'ash-ui-theme'. */\n storageKey?: string;\n /** Whether to listen for system theme changes. Defaults to true. */\n listenToSystemChanges?: boolean;\n}\n\n/**\n * ThemeProvider - Unified theme management for agentic UIs.\n *\n * Features:\n * - Persists theme choice to localStorage\n * - Respects system preference when no stored preference exists\n * - Listens for system theme changes (configurable)\n * - Adds/removes 'dark' class on document root for Tailwind CSS\n *\n * @example\n * ```tsx\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n *\n * // With custom defaults\n * <ThemeProvider defaultTheme=\"dark\" storageKey=\"my-theme\">\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport function ThemeProvider({\n children,\n defaultTheme,\n storageKey = DEFAULT_STORAGE_KEY,\n listenToSystemChanges = true,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(() => {\n if (typeof window !== 'undefined') {\n const stored = localStorage.getItem(storageKey);\n if (stored === 'dark' || stored === 'light') {\n return stored;\n }\n if (!defaultTheme && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n }\n return defaultTheme ?? 'light';\n });\n\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n if (!mounted) return;\n\n const root = document.documentElement;\n if (theme === 'dark') {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n localStorage.setItem(storageKey, theme);\n }, [theme, mounted, storageKey]);\n\n useEffect(() => {\n if (!listenToSystemChanges || typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = (e: MediaQueryListEvent) => {\n const stored = localStorage.getItem(storageKey);\n if (!stored) {\n setThemeState(e.matches ? 'dark' : 'light');\n }\n };\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [storageKey, listenToSystemChanges]);\n\n const toggleTheme = useCallback(() => {\n setThemeState((prev) => (prev === 'light' ? 'dark' : 'light'));\n }, []);\n\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeState(newTheme);\n }, []);\n\n if (!mounted) {\n return (\n <ThemeContext.Provider value={{ theme: defaultTheme ?? 'light', toggleTheme, setTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n }\n\n return (\n <ThemeContext.Provider value={{ theme, toggleTheme, setTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): ThemeContextType {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\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// 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 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 Keyframes = typeof keyframes;\nexport type Transitions = typeof transitions;\nexport type ZIndex = typeof zIndex;\nexport type Widget = typeof widget;\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 * 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';\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 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 * Function that creates a stream of events\n * This matches the signature of client.agents.run() and client.sessions.send()\n * The optional signal parameter allows cancellation via AbortController\n */\nexport type CreateStreamFn = (prompt: string, sessionId?: string, signal?: AbortSignal) => StreamGenerator;\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 * 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/**\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 * 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// ============================================================================\n// Hook Implementation\n// ============================================================================\n\nexport function useAgentChat(options: UseAgentChatOptions): UseAgentChatReturn {\n const {\n createStream,\n initialSessionId,\n initialEntries = [],\n onSessionStart,\n onSessionEnd,\n onError,\n onSandboxLog,\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 [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\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 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()}`,\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 // Send a message\n const send = useCallback(async (prompt: string) => {\n if (isStreaming) return;\n\n setIsStreaming(true);\n setError(null);\n\n // Add user message to history\n const userEntry: NormalizedEntry = {\n id: `user-${Date.now()}`,\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\n try {\n const stream = createStream(prompt, sessionId || undefined, controller.signal);\n\n for await (const event of stream) {\n if (controller.signal.aborted) break;\n\n localStreamingEntries = processEvent(event, 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 } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n onError?.(errorMessage);\n }\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n resetStreamingState();\n }\n }, [isStreaming, sessionId, createStream, processEvent, emitStreamingEntries, resetStreamingState, onError]);\n\n // Stop streaming\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, []);\n\n // Clear all entries\n const clear = useCallback(() => {\n setHistoryEntries([]);\n resetStreamingState();\n setSessionId(initialSessionId || null);\n setError(null);\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 error,\n sessionId,\n send,\n stop,\n clear,\n setEntries,\n };\n}\n\nexport default useAgentChat;\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/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":";;;;;;;;AAuBO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,OAAO,CAAA,IAAA,EAAO,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,IACpD;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,iBAAiB,IAAA,EAA+D;AAC9F,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,MAAM,MAAA,IAAU,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,MAAA,EAAW;AAC/C,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,QACnB,UAAU,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,IAAI;AAAA,OACpC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,mBAAA,CAAoB,UAAkB,KAAA,EAA4B;AAChF,EAAA,MAAM,QAAA,GAAY,SAAqC,EAAC;AAExD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,aAAA;AAAA,QACR,OAAA,EAAU,SAAS,OAAA,IAAsB,EAAA;AAAA,QACzC,aAAa,QAAA,CAAS;AAAA,OACxB;AAAA,IAEF,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAO,SAAS,SAAA,IAAwB,EAAA;AAAA,QACxC,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,KAAA;AAAA,QACA,SAAA,EAAW;AAAA;AAAA,OACb;AAAA,IACF;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,SAAS,QAAA,CAAS,UAAA;AACxB,MAAA,MAAM,SAAS,QAAA,CAAS,UAAA;AAExB,MAAA,MAAM,WAAW,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAI,EAAE,MAAA,GAAS,CAAA;AACtD,MAAA,MAAM,WAAW,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAI,EAAE,MAAA,GAAS,CAAA;AACtD,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAO,SAAS,SAAA,IAAwB,EAAA;AAAA,QACxC,SAAA,EAAW,MAAA;AAAA,QACX,SAAA,EAAW,MAAA;AAAA,QACX,YAAY,QAAA,CAAS,WAAA;AAAA,QACrB,UAAA,EAAY,QAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAAA,IAEA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAO,SAAS,SAAA,IAAwB,EAAA;AAAA,QACxC,OAAA;AAAA,QACA,cAAc,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,IAAI,EAAE,MAAA,GAAS;AAAA,OACvD;AAAA,IACF;AAAA,IAEA,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAU,SAAS,OAAA,IAAsB,EAAA;AAAA,QACzC,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,MAAM,QAAA,CAAS;AAAA,OACjB;AAAA,IAEF,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAU,SAAS,OAAA,IAAsB,EAAA;AAAA,QACzC,MAAM,QAAA,CAAS;AAAA,OACjB;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,WAAA;AAAA,QACR,GAAA,EAAM,SAAS,GAAA,IAAkB,EAAA;AAAA,QACjC,QAAQ,QAAA,CAAS;AAAA,OACnB;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,KAAA,EAAQ,SAAS,KAAA,IAAoB;AAAA,OACvC;AAAA,IAEF,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,KAAA,GAAS,QAAA,CAAS,KAAA,IAAwB,EAAC;AACjD,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,OAAO,KAAA,CAAM,MAAA;AAAA,QACb,SAAA,EAAW,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,QACzD,UAAA,EAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AAAA,QAC5D,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE;AAAA,OACvD;AACA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,SAAA,EAAY,SAAS,aAAA,IAA4B,iBAAA;AAAA,QACjD,WAAA,EAAc,SAAS,WAAA,IAA0B,EAAA;AAAA,QACjD,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAAA,IAEA,SAAS;AAEP,MAAA,MAAM,QAAA,GAAW,iBAAiB,QAAQ,CAAA;AAC1C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,UAAA;AAAA,UACR,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAGA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,cAAA;AAAA,QACR,QAAA,EAAU,eAAe,QAAQ,CAAA;AAAA,QACjC,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAAA;AAEJ;AASO,SAAS,mBAAA,CACd,SAAA,EACA,MAAA,EACA,UAAA,EACQ;AACR,EAAA,QAAQ,WAAW,MAAA;AAAQ,IACzB,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,MAAM,UAAA,CAAW,OAAA;AACvB,MAAA,OAAO,GAAA,CAAI,SAAS,EAAA,GAAK,GAAA,CAAI,UAAU,CAAA,EAAG,EAAE,IAAI,KAAA,GAAQ,GAAA;AAAA,IAC1D;AAAA,IAEA,KAAK,WAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IAEpB,KAAK,WAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IAEpB,KAAK,YAAA;AACH,MAAA,OAAO,UAAA,CAAW,IAAA;AAAA,IAEpB,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA,IAAA,EAAO,UAAA,CAAW,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,IAEhF,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,OAAA;AAAA,IAEpB,KAAK,WAAA;AACH,MAAA,OAAO,UAAA,CAAW,GAAA;AAAA,IAEpB,KAAK,YAAA;AACH,MAAA,OAAO,UAAA,CAAW,KAAA;AAAA,IAEpB,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA,CAAA,EAAI,WAAW,QAAQ,CAAA,CAAA;AAAA,IAExD,KAAK,cAAA;AACH,MAAA,OAAO,UAAA,CAAW,QAAA;AAAA,IAEpB,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,EAAE,OAAM,GAAI,UAAA;AAClB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,CAAA,EAAG,KAAA,CAAM,SAAS,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA,UAAA,CAAA;AAAA,MAC1C;AACA,MAAA,OAAO,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA,MAAA,CAAA;AAAA,IACnC;AAAA,IAEA,KAAK,YAAA;AACH,MAAA,OAAO,UAAA,CAAW,WAAA;AAAA,IAEpB;AACE,MAAA,OAAO,cAAA;AAAA;AAEb;AASO,SAAS,mBAAmB,OAAA,EAA0B;AAC3D,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAExC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,QACJ,MAAA,CAAO,CAAC,IAAA,KAAmC,OAAO,MAAM,IAAA,KAAS,QAAQ,CAAA,CACzE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,CACvB,KAAK,IAAI,CAAA;AAAA,EACd;AAEA,EAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,UAAU,OAAA,EAAS;AAC/D,IAAA,OAAO,MAAA,CAAQ,QAA8B,IAAI,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACxC;AAKO,SAAS,oBAAoB,OAAA,EAA8B;AAChE,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,MAAM,QAAQ,OAAA,CACX,MAAA;AAAA,MACC,CAAC,IAAA,KACC,IAAA,EAAM,SAAS,MAAA,IAAU,OAAO,KAAK,IAAA,KAAS;AAAA,KAClD,CACC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAE1B,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAChC,MAAA,IAAI;AACF,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAE;AAAA,MACnD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAQ;AACxC;AAKO,SAAS,mBAAmB,OAAA,EAAoC;AACrE,EAAA,MAAM,MAAA,GAAS,mBAAmB,OAAO,CAAA;AAEzC,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,MAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACvC,QAAA,OAAO;AAAA,UACL,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,UACzB,OAAA,EAAS,OAAO,QAAA,KAAa;AAAA,SAC/B;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AACF;AAeO,SAAS,eAAe,OAAA,EAA2C;AACxE,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,OAAA,CAAQ,IAAA,EAAM,QAAQ,KAAK,CAAA;AAClE,EAAA,MAAM,UAAU,mBAAA,CAAoB,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,OAAO,UAAU,CAAA;AAE3E,EAAA,OAAO;AAAA,IACL,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,UAAU,OAAA,CAAQ,IAAA;AAAA,IAClB,UAAA;AAAA,IACA,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA;AAAA,IACA,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACpC;AACF;AAKO,SAAS,wBAAA,CACd,QAAA,EACA,OAAA,EACA,OAAA,EACoB;AACpB,EAAA,MAAM,eAAA,GAAkB,EAAE,GAAG,QAAA,EAAS;AACtC,EAAA,MAAM,UAAA,GAAa,EAAE,GAAG,QAAA,CAAS,UAAA,EAAW;AAE5C,EAAA,eAAA,CAAgB,MAAA,GAAS,UAAU,QAAA,GAAW,SAAA;AAC9C,EAAA,eAAA,CAAgB,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACrD,EAAA,eAAA,CAAgB,OAAA,GAAU,OAAA;AAC1B,EAAA,eAAA,CAAgB,MAAA,GAAS,OAAA;AAEzB,EAAA,IAAI,UAAA,CAAW,WAAW,aAAA,EAAe;AACvC,IAAA,MAAM,MAAA,GAAS,mBAAmB,OAAO,CAAA;AACzC,IAAC,WAAiC,MAAA,GAAS,MAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,IAAa,MAAA,CAAO,aAAa,CAAA,EAAG;AAC1D,MAAA,eAAA,CAAgB,MAAA,GAAS,QAAA;AACzB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B;AAAA,EACF,WAAW,UAAA,CAAW,MAAA,KAAW,UAAA,IAAc,UAAA,CAAW,WAAW,cAAA,EAAgB;AACnF,IAAC,UAAA,CAAiC,MAAA,GAAS,mBAAA,CAAoB,OAAO,CAAA;AAAA,EACxE;AAEA,EAAA,eAAA,CAAgB,UAAA,GAAa,UAAA;AAC7B,EAAA,OAAO,eAAA;AACT;AASO,SAAS,cAAc,UAAA,EAAgC;AAC5D,EAAA,QAAQ,WAAW,MAAA;AAAQ,IACzB,KAAK,aAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAKO,SAAS,eAAe,UAAA,EAAgC;AAC7D,EAAA,QAAQ,WAAW,MAAA;AAAQ,IACzB,KAAK,aAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAQ,UAAA,CAA+B,SAAA;AAAA,IACzC;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AASO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;AAKO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,mBAAmB,OAAA,EAAS;AAAA,MACtC,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAQO,SAAS,iBAAA,CAAkB,WAA0B,OAAA,EAAiC;AAC3F,EAAA,MAAM,QAAQ,OAAO,SAAA,KAAc,WAAW,IAAI,IAAA,CAAK,SAAS,CAAA,GAAI,SAAA;AACpE,EAAA,MAAM,GAAA,GAAM,OAAA,GAAW,OAAO,OAAA,KAAY,QAAA,GAAW,IAAI,IAAA,CAAK,OAAO,CAAA,GAAI,OAAA,mBAAW,IAAI,IAAA,EAAK;AAE7F,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,EAAQ,GAAI,MAAM,OAAA,EAAQ;AAChD,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,GAAI,CAAA;AAElD,EAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,IAAA,OAAO,GAAG,cAAc,CAAA,CAAA,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,EAAE,CAAA;AAC9C,EAAA,MAAM,UAAU,cAAA,GAAiB,EAAA;AAEjC,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAC/B;AAKO,SAAS,QAAA,CAAS,KAAa,SAAA,EAA2B;AAC/D,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,SAAA,EAAW,OAAO,GAAA;AACpC,EAAA,OAAO,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,SAAA,GAAY,CAAC,CAAA,GAAI,KAAA;AAC3C;AAKO,SAAS,MAAM,OAAA,EAAwD;AAC5E,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;AAsCO,SAAS,wBAAwB,OAAA,EAA6C;AAGnF,EAAA,MAAM,aAAA,GAAgB,8FAAA;AAEtB,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,EAAA,IAAI,KAAA;AAGJ,EAAA,aAAA,CAAc,SAAA,GAAY,CAAA;AAE1B,EAAA,OAAA,CAAQ,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACrD,IAAA,IAAI,oBAAoB,EAAA,EAAI;AAC1B,MAAA,eAAA,GAAkB,KAAA,CAAM,KAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,QAAA,CAAS,IAAA,EAAK,GAAI,EAAA;AAE3C,IAAA,MAAM,cAAA,GAAiB,MAAM,CAAC,CAAA;AAG9B,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,UAAU,cAAA,CACb,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,UAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CACvB,OAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,CAAC,CAAA,CAC9B,KAAK,GAAG,CAAA;AACX,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,WAAA,GAAc,OAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,aAAa,CAAA;AAAA,EACzC;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,IAAA,MAAM,QAAA,GAAW,kBAAkB,CAAA,GAC/B,OAAA,CAAQ,UAAU,CAAA,EAAG,eAAe,CAAA,CAAE,IAAA,EAAK,GAC3C,EAAA;AAEJ,IAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAAA,EAC7B;AAIA,EAAA,MAAM,eAAA,GAAkB,2HAAA;AACxB,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA;AAEnD,EAAA,IAAI,iBAAiB,aAAA,CAAc,CAAC,CAAA,IAAK,aAAA,CAAc,CAAC,CAAA,EAAG;AACzD,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,CAAC,CAAA,CAAE,IAAA,EAAK;AACvC,IAAA,MAAM,WAAA,GAAc,cAAc,CAAC,CAAA;AAGnC,IAAA,MAAM,WAAA,GAAc,qBAAA;AACpB,IAAA,IAAI,SAAA;AAEJ,IAAA,OAAA,CAAQ,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,WAAW,OAAO,IAAA,EAAM;AAC3D,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAC,CAAA,IAAK,EAAA;AAC/B,MAAA,MAAM,YAAA,GAAe,UAAU,CAAC,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,YAAA,GAAe,YAAA,CAAa,IAAA,EAAK,GAAI,EAAA;AACvD,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,EAAA,EAAI,MAAA;AAAA,QACJ,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,MAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AC3kBA,IAAM,mBAAA,GAAsBA,oBAA+C,IAAI,CAAA;AAExE,SAAS,eAAA,GAA4C;AAC1D,EAAA,MAAM,OAAA,GAAUC,iBAAW,mBAAmB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,OAAA;AACT;AAiBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAY,iBAAA,GAAoB,IAAA;AAAA,EAChC,eAAA,GAAkB;AACpB,CAAA,EAAsB;AACpB,EAAA,MAAM,YAAA,GAAeC,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,iBAAiB,CAAA;AAE9D,EAAA,MAAM,cAAA,GAAiBC,iBAAA,CAAY,CAAC,QAAA,GAA2B,QAAA,KAAa;AAC1E,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,QAAQ,QAAA,CAAS;AAAA,QAC5B,GAAA,EAAK,aAAa,OAAA,CAAQ,YAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAE3B,IAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,KAAiB,YAAA,CAAa,OAAA;AAC/D,IAAA,MAAM,kBAAA,GAAqB,eAAe,SAAA,GAAY,YAAA;AACtD,IAAA,MAAM,aAAa,kBAAA,GAAqB,eAAA;AAExC,IAAA,eAAA,CAAgB,CAAC,UAAU,CAAA;AAG3B,IAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY;AAC7B,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGhC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAA,IAAc,CAAC,YAAA,EAAc;AAC/B,MAAA,cAAA,CAAe,SAAS,CAAA;AAAA,IAC1B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,YAAA,GAAyC;AAAA,IAC7C,YAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,cAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAAO,YAAA,EACnC,QAAA,kBAAAA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,QAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,gDAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAK,KAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MAET;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAaO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,wCAAA;AAAA,QACA,2CAAA;AAAA,QACA,mCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAaO,SAAS,sBAAA,CAAuB;AAAA,EACrC,QAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kEAAA;AAAA,QACA,kCAAA;AAAA,QACA,oDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAaO,SAAS,wBAAA,CAAyB;AAAA,EACvC,SAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAAkC;AAChC,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,eAAA,EAAgB;AAEzD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,uBACEA,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,cAAA,EAAe;AAAA,MAC9B,SAAA,EAAW,EAAA;AAAA,QACT,6BAAA;AAAA,QACA,2CAAA;AAAA,QACA,wBAAA;AAAA,QACA,gGAAA;AAAA,QACA,gEAAA;AAAA,QACA,6GAAA;AAAA,QACA,6BAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,YAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAC,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,wBAAAD,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,SAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,cAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF;AAAA,QACC;AAAA,OAAA,EACH;AAAA;AAAA,GACF;AAEJ;ACjQA,IAAM,aAAA,GAAgBE,UAAA,CAAK,MAAM,OAAO,gBAAgB,CAAC,CAAA;AAgClD,SAAS,aAAa,EAAE,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,WAAU,EAAsB;AAC7F,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIL,eAAS,KAAK,CAAA;AAE5C,EAAAE,gBAAU,MAAM;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,kBAAA,GAAqBI,cAAQ,MAAM;AACvC,IAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AAExB,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,IAAA,uBAAOH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,sBAAY,QAAA,EAAS,CAAA;AAAA,EAC3D;AAEA,EAAA,uBACEA,cAAAA,CAACI,cAAA,EAAA,EAAS,QAAA,kBAAUJ,eAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,QAAA,IAAY,QAAA,EAAS,GACpE,QAAA,kBAAAA,cAAAA,CAAC,iBAAc,UAAA,EAAY,kBAAA,EAAqB,UAAS,CAAA,EAC3D,CAAA;AAEJ;ACjBA,IAAM,cAAA,GAAiBN,oBAA0C,IAAI,CAAA;AAE9D,SAAS,UAAA,GAAkC;AAChD,EAAA,MAAM,OAAA,GAAUC,iBAAW,cAAc,CAAA;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,OAAA;AACT;AAqBO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,IAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,SAAA,EAAW,WAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,uBACEK,cAAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EAAO,cAC9B,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,aAAA;AAAA,QACA,0CAAA;AAAA,QACA,SAAS,MAAA,IAAU,kBAAA;AAAA,QACnB;AAAA,OACF;AAAA,MACA,mBAAA,EAAmB,QAAQ,IAAI,CAAA;AAAA,MAC/B,iBAAA,EAAiB,EAAA;AAAA,MAEhB;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAeO,SAAS,aAAA,CAAc,EAAE,GAAA,EAAK,QAAA,EAAU,WAAU,EAAuB;AAC9E,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,EAAW;AAG5B,EAAA,MAAM,kBAAkB,IAAA,KAAS,MAAA,GAAS,GAAA,GAAM,IAAA,KAAS,cAAc,GAAA,GAAM,GAAA;AAC7E,EAAA,MAAM,kBAAkB,QAAA,IAAY,eAAA;AAGpC,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,IAAA,EAAM,iDAAA;AAAA,IACN,SAAA,EAAW,wCAAA;AAAA,IACX,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kCAAA;AAAA,QACA,uEAAA;AAAA,QACA,+CAAA;AAAA,QACA,iDAAA;AAAA,QACA,IAAA,KAAS,cAAc,YAAA,GAAe,wDAAA;AAAA,QACtC;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,eAAA,EAAiB,UAAA,CAAW,IAAI,CAAA,EAAE;AAAA,MAE1C,gCACCA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,GAAA,EAAK,GAAG,IAAI,CAAA,OAAA,CAAA;AAAA,UACZ,SAAA,EAAU;AAAA;AAAA,OACZ,GAEA;AAAA;AAAA,GAEJ;AAEJ;AAaO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,SAAA,EAAU,EAAwB;AAC3E,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,EAAW;AAG5B,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,IAAA,EAAM,EAAA;AAAA,MACJ,iCAAA;AAAA,MACA,qCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,sCAAA;AAAA,MACA,wDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ,EAAA;AAAA,MACN,0CAAA;AAAA,MACA,oDAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,qBAAA;AAAA,QACA,gBAAA;AAAA,QACA,wCAAA;AAAA,QACA,+CAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAW,IAAI,CAAA;AAAA,QACf,SAAS,MAAA,IAAU,eAAA;AAAA,QACnB,SAAS,WAAA,IAAe,eAAA;AAAA,QACxB;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAiBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,sBAAA;AAAA,QACA,uCAAA;AAAA,QACA,iBAAA;AAAA,QACA,WAAA,IAAe,eAAA;AAAA,QACf;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAA,cAAAA,CAAC,YAAA,EAAA,EAAa,UAAA,EAAyB,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA,GACjD;AAEJ;AAaO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,SAAA,EAAU,EAAwB;AAC3E,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,qBAAA;AAAA,QACA,8BAAA;AAAA,QACA,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAiBO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,oBAAA;AAAA,QACA,kBAAA;AAAA,QACA,oDAAA;AAAA,QACA,8DAAA;AAAA,QACA,gDAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,KAAA;AAAA,MACP,YAAA,EAAY,KAAA;AAAA,MAEX,QAAA,EAAA,IAAA,IAAQ;AAAA;AAAA,GACX;AAEJ;AAaO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAW,SAAA,EAAU,EAA0B;AAChF,EAAA,MAAM,OAAO,OAAO,SAAA,KAAc,WAAW,IAAI,IAAA,CAAK,SAAS,CAAA,GAAI,SAAA;AACnE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAW;AAAA,IACnD,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uBAAA;AAAA,QACA,qCAAA;AAAA,QACA,oDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;ACxUO,SAAS,gBAAgB,EAAE,MAAA,EAAQ,IAAA,GAAO,IAAA,EAAM,WAAU,EAAyB;AACxF,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,OAAA,EAAS,oBAAA;AAAA,IACT,OAAA,EAAS,oBAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,4BAAA;AAAA,QACA,YAAY,IAAI,CAAA;AAAA,QAChB,cAAc,MAAM,CAAA;AAAA,QACpB;AAAA;AACF;AAAA,GACF;AAEJ;ACzBO,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAU,EAAc;AAChD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,oBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,IAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,CAAA;AAAA,oBAC9CA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,IAAG,OAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,CAAA;AAAA,oBAClDA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,IAAG,OAAA,EAAQ,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,OAAA,EAAQ,CAAA;AAAA,oBAChDA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,IAAG,MAAA,EAAO,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,MAAA,EAAO;AAAA,GAAA,EAClD,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mDAAkD,CAAA,EAC5D,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAU,EAAc;AACxD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAiB,CAAA,EACpC,CAAA;AAEJ;AAEO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAiB,CAAA,EACpC,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAU,EAAc;AACxD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAS,MAAA,EAAO,mBAAkB,CAAA,EACrC,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAAc;AACtD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAS,MAAA,EAAO,mBAAkB,CAAA,EACrC,CAAA;AAEJ;AAMO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAAc;AACrD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA;AAAA,oBAClCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACxC,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4DAAA,EAA6D,CAAA;AAAA,oBACrEA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA;AAAA,oBAClCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACvC,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4DAAA,EAA6D,CAAA;AAAA,oBACrEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D;AAAA,GAAA,EACpE,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAAc;AACrD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4DAAA,EAA6D,CAAA;AAAA,oBACrEA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA;AAAA,oBAClCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACvC,CAAA;AAEJ;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAc;AACnD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,oBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ;AAAA,GAAA,EAC9C,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAc;AAClD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4FAAA,EAA6F;AAAA,GAAA,EACvG,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yBAAA,EAA0B,CAAA;AAAA,oBAClCA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA,GAAA,EACrB,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4JAA2J,CAAA,EACrK,CAAA;AAEJ;AAEO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAU,EAAc;AACzD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6EAAA,EAA8E,CAAA;AAAA,oBACtFA,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,oBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACxC,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB,CAAA;AAAA,oBACpCA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,eAAA,EAAgB;AAAA,GAAA,EACnC,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA;AAAA,oBACvDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D;AAAA,GAAA,EACpE,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAc;AAClD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAiB,CAAA,EACpC,CAAA;AAEJ;AAEO,SAAS,KAAA,CAAM,EAAE,SAAA,EAAU,EAAc;AAC9C,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACtC,CAAA;AAEJ;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAc;AACnD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,IAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,CAAA;AAAA,oBAC9CA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,IAAG,OAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,CAAA;AAAA,oBAClDA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,IAAG,OAAA,EAAQ,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,OAAA,EAAQ,CAAA;AAAA,oBAChDA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,IAAG,MAAA,EAAO,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,MAAA,EAAO;AAAA,GAAA,EAClD,CAAA;AAEJ;AAMO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EACzC,CAAA;AAEJ;AAEO,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAU,EAAc;AAC1D,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0FAAA,EAA2F,CAAA;AAAA,oBACnGA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EAC3C,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAU,EAAc;AACxD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EAC3C,CAAA;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAU,EAAc;AAChD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,QAAA,EAAS,CAAA;AAAA,oBACjBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU;AAAA,GAAA,EACpB,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAU,EAAc;AACxD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA,GAAA,EAC1B,CAAA;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAc;AACpD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACtC,CAAA;AAEJ;AAMO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,2BAAA,EAA4B;AAAA,GAAA,EAC9C,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAAc;AACtD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qHAAoH,CAAA,EAC9H,CAAA;AAEJ;AAEO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAAc;AACvD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,GAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI;AAAA,GAAA,EACzC,CAAA;AAEJ;AAEO,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAU,EAAc;AAC1D,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iEAAgE,CAAA,EAC1E,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAAc;AACrD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8DAAA,EAA+D,CAAA;AAAA,oBACvEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D,CAAA;AAAA,oBAClEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8DAAA,EAA+D;AAAA,GAAA,EACzE,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAc;AAClD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iJAAA,EAAkJ,CAAA;AAAA,oBAC1JA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kJAAA,EAAmJ;AAAA,GAAA,EAC7J,CAAA;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,SAAA,EAAU,EAAc;AAChD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,oBACpBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAChDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,SAAA,EAAU,CAAA;AAAA,oBAClBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA,GAAA,EACrB,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2CAAA,EAA4C,CAAA;AAAA,oBACpDA,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI;AAAA,GAAA,EAC/B,CAAA;AAEJ;AAMO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAc;AACnD,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EACjC,CAAA;AAEJ;AAEO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAAc;AACvD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,oBACpBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,oBACpBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe,CAAA;AAAA,oBACvBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,CAAA;AAAA,oBACxBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA,GAAA,EAC1B,CAAA;AAEJ;AAEO,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAU,EAAc;AAC1D,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA;AAAA,oBACrDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0EAAA,EAA2E,CAAA;AAAA,oBACnFA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW,CAAA;AAAA,oBACnBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,oBACpBA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY;AAAA,GAAA,EACtB,CAAA;AAEJ;AAMO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAc;AAClD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB;AAAA,GAAA,EACtC,CAAA;AAEJ;AAMO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAc;AACpD,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+BAA8B,CAAA,EACxC,CAAA;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAc;AAClD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACtC,CAAA;AAEJ;AAMO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAAc;AACvD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sDAAA,EAAuD,CAAA;AAAA,oBAC/DA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4BAAA,EAA6B,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACvC,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAU,EAAc;AACjD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gDAAA,EAAiD,CAAA;AAAA,oBACzDA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,uBAAA,EAAwB;AAAA,GAAA,EAC3C,CAAA;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAc;AACpD,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBACrCA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,iBAAA,EAAkB;AAAA,GAAA,EACrC,CAAA;AAEJ;AC5bO,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,SAAA,GAAY,GAAA;AAAA,EACZ,QAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,EAAA,IAAM,SAAS,MAAA,GAAS,GAAA;AAEtD,EAAA,MAAM,UAAA,GAAaC,kBAAY,YAAY;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,QAAQ,CAAA;AAC5C,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,4DAAA,EAA8D,SAAS,CAAA,EAExF,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qGAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACb,sBAAY,MAAA,EACf,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,oFAAA;AAAA,UAET,QAAA,EAAA,MAAA,mBACCC,eAAAA,CAAAI,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAL,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,4BACnCA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,SAAA,EAAO;AAAA,WAAA,EACf,CAAA,mBAEAC,eAAAA,CAAAI,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAL,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,4BAClCA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,WAAA,EACZ;AAAA;AAAA;AAEJ,KAAA,EACF,CAAA;AAAA,oBACAA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,iGAAA;AAAA,UACA,CAAC,YAAY,MAAA,IAAU;AAAA,SACzB;AAAA,QACA,OAAO,CAAC,QAAA,IAAY,MAAA,GAAS,EAAE,WAAU,GAAI,MAAA;AAAA,QAC7C,eAAA,EAAe,QAAA;AAAA,QAEd,QAAA,EAAA,eAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBAChBC,eAAAA,CAAC,MAAA,EAAA,EAAa,WAAU,OAAA,EACtB,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAAA,EACb,cAAI,CAAA,EACP,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAiB,QAAA,EAAA,IAAA,EAAK;AAAA,SAAA,EAAA,EAJ7B,CAKX,CACD,CAAA,EACH,CAAA,mBAEAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAS;AAAA;AAAA,KAE9C;AAAA,IACC,MAAA,IAAU,CAAC,QAAA,oBACVA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,WAAA,CAAY,IAAI,CAAA;AAAA,QAC/B,SAAA,EAAU,mGAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED,EACF,CAAA;AAAA,IAED,MAAA,IAAU,4BACTA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA;AAAA,QAChC,SAAA,EAAU,wGAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EAEJ,CAAA;AAEJ;ACjGO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,SAAA,EAAW,WAAU,EAAqB;AAC7E,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC,CAAA;AAC/C,EAAA,uBACEA,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAsB,WAC9B,QAAA,EAAA,SAAA,EACH,CAAA;AAEJ;ACmBA,IAAM,WAAA,GAAcN,oBAAuC,IAAI,CAAA;AAExD,SAAS,OAAA,GAA4B;AAC1C,EAAA,MAAM,OAAA,GAAUC,iBAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,OAAA;AACT;AAiBO,SAAS,IAAA,CAAK;AAAA,EACnB,cAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA,GAAkB;AACpB,CAAA,EAAc;AACZ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIE,eAAS,eAAe,CAAA;AAE5D,EAAA,MAAM,iBAAiB,MAAM,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAE1D,EAAA,MAAM,YAAA,GAAiC;AAAA,IACrC,cAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,KAAU,QAAA,GAAW,SAAA,GAAY,SAAA;AAC/D,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,eAAe,MAAA,IACf,OAAO,eAAe,MAAA,KAAW,QAAA,IACjC,WAAY,cAAA,CAAe;AAAA,GAC7B;AAEA,EAAA,uBACEG,cAAAA,CAAC,WAAA,CAAY,UAAZ,EAAqB,KAAA,EAAO,cAC3B,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,UAAA;AAAA,QACA,uCAAA;AAAA,QACA,0DAAA;AAAA,QACA,yDAAA;AAAA,QACA,iBAAA;AAAA,QACA,WAAW,SAAA,IAAa,yBAAA;AAAA,QACxB,aAAA,IAAiB,mBAAA;AAAA,QACjB;AAAA,OACF;AAAA,MACA,kBAAgB,cAAA,CAAe,QAAA;AAAA,MAC/B,mBAAiB,cAAA,CAAe,KAAA;AAAA,MAE/B,QAAA,EAAA,QAAA,oBACCC,eAAAA,CAAAI,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAL,eAAC,UAAA,EAAA,EAAW,CAAA;AAAA,QACX,UAAA,oBACCC,eAAAA,CAAAI,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAL,eAAC,SAAA,EAAA,EAAU,CAAA;AAAA,0BACXA,eAAC,UAAA,EAAA,EAAW;AAAA,SAAA,EACd;AAAA,OAAA,EAEJ;AAAA;AAAA,GAEJ,EACF,CAAA;AAEJ;AAeO,SAAS,UAAA,CAAW;AAAA,EACzB,SAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,cAAA,EAAgB,UAAA,EAAY,cAAA,KAAmB,OAAA,EAAQ;AAE/D,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,KAAU,QAAA,GAAW,SAAA,GAAY,SAAA;AAC/D,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,cAAA,CAAe,QAAQ,CAAA;AAG5D,EAAA,MAAM,QAAA,GAAW,IAAA;AAEjB,EAAA,uBACEC,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,aAAa,cAAA,GAAiB,MAAA;AAAA,MACvC,SAAA,EAAW,EAAA;AAAA,QACT,iBAAA;AAAA,QACA,gCAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA,IAAc,wDAAA;AAAA,QACd;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAgB,IAAA,EAAK,IAAA,EAAK,CAAA;AAAA,QAG1C,QAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oDAAA,EACb,QAAA,EAAA,QAAA,EACH,CAAA,mBAEAA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oDAAA,EACd,QAAA,kBAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EACjE,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,qeAAA,EAAse,CAAA;AAAA,0BAC3iBA,cAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,kCAAA,EAAmC;AAAA,SAAA,EAC1G,CAAA,EACF,CAAA;AAAA,wBAIFA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,oBAAA;AAAA,cACA,qCAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAGAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qCAAA;AAAA,cACA,oDAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,IAAI,EAAE,MAAA,GAAS,CAAA,IACzC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,cAAA,CAAe,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA;AAAA,SACnD;AAAA,QAGC,8BACCA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4DAAA;AAAA,cACA,sBAAA;AAAA,cACA,UAAA,IAAc;AAAA,aAChB;AAAA,YACA,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AAaO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,SAAA,GAAY,KAAI,EAAmB;AACxE,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,OAAA,EAAQ;AAEnC,EAAA,IAAI,CAAC,eAAe,IAAA,IAAQ,MAAA,CAAO,KAAK,cAAA,CAAe,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACzE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,gBAAA;AAAA,QACA,mEAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBAC9CA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,YAEnB,QAAA,kBAAAA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,eAAe,IAAA,EAAM;AAAA;AAAA;AAC3C;AAAA;AAAA,GACF;AAEJ;AAaO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,SAAA,GAAY,KAAI,EAAoB;AAC1E,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,OAAA,EAAQ;AAEnC,EAAA,IAAI,cAAA,CAAe,KAAA,KAAU,QAAA,IAAY,CAAC,eAAe,MAAA,EAAQ;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAS,cAAA,CAAe,MAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,OAAO,MAAA,KAAW,QAAA;AACnC,EAAA,MAAM,UAAU,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,QACvD,OAAA,IAAY,MAAA;AAEd,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,iBAAA;AAAA,QACA,mEAAA;AAAA,QACA,OAAA,IAAW,cAAA;AAAA,QACX;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,yBAAA;AAAA,cACA,OAAA,IAAW;AAAA,aACb;AAAA,YAEC,oBAAU,OAAA,GAAU;AAAA;AAAA,SACvB;AAAA,wBACAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,mBAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,YAElB,QAAA,EAAA,QAAA,mBACCA,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,SAAA,GAAY,EAAA,EAC/B,QAAA,EAAA,MAAA,EACH,CAAA,mBAEAA,cAAAA,CAAC,WAAA,EAAA,EAAY,OAAO,MAAA,EAAQ;AAAA;AAAA;AAEhC;AAAA;AAAA,GACF;AAEJ;AAeO,SAAS,QAAA,CAAS;AAAA,EACvB,eAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA,GAAkB;AACpB,CAAA,EAAkB;AAChB,EAAA,IAAI,CAAC,eAAA,IAAmB,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,eAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,GAAA,qBACpBA,cAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,cAAA,EAAgB,GAAA;AAAA,UAChB;AAAA,SAAA;AAAA,QAFK,GAAA,CAAI;AAAA,OAIZ;AAAA;AAAA,GACH;AAEJ;AC5TA,IAAM,gBAAA,GAAmBN,oBAA4C,IAAI,CAAA;AAElE,SAAS,YAAA,GAAsC;AACpD,EAAA,MAAM,OAAA,GAAUC,iBAAW,gBAAgB,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,OAAA;AACT;AAqBO,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,SAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,YAAA,GAAe,IAAA;AAAA,EACf,eAAA,GAAkB;AACpB,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,eAAe,CAAA;AACxD,EAAA,MAAM,YAAA,GAAeD,aAAsB,IAAI,CAAA;AAC/C,EAAA,MAAM,WAAA,GAAcA,aAA8C,IAAI,CAAA;AAGtE,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAGhC,MAAA,WAAA,CAAY,OAAA,GAAU,YAAY,MAAM;AACtC,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,WAAA,CAAY,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,KAAQ,YAAA,CAAa,OAAA,IAAW,GAAI,CAAC,CAAA;AAAA,QACpE;AAAA,MACF,GAAG,GAAI,CAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,aAAA,CAAc,YAAY,OAAO,CAAA;AACjC,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAU,CAAC,CAAA;AAG5B,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,YAAA,IAAgB,YAAA,CAAa,OAAA,EAAS;AAExD,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB,GAAG,GAAG,CAAA;AAEN,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,aAAA,CAAc,YAAY,OAAO,CAAA;AACjC,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,MACxB;AAEA,MAAA,OAAO,MAAM,aAAa,OAAO,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAE9B,EAAA,MAAM,YAAA,GAAsC;AAAA,IAC1C,MAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,cAAAA,CAAC,gBAAA,CAAiB,UAAjB,EAA0B,KAAA,EAAO,cAChC,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,eAAA;AAAA,QACA,uCAAA;AAAA,QACA,QAAA;AAAA,QACA,cACI,4GAAA,GACA,wFAAA;AAAA,QACJ,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,0BAAA,EAA0B,WAAA;AAAA,MAC1B,qBAAA,EAAqB,MAAA;AAAA,MAEpB;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAeO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,SAAA;AAAA,EACA,KAAA,GAAQ,UAAA;AAAA,EACR,YAAA,GAAe;AACjB,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAa,QAAA,KAAa,YAAA,EAAa;AAElE,EAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,KAA4B;AAClD,IAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,IAAA,MAAM,mBAAmB,OAAA,GAAU,EAAA;AACnC,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAA,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,uBACEC,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,MAChC,SAAA,EAAW,EAAA;AAAA,QACT,uBAAA;AAAA,QACA,gCAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,wDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,0CAAA;AAAA,cACA,WAAA,IAAe;AAAA,aACjB;AAAA,YAEC,wCACCC,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,sCAAA;AAAA,gBACV,IAAA,EAAK,MAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBAER,QAAA,EAAA;AAAA,kCAAAD,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,YAAA;AAAA,sBACV,EAAA,EAAG,IAAA;AAAA,sBACH,EAAA,EAAG,IAAA;AAAA,sBACH,CAAA,EAAE,IAAA;AAAA,sBACF,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAY;AAAA;AAAA,mBACd;AAAA,kCACAA,cAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,YAAA;AAAA,sBACV,IAAA,EAAK,cAAA;AAAA,sBACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,gCAGFA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yBAAA;AAAA,gBACV,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,cAAA;AAAA,gBACP,OAAA,EAAQ,WAAA;AAAA,gBAER,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAc,OAAA;AAAA,oBACd,cAAA,EAAe,OAAA;AAAA,oBACf,WAAA,EAAa,CAAA;AAAA,oBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA,SAEJ;AAAA,wBAGAC,eAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,oBAAA;AAAA,cACA,qCAAA;AAAA,cACA,cACI,kDAAA,GACA;AAAA,aACN;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,KAAA;AAAA,cACA,WAAA,IAAe;AAAA;AAAA;AAAA,SAClB;AAAA,QAGC,YAAA,IAAgB,QAAA,GAAW,CAAA,oBAC1BD,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qCAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,yBAAe,QAAQ;AAAA;AAAA,SAC1B;AAAA,wBAIFA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4DAAA;AAAA,cACA,sBAAA;AAAA,cACA,MAAA,IAAU;AAAA,aACZ;AAAA,YACA,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAeO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,YAAA,EAAa;AAE7C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uBAAA;AAAA,QACA,mEAAA;AAAA,QACA,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT,mBAAA;AAAA,YACA,qCAAA;AAAA,YACA,wDAAA;AAAA,YACA,+BAAA;AAAA,YACA,WAAA,IAAe;AAAA,WACjB;AAAA,UACA,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,UAElB;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;AAeO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA,GAAW,IAAA;AAAA,EACX,KAAA,GAAQ,UAAA;AAAA,EACR;AACF,CAAA,EAA2B;AACzB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,wBAAA;AAAA,QACA,yBAAA;AAAA,QACA,WAAA;AAAA,QACA,qCAAA;AAAA,QACA,kDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EACd,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,UAAK,SAAA,EAAU,oDAAA,EAAqD,OAAO,EAAE,cAAA,EAAgB,OAAM,EAAG,CAAA;AAAA,0BACvGA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAqD,KAAA,EAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,CAAA;AAAA,0BACzGA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAqD,KAAA,EAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG;AAAA,SAAA,EAC3G,CAAA;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACf;AAEJ;AC1UA,IAAM,WAAA,GAAcN,oBAAuC,IAAI,CAAA;AAExD,SAAS,OAAA,GAA4B;AAC1C,EAAA,MAAM,OAAA,GAAUC,iBAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,OAAA;AACT;AAeO,SAAS,IAAA,CAAK;AAAA,EACnB,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,EAAc;AACZ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,eAAS,WAAW,CAAA;AAEhD,EAAA,MAAM,YAAA,GAAiC;AAAA,IACrC,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEG,cAAAA,CAAC,WAAA,CAAY,UAAZ,EAAqB,KAAA,EAAO,cAC3B,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,UAAA;AAAA,QACA,uCAAA;AAAA,QACA,0DAAA;AAAA,QACA,sCAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAaO,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,SAAA,EAAU,EAAqB;AACrE,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,OAAA,EAAQ;AAEtC,EAAA,uBACEC,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,MAChC,SAAA,EAAW,EAAA;AAAA,QACT,kBAAA;AAAA,QACA,gCAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,wDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,4DAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA,SACF;AAAA,wBAGAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,oBAAA;AAAA,cACA,qCAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC;AAAA;AAAA,SACH;AAAA,wBAGAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4DAAA;AAAA,cACA,sBAAA;AAAA,cACA,MAAA,IAAU;AAAA,aACZ;AAAA,YACA,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YAER,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBACf,WAAA,EAAa,CAAA;AAAA,gBACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAaO,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,SAAA,EAAU,EAAqB;AACrE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,OAAA,EAAQ;AAE3B,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kBAAA;AAAA,QACA,mEAAA;AAAA,QACA,uBAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACZ,QAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAiBO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,WAAA,GAA6C;AAAA,IACjD,yBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4DAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAQ,WAAA;AAAA,QAER,QAAA,kBAAAA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,WAAA,EAAa,CAAA,EAAG;AAAA;AAAA,KACjD;AAAA,IAEF,6BACEC,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,sCAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,OAAA,EAAQ,WAAA;AAAA,QAER,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,YAAA;AAAA,cACV,EAAA,EAAG,IAAA;AAAA,cACH,EAAA,EAAG,IAAA;AAAA,cACH,CAAA,EAAE,IAAA;AAAA,cACF,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,YAAA;AAAA,cACV,IAAA,EAAK,cAAA;AAAA,cACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,KACF;AAAA,IAEF,2BACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0CAAA;AAAA,QACV,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAQ,WAAA;AAAA,QAER,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YACf,WAAA,EAAa,CAAA;AAAA,YACb,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AACF,GAEJ;AAEA,EAAA,MAAM,YAAA,GAA2C;AAAA,IAC/C,OAAA,EAAS,oDAAA;AAAA,IACT,WAAA,EAAa,sDAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,eAAA;AAAA,QACA,yBAAA;AAAA,QACA,wBAAA;AAAA,QACA,WAAW,aAAA,IAAiB,kBAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MACA,kBAAA,EAAkB,MAAA;AAAA,MAGjB,QAAA,EAAA;AAAA,QAAA,WAAA,CAAY,MAAM,CAAA;AAAA,wBAGnBD,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,QAAA;AAAA,cACA,qCAAA;AAAA,cACA,aAAa,MAAM;AAAA,aACrB;AAAA,YAEC,QAAA,EAAA,MAAA,KAAW,aAAA,IAAiB,UAAA,GAAa,UAAA,GAAa;AAAA;AAAA;AACzD;AAAA;AAAA,GACF;AAEJ;AAiBO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,SAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAChE,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,EAAA,MAAM,YAAA,GAAe,KAAA,IAAS,CAAA,OAAA,EAAU,SAAS,IAAI,KAAK,CAAA,CAAA,CAAA;AAE1D,EAAA,uBACEC,eAAAA,CAAC,IAAA,EAAA,EAAK,WAAA,EAA0B,SAAA,EAC9B,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,eAAa,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,oBAC3BA,eAAC,WAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,0BAChBA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,YAAY,IAAA,CAAK,UAAA;AAAA,QAEhB,QAAA,EAAA,IAAA,CAAK;AAAA,OAAA;AAAA,MAJD;AAAA,KAMR,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACjTA,IAAM,iBAAA,GAAoBN,oBAA6C,IAAI,CAAA;AAEpE,SAAS,aAAA,GAAwC;AACtD,EAAA,MAAM,OAAA,GAAUC,iBAAW,iBAAiB,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,OAAA;AACT;AAgCO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,MAAA,GAAS,QAAA;AAAA,EACT;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,YAAA,GAAuC;AAAA,IAC3C,IAAA,EAAM,sDAAA;AAAA,IACN,MAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,uBACEK,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,iBAAA;AAAA,QACA,aAAa,MAAM,CAAA;AAAA,QACnB;AAAA,OACF;AAAA,MACA,aAAA,EAAa,MAAA;AAAA,MAEZ;AAAA;AAAA,GACH;AAEJ;AAmBO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,YAAA,GAAuC;AAAA,IAC3C,IAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEA,cAAAA,CAAC,iBAAA,CAAkB,UAAlB,EAA2B,KAAA,EAAO,cACjC,QAAA,kBAAAA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,+BAAA;AAAA,QACA,yCAAA;AAAA,QACA,0DAAA;AAAA,QACA,0CAAA;AAAA,QACA,iBAAA;AAAA,QACA,kEAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,kBAAgB,IAAA,CAAK,IAAA;AAAA,MAEpB,QAAA,EAAA,QAAA,oBACCC,eAAAA,CAAAI,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAL,eAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,wBACnBA,eAAC,cAAA,EAAA,EAAe,CAAA;AAAA,QACf,SAAA,oBAAaA,cAAAA,CAAC,gBAAA,EAAA,EAAiB;AAAA,OAAA,EAClC;AAAA;AAAA,GAEJ,EACF,CAAA;AAEJ;AAaO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAA2B;AACzB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,aAAA,EAAc;AAE/B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,KAAA,IAAS,IAAA,GAAO,IAAA,CAAK,GAAA,GAAO,QAAA,IAAY,IAAA,GAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,QAAA,EAAW,IAAA,CAAK,MAAM,CAAA,CAAA,GAAK,MAAA;AAEvG,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,uBACEA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,wBAAA;AAAA,UACA,oCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAEhB,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,GAAA;AAAA,YACL,KAAK,IAAA,CAAK,IAAA;AAAA,YACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,KACF;AAAA,EAEJ;AAGA,EAAA,MAAM,cAAc,MAAiB;AACnC,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7B,MAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EACjE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,WAAA,EAAa,GAAA,EAAK,CAAA,EAAE,4GAAA,EAA6G,CAAA;AAAA,wBACpLA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAI,CAAA,EAAE,IAAA,EAAK,QAAA,EAAS,GAAA,EAAI,MAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO,UAAA,EAAW,QAAO,QAAA,EAAA,KAAA,EAAG;AAAA,OAAA,EACzF,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,IAAA,CAAK,KAAK,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5D,MAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EACjE,0BAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,GAAA,EAAK,CAAA,EAAE,sHAAA,EAAuH,CAAA,EAChM,CAAA;AAAA,IAEJ;AACA,IAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EACjE,0BAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,GAAA,EAAK,CAAA,EAAE,4GAAA,EAA6G,CAAA,EACtL,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,wBAAA;AAAA,QACA,yCAAA;AAAA,QACA,sCAAA;AAAA,QACA,oDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,MAEf,QAAA,EAAA,WAAA;AAAY;AAAA,GACf;AAEJ;AAaO,SAAS,cAAA,CAAe;AAAA,EAC7B,SAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,aAAA,EAAc;AAE/B,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,qBAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qCAAA;AAAA,cACA,sDAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,OAAO,IAAA,CAAK,IAAA;AAAA,YAEX,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,SACR;AAAA,QACC,4BACCA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qCAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA,cAAA,CAAe,KAAK,IAAI;AAAA;AAAA;AAC3B;AAAA;AAAA,GAEJ;AAEJ;AAWO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAU,EAA0B;AACrE,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,aAAA,EAAc;AAE9C,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,EAAU,OAAO,IAAA;AAEpC,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,uBAAA;AAAA,QACA,wBAAA;AAAA,QACA,sBAAA;AAAA,QACA,kCAAA;AAAA,QACA,2BAAA;AAAA,QACA,oCAAA;AAAA,QACA,mCAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,YAAA,EAAW,mBAAA;AAAA,MAEX,QAAA,kBAAAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EACjE,0BAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,sBAAA,EAAuB,CAAA,EAC9F;AAAA;AAAA,GACF;AAEJ;AAiBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAE7C,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,uDAAA;AAAA,QACA,sBAAA;AAAA,QACA,0CAAA;AAAA,QACA,0DAAA;AAAA,QACA,qCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAGC,QAAA,EAAA;AAAA,QAAA,OAAA,mBACCD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAuC,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,OAAA,EAAQ,aAC9F,QAAA,kBAAAA,cAAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,2JAAA,EAA4J,CAAA,EACnO,oBAEAA,cAAAA,CAAC,SAAI,SAAA,EAAU,sCAAA,EAAuC,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,OAAA,EAAQ,WAAA,EAC9F,0BAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,4GAAA,EAA6G,CAAA,EACpL,CAAA;AAAA,wBAIFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EACb,eAAK,IAAA,EACR,CAAA;AAAA,wBAGAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCACb,QAAA,EAAA,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAC3B,CAAA;AAAA,QAGC,SAAA,IAAa,4BACZA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,QAAA,EAAS;AAAA,YACX,CAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,qCAAA;AAAA,cACA,sCAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,YAAA,EAAW,QAAA;AAAA,YAEX,QAAA,kBAAAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,WAAA,EACjE,0BAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,sBAAA,EAAuB,CAAA,EAC9F;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;ACrXO,SAAS,OAAA,CAAQ;AAAA,EACtB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAiB;AACf,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,aAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,SAAA;AAAA,MAEV,QAAA,EAAA,QAAA,oBACCC,eAAAA,CAAAI,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAL,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,MAAA,EAAO,CAAA;AAAA,wBAC1BA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,KAAA,EAAM,CAAA;AAAA,wBACzBA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,KAAA,EAAM;AAAA,OAAA,EAC3B;AAAA;AAAA,GAEJ;AAEJ;AAeO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA,GAAQ,MAAA;AAAA,EACR,MAAA,GAAS,EAAA;AAAA,EACT;AACF,CAAA,EAAqB;AACnB,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kBAAA;AAAA,QACA,YAAA;AAAA,QACA,uDAAA;AAAA,QACA,uBAAA;AAAA,QACA,6CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,KAAA;AAAA,QAClD;AAAA;AACF;AAAA,GACF;AAEJ;AAiBO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA,GAAQ,MAAA;AAAA,EACR,MAAA,GAAS,GAAA;AAAA,EACT,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,aAAA,GAAwC;AAAA,IAC5C,IAAA,EAAM,cAAA;AAAA,IACN,EAAA,EAAI,YAAA;AAAA,IACJ,EAAA,EAAI,YAAA;AAAA,IACJ,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,mBAAA;AAAA,QACA,cAAc,OAAO,CAAA;AAAA,QACrB,uDAAA;AAAA,QACA,uBAAA;AAAA,QACA,6CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,KAAA;AAAA,QAClD;AAAA;AACF;AAAA,GACF;AAEJ;AAaO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA,GAAQ,EAAA;AAAA,EACR;AACF,CAAA,EAAqB;AACnB,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,+BAAA;AAAA,QACA,SAAA;AAAA,QACA,uDAAA;AAAA,QACA,uBAAA;AAAA,QACA,6CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,QACf,MAAA,EAAQ,KAAA;AAAA,QACR,aAAA,EAAe;AAAA;AACjB;AAAA,GACF;AAEJ;AAaO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,aAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,MAAM,SAAA,GAAoC;AAAA,IACxC,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,OAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,2CAAA;AAAA,QACA,UAAU,IAAI,CAAA;AAAA,QACd;AAAA,OACF;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,SAAA;AAAA,MAEV,QAAA,EAAA,CAAC,GAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,sBACdA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,EAAA;AAAA,YACT,WAAW,IAAI,CAAA;AAAA,YACf,cAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,OAAO,EAAE,cAAA,EAAgB,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,CAAA;AAAK,SAAA;AAAA,QAPnC;AAAA,OASR;AAAA;AAAA,GACH;AAEJ;AAaO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kCAAA;AAAA,QACA,WAAW,IAAI,CAAA;AAAA,QACf;AAAA,OACF;AAAA,MACA,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,SAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,EAAA,EAAG,IAAA;AAAA,YACH,EAAA,EAAG,IAAA;AAAA,YACH,CAAA,EAAE,IAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,IAAA,EAAK,cAAA;AAAA,YACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,GACF;AAEJ;AAaO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA,GAAO,WAAA;AAAA,EACP;AACF,CAAA,EAAwB;AACtB,EAAA,uBACEC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,gCAAA;AAAA,QACA,SAAS,MAAA,IAAU,kBAAA;AAAA,QACnB;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAA;AAAA,YACP,MAAA,EAAQ,EAAA;AAAA,YACR,OAAA,EAAQ;AAAA;AAAA,SACV;AAAA,wBAGAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,MAAA,EAAO,QAAQ,EAAA,EAAI,CAAA;AAAA,0BACtCA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,KAAA,EAAM,QAAQ,EAAA,EAAI,CAAA;AAAA,0BACrCA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,KAAA,EAAM,QAAQ,EAAA,EAAI;AAAA,SAAA,EACvC;AAAA;AAAA;AAAA,GACF;AAEJ;AC/SA,SAAS,aAAa,KAAA,EAAiB;AACrC,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,IAC3C,KAAK,MAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,IACpD,KAAK,OAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,IAClD,KAAK,OAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA;AAE9C;AAEA,SAAS,cAAc,KAAA,EAAiB;AACtC,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,eAAA;AAAA;AAEb;AAEA,SAAS,gBAAgB,KAAA,EAAiB;AACxC,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,kBAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,YAAA;AAAA;AAEb;AAEA,SAAS,iBAAiB,QAAA,EAAuB;AAC/C,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA;AAEb;AAUA,SAAS,WAAA,CAAY,EAAE,GAAA,EAAI,EAAqB;AAC9C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,IAAQ,MAAA,CAAO,KAAK,GAAA,CAAI,IAAI,EAAE,MAAA,GAAS,CAAA;AAE3D,EAAA,uBACEI,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,oDAAA;AAAA,QACA,eAAA,CAAgB,IAAI,KAAK;AAAA,OAC3B;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,OAAA,IAAW,gBAAgB,CAAA;AAAA,YACnE,OAAA,EAAS,MAAM,OAAA,IAAW,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,YAGnD,QAAA,EAAA;AAAA,8BAAAD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EAAA,OAAA,KACE,6BACCA,cAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,yBAAwB,CAAA,mBAEnDA,eAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,yBAAwB,CAAA,CAAA,EAE1D,CAAA;AAAA,8BAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,sBAAA,EAAwB,aAAA,CAAc,GAAA,CAAI,KAAK,CAAC,CAAA,EAChE,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EACzB,CAAA;AAAA,8BAGAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDACb,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,EAChC,CAAA;AAAA,8BAGAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qFACb,QAAA,EAAA,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAChC,CAAA;AAAA,8BAGAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACb,cAAI,OAAA,EACP;AAAA;AAAA;AAAA,SACF;AAAA,QAGC,cAAc,OAAA,oBACbA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CACb,QAAA,kBAAAA,cAAAA,CAAC,SAAI,SAAA,EAAU,qEAAA,EACZ,eAAK,SAAA,CAAU,GAAA,CAAI,MAAM,IAAA,EAAM,CAAC,GACnC,CAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AA8BO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,SAAA;AAAA,EACA,gBAAA,GAAmB,IAAA;AAAA,EACnB,SAAA,GAAY,GAAA;AAAA,EACZ;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIH,eAAS,gBAAgB,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,CAAE,MAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA,CAAE,MAAA;AAEzD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,CAAC,SAAA,EAAW;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEI,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,+DAAA;AAAA,QACA;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAC,WAAW,CAAA;AAAA,YAC1C,SAAA,EAAU,uFAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,gCAChDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAqC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,gCAC3DC,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBAAE,IAAA,CAAK,MAAA;AAAA,kBAAO;AAAA,iBAAA,EAAC,CAAA;AAAA,gBACtD,aAAa,CAAA,oBACZA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,sEAAA,EACb,QAAA,EAAA;AAAA,kBAAA,UAAA;AAAA,kBAAW,QAAA;AAAA,kBAAO,UAAA,GAAa,IAAI,GAAA,GAAM;AAAA,iBAAA,EAC5C,CAAA;AAAA,gBAED,YAAY,CAAA,oBACXA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4EAAA,EACb,QAAA,EAAA;AAAA,kBAAA,SAAA;AAAA,kBAAU,UAAA;AAAA,kBAAS,SAAA,GAAY,IAAI,GAAA,GAAM;AAAA,iBAAA,EAC5C,CAAA;AAAA,gBAED,6BACCD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAsC,QAAA,EAAA,YAAA,EAEtD;AAAA,eAAA,EAEJ,CAAA;AAAA,cACC,WAAA,mBACCA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,uBAAA,EAAwB,CAAA,mBAEpDA,cAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,uBAAA,EAAwB;AAAA;AAAA;AAAA,SAEvD;AAAA,QAGC,CAAC,+BACAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,0CAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,YAElB,QAAA,EAAA,IAAA,CAAK,MAAA,KAAW,CAAA,mBACfA,cAAAA,CAAC,SAAI,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,aAAA,EAE7D,CAAA,GAEA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACbA,cAAAA,CAAC,WAAA,EAAA,EAA8C,GAAA,EAAA,EAA7B,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAc,CAC1D;AAAA;AAAA;AAEL;AAAA;AAAA,GAEJ;AAEJ;ACvMO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA,GAAmB,IAAA;AAAA,EACnB,SAAA;AAAA,EACA,KAAA,GAAQ,uBAAA;AAAA,EACR,UAAA,GAAa;AACf,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,cAAAA,CAAS,CAAC,gBAAgB,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,OAAO,EAAE,MAAA,GAAS,CAAA;AAEjD,EAAA,MAAM,eAAA,GAAkBC,kBAAY,MAAM;AACxC,IAAA,MAAM,GAAA,GAAM,UAAU,IAAA,EAAK;AAC3B,IAAA,MAAM,GAAA,GAAM,YAAY,IAAA,EAAK;AAC7B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,QAAA,CAAS,EAAE,GAAG,OAAA,EAAS,CAAC,GAAG,GAAG,KAAK,CAAA;AACnC,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,QAAQ,CAAC,CAAA;AAE9C,EAAA,MAAM,kBAAA,GAAqBA,iBAAAA;AAAA,IACzB,CAAC,GAAA,KAAgB;AACf,MAAA,MAAM,UAAA,GAAa,EAAE,GAAG,OAAA,EAAQ;AAChC,MAAA,OAAO,WAAW,GAAG,CAAA;AACrB,MAAA,QAAA,CAAS,UAAU,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,GACpB;AAEA,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA;AAAA,IACvB,CAAC,CAAA,KAAuC;AACtC,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,eAAA,EAAgB;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,uBACEG,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA,EAEhD,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,QACpC,SAAA,EAAU,qBAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,4BAAA;AAAA,cACN,SAAA,EAAW,EAAA,CAAG,sBAAA,EAAwB,QAAA,IAAY,+BAA+B,CAAA;AAAA,cACjF,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,cAAA;AAAA,cAEL,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,QAAA,EAAS,SAAA;AAAA,kBACT,CAAA,EAAE,oHAAA;AAAA,kBACF,QAAA,EAAS;AAAA;AAAA;AACX;AAAA,WACF;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAsB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC3C,UAAA,IAAc,CAAC,QAAA,oBACdA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,EAAO;AAAA;AAAA;AAAA,KAEtE;AAAA,IAGC,QAAA,oBACCC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EAEZ,QAAA,EAAA;AAAA,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,qBACrCA,eAAAA,CAAC,KAAA,EAAA,EAAc,WAAU,mBAAA,EACvB,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,wBACxCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAsB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACvCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,iBAAO,SAAA,EAAU,CAAA;AAAA,wBACvDA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,kBAAA,CAAmB,GAAG,CAAA;AAAA,YACrC,SAAA,EAAU,qBAAA;AAAA,YACV,KAAA,EAAM,iBAAA;AAAA,YAEN,QAAA,kBAAAA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,4BAAA;AAAA,gBACN,SAAA,EAAU,SAAA;AAAA,gBACV,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,cAAA;AAAA,gBAEL,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,QAAA,EAAS,SAAA;AAAA,oBACT,CAAA,EAAE,oMAAA;AAAA,oBACF,QAAA,EAAS;AAAA;AAAA;AACX;AAAA;AACF;AAAA;AACF,OAAA,EAAA,EAtBQ,GAuBV,CACD,CAAA;AAAA,sBAGDC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,SAAA;AAAA,YACP,QAAA,EAAU,CAAC,CAAA,KACT,YAAA,CAAa,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA;AAAA,YAEtE,SAAA,EAAW,gBAAA;AAAA,YACX,WAAA,EAAY,KAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAsB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACvCA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,SAAA,EAAW,gBAAA;AAAA,YACX,WAAA,EAAY,OAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,eAAA;AAAA,YACT,QAAA,EAAU,CAAC,SAAA,CAAU,IAAA,EAAK;AAAA,YAC1B,SAAA,EAAU,yBAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,MAEC,8BAAcA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAuB,QAAA,EAAA,UAAA,EAAW;AAAA,KAAA,EAChE;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACpJO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,QAAA,EAAU,WAAU,EAAqB;AAC9E,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,iBAAA,EAAmB,SAAS,GAAG,KAAA,EAAO;AAAA,IACvD,mBAAA,EAAqB;AAAA,GACvB,EACG,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,2BACZC,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AAAA,MAC9B,SAAA,EAAW,EAAA;AAAA,QACT,iDAAA;AAAA,QACA,mCAAA;AAAA,QACA,qEAAA;AAAA,QACA,mEAAA;AAAA,QACA,4CAAA;AAAA,QACA;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAK,SAAA,EAAW,EAAA;AAAA,UACf,kCAAA;AAAA,UACA,oDAAA;AAAA,UACA,kCAAA;AAAA,UACA,uBAAA;AAAA,UACA,uCAAA;AAAA,UACA;AAAA,SACF,EACG,iBAAO,EAAA,EACV,CAAA;AAAA,wBAGAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACZ,iBAAO,KAAA,EACV,CAAA;AAAA,UACC,MAAA,CAAO,+BACNA,cAAAA,CAAC,SAAI,SAAA,EAAU,uFAAA,EACZ,iBAAO,WAAA,EACV;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAGAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4CAAA;AAAA,cACA,kEAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,IAAA,EAAK,MAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAa,CAAA;AAAA,YAEb,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,GAAE,cAAA,EAAe;AAAA;AAAA;AACtE;AAAA,KAAA;AAAA,IAhDK,MAAA,CAAO;AAAA,GAkDf,CAAA,EACH,CAAA;AAEJ;AC5DO,SAAS,UAAA,CAAW,EAAE,UAAA,EAAY,SAAA,GAAY,WAAU,EAAoB;AACjF,EAAA,QAAQ,WAAW,MAAA;AAAQ,IACzB,KAAK,aAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAsB,CAAA;AAAA,IAC7C,KAAK,WAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAsB,CAAA;AAAA,IACzC,KAAK,WAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAsB,CAAA;AAAA,IACzC,KAAK,YAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAsB,CAAA;AAAA,IAC7C,KAAK,QAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAsB,CAAA;AAAA,IAC3C,KAAK,MAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAsB,CAAA;AAAA,IACjD,KAAK,WAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAsB,CAAA;AAAA,IAC1C,KAAK,YAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAsB,CAAA;AAAA,IAC3C,KAAK,UAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAsB,CAAA;AAAA,IACzC,KAAK,YAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAsB,CAAA;AAAA,IAC/C,KAAK,YAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAsB,CAAA;AAAA,IACxC,KAAK,cAAA;AAAA,IACL;AACE,MAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAsB,CAAA;AAAA;AAE7C;;;AC7BO,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,EAAA,EAAI,SAAA;AAAA,IACJ,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,0BAAA;AAAA,IACX,KAAA,EAAO,0BAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,0BAAA;AAAA,IACT,KAAA,EAAO,0BAAA;AAAA,IACP,MAAA,EAAQ,wBAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,wBAAA;AAAA,IACJ,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,EAAA,EAAI,2BAAA;AAAA,IACJ,MAAA,EAAQ;AAAA;AAEZ;AAMO,IAAM,OAAA,GAAU;AAAA,EACrB,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO;AACT;AAMO,IAAM,YAAA,GAAe;AAAA,EAC1B,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,KAAA,EAAO,MAAA;AAAA,EACP,IAAA,EAAM;AACR;AAMO,IAAM,OAAA,GAAU;AAAA,EACrB,EAAA,EAAI,8BAAA;AAAA,EACJ,EAAA,EAAI,8BAAA;AAAA,EACJ,EAAA,EAAI,gCAAA;AAAA,EACJ,EAAA,EAAI,gCAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,iCAAA;AAAA,IACJ,EAAA,EAAI,iCAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA,EACA,KAAA,EAAO;AACT;AAMO,IAAM,UAAA,GAAa;AAAA,EACxB,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,8EAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS;AAAA;AAEb;AAoBO,IAAM,OAAA,GAAU;AAAA,EACrB,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,sBAAA;AAAA,IACN,EAAA,EAAI,oBAAA;AAAA,IACJ,EAAA,EAAI,oBAAA;AAAA,IACJ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR,gBAAA,EAAkB,yBAAA;AAAA,EAClB,WAAA,EAAa,oBAAA;AAAA,EACb,aAAA,EAAe,sBAAA;AAAA,EACf,WAAA,EAAa,oBAAA;AAAA,EACb,eAAA,EAAiB,wBAAA;AAAA,EACjB,aAAA,EAAe;AACjB;AAMO,IAAM,SAAA,GAAY;AAAA,EACvB,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,kBAAA,EAAmB;AAAA,IACpD,EAAA,EAAI,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,eAAA;AAAgB,GACjD;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,kBAAA,EAAmB;AAAA,IACpD,EAAA,EAAI,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,eAAA;AAAgB,GACjD;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,IAC1B,WAAA,EAAa,EAAE,OAAA,EAAS,GAAA;AAAI,GAC9B;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,eAAA,EAAiB,EAAE,SAAA,EAAW,UAAA,EAAW;AAAA,IACzC,KAAA,EAAO,EAAE,SAAA,EAAW,UAAA;AAAW,GACjC;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,IAC3B,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA;AAAM,GAC1B;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,EAAE,SAAA,EAAW,iCAAA,EAAkC;AAAA,IAC3D,KAAA,EAAO,EAAE,SAAA,EAAW,iCAAA;AAAkC;AAE1D;AAGO,IAAM,YAAA,GAAe;AAAA,EAC1B,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAMT,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAMR,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAMP,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAMR,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAMP,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAMb;AAGO,IAAM,kBAAkB,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,KAAK,IAAI;AAM7D,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM,gBAAA;AAAA,EACN,MAAA,EAAQ,gBAAA;AAAA,EACR,IAAA,EAAM,gBAAA;AAAA,EACN,MAAA,EAAQ;AACV;AAMO,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU,GAAA;AAAA,EACV,KAAA,EAAO,GAAA;AAAA,EACP,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAMO,IAAM,MAAA,GAAS;AAAA,EACpB,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,MAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EACA,GAAA,EAAK;AAAA;AACP;AAMO,SAAS,oBAAA,CAAqB,SAAS,KAAA,EAA+B;AAC3E,EAAA,MAAM,OAA+B,EAAC;AAGtC,EAAA,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,OAAA,CAAS,CAAA,GAAI,OAAO,MAAA,CAAO,OAAA;AAC3C,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACtD,IAAA,IAAI,GAAA,KAAQ,WAAW,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,QAAA,EAAW,GAAG,EAAE,CAAA,GAAI,KAAA;AAAA,EAC7D,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACvD,IAAA,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,SAAA,EAAY,GAAG,EAAE,CAAA,GAAI,KAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,IAAI,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACpD,IAAA,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,MAAA,EAAS,GAAG,EAAE,CAAA,GAAI,KAAA;AAAA,EACpC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACtD,IAAA,IAAI,GAAA,KAAQ,WAAW,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,QAAA,EAAW,GAAG,EAAE,CAAA,GAAI,KAAA;AAAA,SACtD,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,OAAA,CAAS,CAAA,GAAI,KAAA;AAAA,EACpC,CAAC,CAAA;AAGD,EAAA,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,eAAA,CAAiB,CAAA,GAAI,MAAA;AACrC,EAAA,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,aAAA,CAAe,CAAA,GAAI,MAAA;AACnC,EAAA,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,aAAA,CAAe,CAAA,GAAI,MAAA;AACnC,EAAA,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,eAAA,CAAiB,CAAA,GAAI,MAAA;AAErC,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,YAAA,GAAe;AAAA;AAAA,EAE1B,UAAA,EAAY;AAAA,IACV,eAAA,EAAiB,2BAAA;AAAA,IACjB,cAAA,EAAgB,YAAA;AAAA,IAChB,oBAAA,EAAsB,YAAA;AAAA,IACtB,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,GAC5C;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACZ,eAAA,EAAiB,OAAO,MAAA,CAAO,OAAA;AAAA,IAC/B,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,IAC1C,SAAA,EAAW,QAAQ,IAAA,CAAK;AAAA,GAC1B;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,eAAA,EAAiB,aAAA;AAAA,IACjB,KAAA,EAAO,OAAO,IAAA,CAAK,SAAA;AAAA,IACnB,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,eAAA,EAAiB,OAAO,IAAA,CAAK,EAAA;AAAA,IAC7B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,IACvC,cAAc,YAAA,CAAa;AAAA,GAC7B;AAAA;AAAA,EAGA,gBAAA,EAAkB;AAAA,IAChB,eAAA,EAAiB,OAAO,SAAA,CAAU,EAAA;AAAA,IAClC,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,CAAA;AAAA,IAC5C,cAAc,YAAA,CAAa;AAAA;AAE/B;;;ACXO,SAAS,mBAAmB,MAAA,EAAgD;AACjF,EAAA,OAAO,OAAO,MAAA,KAAW,aAAA;AAC3B;AAEO,SAAS,iBAAiB,MAAA,EAA8C;AAC7E,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC3B;AAEO,SAAS,iBAAiB,MAAA,EAA8C;AAC7E,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC3B;AAEO,SAAS,kBAAkB,MAAA,EAA+C;AAC/E,EAAA,OAAO,OAAO,MAAA,KAAW,YAAA;AAC3B;AAEO,SAAS,eAAe,MAAA,EAA4C;AACzE,EAAA,OAAO,OAAO,MAAA,KAAW,QAAA;AAC3B;AAEO,SAAS,aAAa,MAAA,EAA0C;AACrE,EAAA,OAAO,OAAO,MAAA,KAAW,MAAA;AAC3B;AAEO,SAAS,iBAAiB,MAAA,EAA8C;AAC7E,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA;AAC3B;AAEO,SAAS,kBAAkB,MAAA,EAA+C;AAC/E,EAAA,OAAO,OAAO,MAAA,KAAW,YAAA;AAC3B;AAEO,SAAS,gBAAgB,MAAA,EAA6C;AAC3E,EAAA,OAAO,OAAO,MAAA,KAAW,UAAA;AAC3B;AAEO,SAAS,oBAAoB,MAAA,EAAiD;AACnF,EAAA,OAAO,OAAO,MAAA,KAAW,cAAA;AAC3B;AAEO,SAAS,kBAAkB,MAAA,EAA+C;AAC/E,EAAA,OAAO,OAAO,MAAA,KAAW,YAAA;AAC3B;AAEO,SAAS,kBAAkB,MAAA,EAA+C;AAC/E,EAAA,OAAO,OAAO,MAAA,KAAW,YAAA;AAC3B;AAEO,SAAS,gBAAgB,KAAA,EAAoD;AAClF,EAAA,OAAO,MAAM,IAAA,KAAS,WAAA;AACxB;AAEO,SAAS,aAAa,KAAA,EAAiD;AAC5E,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAEO,SAAS,cAAc,KAAA,EAAkD;AAC9E,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAuMO,IAAM,oBAAA,GAA2C;AAAA,EACtD,WAAA,EAAa,QAAA;AAAA,EACb,gBAAA,EAAkB,QAAA;AAAA,EAClB,KAAA,EAAO,SAAA;AAAA,EACP,aAAA,EAAe,IAAA;AAAA,EACf,WAAA,EAAa;AACf;AAwEO,SAAS,yBAAyB,KAAA,EAAwC;AAC/E,EAAA,MAAM,EAAE,EAAA,EAAI,SAAA,EAAW,OAAA,EAAS,WAAU,GAAI,KAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,SAAA,GAAY,IAAI,IAAA,CAAK,SAAS,CAAA,GAAI,MAAA;AAEpD,EAAA,QAAQ,UAAU,IAAA;AAAM,IACtB,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAM,MAAA;AAAA,QACN,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IAEF,KAAK,mBAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IAEF,KAAK,UAAA;AAGH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,SAAA,EAAW,OAAA;AAAA,QACX;AAAA,OACF;AAAA,IAEF,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,EAAE,UAAS,GAAI,SAAA;AACrB,MAAA,MAAM,cAAA,GAAiC;AAAA,QACrC,KAAA,EAAO,QAAA,CAAS,MAAA,KAAW,SAAA,GAAY,MAAA,GAAS,QAAA;AAAA,QAChD,YAAY,QAAA,CAAS,EAAA;AAAA,QACrB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,IAAA,EAAO,QAAA,CAAS,KAAA,IAAqC,EAAC;AAAA,QACtD,QAAQ,QAAA,CAAS;AAAA,OACnB;AAEA,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,eAAA,EAAiB,CAAC,cAAc,CAAA;AAAA,QAChC;AAAA,OACF;AAAA,IACF;AAAA,IAEA,KAAK,OAAA;AAEH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAA,OAAA,EAAU,SAAA,CAAU,OAAO,CAAA,EAAG,SAAA,CAAU,IAAA,GAAO,CAAA,EAAA,EAAK,SAAA,CAAU,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA;AAAA,QACnF;AAAA,OACF;AAAA,IAEF,KAAK,QAAA;AAEH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,KAAK,SAAA,CAAU;AAAA,UACtB,YAAY,SAAA,CAAU,UAAA;AAAA,UACtB,YAAY,SAAA,CAAU;AAAA,SACvB,CAAA;AAAA,QACD;AAAA,OACF;AAAA,IAEF;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAKO,SAAS,yBAAyB,OAAA,EAAmC;AAC1E,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,SAAS,SAAA,EAAW,eAAA,EAAiB,WAAU,GAAI,OAAA;AACrE,EAAA,MAAM,SAAA,GAAY,WAAW,WAAA,EAAY;AAGzC,EAAA,IAAI,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAGjD,IAAA,MAAM,GAAA,GAAM,gBAAgB,CAAC,CAAA;AAC7B,IAAA,MAAM,QAAA,GAA+B;AAAA,MACnC,IAAI,GAAA,CAAI,UAAA;AAAA,MACR,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ,cAAA;AAAA,QACR,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,WAAW,GAAA,CAAI,IAAA;AAAA,QACf,MAAA,EAAQ,IAAI,MAAA,GAAS,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,MAAA,EAAO,GAAI;AAAA,OAC7D;AAAA,MACA,MAAA,EAAQ,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,SAAA,GAAY,SAAA;AAAA,MAC7C,OAAA,EAAS,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAC5D,OAAO,GAAA,CAAI,IAAA;AAAA,MACX,QAAQ,GAAA,CAAI;AAAA,KACd;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAS;AAAA,MACzC,SAAS,QAAA,CAAS;AAAA,KACpB;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,UAAA,EAAW;AAAA,MAC9B,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,cAAA,EAAe;AAAA,MAClC;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AAErB,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,EAAE;AAAA,QACpE;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,OAAO;AAAA,UACL,EAAA;AAAA,UACA,SAAA;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,YAAY,IAAA,CAAK;AAAA,WACnB;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA,EAAW,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,IACvC;AAAA,GACF;AACF;AAMO,SAAS,4BAA4B,OAAA,EAAuC;AACjF,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,IAAI,uBAAA,GAA0C,IAAA;AAE9C,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,OAAA,GAAU,yBAAyB,KAAK,CAAA;AAC9C,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAEhC,MAAA,IAAI,uBAAA,EAAyB;AAE3B,QAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,UAAA,uBAAA,CAAwB,eAAA,GAAkB;AAAA,YACxC,GAAI,uBAAA,CAAwB,eAAA,IAAmB,EAAC;AAAA,YAChD,GAAG,OAAA,CAAQ;AAAA,WACb;AAAA,QACF;AAEA,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,uBAAA,CAAwB,OAAA,GAAU,uBAAA,CAAwB,OAAA,GACtD,CAAA,EAAG,wBAAwB,OAAO;AAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAA,GACtD,OAAA,CAAQ,OAAA;AAAA,QACd;AAEA,QAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,UAAA,uBAAA,CAAwB,SAAA,GAAY,uBAAA,CAAwB,SAAA,GACxD,CAAA,EAAG,wBAAwB,SAAS;AAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,GAC1D,OAAA,CAAQ,SAAA;AAAA,QACd;AAAA,MACF,CAAA,MAAO;AACL,QAAA,uBAAA,GAA0B,EAAE,GAAG,OAAA,EAAQ;AAAA,MACzC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,QAAA,CAAS,KAAK,uBAAuB,CAAA;AACrC,QAAA,uBAAA,GAA0B,IAAA;AAAA,MAC5B;AACA,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,IAAI,uBAAA,EAAyB;AAC3B,IAAA,QAAA,CAAS,KAAK,uBAAuB,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,QAAA;AACT;AAMO,SAAS,4BAA4B,QAAA,EAAwC;AAClF,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAE9B,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,EAAA,EAAI,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAA,SAAA,CAAA;AAAA,QACjB,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,WAAA,EAAY;AAAA,QAC1C,SAAA,EAAW,EAAE,IAAA,EAAM,UAAA,EAAW;AAAA,QAC9B,SAAS,OAAA,CAAQ;AAAA,OAClB,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,CAAC,OAAA,CAAQ,iBAAiB,MAAA,EAAQ;AACvD,MAAA,OAAA,CAAQ,KAAK,wBAAA,CAAyB;AAAA,QACpC,GAAG,OAAA;AAAA,QACH,eAAA,EAAiB,MAAA;AAAA,QACjB,SAAA,EAAW;AAAA,OACZ,CAAC,CAAA;AAAA,IACJ;AAGA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,eAAA,EAAiB;AACzC,QAAA,MAAM,WAAA,GAAuB;AAAA,UAC3B,IAAI,GAAA,CAAI,UAAA;AAAA,UACR,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,EAAA;AAAA,UACT,eAAA,EAAiB,CAAC,GAAG,CAAA;AAAA,UACrB,WAAW,OAAA,CAAQ;AAAA,SACrB;AACA,QAAA,OAAA,CAAQ,IAAA,CAAK,wBAAA,CAAyB,WAAW,CAAC,CAAA;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AC55BO,SAAS,eAAA,CAAgB;AAAA,EAC9B,gBAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAAkD;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,cAAAA,CAA0B,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,eAAA,GAAkBD,aAAO,KAAK,CAAA;AACpC,EAAA,MAAM,mBAAA,GAAsBA,aAAO,gBAAgB,CAAA;AAGnD,EAAAG,gBAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAAA,EAChC,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAGrB,EAAA,MAAM,YAAA,GAAeD,kBAAY,YAAY;AAC3C,IAAA,IAAI,eAAA,CAAgB,OAAA,IAAW,CAAC,UAAA,EAAY;AAE5C,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,IAAA,OAAO,IAAA,EAAM;AAEX,MAAA,IAAI,WAAA;AACJ,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AACjB,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,QAAA,WAAA,GAAc,KAAK,CAAC,CAAA;AACpB,QAAA,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MACrB,CAAC,CAAA;AAGD,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,CAAC,CAAC,CAAA;AAErD,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,IAAI;AACF,QAAA,MAAM,mBAAA,CAAoB,QAAQ,WAAW,CAAA;AAAA,MAC/C,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA,MAEzD;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,CAAC,eAAA,CAAgB,WAAW,UAAA,EAAY;AAC9D,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,YAAA,EAAc,UAAU,CAAC,CAAA;AAGpC,EAAA,MAAM,OAAA,GAAUD,iBAAAA,CAAY,CAAC,IAAA,EAAc,KAAA,KAA6B;AACtE,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,EAAA,EAAI,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,MAC9D,IAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAU,KAAK,GAAA;AAAI,KACrB;AAEA,IAAA,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,CAAC,EAAA,KAAe;AACzC,IAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACpD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,KAAA,CAAM;AAAA,GACrB;AACF;AC3GO,SAAS,gBAAA,CAAiB;AAAA,EAC/B;AACF,CAAA,GAA6B,EAAC,EAA2B;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,kBAAA,GAAqBD,aAA+B,IAAI,CAAA;AAC9D,EAAA,MAAM,YAAA,GAAeA,aAAsB,IAAI,CAAA;AAC/C,EAAA,MAAM,eAAA,GAAkBA,aAAO,YAAY,CAAA;AAG3C,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAG1B,EAAA,MAAM,cAAA,GAAiBE,kBAAY,MAAM;AAEvC,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AACjD,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAAC,SAAA,KAA6B;AAC7D,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,IAAA,GAAOA,iBAAAA,CAAY,OAAO,iBAAA,KAA+B;AAE7D,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AAGA,IAAA,MAAM,SAAA,GAAY,qBAAqB,YAAA,CAAa,OAAA;AACpD,IAAA,IAAI,SAAA,IAAa,gBAAgB,OAAA,EAAS;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,CAAgB,QAAQ,SAAS,CAAA;AAAA,MACzC,SAAS,GAAA,EAAK;AAEZ,QAAA,OAAA,CAAQ,IAAA,CAAK,uBAAuB,GAAG,CAAA;AAAA,MACzC;AAAA,IACF;AAGA,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,mBAAmB,OAAA,EAAS,MAAA;AAAA,IACpC,cAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AClEO,SAASQ,gBAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;AAKA,eAAe,iBAAiB,IAAA,EAA6B;AAC3D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,SAAS,MAAM;AACpB,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAClC,MAAA,OAAA,CAAQ,UAAU,EAAE,CAAA;AAAA,IACtB,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AA4CO,SAAS,aAAA,CAAc;AAAA,EAC5B,WAAA,GAAc,MAAM,IAAA,GAAO,IAAA;AAAA;AAAA,EAC3B,QAAA,GAAW,EAAA;AAAA,EACX;AACF,CAAA,GAA0B,EAAC,EAAwB;AACjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIT,cAAAA,CAA2B,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeD,aAAgC,IAAI,CAAA;AAGzD,EAAA,MAAM,QAAA,GAAWE,iBAAAA;AAAA,IACf,OAAO,QAAA,KAA8B;AACnC,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,WAA6B,EAAC;AACpC,MAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAE3B,MAAA,KAAA,IACM,CAAA,GAAI,GACR,CAAA,GAAI,QAAA,CAAS,UAAU,YAAA,GAAe,QAAA,CAAS,MAAA,GAAS,QAAA,EACxD,CAAA,EAAA,EACA;AACA,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM;AAGX,QAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC3B,UAAA,iBAAA;AAAA,YACE,IAAA,CAAK,IAAA;AAAA,YACL,CAAA,wBAAA,EAA2BQ,eAAAA,CAAe,WAAW,CAAC,CAAA;AAAA,WACxD;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAC3C,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,OAAA;AAAA,YACA,QAAA,EAAU,KAAK,IAAA,IAAQ,0BAAA;AAAA,YACvB,MAAM,IAAA,CAAK;AAAA,WACZ,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAA,CAAK,IAAI,KAAK,KAAK,CAAA;AACxD,UAAA,iBAAA,GAAoB,IAAA,CAAK,MAAM,qBAAqB,CAAA;AAAA,QACtD;AAAA,MACF;AAGA,MAAA,IACE,SAAS,MAAA,GAAS,QAAA,GAAW,gBAC7B,YAAA,GAAe,QAAA,CAAS,UAAU,QAAA,EAClC;AACA,QAAA,iBAAA,GAAoB,EAAA,EAAI,CAAA,QAAA,EAAW,QAAQ,CAAA,cAAA,CAAgB,CAAA;AAAA,MAC7D;AAEA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,QAAA,CAAS,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,QAAQ,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,aAAa,iBAAiB;AAAA,GACzD;AAGA,EAAA,MAAM,UAAA,GAAaR,iBAAAA,CAAY,CAAC,KAAA,KAAkB;AAChD,IAAA,QAAA,CAAS,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC,CAAA;AAAA,EACvD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,GAAiBA,iBAAAA,CAAY,CAAC,CAAA,KAAiB;AACnD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,CAAA,KAAiB;AACpD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,iBAAAA;AAAA,IACjB,CAAC,CAAA,KAAiB;AAChB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,QAAA,CAAS,CAAA,CAAE,aAAa,KAAK,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,MAAM,qBAAA,GAAwBA,iBAAAA;AAAA,IAC5B,CAAC,CAAA,KAAqC;AACpC,MAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAEvB,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,YAAA,CAAa,QAAQ,KAAA,GAAQ,EAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA,EAAY,MAAM,MAAA,GAAS,QAAA;AAAA,IAC3B,aAAA,EAAe;AAAA,MACb,UAAA,EAAY,cAAA;AAAA,MACZ,WAAA,EAAa,eAAA;AAAA,MACb,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,qBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACjKA,eAAsB,sBAAA,CACpB,aACA,OAAA,EACyD;AACzD,EAAA,IAAI,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAE3B,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,IAAI,GAAG,SAAA,EAAW;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,SAAA,CAAU,OAAO,CAAA;AACzC,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,QACjD;AACA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAA,GAAU;AAAA,YACR,GAAG,OAAA;AAAA,YACH,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,MAAA;AAAA,YACjC,cAAA,EAAgB,MAAA,CAAO,cAAA,IAAkB,OAAA,CAAQ,cAAA;AAAA,YACjD,QAAA,EAAU;AAAA,cACR,GAAG,OAAA,CAAQ,QAAA;AAAA,cACX,GAAG,MAAA,CAAO;AAAA;AACZ,WACF;AAAA,QACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,kBAAA;AAC1D,QAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,YAAA,EAAa;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;AAYA,eAAsB,oBAAA,CACpB,aACA,KAAA,EAC6B;AAC7B,EAAA,IAAI,OAAA,GAA8B,KAAA;AAElC,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,GAAG,OAAA,EAAS;AACd,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,MAAM,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AAAA,MACpC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,GAAG,CAAA;AAAA,MAElD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAQA,eAAsB,sBAAA,CACpB,aACA,SAAA,EACe;AACf,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,IAAI,GAAG,UAAA,EAAY;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,CAAG,WAAW,SAAS,CAAA;AAAA,MAC/B,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,GAAG,CAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;AAQA,eAAsB,mBAAA,CACpB,aACA,KAAA,EACe;AACf,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,IAAI,GAAG,OAAA,EAAS;AACd,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,CAAG,QAAQ,KAAK,CAAA;AAAA,MACxB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,GAAG,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;;;ACmKO,SAAS,aAAa,OAAA,EAAkD;AAC7E,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAiB,EAAC;AAAA,IAClB,cAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA,GAAuB,CAAA;AAAA,IACvB,kBAAA,GAAqB,GAAA;AAAA,IACrB,YAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAID,eAA4B,cAAc,CAAA;AACtF,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,cAAAA,CAA4B,EAAE,CAAA;AAC9E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAwB,oBAAoB,IAAI,CAAA;AAGlF,EAAA,MAAM,kBAAA,GAAqBD,aAA+B,IAAI,CAAA;AAC9D,EAAA,MAAM,cAAA,GAAiBA,aAAe,EAAE,CAAA;AACxC,EAAA,MAAM,gBAAA,GAAmBA,aAAsB,IAAI,CAAA;AACnD,EAAA,MAAM,mBAAA,GAAsBA,YAAAA,iBAA0E,IAAI,GAAA,EAAK,CAAA;AAC/G,EAAA,MAAM,uBAAA,GAA0BA,aAAgB,KAAK,CAAA;AACrD,EAAA,MAAM,oBAAA,GAAuBA,aAAe,CAAC,CAAA;AAC7C,EAAA,MAAM,aAAA,GAAgBA,aAAe,CAAC,CAAA;AACtC,EAAA,MAAM,YAAA,GAAeA,aAAsB,SAAS,CAAA;AACpD,EAAA,MAAM,mBAAA,GAAsBA,YAAAA,CAA0B,EAAE,CAAA;AAGxD,EAAAG,gBAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAAA,EACzB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAAA,gBAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAAA,EAChC,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAGrB,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,cAAA,EAAgB,GAAG,gBAAgB,CAAA;AAGvD,EAAA,MAAM,oBAAA,GAAuBD,iBAAAA,CAAY,CAAC,UAAA,KAAkC;AAC1E,IAAA,mBAAA,CAAoB,CAAC,GAAG,UAAU,CAAC,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,EAAA,EAAY,OAAA,MAAsC;AAAA,IACrF,EAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,SAAA,EAAW,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,IACvC;AAAA,GACF,CAAA,EAAI,EAAE,CAAA;AAGN,EAAA,MAAM,mBAAA,GAAsBA,kBAAY,MAAM;AAC5C,IAAA,cAAA,CAAe,OAAA,GAAU,EAAA;AACzB,IAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,IAAA,mBAAA,CAAoB,QAAQ,KAAA,EAAM;AAClC,IAAA,uBAAA,CAAwB,OAAA,GAAU,KAAA;AAClC,IAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAAC,KAAA,EAAoB,aAAA,KAAwD;AAC5G,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,aAAa,CAAA;AAEpC,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,eAAA;AACH,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAC5B,UAAA,cAAA,GAAiB,MAAM,SAAS,CAAA;AAAA,QAClC;AACA,QAAA;AAAA,MAEF,KAAK,YAAA;AACH,QAAA,IAAI,MAAM,KAAA,EAAO;AAEf,UAAA,IAAI,uBAAA,CAAwB,OAAA,IAAW,gBAAA,CAAiB,OAAA,EAAS;AAC/D,YAAA,cAAA,CAAe,OAAA,GAAU,EAAA;AACzB,YAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,YAAA,uBAAA,CAAwB,OAAA,GAAU,KAAA;AAAA,UACpC;AAEA,UAAA,cAAA,CAAe,WAAW,KAAA,CAAM,KAAA;AAEhC,UAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAE7B,YAAA,gBAAA,CAAiB,OAAA,GAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpF,YAAA,UAAA,CAAW,KAAK,eAAA,CAAgB,gBAAA,CAAiB,OAAA,EAAS,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,UACnF,CAAA,MAAO;AAEL,YAAA,MAAM,UAAA,GAAa,WAAW,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,iBAAiB,OAAO,CAAA;AAChF,YAAA,IAAI,eAAe,EAAA,EAAI;AACrB,cAAA,UAAA,CAAW,UAAU,CAAA,GAAI,eAAA,CAAgB,gBAAA,CAAiB,OAAA,EAAS,eAAe,OAAO,CAAA;AAAA,YAC3F;AAAA,UACF;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,QAAA,EAAU;AAElC,UAAA,cAAA,CAAe,OAAA,GAAU,EAAA;AACzB,UAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,UAAA,uBAAA,CAAwB,OAAA,GAAU,IAAA;AAElC,UAAA,MAAM,WAAW,cAAA,CAAe;AAAA,YAC9B,IAAI,KAAA,CAAM,MAAA;AAAA,YACV,MAAM,KAAA,CAAM,QAAA;AAAA,YACZ,OAAO,KAAA,CAAM;AAAA,WACd,CAAA;AAED,UAAA,MAAM,KAAA,GAAyB;AAAA,YAC7B,IAAI,KAAA,CAAM,MAAA;AAAA,YACV,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA,EAAW,EAAE,IAAA,EAAM,WAAA,EAAa,QAAA,EAAS;AAAA,YACzC,SAAS,QAAA,CAAS;AAAA,WACpB;AAEA,UAAA,MAAM,aAAa,UAAA,CAAW,MAAA;AAC9B,UAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAErB,UAAA,mBAAA,CAAoB,QAAQ,GAAA,CAAI,KAAA,CAAM,QAAQ,EAAE,UAAA,EAAY,UAAU,CAAA;AAAA,QACxE;AACA,QAAA;AAAA,MAEF,KAAK,aAAA;AACH,QAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,UAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,OAAA,CAAQ,GAAA,CAAI,MAAM,MAAM,CAAA;AAC5D,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,eAAA,GAAkB,wBAAA;AAAA,cACtB,OAAA,CAAQ,QAAA;AAAA,cACR,KAAA,CAAM,UAAA;AAAA,cACN,KAAA,CAAM;AAAA,aACR;AAEA,YAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA;AACnD,YAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,SAAA,CAAU,IAAA,KAAS,WAAA,EAAa;AACjE,cAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAAI;AAAA,gBAC/B,GAAG,aAAA;AAAA,gBACH,SAAA,EAAW,EAAE,IAAA,EAAM,WAAA,EAAa,UAAU,eAAA;AAAgB,eAC5D;AAAA,YACF;AAEA,YAAA,mBAAA,CAAoB,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAAA,UACjD;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAK,MAAA;AAGH,QAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,CAAC,cAAA,CAAe,OAAA,EAAS;AACzC,UAAA,gBAAA,CAAiB,OAAA,GAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpF,UAAA,cAAA,CAAe,UAAU,KAAA,CAAM,IAAA;AAC/B,UAAA,UAAA,CAAW,KAAK,eAAA,CAAgB,gBAAA,CAAiB,OAAA,EAAS,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,QACnF;AAEA,QAAA;AAAA,MAEF,KAAK,SAAA;AAGH,QAAA,IAAI,KAAA,CAAM,OAAA,IAAW,CAAC,cAAA,CAAe,OAAA,EAAS;AAC5C,UAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA;AAC7B,UAAA,MAAM,YAAY,cAAA,EAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAC/D,UAAA,IAAI,WAAW,IAAA,EAAM;AACnB,YAAA,gBAAA,CAAiB,OAAA,GAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpF,YAAA,cAAA,CAAe,UAAU,SAAA,CAAU,IAAA;AACnC,YAAA,UAAA,CAAW,KAAK,eAAA,CAAgB,gBAAA,CAAiB,OAAA,EAAS,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,UACnF;AAAA,QACF;AAEA,QAAA;AAAA,MAEF,KAAK,aAAA;AACH,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,YAAA,GAAe,MAAM,KAAK,CAAA;AAAA,QAC5B;AACA,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AACpB,UAAA,OAAA,GAAU,MAAM,KAAK,CAAA;AAGrB,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,EAAA,EAAI,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,YAC9D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK;AAAA,YACnE,SAAS,KAAA,CAAM;AAAA,WAChB,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MAEF,KAAK,aAAA;AACH,QAAA,YAAA,GAAe,MAAM,SAAA,IAAa,SAAA,IAAa,EAAA,EAAI,KAAA,CAAM,UAAU,WAAW,CAAA;AAC9E,QAAA;AAAA,MAEF,KAAK,UAAA;AAGH,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,UAAU,CAAC,CAAA;AAAA,QACtD;AACA,QAAA,mBAAA,EAAoB;AACpB,QAAA,OAAO,EAAC;AAAA;AAGZ,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAA,EAAW,cAAA,EAAgB,cAAc,OAAA,EAAS,YAAA,EAAc,eAAA,EAAiB,mBAAmB,CAAC,CAAA;AAGzG,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,OACnC,eAAA,EACA,cAAA,KACqB;AACrB,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,qBAAqB,OAAA,GAAU,CAAA;AAC/C,IAAA,IAAI,UAAU,oBAAA,EAAsB;AAClC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0CAAA,EAA6C,oBAAoB,CAAA,UAAA,CAAY,CAAA;AAC1F,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,oBAAA,CAAqB,OAAA,GAAU,OAAA;AAC/B,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,WAAA,GAAc,SAAS,eAAe,CAAA;AAGtC,IAAA,MAAM,QAAQ,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,CAAA,oCAAA,EAAuC,OAAO,IAAI,oBAAoB,CAAA,IAAA,EAAO,KAAK,CAAA,EAAA,CAAI,CAAA;AAElG,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAGzD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,kBAAA,CAAmB,OAAA,GAAU,UAAA;AAE7B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,eAAA,EAAiB,UAAA,CAAW,MAAM,CAAA;AACpE,MAAA,IAAI,qBAAA,GAAwB,CAAC,GAAG,cAAc,CAAA;AAE9C,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAG/B,QAAA,aAAA,CAAc,OAAA,EAAA;AAEd,QAAA,qBAAA,GAAwB,YAAA,CAAa,OAAO,qBAAqB,CAAA;AACjE,QAAA,oBAAA,CAAqB,qBAAqB,CAAA;AAG1C,QAAA,IAAI,KAAA,CAAM,SAAS,UAAA,IAAc,KAAA,CAAM,SAAS,aAAA,IAAiB,KAAA,CAAM,SAAS,OAAA,EAAS;AAEvF,UAAA,oBAAA,CAAqB,OAAA,GAAU,CAAA;AAC/B,UAAA,iBAAA,CAAkB,KAAK,CAAA;AAGvB,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACjE,YAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,qBAAqB,CAAC,CAAA;AAC/D,YAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,UACxB;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,oBAAA,CAAqB,OAAA,GAAU,CAAA;AAC/B,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,IAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpC,QAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,qBAAqB,CAAC,CAAA;AAC/D,QAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,MACxB;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAW,GAAA,CAAc,IAAA,KAAS,YAAA,IACrC,GAAA,CAAc,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA,IACzC,GAAA,CAAc,OAAA,EAAS,QAAA,CAAS,kBAAkB,CAAA;AAErD,MAAA,IAAI,OAAA,IAAW,CAAC,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS;AAEzC,QAAA,OAAA,CAAQ,IAAI,CAAA,6DAAA,CAA+D,CAAA;AAC3E,QAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,QAAA,OAAO,gBAAA,CAAiB,eAAA,EAAiB,mBAAA,CAAoB,OAAO,CAAA;AAAA,MACtE;AAGA,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,IAAI,CAAC,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS;AAC9B,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAA;AAC1D,QAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,YAAY,CAAA;AAAA,MACnE;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,oBAAA,EAAsB,oBAAoB,WAAA,EAAa,YAAA,EAAc,oBAAoB,CAAC,CAAA;AAGlH,EAAA,MAAM,IAAA,GAAOA,iBAAAA,CAAY,OAAO,MAAA,KAAmB;AACjD,IAAA,IAAI,WAAA,EAAa;AAGjB,IAAA,IAAI,WAAA,GAAc,MAAA;AAClB,IAAA,IAAI,qBAA8C,EAAC;AACnD,IAAA,IAAI,iBAAA;AAGJ,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,UAChC,MAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS,CAAC,GAAG,cAAA,EAAgB,GAAG,gBAAgB;AAAA,SACjD,CAAA;AACD,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,MAAA,EAAQ,MAAA,KAAW,KAAA,CAAA,EAAW,WAAA,GAAc,MAAA,CAAO,MAAA;AACvD,QAAA,IAAI,MAAA,EAAQ,QAAA,EAAU,kBAAA,GAAqB,MAAA,CAAO,QAAA;AAClD,QAAA,IAAI,MAAA,EAAQ,cAAA,EAAgB,iBAAA,GAAoB,MAAA,CAAO,cAAA;AAAA,MACzD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AAC1D,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,OAAA,GAAU,YAAY,CAAA;AACtB,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,MAAM,iBAAA,GAAuC;AAAA,QAC3C,MAAA,EAAQ,WAAA;AAAA,QACR,SAAA;AAAA,QACA,QAAA,EAAU,kBAAA;AAAA,QACV,cAAA,EAAgB;AAAA,OAClB;AACA,MAAA,MAAM,EAAE,SAAS,KAAA,EAAO,eAAA,KAAoB,MAAM,sBAAA,CAAuB,YAAY,iBAAiB,CAAA;AACtG,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,QAAA,CAAS,eAAe,CAAA;AACxB,QAAA,OAAA,GAAU,eAAe,CAAA;AACzB,QAAA,MAAM,mBAAA,CAAoB,YAAY,eAAe,CAAA;AACrD,QAAA;AAAA,MACF;AACA,MAAA,WAAA,GAAc,OAAA,CAAQ,MAAA;AACtB,MAAA,kBAAA,GAAqB,OAAA,CAAQ,YAAY,EAAC;AAC1C,MAAA,iBAAA,GAAoB,OAAA,CAAQ,cAAA;AAAA,IAC9B;AAEA,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,oBAAA,CAAqB,OAAA,GAAU,CAAA;AAC/B,IAAA,aAAA,CAAc,OAAA,GAAU,CAAA;AAGxB,IAAA,MAAM,SAAA,GAA6B;AAAA,MACjC,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,MAC7D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,SAAA,EAAW,EAAE,IAAA,EAAM,cAAA,EAAe;AAAA,MAClC,OAAA,EAAS;AAAA,KACX;AACA,IAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,SAAS,CAAC,CAAA;AAGhD,IAAA,mBAAA,EAAoB;AAGpB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,kBAAA,CAAmB,OAAA,GAAU,UAAA;AAE7B,IAAA,IAAI,wBAA2C,EAAC;AAChD,IAAA,IAAI,kBAAA,GAAoC,IAAA;AAExC,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,WAAA,EAAa,SAAA,IAAa,KAAA,CAAA,EAAW;AAAA,QAC/D,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,UAAU,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA,CAAE,MAAA,GAAS,IAAI,kBAAA,GAAqB,KAAA,CAAA;AAAA,QAC5E,cAAA,EAAgB;AAAA,OACjB,CAAA;AAED,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAG/B,QAAA,aAAA,CAAc,OAAA,EAAA;AAGd,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,eAAA,IAAmB,KAAA,CAAM,SAAA,EAAW;AACrD,UAAA,kBAAA,GAAqB,KAAA,CAAM,SAAA;AAAA,QAC7B;AAGA,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,IAAI;AACF,YAAA,MAAM,QAAQ,KAAK,CAAA;AAAA,UACrB,SAAS,GAAA,EAAK;AACZ,YAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,GAAG,CAAA;AAAA,UACpD;AAAA,QACF;AAGA,QAAA,IAAI,cAAA,GAAqC,KAAA;AACzC,QAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,UAAA,cAAA,GAAiB,MAAM,oBAAA,CAAqB,UAAA,EAAY,KAAK,CAAA;AAAA,QAC/D;AAGA,QAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,QAAA,qBAAA,GAAwB,YAAA,CAAa,gBAAgB,qBAAqB,CAAA;AAC1E,QAAA,oBAAA,CAAqB,qBAAqB,CAAA;AAAA,MAC5C;AAGA,MAAA,IAAI,qBAAA,CAAsB,SAAS,CAAA,EAAG;AACpC,QAAA,iBAAA,CAAkB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,qBAAqB,CAAC,CAAA;AAC/D,QAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,MACxB;AAGA,MAAA,oBAAA,CAAqB,OAAA,GAAU,CAAA;AAG/B,MAAA,IAAI,UAAA,EAAY,MAAA,KAAW,kBAAA,IAAsB,YAAA,CAAa,OAAA,CAAA,EAAU;AACtE,QAAA,MAAM,sBAAA,CAAuB,UAAA,EAAY,kBAAA,IAAsB,YAAA,CAAa,WAAW,EAAE,CAAA;AAAA,MAC3F;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAW,GAAA,CAAc,IAAA,KAAS,YAAA,IACrC,GAAA,CAAc,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA,IACzC,GAAA,CAAc,OAAA,EAAS,QAAA,CAAS,kBAAkB,CAAA;AAErD,MAAA,IAAI,OAAA,IAAW,CAAC,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS;AAGzC,QAAA,MAAM,mBAAmB,YAAA,CAAa,OAAA;AACtC,QAAA,MAAM,SAAA,GAAY,cAAc,OAAA,GAAU,CAAA;AAE1C,QAAA,OAAA,CAAQ,IAAI,CAAA,6CAAA,EAAgD,gBAAgB,CAAA,SAAA,EAAY,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAE/G,QAAA,IAAI,gBAAA,IAAoB,aAAa,kBAAA,EAAoB;AACvD,UAAA,OAAA,CAAQ,IAAI,CAAA,8CAAA,CAAgD,CAAA;AAC5D,UAAA,MAAM,WAAA,GAAc,MAAM,gBAAA,CAAiB,gBAAA,EAAkB,oBAAoB,OAAO,CAAA;AACxF,UAAA,IAAI,WAAA,EAAa;AAEf,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,QAAA,GAAW,oCAAA;AACjB,UAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,UAAA,OAAA,GAAU,QAAQ,CAAA;AAClB,UAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,YAAA,MAAM,mBAAA,CAAoB,YAAY,QAAQ,CAAA;AAAA,UAChD;AAAA,QACF;AAAA,MAEF,CAAA,MAAA,IAAW,CAAC,OAAA,EAAS;AAEnB,QAAA,MAAM,YAAA,GAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AAC1D,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,OAAA,GAAU,YAAY,CAAA;AACtB,QAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,UAAA,MAAM,mBAAA,CAAoB,YAAY,YAAY,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,MAAA,mBAAA,EAAoB;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,SAAA,EAAW,cAAA,EAAgB,kBAAkB,YAAA,EAAc,kBAAA,EAAoB,YAAA,EAAc,oBAAA,EAAsB,qBAAqB,OAAA,EAAS,gBAAA,EAAkB,YAAA,EAAc,OAAA,EAAS,UAAU,CAAC,CAAA;AAGtN,EAAA,MAAM,IAAA,GAAOA,kBAAY,MAAM;AAE7B,IAAA,oBAAA,CAAqB,UAAU,oBAAA,GAAuB,CAAA;AACtD,IAAA,iBAAA,CAAkB,KAAK,CAAA;AAEvB,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAGzB,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,IAAA,mBAAA,EAAoB;AACpB,IAAA,YAAA,CAAa,oBAAoB,IAAI,CAAA;AACrC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,oBAAA,CAAqB,OAAA,GAAU,CAAA;AAC/B,IAAA,aAAA,CAAc,OAAA,GAAU,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,gBAAA,EAAkB,mBAAmB,CAAC,CAAA;AAG1C,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,CAAC,UAAA,KAAkC;AAChE,IAAA,mBAAA,EAAoB;AACpB,IAAA,iBAAA,CAAkB,UAAU,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAGxB,EAAAC,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;ACnqBA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE;AAMO,SAAS,QAAQ,OAAA,EAAwC;AAC9D,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA;AAAA,IAEA,gBAAA;AAAA,IACA,kBAAkB,EAAC;AAAA,IACnB,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAA,GAAuB,CAAA;AAAA;AAAA,IAEvB;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,eAAoB,eAAe,CAAA;AACnE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAA4B,MAAS,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAwB,oBAAoB,IAAI,CAAA;AAClF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA;AAGrC,EAAA,MAAM,kBAAA,GAAqBD,aAA+B,IAAI,CAAA;AAC9D,EAAA,MAAM,0BAAA,GAA6BA,aAAuB,IAAI,CAAA;AAC9D,EAAA,MAAM,oBAAA,GAAuBA,aAAe,CAAC,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAeA,aAAsB,SAAS,CAAA;AAGpD,EAAAG,gBAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAAA,EACzB,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAA,MAAM,OAAA,GAAU,4BAA4B,QAAQ,CAAA;AAGpD,EAAA,MAAM,sBAAA,GAAyBD,iBAAAA,CAAY,CAAC,OAAA,KAAuC;AACjF,IAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AAEzC,IAAA,0BAAA,CAA2B,OAAA,GAAU,OAAA,CAAQ,0BAAA,CAA2B,OAAO,CAAA;AAE/E,IAAA,MAAM,aAAa,0BAAA,CAA2B,OAAA;AAC9C,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,SAAA,GAAY,KAAK,MAAA,GAAS,CAAA;AAChC,MAAA,MAAM,WAAA,GAAc,KAAK,SAAS,CAAA;AAClC,MAAA,IAAI,aAAa,CAAA,IAAK,WAAA,IAAe,cAAc,WAAA,CAAY,EAAA,KAAO,WAAW,EAAA,EAAI;AACnF,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG,SAAS,GAAG,UAAU,CAAA;AAAA,MACjD;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAAC,KAAA,KAAuB;AACvD,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,eAAA;AACH,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAC5B,UAAA,cAAA,GAAiB,MAAM,SAAS,CAAA;AAAA,QAClC;AACA,QAAA;AAAA,MAEF,KAAK,YAAA;AACH,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,sBAAA,CAAuB,CAAC,GAAA,MAAS;AAAA,YAC/B,GAAG,GAAA;AAAA,YACH,OAAA,EAAS,GAAA,CAAI,OAAA,GAAU,KAAA,CAAM;AAAA,WAC/B,CAAE,CAAA;AAAA,QACJ;AACA,QAAA;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,QAAA,EAAU;AAClC,UAAA,MAAM,cAAA,GAAiC;AAAA,YACrC,KAAA,EAAO,MAAA;AAAA,YACP,YAAY,KAAA,CAAM,MAAA;AAAA,YAClB,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,IAAA,EAAO,KAAA,CAAM,KAAA,IAAqC;AAAC,WACrD;AAEA,UAAA,sBAAA,CAAuB,CAAC,GAAA,MAAS;AAAA,YAC/B,GAAG,GAAA;AAAA,YACH,iBAAiB,CAAC,GAAI,IAAI,eAAA,IAAmB,IAAK,cAAc;AAAA,WAClE,CAAE,CAAA;AAEF,UAAA,UAAA,GAAa,EAAE,QAAA,EAAU,cAAA,EAAgB,CAAA;AAAA,QAC3C;AACA,QAAA;AAAA,MAEF,KAAK,aAAA;AACH,QAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,UAAA,sBAAA,CAAuB,CAAC,GAAA,MAAS;AAAA,YAC/B,GAAG,GAAA;AAAA,YACH,eAAA,EAAiB,IAAI,eAAA,EAAiB,GAAA;AAAA,cAAI,CAAC,GAAA,KACzC,GAAA,CAAI,UAAA,KAAe,MAAM,MAAA,GACrB,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,QAAA,EAAmB,MAAA,EAAQ,KAAA,CAAM,YAAW,GAC7D;AAAA;AACN,WACF,CAAE,CAAA;AAAA,QACJ;AACA,QAAA;AAAA,MAEF,KAAK,MAAA;AAEH,QAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,CAAC,0BAAA,CAA2B,SAAS,OAAA,EAAS;AAC9D,UAAA,sBAAA,CAAuB,CAAC,GAAA,MAAS;AAAA,YAC/B,GAAG,GAAA;AAAA,YACH,OAAA,EAAS,MAAM,IAAA,IAAQ;AAAA,WACzB,CAAE,CAAA;AAAA,QACJ;AACA,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AACjC,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,OAAA,GAAU,GAAG,CAAA;AAAA,QACf;AACA,QAAA;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,IAAI,2BAA2B,OAAA,EAAS;AACtC,UAAA,QAAA,GAAW,2BAA2B,OAAO,CAAA;AAAA,QAC/C;AACA,QAAA;AAAA;AACJ,EACF,GAAG,CAAC,sBAAA,EAAwB,YAAY,QAAA,EAAU,OAAA,EAAS,cAAc,CAAC,CAAA;AAG1E,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OACzB,gBAAA,EACAS,QAAAA,KACuC;AACvC,IAAA,IAAI,WAAW,OAAO,IAAA;AAGtB,IAAA,MAAM,WAAA,GAAuB,OAAO,gBAAA,KAAqB,QAAA,GACrD;AAAA,MACE,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,gBAAA;AAAA,MACT,SAAA,sBAAe,IAAA;AAAK,KACtB,GACA;AAAA,MACE,EAAA,EAAI,gBAAA,CAAiB,EAAA,IAAM,UAAA,EAAW;AAAA,MACtC,MAAM,gBAAA,CAAiB,IAAA;AAAA,MACvB,SAAS,gBAAA,CAAiB,OAAA;AAAA,MAC1B,iBAAiB,gBAAA,CAAiB,eAAA;AAAA,MAClC,WAAW,gBAAA,CAAiB,SAAA;AAAA,MAC5B,SAAA,sBAAe,IAAA;AAAK,KACtB;AAGJ,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,WAAW,CAAC,CAAA;AAG5C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,MAAS,CAAA;AAClB,IAAA,oBAAA,CAAqB,OAAA,GAAU,CAAA;AAG/B,IAAA,MAAM,gBAAA,GAA4B;AAAA,MAChC,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,EAAA;AAAA,MACT,SAAA,sBAAe,IAAA;AAAK,KACtB;AACA,IAAA,0BAAA,CAA2B,OAAA,GAAU,gBAAA;AACrC,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,gBAAgB,CAAC,CAAA;AAGjD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,kBAAA,CAAmB,OAAA,GAAU,UAAA;AAE7B,IAAA,IAAI;AAEF,MAAA,IAAI,cAAc,WAAA,CAAY,OAAA;AAC9B,MAAA,IAAI,kBAAA,GAA8CA,QAAAA,EAAS,IAAA,IAAQ,EAAC;AAEpE,MAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,QAAA,MAAM,iBAAA,GAAuC;AAAA,UAC3C,MAAA,EAAQ,WAAA;AAAA,UACR,WAAW,YAAA,CAAa,OAAA;AAAA,UACxB,QAAA,EAAU;AAAA,SACZ;AACA,QAAA,MAAM,EAAE,SAAS,KAAA,EAAO,eAAA,KAAoB,MAAM,sBAAA,CAAuB,YAAY,iBAAiB,CAAA;AACtG,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,eAAe,CAAA;AACrC,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,OAAA,GAAU,GAAG,CAAA;AACb,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,WAAA,GAAc,OAAA,CAAQ,MAAA;AACtB,QAAA,kBAAA,GAAqB,OAAA,CAAQ,YAAY,EAAC;AAAA,MAC5C;AAGA,MAAA,MAAM,aAAA,GAAqC;AAAA,QACzC,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,UAAU,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA,CAAE,MAAA,GAAS,IAAI,kBAAA,GAAqB,KAAA;AAAA,OAC9E;AACA,MAAA,MAAM,SAAS,YAAA,CAAa,WAAA,EAAa,YAAA,CAAa,OAAA,IAAW,QAAW,aAAa,CAAA;AAGzF,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,UAAA,CAAW,OAAO,OAAA,EAAS;AAG/B,QAAA,IAAI,cAAA,GAAqC,KAAA;AACzC,QAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,UAAA,cAAA,GAAiB,MAAM,oBAAA,CAAqB,UAAA,EAAY,KAAK,CAAA;AAAA,QAC/D;AAEA,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,YAAA,CAAa,cAAc,CAAA;AAAA,QAC7B;AAAA,MACF;AAGA,MAAA,IAAI,UAAA,EAAY,MAAA,IAAU,YAAA,CAAa,OAAA,EAAS;AAC9C,QAAA,MAAM,sBAAA,CAAuB,UAAA,EAAY,YAAA,CAAa,OAAO,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,gBAAA,CAAiB,EAAA;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAW,IAAc,IAAA,KAAS,YAAA;AAExC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAMC,MAAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,OAAA,GAAUA,MAAK,CAAA;AAEf,QAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,UAAA,MAAM,mBAAA,CAAoB,UAAA,EAAYA,MAAAA,CAAM,OAAO,CAAA;AAAA,QACrD;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,MAAA,0BAAA,CAA2B,OAAA,GAAU,IAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,cAAc,YAAA,EAAc,UAAA,EAAY,OAAO,CAAC,CAAA;AAG/D,EAAA,MAAM,IAAA,GAAOV,kBAAY,MAAM;AAC7B,IAAA,oBAAA,CAAqB,UAAU,oBAAA,GAAuB,CAAA;AACtD,IAAA,iBAAA,CAAkB,KAAK,CAAA;AAEvB,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAGzB,EAAA,MAAM,MAAA,GAASA,kBAAY,YAAgD;AAEzE,IAAA,IAAI,oBAAA,GAAuB,EAAA;AAC3B,IAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,MAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA,KAAS,MAAA,EAAQ;AAChC,QAAA,oBAAA,GAAuB,CAAA;AACvB,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,oBAAA,KAAyB,IAAI,OAAO,IAAA;AAExC,IAAA,MAAM,eAAA,GAAkB,SAAS,oBAAoB,CAAA;AACrD,IAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAG7B,IAAA,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,oBAAA,GAAuB,CAAC,CAAC,CAAA;AAGvD,IAAA,OAAO,OAAO,eAAe,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAGrB,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,CACpC,CAAA,KACG;AACH,IAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAC/B,CAAA,EACAS,QAAAA,KACG;AACH,IAAA,CAAA,EAAG,cAAA,EAAe;AAElB,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AAEnB,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,MAAA,CAAO,SAASA,QAAO,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAGlB,EAAAR,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AC/cA,SAAS,aAAa,IAAA,EAAsB;AAE1C,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAGjC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAA,IAAU,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAKA,SAAS,iBAAiB,QAAA,EAA0B;AAClD,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAK,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,cAAA;AACpD,EAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,YAAA,EAAa,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,UAAA,EAAY,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAEnF,EAAA,OAAO,QAAA,CACJ,OAAA,CAAQ,aAAA,EAAe,MAAA,CAAO,SAAS,CAAC,CAAA,CACxC,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA,CACzB,OAAA,CAAQ,UAAU,OAAO,CAAA;AAC9B;AA0CO,SAAS,qBAAA,CAAsB;AAAA,EACpC,SAAA,GAAY,GAAA;AAAA,EACZ,gBAAA,GAAmB,6BAAA;AAAA,EACnB;AACF,CAAA,GAA+B,EAAC,EAAgC;AAC9D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIF,eAAgC,IAAI,CAAA;AAKhF,EAAA,MAAM,WAAA,GAAcC,iBAAAA,CAAY,CAAC,IAAA,KAAgE;AAC/F,IAAA,IAAI,IAAA,CAAK,UAAU,SAAA,EAAW;AAC5B,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB;AAEA,IAAA,MAAM,QAAA,GAAW,iBAAiB,gBAAgB,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA;AAClC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA;AAEnC,IAAA,MAAM,UAAA,GAA6B;AAAA,MACjC,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV;AAAA,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAA,CAAA;AAClE,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,gBAAgB,IAAA,CAAK,MAAA;AAAA,MACrB,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,iBAAA,CAAkB,cAAc,CAAA;AAChC,IAAA,YAAA,GAAe,cAAc,CAAA;AAE7B,IAAA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,UAAA,EAAW;AAAA,EAChC,CAAA,EAAG,CAAC,SAAA,EAAW,gBAAA,EAAkB,YAAY,CAAC,CAAA;AAK9C,EAAA,MAAM,cAAcA,iBAAAA,CAAY,CAC9B,KAAA,EACA,aAAA,EACA,WACA,aAAA,KACG;AACH,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA;AAE3D,IAAA,IAAI,UAAA,CAAW,SAAS,SAAA,EAAW;AAEjC,MAAA,KAAA,CAAM,cAAA,EAAe;AAErB,MAAA,MAAM,MAAA,GAAS,YAAY,UAAU,CAAA;AAErC,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,aAAA,CAAc,OAAO,UAAU,CAAA;AAAA,MAIjC;AAAA,IACF;AAAA,EAEF,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAK3B,EAAA,MAAM,mBAAA,GAAsBA,kBAAY,MAAM;AAC5C,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AACF","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 * 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 } from '../types';\nimport { LazyMarkdown } from './LazyMarkdown';\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 /** Text content to render as markdown */\n content: string;\n /** Whether content is still streaming */\n isStreaming?: boolean;\n /** Additional class name */\n className?: string;\n /** Custom markdown components */\n components?: Record<string, ComponentType<{ children?: ReactNode; [key: string]: unknown }>>;\n}\n\nexport function MessageResponse({\n content,\n isStreaming,\n className,\n components,\n}: MessageResponseProps) {\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?: '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 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\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}\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}\n\nexport function Tool({\n toolInvocation,\n children,\n className,\n defaultExpanded = false,\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 };\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 } = useTool();\n\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 return (\n <button\n onClick={showToggle ? toggleExpanded : undefined}\n className={cn(\n 'ash-tool-header',\n 'w-full flex items-center gap-2',\n 'px-3 py-2',\n 'text-left',\n showToggle && 'cursor-pointer hover:bg-white/[0.03] transition-colors',\n className\n )}\n >\n {/* Status indicator */}\n <StatusIndicator status={status} size=\"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=\"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 '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 '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 */}\n {showToggle && (\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}\n\nexport function ToolList({\n toolInvocations,\n className,\n defaultExpanded = false,\n}: ToolListProps) {\n if (!toolInvocations || toolInvocations.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n 'ash-tool-list',\n 'flex flex-col gap-2',\n className\n )}\n >\n {toolInvocations.map((inv) => (\n <Tool\n key={inv.toolCallId}\n toolInvocation={inv}\n defaultExpanded={defaultExpanded}\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// 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 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// ============================================================================\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\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 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 };\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"]}
|