@apteva/apteva-kit 0.1.111 → 0.1.113

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Chat/Chat.tsx","../src/components/Chat/MessageList.tsx","../src/components/Chat/Message.tsx","../src/utils/cn.ts","../src/utils/mock-data.ts","../src/utils/file-utils.ts","../src/utils/widget-parser.ts","../src/utils/widget-context.ts","../src/utils/interface-parser.ts","../src/utils/interface-context.ts","../src/utils/interface-operations.ts","../src/utils/message-converter.ts","../src/components/Widgets/Widgets.tsx","../src/components/Widgets/widget-library/Card.tsx","../src/components/Widgets/widget-library/List.tsx","../src/components/Widgets/widget-library/Button.tsx","../src/components/Widgets/widget-library/ButtonGroup.tsx","../src/components/Widgets/widget-library/Table.tsx","../src/components/Widgets/widget-library/Form.tsx","../src/components/Widgets/widget-library/Image.tsx","../src/components/Widgets/widget-library/Flow.tsx","../src/components/Widgets/widget-library/Kpi.tsx","../src/components/Widgets/widget-library/TextBlock.tsx","../src/components/Widgets/widget-library/Spacer.tsx","../src/components/Widgets/widget-library/LiveView.tsx","../src/components/Widgets/WidgetRenderer.tsx","../src/components/Widgets/WidgetSkeleton.tsx","../src/components/Chat/MarkdownContent.tsx","../src/components/Chat/ToolCall.tsx","../src/components/Chat/ToolCallGroup.tsx","../src/components/Chat/PersistentWidgetRef.tsx","../src/components/Chat/WelcomeScreen.tsx","../src/components/Chat/Composer.tsx","../src/components/Chat/CommandComposer.tsx","../src/lib/apteva-client.ts","../src/components/Chat/PersistentWidgetPanel.tsx","../src/components/Chat/CommandOutput.tsx","../src/components/Command/Command.tsx","../src/components/Prompt/Prompt.tsx","../src/components/Stream/Stream.tsx","../src/components/Threads/ThreadList.tsx","../src/components/Threads/ThreadItem.tsx","../src/components/Threads/Threads.tsx","../src/components/AutoInterface/AutoInterface.tsx","../src/components/AutoInterface/LayoutRenderer.tsx","../src/components/AutoInterface/InterfaceRenderer.tsx","../src/components/AutoInterface/InterfaceSkeleton.tsx","../src/utils/theme-script.ts","../src/hooks/useInterfaceState.ts","../src/hooks/useInterfaceAI.ts"],"sourcesContent":["import { useState, useEffect, useRef, useMemo, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { ChatProps, CommandResult } from '../../types/components';\nimport { Message as MessageType } from '../../types/messages';\nimport { MessageList } from './MessageList';\nimport { Composer } from './Composer';\nimport { CommandComposer } from './CommandComposer';\nimport { cn, generateMockResponse, generateMockCommandStream, buildMessageWithAttachments, ContentBlock, generateWidgetContext, generateCompactWidgetContext, convertApiMessages } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\nimport { ApiMessage } from '../../utils/message-converter';\nimport { Widget } from '../../types/widgets';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { MarkdownContent } from './MarkdownContent';\nimport { PersistentWidgetPanel } from './PersistentWidgetPanel';\n\nexport interface ChatHandle {\n /** Send a message programmatically (as if the user typed it) */\n sendMessage: (text: string) => Promise<void>;\n /** Send a system/background message (not shown as user message, just triggers agent) */\n sendSystemMessage: (text: string) => Promise<void>;\n /** Get current messages */\n getMessages: () => MessageType[];\n /** Clear all messages */\n clearMessages: () => void;\n}\n\nexport const Chat = forwardRef<ChatHandle, ChatProps>(function Chat({\n agentId,\n threadId,\n initialMessages = [],\n context,\n apiUrl,\n apiKey,\n useMock = false,\n // Mode switching\n initialMode = 'chat',\n showModeToggle = false,\n onModeChange,\n // Command mode options\n commandVariant = 'default',\n planMode = false,\n onPlanModeChange,\n enableStreaming = true,\n showProgress = true,\n loadingText = 'Processing...',\n // Welcome screen\n welcomeTitle,\n welcomeSubtitle,\n welcomeIcon,\n suggestedPrompts,\n welcomeVariant,\n // Events\n onThreadChange,\n onMessageSent,\n onAction,\n onFileUpload,\n onComplete,\n onError,\n onToolCall,\n onToolResult,\n // UI\n variant = 'default',\n placeholder,\n showHeader = true,\n headerTitle = 'Chat',\n onHeaderBack,\n\n // Tool call display\n toolCallStyle = 'card',\n\n // Widget detection\n enableWidgets = false,\n availableWidgets,\n compactWidgetContext = false,\n onWidgetRender,\n\n className,\n}: ChatProps, ref: React.ForwardedRef<ChatHandle>) {\n const [messages, setMessages] = useState<MessageType[]>(initialMessages);\n const [isLoading, setIsLoading] = useState(false);\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(threadId || null);\n const [mode, setMode] = useState<'chat' | 'command'>(initialMode);\n const [chatToolName, setChatToolName] = useState<string | null>(null); // Track tool name for chat mode header\n\n // Command mode state\n const [commandState, setCommandState] = useState<'idle' | 'loading' | 'success' | 'error' | 'plan-pending'>('idle');\n const [commandResult, setCommandResult] = useState<CommandResult | null>(null);\n const [commandError, setCommandError] = useState<Error | null>(null);\n const [progress, setProgress] = useState(0);\n const [commandInput, setCommandInput] = useState('');\n const [streamedContent, setStreamedContent] = useState('');\n const [currentToolName, setCurrentToolName] = useState<string | null>(null);\n const [currentRequestId, setCurrentRequestId] = useState<string | null>(null);\n const [plan, setPlan] = useState<string>('');\n const [pendingCommand, setPendingCommand] = useState<string>('');\n const [internalPlanMode, setInternalPlanMode] = useState(planMode);\n const [showSettingsMenu, setShowSettingsMenu] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Persistent widgets: keyed by widget.id, survives across messages\n const [persistentWidgets, setPersistentWidgets] = useState<Map<string, Widget>>(new Map());\n\n // Collect persistent widgets from all messages\n const updatePersistentWidgets = useCallback((msgs: MessageType[]) => {\n setPersistentWidgets(prev => {\n const next = new Map(prev);\n let changed = false;\n for (const msg of msgs) {\n if (!msg.widgets) continue;\n for (const w of msg.widgets) {\n if (!w.persistent) continue;\n const existing = next.get(w.id);\n // Update if new or props changed\n if (!existing || existing !== w) {\n next.set(w.id, w);\n changed = true;\n }\n }\n }\n return changed ? next : prev;\n });\n }, []);\n\n // Sync persistent widgets whenever messages change\n useEffect(() => {\n updatePersistentWidgets(messages);\n }, [messages, updatePersistentWidgets]);\n\n const persistentWidgetList = useMemo(() => Array.from(persistentWidgets.values()), [persistentWidgets]);\n const persistentWidgetIds = useMemo(() => new Set(persistentWidgets.keys()), [persistentWidgets]);\n\n // Store handleSendMessage ref so we can call it from useImperativeHandle\n const handleSendMessageRef = useRef<((text: string, files?: File[], isSystem?: boolean) => Promise<void>) | null>(null);\n\n // Expose imperative methods via ref\n useImperativeHandle(ref, () => ({\n sendMessage: async (text: string) => {\n if (handleSendMessageRef.current) {\n await handleSendMessageRef.current(text);\n }\n },\n sendSystemMessage: async (text: string) => {\n if (handleSendMessageRef.current) {\n await handleSendMessageRef.current(text, undefined, true);\n }\n },\n getMessages: () => messages,\n clearMessages: () => setMessages([]),\n }), [messages]);\n\n // Generate effective context with widget definitions if enabled\n const effectiveContext = useMemo(() => {\n if (!enableWidgets) return context;\n const widgetContext = compactWidgetContext\n ? generateCompactWidgetContext(availableWidgets)\n : generateWidgetContext(availableWidgets);\n return context ? `${context}\\n${widgetContext}` : widgetContext;\n }, [context, enableWidgets, availableWidgets, compactWidgetContext]);\n\n // Configure API client if props provided\n useEffect(() => {\n if (apiUrl || apiKey) {\n aptevaClient.configure({\n ...(apiUrl && { apiUrl }),\n ...(apiKey && { apiKey }),\n });\n }\n }, [apiUrl, apiKey]);\n\n useEffect(() => {\n if (threadId) {\n onThreadChange?.(threadId);\n }\n }, [threadId, onThreadChange]);\n\n // Auto-load thread messages when threadId is provided\n // TODO: Enable when thread loading API is ready\n // useEffect(() => {\n // if (!threadId || useMock) return;\n // let cancelled = false;\n // async function loadThreadMessages() {\n // try {\n // const apiMessages = await aptevaClient.getThreadMessages(threadId!);\n // if (cancelled) return;\n // const converted = convertApiMessages(apiMessages as ApiMessage[]);\n // setMessages(converted);\n // } catch (err) {\n // console.error('[Chat] Failed to load thread messages:', err);\n // }\n // }\n // loadThreadMessages();\n // return () => { cancelled = true; };\n // }, [threadId, useMock]);\n\n // Sync internal plan mode with prop\n useEffect(() => {\n setInternalPlanMode(planMode);\n }, [planMode]);\n\n // Close settings menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (showSettingsMenu && !target.closest('.settings-menu-container')) {\n setShowSettingsMenu(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showSettingsMenu]);\n\n const handleModeChange = (newMode: 'chat' | 'command') => {\n setMode(newMode);\n onModeChange?.(newMode);\n // Reset command state when switching modes\n if (newMode === 'command') {\n setCommandState('idle');\n setCommandResult(null);\n setCommandError(null);\n }\n };\n\n const defaultPlaceholder = mode === 'chat' ? 'Type a message...' : 'Enter your command...';\n\n // Default widget action handler - sends form data as a chat message\n const handleWidgetAction = useCallback((action: import('../../types/actions').ActionEvent) => {\n // Always forward to consumer's onAction\n onAction?.(action);\n\n // Default behavior: send form submissions as chat messages\n if (action.type === 'submit' && action.payload?.formData) {\n const formData = action.payload.formData;\n const lines: string[] = [];\n for (const [key, value] of Object.entries(formData)) {\n // Skip file objects - just include file names\n if (Array.isArray(value) && value.length > 0 && value[0] instanceof File) {\n const fileNames = (value as File[]).map(f => f.name).join(', ');\n lines.push(`${key}: ${fileNames}`);\n } else if (value !== '' && value !== false && value != null) {\n lines.push(`${key}: ${value}`);\n }\n }\n if (lines.length > 0 && handleSendMessageRef.current) {\n // Collect any File objects from formData for upload\n const files: File[] = [];\n for (const value of Object.values(formData)) {\n if (Array.isArray(value) && value.length > 0 && value[0] instanceof File) {\n files.push(...(value as File[]));\n }\n }\n handleSendMessageRef.current(lines.join('\\n'), files.length > 0 ? files : undefined);\n }\n }\n }, [onAction]);\n\n // ==================== CHAT MODE LOGIC ====================\n const handleSendMessage = async (text: string, files?: File[], isSystem?: boolean) => {\n // Build display content for user message\n const hasFiles = files && files.length > 0;\n\n // Create attachment objects with previews for display\n const attachments = hasFiles ? files.map(f => ({\n name: f.name,\n type: f.type,\n size: f.size,\n preview: f.type.startsWith('image/') ? URL.createObjectURL(f) : undefined,\n })) : [];\n\n // Only add user message to UI if not a system message\n if (!isSystem) {\n const userMessage: MessageType = {\n id: `msg-${Date.now()}`,\n role: 'user',\n content: text,\n timestamp: new Date(),\n metadata: hasFiles ? { attachments } : undefined,\n };\n\n setMessages((prev) => [...prev, userMessage]);\n onMessageSent?.(userMessage);\n }\n setIsLoading(true);\n\n try {\n // Build structured message with attachments\n const messagePayload = await buildMessageWithAttachments(text, files);\n\n if (useMock) {\n const response = await generateMockResponse(1000);\n setMessages((prev) => [...prev, response]);\n } else {\n let contentSegments: Array<{ type: 'text'; content: string } | { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; inputLength?: number; result?: any; streamOutput?: string }> = [];\n let currentTextBuffer = '';\n let accumulatedWidgets: Widget[] = [];\n let responseThreadId = currentThreadId;\n const toolInputBuffers: Record<string, string> = {}; // Per-tool input buffers\n const receivingTimeouts: Record<string, ReturnType<typeof setTimeout>> = {};\n const streamingMessageId = `msg-${Date.now()}-res`; // Stable ID for entire stream\n\n const updateMessage = () => {\n const segments = [...contentSegments];\n if (currentTextBuffer) {\n const lastSegment = segments[segments.length - 1];\n if (lastSegment && lastSegment.type === 'text') {\n lastSegment.content = currentTextBuffer;\n } else {\n segments.push({ type: 'text', content: currentTextBuffer });\n }\n }\n\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n return [\n ...prev.slice(0, -1),\n {\n ...lastMessage,\n content: currentTextBuffer,\n widgets: accumulatedWidgets.length > 0 ? accumulatedWidgets : undefined,\n metadata: { ...lastMessage.metadata, content_segments: segments, isStreaming: true },\n }\n ];\n } else {\n return [\n ...prev,\n {\n id: streamingMessageId,\n role: 'assistant' as const,\n content: currentTextBuffer,\n widgets: accumulatedWidgets.length > 0 ? accumulatedWidgets : undefined,\n timestamp: new Date(),\n metadata: { content_segments: segments, isStreaming: true },\n }\n ];\n }\n });\n };\n\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: messagePayload,\n stream: true,\n ...(currentThreadId && { thread_id: currentThreadId }),\n ...(effectiveContext && { system: effectiveContext }),\n },\n (chunk) => {\n switch (chunk.type) {\n case 'thread_id':\n if (chunk.thread_id) {\n responseThreadId = chunk.thread_id;\n if (!currentThreadId) {\n setCurrentThreadId(chunk.thread_id);\n onThreadChange?.(chunk.thread_id);\n }\n }\n break;\n case 'request_id':\n if (chunk.request_id) {\n setCurrentRequestId(chunk.request_id);\n }\n break;\n case 'content':\n case 'token':\n if (chunk.content) {\n // Trim leading whitespace at start of each text segment\n // Some models emit \"\\n\\n\" as the first token\n if (!currentTextBuffer) {\n currentTextBuffer = chunk.content.trimStart();\n } else {\n currentTextBuffer += chunk.content;\n }\n if (currentTextBuffer) {\n updateMessage();\n }\n }\n break;\n case 'tool_call':\n if (chunk.tool_id && chunk.tool_name) {\n const displayName = chunk.tool_display_name || chunk.tool_name;\n if (currentTextBuffer) {\n contentSegments.push({ type: 'text', content: currentTextBuffer.trimEnd() });\n currentTextBuffer = '';\n }\n contentSegments.push({ type: 'tool', id: chunk.tool_id, name: displayName, status: 'preparing' });\n toolInputBuffers[chunk.tool_id] = ''; // Initialize per-tool buffer\n setChatToolName(displayName); // Show tool name in header\n onToolCall?.(chunk.tool_name, chunk.tool_id);\n updateMessage();\n }\n break;\n case 'tool_input_delta':\n if (chunk.tool_id && chunk.content) {\n const toolId = chunk.tool_id;\n // Initialize buffer if not exists (in case we missed tool_call)\n if (toolInputBuffers[toolId] === undefined) {\n toolInputBuffers[toolId] = '';\n }\n toolInputBuffers[toolId] += chunk.content;\n\n // Set isReceiving to true and update inputLength\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === toolId) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; inputLength?: number; result?: any } | undefined;\n if (toolSegment) {\n toolSegment.isReceiving = true;\n toolSegment.inputLength = toolInputBuffers[toolId].length;\n updateMessage();\n // Clear isReceiving after a short delay if no more chunks\n if (receivingTimeouts[toolId]) clearTimeout(receivingTimeouts[toolId]);\n receivingTimeouts[toolId] = setTimeout(() => {\n if (toolSegment.status === 'preparing') {\n toolSegment.isReceiving = false;\n updateMessage();\n }\n }, 150);\n }\n }\n break;\n case 'tool_use':\n // Tool input complete, now executing\n if (chunk.tool_id) {\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === chunk.tool_id) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; result?: any; streamOutput?: string } | undefined;\n if (toolSegment && toolSegment.status === 'preparing') {\n toolSegment.status = 'running';\n toolSegment.isReceiving = false;\n updateMessage();\n }\n }\n break;\n case 'tool_stream':\n // Handle streaming output from tool execution\n // Chunks accumulate within a group. Log/progress events mark reset for next group.\n if (chunk.tool_id) {\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === chunk.tool_id) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; streamOutput?: string; pendingReset?: boolean } | undefined;\n if (toolSegment) {\n if (chunk.event === 'chunk' && chunk.content) {\n // If pending reset, clear before accumulating new group\n if (toolSegment.pendingReset) {\n toolSegment.streamOutput = '';\n toolSegment.pendingReset = false;\n }\n // Accumulate chunk content\n toolSegment.streamOutput = (toolSegment.streamOutput || '') + chunk.content;\n updateMessage();\n } else if (chunk.event === 'log' || chunk.event === 'progress') {\n // Mark for reset on next chunk (keeps current output visible until then)\n toolSegment.pendingReset = true;\n }\n }\n }\n break;\n case 'tool_result':\n if (chunk.tool_id) {\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === chunk.tool_id) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; result?: any } | undefined;\n if (toolSegment) {\n toolSegment.result = chunk.content;\n toolSegment.status = 'completed';\n toolSegment.isReceiving = false;\n onToolResult?.(toolSegment.name, chunk.content);\n }\n setChatToolName(null); // Clear tool name from header\n updateMessage();\n }\n break;\n case 'widget':\n if (chunk.widget) {\n accumulatedWidgets.push(chunk.widget);\n // Widget reporting happens in Message.tsx to avoid duplicates\n updateMessage();\n }\n break;\n case 'error':\n throw new Error(chunk.message || 'Stream error');\n }\n },\n (threadId) => {\n currentTextBuffer = currentTextBuffer.trimEnd();\n if (currentTextBuffer) {\n const lastSegment = contentSegments[contentSegments.length - 1];\n if (lastSegment && lastSegment.type === 'text') {\n lastSegment.content = currentTextBuffer;\n } else {\n contentSegments.push({ type: 'text', content: currentTextBuffer });\n }\n }\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n return [\n ...prev.slice(0, -1),\n {\n ...lastMessage,\n // Keep the same ID to avoid React remounting the component\n content: currentTextBuffer || 'Response received',\n widgets: accumulatedWidgets.length > 0 ? accumulatedWidgets : undefined,\n metadata: { thread_id: threadId, content_segments: contentSegments, isStreaming: false },\n }\n ];\n }\n return prev;\n });\n if (threadId && threadId !== currentThreadId) {\n setCurrentThreadId(threadId);\n onThreadChange?.(threadId);\n }\n setIsLoading(false);\n setCurrentRequestId(null);\n setChatToolName(null);\n },\n (error) => {\n const errorMessage: MessageType = {\n id: `msg-${Date.now()}-error`,\n role: 'assistant',\n content: `Error: ${error.message}`,\n timestamp: new Date(),\n metadata: { error: true },\n };\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.id.includes('streaming')) {\n return [...prev.slice(0, -1), errorMessage];\n }\n return [...prev, errorMessage];\n });\n setIsLoading(false);\n setCurrentRequestId(null);\n setChatToolName(null);\n onError?.(error);\n }\n );\n }\n } catch (error) {\n const errorMessage: MessageType = {\n id: `msg-${Date.now()}-error`,\n role: 'assistant',\n content: error instanceof Error ? `Error: ${error.message}` : 'An error occurred',\n timestamp: new Date(),\n metadata: { error: true },\n };\n setMessages((prev) => [...prev, errorMessage]);\n onError?.(error instanceof Error ? error : new Error('Unknown error'));\n } finally {\n setIsLoading(false);\n }\n };\n\n // Assign to ref so useImperativeHandle can call it\n handleSendMessageRef.current = handleSendMessage;\n\n // ==================== COMMAND MODE LOGIC ====================\n const executeCommand = async (commandOverride?: string, files?: File[]) => {\n const currentCommand = commandOverride || commandInput;\n if (!currentCommand.trim() && (!files || files.length === 0)) {\n setCommandError(new Error('Please enter a command'));\n setCommandState('error');\n return;\n }\n\n // Plan mode: show plan first\n if (internalPlanMode && commandState !== 'plan-pending') {\n setCommandState('loading');\n setCommandError(null);\n setCommandInput('');\n\n if (useMock) {\n setTimeout(() => {\n const mockPlan = `1. Analyze the request: \"${currentCommand}\"\\n2. Process the data\\n3. Generate response\\n4. Return results`;\n setPlan(mockPlan);\n setPendingCommand(currentCommand);\n setCommandState('plan-pending');\n }, 800);\n } else {\n try {\n const planningInstruction = `CRITICAL PLANNING MODE: You are ONLY creating a plan. Write a numbered list of steps describing what WOULD be done. DO NOT execute anything.`;\n const systemMessage = effectiveContext ? `${effectiveContext}\\n\\n${planningInstruction}` : planningInstruction;\n\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: currentCommand,\n stream: false,\n system: systemMessage,\n });\n setPlan(response.message);\n setPendingCommand(currentCommand);\n setCommandState('plan-pending');\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to generate plan');\n setCommandError(error);\n setCommandState('error');\n onError?.(error);\n }\n }\n return;\n }\n\n setCommandState('loading');\n setCommandError(null);\n setProgress(0);\n setStreamedContent('');\n setCommandInput('');\n\n try {\n if (useMock) {\n if (enableStreaming) {\n let accumulatedContent = '';\n generateMockCommandStream(\n currentCommand,\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n }\n },\n (threadId) => {\n const result: CommandResult = {\n success: true,\n data: { summary: accumulatedContent, thread_id: threadId },\n message: accumulatedContent || 'Command executed successfully',\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n onComplete?.(result);\n },\n (error) => {\n setCommandError(error);\n setCommandState('error');\n onError?.(error);\n }\n );\n } else {\n await new Promise(resolve => setTimeout(resolve, 1500));\n const result: CommandResult = {\n success: true,\n data: { summary: `Executed: ${currentCommand}` },\n message: `Command executed successfully`,\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n onComplete?.(result);\n }\n } else {\n // Real API\n const commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute the command immediately. Make reasonable assumptions based on context. Use sensible defaults for missing details. DO NOT ask questions unless something is truly impossible without user input (e.g., missing required password). State what you\\'re doing or the result. Examples: \"Analyzing customer data from last quarter...\" or \"Created 5 new database entries successfully\" or \"Search complete: found 12 matching results\". NO greetings, NO filler words, NO clarification requests. Action/result only.';\n const systemMessage = effectiveContext ? `${effectiveContext}\\n\\n${commandInstruction}` : commandInstruction;\n\n // Build message with attachments if files provided\n const messagePayload = files && files.length > 0\n ? await buildMessageWithAttachments(currentCommand, files)\n : currentCommand;\n\n if (enableStreaming) {\n let accumulatedContent = '';\n let lastToolName = '';\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: messagePayload,\n stream: true,\n ...(currentThreadId && { thread_id: currentThreadId }),\n system: systemMessage,\n },\n (chunk) => {\n if ((chunk.type === 'token' || chunk.type === 'content') && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n setCurrentToolName(null); // Clear tool name when we get content\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n } else if (chunk.type === 'tool_call' && chunk.tool_name) {\n const displayName = chunk.tool_display_name || chunk.tool_name;\n lastToolName = chunk.tool_name;\n setCurrentToolName(displayName);\n onToolCall?.(chunk.tool_name, chunk.tool_id || '');\n // Reset for display - show only tool, not accumulated text\n accumulatedContent = '';\n setStreamedContent('');\n } else if (chunk.type === 'tool_result') {\n onToolResult?.(lastToolName, chunk.content);\n setCurrentToolName(null); // Tool finished, will show next content\n } else if (chunk.type === 'thread_id' && chunk.thread_id) {\n if (!currentThreadId) {\n setCurrentThreadId(chunk.thread_id);\n onThreadChange?.(chunk.thread_id);\n }\n } else if (chunk.type === 'request_id' && chunk.request_id) {\n setCurrentRequestId(chunk.request_id);\n }\n },\n (threadId) => {\n const result: CommandResult = {\n success: true,\n data: { summary: accumulatedContent, thread_id: threadId },\n message: accumulatedContent || 'Command executed successfully',\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n setCurrentRequestId(null);\n onComplete?.(result);\n },\n (error) => {\n setCommandError(error);\n setCommandState('error');\n setCurrentRequestId(null);\n onError?.(error);\n }\n );\n } else {\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: messagePayload,\n stream: false,\n ...(currentThreadId && { thread_id: currentThreadId }),\n system: systemMessage,\n });\n const result: CommandResult = {\n success: true,\n data: { summary: response.message, thread_id: response.thread_id },\n widgets: response.widgets,\n message: response.message,\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n onComplete?.(result);\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setCommandError(error);\n setCommandState('error');\n onError?.(error);\n }\n };\n\n const resetCommand = () => {\n setCommandState('idle');\n setCommandResult(null);\n setCommandError(null);\n setProgress(0);\n setCommandInput('');\n setPlan('');\n setPendingCommand('');\n setStreamedContent('');\n setCurrentToolName(null);\n };\n\n const approvePlan = () => {\n const planToExecute = plan;\n setPlan('');\n setPendingCommand('');\n const executionMessage = `Execute this plan now:\\n\\n${planToExecute}`;\n executeCommand(executionMessage);\n };\n\n const rejectPlan = () => {\n setCommandInput(pendingCommand);\n setPlan('');\n setPendingCommand('');\n setCommandState('idle');\n };\n\n // Stop generation handler\n const handleStop = async () => {\n // Call cancel API if we have a request ID\n if (currentRequestId && agentId) {\n try {\n await aptevaClient.cancelRequest(agentId, currentRequestId);\n } catch (error) {\n console.error('Failed to cancel request:', error);\n }\n }\n\n // For chat mode\n setIsLoading(false);\n // For command mode\n if (commandState === 'loading') {\n setCommandState('idle');\n setStreamedContent('');\n setCurrentToolName(null);\n setProgress(0);\n }\n // Clear request ID\n setCurrentRequestId(null);\n };\n\n const isCompact = commandVariant === 'compact';\n\n // ==================== RENDER ====================\n return (\n <div className={cn('apteva-chat flex flex-col h-full', variant !== 'default' && `apteva-chat-${variant}`, className)}>\n {/* Header - only show in chat mode when showHeader is true */}\n {showHeader && mode === 'chat' && (\n <div className=\"apteva-chat-header px-4 py-3\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n {onHeaderBack && (\n <button onClick={onHeaderBack} className=\"apteva-chat-back\" style={{ flexShrink: 0 }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M10 12L6 8l4-4\"/></svg>\n </button>\n )}\n <div>\n <div className=\"apteva-chat-title\">{headerTitle}</div>\n <div className={cn(\n \"apteva-chat-status\",\n isLoading\n ? chatToolName\n ? \"apteva-chat-status-tool\"\n : \"apteva-chat-status-thinking\"\n : \"apteva-chat-status-ready\"\n )}>\n {isLoading\n ? chatToolName\n ? `Using ${chatToolName}...`\n : 'Thinking...'\n : 'Ready'}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* CHAT MODE */}\n {mode === 'chat' && (\n <>\n {persistentWidgetList.length > 0 && (\n <PersistentWidgetPanel widgets={persistentWidgetList} onAction={handleWidgetAction} />\n )}\n <MessageList\n messages={messages}\n onAction={handleWidgetAction}\n welcomeTitle={welcomeTitle}\n welcomeSubtitle={welcomeSubtitle}\n welcomeIcon={welcomeIcon}\n suggestedPrompts={suggestedPrompts}\n welcomeVariant={welcomeVariant}\n chatVariant={variant}\n onPromptClick={(prompt) => handleSendMessage(prompt)}\n enableWidgets={enableWidgets}\n onWidgetRender={onWidgetRender}\n persistentWidgetIds={persistentWidgetIds}\n toolCallStyle={toolCallStyle}\n />\n <Composer\n onSendMessage={handleSendMessage}\n placeholder={placeholder || defaultPlaceholder}\n disabled={isLoading}\n isLoading={isLoading}\n onStop={handleStop}\n onFileUpload={onFileUpload}\n onSwitchMode={showModeToggle ? () => handleModeChange('command') : undefined}\n />\n </>\n )}\n\n {/* COMMAND MODE - Self-contained composer with inline response */}\n {mode === 'command' && (\n <div className=\"w-full\">\n <CommandComposer\n onExecute={(text, files) => {\n setCommandInput(text);\n executeCommand(text, files);\n }}\n state={commandState}\n response={commandResult?.data?.summary || commandResult?.message}\n error={commandError?.message}\n plan={plan}\n streamedContent={streamedContent}\n toolName={currentToolName}\n onApprove={approvePlan}\n onReject={rejectPlan}\n onReset={resetCommand}\n onStop={handleStop}\n onExpand={showModeToggle ? () => handleModeChange('chat') : undefined}\n placeholder={placeholder || 'Enter your command...'}\n />\n </div>\n )}\n\n <style dangerouslySetInnerHTML={{\n __html: `\n @keyframes pulse-border {\n 0%, 100% { border-color: rgb(59, 130, 246); }\n 50% { border-color: rgb(147, 197, 253); }\n }\n .animate-pulse-border {\n animation: pulse-border 2s ease-in-out infinite;\n }\n .apteva-composer {\n border-radius: var(--apteva-border-radius, 1rem) !important;\n }\n `\n }} />\n </div>\n );\n});\n","import { useEffect, useRef } from 'react';\nimport { Message as MessageType } from '../../types/messages';\nimport { SuggestedPrompt } from '../../types/components';\nimport { Widget } from '../../types/widgets';\nimport { Message } from './Message';\nimport { WelcomeScreen } from './WelcomeScreen';\nimport { ActionEvent } from '../../types/actions';\n\ninterface MessageListProps {\n messages: MessageType[];\n onAction?: (action: ActionEvent) => void;\n // Welcome screen props\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeIcon?: React.ReactNode;\n suggestedPrompts?: (string | SuggestedPrompt)[];\n welcomeVariant?: 'centered' | 'minimal';\n chatVariant?: 'default' | 'minimal' | 'terminal';\n onPromptClick?: (prompt: string) => void;\n // Widget detection\n enableWidgets?: boolean;\n onWidgetRender?: (widget: Widget) => void;\n // Persistent widgets (rendered in panel, show reference card in messages)\n persistentWidgetIds?: Set<string>;\n // Tool call display style\n toolCallStyle?: 'card' | 'inline';\n}\n\nexport function MessageList({\n messages,\n onAction,\n welcomeTitle,\n welcomeSubtitle,\n welcomeIcon,\n suggestedPrompts,\n welcomeVariant,\n chatVariant,\n onPromptClick,\n enableWidgets,\n onWidgetRender,\n persistentWidgetIds,\n toolCallStyle,\n}: MessageListProps) {\n const listRef = useRef<HTMLDivElement>(null);\n const isNearBottomRef = useRef(true);\n const lastScrollHeightRef = useRef(0);\n\n // Track if user is near bottom\n const handleScroll = () => {\n if (listRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = listRef.current;\n // Consider \"near bottom\" if within 100px of the bottom\n isNearBottomRef.current = scrollHeight - scrollTop - clientHeight < 100;\n }\n };\n\n useEffect(() => {\n // Only auto-scroll if user is near bottom\n if (listRef.current && isNearBottomRef.current) {\n const currentScrollHeight = listRef.current.scrollHeight;\n // Only scroll if content height actually changed\n if (currentScrollHeight !== lastScrollHeightRef.current) {\n listRef.current.scrollTop = currentScrollHeight;\n lastScrollHeightRef.current = currentScrollHeight;\n }\n }\n }, [messages]);\n\n return (\n <div ref={listRef} className=\"apteva-message-list apteva-scrollbar-hidden\" onScroll={handleScroll}>\n {messages.length === 0 ? (\n <WelcomeScreen\n title={welcomeTitle}\n subtitle={welcomeSubtitle}\n icon={welcomeIcon}\n prompts={suggestedPrompts}\n variant={welcomeVariant}\n chatVariant={chatVariant}\n onPromptClick={onPromptClick || (() => {})}\n />\n ) : (\n messages.map((message) => (\n <div key={message.id} className={message.role === 'user' ? 'apteva-message-row-user' : 'apteva-message-row-assistant'}>\n <Message message={message} onAction={onAction} enableWidgets={enableWidgets} onWidgetRender={onWidgetRender} persistentWidgetIds={persistentWidgetIds} toolCallStyle={toolCallStyle} />\n </div>\n ))\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useMemo } from 'react';\nimport { Message as MessageType } from '../../types/messages';\nimport { Widget } from '../../types/widgets';\nimport { cn, parseWidgetsFromText, formatFileSize } from '../../utils';\nimport { Widgets } from '../Widgets';\nimport { ActionEvent } from '../../types/actions';\nimport { MarkdownContent } from './MarkdownContent';\nimport { ToolCall } from './ToolCall';\nimport { ToolCallGroup } from './ToolCallGroup';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { WidgetSkeleton } from '../Widgets/WidgetSkeleton';\nimport { PersistentWidgetRef } from './PersistentWidgetRef';\n\ninterface Attachment {\n name: string;\n type: string;\n size: number;\n preview?: string;\n}\n\ntype ContentSegment =\n | { type: 'text'; content: string }\n | { type: 'tool'; id: string; name: string; status?: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; inputLength?: number; result?: any; streamOutput?: string };\n\ninterface MessageProps {\n message: MessageType;\n onAction?: (action: ActionEvent) => void;\n enableWidgets?: boolean;\n onWidgetRender?: (widget: Widget) => void;\n persistentWidgetIds?: Set<string>;\n toolCallStyle?: 'card' | 'inline';\n}\n\nexport function Message({ message, onAction, enableWidgets, onWidgetRender, persistentWidgetIds, toolCallStyle = 'card' }: MessageProps) {\n const isUser = message.role === 'user';\n const contentSegments = message.metadata?.content_segments as ContentSegment[] | undefined;\n const isStreaming = message.metadata?.isStreaming === true;\n const hasContent = message.content || (contentSegments && contentSegments.length > 0);\n\n // Track which widgets we've already reported to avoid duplicates\n const reportedWidgetsRef = useRef<Set<string>>(new Set());\n\n // Parse widgets from content (memoized to avoid reparsing on every render)\n const parsedWidgets = useMemo(() => {\n if (!enableWidgets || isUser || !message.content) {\n return [];\n }\n const parsed = parseWidgetsFromText(message.content);\n return parsed.segments\n .filter((seg): seg is { type: 'widget'; widget: Widget } => seg.type === 'widget' && !!seg.widget)\n .map(seg => seg.widget);\n }, [enableWidgets, isUser, message.content]);\n\n // Report message.widgets when they change\n useEffect(() => {\n if (onWidgetRender && message.widgets) {\n for (const widget of message.widgets) {\n if (!reportedWidgetsRef.current.has(widget.id)) {\n reportedWidgetsRef.current.add(widget.id);\n onWidgetRender(widget);\n }\n }\n }\n }, [message.widgets, onWidgetRender]);\n\n // Report parsed widgets from text content (after render)\n useEffect(() => {\n if (onWidgetRender && parsedWidgets.length > 0) {\n for (const widget of parsedWidgets) {\n if (!reportedWidgetsRef.current.has(widget.id)) {\n reportedWidgetsRef.current.add(widget.id);\n onWidgetRender(widget);\n }\n }\n }\n }, [parsedWidgets, onWidgetRender]);\n\n // Render text content (markdown only, no widgets - widgets rendered separately)\n const renderTextContent = (text: string) => {\n if (!enableWidgets || isUser) {\n return <MarkdownContent content={text} />;\n }\n\n // Parse to get cleaned text (strips @ui: patterns)\n const parsed = parseWidgetsFromText(text);\n\n // Combine all text segments\n const cleanedText = parsed.segments\n .filter(seg => seg.type === 'text' && seg.content)\n .map(seg => seg.content)\n .join('');\n\n if (!cleanedText.trim()) {\n return null;\n }\n\n return <MarkdownContent content={cleanedText} />;\n };\n\n // Render content with widgets as separate elements (like tool calls)\n const renderContentWithWidgets = () => {\n if (!enableWidgets || isUser || !message.content) {\n return null;\n }\n\n const parsed = parseWidgetsFromText(message.content);\n const elements: React.ReactNode[] = [];\n let textBuffer = '';\n\n parsed.segments.forEach((segment, index) => {\n if (segment.type === 'text' && segment.content) {\n textBuffer += segment.content;\n } else if (segment.type === 'widget' && segment.widget) {\n // Flush text buffer as a bubble\n if (textBuffer.trim()) {\n elements.push(\n <div key={`text-${index}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n // Render widget standalone\n elements.push(\n <div key={`widget-${index}`} className=\"apteva-widget-standalone\">\n <WidgetRenderer widget={segment.widget} onAction={onAction} />\n </div>\n );\n } else if (segment.type === 'widget_pending' && segment.pendingType) {\n // Flush text buffer as a bubble\n if (textBuffer.trim()) {\n elements.push(\n <div key={`text-${index}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n // Render skeleton standalone\n elements.push(\n <div key={`pending-${index}`} className=\"apteva-widget-standalone\">\n <WidgetSkeleton type={segment.pendingType} />\n </div>\n );\n }\n });\n\n // Flush remaining text\n if (textBuffer.trim()) {\n elements.push(\n <div key=\"text-final\" className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n }\n\n return elements.length > 0 ? elements : null;\n };\n\n // Get attachments from metadata\n const attachments = (message.metadata?.attachments as Attachment[] | undefined) || [];\n const hasAttachments = attachments.length > 0;\n\n // Render attachments for user messages\n const renderAttachments = () => {\n if (!hasAttachments) return null;\n\n return (\n <div className=\"apteva-message-attachments flex flex-wrap gap-2 mb-2 justify-end\">\n {attachments.map((att, index) => {\n const isImage = att.type.startsWith('image/');\n const isPdf = att.type === 'application/pdf';\n\n if (isImage && att.preview) {\n return (\n <div key={index} className=\"apteva-attachment-image relative rounded-lg overflow-hidden shadow-sm\">\n <img\n src={att.preview}\n alt={att.name}\n className=\"max-w-[150px] max-h-[150px] object-cover\"\n />\n </div>\n );\n }\n\n // PDF and other documents\n return (\n <div\n key={index}\n className=\"apteva-attachment-doc flex items-center gap-3 px-4 py-3 bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-xl shadow-sm\"\n >\n <div className=\"w-10 h-10 flex items-center justify-center bg-red-100 dark:bg-red-900/30 rounded-lg text-red-600 dark:text-red-400\">\n {isPdf ? (\n <svg className=\"w-5 h-5\" 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 <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium text-neutral-800 dark:text-neutral-200 truncate max-w-[180px]\">\n {att.name}\n </span>\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {isPdf ? 'PDF' : 'Document'} · {formatFileSize(att.size)}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n };\n\n // Render content with inline tool calls\n const renderContent = () => {\n if (isUser) {\n return <div className=\"apteva-message-text\">{message.content}</div>;\n }\n\n // Show typing indicator for streaming messages without content\n if (isStreaming && !hasContent) {\n return (\n <div className=\"apteva-typing-indicator\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n );\n }\n\n // If we have content segments, render them in order\n // This is handled differently - returns array of elements for split bubbles\n if (contentSegments && contentSegments.length > 0) {\n return null; // Handled by renderSegmentedContent\n }\n\n // Fallback to just content\n return renderTextContent(message.content);\n };\n\n // Render text segment with widgets separated out\n const renderTextSegmentWithWidgets = (text: string, keyPrefix: string) => {\n if (!enableWidgets) {\n return (\n <div key={keyPrefix} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={text} />\n </div>\n </div>\n );\n }\n\n const parsed = parseWidgetsFromText(text);\n const elements: React.ReactNode[] = [];\n let textBuffer = '';\n\n parsed.segments.forEach((seg, idx) => {\n if (seg.type === 'text' && seg.content) {\n textBuffer += seg.content;\n } else if (seg.type === 'widget' && seg.widget) {\n if (textBuffer.trim()) {\n elements.push(\n <div key={`${keyPrefix}-text-${idx}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n elements.push(\n <div key={`${keyPrefix}-widget-${idx}`} className=\"apteva-widget-standalone\">\n <WidgetRenderer widget={seg.widget} onAction={onAction} />\n </div>\n );\n } else if (seg.type === 'widget_pending' && seg.pendingType) {\n if (textBuffer.trim()) {\n elements.push(\n <div key={`${keyPrefix}-text-${idx}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n elements.push(\n <div key={`${keyPrefix}-pending-${idx}`} className=\"apteva-widget-standalone\">\n <WidgetSkeleton type={seg.pendingType} />\n </div>\n );\n }\n });\n\n if (textBuffer.trim()) {\n elements.push(\n <div key={`${keyPrefix}-text-final`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n }\n\n return elements;\n };\n\n // Render segmented content with separate bubbles for text and tool calls outside bubbles\n const renderSegmentedContent = () => {\n if (!contentSegments || contentSegments.length === 0) {\n return null;\n }\n\n // Group consecutive tool segments into runs\n const groups: Array<\n | { type: 'text'; content: string; index: number }\n | { type: 'tools'; tools: ContentSegment[] }\n > = [];\n\n let currentToolRun: ContentSegment[] = [];\n\n const flushToolRun = () => {\n if (currentToolRun.length > 0) {\n groups.push({ type: 'tools', tools: [...currentToolRun] });\n currentToolRun = [];\n }\n };\n\n contentSegments.forEach((segment, index) => {\n if (segment.type === 'tool') {\n currentToolRun.push(segment);\n } else {\n flushToolRun();\n if (segment.type === 'text' && segment.content) {\n groups.push({ type: 'text', content: segment.content, index });\n }\n }\n });\n flushToolRun();\n\n const elements: React.ReactNode[] = [];\n\n groups.forEach((group, groupIndex) => {\n if (group.type === 'text') {\n const textElements = renderTextSegmentWithWidgets(group.content, `seg-${group.index}`);\n if (Array.isArray(textElements)) {\n elements.push(...textElements);\n } else {\n elements.push(textElements);\n }\n } else if (group.type === 'tools') {\n if (toolCallStyle === 'inline') {\n // Inline mode: render each tool as a simple divider line\n group.tools.forEach(segment => {\n if (segment.type === 'tool') {\n elements.push(\n <div key={segment.id} className=\"apteva-tool-call-standalone\">\n <ToolCall\n name={segment.name}\n status={segment.status || (segment.result !== undefined ? 'completed' : 'running')}\n isReceiving={segment.isReceiving}\n inputLength={segment.inputLength}\n streamOutput={segment.streamOutput}\n variant=\"inline\"\n />\n </div>\n );\n }\n });\n } else if (group.tools.length >= 3) {\n // Render as compact group\n const toolData = group.tools.map(t => {\n const tool = t as Extract<ContentSegment, { type: 'tool' }>;\n return {\n id: tool.id,\n name: tool.name,\n status: tool.status || (tool.result !== undefined ? 'completed' as const : 'running' as const),\n isReceiving: tool.isReceiving,\n streamOutput: tool.streamOutput,\n };\n });\n elements.push(\n <div key={`tool-group-${groupIndex}`} className=\"apteva-tool-call-standalone\">\n <ToolCallGroup tools={toolData} />\n </div>\n );\n } else {\n // Render individually (1-2 tools)\n group.tools.forEach(segment => {\n if (segment.type === 'tool') {\n elements.push(\n <div key={segment.id} className=\"apteva-tool-call-standalone\">\n <ToolCall\n name={segment.name}\n status={segment.status || (segment.result !== undefined ? 'completed' : 'running')}\n isReceiving={segment.isReceiving}\n inputLength={segment.inputLength}\n streamOutput={segment.streamOutput}\n />\n </div>\n );\n }\n });\n }\n }\n });\n\n return elements;\n };\n\n // Render message widgets, showing reference cards for persistent ones\n const renderMessageWidgets = () => {\n if (!message.widgets || message.widgets.length === 0) return null;\n\n const inlineWidgets = message.widgets.filter(w => !persistentWidgetIds?.has(w.id));\n const persistentRefs = message.widgets.filter(w => persistentWidgetIds?.has(w.id));\n\n return (\n <>\n {persistentRefs.map(w => (\n <div key={`ref-${w.id}`} className=\"apteva-widget-standalone\">\n <PersistentWidgetRef widget={w} />\n </div>\n ))}\n {inlineWidgets.length > 0 && (\n <div className=\"apteva-widget-standalone\">\n <Widgets widgets={inlineWidgets} onAction={onAction} layout=\"stack\" />\n </div>\n )}\n </>\n );\n };\n\n // For assistant messages with content segments (tool calls) or streaming, render as separate bubbles\n // Using segmented layout during streaming prevents layout jump when tool calls appear\n if (!isUser && (contentSegments && contentSegments.length > 0)) {\n return (\n <div className=\"apteva-message-segmented\">\n {renderSegmentedContent()}\n {renderMessageWidgets()}\n\n <div className=\"apteva-message-timestamp apteva-message-timestamp-assistant\" suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n }\n\n // For assistant messages with widgets in content, render with separate bubbles\n const widgetContent = renderContentWithWidgets();\n if (!isUser && enableWidgets && widgetContent) {\n return (\n <div className=\"apteva-message-segmented\">\n {widgetContent}\n {renderMessageWidgets()}\n\n <div className=\"apteva-message-timestamp apteva-message-timestamp-assistant\" suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n }\n\n // For user messages with attachments, render attachments outside bubble (like Claude/ChatGPT)\n if (isUser && hasAttachments) {\n return (\n <div className=\"apteva-message-segmented apteva-message-user-with-attachments flex flex-col items-end\">\n {renderAttachments()}\n\n {message.content && (\n <div className=\"apteva-message-bubble apteva-message-user\">\n <div className=\"apteva-message-content-user\">\n <div className=\"apteva-message-text\">{message.content}</div>\n </div>\n </div>\n )}\n\n <div className=\"apteva-message-timestamp apteva-message-timestamp-user\" suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'apteva-message-bubble',\n isUser ? 'apteva-message-user' : 'apteva-message-assistant'\n )}\n >\n <div className={isUser ? 'apteva-message-content-user' : 'apteva-message-content-assistant'}>\n {renderContent()}\n </div>\n\n {renderMessageWidgets()}\n\n <div className={cn('apteva-message-timestamp', isUser ? 'apteva-message-timestamp-user' : 'apteva-message-timestamp-assistant')} suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { Message, Thread } from '../types/messages';\nimport { Widget } from '../types/widgets';\n\nexport const mockMessages: Message[] = [\n {\n id: 'msg-1',\n role: 'assistant',\n content: 'Hello! I\\'m your AI assistant. How can I help you today?',\n timestamp: new Date(Date.now() - 3600000),\n },\n {\n id: 'msg-2',\n role: 'user',\n content: 'I want to plan a trip to Europe',\n timestamp: new Date(Date.now() - 3500000),\n },\n {\n id: 'msg-3',\n role: 'assistant',\n content: 'Great choice! Europe has amazing destinations. What\\'s your budget and how many days do you have?',\n timestamp: new Date(Date.now() - 3400000),\n },\n {\n id: 'msg-4',\n role: 'user',\n content: 'Around $2000 for 5 days',\n timestamp: new Date(Date.now() - 3300000),\n },\n {\n id: 'msg-5',\n role: 'assistant',\n content: 'Perfect! I found some great destinations that fit your budget:',\n widgets: [\n {\n type: 'list',\n id: 'destinations-1',\n props: {\n items: [\n {\n id: 'paris',\n title: 'Paris, France',\n subtitle: '5 days • $1,850',\n description: 'The City of Light with iconic landmarks',\n metadata: { city: 'Paris', country: 'France', lat: 48.8566, lng: 2.3522, price: 1850, days: 5 },\n },\n {\n id: 'rome',\n title: 'Rome, Italy',\n subtitle: '5 days • $1,650',\n description: 'Ancient history meets modern culture',\n metadata: { city: 'Rome', country: 'Italy', lat: 41.9028, lng: 12.4964, price: 1650, days: 5 },\n },\n {\n id: 'barcelona',\n title: 'Barcelona, Spain',\n subtitle: '5 days • $1,450',\n description: 'Beautiful beaches and Gaudí architecture',\n metadata: { city: 'Barcelona', country: 'Spain', lat: 41.3851, lng: 2.1734, price: 1450, days: 5 },\n },\n ],\n },\n actions: [\n {\n type: 'select_destination',\n label: 'Select',\n handler: 'client',\n payload: {},\n },\n {\n type: 'view_details',\n label: 'Details',\n handler: 'server',\n payload: {},\n },\n ],\n },\n ],\n timestamp: new Date(Date.now() - 3200000),\n },\n];\n\nexport const mockThreads: Thread[] = [\n {\n id: 'thread-1',\n title: 'Trip to Europe',\n preview: 'Planning a 5-day trip...',\n createdAt: new Date(Date.now() - 86400000),\n updatedAt: new Date(Date.now() - 3600000),\n messageCount: 12,\n },\n {\n id: 'thread-2',\n title: 'Restaurant Recommendations',\n preview: 'Looking for good places...',\n createdAt: new Date(Date.now() - 172800000),\n updatedAt: new Date(Date.now() - 86400000),\n messageCount: 8,\n },\n {\n id: 'thread-3',\n title: 'Budget Planning',\n preview: 'Help with monthly budget',\n createdAt: new Date(Date.now() - 259200000),\n updatedAt: new Date(Date.now() - 172800000),\n messageCount: 15,\n },\n];\n\nexport const mockWidgets: Widget[] = [\n {\n type: 'card',\n id: 'card-1',\n props: {\n title: 'Paris, France',\n description: '5-day adventure in the City of Light',\n image: 'https://images.unsplash.com/photo-1502602898657-3e91760cbb34',\n footer: 'Total: $1,850',\n },\n actions: [\n {\n type: 'book_trip',\n label: 'Book Now',\n handler: 'client',\n payload: { tripId: 'trip-paris' },\n },\n ],\n },\n {\n type: 'card',\n id: 'card-2',\n props: {\n title: 'Rome, Italy',\n description: 'Explore ancient wonders',\n image: 'https://images.unsplash.com/photo-1552832230-c0197dd311b5',\n footer: 'Total: $1,650',\n },\n actions: [\n {\n type: 'book_trip',\n label: 'Book Now',\n handler: 'client',\n payload: { tripId: 'trip-rome' },\n },\n ],\n },\n];\n\nexport function generateMockResponse(delay: number = 1000): Promise<Message> {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n id: `msg-${Date.now()}`,\n role: 'assistant',\n content: 'This is a mock response. In production, this would come from your AI agent API.',\n timestamp: new Date(),\n });\n }, delay);\n });\n}\n\nexport function generateMockStreamingResponse(\n text: string,\n onChunk: (chunk: string) => void,\n typingSpeed: number = 30\n): Promise<void> {\n return new Promise((resolve) => {\n const words = text.split(' ');\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n if (currentIndex < words.length) {\n onChunk(words[currentIndex] + ' ');\n currentIndex++;\n } else {\n clearInterval(interval);\n resolve();\n }\n }, typingSpeed);\n });\n}\n\n// Generate mock plan based on command content\nexport function generateMockPlan(command: string): string {\n const lowerCommand = command.toLowerCase();\n\n if (lowerCommand.includes('analyze') || lowerCommand.includes('analysis')) {\n return `**Plan:**\\n\\n1. Fetch data from the analytics database\\n2. Apply filters and aggregations\\n3. Calculate key metrics and trends\\n4. Generate visualization data\\n5. Compile insights and recommendations`;\n }\n\n if (lowerCommand.includes('sales') || lowerCommand.includes('revenue')) {\n return `**Plan:**\\n\\n1. Query sales records for the specified period\\n2. Calculate total revenue and growth rates\\n3. Break down performance by product category\\n4. Analyze regional distribution\\n5. Present findings in charts and summary`;\n }\n\n if (lowerCommand.includes('report') || lowerCommand.includes('summary')) {\n return `**Plan:**\\n\\n1. Gather data from all relevant sources\\n2. Aggregate metrics across categories\\n3. Identify key trends and anomalies\\n4. Generate executive summary\\n5. Create detailed breakdowns with visualizations`;\n }\n\n if (lowerCommand.includes('customer') || lowerCommand.includes('user')) {\n return `**Plan:**\\n\\n1. Pull customer data from CRM\\n2. Calculate engagement metrics\\n3. Segment users by behavior patterns\\n4. Analyze satisfaction scores\\n5. Generate customer insights report`;\n }\n\n if (lowerCommand.includes('task') || lowerCommand.includes('todo') || lowerCommand.includes('work') || lowerCommand.includes('completed')) {\n return `**Plan:**\\n\\n1. Retrieve task records from the database\\n2. Filter by status and date range\\n3. Organize by priority and category\\n4. Calculate completion metrics\\n5. Display in interactive list format`;\n }\n\n // Default plan\n return `**Plan:**\\n\\n1. Parse and understand the command requirements\\n2. Gather necessary data from available sources\\n3. Process and analyze the information\\n4. Format results for optimal presentation\\n5. Return response with any relevant visualizations`;\n}\n\n// Generate mock command response based on command content\nexport function generateMockCommandResponse(command: string): string {\n const lowerCommand = command.toLowerCase();\n\n if (lowerCommand.includes('analyze') || lowerCommand.includes('analysis')) {\n return `Analysis complete for \"${command}\". Found 247 records with an average value of $1,234. The data shows a 23% increase compared to last quarter. Key insights: Revenue is up, customer satisfaction improved by 15%, and operational costs decreased by 8%.`;\n }\n\n if (lowerCommand.includes('sales') || lowerCommand.includes('revenue')) {\n return `Sales data processed: Q4 2024 revenue reached $2.4M, representing 18% growth year-over-year. Top performing products: Enterprise Plan (+45%), Pro Plan (+32%), Basic Plan (+12%). Regional breakdown: North America (52%), Europe (31%), APAC (17%).`;\n }\n\n if (lowerCommand.includes('report') || lowerCommand.includes('summary')) {\n return `Report generated successfully. Executive Summary: Overall performance exceeded targets by 12%. Marketing ROI improved to 3.2x, customer acquisition cost reduced by 18%, and lifetime value increased by 24%. Detailed breakdown available in attached widgets.`;\n }\n\n if (lowerCommand.includes('data') || lowerCommand.includes('metrics')) {\n return `Data metrics retrieved: 1,847 active users, 12,394 sessions this month, 94.2% uptime, average response time 127ms. Performance is within acceptable parameters. No critical issues detected.`;\n }\n\n if (lowerCommand.includes('customer') || lowerCommand.includes('user')) {\n return `Customer analysis complete: 523 new customers this month, 89% retention rate, average satisfaction score 4.6/5. Top feedback themes: excellent support (87%), easy to use (72%), good value (68%). 3 support tickets pending review.`;\n }\n\n // Default response\n return `This is a mock response showing how your agent would process and respond to commands. The actual response would be generated by your AI agent based on real data and context.`;\n}\n\n// Generate mock command response with widgets\nexport function generateMockCommandWithWidgets(command: string): { message: string; widgets: Widget[]; action?: { type: string; payload: any } } {\n const message = generateMockCommandResponse(command);\n const lowerCommand = command.toLowerCase();\n\n let widgets: Widget[] = [];\n let action: { type: string; payload: any } | undefined;\n\n // Add relevant widgets based on command type\n if (lowerCommand.includes('sales') || lowerCommand.includes('revenue') || lowerCommand.includes('analyze')) {\n widgets.push({\n type: 'card',\n id: `widget-${Date.now()}-1`,\n props: {\n title: 'Q4 2024 Performance',\n description: 'Revenue: $2.4M (+18% YoY)',\n footer: 'Updated: ' + new Date().toLocaleDateString(),\n },\n actions: [\n {\n type: 'view_details',\n label: 'View Details',\n handler: 'client',\n payload: { reportId: 'q4-2024' },\n },\n ],\n });\n }\n\n if (lowerCommand.includes('customer') || lowerCommand.includes('user')) {\n widgets.push({\n type: 'list',\n id: `widget-${Date.now()}-2`,\n props: {\n items: [\n {\n id: 'metric-1',\n title: 'Active Users',\n subtitle: '1,847 users',\n description: '+12% from last month',\n },\n {\n id: 'metric-2',\n title: 'Retention Rate',\n subtitle: '89%',\n description: 'Above industry average',\n },\n {\n id: 'metric-3',\n title: 'Satisfaction Score',\n subtitle: '4.6/5',\n description: 'Based on 234 reviews',\n },\n ],\n },\n });\n }\n\n // Add task widget for task-related commands\n if (lowerCommand.includes('task') || lowerCommand.includes('todo') || lowerCommand.includes('work') || lowerCommand.includes('completed')) {\n widgets.push({\n type: 'list',\n id: `widget-${Date.now()}-tasks`,\n props: {\n items: [\n {\n id: 'task-1',\n title: 'Implement user authentication',\n subtitle: 'Created just now',\n description: 'Added OAuth 2.0 support with Google and GitHub providers',\n backgroundColor: 'rgba(59, 130, 246, 0.15)',\n metadata: {\n status: 'created',\n priority: 'high',\n tags: ['backend', 'security']\n }\n },\n {\n id: 'task-2',\n title: 'Update API documentation',\n subtitle: 'Modified 2 minutes ago',\n description: 'Changed endpoint descriptions and added new examples',\n backgroundColor: 'rgba(234, 179, 8, 0.15)',\n metadata: {\n status: 'modified',\n priority: 'medium',\n tags: ['docs']\n }\n },\n {\n id: 'task-3',\n title: 'Fix login redirect bug',\n subtitle: 'Completed 5 minutes ago',\n description: 'Users now properly redirected after successful login',\n backgroundColor: 'rgba(34, 197, 94, 0.15)',\n metadata: {\n status: 'completed',\n priority: 'urgent',\n tags: ['bugfix', 'auth']\n }\n }\n ],\n },\n actions: [\n {\n type: 'view_task',\n label: 'View',\n handler: 'client',\n payload: {}\n },\n {\n type: 'undo',\n label: 'Undo',\n handler: 'server',\n payload: {}\n }\n ]\n });\n\n // Agent also wants to update the database after showing tasks\n action = {\n type: 'update_database',\n payload: {\n table: 'tasks',\n operation: 'mark_as_viewed',\n taskIds: ['task-1', 'task-2', 'task-3'],\n timestamp: new Date().toISOString()\n }\n };\n }\n\n // Add agent action for analysis commands\n if (lowerCommand.includes('analyze') || lowerCommand.includes('analysis')) {\n action = {\n type: 'send_notification',\n payload: {\n recipient: 'team@company.com',\n subject: 'Analysis Complete',\n message: 'Your requested analysis has been completed and is ready for review.'\n }\n };\n }\n\n return { message, widgets, action };\n}\n\n// Simulate streaming command response\nexport function generateMockCommandStream(\n command: string,\n onChunk: (chunk: { type: 'token' | 'widget' | 'complete'; content?: string; widget?: Widget }) => void,\n onComplete: (threadId: string) => void,\n onError: (error: Error) => void,\n typingSpeed: number = 30\n): void {\n const { message, widgets } = generateMockCommandWithWidgets(command);\n const words = message.split(' ');\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n try {\n if (currentIndex < words.length) {\n onChunk({ type: 'token', content: words[currentIndex] + ' ' });\n currentIndex++;\n } else {\n clearInterval(interval);\n\n // Send widgets after text is complete\n widgets.forEach(widget => {\n onChunk({ type: 'widget', widget });\n });\n\n // Signal completion\n const threadId = `mock_thread_${Date.now()}`;\n onChunk({ type: 'complete' });\n onComplete(threadId);\n }\n } catch (error) {\n clearInterval(interval);\n onError(error instanceof Error ? error : new Error('Mock streaming error'));\n }\n }, typingSpeed);\n}\n","/**\n * File utilities for converting files to base64 and creating content blocks\n */\n\nexport interface ContentBlock {\n type: 'text' | 'image' | 'document';\n text?: string;\n source?: {\n type: 'base64';\n media_type: string;\n data: string;\n };\n}\n\n/**\n * Convert a File to base64 string\n */\nexport function fileToBase64(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 (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = () => reject(new Error('Failed to read file'));\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Determine the content block type based on file MIME type\n */\nexport function getContentBlockType(mimeType: string): 'image' | 'document' {\n if (mimeType.startsWith('image/')) {\n return 'image';\n }\n return 'document';\n}\n\n/**\n * Check if a file type is supported for upload\n */\nexport function isSupportedFileType(file: File): boolean {\n const supportedTypes = [\n // Images\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n // Documents\n 'application/pdf',\n 'text/plain',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n ];\n return supportedTypes.includes(file.type);\n}\n\n/**\n * Convert a File to a content block for the agent API\n */\nexport async function fileToContentBlock(file: File): Promise<ContentBlock> {\n const base64 = await fileToBase64(file);\n const blockType = getContentBlockType(file.type);\n\n return {\n type: blockType,\n source: {\n type: 'base64',\n media_type: file.type,\n data: base64,\n },\n };\n}\n\n/**\n * Convert multiple files to content blocks\n */\nexport async function filesToContentBlocks(files: FileList | File[]): Promise<ContentBlock[]> {\n const fileArray = Array.from(files);\n const blocks = await Promise.all(\n fileArray.map(file => fileToContentBlock(file))\n );\n return blocks;\n}\n\n/**\n * Build a structured message with text and file attachments\n */\nexport async function buildMessageWithAttachments(\n text: string,\n files?: FileList | File[]\n): Promise<string | ContentBlock[]> {\n // If no files, return simple text\n if (!files || files.length === 0) {\n return text;\n }\n\n // Build content blocks array\n const blocks: ContentBlock[] = [];\n\n // Add text block first if there's text\n if (text.trim()) {\n blocks.push({ type: 'text', text: text.trim() });\n }\n\n // Convert files to content blocks\n const fileBlocks = await filesToContentBlocks(files);\n blocks.push(...fileBlocks);\n\n return blocks;\n}\n\n/**\n * Get a human-readable file size 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 * Maximum file size (10MB)\n */\nexport const MAX_FILE_SIZE = 10 * 1024 * 1024;\n\n/**\n * Validate file for upload\n */\nexport function validateFile(file: File): { valid: boolean; error?: string } {\n if (!isSupportedFileType(file)) {\n return { valid: false, error: `Unsupported file type: ${file.type}` };\n }\n if (file.size > MAX_FILE_SIZE) {\n return { valid: false, error: `File too large: ${formatFileSize(file.size)} (max ${formatFileSize(MAX_FILE_SIZE)})` };\n }\n return { valid: true };\n}\n","import { Widget } from '../types/widgets';\n\nexport interface ParsedSegment {\n type: 'text' | 'widget' | 'widget_pending';\n content?: string;\n widget?: Widget & { isStreaming?: boolean };\n pendingType?: string; // Widget type being streamed\n}\n\nexport interface ParsedContent {\n segments: ParsedSegment[];\n hasWidgets: boolean;\n hasPendingWidget: boolean;\n}\n\n/**\n * Types that support incremental item streaming\n */\nconst STREAMABLE_WIDGET_TYPES = ['list', 'table'];\n\n/**\n * Parse complete items from a partial JSON array string\n * Returns array of parsed items and whether there's more coming\n */\nfunction parsePartialItemsArray(partialJson: string): { items: any[]; isStreaming: boolean } {\n const items: any[] = [];\n let isStreaming = false;\n\n // Find the \"items\" array start\n const itemsMatch = partialJson.match(/\"items\"\\s*:\\s*\\[/);\n if (!itemsMatch) {\n return { items, isStreaming: false };\n }\n\n const arrayStart = partialJson.indexOf('[', itemsMatch.index);\n if (arrayStart === -1) {\n return { items, isStreaming: true };\n }\n\n // Try to find complete objects within the array\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n let objectStart = -1;\n\n for (let i = arrayStart + 1; i < partialJson.length; i++) {\n const char = partialJson[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === '{') {\n if (depth === 0) {\n objectStart = i;\n }\n depth++;\n } else if (char === '}') {\n depth--;\n if (depth === 0 && objectStart !== -1) {\n // Complete object found\n const objectJson = partialJson.slice(objectStart, i + 1);\n try {\n const item = JSON.parse(objectJson);\n // Ensure item has an id\n if (!item.id) {\n item.id = `item-${items.length}-${simpleHash(objectJson)}`;\n }\n items.push(item);\n } catch (e) {\n // Invalid JSON, skip\n }\n objectStart = -1;\n }\n } else if (char === ']' && depth === 0) {\n // Array closed - not streaming anymore\n isStreaming = false;\n break;\n }\n }\n\n // If we didn't find a closing bracket, we're still streaming\n if (depth > 0 || objectStart !== -1) {\n isStreaming = true;\n }\n\n // Check if array is still open (no closing ])\n const afterItems = partialJson.slice(arrayStart);\n const closingBracket = findMatchingBracket(afterItems, 0);\n if (closingBracket === -1) {\n isStreaming = true;\n }\n\n return { items, isStreaming };\n}\n\n/**\n * Simple hash function to generate stable IDs from content\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Find the matching closing bracket, handling nested brackets\n */\nfunction findMatchingBracket(text: string, startIndex: number): number {\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n\n for (let i = startIndex; i < text.length; i++) {\n const char = text[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === '[' || char === '{') {\n depth++;\n } else if (char === ']' || char === '}') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1; // No match found\n}\n\n/**\n * Parse text content and extract widgets from @ui:type[{props}] syntax\n */\nexport function parseWidgetsFromText(text: string): ParsedContent {\n const segments: ParsedSegment[] = [];\n let hasWidgets = false;\n let hasPendingWidget = false;\n let currentIndex = 0;\n let pendingWidgetType: string | null = null;\n\n // Strip stray <ui>, </ui>, <ui/>, etc. tags the AI sometimes outputs\n let processText = text.replace(/<\\/?ui\\s*\\/?>/gi, '');\n const lastWidgetStart = text.lastIndexOf('@ui:');\n\n if (lastWidgetStart !== -1) {\n // Check if this last @ui: pattern is complete\n const afterStart = text.slice(lastWidgetStart);\n const typeMatch = afterStart.match(/^@ui:(\\w+)/);\n\n if (typeMatch) {\n const widgetType = typeMatch[1];\n const bracketOpenIndex = afterStart.indexOf('[');\n\n if (bracketOpenIndex === -1) {\n // No opening bracket yet - incomplete, show skeleton\n processText = text.slice(0, lastWidgetStart);\n pendingWidgetType = widgetType;\n hasPendingWidget = true;\n } else {\n // Has opening bracket, check if it's closed\n const fullBracketStart = lastWidgetStart + bracketOpenIndex;\n const bracketEnd = findMatchingBracket(text, fullBracketStart);\n\n if (bracketEnd === -1) {\n // Bracket not closed - incomplete widget\n // For streamable types (list, table), try to parse partial items\n if (STREAMABLE_WIDGET_TYPES.includes(widgetType)) {\n const partialContent = text.slice(fullBracketStart + 1);\n const { items, isStreaming } = parsePartialItemsArray(partialContent);\n\n if (items.length > 0) {\n // We have some items! Show them (with streaming indicator only if items array is incomplete)\n processText = text.slice(0, lastWidgetStart);\n const widgetId = `widget-${widgetType}-streaming-${simpleHash(partialContent)}`;\n\n // Add text before if any\n const textBefore = processText.replace(/[\\s:;\\-–—\\.]+$/g, '').trim();\n if (textBefore) {\n segments.push({ type: 'text', content: textBefore });\n }\n\n // Add the widget - only show streaming indicator if items array itself is incomplete\n segments.push({\n type: 'widget',\n widget: {\n type: widgetType,\n id: widgetId,\n props: widgetType === 'table' ? { rows: items, columns: [] } : { items },\n isStreaming // Use actual streaming state from items array parsing\n }\n });\n\n hasWidgets = true;\n hasPendingWidget = false; // We're showing real content, not skeleton\n processText = ''; // All text handled\n } else {\n // No items yet, show skeleton\n processText = text.slice(0, lastWidgetStart);\n pendingWidgetType = widgetType;\n hasPendingWidget = true;\n }\n } else {\n // Non-streamable widget, show skeleton\n processText = text.slice(0, lastWidgetStart);\n pendingWidgetType = widgetType;\n hasPendingWidget = true;\n }\n }\n }\n }\n }\n\n // Clean up trailing whitespace before pending widget\n if (hasPendingWidget) {\n processText = processText.replace(/[\\s:;\\-–—\\.]+$/g, '');\n }\n\n // Pattern to find @ui:type[ starts\n const startPattern = /@ui:(\\w+)\\[/g;\n\n let match;\n while ((match = startPattern.exec(processText)) !== null) {\n const widgetType = match[1];\n const bracketStart = match.index + match[0].length - 1; // Position of '['\n\n // Find the matching ']'\n const bracketEnd = findMatchingBracket(processText, bracketStart);\n\n if (bracketEnd === -1) {\n // No matching bracket - shouldn't happen after pre-processing, but skip just in case\n continue;\n }\n\n // Extract the JSON content (everything between [ and ])\n const jsonContent = processText.slice(bracketStart + 1, bracketEnd);\n\n // Add text before the widget\n if (match.index > currentIndex) {\n const textContent = processText.slice(currentIndex, match.index).trim();\n if (textContent) {\n segments.push({\n type: 'text',\n content: textContent\n });\n }\n }\n\n // Parse and add the widget\n try {\n // Trim and normalize JSON content\n const trimmedJson = jsonContent.trim();\n const parsed = JSON.parse(trimmedJson);\n // Generate stable ID based on widget type and content\n const widgetId = `widget-${widgetType}-${simpleHash(trimmedJson)}`;\n\n // Extract metadata and actions fields to widget root, rest goes to props\n const { metadata, actions, ...props } = parsed;\n\n segments.push({\n type: 'widget',\n widget: {\n type: widgetType,\n id: widgetId,\n props,\n ...(actions && { actions }),\n ...(metadata && { metadata })\n }\n });\n hasWidgets = true;\n } catch (e) {\n // JSON parsing failed - hide the raw syntax entirely\n }\n\n currentIndex = bracketEnd + 1;\n startPattern.lastIndex = currentIndex;\n }\n\n // Add remaining text (already cleaned of incomplete widgets)\n if (currentIndex < processText.length) {\n const remainingText = processText.slice(currentIndex).trim();\n if (remainingText) {\n segments.push({\n type: 'text',\n content: remainingText\n });\n }\n }\n\n // If no segments were created, use the processed text\n if (segments.length === 0 && processText.trim()) {\n segments.push({\n type: 'text',\n content: processText.trim()\n });\n }\n\n // Add pending widget skeleton at the end if we detected one\n if (pendingWidgetType) {\n segments.push({\n type: 'widget_pending',\n pendingType: pendingWidgetType\n });\n }\n\n return { segments, hasWidgets, hasPendingWidget };\n}\n\n/**\n * Check if text contains any widget syntax\n */\nexport function containsWidgets(text: string): boolean {\n return /@ui:\\w+\\[/.test(text);\n}\n\n/**\n * Strip widget syntax from text, returning only plain text content\n */\nexport function stripWidgets(text: string): string {\n const parsed = parseWidgetsFromText(text);\n return parsed.segments\n .filter(s => s.type === 'text' && s.content)\n .map(s => s.content)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","/**\n * Widget definitions for context injection\n */\nexport const WIDGET_DEFINITIONS = {\n card: {\n schema: 'title, description?, image?, footer?, actions?: [{type, label}]',\n example: '@ui:card[{\"title\": \"Summary\", \"description\": \"Details here\"}]'\n },\n list: {\n schema: 'items: [{id, title, subtitle?, description?, image?, metadata?: {any extra data}}], actions?: [{type, label}] - metadata is sent as action payload when clicked',\n example: '@ui:list[{\"items\": [{\"id\": \"1\", \"title\": \"Item\", \"subtitle\": \"Info\", \"metadata\": {\"key\": \"value\"}}]}]'\n },\n button_group: {\n schema: 'buttons: [{id, label, variant?}] - Use for standalone buttons only, NOT for form submits',\n example: '@ui:button_group[{\"buttons\": [{\"id\": \"ok\", \"label\": \"OK\"}]}]'\n },\n form: {\n schema: 'title?, fields: [{name, type: text|password|number|select|checkbox|textarea|date, label, required?, placeholder?, options?}], actions: [{type, label}] - Button is built-in via actions, do NOT add separate button',\n example: '@ui:form[{\"title\": \"Settings\", \"fields\": [{\"name\": \"apiKey\", \"type\": \"password\", \"label\": \"API Key\", \"required\": true}], \"actions\": [{\"type\": \"save\", \"label\": \"Save\"}]}]'\n },\n table: {\n schema: 'columns: [{key, label}], rows: [...], striped?, compact?',\n example: '@ui:table[{\"columns\": [{\"key\": \"name\", \"label\": \"Name\"}], \"rows\": [{\"name\": \"A\"}]}]'\n },\n image: {\n schema: 'src, alt, caption?',\n example: '@ui:image[{\"src\": \"url\", \"alt\": \"desc\"}]'\n },\n chart: {\n schema: 'chartType: line|bar|pie, data: {labels, datasets}',\n example: '@ui:chart[{\"chartType\": \"bar\", \"data\": {\"labels\": [\"A\"], \"datasets\": [{\"label\": \"X\", \"data\": [10]}]}}]'\n },\n flow: {\n schema: 'title, subtitle?, icon?: research|schedule|analyze|deploy|recurring|automation|data, steps: [{id, label, type?, color?: blue|purple|cyan|amber|emerald|rose|indigo|orange, status?: pending|active|completed|error|skipped}] - Horizontal pipeline. Use @label for agents. Types auto-detected from label.',\n example: '@ui:flow[{\"title\": \"Deploy Pipeline\", \"icon\": \"deploy\", \"steps\": [{\"id\": \"1\", \"label\": \"Test\", \"color\": \"cyan\"}, {\"id\": \"2\", \"label\": \"Build\", \"color\": \"amber\"}, {\"id\": \"3\", \"label\": \"Deploy\", \"color\": \"rose\"}]}]'\n }\n} as const;\n\nexport type WidgetType = keyof typeof WIDGET_DEFINITIONS;\n\nexport const ALL_WIDGET_TYPES: WidgetType[] = Object.keys(WIDGET_DEFINITIONS) as WidgetType[];\n\n// Widgets disabled from default context injection (still renderable if received)\nconst DISABLED_WIDGETS: WidgetType[] = ['flow'];\nexport const DEFAULT_WIDGET_TYPES: WidgetType[] = ALL_WIDGET_TYPES.filter(t => !DISABLED_WIDGETS.includes(t));\n\n/**\n * Generate system prompt context describing available widgets\n */\nexport function generateWidgetContext(enabledWidgets?: WidgetType[]): string {\n const widgets = enabledWidgets || DEFAULT_WIDGET_TYPES;\n\n let context = `\\n## UI Widgets\nSYNTAX: @ui:type[{json}] - MUST use SQUARE BRACKETS [] around the JSON object.\nCORRECT: @ui:list[{\"items\": [...]}]\nWRONG: @ui:list{\"items\": [...]} (missing square brackets)\n\n`;\n\n for (const type of widgets) {\n const def = WIDGET_DEFINITIONS[type];\n if (!def) continue;\n context += `${type}: ${def.schema} | ${def.example}\\n`;\n }\n\n context += `\\nPer-item \"metadata\" is sent as payload on action click.\\n`;\n\n return context;\n}\n\n/**\n * Generate a compact version of widget context\n */\nexport function generateCompactWidgetContext(enabledWidgets?: WidgetType[]): string {\n const widgets = enabledWidgets || DEFAULT_WIDGET_TYPES;\n return `\\nWidgets: @ui:type[{json}] - MUST use square brackets []. Example: @ui:list[{\"items\": [...]}]. Types: ${widgets.join(', ')}. Per-item \"metadata\" is sent as action payload.\\n`;\n}\n","import { InterfaceSpec, InterfaceUpdate } from '../types/interface';\n\n/**\n * Find matching bracket/brace, handling nested structures and strings\n */\nfunction findMatchingBracket(text: string, startIndex: number): number {\n const openChar = text[startIndex];\n const closeChar = openChar === '[' ? ']' : '}';\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n\n for (let i = startIndex; i < text.length; i++) {\n const char = text[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === openChar || char === (openChar === '[' ? '{' : '[')) {\n if (char === openChar) depth++;\n } else if (char === closeChar || char === (closeChar === ']' ? '}' : ']')) {\n if (char === closeChar) {\n depth--;\n if (depth === 0) return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Parse a full interface spec from text containing @interface[{...}]\n */\nexport function parseInterfaceFromText(text: string): InterfaceSpec | null {\n const marker = '@interface[';\n const idx = text.indexOf(marker);\n if (idx === -1) return null;\n\n const bracketStart = idx + marker.length - 1; // position of '['\n const bracketEnd = findMatchingBracket(text, bracketStart);\n if (bracketEnd === -1) return null; // Incomplete\n\n const jsonContent = text.slice(bracketStart + 1, bracketEnd);\n\n try {\n const parsed = JSON.parse(jsonContent);\n\n // Validate basic structure\n if (!parsed.root || !parsed.root.id) return null;\n\n return {\n version: parsed.version || 1,\n root: parsed.root,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse update operations from text containing @update[{...}] or @update[[{...}, ...]]\n */\nexport function parseUpdatesFromText(text: string): InterfaceUpdate[] {\n const updates: InterfaceUpdate[] = [];\n const marker = '@update[';\n let searchFrom = 0;\n\n while (true) {\n const idx = text.indexOf(marker, searchFrom);\n if (idx === -1) break;\n\n const bracketStart = idx + marker.length - 1;\n const bracketEnd = findMatchingBracket(text, bracketStart);\n if (bracketEnd === -1) break; // Incomplete\n\n const jsonContent = text.slice(bracketStart + 1, bracketEnd);\n\n try {\n const parsed = JSON.parse(jsonContent);\n\n if (Array.isArray(parsed)) {\n updates.push(...parsed);\n } else if (parsed.op && parsed.target) {\n updates.push(parsed);\n }\n } catch {\n // Skip malformed JSON\n }\n\n searchFrom = bracketEnd + 1;\n }\n\n return updates;\n}\n\n/**\n * Check if text contains interface syntax\n */\nexport function containsInterface(text: string): boolean {\n return text.includes('@interface[') || text.includes('@update[');\n}\n\n/**\n * Strip interface syntax from text, returning only plain text\n */\nexport function stripInterface(text: string): string {\n let result = text;\n\n // Remove @interface[...] blocks\n const ifacePattern = /@interface\\[/g;\n let match;\n while ((match = ifacePattern.exec(result)) !== null) {\n const bracketStart = match.index + match[0].length - 1;\n const bracketEnd = findMatchingBracket(result, bracketStart);\n if (bracketEnd === -1) break;\n result = result.slice(0, match.index) + result.slice(bracketEnd + 1);\n ifacePattern.lastIndex = match.index;\n }\n\n // Remove @update[...] blocks\n const updatePattern = /@update\\[/g;\n while ((match = updatePattern.exec(result)) !== null) {\n const bracketStart = match.index + match[0].length - 1;\n const bracketEnd = findMatchingBracket(result, bracketStart);\n if (bracketEnd === -1) break;\n result = result.slice(0, match.index) + result.slice(bracketEnd + 1);\n updatePattern.lastIndex = match.index;\n }\n\n return result.replace(/\\s+/g, ' ').trim();\n}\n","/**\n * Generate system prompt context for AutoInterface mode\n * Tells the AI how to generate full interfaces with layouts and widgets\n */\nexport function generateInterfaceContext(): string {\n return `## Auto Interface Mode\n\nYou generate full page interfaces as JSON. When asked for a dashboard, form, or any UI, respond with an @interface block.\n\n### CRITICAL FORMAT RULES\n1. Wrap your JSON in: @interface[{...}]\n2. Every node MUST have: \"type\", \"id\", and \"props\" (an object)\n3. Widget properties go INSIDE \"props\", NOT at the top level\n4. The \"type\" field is the ACTUAL widget name (e.g. \"form\", \"kpi\", \"table\") — NEVER use \"widget\" as a type\n5. Layout nodes use type: \"layout\" with a \"layout\" field for the layout kind\n\n### Node structure\n\nLayout node:\n{\"type\": \"layout\", \"id\": \"unique-id\", \"layout\": \"page|row|stack|columns|sidebar|tabs\", \"props\": {...}, \"children\": [...]}\n\nWidget node:\n{\"type\": \"kpi|text_block|form|table|chart|list|card|spacer|button_group|image\", \"id\": \"unique-id\", \"props\": {...}}\n\n### Layout types and their props\n- page: { title?, padding?: \"none\"|\"sm\"|\"md\"|\"lg\", maxWidth?: \"sm\"|\"md\"|\"lg\"|\"xl\"|\"full\" }\n- row: { columns?: number[] (e.g. [1,2] for 1/3+2/3), gap?: \"none\"|\"sm\"|\"md\"|\"lg\" }\n- stack: { gap?: \"none\"|\"sm\"|\"md\"|\"lg\", align?: \"left\"|\"center\"|\"right\"|\"stretch\" }\n- columns: { count?: number, gap?: \"none\"|\"sm\"|\"md\"|\"lg\" }\n- sidebar: { side?: \"left\"|\"right\", width?: string }\n- tabs: { labels: string[], defaultTab?: number }\n\n### Widget types and their props\n- kpi: { label: string, value: string, change?: string, trend?: \"up\"|\"down\"|\"flat\" }\n- text_block: { content: string (markdown), variant?: \"heading\"|\"body\"|\"caption\" }\n- spacer: { height?: \"sm\"|\"md\"|\"lg\", variant?: \"line\"|\"space\" }\n- card: { title: string, description?: string, image?: string, footer?: string }\n- list: { items: [{ id: string, title: string, subtitle?: string }] }\n- table: { columns: [{ key: string, label: string }], rows: [{ key: value, ... }], striped?: boolean, compact?: boolean }\n- chart: { chartType: \"line\"|\"bar\"|\"pie\", title?: string, data: { labels: string[], datasets: [{ label: string, data: number[] }] } }\n- form: { title?: string, fields: [{ name: string, type: \"text\"|\"email\"|\"select\"|\"textarea\"|\"checkbox\", label: string, required?: boolean, placeholder?: string, options?: [{ label: string, value: string }] }] }\n- button_group: { buttons: [{ id: string, label: string, variant?: string }] }\n- image: { src: string, alt: string, caption?: string }\n\n### CORRECT example\n\n@interface[{\"version\":1,\"root\":{\"type\":\"layout\",\"id\":\"root\",\"layout\":\"page\",\"props\":{\"title\":\"My Form\"},\"children\":[{\"type\":\"text_block\",\"id\":\"t1\",\"props\":{\"content\":\"Fill out the form below\",\"variant\":\"body\"}},{\"type\":\"form\",\"id\":\"f1\",\"props\":{\"fields\":[{\"name\":\"name\",\"type\":\"text\",\"label\":\"Name\",\"required\":true},{\"name\":\"email\",\"type\":\"email\",\"label\":\"Email\"}]}},{\"type\":\"button_group\",\"id\":\"b1\",\"props\":{\"buttons\":[{\"id\":\"submit\",\"label\":\"Submit\"}]}}]}}]\n\n### WRONG (do NOT do these)\n- {\"type\": \"widget\", \"props\": {\"widget\": \"form\"}} — WRONG, type must be \"form\" directly\n- {\"type\": \"text_block\", \"content\": \"hello\"} — WRONG, content must be inside props\n- {\"type\": \"text_block\", \"props\": {\"style\": \"heading\"}} — WRONG, use \"variant\" not \"style\"\n\n### Guidelines\n- Always use unique IDs for every node\n- Organize content logically: KPIs in a row, charts with supporting lists, etc.\n- Use text_block for descriptions and headings within layouts\n- Use spacer with variant \"line\" to separate sections\n- You can include normal text before/after the @interface block\n- For updates use: @update[{\"op\": \"update\", \"target\": \"widget-id\", \"props\": {\"key\": \"new-value\"}}]`;\n}\n\n/**\n * Compact version for the initial prompt (separate API call)\n */\nexport function generateCompactInterfaceContext(): string {\n return `Generate a UI interface as JSON wrapped in @interface[{...}].\n\nSTRICT FORMAT — every node needs \"type\", \"id\", and \"props\" (object):\n- Layout: {\"type\":\"layout\",\"id\":\"x\",\"layout\":\"page|row|stack|tabs\",\"props\":{...},\"children\":[...]}\n- Widget: {\"type\":\"kpi|text_block|form|table|chart|list|card|spacer|button_group|image\",\"id\":\"x\",\"props\":{...}}\n\nNEVER use type:\"widget\". The type IS the widget name. All widget properties go INSIDE \"props\".\n\nWidget props:\n- kpi: {label,value,change?,trend?}\n- text_block: {content,variant?:\"heading\"|\"body\"|\"caption\"}\n- form: {fields:[{name,type,label,required?,placeholder?}]}\n- table: {columns:[{key,label}],rows:[{...}]}\n- chart: {chartType:\"line\"|\"bar\"|\"pie\",data:{labels,datasets:[{label,data}]}}\n- list: {items:[{id,title,subtitle?}]}\n- button_group: {buttons:[{id,label}]}\n\nRow props: {columns:[1,2]} means 1/3+2/3. Page props: {title:\"...\"}.\n\nExample: @interface[{\"version\":1,\"root\":{\"type\":\"layout\",\"id\":\"root\",\"layout\":\"page\",\"props\":{\"title\":\"Form\"},\"children\":[{\"type\":\"form\",\"id\":\"f1\",\"props\":{\"fields\":[{\"name\":\"name\",\"type\":\"text\",\"label\":\"Name\"}]}}]}}]`;\n}\n","import { InterfaceNode, InterfaceSpec, InterfaceUpdate } from '../types/interface';\n\n/**\n * Find a node by ID in the interface tree\n */\nexport function findNode(root: InterfaceNode, id: string): InterfaceNode | null {\n if (root.id === id) return root;\n if (root.children) {\n for (const child of root.children) {\n const found = findNode(child, id);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Deep clone a node tree\n */\nfunction cloneNode(node: InterfaceNode): InterfaceNode {\n return {\n ...node,\n props: { ...node.props },\n children: node.children?.map(cloneNode),\n actions: node.actions ? [...node.actions] : undefined,\n metadata: node.metadata ? { ...node.metadata } : undefined,\n };\n}\n\n/**\n * Replace a node by ID, returning a new tree\n */\nfunction replaceNode(root: InterfaceNode, targetId: string, newNode: InterfaceNode): InterfaceNode {\n if (root.id === targetId) return newNode;\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => replaceNode(child, targetId, newNode));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Update a node's props by ID (shallow merge), returning a new tree\n */\nfunction updateNodeProps(root: InterfaceNode, targetId: string, props: Record<string, any>): InterfaceNode {\n if (root.id === targetId) {\n return { ...root, props: { ...root.props, ...props } };\n }\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => updateNodeProps(child, targetId, props));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Remove a node by ID, returning a new tree\n */\nfunction removeNode(root: InterfaceNode, targetId: string): InterfaceNode | null {\n if (root.id === targetId) return null;\n if (!root.children) return root;\n\n const newChildren = root.children\n .map(child => removeNode(child, targetId))\n .filter((child): child is InterfaceNode => child !== null);\n\n if (newChildren.length === root.children.length &&\n newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Append a child to a container by ID, returning a new tree\n */\nfunction appendNode(root: InterfaceNode, targetId: string, newNode: InterfaceNode): InterfaceNode {\n if (root.id === targetId) {\n return { ...root, children: [...(root.children || []), newNode] };\n }\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => appendNode(child, targetId, newNode));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Prepend a child to a container by ID, returning a new tree\n */\nfunction prependNode(root: InterfaceNode, targetId: string, newNode: InterfaceNode): InterfaceNode {\n if (root.id === targetId) {\n return { ...root, children: [newNode, ...(root.children || [])] };\n }\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => prependNode(child, targetId, newNode));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Apply a single update operation to an InterfaceSpec\n */\nexport function applyUpdate(spec: InterfaceSpec, update: InterfaceUpdate): InterfaceSpec {\n let newRoot: InterfaceNode | null = spec.root;\n\n switch (update.op) {\n case 'replace':\n if (!update.node) return spec;\n newRoot = replaceNode(spec.root, update.target, update.node);\n break;\n case 'update':\n if (!update.props) return spec;\n newRoot = updateNodeProps(spec.root, update.target, update.props);\n break;\n case 'remove':\n newRoot = removeNode(spec.root, update.target);\n if (!newRoot) return spec; // Can't remove root\n break;\n case 'append':\n if (!update.node) return spec;\n newRoot = appendNode(spec.root, update.target, update.node);\n break;\n case 'prepend':\n if (!update.node) return spec;\n newRoot = prependNode(spec.root, update.target, update.node);\n break;\n default:\n return spec;\n }\n\n if (newRoot === spec.root) return spec;\n return { ...spec, root: newRoot };\n}\n\n/**\n * Apply multiple updates in sequence\n */\nexport function applyUpdates(spec: InterfaceSpec, updates: InterfaceUpdate[]): InterfaceSpec {\n return updates.reduce((s, update) => applyUpdate(s, update), spec);\n}\n","import { Message } from '../types/messages';\n\n/**\n * A content block from the API message format.\n * API messages can have `content` as either a string or an array of these blocks.\n */\nexport interface ApiContentBlock {\n type: 'text' | 'tool_use' | 'tool_result';\n // text block\n text?: string;\n // tool_use block\n id?: string;\n name?: string;\n input?: any;\n // tool_result block\n tool_use_id?: string;\n content?: string | Array<{ type: string; text?: string }>;\n is_error?: boolean;\n}\n\n/**\n * An API message as returned by the thread messages endpoint.\n */\nexport interface ApiMessage {\n role: 'user' | 'assistant' | 'system';\n content: string | ApiContentBlock[];\n id?: string;\n created_at?: string;\n timestamp?: string;\n}\n\ntype ContentSegment =\n | { type: 'text'; content: string }\n | { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; result?: any };\n\n/**\n * Convert API messages (from thread history) to internal Message format.\n *\n * Key transformations:\n * - Simple string content messages map directly\n * - Assistant messages with tool_use blocks become content_segments\n * - User messages with tool_result blocks are merged into the previous\n * assistant message's tool segments (not shown as separate user messages)\n */\nexport function convertApiMessages(apiMessages: ApiMessage[]): Message[] {\n const result: Message[] = [];\n // Keep a reference to the last assistant's content_segments so we can\n // merge tool_result messages into them\n let lastAssistantSegments: ContentSegment[] | null = null;\n\n for (let i = 0; i < apiMessages.length; i++) {\n const msg = apiMessages[i];\n const timestamp = msg.created_at || msg.timestamp\n ? new Date(msg.created_at || msg.timestamp!)\n : new Date();\n\n if (typeof msg.content === 'string') {\n // Simple text message\n const message: Message = {\n id: msg.id || `thread-msg-${i}`,\n role: msg.role,\n content: msg.content,\n timestamp,\n };\n result.push(message);\n lastAssistantSegments = null;\n } else if (Array.isArray(msg.content)) {\n if (msg.role === 'assistant') {\n const segments: ContentSegment[] = [];\n let textContent = '';\n\n for (const block of msg.content) {\n if (block.type === 'text' && block.text) {\n segments.push({ type: 'text', content: block.text });\n textContent += block.text;\n } else if (block.type === 'tool_use') {\n segments.push({\n type: 'tool',\n id: block.id || `tool-${i}-${segments.length}`,\n name: block.name || 'unknown',\n status: 'completed',\n });\n }\n }\n\n const message: Message = {\n id: msg.id || `thread-msg-${i}`,\n role: 'assistant',\n content: textContent,\n timestamp,\n metadata: segments.length > 0 ? { content_segments: segments } : undefined,\n };\n result.push(message);\n lastAssistantSegments = segments;\n } else if (msg.role === 'user') {\n const hasToolResults = msg.content.some(b => b.type === 'tool_result');\n\n if (hasToolResults && lastAssistantSegments) {\n // Merge tool results into the previous assistant's tool segments\n for (const block of msg.content) {\n if (block.type === 'tool_result' && block.tool_use_id) {\n const toolSegment = lastAssistantSegments.find(\n s => s.type === 'tool' && s.id === block.tool_use_id\n );\n if (toolSegment && toolSegment.type === 'tool') {\n // Extract text content from result\n toolSegment.result = typeof block.content === 'string'\n ? block.content\n : Array.isArray(block.content)\n ? block.content.map(c => c.text || '').join('')\n : undefined;\n toolSegment.status = block.is_error ? 'error' : 'completed';\n }\n }\n }\n // Don't create a separate user message for tool results\n } else {\n // Regular user message with content blocks (shouldn't normally happen, but handle it)\n const textContent = msg.content\n .filter(b => b.type === 'text')\n .map(b => b.text || '')\n .join('');\n\n if (textContent) {\n result.push({\n id: msg.id || `thread-msg-${i}`,\n role: 'user',\n content: textContent,\n timestamp,\n });\n }\n lastAssistantSegments = null;\n }\n }\n }\n }\n\n return result;\n}\n","import { useEffect } from 'react';\nimport { WidgetsProps } from '../../types/components';\nimport { WidgetRenderer } from './WidgetRenderer';\nimport { cn } from '../../utils';\n\nexport function Widgets({\n widgets,\n onAction,\n onWidgetMount,\n layout = 'stack',\n spacing = 'normal',\n columns = 3,\n className,\n}: WidgetsProps) {\n useEffect(() => {\n widgets.forEach((widget) => {\n onWidgetMount?.(widget.id);\n });\n }, [widgets, onWidgetMount]);\n\n const layoutClasses = {\n stack: 'flex flex-col',\n grid: `grid grid-cols-1 md:grid-cols-${columns}`,\n masonry: 'columns-1 md:columns-2 lg:columns-3',\n };\n\n const spacingClasses = {\n tight: 'gap-2',\n normal: 'gap-4',\n loose: 'gap-6',\n };\n\n return (\n <div className={cn(layoutClasses[layout], spacingClasses[spacing], className)}>\n {widgets.map((widget) => (\n <WidgetRenderer key={widget.id} widget={widget} onAction={onAction} />\n ))}\n </div>\n );\n}\n","// No direct imports needed 'react';\nimport { CardWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface CardProps {\n widget: CardWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function Card({ widget, onAction }: CardProps) {\n const { title, description, image, footer } = widget.props;\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 overflow-hidden\">\n {image && <img src={image} alt={title} className=\"w-full h-48 object-cover\" />}\n\n <div className=\"p-4\">\n <h3 className=\"!text-lg font-semibold !text-neutral-900 dark:!text-white\">{title}</h3>\n {description && <p className=\"!text-neutral-600 dark:!text-neutral-400 mt-2\">{description}</p>}\n </div>\n\n {(footer || (widget.actions && widget.actions.length > 0)) && (\n <div className=\"border-t border-neutral-200 dark:border-neutral-700 p-4 flex justify-between items-center\">\n {footer && <span className=\"!text-sm !text-neutral-600 dark:!text-neutral-400\">{footer}</span>}\n\n {widget.actions && widget.actions.length > 0 && (\n <div className=\"flex gap-2\">\n {widget.actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() =>\n onAction?.({\n type: action.type,\n payload: action.payload,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n className=\"px-3 py-1.5 !text-sm rounded-lg font-medium transition-colors bg-blue-500 !text-white hover:bg-blue-600\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { ListWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface ListProps {\n widget: ListWidget & { isStreaming?: boolean };\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function List({ widget, onAction }: ListProps) {\n const { items } = widget.props;\n const isStreaming = widget.isStreaming ?? false;\n\n // Track seen item IDs to detect new items\n const seenItemsRef = useRef<Set<string>>(new Set());\n const [newItemIds, setNewItemIds] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const currentIds = new Set(items.map(item => item.id));\n const newIds = new Set<string>();\n\n // Find items we haven't seen before\n items.forEach(item => {\n if (!seenItemsRef.current.has(item.id)) {\n newIds.add(item.id);\n }\n });\n\n // Update seen items\n items.forEach(item => seenItemsRef.current.add(item.id));\n\n // Mark new items for animation\n if (newIds.size > 0) {\n setNewItemIds(newIds);\n\n // Clear animation class after animation completes\n const timer = setTimeout(() => {\n setNewItemIds(new Set());\n }, 500);\n\n return () => clearTimeout(timer);\n }\n }, [items]);\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 overflow-hidden\">\n {items.map((item, index) => {\n const isNew = newItemIds.has(item.id);\n const isLast = index === items.length - 1;\n\n return (\n <div\n key={item.id}\n className={`apteva-list-item flex items-center p-4 transition-colors ${\n !isLast || isStreaming ? 'border-b border-neutral-200 dark:border-neutral-700' : ''\n } ${!item.backgroundColor ? 'hover:bg-neutral-50 dark:hover:bg-neutral-800' : ''} ${\n isNew ? 'apteva-list-item-new' : ''\n }`}\n style={item.backgroundColor ? { backgroundColor: item.backgroundColor } : undefined}\n >\n {item.image && <img src={item.image} alt={item.title} className=\"w-16 h-16 rounded object-cover\" />}\n\n <div className={`flex-1 ${item.image ? 'ml-4' : ''}`}>\n <h4 className=\"font-semibold !text-neutral-900 dark:!text-white\">{item.title}</h4>\n {item.subtitle && <p className=\"!text-sm !text-neutral-600 dark:!text-neutral-400\">{item.subtitle}</p>}\n {item.description && (\n <p className=\"!text-xs !text-neutral-500 dark:!text-neutral-500 mt-1\">{item.description}</p>\n )}\n </div>\n\n {widget.actions && widget.actions.length > 0 && (\n <div className=\"flex gap-2\">\n {widget.actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() =>\n onAction?.({\n type: action.type,\n payload: item.metadata || item,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n className=\"px-3 py-1.5 !text-sm rounded-lg font-medium transition-colors bg-blue-500 !text-white hover:bg-blue-600\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Streaming indicator */}\n {isStreaming && (\n <div className=\"apteva-list-streaming flex items-center gap-3 p-4 text-neutral-500 dark:text-neutral-400\">\n <div className=\"apteva-streaming-dots flex gap-1\">\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '300ms' }} />\n </div>\n <span className=\"text-sm\">Loading more...</span>\n </div>\n )}\n </div>\n );\n}\n","// No direct imports needed 'react';\nimport { ButtonWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\nimport { cn } from '../../../utils';\n\ninterface ButtonProps {\n widget: ButtonWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function Button({ widget, onAction }: ButtonProps) {\n const { label, variant = 'primary', disabled = false } = widget.props;\n\n const variantClasses = {\n primary: 'bg-blue-500 !text-white hover:bg-blue-600',\n secondary: 'bg-neutral-500 !text-white hover:bg-neutral-600',\n outline: 'border-2 border-blue-500 !text-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900',\n ghost: '!text-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900',\n };\n\n return (\n <button\n onClick={() =>\n widget.actions?.[0] &&\n onAction?.({\n type: widget.actions[0].type,\n payload: widget.actions[0].payload,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n disabled={disabled}\n className={cn('px-4 py-2 rounded-lg font-medium transition-colors', variantClasses[variant], {\n 'opacity-50 cursor-not-allowed': disabled,\n })}\n >\n {label}\n </button>\n );\n}\n","import { ButtonGroupWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\nimport { cn } from '../../../utils';\n\ninterface ButtonGroupProps {\n widget: ButtonGroupWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function ButtonGroup({ widget, onAction }: ButtonGroupProps) {\n const { layout = 'horizontal', buttons } = widget.props;\n\n const variantClasses = {\n primary: 'bg-blue-500 !text-white hover:bg-blue-600',\n secondary: 'bg-neutral-200 dark:bg-neutral-700 !text-neutral-800 dark:!text-neutral-200 hover:bg-neutral-300 dark:hover:bg-neutral-600',\n outline: 'border border-neutral-300 dark:border-neutral-600 !text-neutral-700 dark:!text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800',\n };\n\n // Find action for a specific button by id\n const getActionForButton = (buttonId: string) => {\n return widget.actions?.find(action => action.payload?.buttonId === buttonId) || widget.actions?.[0];\n };\n\n return (\n <div\n className={cn(\n 'flex gap-2',\n layout === 'vertical' ? 'flex-col' : 'flex-row flex-wrap'\n )}\n >\n {buttons.map((button) => {\n const action = getActionForButton(button.id);\n return (\n <button\n key={button.id}\n onClick={() => {\n if (action) {\n onAction?.({\n type: action.type,\n payload: { ...action.payload, buttonId: button.id },\n widgetId: widget.id,\n timestamp: new Date(),\n });\n }\n }}\n className={cn(\n 'px-4 py-2 rounded-lg font-medium transition-colors text-sm',\n variantClasses[button.variant || 'secondary']\n )}\n >\n {button.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { TableWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\nimport { cn } from '../../../utils/cn';\n\ninterface TableProps {\n widget: TableWidget & { isStreaming?: boolean };\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function Table({ widget, onAction }: TableProps) {\n const { columns, rows, caption, compact = false, striped = false } = widget.props;\n const isStreaming = widget.isStreaming ?? false;\n\n // Track seen row IDs to detect new rows\n const seenRowsRef = useRef<Set<string>>(new Set());\n const [newRowIds, setNewRowIds] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const newIds = new Set<string>();\n\n // Find rows we haven't seen before\n rows.forEach((row, index) => {\n const rowId = row.id || `row-${index}`;\n if (!seenRowsRef.current.has(rowId)) {\n newIds.add(rowId);\n }\n });\n\n // Update seen rows\n rows.forEach((row, index) => {\n const rowId = row.id || `row-${index}`;\n seenRowsRef.current.add(rowId);\n });\n\n // Mark new rows for animation\n if (newIds.size > 0) {\n setNewRowIds(newIds);\n\n // Clear animation class after animation completes\n const timer = setTimeout(() => {\n setNewRowIds(new Set());\n }, 500);\n\n return () => clearTimeout(timer);\n }\n }, [rows]);\n\n const getAlignment = (align?: 'left' | 'center' | 'right') => {\n switch (align) {\n case 'center': return 'text-center';\n case 'right': return 'text-right';\n default: return 'text-left';\n }\n };\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n {caption && (\n <caption className=\"px-4 py-2 text-sm text-neutral-600 dark:text-neutral-400 text-left bg-neutral-50 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n {caption}\n </caption>\n )}\n <thead>\n <tr className=\"bg-neutral-50 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n 'font-semibold text-neutral-900 dark:text-white',\n compact ? 'px-3 py-2 text-xs' : 'px-4 py-3 text-sm',\n getAlignment(column.align)\n )}\n style={column.width ? { width: column.width } : undefined}\n >\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => {\n const rowId = row.id || `row-${rowIndex}`;\n const isNew = newRowIds.has(rowId);\n\n return (\n <tr\n key={rowId}\n className={cn(\n 'apteva-table-row border-b border-neutral-200 dark:border-neutral-700 last:border-b-0',\n 'transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-800',\n striped && rowIndex % 2 === 1 && 'bg-neutral-50/50 dark:bg-neutral-800/50',\n isNew && 'apteva-table-row-new'\n )}\n onClick={() => {\n if (widget.actions && widget.actions.length > 0) {\n onAction?.({\n type: widget.actions[0].type,\n payload: row,\n widgetId: widget.id,\n timestamp: new Date(),\n });\n }\n }}\n style={{ cursor: widget.actions?.length ? 'pointer' : 'default' }}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n 'text-neutral-700 dark:text-neutral-300',\n compact ? 'px-3 py-2 text-xs' : 'px-4 py-3 text-sm',\n getAlignment(column.align)\n )}\n >\n {row[column.key] ?? '—'}\n </td>\n ))}\n </tr>\n );\n })}\n {rows.length === 0 && !isStreaming && (\n <tr>\n <td\n colSpan={columns.length || 1}\n className=\"px-4 py-8 text-center text-sm text-neutral-500 dark:text-neutral-400\"\n >\n No data available\n </td>\n </tr>\n )}\n {/* Streaming indicator row */}\n {isStreaming && (\n <tr className=\"apteva-table-streaming\">\n <td\n colSpan={columns.length || 1}\n className=\"px-4 py-3 text-center\"\n >\n <div className=\"flex items-center justify-center gap-3 text-neutral-500 dark:text-neutral-400\">\n <div className=\"flex gap-1\">\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '300ms' }} />\n </div>\n <span className=\"text-sm\">Loading more...</span>\n </div>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { FormWidget, FormField } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface FormProps {\n widget: FormWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Custom Select */\n/* ------------------------------------------------------------------ */\nfunction CustomSelect({\n name,\n value,\n options,\n placeholder,\n required,\n onChange,\n}: {\n name: string;\n value: string;\n options?: Array<{ label: string; value: string }>;\n placeholder?: string;\n required?: boolean;\n onChange: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n const selected = options?.find((o) => o.value === value);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n return (\n <div ref={ref} className=\"apteva-select relative\">\n {/* Hidden native select for form validation */}\n <select\n name={name}\n value={value}\n required={required}\n onChange={() => {}}\n tabIndex={-1}\n className=\"absolute inset-0 opacity-0 pointer-events-none\"\n aria-hidden\n >\n <option value=\"\" />\n {options?.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"apteva-select-trigger w-full flex items-center justify-between px-3 py-2 rounded-lg border transition-colors text-left\"\n >\n <span className={selected ? 'apteva-select-value' : 'apteva-select-placeholder'}>\n {selected ? selected.label : (placeholder || 'Select...')}\n </span>\n <svg\n className={`apteva-select-chevron w-4 h-4 flex-shrink-0 transition-transform ${open ? 'rotate-180' : ''}`}\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {open && (\n <div className=\"apteva-select-dropdown absolute z-50 w-full mt-1 rounded-lg border shadow-lg overflow-hidden\">\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {options?.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => { onChange(opt.value); setOpen(false); }}\n className={`apteva-select-option w-full text-left px-3 py-2 text-sm transition-colors ${\n opt.value === value ? 'apteva-select-option-active' : ''\n }`}\n >\n {opt.label}\n </button>\n ))}\n {(!options || options.length === 0) && (\n <div className=\"px-3 py-2 text-sm apteva-select-placeholder\">No options</div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Custom Date Picker */\n/* ------------------------------------------------------------------ */\nfunction CustomDatePicker({\n name,\n value,\n placeholder,\n required,\n onChange,\n}: {\n name: string;\n value: string;\n placeholder?: string;\n required?: boolean;\n onChange: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n // Parse current value or default to today's month\n const parseDate = (v: string) => {\n if (v) {\n const [y, m, d] = v.split('-').map(Number);\n return { year: y, month: m - 1, day: d };\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth(), day: 0 };\n };\n\n const parsed = parseDate(value);\n const [viewYear, setViewYear] = useState(parsed.year);\n const [viewMonth, setViewMonth] = useState(parsed.month);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n // Sync view when value changes externally\n useEffect(() => {\n if (value) {\n const p = parseDate(value);\n setViewYear(p.year);\n setViewMonth(p.month);\n }\n }, [value]);\n\n const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();\n const firstDayOfWeek = new Date(viewYear, viewMonth, 1).getDay(); // 0=Sun\n // Shift so Monday=0\n const startOffset = (firstDayOfWeek + 6) % 7;\n\n const prevMonth = () => {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(viewYear - 1); }\n else setViewMonth(viewMonth - 1);\n };\n const nextMonth = () => {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(viewYear + 1); }\n else setViewMonth(viewMonth + 1);\n };\n\n const selectDay = (day: number) => {\n const m = String(viewMonth + 1).padStart(2, '0');\n const d = String(day).padStart(2, '0');\n onChange(`${viewYear}-${m}-${d}`);\n setOpen(false);\n };\n\n const formatDisplay = (v: string) => {\n if (!v) return '';\n const [y, m, d] = v.split('-');\n return `${d}/${m}/${y}`;\n };\n\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const dayLabels = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\n const isSelected = (day: number) => {\n if (!value) return false;\n const p = parseDate(value);\n return p.year === viewYear && p.month === viewMonth && p.day === day;\n };\n\n const isToday = (day: number) => {\n const now = new Date();\n return now.getFullYear() === viewYear && now.getMonth() === viewMonth && now.getDate() === day;\n };\n\n return (\n <div ref={ref} className=\"apteva-datepicker relative\">\n {/* Hidden native input for form validation */}\n <input\n type=\"text\"\n name={name}\n value={value}\n required={required}\n onChange={() => {}}\n tabIndex={-1}\n className=\"absolute inset-0 opacity-0 pointer-events-none\"\n aria-hidden\n />\n\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"apteva-datepicker-trigger w-full flex items-center justify-between px-3 py-2 rounded-lg border transition-colors text-left\"\n >\n <span className={value ? 'apteva-datepicker-value' : 'apteva-select-placeholder'}>\n {value ? formatDisplay(value) : (placeholder || 'Select date...')}\n </span>\n <svg className=\"apteva-select-chevron w-4 h-4 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </button>\n\n {open && (\n <div className=\"apteva-datepicker-dropdown absolute z-50 mt-1 rounded-lg border shadow-lg overflow-hidden\">\n {/* Header */}\n <div className=\"apteva-datepicker-header flex items-center justify-between px-3 py-2\">\n <button type=\"button\" onClick={prevMonth} className=\"apteva-datepicker-nav p-1 rounded transition-colors\">\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=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <span className=\"apteva-datepicker-title text-sm font-semibold\">\n {monthNames[viewMonth]} {viewYear}\n </span>\n <button type=\"button\" onClick={nextMonth} className=\"apteva-datepicker-nav p-1 rounded transition-colors\">\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=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 px-2\">\n {dayLabels.map((d) => (\n <div key={d} className=\"apteva-datepicker-daylabel text-center text-xs font-medium py-1\">{d}</div>\n ))}\n </div>\n\n {/* Day grid */}\n <div className=\"grid grid-cols-7 px-2 pb-2\">\n {/* Empty cells for offset */}\n {Array.from({ length: startOffset }).map((_, i) => (\n <div key={`empty-${i}`} />\n ))}\n {Array.from({ length: daysInMonth }).map((_, i) => {\n const day = i + 1;\n const sel = isSelected(day);\n const today = isToday(day);\n return (\n <button\n key={day}\n type=\"button\"\n onClick={() => selectDay(day)}\n className={[\n 'apteva-datepicker-day text-center text-sm py-1 rounded transition-colors',\n sel ? 'apteva-datepicker-day-selected' : '',\n today && !sel ? 'apteva-datepicker-day-today' : '',\n ].join(' ')}\n >\n {day}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Form Component */\n/* ------------------------------------------------------------------ */\nexport function Form({ widget, onAction }: FormProps) {\n const { title, fields } = widget.props;\n\n const fileInputRefs = useRef<Record<string, HTMLInputElement | null>>({});\n\n // Initialize form state with default values\n const [formData, setFormData] = useState<Record<string, any>>(() => {\n const initial: Record<string, any> = {};\n fields.forEach((field) => {\n if (field.type === 'file') {\n initial[field.name] = [];\n } else {\n initial[field.name] = field.defaultValue ?? (field.type === 'checkbox' ? false : '');\n }\n });\n return initial;\n });\n\n const handleChange = useCallback((name: string, value: any) => {\n setFormData((prev) => ({ ...prev, [name]: value }));\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (widget.actions?.[0] && onAction) {\n onAction({\n type: widget.actions[0].type,\n payload: { ...widget.actions[0].payload, formData },\n widgetId: widget.id,\n timestamp: new Date(),\n });\n }\n };\n\n const renderField = (field: FormField) => {\n const baseInputClass =\n 'apteva-input w-full px-3 py-2 rounded-lg border transition-colors ' +\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent';\n\n switch (field.type) {\n case 'text':\n case 'password':\n case 'number':\n return (\n <input\n type={field.type}\n name={field.name}\n value={formData[field.name] || ''}\n onChange={(e) => handleChange(field.name, field.type === 'number' ? Number(e.target.value) : e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n className={baseInputClass}\n />\n );\n\n case 'date':\n return (\n <CustomDatePicker\n name={field.name}\n value={formData[field.name] || ''}\n placeholder={field.placeholder}\n required={field.required}\n onChange={(v) => handleChange(field.name, v)}\n />\n );\n\n case 'textarea':\n return (\n <textarea\n name={field.name}\n value={formData[field.name] || ''}\n onChange={(e) => handleChange(field.name, e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n rows={3}\n className={baseInputClass}\n />\n );\n\n case 'select':\n return (\n <CustomSelect\n name={field.name}\n value={formData[field.name] || ''}\n options={field.options}\n placeholder={field.placeholder}\n required={field.required}\n onChange={(v) => handleChange(field.name, v)}\n />\n );\n\n case 'checkbox':\n return (\n <label className=\"apteva-checkbox flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n name={field.name}\n checked={formData[field.name] || false}\n onChange={(e) => handleChange(field.name, e.target.checked)}\n className=\"w-4 h-4 rounded\"\n />\n <span>{field.label}</span>\n </label>\n );\n\n case 'file': {\n const files: File[] = formData[field.name] || [];\n return (\n <div className=\"space-y-2\">\n <input\n ref={(el) => { fileInputRefs.current[field.name] = el; }}\n type=\"file\"\n name={field.name}\n multiple={field.multiple ?? true}\n accept={field.accept}\n onChange={(e) => {\n const newFiles = Array.from(e.target.files || []);\n if (field.multiple !== false) {\n handleChange(field.name, [...files, ...newFiles]);\n } else {\n handleChange(field.name, newFiles);\n }\n if (fileInputRefs.current[field.name]) {\n fileInputRefs.current[field.name]!.value = '';\n }\n }}\n className=\"hidden\"\n />\n <button\n type=\"button\"\n onClick={() => fileInputRefs.current[field.name]?.click()}\n className=\"apteva-file-drop w-full px-3 py-3 rounded-lg border-2 border-dashed transition-colors cursor-pointer !text-sm\"\n >\n {field.placeholder || 'Click to add files'}\n </button>\n {files.length > 0 && (\n <ul className=\"space-y-1\">\n {files.map((file, idx) => (\n <li\n key={`${file.name}-${idx}`}\n className=\"apteva-file-item-row flex items-center justify-between px-2 py-1.5 rounded-lg !text-sm\"\n >\n <span className=\"truncate mr-2\">\n {file.name}\n <span className=\"ml-1\" style={{ opacity: 0.6 }}>\n ({(file.size / 1024).toFixed(0)} KB)\n </span>\n </span>\n <button\n type=\"button\"\n onClick={() => handleChange(field.name, files.filter((_, i) => i !== idx))}\n className=\"apteva-file-remove-btn transition-colors flex-shrink-0\"\n >\n ✕\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n const submitAction = widget.actions?.find((a) => a.type === 'submit') || widget.actions?.[0];\n\n return (\n <form onSubmit={handleSubmit} className=\"border rounded-xl overflow-hidden\">\n <div className=\"p-4\">\n {title && (\n <h3 className=\"!text-lg font-semibold mb-4\">{title}</h3>\n )}\n\n <div className=\"space-y-3\">\n {fields.map((field) => (\n <div key={field.name} className={field.type === 'checkbox' ? '' : 'space-y-1'}>\n {field.type !== 'checkbox' && (\n <label className=\"apteva-field-label block !text-sm font-medium\">\n {field.label}\n {field.required && <span style={{ color: 'var(--aw-danger)' }} className=\"ml-1\">*</span>}\n </label>\n )}\n {renderField(field)}\n </div>\n ))}\n </div>\n </div>\n\n {submitAction && (\n <div className=\"px-4 pb-4\">\n <button\n type=\"submit\"\n className=\"px-3 py-1.5 !text-sm rounded-lg font-medium transition-colors\"\n >\n {submitAction.label || 'Submit'}\n </button>\n </div>\n )}\n </form>\n );\n}\n","import { ImageWidget } from '../../../types/widgets';\n\ninterface ImageProps {\n widget: ImageWidget;\n}\n\nexport function Image({ widget }: ImageProps) {\n const { src, alt, caption } = widget.props;\n\n return (\n <figure className=\"overflow-hidden rounded-xl\">\n <img\n src={src}\n alt={alt}\n className=\"w-full h-auto object-contain bg-neutral-100 dark:bg-neutral-800\"\n loading=\"lazy\"\n />\n {caption && (\n <figcaption className=\"mt-2 text-center text-sm text-neutral-600 dark:text-neutral-400\">\n {caption}\n </figcaption>\n )}\n </figure>\n );\n}\n","import { FlowWidget, FlowStep } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface FlowProps {\n widget: FlowWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\n// Icon components for different step types\nfunction StepIcon({ type, status }: { type?: string; status?: FlowStep['status'] }) {\n // Status-based icons (for execution tracking)\n if (status === 'completed') {\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n );\n }\n if (status === 'error') {\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n );\n }\n if (status === 'active') {\n return (\n <div className=\"w-3.5 h-3.5 rounded-full bg-current animate-pulse\" />\n );\n }\n\n // Type-based icons\n const iconClass = \"w-4 h-4\";\n\n if (type === 'time' || type === 'schedule' || type === 'clock') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n );\n }\n if (type === 'recurring' || type === 'repeat') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n );\n }\n if (type === 'agent' || type?.startsWith('@')) {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n if (type === 'email' || type === 'mail') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n );\n }\n if (type === 'slack' || type === 'message' || type === 'chat') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n );\n }\n if (type === 'webhook' || type === 'api') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n );\n }\n if (type === 'build' || type === 'compile' || type === 'package') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\" />\n </svg>\n );\n }\n if (type === 'test' || type === 'check' || type === 'verify') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 </svg>\n );\n }\n if (type === 'deploy' || type === 'rocket' || type === 'launch') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n );\n }\n if (type === 'push' || type === 'upload' || type === 'cloud') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n );\n }\n if (type === 'generate' || type === 'create' || type === 'document' || type === 'file') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 if (type === 'review' || type === 'inspect' || type === 'eye') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n );\n }\n if (type === 'analyze' || type === 'research' || type === 'chart') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n );\n }\n if (type === 'scrape' || type === 'crawl' || type === 'spider') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n );\n }\n if (type === 'data' || type === 'database' || type === 'storage') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\" />\n </svg>\n );\n }\n if (type === 'notification' || type === 'bell' || type === 'alert') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\n </svg>\n );\n }\n if (type === 'transform' || type === 'process' || type === 'convert') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n );\n }\n\n // Default circle icon\n return (\n <div className=\"w-2 h-2 rounded-full bg-current opacity-50\" />\n );\n}\n\n// Header icon based on flow type\nfunction HeaderIcon({ icon }: { icon?: string }) {\n const baseClass = \"w-6 h-6\";\n\n if (icon === 'research' || icon === 'multi-agent' || icon === 'agents') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-purple-100 dark:bg-purple-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-purple-600 dark:text-purple-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'schedule' || icon === 'report' || icon === 'calendar') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-amber-100 dark:bg-amber-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-amber-600 dark:text-amber-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'recurring' || icon === 'repeat' || icon === 'sync') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-cyan-100 dark:bg-cyan-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-cyan-600 dark:text-cyan-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n );\n }\n if (icon === 'analyze' || icon === 'analysis' || icon === 'chart') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-cyan-100 dark:bg-cyan-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-cyan-600 dark:text-cyan-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'deploy' || icon === 'rocket' || icon === 'launch') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-blue-100 dark:bg-blue-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-blue-600 dark:text-blue-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'automation' || icon === 'workflow' || icon === 'process') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-indigo-100 dark:bg-indigo-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-indigo-600 dark:text-indigo-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'data' || icon === 'pipeline' || icon === 'etl') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-emerald-600 dark:text-emerald-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4\" />\n </svg>\n </div>\n );\n }\n\n // Default task/workflow icon\n return (\n <div className=\"w-10 h-10 rounded-lg bg-neutral-100 dark:bg-neutral-700 flex items-center justify-center\">\n <svg className={`${baseClass} text-neutral-600 dark:text-neutral-300`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 2\" />\n </svg>\n </div>\n );\n}\n\nfunction Chevron() {\n return (\n <svg className=\"w-4 h-4 text-neutral-400 dark:text-neutral-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\n// Step color styles - using static Tailwind classes\ntype StepColor = 'blue' | 'purple' | 'cyan' | 'amber' | 'emerald' | 'rose' | 'indigo' | 'orange' | 'neutral';\n\nconst STEP_COLOR_CLASSES: Record<StepColor, string> = {\n blue: 'bg-blue-100 dark:bg-blue-900/40 !text-blue-700 dark:!text-blue-300 border-blue-300 dark:border-blue-500',\n purple: 'bg-purple-100 dark:bg-purple-900/40 !text-purple-700 dark:!text-purple-300 border-purple-300 dark:border-purple-500',\n cyan: 'bg-cyan-100 dark:bg-cyan-900/40 !text-cyan-700 dark:!text-cyan-300 border-cyan-300 dark:border-cyan-500',\n amber: 'bg-amber-100 dark:bg-amber-900/40 !text-amber-700 dark:!text-amber-300 border-amber-300 dark:border-amber-500',\n emerald: 'bg-emerald-100 dark:bg-emerald-900/40 !text-emerald-700 dark:!text-emerald-300 border-emerald-300 dark:border-emerald-500',\n rose: 'bg-rose-100 dark:bg-rose-900/40 !text-rose-700 dark:!text-rose-300 border-rose-300 dark:border-rose-500',\n indigo: 'bg-indigo-100 dark:bg-indigo-900/40 !text-indigo-700 dark:!text-indigo-300 border-indigo-300 dark:border-indigo-500',\n orange: 'bg-orange-100 dark:bg-orange-900/40 !text-orange-700 dark:!text-orange-300 border-orange-300 dark:border-orange-500',\n neutral: 'bg-neutral-100 dark:bg-neutral-800 !text-neutral-600 dark:!text-neutral-300 border-neutral-300 dark:border-neutral-600',\n};\n\n// Get color based on step type\nfunction getStepColorClass(step: FlowStep, stepType?: string): string {\n // If step has explicit color\n if (step.color && STEP_COLOR_CLASSES[step.color as StepColor]) {\n return STEP_COLOR_CLASSES[step.color as StepColor];\n }\n\n // Auto-assign colors based on step type\n if (stepType === 'time' || stepType === 'schedule' || stepType === 'clock') {\n return STEP_COLOR_CLASSES.blue;\n }\n if (stepType === 'agent' || stepType?.startsWith('@')) {\n return STEP_COLOR_CLASSES.purple;\n }\n if (stepType === 'email' || stepType === 'slack' || stepType === 'message' || stepType === 'notification') {\n return STEP_COLOR_CLASSES.cyan;\n }\n if (stepType === 'generate' || stepType === 'document' || stepType === 'create') {\n return STEP_COLOR_CLASSES.amber;\n }\n if (stepType === 'deploy' || stepType === 'rocket' || stepType === 'launch') {\n return STEP_COLOR_CLASSES.rose;\n }\n if (stepType === 'build' || stepType === 'compile' || stepType === 'package') {\n return STEP_COLOR_CLASSES.indigo;\n }\n if (stepType === 'test' || stepType === 'check' || stepType === 'verify') {\n return STEP_COLOR_CLASSES.emerald;\n }\n if (stepType === 'data' || stepType === 'database' || stepType === 'storage') {\n return STEP_COLOR_CLASSES.orange;\n }\n\n // Default blue\n return STEP_COLOR_CLASSES.blue;\n}\n\nexport function Flow({ widget }: FlowProps) {\n const { title, subtitle, icon, steps } = widget.props as any;\n\n return (\n <div className=\"rounded-xl bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-700 overflow-hidden\">\n {/* Header */}\n <div className=\"px-4 py-4 flex items-center gap-4\">\n <HeaderIcon icon={icon} />\n\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-base text-neutral-900 dark:text-white truncate\">{title}</h3>\n {subtitle && (\n <p className=\"text-sm text-neutral-500 dark:text-neutral-400 truncate mt-0.5\">{subtitle}</p>\n )}\n </div>\n </div>\n\n {/* Steps - Horizontal pill flow */}\n <div className=\"px-4 pb-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {steps.map((step: FlowStep, index: number) => {\n const isLast = index === steps.length - 1;\n const isActive = step.status === 'active';\n const isCompleted = step.status === 'completed';\n const isError = step.status === 'error';\n const isSkipped = step.status === 'skipped';\n\n // Determine step type from label or explicit type\n const label = step.label;\n let stepType = step.type;\n if (!stepType) {\n // Auto-detect type from label\n if (label.startsWith('@')) stepType = 'agent';\n else if (/^\\d+[ap]m$/i.test(label) || /^(mon|tue|wed|thu|fri|sat|sun)/i.test(label)) stepType = 'time';\n else {\n const lowerLabel = label.toLowerCase();\n const typeMap: Record<string, string> = {\n 'test': 'test', 'build': 'build', 'push': 'push', 'deploy': 'deploy',\n 'email': 'email', 'slack': 'slack', 'generate': 'generate', 'review': 'review',\n 'analyze': 'analyze', 'scrape': 'scrape', 'transform': 'transform',\n 'notify': 'notification', 'alert': 'notification', 'webhook': 'webhook',\n 'api': 'api', 'data': 'data', 'process': 'process'\n };\n stepType = typeMap[lowerLabel];\n }\n }\n\n // Get classes based on status or step type\n let pillClasses: string;\n let extraClasses = '';\n\n if (isActive) {\n pillClasses = 'bg-blue-100 dark:bg-blue-900/40 !text-blue-700 dark:!text-blue-300 border-blue-400 dark:border-blue-400 ring-2 ring-blue-400';\n } else if (isCompleted) {\n pillClasses = 'bg-emerald-100 dark:bg-emerald-900/40 !text-emerald-700 dark:!text-emerald-300 border-emerald-400 dark:border-emerald-400';\n } else if (isError) {\n pillClasses = 'bg-red-100 dark:bg-red-900/40 !text-red-700 dark:!text-red-300 border-red-400 dark:border-red-400';\n } else if (isSkipped) {\n pillClasses = 'bg-neutral-100 dark:bg-neutral-800 !text-neutral-400 dark:!text-neutral-500 border-neutral-300 dark:border-neutral-600';\n extraClasses = 'line-through';\n } else {\n // Proposal mode - use colorful pills based on type\n pillClasses = getStepColorClass(step, stepType);\n }\n\n return (\n <div key={step.id} className=\"flex items-center gap-2\">\n <span className={`inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium border transition-colors ${pillClasses} ${extraClasses}`}>\n <StepIcon type={stepType} status={step.status} />\n {label}\n </span>\n {!isLast && <Chevron />}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n","import { KpiWidget } from '../../../types/interface';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface KpiProps {\n widget: KpiWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nconst trendIcons: Record<string, { symbol: string; color: string }> = {\n up: { symbol: '\\u2191', color: 'text-emerald-500' },\n down: { symbol: '\\u2193', color: 'text-red-500' },\n flat: { symbol: '\\u2192', color: 'text-neutral-400' },\n};\n\nexport function Kpi({ widget, onAction }: KpiProps) {\n const { title, label = '', value = '', change, trend } = widget.props || {};\n const trendInfo = trend ? trendIcons[trend] : null;\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 p-5\">\n {title && (\n <h3 className=\"!text-base font-semibold !text-neutral-900 dark:!text-white mb-3\">{title}</h3>\n )}\n <div className=\"!text-sm font-medium !text-neutral-500 dark:!text-neutral-400 mb-1\">{label}</div>\n <div className=\"flex items-end gap-2\">\n <div className=\"apteva-kpi-value !text-2xl font-bold !text-neutral-900 dark:!text-white\">{value}</div>\n {change && trendInfo && (\n <div className={`flex items-center gap-0.5 !text-sm font-medium ${trendInfo.color} mb-0.5`}>\n <span>{trendInfo.symbol}</span>\n <span>{change}</span>\n </div>\n )}\n {change && !trendInfo && (\n <div className=\"!text-sm font-medium !text-neutral-400 mb-0.5\">{change}</div>\n )}\n </div>\n {widget.actions && widget.actions.length > 0 && (\n <div className=\"flex gap-2 mt-3 pt-3 border-t border-neutral-200 dark:border-neutral-700\">\n {widget.actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() =>\n onAction?.({\n type: action.type,\n payload: action.payload,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n className=\"px-2 py-1 !text-xs rounded font-medium transition-colors bg-neutral-100 dark:bg-neutral-800 !text-neutral-600 dark:!text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { TextBlockWidget } from '../../../types/interface';\n\ninterface TextBlockProps {\n widget: TextBlockWidget;\n}\n\nexport function TextBlock({ widget }: TextBlockProps) {\n const { content = '', variant = 'body' } = widget.props || {};\n\n const variantClasses: Record<string, string> = {\n heading: '!text-xl font-bold !text-neutral-900 dark:!text-white',\n body: '!text-sm !text-neutral-700 dark:!text-neutral-300 leading-relaxed',\n caption: '!text-xs !text-neutral-500 dark:!text-neutral-400',\n };\n\n // Simple markdown: **bold**, *italic*, `code`, [links](url), ## headings, - lists\n const renderMarkdown = (text: string) => {\n const lines = text.split('\\n');\n const elements: React.ReactNode[] = [];\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n // Headings\n if (line.startsWith('### ')) {\n elements.push(\n <h3 key={i} className=\"!text-base font-semibold !text-neutral-900 dark:!text-white mt-3 mb-1\">\n {renderInline(line.slice(4))}\n </h3>\n );\n } else if (line.startsWith('## ')) {\n elements.push(\n <h2 key={i} className=\"!text-lg font-bold !text-neutral-900 dark:!text-white mt-4 mb-1\">\n {renderInline(line.slice(3))}\n </h2>\n );\n }\n // List items\n else if (/^[-*+]\\s/.test(line)) {\n const listItems: React.ReactNode[] = [];\n while (i < lines.length && /^[-*+]\\s/.test(lines[i])) {\n listItems.push(\n <li key={i} className=\"ml-4 list-disc\">{renderInline(lines[i].slice(2))}</li>\n );\n i++;\n }\n elements.push(<ul key={`list-${i}`} className=\"my-1 space-y-0.5\">{listItems}</ul>);\n continue; // skip the i++ at bottom\n }\n // Empty line\n else if (line.trim() === '') {\n elements.push(<div key={i} className=\"h-2\" />);\n }\n // Normal paragraph\n else {\n elements.push(<p key={i} className=\"my-0.5\">{renderInline(line)}</p>);\n }\n\n i++;\n }\n\n return elements;\n };\n\n const renderInline = (text: string): React.ReactNode => {\n // Process inline markdown: **bold**, *italic*, `code`, [link](url)\n const parts: React.ReactNode[] = [];\n let remaining = text;\n let key = 0;\n\n while (remaining.length > 0) {\n // Bold\n const boldMatch = remaining.match(/\\*\\*(.+?)\\*\\*/);\n // Code\n const codeMatch = remaining.match(/`(.+?)`/);\n // Link\n const linkMatch = remaining.match(/\\[(.+?)\\]\\((.+?)\\)/);\n\n // Find earliest match\n const matches = [\n boldMatch ? { type: 'bold', index: boldMatch.index!, match: boldMatch } : null,\n codeMatch ? { type: 'code', index: codeMatch.index!, match: codeMatch } : null,\n linkMatch ? { type: 'link', index: linkMatch.index!, match: linkMatch } : null,\n ].filter(Boolean).sort((a, b) => a!.index - b!.index);\n\n if (matches.length === 0) {\n parts.push(remaining);\n break;\n }\n\n const first = matches[0]!;\n if (first.index > 0) {\n parts.push(remaining.slice(0, first.index));\n }\n\n if (first.type === 'bold') {\n parts.push(<strong key={key++} className=\"font-semibold\">{first.match[1]}</strong>);\n remaining = remaining.slice(first.index + first.match[0].length);\n } else if (first.type === 'code') {\n parts.push(\n <code key={key++} className=\"px-1 py-0.5 bg-neutral-100 dark:bg-neutral-800 rounded text-xs font-mono\">\n {first.match[1]}\n </code>\n );\n remaining = remaining.slice(first.index + first.match[0].length);\n } else if (first.type === 'link') {\n parts.push(\n <a key={key++} href={first.match[2]} className=\"text-blue-500 hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">\n {first.match[1]}\n </a>\n );\n remaining = remaining.slice(first.index + first.match[0].length);\n }\n }\n\n return parts.length === 1 ? parts[0] : <>{parts}</>;\n };\n\n return (\n <div className={variantClasses[variant] || variantClasses.body}>\n {renderMarkdown(content)}\n </div>\n );\n}\n","import { SpacerWidget } from '../../../types/interface';\n\ninterface SpacerProps {\n widget: SpacerWidget;\n}\n\nconst heightClasses: Record<string, string> = {\n sm: 'h-2',\n md: 'h-4',\n lg: 'h-8',\n};\n\nexport function Spacer({ widget }: SpacerProps) {\n const { height = 'md', variant = 'space' } = widget.props || {};\n\n if (variant === 'line') {\n return (\n <div className={heightClasses[height] || heightClasses.md + ' flex items-center'}>\n <hr className=\"w-full border-neutral-200 dark:border-neutral-700\" />\n </div>\n );\n }\n\n return <div className={heightClasses[height] || heightClasses.md} />;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { LiveViewWidget } from '../../../types/widgets';\nimport { cn } from '../../../utils';\n\ninterface LiveViewProps {\n widget: LiveViewWidget;\n}\n\nexport function LiveView({ widget }: LiveViewProps) {\n const { src, title, height, aspectRatio = '16/9', allowFullscreen = true, sandbox, allow, refreshInterval, showToolbar = true } = widget.props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const handleRefresh = useCallback(() => {\n setIsLoading(true);\n setHasError(false);\n setRefreshKey(k => k + 1);\n }, []);\n\n const handleFullscreen = useCallback(() => {\n iframeRef.current?.requestFullscreen?.();\n }, []);\n\n const handleOpenExternal = useCallback(() => {\n window.open(src, '_blank', 'noopener,noreferrer');\n }, [src]);\n\n useEffect(() => {\n if (!refreshInterval || refreshInterval <= 0) return;\n const interval = setInterval(handleRefresh, refreshInterval * 1000);\n return () => clearInterval(interval);\n }, [refreshInterval, handleRefresh]);\n\n const aspectMap = { '16/9': '56.25%', '4/3': '75%', '1/1': '100%' };\n const useFixedHeight = !!height;\n\n return (\n <div className=\"rounded-xl overflow-hidden border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900\">\n {/* Toolbar */}\n {showToolbar && (\n <div className=\"flex items-center justify-between px-3 py-2 bg-neutral-100 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className={cn(\n 'w-2 h-2 rounded-full flex-shrink-0',\n hasError ? 'bg-red-500' : isLoading ? 'bg-amber-500 animate-pulse' : 'bg-emerald-500'\n )} />\n <span className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300 truncate\">\n {title || 'Live View'}\n </span>\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <button\n onClick={handleRefresh}\n className=\"p-1.5 rounded-md text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title=\"Refresh\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </button>\n <button\n onClick={handleOpenExternal}\n className=\"p-1.5 rounded-md text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title=\"Open in new tab\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </button>\n {allowFullscreen && (\n <button\n onClick={handleFullscreen}\n className=\"p-1.5 rounded-md text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title=\"Fullscreen\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5v-4m0 4h-4m4 0l-5-5\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Iframe container */}\n <div\n className=\"relative bg-white dark:bg-neutral-950\"\n style={useFixedHeight\n ? { height }\n : { paddingBottom: aspectMap[aspectRatio] || aspectMap['16/9'] }\n }\n >\n {/* Loading overlay */}\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-neutral-100 dark:bg-neutral-900 z-10\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-6 h-6 border-2 border-neutral-300 dark:border-neutral-600 border-t-blue-500 rounded-full animate-spin\" />\n <span className=\"text-xs text-neutral-500\">Loading...</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {hasError && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-neutral-100 dark:bg-neutral-900 z-10\">\n <div className=\"flex flex-col items-center gap-2 text-center px-4\">\n <svg className=\"w-8 h-8 text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" />\n </svg>\n <span className=\"text-sm text-neutral-500\">Failed to load</span>\n <button\n onClick={handleRefresh}\n className=\"text-xs text-blue-500 hover:text-blue-600 underline\"\n >\n Try again\n </button>\n </div>\n </div>\n )}\n\n <iframe\n key={refreshKey}\n ref={iframeRef}\n src={src}\n title={title || 'Live View'}\n className={cn(\n 'border-0 bg-white dark:bg-neutral-950',\n useFixedHeight ? 'w-full h-full' : 'absolute inset-0 w-full h-full'\n )}\n allowFullScreen={allowFullscreen}\n sandbox={sandbox}\n allow={allow}\n onLoad={() => setIsLoading(false)}\n onError={() => { setIsLoading(false); setHasError(true); }}\n />\n </div>\n </div>\n );\n}\n","// No direct imports needed 'react';\nimport { Widget } from '../../types/widgets';\nimport { ActionEvent } from '../../types/actions';\nimport { Card, List, Button, ButtonGroup, Table, Form, Image, Flow, Kpi, TextBlock, Spacer, LiveView } from './widget-library';\n\ninterface WidgetRendererProps {\n widget: Widget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function WidgetRenderer({ widget, onAction }: WidgetRendererProps) {\n const renderWidget = () => {\n switch (widget.type) {\n case 'card':\n return <Card widget={widget as any} onAction={onAction} />;\n case 'list':\n return <List widget={widget as any} onAction={onAction} />;\n case 'button':\n return <Button widget={widget as any} onAction={onAction} />;\n case 'button_group':\n return <ButtonGroup widget={widget as any} onAction={onAction} />;\n case 'table':\n return <Table widget={widget as any} onAction={onAction} />;\n case 'form':\n return <Form widget={widget as any} onAction={onAction} />;\n case 'image':\n return <Image widget={widget as any} />;\n case 'flow':\n return <Flow widget={widget as any} />;\n case 'kpi':\n return <Kpi widget={widget as any} onAction={onAction} />;\n case 'text_block':\n return <TextBlock widget={widget as any} />;\n case 'spacer':\n return <Spacer widget={widget as any} />;\n case 'live_view':\n return <LiveView widget={widget as any} />;\n default:\n return (\n <div className=\"p-4 border border-yellow-300 bg-yellow-50 rounded-lg\">\n <p className=\"text-sm text-yellow-800\">Unknown widget type: {widget.type}</p>\n <pre className=\"text-xs mt-2 overflow-auto\">{JSON.stringify(widget, null, 2)}</pre>\n </div>\n );\n }\n };\n\n return <div className=\"apteva-widget\">{renderWidget()}</div>;\n}\n","import { cn } from '../../utils/cn';\n\ninterface WidgetSkeletonProps {\n type: string;\n className?: string;\n}\n\nexport function WidgetSkeleton({ type, className }: WidgetSkeletonProps) {\n // Render different skeletons based on widget type\n // Using neutral colors for true black/white theme\n switch (type) {\n case 'card':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 overflow-hidden', className)}>\n <div className=\"p-4 space-y-3\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-3/4\"></div>\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-full\"></div>\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-5/6\"></div>\n </div>\n </div>\n );\n\n case 'list':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse space-y-2', className)}>\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-center gap-3 p-3 rounded-lg border border-neutral-200 dark:border-neutral-800\">\n <div className=\"w-10 h-10 bg-neutral-200 dark:bg-neutral-700 rounded-full flex-shrink-0\"></div>\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2\"></div>\n <div className=\"h-2 bg-neutral-200 dark:bg-neutral-700 rounded w-3/4\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n\n case 'button_group':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse flex gap-2', className)}>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded-lg w-20\"></div>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded-lg w-20\"></div>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded-lg w-20\"></div>\n </div>\n );\n\n case 'form':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 p-4 space-y-4', className)}>\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/3\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-10 bg-neutral-200 dark:bg-neutral-700 rounded\"></div>\n <div className=\"h-10 bg-neutral-200 dark:bg-neutral-700 rounded\"></div>\n </div>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded w-24\"></div>\n </div>\n );\n\n case 'chart':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 p-4', className)}>\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/4 mb-4\"></div>\n <div className=\"flex items-end gap-2 h-32\">\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-1/2\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-3/4\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-1/3\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-full\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-2/3\"></div>\n </div>\n </div>\n );\n\n case 'image':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse', className)}>\n <div className=\"aspect-video bg-neutral-200 dark:bg-neutral-700 rounded-lg\"></div>\n </div>\n );\n\n case 'gallery':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse grid grid-cols-3 gap-2', className)}>\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"aspect-square bg-neutral-200 dark:bg-neutral-700 rounded-lg\"></div>\n ))}\n </div>\n );\n\n case 'map':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse', className)}>\n <div className=\"h-48 bg-neutral-200 dark:bg-neutral-700 rounded-lg flex items-center justify-center\">\n <svg className=\"w-8 h-8 text-neutral-400 dark:text-neutral-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n </div>\n );\n\n case 'table':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 overflow-hidden', className)}>\n {/* Header */}\n <div className=\"flex bg-neutral-100 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-300 dark:bg-neutral-600 rounded w-16\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-300 dark:bg-neutral-600 rounded w-20\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-300 dark:bg-neutral-600 rounded w-14\"></div>\n </div>\n </div>\n {/* Rows */}\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex border-b border-neutral-200 dark:border-neutral-800 last:border-b-0\">\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-24\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-16\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-20\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n\n default:\n // Generic skeleton for unknown widget types\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 p-4', className)}>\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2 mb-2\"></div>\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-full\"></div>\n </div>\n );\n }\n}\n","import React from 'react';\n\ninterface MarkdownContentProps {\n content: string;\n className?: string;\n}\n\n// Check if URL points to an image\nfunction isImageUrl(url: string): boolean {\n const imageExtensions = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)(\\?.*)?$/i;\n return imageExtensions.test(url);\n}\n\nfunction parseInlineMarkdown(text: string, keyPrefix: string = ''): React.ReactNode[] {\n const result: React.ReactNode[] = [];\n // Combined regex for inline elements:\n // 1. Images: ![alt](url)\n // 2. Links: [text](url)\n // 3. Bold: **text** or __text__\n // 4. Inline code: `code`\n const inlineRegex = /!\\[([^\\]]*)\\]\\(([^)]+)\\)|\\[([^\\]]+)\\]\\(([^)]+)\\)|(\\*\\*|__)(.+?)\\5|`([^`]+)`/g;\n\n let lastIndex = 0;\n let match;\n let key = 0;\n\n while ((match = inlineRegex.exec(text)) !== null) {\n // Add text before the match\n if (match.index > lastIndex) {\n result.push(text.slice(lastIndex, match.index));\n }\n\n if (match[1] !== undefined || match[2] !== undefined) {\n // Image: ![alt](url)\n const alt = match[1] || '';\n const src = match[2];\n result.push(\n <img\n key={`${keyPrefix}img${key++}`}\n src={src}\n alt={alt}\n className=\"apteva-md-img\"\n />\n );\n } else if (match[3] !== undefined || match[4] !== undefined) {\n // Link: [text](url)\n const linkText = match[3];\n const href = match[4];\n\n // Check if link URL is an image - render as image instead\n if (isImageUrl(href)) {\n result.push(\n <img\n key={`${keyPrefix}img${key++}`}\n src={href}\n alt={linkText}\n className=\"apteva-md-img\"\n />\n );\n } else {\n result.push(\n <a\n key={`${keyPrefix}a${key++}`}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"apteva-md-link\"\n >\n {linkText}\n </a>\n );\n }\n } else if (match[5] !== undefined) {\n // Bold: **text** or __text__\n result.push(<strong key={`${keyPrefix}b${key++}`}>{match[6]}</strong>);\n } else if (match[7] !== undefined) {\n // Inline code: `code`\n result.push(\n <code key={`${keyPrefix}code${key++}`} className=\"apteva-md-inline-code\">\n {match[7]}\n </code>\n );\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n result.push(text.slice(lastIndex));\n }\n\n return result.length > 0 ? result : [text];\n}\n\nfunction parseMarkdown(content: string): React.ReactNode[] {\n const lines = content.split('\\n');\n const result: React.ReactNode[] = [];\n let key = 0;\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Check for headings (## or ###)\n const h2Match = line.match(/^##\\s+(.*)$/);\n if (h2Match) {\n result.push(\n <h2 key={`h2${key++}`} className=\"apteva-md-h2\">\n {parseInlineMarkdown(h2Match[1], `${key}`)}\n </h2>\n );\n i++;\n continue;\n }\n\n const h3Match = line.match(/^###\\s+(.*)$/);\n if (h3Match) {\n result.push(\n <h3 key={`h3${key++}`} className=\"apteva-md-h3\">\n {parseInlineMarkdown(h3Match[1], `${key}`)}\n </h3>\n );\n i++;\n continue;\n }\n\n // Check for unordered list item (-, *, +)\n const ulMatch = line.match(/^(\\s*)([-*+])\\s+(.*)$/);\n if (ulMatch) {\n const listItems: React.ReactNode[] = [];\n const indent = ulMatch[1].length;\n\n while (i < lines.length) {\n const itemMatch = lines[i].match(/^(\\s*)([-*+])\\s+(.*)$/);\n if (itemMatch && itemMatch[1].length === indent) {\n listItems.push(\n <li key={`li${key++}`} className=\"apteva-md-li\">{parseInlineMarkdown(itemMatch[3], `${key}`)}</li>\n );\n i++;\n } else {\n break;\n }\n }\n\n result.push(\n <ul key={`ul${key++}`} className=\"apteva-md-ul\">\n {listItems}\n </ul>\n );\n continue;\n }\n\n // Check for ordered list item (1., 2., etc.)\n const olMatch = line.match(/^(\\s*)(\\d+)\\.\\s+(.*)$/);\n if (olMatch) {\n const listItems: React.ReactNode[] = [];\n const indent = olMatch[1].length;\n\n while (i < lines.length) {\n const itemMatch = lines[i].match(/^(\\s*)(\\d+)\\.\\s+(.*)$/);\n if (itemMatch && itemMatch[1].length === indent) {\n listItems.push(\n <li key={`li${key++}`} className=\"apteva-md-li\">{parseInlineMarkdown(itemMatch[3], `${key}`)}</li>\n );\n i++;\n } else {\n break;\n }\n }\n\n result.push(\n <ol key={`ol${key++}`} className=\"apteva-md-ol\">\n {listItems}\n </ol>\n );\n continue;\n }\n\n // Check for markdown table\n const tableMatch = line.match(/^\\|(.+)\\|$/);\n if (tableMatch && i + 1 < lines.length) {\n // Check if next line is separator (|---|---|)\n const separatorLine = lines[i + 1];\n const separatorMatch = separatorLine.match(/^\\|([\\s:-]+\\|)+$/);\n\n if (separatorMatch) {\n // Parse header\n const headerCells = line.split('|').filter(cell => cell.trim() !== '').map(cell => cell.trim());\n\n // Skip header and separator lines\n i += 2;\n\n // Parse body rows\n const bodyRows: string[][] = [];\n while (i < lines.length) {\n const rowMatch = lines[i].match(/^\\|(.+)\\|$/);\n if (rowMatch) {\n const cells = lines[i].split('|').filter(cell => cell.trim() !== '').map(cell => cell.trim());\n bodyRows.push(cells);\n i++;\n } else {\n break;\n }\n }\n\n result.push(\n <div key={`table-wrapper${key++}`} className=\"apteva-md-table-wrapper\">\n <table className=\"apteva-md-table\">\n <thead>\n <tr>\n {headerCells.map((cell, idx) => (\n <th key={`th${idx}`} className=\"apteva-md-th\">{parseInlineMarkdown(cell, `th${key}${idx}`)}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {bodyRows.map((row, rowIdx) => (\n <tr key={`tr${rowIdx}`}>\n {row.map((cell, cellIdx) => (\n <td key={`td${cellIdx}`} className=\"apteva-md-td\">{parseInlineMarkdown(cell, `td${key}${rowIdx}${cellIdx}`)}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n continue;\n }\n }\n\n // Regular line - parse inline markdown and preserve line breaks\n if (line === '') {\n result.push(<br key={`br${key++}`} />);\n } else {\n result.push(\n <span key={`p${key++}`}>\n {parseInlineMarkdown(line, `${key}`)}\n {i < lines.length - 1 ? '\\n' : ''}\n </span>\n );\n }\n i++;\n }\n\n return result;\n}\n\nexport function MarkdownContent({ content, className = '' }: MarkdownContentProps) {\n // Strip stray <ui> tags the AI sometimes outputs\n const cleaned = content.replace(/<\\/?ui\\s*\\/?>/gi, '');\n return (\n <div className={`apteva-md ${className}`}>\n {parseMarkdown(cleaned)}\n </div>\n );\n}\n","interface ToolCallProps {\n name: string;\n status: 'preparing' | 'running' | 'completed' | 'error';\n isReceiving?: boolean; // True when actively receiving chunks\n inputLength?: number; // Character count of tool input\n streamOutput?: string; // Accumulated output from tool_stream chunks\n variant?: 'card' | 'inline';\n}\n\nexport function ToolCall({ name, status, isReceiving = false, inputLength = 0, streamOutput, variant = 'card' }: ToolCallProps) {\n // ==================== INLINE VARIANT ====================\n if (variant === 'inline') {\n const statusText = status === 'preparing'\n ? `${name} preparing...`\n : status === 'running'\n ? streamOutput ? `${name} · ${streamOutput}` : `${name}...`\n : status === 'error'\n ? `${name} failed`\n : name;\n\n return (\n <div className=\"apteva-tool-inline\">\n <div className=\"apteva-tool-inline-line\" />\n <div className=\"apteva-tool-inline-content\">\n {status === 'running' || status === 'preparing' ? (\n <svg className=\"apteva-tool-inline-icon apteva-tool-icon-spin\" width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"></path>\n </svg>\n ) : (\n <svg className=\"apteva-tool-inline-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" fill=\"currentColor\" />\n </svg>\n )}\n <span className=\"apteva-tool-inline-text\">{statusText}</span>\n </div>\n <div className=\"apteva-tool-inline-line\" />\n </div>\n );\n }\n\n // ==================== CARD VARIANT (default) ====================\n if (status === 'preparing') {\n return (\n <div className=\"apteva-tool-card apteva-tool-card-preparing\">\n <svg className=\"apteva-tool-icon apteva-tool-icon-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"></path>\n </svg>\n <span className=\"apteva-tool-label\">\n <strong>{name}</strong>\n <span className=\"apteva-tool-status-text\"> preparing...</span>\n </span>\n </div>\n );\n }\n\n if (status === 'running') {\n return (\n <div className=\"apteva-tool-card apteva-tool-card-running\">\n <svg className=\"apteva-tool-icon apteva-tool-icon-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"></path>\n </svg>\n <span className=\"apteva-tool-label\">\n <strong>{name}</strong>\n {streamOutput ? (\n <span className=\"apteva-tool-stream-separator\"> · </span>\n ) : null}\n {streamOutput ? (\n <span className=\"apteva-tool-stream-output\">{streamOutput}</span>\n ) : (\n <>\n <span className=\"apteva-tool-status-text\"> running</span>\n <span className=\"apteva-tool-dots\">\n <span>.</span><span>.</span><span>.</span>\n </span>\n </>\n )}\n </span>\n </div>\n );\n }\n\n if (status === 'completed') {\n return (\n <div className=\"apteva-tool-card apteva-tool-card-completed\">\n <svg className=\"apteva-tool-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\"></path>\n </svg>\n <span className=\"apteva-tool-label\">{name}</span>\n </div>\n );\n }\n\n // Error state\n return (\n <div className=\"apteva-tool-card apteva-tool-card-error\">\n <svg className=\"apteva-tool-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n <span className=\"apteva-tool-label\">{name} failed</span>\n </div>\n );\n}\n","import { useState } from 'react';\n\ninterface ToolSegment {\n id: string;\n name: string;\n status: 'preparing' | 'running' | 'completed' | 'error';\n isReceiving?: boolean;\n streamOutput?: string;\n}\n\ninterface ToolCallGroupProps {\n tools: ToolSegment[];\n}\n\nexport function ToolCallGroup({ tools }: ToolCallGroupProps) {\n const completed = tools.filter(t => t.status === 'completed').length;\n const errored = tools.filter(t => t.status === 'error').length;\n const running = tools.filter(t => t.status === 'running').length;\n const preparing = tools.filter(t => t.status === 'preparing').length;\n const total = tools.length;\n const allDone = completed + errored === total;\n\n const [expanded, setExpanded] = useState(false);\n\n // Show expanded by default while tools are still running\n const isExpanded = allDone ? expanded : true;\n\n // Find the currently active tool (for stream output display)\n const activeStreamTool = tools.find(t => t.status === 'running' && t.streamOutput);\n\n const statusText = allDone\n ? `Used ${total} tools`\n : `Using ${total} tools${completed > 0 ? ` · ${completed}/${total} done` : ''}`;\n\n // Overall card style based on group status\n const cardClass = allDone\n ? errored > 0\n ? 'apteva-tool-group apteva-tool-group-error'\n : 'apteva-tool-group apteva-tool-group-completed'\n : 'apteva-tool-group apteva-tool-group-running';\n\n return (\n <div className={cardClass}>\n {/* Header */}\n <button\n className=\"apteva-tool-group-header\"\n onClick={() => setExpanded(!expanded)}\n >\n <div className=\"apteva-tool-group-header-left\">\n {allDone ? (\n <svg className=\"apteva-tool-group-icon\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"apteva-tool-group-icon apteva-tool-icon-spin\" width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n )}\n <span className=\"apteva-tool-group-status\">{statusText}</span>\n </div>\n <svg\n className={`apteva-tool-group-chevron ${isExpanded ? 'apteva-tool-group-chevron-open' : ''}`}\n width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {/* Active stream output (shown even when collapsed) */}\n {!isExpanded && activeStreamTool && (\n <div className=\"apteva-tool-group-stream\">\n <span className=\"apteva-tool-group-stream-name\">{activeStreamTool.name}:</span>\n <span className=\"apteva-tool-group-stream-text\">{activeStreamTool.streamOutput}</span>\n </div>\n )}\n\n {/* Expanded tool list */}\n {isExpanded && (\n <div className=\"apteva-tool-group-list\">\n {tools.map(tool => (\n <div key={tool.id} className=\"apteva-tool-group-item\">\n {tool.status === 'completed' ? (\n <svg className=\"apteva-tool-group-item-icon apteva-tool-group-item-done\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : tool.status === 'error' ? (\n <svg className=\"apteva-tool-group-item-icon apteva-tool-group-item-error\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ) : (\n <div className=\"apteva-tool-group-item-icon apteva-tool-group-item-spinner\" />\n )}\n <span className=\"apteva-tool-group-item-name\">{tool.name}</span>\n {tool.streamOutput && tool.status === 'running' && (\n <span className=\"apteva-tool-group-item-stream\">{tool.streamOutput}</span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { Widget } from '../../types/widgets';\n\ninterface PersistentWidgetRefProps {\n widget: Widget;\n}\n\n/** Compact inline reference card shown in messages for widgets that live in the persistent panel */\nexport function PersistentWidgetRef({ widget }: PersistentWidgetRefProps) {\n const title = widget.props.title || widget.type.replace(/_/g, ' ');\n\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 text-sm\">\n <div className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse flex-shrink-0\" />\n <span className=\"text-neutral-600 dark:text-neutral-400 capitalize\">{title}</span>\n <span className=\"text-neutral-400 dark:text-neutral-500 text-xs ml-auto\">pinned above</span>\n </div>\n );\n}\n","import { SuggestedPrompt } from '../../types/components';\nimport { cn } from '../../utils';\n\ninterface WelcomeScreenProps {\n title?: string;\n subtitle?: string;\n icon?: React.ReactNode;\n prompts?: (string | SuggestedPrompt)[];\n variant?: 'centered' | 'minimal';\n chatVariant?: 'default' | 'minimal' | 'terminal';\n onPromptClick: (prompt: string) => void;\n}\n\n// Default icon - chat bubble\nconst DefaultIcon = () => (\n <svg className=\"w-12 h-12 sm:w-16 sm:h-16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n);\n\n\n// Default prompt icons\nconst ArrowIcon = () => (\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=\"M13 7l5 5m0 0l-5 5m5-5H6\" />\n </svg>\n);\n\nexport function WelcomeScreen({\n title,\n subtitle,\n icon,\n prompts,\n variant = 'centered',\n chatVariant = 'default',\n onPromptClick,\n}: WelcomeScreenProps) {\n // Normalize prompts to SuggestedPrompt format\n const normalizedPrompts: SuggestedPrompt[] = (prompts || []).map((p) =>\n typeof p === 'string' ? { text: p } : p\n );\n\n const hasPrompts = normalizedPrompts.length > 0;\n const hasHeader = title || subtitle || icon;\n\n // If nothing to show, render default empty state\n if (!hasHeader && !hasPrompts) {\n return (\n <div className=\"flex items-center justify-center h-full !text-neutral-500 dark:!text-neutral-400\">\n <div className=\"text-center space-y-2\">\n <div className=\"flex justify-center\">\n <DefaultIcon />\n </div>\n <p className=\"text-sm\">No messages yet. Start a conversation!</p>\n </div>\n </div>\n );\n }\n\n // Minimal variant - just prompts as a list (good for mobile/embedded)\n if (variant === 'minimal') {\n return (\n <div className=\"flex flex-col h-full px-4 py-4\">\n {hasHeader && (\n <div className=\"mb-4\">\n {title && (\n <h2 className=\"text-lg font-semibold !text-neutral-900 dark:!text-white\">{title}</h2>\n )}\n {subtitle && (\n <p className=\"text-sm !text-neutral-500 dark:!text-neutral-400 mt-1\">{subtitle}</p>\n )}\n </div>\n )}\n {hasPrompts && (\n <div className=\"flex-1 space-y-2\">\n {normalizedPrompts.map((prompt, index) => (\n <button\n key={index}\n onClick={() => onPromptClick(prompt.text)}\n className={cn(\n 'w-full text-left px-4 py-3 rounded-xl',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border border-neutral-200 dark:border-neutral-700',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'hover:border-neutral-300 dark:hover:border-neutral-600',\n 'transition-all duration-200',\n 'group'\n )}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-shrink-0 !text-neutral-400 dark:!text-neutral-500 group-hover:!text-blue-500 dark:group-hover:!text-blue-400 transition-colors\">\n {prompt.icon || <ArrowIcon />}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium !text-neutral-900 dark:!text-white truncate\">\n {prompt.text}\n </p>\n {prompt.description && (\n <p className=\"text-xs !text-neutral-500 dark:!text-neutral-400 mt-0.5 truncate\">\n {prompt.description}\n </p>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n // Centered variant - hero style with grid of prompts (default)\n return (\n <div className=\"flex flex-col items-center justify-center h-full px-4 py-6 sm:py-8\">\n {/* Header Section */}\n <div className=\"text-center mb-6 sm:mb-8 max-w-md\">\n {/* Icon */}\n <div className=\"mb-4 !text-neutral-400 dark:!text-neutral-500 flex justify-center\">\n {icon || <DefaultIcon />}\n </div>\n\n {/* Title */}\n {title && (\n <h1 className=\"text-xl sm:text-2xl font-semibold !text-neutral-900 dark:!text-white mb-2\">\n {title}\n </h1>\n )}\n\n {/* Subtitle */}\n {subtitle && (\n <p className=\"text-sm sm:text-base !text-neutral-500 dark:!text-neutral-400\">{subtitle}</p>\n )}\n </div>\n\n {/* Prompts Section */}\n {hasPrompts && (\n <div className=\"w-full max-w-2xl\">\n {/* Mobile: Vertical list */}\n <div className=\"sm:hidden space-y-2\">\n {normalizedPrompts.map((prompt, index) => (\n <button\n key={index}\n onClick={() => onPromptClick(prompt.text)}\n className={cn(\n 'w-full text-left px-4 py-3 rounded-xl',\n 'bg-white dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'hover:border-blue-300 dark:hover:border-blue-600',\n 'active:scale-[0.98]',\n 'transition-all duration-200',\n 'shadow-sm hover:shadow',\n 'group'\n )}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-lg bg-neutral-100 dark:bg-neutral-700 flex items-center justify-center !text-neutral-500 dark:!text-neutral-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/30 group-hover:!text-blue-600 dark:group-hover:!text-blue-400 transition-colors\">\n {prompt.icon || <ArrowIcon />}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium !text-neutral-900 dark:!text-white\">\n {prompt.text}\n </p>\n {prompt.description && (\n <p className=\"text-xs !text-neutral-500 dark:!text-neutral-400 mt-0.5 line-clamp-1\">\n {prompt.description}\n </p>\n )}\n </div>\n <svg\n className=\"w-4 h-4 !text-neutral-400 group-hover:!text-blue-500 transition-colors flex-shrink-0\"\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 5l7 7-7 7\"\n />\n </svg>\n </div>\n </button>\n ))}\n </div>\n\n {/* Desktop: Grid layout */}\n <div className=\"hidden sm:grid sm:grid-cols-2 gap-3\">\n {normalizedPrompts.map((prompt, index) => (\n <button\n key={index}\n onClick={() => onPromptClick(prompt.text)}\n className={cn(\n 'text-left p-4 rounded-xl',\n 'bg-white dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'hover:border-blue-300 dark:hover:border-blue-600',\n 'hover:shadow-md',\n 'active:scale-[0.98]',\n 'transition-all duration-200',\n 'group'\n )}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-shrink-0 w-9 h-9 rounded-lg bg-neutral-100 dark:bg-neutral-700 flex items-center justify-center !text-neutral-500 dark:!text-neutral-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/30 group-hover:!text-blue-600 dark:group-hover:!text-blue-400 transition-colors\">\n {prompt.icon || <ArrowIcon />}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium !text-neutral-900 dark:!text-white leading-snug\">\n {prompt.text}\n </p>\n {prompt.description && (\n <p className=\"text-xs !text-neutral-500 dark:!text-neutral-400 mt-1 line-clamp-2\">\n {prompt.description}\n </p>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useState, KeyboardEvent, useRef } from 'react';\nimport { validateFile, formatFileSize } from '../../utils';\n\ninterface ComposerProps {\n onSendMessage: (text: string, files?: File[]) => void;\n placeholder?: string;\n disabled?: boolean;\n isLoading?: boolean;\n onStop?: () => void;\n onFileUpload?: (files: FileList) => void;\n onSwitchMode?: () => void;\n}\n\ninterface PendingFile {\n file: File;\n preview?: string;\n}\n\nexport function Composer({ onSendMessage, placeholder = 'Type a message...', disabled = false, isLoading = false, onStop, onFileUpload, onSwitchMode }: ComposerProps) {\n const [text, setText] = useState('');\n const [showMenu, setShowMenu] = useState(false);\n const [pendingFiles, setPendingFiles] = useState<PendingFile[]>([]);\n const [fileError, setFileError] = useState<string | null>(null);\n const [isMultiLine, setIsMultiLine] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleSend = () => {\n const hasText = text.trim();\n const hasFiles = pendingFiles.length > 0;\n\n if ((hasText || hasFiles) && !disabled) {\n const filesToSend = pendingFiles.map(pf => pf.file);\n onSendMessage(text.trim(), filesToSend.length > 0 ? filesToSend : undefined);\n setText('');\n setPendingFiles([]);\n setFileError(null);\n setIsMultiLine(false);\n // Reset textarea height\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n\n // Reset height to measure true content height\n e.target.style.height = 'auto';\n const scrollHeight = e.target.scrollHeight;\n e.target.style.height = `${scrollHeight}px`;\n\n const hasNewline = e.target.value.includes('\\n');\n\n // Single line height ≈ line-height + vertical padding (~36px)\n const singleLineHeight = 36;\n const isOverflowing = scrollHeight > singleLineHeight;\n\n // Switch TO multi-line when:\n // 1. User explicitly added newline (Shift+Enter), OR\n // 2. Content actually overflows to second line\n if (!isMultiLine && (hasNewline || isOverflowing)) {\n setIsMultiLine(true);\n }\n // Switch BACK to single-line when:\n // 1. No newlines, AND\n // 2. Content fits in single line, AND\n // 3. Text is short (hysteresis to prevent flicker)\n else if (isMultiLine && !hasNewline && !isOverflowing && e.target.value.length < 20) {\n setIsMultiLine(false);\n }\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n const files = Array.from(e.target.files);\n const validFiles: PendingFile[] = [];\n const errors: string[] = [];\n\n files.forEach(file => {\n const validation = validateFile(file);\n if (validation.valid) {\n const pending: PendingFile = { file };\n // Create preview for images\n if (file.type.startsWith('image/')) {\n pending.preview = URL.createObjectURL(file);\n }\n validFiles.push(pending);\n } else {\n errors.push(validation.error || 'Invalid file');\n }\n });\n\n if (validFiles.length > 0) {\n setPendingFiles(prev => [...prev, ...validFiles]);\n }\n\n if (errors.length > 0) {\n setFileError(errors.join(', '));\n setTimeout(() => setFileError(null), 5000);\n }\n\n // Also call the legacy callback if provided\n onFileUpload?.(e.target.files);\n setShowMenu(false);\n\n // Reset input so same file can be selected again\n e.target.value = '';\n }\n };\n\n const removeFile = (index: number) => {\n setPendingFiles(prev => {\n const file = prev[index];\n // Revoke object URL to prevent memory leak\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n return prev.filter((_, i) => i !== index);\n });\n };\n\n const getFileIcon = (mimeType: string) => {\n if (mimeType.startsWith('image/')) {\n return (\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=\"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 }\n if (mimeType === 'application/pdf') {\n return (\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=\"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 return (\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=\"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\n return (\n <div className=\"px-4 py-3 relative\">\n {/* File Error Toast */}\n {fileError && (\n <div className=\"apteva-file-error\">\n <div className=\"apteva-file-error-content\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{fileError}</span>\n </div>\n </div>\n )}\n\n {/* Pending Files Preview */}\n {pendingFiles.length > 0 && (\n <div className=\"apteva-file-preview\">\n {pendingFiles.map((pf, index) => (\n <div key={index} className=\"apteva-file-item\">\n {pf.preview ? (\n <img src={pf.preview} alt={pf.file.name} className=\"apteva-file-thumb\" />\n ) : (\n <div className=\"apteva-file-icon\">\n {getFileIcon(pf.file.type)}\n </div>\n )}\n <div className=\"apteva-file-info\">\n <span className=\"apteva-file-name\">{pf.file.name}</span>\n <span className=\"apteva-file-size\">{formatFileSize(pf.file.size)}</span>\n </div>\n <button\n onClick={() => removeFile(index)}\n className=\"apteva-file-remove\"\n title=\"Remove file\"\n >\n <svg 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 </div>\n ))}\n </div>\n )}\n\n <div\n className=\"apteva-composer\"\n style={{\n gridTemplateColumns: 'auto 1fr auto',\n gridTemplateAreas: isMultiLine\n ? '\"textarea textarea textarea\" \"plus . send\"'\n : '\"plus textarea send\"',\n alignItems: 'end'\n }}\n >\n {/* Menu button */}\n <div className=\"relative flex-shrink-0 self-end\" style={{ gridArea: 'plus' }}>\n <button\n ref={menuButtonRef}\n onClick={() => setShowMenu(!showMenu)}\n className=\"apteva-composer-menu-btn w-8 h-8 rounded-lg flex items-center justify-center transition-all !text-neutral-700 dark:!text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"More options\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 5v10M5 10h10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n\n {/* Menu Popup - fixed positioning to escape overflow:hidden */}\n {showMenu && (\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setShowMenu(false)} />\n <div\n className=\"apteva-composer-menu fixed bg-neutral-800 dark:bg-neutral-800 rounded-xl shadow-lg overflow-hidden z-[9999] min-w-[200px]\"\n style={{\n left: menuButtonRef.current?.getBoundingClientRect().left ?? 0,\n bottom: window.innerHeight - (menuButtonRef.current?.getBoundingClientRect().top ?? 0) + 8,\n }}\n >\n <button\n onClick={() => {\n fileInputRef.current?.click();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.5 3.5L5.5 8.5C4.67157 9.32843 4.67157 10.6716 5.5 11.5C6.32843 12.3284 7.67157 12.3284 8.5 11.5L14.5 5.5C15.8807 4.11929 15.8807 1.88071 14.5 0.5C13.1193 -0.880711 10.8807 -0.880711 9.5 0.5L3.5 6.5C1.56846 8.43154 1.56846 11.5685 3.5 13.5C5.43154 15.4315 8.56846 15.4315 10.5 13.5L15.5 8.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(2, 3)\"/>\n </svg>\n <span className=\"!text-sm font-medium\">Add photos & files</span>\n </button>\n {onSwitchMode && (\n <button\n onClick={() => {\n onSwitchMode();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left border-t border-neutral-700 dark:border-neutral-700\"\n >\n <svg className=\"w-4.5 h-4.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n <span className=\"!text-sm font-medium\">Switch to command mode</span>\n </button>\n )}\n </div>\n </>\n )}\n </div>\n\n {/* Textarea */}\n <textarea\n ref={textareaRef}\n value={text}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className=\"apteva-composer-textarea resize-none bg-transparent border-none focus:outline-none !text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 py-1 disabled:opacity-50 disabled:cursor-not-allowed overflow-y-auto max-h-[200px]\"\n style={{ gridArea: 'textarea' }}\n rows={1}\n />\n\n {/* Send/Stop button */}\n <div className=\"self-end\" style={{ gridArea: 'send' }}>\n {isLoading && onStop ? (\n <button\n onClick={onStop}\n className=\"apteva-composer-stop-btn\"\n title=\"Stop generation\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"10\" height=\"10\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n </button>\n ) : (\n <button\n onClick={handleSend}\n disabled={(!text.trim() && pendingFiles.length === 0) || disabled}\n className=\"apteva-composer-send-btn w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0 border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 !text-neutral-700 dark:!text-neutral-300 hover:bg-neutral-50 dark:hover:bg-neutral-700 disabled:opacity-30 disabled:cursor-not-allowed !text-lg\"\n title=\"Send message\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n )}\n </div>\n </div>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileSelect}\n className=\"hidden\"\n accept=\"image/*,application/pdf,.doc,.docx,.txt\"\n />\n </div>\n );\n}\n","import { useState, useRef, KeyboardEvent } from 'react';\nimport { cn, validateFile, formatFileSize } from '../../utils';\n\ntype CommandState = 'idle' | 'loading' | 'success' | 'error' | 'plan-pending';\n\ninterface PendingFile {\n file: File;\n preview?: string;\n}\n\ninterface CommandComposerProps {\n onExecute: (command: string, files?: File[]) => void;\n state: CommandState;\n response?: string;\n error?: string;\n plan?: string;\n streamedContent?: string;\n toolName?: string | null;\n onApprove?: () => void;\n onReject?: () => void;\n onReset?: () => void;\n onStop?: () => void;\n onExpand?: () => void;\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport function CommandComposer({\n onExecute,\n state,\n response,\n error,\n plan,\n streamedContent,\n toolName,\n onApprove,\n onReject,\n onReset,\n onStop,\n onExpand,\n placeholder = 'Enter your command...',\n disabled = false,\n}: CommandComposerProps) {\n const [input, setInput] = useState('');\n const [pendingFiles, setPendingFiles] = useState<PendingFile[]>([]);\n const [fileError, setFileError] = useState<string | null>(null);\n const [showMenu, setShowMenu] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n const handleSubmit = () => {\n const hasText = input.trim();\n const hasFiles = pendingFiles.length > 0;\n\n if ((hasText || hasFiles) && !disabled && state === 'idle') {\n const filesToSend = pendingFiles.map(pf => pf.file);\n onExecute(input.trim(), filesToSend.length > 0 ? filesToSend : undefined);\n setInput('');\n setPendingFiles([]);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const handleNewCommand = () => {\n onReset?.();\n inputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setInput(value);\n if (inputRef.current) {\n inputRef.current.style.height = 'auto';\n inputRef.current.style.height = `${Math.min(inputRef.current.scrollHeight, 120)}px`;\n }\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n const files = Array.from(e.target.files);\n const validFiles: PendingFile[] = [];\n const errors: string[] = [];\n\n files.forEach(file => {\n const validation = validateFile(file);\n if (validation.valid) {\n const pending: PendingFile = { file };\n if (file.type.startsWith('image/')) {\n pending.preview = URL.createObjectURL(file);\n }\n validFiles.push(pending);\n } else {\n errors.push(validation.error || 'Invalid file');\n }\n });\n\n if (validFiles.length > 0) {\n setPendingFiles(prev => [...prev, ...validFiles]);\n }\n\n if (errors.length > 0) {\n setFileError(errors.join(', '));\n setTimeout(() => setFileError(null), 5000);\n }\n\n setShowMenu(false);\n e.target.value = '';\n }\n };\n\n const removeFile = (index: number) => {\n setPendingFiles(prev => {\n const file = prev[index];\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n return prev.filter((_, i) => i !== index);\n });\n };\n\n const getFileIcon = (mimeType: string) => {\n if (mimeType.startsWith('image/')) {\n return (\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=\"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 }\n if (mimeType === 'application/pdf') {\n return (\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=\"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 return (\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=\"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\n // Get display content based on state - show ONE thing at a time, replacing previous\n const getDisplayContent = (): { text: string; isToolCall: boolean } => {\n if (state === 'loading') {\n // Priority: tool call > streamed content > processing message\n if (toolName) {\n return { text: toolName, isToolCall: true };\n }\n // Only show streamed content if we have it (and no active tool)\n if (streamedContent) {\n return { text: streamedContent, isToolCall: false };\n }\n return { text: 'Processing...', isToolCall: false };\n }\n if (state === 'success' && response) {\n return { text: response, isToolCall: false };\n }\n if (state === 'error' && error) {\n return { text: error, isToolCall: false };\n }\n if (state === 'plan-pending' && plan) {\n return { text: plan, isToolCall: false };\n }\n return { text: '', isToolCall: false };\n };\n\n const isShowingResult = state !== 'idle';\n const { text: displayContent, isToolCall } = getDisplayContent();\n\n return (\n <div className=\"w-full relative\">\n {/* File Error Toast */}\n {fileError && (\n <div className=\"apteva-file-error\" style={{ top: '-3rem', bottom: 'auto' }}>\n <div className=\"apteva-file-error-content\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{fileError}</span>\n </div>\n </div>\n )}\n\n {/* Single input/output box */}\n <div\n className={cn(\n 'apteva-composer flex items-center gap-2 px-3 py-2 border-2 bg-white dark:bg-neutral-900 transition-all duration-200',\n state === 'idle' && 'border-neutral-200 dark:border-neutral-700',\n state === 'loading' && 'border-blue-400 dark:border-blue-500',\n state === 'plan-pending' && 'border-amber-400 dark:border-amber-500',\n state === 'success' && 'border-green-400 dark:border-green-500',\n state === 'error' && 'border-red-400 dark:border-red-500'\n )}\n >\n {/* Left side indicator area - fixed width to prevent layout shift */}\n <div className=\"w-8 h-8 flex items-center justify-center flex-shrink-0\">\n {/* Add file button - only in idle state */}\n {state === 'idle' && (\n <div className=\"relative\">\n <button\n ref={menuButtonRef}\n onClick={() => setShowMenu(!showMenu)}\n className=\"apteva-composer-menu-btn w-8 h-8 rounded-lg flex items-center justify-center transition-all !text-neutral-500 dark:!text-neutral-400 hover:!text-neutral-700 dark:hover:!text-neutral-200 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"More options\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 5v10M5 10h10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n\n {/* Menu Popup - fixed positioning to escape overflow:hidden */}\n {showMenu && (\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setShowMenu(false)} />\n <div\n className=\"apteva-composer-menu fixed bg-neutral-800 dark:bg-neutral-800 rounded-xl shadow-lg overflow-hidden z-[9999] min-w-[200px]\"\n style={{\n left: menuButtonRef.current?.getBoundingClientRect().left ?? 0,\n top: (menuButtonRef.current?.getBoundingClientRect().bottom ?? 0) + 8,\n }}\n >\n <button\n onClick={() => {\n fileInputRef.current?.click();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.5 3.5L5.5 8.5C4.67157 9.32843 4.67157 10.6716 5.5 11.5C6.32843 12.3284 7.67157 12.3284 8.5 11.5L14.5 5.5C15.8807 4.11929 15.8807 1.88071 14.5 0.5C13.1193 -0.880711 10.8807 -0.880711 9.5 0.5L3.5 6.5C1.56846 8.43154 1.56846 11.5685 3.5 13.5C5.43154 15.4315 8.56846 15.4315 10.5 13.5L15.5 8.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(2, 3)\"/>\n </svg>\n <span className=\"!text-sm font-medium\">Add photos & files</span>\n </button>\n {onExpand && (\n <button\n onClick={() => {\n onExpand();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left border-t border-neutral-700 dark:border-neutral-700\"\n >\n <svg className=\"w-4.5 h-4.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n <span className=\"!text-sm font-medium\">Expand to chat</span>\n </button>\n )}\n </div>\n </>\n )}\n </div>\n )}\n\n {/* Loading spinner - show when loading without tool */}\n {state === 'loading' && !toolName && (\n <div className=\"w-4 h-4 border-2 border-blue-200 border-t-blue-500 rounded-full animate-spin\" />\n )}\n\n {/* Tool indicator - blinking dot like in chat mode */}\n {state === 'loading' && toolName && (\n <div className=\"w-2 h-2 rounded-full bg-blue-500 animate-pulse\" />\n )}\n </div>\n\n {/* Inline file badges - compact display */}\n {pendingFiles.length > 0 && state === 'idle' && (\n <div className=\"apteva-file-badges\">\n {pendingFiles.map((pf, index) => (\n <div key={index} className=\"apteva-file-badge\" title={pf.file.name}>\n {pf.preview ? (\n <img src={pf.preview} alt={pf.file.name} className=\"apteva-file-badge-img\" />\n ) : (\n <span className=\"apteva-file-badge-icon\">\n {getFileIcon(pf.file.type)}\n </span>\n )}\n <button\n onClick={() => removeFile(index)}\n className=\"apteva-file-badge-remove\"\n title=\"Remove\"\n >\n <svg 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 </div>\n ))}\n </div>\n )}\n\n {/* Content area - input OR result */}\n {state === 'idle' ? (\n <textarea\n ref={inputRef}\n value={input}\n onChange={(e) => handleInputChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={pendingFiles.length > 0 ? 'Add a message...' : placeholder}\n disabled={disabled}\n rows={1}\n className={cn(\n 'flex-1 resize-none bg-transparent border-none focus:outline-none',\n '!text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500',\n 'text-sm leading-relaxed py-1',\n 'disabled:opacity-50'\n )}\n style={{ minHeight: '24px', maxHeight: '120px' }}\n />\n ) : (\n <div\n className={cn(\n 'flex-1 text-sm py-1 truncate flex items-center gap-2',\n state === 'loading' && !isToolCall && '!text-neutral-600 dark:!text-neutral-400',\n state === 'loading' && isToolCall && '!text-blue-600 dark:!text-blue-400',\n state === 'success' && '!text-neutral-900 dark:!text-neutral-100',\n state === 'error' && '!text-red-600 dark:!text-red-400',\n state === 'plan-pending' && '!text-amber-700 dark:!text-amber-300'\n )}\n >\n {isToolCall ? (\n <>\n <span className=\"font-mono\">{displayContent}</span>\n <span className=\"text-neutral-400 dark:text-neutral-500\">Running...</span>\n </>\n ) : (\n displayContent\n )}\n </div>\n )}\n\n {/* Action buttons - fixed width container to prevent layout shift */}\n <div className=\"w-8 h-8 flex items-center justify-center flex-shrink-0\">\n {/* Plan mode buttons - these expand, so handle separately */}\n {state === 'plan-pending' ? (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={onApprove}\n className=\"px-2 py-1 bg-amber-500 text-white rounded-lg hover:bg-amber-600 transition-colors text-xs font-medium\"\n >\n Approve\n </button>\n <button\n onClick={onReject}\n className=\"px-2 py-1 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-xs font-medium\"\n >\n Modify\n </button>\n </div>\n ) : (\n <>\n {/* Stop button - during loading */}\n {state === 'loading' && onStop && (\n <button\n onClick={onStop}\n className=\"apteva-composer-stop-btn\"\n title=\"Stop generation\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"10\" height=\"10\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n </button>\n )}\n\n {/* Clear/New command button - after result */}\n {(state === 'success' || state === 'error') && (\n <button\n onClick={handleNewCommand}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center !text-neutral-400 hover:!text-neutral-600 dark:hover:!text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors\"\n title=\"New command\"\n >\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=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n\n {/* Send button - only in idle state */}\n {state === 'idle' && (\n <button\n onClick={handleSubmit}\n disabled={(!input.trim() && pendingFiles.length === 0) || disabled}\n className={cn(\n 'apteva-composer-send-btn w-8 h-8 rounded-lg flex items-center justify-center transition-all',\n 'border border-neutral-200 dark:border-neutral-700',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n (input.trim() || pendingFiles.length > 0)\n ? 'bg-neutral-900 dark:bg-white !text-white dark:!text-neutral-900 border-neutral-900 dark:border-white'\n : 'bg-white dark:bg-neutral-800 !text-neutral-400'\n )}\n title=\"Execute command\"\n >\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=\"M5 12h14M12 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileSelect}\n className=\"hidden\"\n accept=\"image/*,application/pdf,.doc,.docx,.txt\"\n />\n </div>\n );\n}\n","export interface AptevaClientConfig {\n apiUrl?: string;\n apiKey?: string;\n}\n\ninterface ResolvedConfig {\n apiUrl: string;\n apiKey: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string | Array<{\n type: 'text' | 'tool_use' | 'tool_result';\n text?: string;\n id?: string;\n name?: string;\n input?: any;\n tool_use_id?: string;\n content?: string | Array<{ type: string; text?: string }>;\n is_error?: boolean;\n }>;\n id?: string;\n created_at?: string;\n}\n\nexport interface ChatRequest {\n agent_id: string;\n message: string | Array<{\n type: 'text' | 'image' | 'document';\n text?: string;\n source?: {\n type: 'base64';\n media_type: string;\n data: string;\n };\n }>;\n thread_id?: string;\n stream?: boolean;\n system?: string;\n}\n\nexport interface ChatResponse {\n message: string;\n thread_id: string;\n widgets?: any[];\n}\n\nexport interface StreamChunk {\n type: 'start' | 'thread_id' | 'request_id' | 'content' | 'token' | 'tool_call' | 'tool_input_delta' | 'tool_use' | 'tool_result' | 'tool_stream' | 'stop' | 'widget' | 'complete' | 'done' | 'error';\n content?: string;\n widget?: any;\n thread_id?: string;\n request_id?: string;\n tool_id?: string;\n tool_name?: string;\n tool_display_name?: string;\n error?: string;\n message?: string;\n event?: 'chunk' | 'log' | 'progress'; // For tool_stream events\n progress?: number; // For tool_stream progress events\n}\n\nclass AptevaClient {\n private config: ResolvedConfig;\n\n constructor(config?: AptevaClientConfig) {\n this.config = {\n apiUrl: config?.apiUrl ?? '',\n apiKey: config?.apiKey ?? '',\n };\n }\n\n /**\n * Update client configuration (optional - users can override defaults)\n */\n configure(config: AptevaClientConfig) {\n if (config.apiUrl !== undefined) this.config.apiUrl = config.apiUrl;\n if (config.apiKey !== undefined) this.config.apiKey = config.apiKey;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ResolvedConfig {\n return { ...this.config };\n }\n\n /**\n * Send a chat message to an agent\n */\n async chat(request: ChatRequest): Promise<ChatResponse> {\n try {\n console.log('[AptevaClient] Chat request:', {\n agent_id: request.agent_id,\n message: typeof request.message === 'string' ? request.message.substring(0, 100) + '...' : '[multi-part message]',\n system: request.system,\n stream: request.stream,\n });\n\n const response = await fetch(`${this.config.apiUrl}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n\n // Map API response format to expected format\n // API returns: { response, thread_id, success, model, trace_id }\n // We expect: { message, thread_id, widgets }\n return {\n message: data.response || data.message || '',\n thread_id: data.thread_id,\n widgets: data.widgets,\n };\n } catch (error) {\n console.error('Chat API error:', error);\n throw error;\n }\n }\n\n /**\n * Send a chat message with streaming response\n */\n async chatStream(\n request: ChatRequest,\n onChunk: (chunk: StreamChunk) => void,\n onComplete?: (threadId: string) => void,\n onError?: (error: Error) => void\n ): Promise<void> {\n try {\n console.log('[AptevaClient] Chat stream request:', {\n agent_id: request.agent_id,\n message: typeof request.message === 'string' ? request.message.substring(0, 100) + '...' : '[multi-part message]',\n system: request.system,\n stream: request.stream,\n });\n\n const response = await fetch(`${this.config.apiUrl}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n ...request,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let threadId = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) continue;\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n\n if (data === '[DONE]') {\n onComplete?.(threadId);\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n // Store thread_id if present in chunk\n if (chunk.thread_id) {\n threadId = chunk.thread_id;\n }\n\n // Pass through ALL chunk types to the handler\n onChunk(chunk);\n\n } catch (e) {\n console.warn('[AptevaClient] Failed to parse SSE data:', data);\n }\n }\n }\n }\n\n onComplete?.(threadId);\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error');\n onError?.(err);\n throw err;\n }\n }\n\n /**\n * Create a new thread\n */\n async createThread(agentId: string, metadata?: Record<string, any>): Promise<string> {\n const response = await fetch(`${this.config.apiUrl}/agents/${agentId}/threads`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ metadata }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n return data.thread_id;\n }\n\n /**\n * Get thread messages\n */\n async getThreadMessages(threadId: string): Promise<ChatMessage[]> {\n const response = await fetch(`${this.config.apiUrl}/threads/${threadId}/messages`, {\n method: 'GET',\n headers: {\n 'X-API-Key': this.config.apiKey,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n return data.messages;\n }\n\n /**\n * Cancel an in-progress request\n */\n async cancelRequest(agentId: string, requestId: string): Promise<void> {\n try {\n const response = await fetch(`${this.config.apiUrl}/agents/${agentId}/requests/${requestId}/cancel`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Cancel request failed' }));\n throw new Error(error.error || `Cancel request failed with status ${response.status}`);\n }\n } catch (error) {\n console.error('[AptevaClient] Cancel request error:', error);\n throw error;\n }\n }\n}\n\n// Export singleton instance\nexport const aptevaClient = new AptevaClient();\n\n// Export class for custom instances\nexport { AptevaClient };\n","import { useState } from 'react';\nimport { Widget } from '../../types/widgets';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { ActionEvent } from '../../types/actions';\nimport { cn } from '../../utils';\n\ninterface PersistentWidgetPanelProps {\n widgets: Widget[];\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function PersistentWidgetPanel({ widgets, onAction }: PersistentWidgetPanelProps) {\n const [collapsed, setCollapsed] = useState(false);\n\n if (widgets.length === 0) return null;\n\n return (\n <div className=\"apteva-persistent-panel border-b border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900\">\n {/* Panel header */}\n <div className=\"flex items-center justify-between px-3 py-1.5\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400 uppercase tracking-wider\">\n Live\n </span>\n </div>\n <button\n onClick={() => setCollapsed(c => !c)}\n className=\"p-1 rounded text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n >\n <svg\n className={cn('w-3.5 h-3.5 transition-transform', collapsed && 'rotate-180')}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* Panel content */}\n {!collapsed && (\n <div className=\"px-3 pb-3 flex flex-col gap-3\">\n {widgets.map((widget) => (\n <WidgetRenderer key={widget.id} widget={widget} onAction={onAction} />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { cn } from '../../utils';\nimport { Widget } from '../../types/widgets';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { MarkdownContent } from './MarkdownContent';\nimport { ActionEvent } from '../../types/actions';\n\ninterface CommandOutputProps {\n state: 'idle' | 'loading' | 'success' | 'error' | 'plan-pending';\n streamedContent?: string;\n loadingText?: string;\n progress?: number;\n showProgress?: boolean;\n plan?: string;\n error?: Error | null;\n result?: {\n success: boolean;\n data: any;\n widgets?: Widget[];\n message?: string;\n } | null;\n onApprove?: () => void;\n onReject?: () => void;\n onReset?: () => void;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function CommandOutput({\n state,\n streamedContent,\n loadingText = 'Processing...',\n progress = 0,\n showProgress = true,\n plan,\n error,\n result,\n onApprove,\n onReject,\n onReset,\n onAction,\n}: CommandOutputProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Don't render anything in idle state\n if (state === 'idle') {\n return null;\n }\n\n // Loading state - compact inline indicator\n if (state === 'loading') {\n return (\n <div className=\"mx-4 mb-3\">\n <div className=\"flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-xl\">\n <div className=\"w-4 h-4 border-2 border-blue-300 border-t-blue-600 rounded-full animate-spin flex-shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-blue-700 dark:text-blue-300 truncate\">\n {streamedContent || loadingText}\n </p>\n {showProgress && progress > 0 && (\n <div className=\"mt-2 w-full bg-blue-200 dark:bg-blue-800 rounded-full h-1\">\n <div\n className=\"bg-blue-600 h-1 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Plan pending state\n if (state === 'plan-pending' && plan) {\n return (\n <div className=\"mx-4 mb-3\">\n <div className=\"p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-xl\">\n <div className=\"flex items-start gap-3 mb-3\">\n <svg className=\"w-5 h-5 text-blue-600 dark:text-blue-400 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-blue-800 dark:text-blue-300 mb-2\">Proposed Plan</h3>\n <div className=\"text-blue-700 dark:text-blue-300 text-sm whitespace-pre-line leading-relaxed\">\n {plan}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n onClick={onApprove}\n className=\"flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm font-medium\"\n >\n Approve & Execute\n </button>\n <button\n onClick={onReject}\n className=\"flex-1 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-sm font-medium\"\n >\n Modify\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Error state\n if (state === 'error' && error) {\n return (\n <div className=\"mx-4 mb-3\">\n <div className=\"p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-xl\">\n <div className=\"flex items-start gap-3\">\n <svg className=\"w-5 h-5 text-red-600 dark:text-red-400 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-red-800 dark:text-red-400\">Error</h3>\n <p className=\"text-red-700 dark:text-red-300 text-sm mt-1\">{error.message}</p>\n </div>\n <button\n onClick={onReset}\n className=\"p-1.5 text-red-600 dark:text-red-400 hover:bg-red-100 dark:hover:bg-red-900/30 rounded-lg transition-colors\"\n title=\"Dismiss\"\n >\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=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Success state - collapsible\n if (state === 'success' && result) {\n const hasDetailedContent = result.data?.summary || (result.widgets && result.widgets.length > 0);\n\n return (\n <div className=\"mx-4 mb-3\">\n <div className={cn(\n \"border border-green-200 dark:border-green-800 rounded-xl overflow-hidden transition-all duration-200\",\n isExpanded ? \"bg-white dark:bg-neutral-900\" : \"bg-green-50 dark:bg-green-900/20\"\n )}>\n {/* Collapsed header - always visible */}\n <div\n className={cn(\n \"flex items-center gap-3 p-3 cursor-pointer\",\n isExpanded && \"border-b border-green-200 dark:border-green-800 bg-green-50 dark:bg-green-900/20\"\n )}\n onClick={() => hasDetailedContent && setIsExpanded(!isExpanded)}\n >\n <svg className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-green-700 dark:text-green-300 truncate\">\n {result.message || 'Command executed successfully'}\n </p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {hasDetailedContent && (\n <button\n className=\"p-1.5 text-green-600 dark:text-green-400 hover:bg-green-100 dark:hover:bg-green-900/30 rounded-lg transition-colors\"\n title={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n <svg\n className={cn(\"w-4 h-4 transition-transform duration-200\", isExpanded && \"rotate-180\")}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n )}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onReset?.();\n }}\n className=\"p-1.5 text-green-600 dark:text-green-400 hover:bg-green-100 dark:hover:bg-green-900/30 rounded-lg transition-colors\"\n title=\"New command\"\n >\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=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Expanded content */}\n {isExpanded && hasDetailedContent && (\n <div className=\"p-4 space-y-4\">\n {result.data?.summary && (\n <div className=\"text-neutral-700 dark:text-neutral-300 text-sm leading-relaxed\">\n <MarkdownContent content={result.data.summary} />\n </div>\n )}\n {result.widgets && result.widgets.length > 0 && (\n <div className=\"space-y-3\">\n {result.widgets.map((widget) => (\n <WidgetRenderer key={widget.id} widget={widget} onAction={onAction} />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n return null;\n}\n","import React, { useState, useEffect } from 'react';\nimport { CommandProps, CommandResult } from '../../types/components';\nimport { cn, generateMockCommandWithWidgets, generateMockCommandStream, generateMockPlan } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\n\nexport function Command({\n agentId,\n command: initialCommand,\n context,\n autoExecute = false,\n allowInput = true,\n placeholder = 'Enter your command...',\n submitButtonText = 'Execute',\n variant = 'default',\n useMock = false,\n planMode = false,\n onPlanModeChange,\n enableFileUpload = true,\n onStart,\n onProgress,\n onChunk,\n onComplete,\n onError,\n onFileUpload,\n onAction,\n loadingText = 'Processing...',\n showProgress = true,\n enableStreaming = false,\n resultRenderer,\n className,\n}: CommandProps) {\n const [state, setState] = useState<'idle' | 'loading' | 'success' | 'error' | 'plan-pending'>('idle');\n const [result, setResult] = useState<CommandResult | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [progress, setProgress] = useState(0);\n const [command, setCommand] = useState(initialCommand || '');\n const [streamedContent, setStreamedContent] = useState('');\n const [plan, setPlan] = useState<string>('');\n const [pendingCommand, setPendingCommand] = useState<string>('');\n const [showPlanDetails, setShowPlanDetails] = useState(false);\n const [uploadedFiles, setUploadedFiles] = useState<Array<{ type: 'image' | 'document'; data: string; mediaType: string; preview?: string; name: string }>>([]);\n const [showSettingsMenu, setShowSettingsMenu] = useState(false);\n const [internalPlanMode, setInternalPlanMode] = useState(planMode);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (autoExecute && state === 'idle' && command) {\n executeCommand();\n }\n }, [autoExecute]);\n\n // Sync internal plan mode with prop when prop changes\n useEffect(() => {\n setInternalPlanMode(planMode);\n }, [planMode]);\n\n // Close settings menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (showSettingsMenu && !target.closest('.settings-menu-container')) {\n setShowSettingsMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showSettingsMenu]);\n\n const executeCommand = async (commandOverride?: string) => {\n const currentCommand = commandOverride || command;\n\n if (!currentCommand.trim()) {\n setError(new Error('Please enter a command'));\n setState('error');\n return;\n }\n\n // Plan mode: show plan first\n if (internalPlanMode && state !== 'plan-pending') {\n setState('loading');\n setError(null);\n setCommand(''); // Clear input\n\n // Generate plan (mock or real)\n if (useMock) {\n setTimeout(() => {\n const mockPlan = generateMockPlan(currentCommand);\n setPlan(mockPlan);\n setPendingCommand(currentCommand);\n setState('plan-pending');\n }, 800);\n } else {\n // Real API plan generation\n try {\n // Build message - multi-part if files are uploaded\n let messageContent: any;\n\n if (uploadedFiles.length > 0) {\n messageContent = [\n {\n type: 'text',\n text: currentCommand,\n },\n ...uploadedFiles.map(file => ({\n type: file.type,\n source: {\n type: 'base64',\n media_type: file.mediaType,\n data: file.data,\n },\n })),\n ];\n } else {\n messageContent = currentCommand;\n }\n\n // System instruction for planning only\n let systemMessage = context || '';\n const planningInstruction = `CRITICAL PLANNING MODE - READ CAREFULLY:\n\nYou are ONLY creating a plan. You are NOT executing anything.\n\nYOUR TASK: Write a numbered list of steps describing what WOULD be done.\nDO NOT: Execute any actions, make API calls, access databases, modify data, or perform any operations.\nDO NOT: Ask questions or clarifications. Make reasonable assumptions.\nDO: Describe the steps as \"Step 1: Would search database...\", \"Step 2: Would analyze results...\", etc.\nDO: Use default values or best practices if details are missing.\n\nFORMAT REQUIRED:\n1. [First action that would be taken]\n2. [Second action that would be taken]\n3. [Third action that would be taken]\n...\n\nIMPORTANT: This is COMMAND MODE - figure things out yourself. Make intelligent assumptions based on context. ONLY ask questions if something is absolutely impossible to proceed without (e.g., missing required credentials). Otherwise, use sensible defaults and proceed with the plan.\n\nREMEMBER: This is ONLY a plan. The user will approve it, THEN it will be executed. Right now you are just describing what would happen - NOT doing it.`;\n\n\n systemMessage = systemMessage\n ? `${systemMessage}\\n\\n${planningInstruction}`\n : planningInstruction;\n\n aptevaClient.chat({\n agent_id: agentId,\n message: messageContent,\n stream: false,\n system: systemMessage,\n }).then((response) => {\n setPlan(response.message);\n setPendingCommand(currentCommand);\n setState('plan-pending');\n }).catch((err) => {\n const error = err instanceof Error ? err : new Error('Failed to generate plan');\n setError(error);\n setState('error');\n onError?.(error);\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to generate plan');\n setError(error);\n setState('error');\n onError?.(error);\n }\n }\n return;\n }\n\n setState('loading');\n setError(null);\n setProgress(0);\n setStreamedContent('');\n setCommand(''); // Clear input for next command\n setUploadedFiles([]); // Clear uploaded files after sending\n onStart?.();\n\n try {\n if (useMock) {\n // MOCK MODE\n if (enableStreaming) {\n // Mock streaming\n let accumulatedContent = '';\n\n generateMockCommandStream(\n currentCommand,\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n onChunk?.(chunk.content);\n\n // Estimate progress based on content length\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n onProgress?.(estimatedProgress);\n } else if (chunk.type === 'widget' && chunk.widget) {\n // Handle widgets in streamed response\n const widget = chunk.widget;\n setResult((prev) => ({\n success: true,\n data: prev?.data || {},\n widgets: [...(prev?.widgets || []), widget],\n message: accumulatedContent || 'Command executed successfully',\n }));\n }\n },\n (threadId) => {\n // On complete\n const result: CommandResult = {\n success: true,\n data: {\n summary: accumulatedContent,\n thread_id: threadId,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n },\n message: accumulatedContent || 'Command executed successfully',\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n },\n (error) => {\n // On error\n setError(error);\n setState('error');\n onError?.(error);\n }\n );\n } else {\n // Mock non-streaming\n const progressInterval = setInterval(() => {\n setProgress((prev) => {\n const next = Math.min(prev + 10, 90);\n onProgress?.(next);\n return next;\n });\n }, 200);\n\n // Simulate network delay\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n clearInterval(progressInterval);\n\n const mockResponse = generateMockCommandWithWidgets(currentCommand);\n\n const result: CommandResult = {\n success: true,\n data: {\n summary: mockResponse.message,\n thread_id: `mock_thread_${Date.now()}`,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n action: mockResponse.action, // Include agent action intent\n },\n widgets: mockResponse.widgets,\n message: mockResponse.message,\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n }\n } else {\n // REAL API MODE\n if (enableStreaming) {\n // Real streaming API call\n let accumulatedContent = '';\n\n // Build message - multi-part if files are uploaded\n let messageContent: any;\n\n if (uploadedFiles.length > 0) {\n // Multi-part message with text and images\n messageContent = [\n {\n type: 'text',\n text: currentCommand,\n },\n ...uploadedFiles.map(file => ({\n type: file.type, // 'image' or 'document'\n source: {\n type: 'base64',\n media_type: file.mediaType,\n data: file.data,\n },\n })),\n ];\n } else {\n // Simple text message\n messageContent = currentCommand;\n }\n\n // Build system message - add command execution instruction\n let systemMessage = context || '';\n\n // Always include command mode instruction for brevity\n let commandInstruction: string;\n if (isCompact) {\n // Compact mode - extremely terse\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute immediately, make intelligent assumptions, use defaults when needed. NO questions unless absolutely critical (missing required credentials). State action or result ONLY. Examples: \"Searching database for matching records...\" or \"Found 3 user records in database\" or \"Task completed successfully\". NO greetings, NO explanations, NO clarification requests. Just execute and report.';\n } else {\n // Default mode - still very brief\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute the command immediately. Make reasonable assumptions based on context. Use sensible defaults for missing details. DO NOT ask questions unless something is truly impossible without user input (e.g., missing required password). State what you\\'re doing or the result. Examples: \"Analyzing customer data from last quarter...\" or \"Created 5 new database entries successfully\" or \"Search complete: found 12 matching results\". NO greetings, NO filler words, NO clarification requests. Action/result only.';\n }\n\n systemMessage = systemMessage\n ? `${systemMessage}\\n\\n${commandInstruction}`\n : commandInstruction;\n\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: messageContent,\n stream: true,\n ...(systemMessage && { system: systemMessage }),\n },\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n onChunk?.(chunk.content);\n\n // Estimate progress based on content length (rough approximation)\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n onProgress?.(estimatedProgress);\n } else if (chunk.type === 'widget' && chunk.widget) {\n // Handle widgets in streamed response\n const widget = chunk.widget;\n setResult((prev) => ({\n success: true,\n data: prev?.data || {},\n widgets: [...(prev?.widgets || []), widget],\n message: accumulatedContent || 'Command executed successfully',\n }));\n }\n },\n (threadId) => {\n // On complete\n const result: CommandResult = {\n success: true,\n data: {\n summary: accumulatedContent,\n thread_id: threadId,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n },\n message: accumulatedContent || 'Command executed successfully',\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n },\n (error) => {\n // On error\n const err = error instanceof Error ? error : new Error('Unknown error');\n setError(err);\n setState('error');\n onError?.(err);\n }\n );\n } else {\n // Non-streaming API call\n const progressInterval = setInterval(() => {\n setProgress((prev) => {\n const next = Math.min(prev + 10, 90);\n onProgress?.(next);\n return next;\n });\n }, 200);\n\n // Build message - multi-part if files are uploaded\n let messageContent: any;\n\n if (uploadedFiles.length > 0) {\n // Multi-part message with text and images\n messageContent = [\n {\n type: 'text',\n text: currentCommand,\n },\n ...uploadedFiles.map(file => ({\n type: file.type, // 'image' or 'document'\n source: {\n type: 'base64',\n media_type: file.mediaType,\n data: file.data,\n },\n })),\n ];\n } else {\n // Simple text message\n messageContent = currentCommand;\n }\n\n // Build system message - add command execution instruction\n let systemMessage = context || '';\n\n // Always include command mode instruction for brevity\n let commandInstruction: string;\n if (isCompact) {\n // Compact mode - extremely terse\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute immediately, make intelligent assumptions, use defaults when needed. NO questions unless absolutely critical (missing required credentials). State action or result ONLY. Examples: \"Searching database for matching records...\" or \"Found 3 user records in database\" or \"Task completed successfully\". NO greetings, NO explanations, NO clarification requests. Just execute and report.';\n } else {\n // Default mode - still very brief\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute the command immediately. Make reasonable assumptions based on context. Use sensible defaults for missing details. DO NOT ask questions unless something is truly impossible without user input (e.g., missing required password). State what you\\'re doing or the result. Examples: \"Analyzing customer data from last quarter...\" or \"Created 5 new database entries successfully\" or \"Search complete: found 12 matching results\". NO greetings, NO filler words, NO clarification requests. Action/result only.';\n }\n\n systemMessage = systemMessage\n ? `${systemMessage}\\n\\n${commandInstruction}`\n : commandInstruction;\n\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: messageContent,\n stream: false,\n ...(systemMessage && { system: systemMessage }),\n });\n\n clearInterval(progressInterval);\n\n const result: CommandResult = {\n success: true,\n data: {\n summary: response.message,\n thread_id: response.thread_id,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n },\n widgets: response.widgets,\n message: response.message,\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n setState('error');\n onError?.(error);\n }\n };\n\n const resetCommand = () => {\n setState('idle');\n setResult(null);\n setError(null);\n setProgress(0);\n setCommand('');\n setPlan('');\n setPendingCommand('');\n setShowPlanDetails(false);\n setUploadedFiles([]);\n };\n\n const approvePlan = () => {\n // Execute the plan after approval\n // Send the plan to the agent with \"execute this now\" instruction\n setShowPlanDetails(false);\n const planToExecute = plan;\n setPlan('');\n setPendingCommand('');\n\n // Execute with the plan as the command\n const executionMessage = `Execute this plan now:\\n\\n${planToExecute}`;\n executeCommand(executionMessage);\n };\n\n const rejectPlan = () => {\n // Reset to idle and restore the command for editing\n setCommand(pendingCommand);\n setPlan('');\n setPendingCommand('');\n setShowPlanDetails(false);\n setState('idle');\n };\n\n const handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n onFileUpload?.(e.target.files);\n\n // Convert files to base64 for API\n const files: Array<{ type: 'image' | 'document'; data: string; mediaType: string; preview?: string; name: string }> = [];\n\n for (let i = 0; i < e.target.files.length; i++) {\n const file = e.target.files[i];\n\n const reader = new FileReader();\n\n await new Promise<void>((resolve) => {\n reader.onload = (event) => {\n if (event.target?.result) {\n const fullDataUrl = event.target.result as string;\n const base64Data = fullDataUrl.split(',')[1]; // Remove data:...;base64, prefix\n\n if (file.type.startsWith('image/')) {\n // Images with preview\n files.push({\n type: 'image',\n data: base64Data,\n mediaType: file.type,\n preview: fullDataUrl, // Keep full data URL for preview\n name: file.name,\n });\n } else if (file.type === 'application/pdf' || file.type.startsWith('application/')) {\n // Documents (PDF, etc.) without preview\n files.push({\n type: 'document',\n data: base64Data,\n mediaType: file.type,\n name: file.name,\n });\n }\n }\n resolve();\n };\n reader.readAsDataURL(file);\n });\n }\n\n setUploadedFiles(prev => [...prev, ...files]); // Append to existing files\n }\n };\n\n const removeFile = (index: number) => {\n setUploadedFiles(prev => prev.filter((_, i) => i !== index));\n };\n\n const isCompact = variant === 'compact';\n\n return (\n <div\n className={cn(\n 'relative border-2 rounded-xl bg-white dark:bg-neutral-900 transition-all duration-300 flex flex-col',\n state === 'loading' && 'animate-pulse-border',\n state === 'idle' && 'border-neutral-300 dark:border-neutral-700',\n state === 'loading' && 'border-blue-500',\n state === 'plan-pending' && 'border-blue-400',\n state === 'success' && 'border-green-500',\n state === 'error' && 'border-red-500',\n className\n )}\n style={{ minHeight: isCompact ? 'auto' : '180px' }}\n >\n {/* Input/Display Area */}\n <div className={cn('flex-1 flex', isCompact ? 'flex-row items-center p-3 gap-3' : 'flex-col p-4')}>\n {state === 'idle' && allowInput && !isCompact && (\n <>\n <textarea\n value={command}\n onChange={(e) => setCommand(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n executeCommand();\n }\n }}\n placeholder={placeholder}\n className=\"flex-1 w-full resize-none bg-transparent border-none focus:outline-none !text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500\"\n rows={6}\n />\n {/* File Previews - Non-Compact */}\n {uploadedFiles.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {uploadedFiles.map((file, index) => (\n <div key={index} className=\"relative group\">\n {file.type === 'image' ? (\n <img\n src={file.preview}\n alt={file.name}\n className=\"w-20 h-20 object-cover rounded-lg border-2 border-neutral-300 dark:border-neutral-600\"\n />\n ) : (\n <div className=\"w-20 h-20 flex flex-col items-center justify-center rounded-lg border-2 border-neutral-300 dark:border-neutral-600 bg-neutral-50 dark:bg-neutral-800\">\n <svg className=\"w-8 h-8 text-neutral-500 dark:text-neutral-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z\" clipRule=\"evenodd\" />\n </svg>\n <span className=\"text-[8px] text-neutral-500 dark:text-neutral-400 mt-1 px-1 truncate max-w-full\">\n {file.name.length > 12 ? file.name.slice(0, 12) + '...' : file.name}\n </span>\n </div>\n )}\n <button\n onClick={() => removeFile(index)}\n className=\"absolute -top-2 -right-2 w-6 h-6 bg-red-500 hover:bg-red-600 text-white rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"\n title={`Remove ${file.type}`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n\n {state === 'idle' && allowInput && isCompact && (\n <>\n <div className=\"flex items-center gap-0.5 flex-shrink-0\">\n {enableFileUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 !text-neutral-500 dark:!text-neutral-500 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"Attach file\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.4 2.8L4.4 6.8C3.736 7.464 3.736 8.536 4.4 9.2C5.064 9.864 6.136 9.864 6.8 9.2L11.6 4.4C12.704 3.296 12.704 1.504 11.6 0.4C10.496 -0.704 8.704 -0.704 7.6 0.4L2.8 5.2C1.256 6.744 1.256 9.256 2.8 10.8C4.344 12.344 6.856 12.344 8.4 10.8L12.4 6.8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(1.6, 2.4)\"/>\n </svg>\n </button>\n )}\n {planMode && (\n <div className=\"relative settings-menu-container\">\n <button\n onClick={() => setShowSettingsMenu(!showSettingsMenu)}\n className={cn(\n \"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n internalPlanMode ? \"!text-blue-600 dark:!text-blue-400\" : \"!text-neutral-500 dark:!text-neutral-500\"\n )}\n title=\"Settings\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"></line>\n <line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"></line>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"></line>\n <line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"></line>\n <line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"></line>\n <line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"></line>\n <line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"></line>\n <line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"></line>\n </svg>\n </button>\n {showSettingsMenu && (\n <div className=\"absolute top-10 left-0 z-50 w-56 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-lg p-2.5 settings-menu-container\">\n <label className=\"flex items-center justify-between cursor-pointer group\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-3.5 h-3.5 text-neutral-500 dark:text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div>\n <div className=\"text-xs font-medium text-neutral-700 dark:text-neutral-300\">Plan Mode</div>\n <div className=\"text-[10px] text-neutral-500 dark:text-neutral-400\">Review first</div>\n </div>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n setInternalPlanMode(!internalPlanMode);\n }}\n className={cn(\n \"relative inline-flex h-4 w-8 items-center rounded-full transition-colors\",\n internalPlanMode ? \"bg-blue-600\" : \"bg-neutral-300 dark:bg-neutral-600\"\n )}\n type=\"button\"\n >\n <span\n className={cn(\n \"inline-block h-3 w-3 transform rounded-full bg-white transition-transform\",\n internalPlanMode ? \"translate-x-4.5\" : \"translate-x-0.5\"\n )}\n />\n </button>\n </label>\n </div>\n )}\n </div>\n )}\n </div>\n {/* File Previews - Compact */}\n {uploadedFiles.length > 0 && (\n <div className=\"flex gap-1 flex-shrink-0\">\n {uploadedFiles.map((file, index) => (\n <div key={index} className=\"relative group\">\n {file.type === 'image' ? (\n <img\n src={file.preview}\n alt={file.name}\n className=\"w-8 h-8 object-cover rounded border border-neutral-300 dark:border-neutral-600\"\n />\n ) : (\n <div className=\"w-8 h-8 flex items-center justify-center rounded border border-neutral-300 dark:border-neutral-600 bg-neutral-50 dark:bg-neutral-800\" title={file.name}>\n <svg className=\"w-4 h-4 text-neutral-500 dark:text-neutral-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n )}\n <button\n onClick={() => removeFile(index)}\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 text-white rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Remove\"\n >\n <svg className=\"w-2.5 h-2.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n <input\n type=\"text\"\n value={command}\n onChange={(e) => setCommand(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n executeCommand();\n }\n }}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent border-none focus:outline-none !text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 py-1\"\n />\n <button\n onClick={() => executeCommand()}\n disabled={!command.trim()}\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0',\n 'border border-neutral-300 dark:border-neutral-600',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-700 dark:!text-neutral-300',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n '!text-lg',\n !command.trim() && 'border-neutral-200 dark:border-neutral-700 !text-neutral-400 dark:!text-neutral-600'\n )}\n title=\"Execute\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n </>\n )}\n\n {state === 'loading' && !isCompact && (\n <div className=\"flex-1 flex flex-col items-center justify-center space-y-4 py-8\">\n <div className=\"w-6 h-6 border-2 border-neutral-300 border-t-blue-500 rounded-full animate-spin\"></div>\n <div className=\"text-neutral-600 dark:text-neutral-400 text-sm text-center max-w-md\">\n {enableStreaming && streamedContent ? streamedContent : loadingText}\n </div>\n {showProgress && (\n <div className=\"w-full max-w-sm\">\n <div className=\"w-full bg-neutral-200 dark:bg-neutral-700 rounded-full h-1.5\">\n <div\n className=\"bg-blue-500 h-1.5 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <p className=\"text-xs text-neutral-500 mt-2 text-center\">{progress}%</p>\n </div>\n )}\n </div>\n )}\n\n {state === 'loading' && isCompact && (\n <>\n <div className=\"flex-1 flex items-center gap-3 py-1\">\n <div className=\"w-4 h-4 border-2 border-neutral-300 border-t-blue-500 rounded-full animate-spin\"></div>\n <div className=\"text-neutral-600 dark:text-neutral-400 text-sm truncate\">\n {enableStreaming && streamedContent ? streamedContent : loadingText}\n </div>\n </div>\n <button\n disabled\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0',\n 'border border-neutral-200 dark:border-neutral-700',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-400 dark:!text-neutral-600',\n '!text-lg',\n 'opacity-30 cursor-not-allowed'\n )}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n </>\n )}\n\n {state === 'plan-pending' && !isCompact && (\n <div className=\"flex-1 flex flex-col\">\n <div className=\"mb-4 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg\">\n <div className=\"flex items-start gap-2 mb-3\">\n <svg className=\"w-5 h-5 text-blue-600 dark:text-blue-400 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-blue-800 dark:text-blue-300 mb-1\">Proposed Plan</h3>\n <div className=\"text-blue-700 dark:text-blue-300 text-sm whitespace-pre-line leading-relaxed\">\n {plan}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 mt-4\">\n <button\n onClick={approvePlan}\n className=\"flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm font-medium\"\n >\n Approve & Execute\n </button>\n <button\n onClick={rejectPlan}\n className=\"flex-1 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-sm font-medium\"\n >\n Modify\n </button>\n </div>\n </div>\n </div>\n )}\n\n {state === 'plan-pending' && isCompact && (\n <>\n <button\n onClick={() => setShowPlanDetails(true)}\n className=\"flex-1 flex items-center gap-2 px-3 py-2 bg-blue-50 dark:bg-blue-900/30 hover:bg-blue-100 dark:hover:bg-blue-900/40 border border-blue-200 dark:border-blue-800 rounded-lg transition-colors\"\n >\n <svg className=\"w-4 h-4 text-blue-600 dark:text-blue-400 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <span className=\"text-sm font-medium text-blue-700 dark:text-blue-300 truncate flex-1\">View Execution Plan</span>\n </button>\n <div className=\"flex gap-2 flex-shrink-0\">\n <button\n onClick={approvePlan}\n className=\"px-3 py-1.5 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-xs font-medium\"\n >\n Approve\n </button>\n <button\n onClick={rejectPlan}\n className=\"px-3 py-1.5 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-xs font-medium\"\n >\n Modify\n </button>\n </div>\n </>\n )}\n\n {state === 'error' && (\n <div className=\"flex-1 flex flex-col\">\n <div className=\"mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <div className=\"flex items-start gap-2\">\n <svg className=\"w-5 h-5 text-red-600 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div>\n <h3 className=\"text-sm font-semibold text-red-800 dark:text-red-400\">Error</h3>\n <p className=\"text-red-700 dark:text-red-300 text-sm mt-1\">{error?.message}</p>\n </div>\n </div>\n </div>\n {allowInput && (\n <textarea\n value={command}\n onChange={(e) => setCommand(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n executeCommand();\n }\n }}\n placeholder={placeholder}\n className=\"flex-1 w-full resize-none bg-transparent border-none focus:outline-none text-neutral-900 dark:text-white placeholder-neutral-400\"\n rows={4}\n />\n )}\n </div>\n )}\n\n {state === 'success' && result && !isCompact && (\n <div className=\"flex-1 overflow-auto\">\n {resultRenderer ? (\n resultRenderer(result.data)\n ) : (\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-3 p-3 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg\">\n <svg className=\"w-5 h-5 text-green-600 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-green-800 dark:text-green-400 mb-1\">Success</h3>\n <p className=\"text-green-700 dark:text-green-300 text-sm\">Command executed successfully</p>\n </div>\n </div>\n {result.data?.summary && (\n <div className=\"text-neutral-700 dark:text-neutral-300 text-sm leading-relaxed whitespace-pre-line\">\n {result.data.summary}\n </div>\n )}\n {result.widgets && result.widgets.length > 0 && (\n <div className=\"space-y-3\">\n {result.widgets.map((widget) => (\n <WidgetRenderer\n key={widget.id}\n widget={widget}\n onAction={onAction}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {state === 'success' && result && isCompact && (\n <>\n <div\n className=\"flex-1 flex items-center gap-2 py-1 cursor-text min-w-0\"\n onClick={() => {\n setState('idle');\n setResult(null);\n }}\n >\n <svg className=\"w-4 h-4 text-green-600 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"text-green-700 dark:text-green-300 text-sm truncate flex-1 min-w-0\">\n {resultRenderer ? resultRenderer(result.data) : (result.message || 'Command executed successfully')}\n </div>\n </div>\n <button\n onClick={() => {\n setState('idle');\n setResult(null);\n }}\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0',\n 'border border-neutral-300 dark:border-neutral-600',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-700 dark:!text-neutral-300',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n '!text-lg'\n )}\n title=\"New command\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n </>\n )}\n </div>\n\n {/* Bottom Action Bar - Only show for default variant when not in compact mode */}\n {!isCompact && (\n <div className=\"p-3 flex items-center justify-between gap-2\">\n {/* Left side - Attachment and Settings buttons */}\n <div className=\"flex items-center gap-1\">\n {state === 'idle' && allowInput && (\n <>\n {enableFileUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 !text-neutral-500 dark:!text-neutral-500 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"Attach file\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.4 2.8L4.4 6.8C3.736 7.464 3.736 8.536 4.4 9.2C5.064 9.864 6.136 9.864 6.8 9.2L11.6 4.4C12.704 3.296 12.704 1.504 11.6 0.4C10.496 -0.704 8.704 -0.704 7.6 0.4L2.8 5.2C1.256 6.744 1.256 9.256 2.8 10.8C4.344 12.344 6.856 12.344 8.4 10.8L12.4 6.8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(1.6, 2.4)\"/>\n </svg>\n </button>\n )}\n {planMode && (\n <div className=\"relative settings-menu-container\">\n <button\n onClick={() => setShowSettingsMenu(!showSettingsMenu)}\n className={cn(\n \"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n internalPlanMode ? \"!text-blue-600 dark:!text-blue-400\" : \"!text-neutral-500 dark:!text-neutral-500\"\n )}\n title=\"Settings\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"></line>\n <line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"></line>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"></line>\n <line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"></line>\n <line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"></line>\n <line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"></line>\n <line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"></line>\n <line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"></line>\n </svg>\n </button>\n {showSettingsMenu && (\n <div className=\"absolute top-10 left-0 z-50 w-64 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-lg p-3 settings-menu-container\">\n <label className=\"flex items-center justify-between cursor-pointer group\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-neutral-500 dark:text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div>\n <div className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\">Plan Mode</div>\n <div className=\"text-xs text-neutral-500 dark:text-neutral-400\">Review before executing</div>\n </div>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n setInternalPlanMode(!internalPlanMode);\n }}\n className={cn(\n \"relative inline-flex h-5 w-9 items-center rounded-full transition-colors\",\n internalPlanMode ? \"bg-blue-600\" : \"bg-neutral-300 dark:bg-neutral-600\"\n )}\n type=\"button\"\n >\n <span\n className={cn(\n \"inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform\",\n internalPlanMode ? \"translate-x-5\" : \"translate-x-0.5\"\n )}\n />\n </button>\n </label>\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Spacer when no attachment button */}\n {!(state === 'idle' && allowInput) && <div />}\n\n {/* Right side - Action buttons */}\n <div className=\"flex items-center gap-2\">\n {(state === 'success' || state === 'error') && allowInput && (\n <button\n onClick={resetCommand}\n className=\"px-3 py-1.5 text-sm text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white transition-colors\"\n >\n Reset\n </button>\n )}\n\n {(state === 'idle' || state === 'error') && (\n <button\n onClick={() => executeCommand()}\n disabled={!command.trim()}\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all',\n 'border border-neutral-300 dark:border-neutral-600',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-700 dark:!text-neutral-300',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n '!text-lg',\n !command.trim() && 'border-neutral-200 dark:border-neutral-700 !text-neutral-400 dark:!text-neutral-600'\n )}\n title={state === 'error' ? 'Retry' : 'Execute'}\n >\n {state === 'error' ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 8C13 10.7614 10.7614 13 8 13C5.23858 13 3 10.7614 3 8C3 5.23858 5.23858 3 8 3C9.65685 3 11.1257 3.82818 12 5.09091M12 3V5.09091M12 5.09091H9.81818\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Plan Modal - Only for compact mode */}\n {showPlanDetails && isCompact && state === 'plan-pending' && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\" onClick={() => setShowPlanDetails(false)}>\n <div className=\"bg-white dark:bg-neutral-900 rounded-2xl shadow-2xl max-w-2xl w-full max-h-[80vh] overflow-hidden\" onClick={(e) => e.stopPropagation()}>\n {/* Modal Header */}\n <div className=\"flex items-center justify-between p-6 border-b border-neutral-200 dark:border-neutral-700\">\n <div className=\"flex items-center gap-3\">\n <svg className=\"w-6 h-6 text-blue-600 dark:text-blue-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <h2 className=\"text-xl font-semibold text-neutral-900 dark:text-white\">Proposed Execution Plan</h2>\n </div>\n <button\n onClick={() => setShowPlanDetails(false)}\n className=\"text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Modal Content */}\n <div className=\"p-6 overflow-y-auto max-h-[calc(80vh-180px)]\">\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <div className=\"text-neutral-700 dark:text-neutral-300 whitespace-pre-line leading-relaxed\">\n {plan}\n </div>\n </div>\n </div>\n\n {/* Modal Footer */}\n <div className=\"flex items-center justify-end gap-3 p-6 border-t border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-800/50\">\n <button\n onClick={rejectPlan}\n className=\"px-6 py-2.5 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors font-medium\"\n >\n Modify Command\n </button>\n <button\n onClick={approvePlan}\n className=\"px-6 py-2.5 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium\"\n >\n Approve & Execute\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileSelect}\n className=\"hidden\"\n accept=\"image/*,application/pdf,.doc,.docx,.txt\"\n />\n\n <style dangerouslySetInnerHTML={{\n __html: `\n @keyframes pulse-border {\n 0%, 100% {\n border-color: rgb(59, 130, 246);\n }\n 50% {\n border-color: rgb(147, 197, 253);\n }\n }\n .animate-pulse-border {\n animation: pulse-border 2s ease-in-out infinite;\n }\n `\n }} />\n </div>\n );\n}\n","import { useState, KeyboardEvent } from 'react';\nimport { PromptProps } from '../../types/components';\nimport { cn } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\n\nexport function Prompt({\n agentId,\n placeholder = 'Enter your prompt...',\n initialValue = '',\n useMock = true,\n submitOn = 'button',\n debounceMs = 0,\n minLength = 0,\n maxLength,\n onSubmit,\n onResult,\n onChange,\n variant = 'inline',\n showSuggestions = false,\n className,\n}: PromptProps) {\n const [value, setValue] = useState(initialValue);\n const [isLoading, setIsLoading] = useState(false);\n const [suggestions] = useState(['Plan a trip', 'Write a description', 'Analyze data']);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!maxLength || newValue.length <= maxLength) {\n setValue(newValue);\n onChange?.(newValue);\n }\n };\n\n const handleSubmit = async () => {\n if (value.length < minLength) return;\n\n onSubmit?.(value);\n setIsLoading(true);\n\n try {\n if (useMock) {\n // MOCK MODE\n await new Promise((resolve) => setTimeout(resolve, 1500));\n const mockResult = `Enhanced version: ${value} [AI-generated content]`;\n onResult?.(mockResult);\n setValue('');\n } else {\n // REAL API MODE\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: value,\n });\n onResult?.(response.message);\n setValue('');\n }\n } catch (error) {\n console.error('Error processing prompt:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (submitOn === 'enter' && e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const handleBlur = () => {\n if (submitOn === 'blur' && value.trim()) {\n handleSubmit();\n }\n };\n\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={isLoading}\n className=\"flex-1 px-4 py-2 border border-neutral-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-apteva-500 dark:bg-neutral-800 dark:border-neutral-600 dark:text-white\"\n />\n\n {submitOn === 'button' && (\n <button\n onClick={handleSubmit}\n disabled={isLoading || value.length < minLength}\n className=\"px-6 py-2 bg-apteva-500 text-white rounded-lg hover:bg-apteva-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium\"\n >\n {isLoading ? 'Processing...' : 'Generate'}\n </button>\n )}\n </div>\n\n {maxLength && (\n <p className=\"text-xs text-neutral-500\">\n {value.length} / {maxLength} characters\n </p>\n )}\n\n {showSuggestions && !value && (\n <div className=\"flex flex-wrap gap-2\">\n {suggestions.map((suggestion, idx) => (\n <button\n key={idx}\n onClick={() => setValue(suggestion)}\n className=\"px-3 py-1 text-sm bg-neutral-100 hover:bg-neutral-200 text-neutral-700 rounded-full transition-colors\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n\n {isLoading && (\n <div className=\"flex items-center gap-2 text-sm text-neutral-500\">\n <div className=\"w-4 h-4 border-2 border-apteva-500 border-t-transparent rounded-full animate-spin\" />\n <span>AI is processing your request...</span>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { StreamProps } from '../../types/components';\nimport { cn, generateMockStreamingResponse } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\n\nexport function Stream({\n agentId,\n prompt,\n context,\n autoStart = false,\n useMock = true,\n onStart,\n onChunk,\n onComplete,\n onError,\n variant = 'prose',\n showCursor = true,\n typingSpeed = 30,\n className,\n}: StreamProps) {\n const [text, setText] = useState('');\n const [isStreaming, setIsStreaming] = useState(false);\n const [isComplete, setIsComplete] = useState(false);\n\n useEffect(() => {\n if (autoStart && !isStreaming && !isComplete) {\n startStreaming();\n }\n }, [autoStart]);\n\n const startStreaming = async () => {\n setIsStreaming(true);\n onStart?.();\n\n try {\n if (useMock) {\n // MOCK MODE\n const mockText =\n 'This is a simulated streaming response from the AI agent. ' +\n 'In a real implementation, this would stream data from your backend API. ' +\n 'The text appears word by word to simulate the streaming effect. ' +\n 'You can customize the typing speed and styling based on your needs.';\n\n await generateMockStreamingResponse(\n mockText,\n (chunk) => {\n setText((prev) => prev + chunk);\n onChunk?.(chunk);\n },\n typingSpeed\n );\n\n setIsComplete(true);\n setIsStreaming(false);\n onComplete?.(text + mockText);\n } else {\n // REAL API MODE\n let accumulatedText = '';\n\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: prompt,\n stream: true,\n },\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedText += chunk.content;\n setText(accumulatedText);\n onChunk?.(chunk.content);\n }\n },\n () => {\n // On complete\n setIsComplete(true);\n setIsStreaming(false);\n onComplete?.(accumulatedText);\n },\n (error) => {\n // On error\n const err = error instanceof Error ? error : new Error('Streaming error');\n onError?.(err);\n setIsStreaming(false);\n }\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Streaming error');\n onError?.(err);\n setIsStreaming(false);\n }\n };\n\n const variantClasses = {\n prose: 'prose prose-sm max-w-none dark:prose-invert',\n code: 'font-mono text-sm bg-neutral-900 text-green-400 p-4 rounded-lg',\n plain: 'text-neutral-900 dark:text-neutral-100',\n };\n\n if (!isStreaming && !isComplete) {\n return (\n <div className={cn('p-4', className)}>\n <button\n onClick={startStreaming}\n className=\"px-6 py-3 bg-apteva-500 text-white rounded-lg hover:bg-apteva-600 transition-colors font-medium\"\n >\n Start Streaming\n </button>\n </div>\n );\n }\n\n return (\n <div className={cn(variantClasses[variant], className)}>\n {text}\n {isStreaming && showCursor && <span className=\"apteva-stream-cursor\" />}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Thread } from '../../types/messages';\nimport { ThreadItem } from './ThreadItem';\n\ninterface ThreadListProps {\n threads: Thread[];\n currentThreadId?: string;\n onThreadSelect?: (threadId: string) => void;\n onThreadDelete?: (threadId: string) => void;\n showSearch?: boolean;\n groupBy?: 'date' | 'agent' | 'none';\n}\n\nexport function ThreadList({\n threads,\n currentThreadId,\n onThreadSelect,\n onThreadDelete,\n showSearch = false,\n groupBy = 'none',\n}: ThreadListProps) {\n const [searchQuery, setSearchQuery] = useState('');\n\n const filteredThreads = threads.filter(\n (thread) =>\n thread.title.toLowerCase().includes(searchQuery.toLowerCase()) ||\n thread.preview?.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n const groupedThreads = groupBy === 'date' ? groupThreadsByDate(filteredThreads) : { All: filteredThreads };\n\n return (\n <div className=\"flex flex-col h-full\">\n {showSearch && (\n <div className=\"p-3 border-b border-neutral-200 dark:border-neutral-700\">\n <input\n type=\"text\"\n placeholder=\"Search conversations...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full px-3 py-2 text-sm border border-neutral-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-apteva-500 dark:bg-neutral-800 dark:border-neutral-600 dark:text-white\"\n />\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto\">\n {Object.entries(groupedThreads).map(([group, groupThreads]) => (\n <div key={group}>\n {groupBy !== 'none' && (\n <div className=\"px-3 py-2 text-xs font-semibold text-neutral-500 uppercase\">{group}</div>\n )}\n {groupThreads.map((thread) => (\n <ThreadItem\n key={thread.id}\n thread={thread}\n isActive={thread.id === currentThreadId}\n onSelect={() => onThreadSelect?.(thread.id)}\n onDelete={() => onThreadDelete?.(thread.id)}\n />\n ))}\n </div>\n ))}\n\n {filteredThreads.length === 0 && (\n <div className=\"p-8 text-center text-neutral-500\">\n <svg className=\"w-10 h-10 mx-auto mb-2 opacity-50\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n <p>No conversations found</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction groupThreadsByDate(threads: Thread[]): Record<string, Thread[]> {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n const lastWeek = new Date(today);\n lastWeek.setDate(lastWeek.getDate() - 7);\n\n return threads.reduce(\n (groups, thread) => {\n const threadDate = new Date(thread.updatedAt);\n let group = 'Older';\n\n if (threadDate >= today) {\n group = 'Today';\n } else if (threadDate >= yesterday) {\n group = 'Yesterday';\n } else if (threadDate >= lastWeek) {\n group = 'Last 7 Days';\n }\n\n if (!groups[group]) groups[group] = [];\n groups[group].push(thread);\n return groups;\n },\n {} as Record<string, Thread[]>\n );\n}\n","// No direct imports needed 'react';\nimport { Thread } from '../../types/messages';\nimport { cn } from '../../utils';\n\ninterface ThreadItemProps {\n thread: Thread;\n isActive?: boolean;\n onSelect?: () => void;\n onDelete?: () => void;\n}\n\nexport function ThreadItem({ thread, isActive = false, onSelect, onDelete }: ThreadItemProps) {\n return (\n <div\n className={cn('apteva-thread-item', {\n 'apteva-thread-item-active': isActive,\n })}\n onClick={onSelect}\n >\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-semibold text-neutral-900 dark:text-white truncate\">{thread.title}</h4>\n {thread.preview && <p className=\"text-sm text-neutral-600 dark:text-neutral-400 truncate\">{thread.preview}</p>}\n <div className=\"flex items-center gap-2 mt-1 text-xs text-neutral-500\">\n <span>{thread.messageCount} messages</span>\n <span>•</span>\n <span>{formatRelativeTime(thread.updatedAt)}</span>\n </div>\n </div>\n\n {onDelete && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className=\"p-2 text-neutral-400 hover:text-red-500 hover:bg-red-50 rounded transition-colors\"\n title=\"Delete thread\"\n >\n 🗑️\n </button>\n )}\n </div>\n );\n}\n\nfunction formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n return date.toLocaleDateString();\n}\n","// No direct imports needed 'react';\nimport { ThreadsProps } from '../../types/components';\nimport { ThreadList } from './ThreadList';\nimport { cn } from '../../utils';\n\nexport function Threads({\n threads,\n currentThreadId,\n onThreadSelect,\n onThreadDelete,\n onNewThread,\n variant = 'sidebar',\n showSearch = false,\n showNewButton = true,\n groupBy = 'none',\n className,\n}: ThreadsProps) {\n const variantClasses = {\n sidebar: 'h-full border-r border-neutral-200 dark:border-neutral-700 bg-white dark:bg-neutral-900',\n dropdown: 'absolute top-full left-0 right-0 mt-2 bg-white dark:bg-neutral-800 rounded-lg shadow-lg border border-neutral-200 dark:border-neutral-700 max-h-96 overflow-hidden',\n tabs: 'flex gap-2 border-b border-neutral-200 dark:border-neutral-700 overflow-x-auto',\n };\n\n if (variant === 'tabs') {\n return (\n <div className={cn(variantClasses[variant], className)}>\n {threads.slice(0, 5).map((thread) => (\n <button\n key={thread.id}\n onClick={() => onThreadSelect?.(thread.id)}\n className={cn(\n 'px-4 py-2 whitespace-nowrap font-medium transition-colors',\n thread.id === currentThreadId\n ? 'border-b-2 border-apteva-500 text-apteva-500'\n : 'text-neutral-600 hover:text-neutral-900'\n )}\n >\n {thread.title}\n </button>\n ))}\n {showNewButton && onNewThread && (\n <button\n onClick={onNewThread}\n className=\"px-4 py-2 text-neutral-600 hover:text-apteva-500 transition-colors font-medium\"\n >\n + New\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(variantClasses[variant], 'flex flex-col', className)}>\n {showNewButton && onNewThread && (\n <div className=\"p-3 border-b border-neutral-200 dark:border-neutral-700\">\n <button\n onClick={onNewThread}\n className=\"w-full px-4 py-2 bg-apteva-500 text-white rounded-lg hover:bg-apteva-600 transition-colors font-medium\"\n >\n + New Conversation\n </button>\n </div>\n )}\n\n <ThreadList\n threads={threads}\n currentThreadId={currentThreadId}\n onThreadSelect={onThreadSelect}\n onThreadDelete={onThreadDelete}\n showSearch={showSearch}\n groupBy={groupBy}\n />\n </div>\n );\n}\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { AutoInterfaceProps, InterfaceSpec, InterfaceUpdate } from '../../types/interface';\nimport { ActionEvent } from '../../types/actions';\nimport { Chat } from '../Chat';\nimport { ChatHandle } from '../Chat/Chat';\nimport { InterfaceRenderer } from './InterfaceRenderer';\nimport { InterfaceSkeleton } from './InterfaceSkeleton';\nimport { applyUpdates } from '../../utils/interface-operations';\nimport { parseInterfaceFromText, parseUpdatesFromText } from '../../utils/interface-parser';\nimport { generateInterfaceContext, generateCompactInterfaceContext } from '../../utils/interface-context';\nimport { cn } from '../../utils/cn';\n\n/**\n * Make a separate (non-chat) API call to generate the initial interface.\n * Uses streaming to collect the full response, then parses it for @interface.\n */\nasync function generateInitialInterface(\n apiUrl: string,\n apiKey: string | undefined,\n agentId: string,\n prompt: string,\n): Promise<{ spec: InterfaceSpec | null; threadId: string | null }> {\n const systemContext = generateCompactInterfaceContext();\n const message = `${systemContext}\\n\\nGenerate an interface for: ${prompt}`;\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (apiKey) headers['X-API-Key'] = apiKey;\n\n const response = await fetch(`${apiUrl}/chat`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n agent_id: agentId,\n message,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(err.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n const text = data.response || data.message || '';\n\n console.log('[AutoInterface] Raw API response:', data);\n console.log('[AutoInterface] Extracted text (' + text.length + ' chars):', text.substring(0, 500));\n\n const spec = parseInterfaceFromText(text);\n console.log('[AutoInterface] Parsed spec:', spec ? 'OK' : 'null', spec ? JSON.stringify(spec).substring(0, 300) + '...' : '');\n\n return { spec, threadId: data.thread_id || null };\n}\n\nexport function AutoInterface({\n agentId,\n threadId,\n initialPrompt,\n initialInterface,\n context,\n apiUrl,\n apiKey,\n onInterfaceChange,\n onAction,\n onThreadChange,\n onError,\n chatPosition = 'right',\n chatWidth = '380px',\n chatCollapsible = true,\n chatPlaceholder = 'Ask the AI to generate or update the interface...',\n chatWelcomeTitle = 'Auto Interface',\n useMock,\n theme,\n className,\n}: AutoInterfaceProps) {\n const [interfaceSpec, setInterfaceSpec] = useState<InterfaceSpec | null>(initialInterface || null);\n const [isGenerating, setIsGenerating] = useState(false);\n const [chatCollapsed, setChatCollapsed] = useState(false);\n const chatRef = useRef<ChatHandle>(null);\n\n // Build the system context for AI\n const systemContext = [\n generateInterfaceContext(),\n context || '',\n ].filter(Boolean).join('\\n\\n');\n\n // Handle interface spec changes\n const updateInterface = useCallback((newSpec: InterfaceSpec) => {\n setInterfaceSpec(newSpec);\n onInterfaceChange?.(newSpec);\n }, [onInterfaceChange]);\n\n // Handle widget actions from the rendered interface\n const handleAction = useCallback((action: ActionEvent) => {\n onAction?.(action);\n\n // For server-handled actions, send to AI via chat\n if (chatRef.current) {\n chatRef.current.sendMessage(\n `[Action: ${action.type} on widget ${action.widgetId || 'unknown'}. Payload: ${JSON.stringify(action.payload)}]`\n );\n }\n }, [onAction]);\n\n // Process assistant messages for interface specs and updates\n const handleMessageComplete = useCallback((result: any) => {\n if (!result?.data) return;\n\n const text = typeof result.data === 'string' ? result.data : result.data.message || '';\n console.log('[AutoInterface] Chat message complete, text (' + text.length + ' chars):', text.substring(0, 300));\n\n // Try to parse a full interface spec\n const parsed = parseInterfaceFromText(text);\n if (parsed) {\n console.log('[AutoInterface] Parsed full interface from chat');\n updateInterface(parsed);\n setIsGenerating(false);\n return;\n }\n\n // Try to parse updates\n const updates = parseUpdatesFromText(text);\n if (updates.length > 0 && interfaceSpec) {\n console.log('[AutoInterface] Parsed', updates.length, 'updates from chat');\n const newSpec = applyUpdates(interfaceSpec, updates);\n updateInterface(newSpec);\n } else {\n console.log('[AutoInterface] No interface or updates found in chat message');\n }\n\n setIsGenerating(false);\n }, [interfaceSpec, updateInterface]);\n\n // Generate initial interface via separate API call (not through chat)\n useEffect(() => {\n if (!initialPrompt || initialInterface || useMock) return;\n if (!apiUrl) return;\n\n let cancelled = false;\n setIsGenerating(true);\n\n console.log('[AutoInterface] Generating initial interface for prompt:', initialPrompt);\n console.log('[AutoInterface] API URL:', apiUrl, '| Agent:', agentId);\n\n generateInitialInterface(apiUrl, apiKey, agentId, initialPrompt)\n .then(({ spec, threadId }) => {\n if (cancelled) return;\n console.log('[AutoInterface] Generation complete. Spec:', spec ? 'parsed OK' : 'null', '| Thread:', threadId);\n if (spec) {\n console.log('[AutoInterface] Setting interface with', JSON.stringify(spec).length, 'bytes');\n updateInterface(spec);\n } else {\n console.warn('[AutoInterface] Agent did not return a parseable @interface block');\n }\n setIsGenerating(false);\n })\n .catch((err) => {\n if (cancelled) return;\n console.error('[AutoInterface] Initial generation failed:', err);\n onError?.(err instanceof Error ? err : new Error(String(err)));\n setIsGenerating(false);\n });\n\n return () => { cancelled = true; };\n }, [initialPrompt]);\n\n const hasInterface = interfaceSpec !== null;\n const showSkeleton = isGenerating && !hasInterface;\n\n return (\n <div className={cn(\n 'flex h-full bg-neutral-50 dark:bg-black',\n chatPosition === 'bottom' ? 'flex-col' : 'flex-row',\n className\n )}>\n {/* Interface area */}\n <div className={cn(\n 'flex-1 overflow-y-auto min-w-0',\n hasInterface || showSkeleton ? '' : 'hidden'\n )}>\n {showSkeleton && <InterfaceSkeleton />}\n {hasInterface && interfaceSpec && (\n <div className=\"p-4\">\n <InterfaceRenderer\n node={interfaceSpec.root}\n onAction={handleAction}\n />\n </div>\n )}\n </div>\n\n {/* Collapse toggle */}\n {chatCollapsible && hasInterface && chatPosition === 'right' && (\n <button\n onClick={() => setChatCollapsed(!chatCollapsed)}\n className=\"flex-shrink-0 w-6 flex items-center justify-center border-l border-neutral-200 dark:border-neutral-700 bg-neutral-100 dark:bg-neutral-800 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title={chatCollapsed ? 'Show chat' : 'Hide chat'}\n >\n <span className=\"!text-xs !text-neutral-500 dark:!text-neutral-400\">\n {chatCollapsed ? '\\u25C0' : '\\u25B6'}\n </span>\n </button>\n )}\n\n {/* Chat panel */}\n <div\n className={cn(\n 'flex-shrink-0 border-neutral-200 dark:border-neutral-700',\n chatPosition === 'right' ? 'border-l' : 'border-t',\n chatCollapsed && 'hidden',\n // When no interface is generated yet, chat takes full width\n !hasInterface && !showSkeleton && 'flex-1',\n )}\n style={hasInterface || showSkeleton ? (\n chatPosition === 'right'\n ? { width: chatWidth }\n : { height: '300px' }\n ) : undefined}\n >\n <Chat\n ref={chatRef}\n agentId={agentId}\n threadId={threadId}\n apiUrl={apiUrl}\n apiKey={apiKey}\n useMock={useMock}\n context={systemContext}\n placeholder={chatPlaceholder}\n welcomeTitle={chatWelcomeTitle}\n welcomeSubtitle=\"Describe the interface you want to create\"\n enableStreaming={true}\n enableWidgets={true}\n showHeader={true}\n headerTitle=\"Chat\"\n onThreadChange={onThreadChange}\n onComplete={handleMessageComplete}\n onError={onError}\n className=\"h-full\"\n suggestedPrompts={!hasInterface ? [\n 'Show me a sales dashboard',\n 'Create a user management panel',\n 'Build a project overview page',\n ] : undefined}\n />\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { InterfaceNode } from '../../types/interface';\nimport { ActionEvent } from '../../types/actions';\nimport { cn } from '../../utils/cn';\n\ninterface LayoutRendererProps {\n node: InterfaceNode;\n onAction?: (action: ActionEvent) => void;\n renderNode: (node: InterfaceNode) => React.ReactNode;\n}\n\nconst gapClasses: Record<string, string> = {\n none: 'gap-0',\n sm: 'gap-2',\n md: 'gap-4',\n lg: 'gap-6',\n};\n\nconst paddingClasses: Record<string, string> = {\n none: 'p-0',\n sm: 'p-2',\n md: 'p-4',\n lg: 'p-6',\n};\n\nconst maxWidthClasses: Record<string, string> = {\n sm: 'max-w-2xl',\n md: 'max-w-4xl',\n lg: 'max-w-6xl',\n xl: 'max-w-7xl',\n full: 'max-w-full',\n};\n\nexport function LayoutRenderer({ node, onAction, renderNode }: LayoutRendererProps) {\n const children = node.children || [];\n\n switch (node.layout) {\n case 'page':\n return <PageLayout node={node} renderNode={renderNode} />;\n case 'row':\n return <RowLayout node={node} renderNode={renderNode} />;\n case 'columns':\n return <ColumnsLayout node={node} renderNode={renderNode} />;\n case 'stack':\n return <StackLayout node={node} renderNode={renderNode} />;\n case 'sidebar':\n return <SidebarLayout node={node} renderNode={renderNode} />;\n case 'tabs':\n return <TabsLayout node={node} renderNode={renderNode} />;\n default:\n // Unknown layout — just stack children\n return (\n <div className=\"space-y-4\">\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n }\n}\n\nfunction PageLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { title, padding = 'md', maxWidth = 'xl' } = node.props || {};\n const children = node.children || [];\n\n return (\n <div className={cn('w-full mx-auto', paddingClasses[padding], maxWidthClasses[maxWidth])}>\n {title && (\n <h1 className=\"!text-2xl font-bold !text-neutral-900 dark:!text-white mb-6\">{title}</h1>\n )}\n <div className=\"space-y-6\">\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction RowLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { columns, gap = 'md', align = 'stretch' } = node.props || {};\n const children = node.children || [];\n\n const templateColumns = columns\n ? columns.map((c: number) => `${c}fr`).join(' ')\n : `repeat(${children.length}, 1fr)`;\n\n const alignClasses: Record<string, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n };\n\n return (\n <div\n className={cn('grid', gapClasses[gap], alignClasses[align])}\n style={{ gridTemplateColumns: templateColumns }}\n >\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n}\n\nfunction ColumnsLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { count, gap = 'md' } = node.props || {};\n const children = node.children || [];\n const colCount = count || children.length;\n\n return (\n <div\n className={cn('grid', gapClasses[gap])}\n style={{ gridTemplateColumns: `repeat(${colCount}, 1fr)` }}\n >\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n}\n\nfunction StackLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { gap = 'md', align = 'stretch' } = node.props || {};\n const children = node.children || [];\n\n const alignClasses: Record<string, string> = {\n left: 'items-start',\n center: 'items-center',\n right: 'items-end',\n stretch: 'items-stretch',\n };\n\n return (\n <div className={cn('flex flex-col', gapClasses[gap], alignClasses[align])}>\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n}\n\nfunction SidebarLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { side = 'left', width = '280px' } = node.props || {};\n const children = node.children || [];\n const [sidebarChild, ...mainChildren] = side === 'left' ? children : [...children].reverse();\n\n if (!sidebarChild) return null;\n\n const sidebar = (\n <div\n className=\"flex-shrink-0 overflow-y-auto border-neutral-200 dark:border-neutral-700\"\n style={{ width }}\n >\n {renderNode(sidebarChild)}\n </div>\n );\n\n const main = (\n <div className=\"flex-1 overflow-y-auto min-w-0\">\n {mainChildren.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex h-full gap-4\">\n {side === 'left' ? <>{sidebar}{main}</> : <>{main}{sidebar}</>}\n </div>\n );\n}\n\nfunction TabsLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { labels = [], defaultTab = 0 } = node.props || {};\n const children = node.children || [];\n const [activeTab, setActiveTab] = useState(defaultTab);\n\n return (\n <div>\n <div className=\"flex border-b border-neutral-200 dark:border-neutral-700 mb-4\">\n {labels.map((label: string, idx: number) => (\n <button\n key={idx}\n onClick={() => setActiveTab(idx)}\n className={cn(\n 'px-4 py-2 !text-sm font-medium transition-colors border-b-2 -mb-px',\n activeTab === idx\n ? 'border-blue-500 !text-blue-600 dark:!text-blue-400'\n : 'border-transparent !text-neutral-500 hover:!text-neutral-700 dark:hover:!text-neutral-300'\n )}\n >\n {label}\n </button>\n ))}\n </div>\n {children[activeTab] && renderNode(children[activeTab])}\n </div>\n );\n}\n","import { InterfaceNode } from '../../types/interface';\nimport { ActionEvent } from '../../types/actions';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { LayoutRenderer } from './LayoutRenderer';\n\n// Known structural keys on InterfaceNode — everything else is a widget prop\nconst STRUCTURAL_KEYS = new Set(['type', 'id', 'layout', 'props', 'children', 'actions', 'metadata', 'isStreaming']);\n\n/**\n * Normalize a node to handle various agent output quirks:\n * 1. Props at top level instead of inside `props`\n * { type: \"text_block\", id: \"x\", content: \"Hello\" } → props: { content: \"Hello\" }\n * 2. type: \"widget\" with actual type in props.widget\n * { type: \"widget\", props: { widget: \"form\", fields: [...] } } → type: \"form\", props: { fields: [...] }\n * 3. Variant/style mismatches (style→variant)\n */\nfunction normalizeNode(n: InterfaceNode): InterfaceNode {\n let node = { ...n };\n\n // Fix type: \"widget\" with actual type in props.widget\n if (node.type === 'widget' && node.props?.widget) {\n node.type = node.props.widget;\n const { widget: _, ...rest } = node.props;\n node.props = rest;\n }\n\n // Merge top-level extra keys into props\n const explicit = node.props || {};\n const extra: Record<string, any> = {};\n for (const key of Object.keys(node)) {\n if (!STRUCTURAL_KEYS.has(key)) {\n extra[key] = (node as any)[key];\n }\n }\n node.props = { ...extra, ...explicit };\n\n // Normalize common aliases: style → variant\n if (node.props.style && !node.props.variant) {\n node.props.variant = node.props.style;\n delete node.props.style;\n }\n\n // Recursively normalize children\n if (node.children) {\n node.children = node.children.map(normalizeNode);\n }\n\n return node;\n}\n\ninterface InterfaceRendererProps {\n node: InterfaceNode;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function InterfaceRenderer({ node, onAction }: InterfaceRendererProps) {\n const renderNode = (rawNode: InterfaceNode): React.ReactNode => {\n const n = normalizeNode(rawNode);\n\n // Layouts with children\n if (n.type === 'layout' && n.layout) {\n return (\n <LayoutRenderer\n key={n.id}\n node={n}\n onAction={onAction}\n renderNode={renderNode}\n />\n );\n }\n\n // Leaf widget — delegate to WidgetRenderer\n return (\n <WidgetRenderer\n key={n.id}\n widget={{\n type: n.type,\n id: n.id,\n props: n.props || {},\n actions: n.actions,\n metadata: n.metadata,\n isStreaming: n.isStreaming,\n }}\n onAction={onAction}\n />\n );\n };\n\n return <>{renderNode(node)}</>;\n}\n","import { cn } from '../../utils/cn';\n\ninterface InterfaceSkeletonProps {\n className?: string;\n}\n\nexport function InterfaceSkeleton({ className }: InterfaceSkeletonProps) {\n return (\n <div className={cn('animate-pulse space-y-6 p-6', className)}>\n {/* Title skeleton */}\n <div className=\"h-7 bg-neutral-200 dark:bg-neutral-700 rounded w-1/3\" />\n\n {/* KPI row skeleton */}\n <div className=\"grid grid-cols-4 gap-4\">\n {[1, 2, 3, 4].map(i => (\n <div key={i} className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl p-5 space-y-2\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-2/3\" />\n <div className=\"h-8 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2\" />\n </div>\n ))}\n </div>\n\n {/* Chart + list row skeleton */}\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"col-span-2 border border-neutral-200 dark:border-neutral-700 rounded-xl p-5 space-y-3\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/4\" />\n <div className=\"h-40 bg-neutral-200 dark:bg-neutral-700 rounded\" />\n </div>\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl p-5 space-y-3\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2\" />\n {[1, 2, 3].map(i => (\n <div key={i} className=\"h-10 bg-neutral-200 dark:bg-neutral-700 rounded\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Theme initialization script that runs before React hydration\n * This prevents flickering by setting the theme before the page renders\n * Must be inlined in the HTML <head> as a blocking script\n */\n\nexport const themeScript = `\n(function() {\n try {\n // Get system preference\n const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n const colorMode = isDark ? 'dark' : 'light';\n\n // Set attributes before render\n document.documentElement.setAttribute('data-color-mode', colorMode);\n\n // Add dark class for Tailwind\n if (isDark) {\n document.documentElement.classList.add('dark');\n }\n } catch (e) {\n console.error('Failed to initialize theme:', e);\n }\n})();\n`;\n\nexport function getThemeScript() {\n return themeScript;\n}\n","import { useState, useCallback } from 'react';\nimport { InterfaceSpec, InterfaceUpdate } from '../types/interface';\nimport { findNode, applyUpdate, applyUpdates } from '../utils/interface-operations';\n\nexport function useInterfaceState(initialSpec?: InterfaceSpec | null) {\n const [spec, setSpec] = useState<InterfaceSpec | null>(initialSpec || null);\n const [isStreaming, setIsStreaming] = useState(false);\n\n const setInterface = useCallback((newSpec: InterfaceSpec) => {\n setSpec(newSpec);\n }, []);\n\n const clearInterface = useCallback(() => {\n setSpec(null);\n }, []);\n\n const applyInterfaceUpdate = useCallback((update: InterfaceUpdate) => {\n setSpec(prev => {\n if (!prev) return prev;\n return applyUpdate(prev, update);\n });\n }, []);\n\n const applyInterfaceUpdates = useCallback((updates: InterfaceUpdate[]) => {\n setSpec(prev => {\n if (!prev) return prev;\n return applyUpdates(prev, updates);\n });\n }, []);\n\n const getNode = useCallback((id: string) => {\n if (!spec) return null;\n return findNode(spec.root, id);\n }, [spec]);\n\n return {\n spec,\n isStreaming,\n setInterface,\n clearInterface,\n applyInterfaceUpdate,\n applyInterfaceUpdates,\n setIsStreaming,\n getNode,\n };\n}\n","import { useCallback, useRef } from 'react';\nimport { InterfaceSpec, InterfaceUpdate } from '../types/interface';\nimport { aptevaClient } from '../lib/apteva-client';\nimport { parseInterfaceFromText, parseUpdatesFromText } from '../utils/interface-parser';\nimport { generateInterfaceContext } from '../utils/interface-context';\n\ninterface UseInterfaceAIOptions {\n agentId: string;\n apiUrl?: string;\n apiKey?: string;\n context?: string;\n onInterface?: (spec: InterfaceSpec) => void;\n onUpdates?: (updates: InterfaceUpdate[]) => void;\n onError?: (error: Error) => void;\n onStreamStart?: () => void;\n onStreamEnd?: () => void;\n}\n\nexport function useInterfaceAI({\n agentId,\n apiUrl,\n apiKey,\n context,\n onInterface,\n onUpdates,\n onError,\n onStreamStart,\n onStreamEnd,\n}: UseInterfaceAIOptions) {\n const threadIdRef = useRef<string | null>(null);\n const accumulatedTextRef = useRef('');\n\n // Configure client if URLs provided\n if (apiUrl || apiKey) {\n aptevaClient.configure({\n ...(apiUrl && { apiUrl }),\n ...(apiKey && { apiKey }),\n });\n }\n\n const sendMessage = useCallback(async (message: string) => {\n accumulatedTextRef.current = '';\n onStreamStart?.();\n\n const systemPrompt = [\n generateInterfaceContext(),\n context || '',\n ].filter(Boolean).join('\\n\\n');\n\n try {\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message,\n thread_id: threadIdRef.current || undefined,\n stream: true,\n system: systemPrompt,\n },\n // onChunk\n (chunk) => {\n if (chunk.thread_id) {\n threadIdRef.current = chunk.thread_id;\n }\n\n if (chunk.type === 'content' || chunk.type === 'token') {\n accumulatedTextRef.current += chunk.content || '';\n\n // Try to parse interface from accumulated text\n const parsed = parseInterfaceFromText(accumulatedTextRef.current);\n if (parsed) {\n onInterface?.(parsed);\n }\n\n // Try to parse updates\n const updates = parseUpdatesFromText(accumulatedTextRef.current);\n if (updates.length > 0) {\n onUpdates?.(updates);\n }\n }\n },\n // onComplete\n () => {\n onStreamEnd?.();\n },\n // onError\n (error) => {\n onError?.(error);\n onStreamEnd?.();\n }\n );\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error('Unknown error'));\n onStreamEnd?.();\n }\n }, [agentId, context, onInterface, onUpdates, onError, onStreamStart, onStreamEnd]);\n\n return {\n sendMessage,\n threadId: threadIdRef.current,\n };\n}\n"],"mappings":"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","names":["useState","useEffect","useRef","useMemo","useCallback","useEffect","useRef","useEffect","useRef","findMatchingBracket","useEffect","jsx","jsxs","jsx","jsx","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","useState","useCallback","useRef","useEffect","jsx","jsxs","useRef","useState","useCallback","useEffect","jsx","jsxs","jsx","useEffect","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","jsx","jsxs","jsx","useRef","useEffect","useState","useRef","Fragment","jsx","jsxs","useState","useRef","useState","useRef","Fragment","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","Chat","useState","useRef","useCallback","useEffect","useMemo","threadId","useState","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","error","result","useState","jsx","jsxs","useState","useState","useEffect","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","useRef","useCallback","useEffect","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback","useEffect","threadId","useState","useCallback","useState","useCallback","useCallback","useRef","useRef","useCallback"]}
1
+ {"version":3,"sources":["../src/components/Chat/Chat.tsx","../src/components/Chat/MessageList.tsx","../src/components/Chat/Message.tsx","../src/utils/cn.ts","../src/utils/mock-data.ts","../src/utils/file-utils.ts","../src/utils/widget-parser.ts","../src/utils/widget-context.ts","../src/utils/interface-parser.ts","../src/utils/interface-context.ts","../src/utils/interface-operations.ts","../src/utils/message-converter.ts","../src/components/Widgets/Widgets.tsx","../src/components/Widgets/widget-library/Card.tsx","../src/components/Widgets/widget-library/List.tsx","../src/components/Widgets/widget-library/Button.tsx","../src/components/Widgets/widget-library/ButtonGroup.tsx","../src/components/Widgets/widget-library/Table.tsx","../src/components/Widgets/widget-library/Form.tsx","../src/components/Widgets/widget-library/Image.tsx","../src/components/Widgets/widget-library/Flow.tsx","../src/components/Widgets/widget-library/Kpi.tsx","../src/components/Widgets/widget-library/TextBlock.tsx","../src/components/Widgets/widget-library/Spacer.tsx","../src/components/Widgets/widget-library/LiveView.tsx","../src/components/Widgets/WidgetRenderer.tsx","../src/components/Widgets/WidgetSkeleton.tsx","../src/components/Chat/MarkdownContent.tsx","../src/components/Chat/ToolCall.tsx","../src/components/Chat/ToolCallGroup.tsx","../src/components/Chat/PersistentWidgetRef.tsx","../src/components/Chat/WelcomeScreen.tsx","../src/components/Chat/Composer.tsx","../src/components/Chat/CommandComposer.tsx","../src/lib/apteva-client.ts","../src/components/Chat/PersistentWidgetPanel.tsx","../src/components/Chat/CommandOutput.tsx","../src/components/Command/Command.tsx","../src/components/Prompt/Prompt.tsx","../src/components/Stream/Stream.tsx","../src/components/Threads/ThreadList.tsx","../src/components/Threads/ThreadItem.tsx","../src/components/Threads/Threads.tsx","../src/components/AutoInterface/AutoInterface.tsx","../src/components/AutoInterface/LayoutRenderer.tsx","../src/components/AutoInterface/InterfaceRenderer.tsx","../src/components/AutoInterface/InterfaceSkeleton.tsx","../src/utils/theme-script.ts","../src/hooks/useInterfaceState.ts","../src/hooks/useInterfaceAI.ts"],"sourcesContent":["import { useState, useEffect, useRef, useMemo, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { ChatProps, CommandResult } from '../../types/components';\nimport { Message as MessageType } from '../../types/messages';\nimport { MessageList } from './MessageList';\nimport { Composer } from './Composer';\nimport { CommandComposer } from './CommandComposer';\nimport { cn, generateMockResponse, generateMockCommandStream, buildMessageWithAttachments, ContentBlock, generateWidgetContext, generateCompactWidgetContext, convertApiMessages } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\nimport { ApiMessage } from '../../utils/message-converter';\nimport { Widget } from '../../types/widgets';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { MarkdownContent } from './MarkdownContent';\nimport { PersistentWidgetPanel } from './PersistentWidgetPanel';\n\nexport interface ChatHandle {\n /** Send a message programmatically (as if the user typed it) */\n sendMessage: (text: string) => Promise<void>;\n /** Send a system/background message (not shown as user message, just triggers agent) */\n sendSystemMessage: (text: string) => Promise<void>;\n /** Get current messages */\n getMessages: () => MessageType[];\n /** Clear all messages */\n clearMessages: () => void;\n}\n\nexport const Chat = forwardRef<ChatHandle, ChatProps>(function Chat({\n agentId,\n threadId,\n initialMessages = [],\n context,\n apiUrl,\n apiKey,\n useMock = false,\n // Mode switching\n initialMode = 'chat',\n showModeToggle = false,\n onModeChange,\n // Command mode options\n commandVariant = 'default',\n planMode = false,\n onPlanModeChange,\n enableStreaming = true,\n showProgress = true,\n loadingText = 'Processing...',\n // Welcome screen\n welcomeTitle,\n welcomeSubtitle,\n welcomeIcon,\n suggestedPrompts,\n welcomeVariant,\n // Events\n onThreadChange,\n onMessageSent,\n onAction,\n onFileUpload,\n onComplete,\n onError,\n onToolCall,\n onToolResult,\n // UI\n variant = 'default',\n placeholder,\n showHeader = true,\n headerTitle = 'Chat',\n onHeaderBack,\n\n // Tool call display\n toolCallStyle = 'card',\n\n // Widget detection\n enableWidgets = false,\n availableWidgets,\n compactWidgetContext = false,\n onWidgetRender,\n\n // Speech to text\n speechToText,\n\n className,\n}: ChatProps, ref: React.ForwardedRef<ChatHandle>) {\n const [messages, setMessages] = useState<MessageType[]>(initialMessages);\n const [isLoading, setIsLoading] = useState(false);\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(threadId || null);\n const [mode, setMode] = useState<'chat' | 'command'>(initialMode);\n const [chatToolName, setChatToolName] = useState<string | null>(null); // Track tool name for chat mode header\n\n // Command mode state\n const [commandState, setCommandState] = useState<'idle' | 'loading' | 'success' | 'error' | 'plan-pending'>('idle');\n const [commandResult, setCommandResult] = useState<CommandResult | null>(null);\n const [commandError, setCommandError] = useState<Error | null>(null);\n const [progress, setProgress] = useState(0);\n const [commandInput, setCommandInput] = useState('');\n const [streamedContent, setStreamedContent] = useState('');\n const [currentToolName, setCurrentToolName] = useState<string | null>(null);\n const [currentRequestId, setCurrentRequestId] = useState<string | null>(null);\n const [plan, setPlan] = useState<string>('');\n const [pendingCommand, setPendingCommand] = useState<string>('');\n const [internalPlanMode, setInternalPlanMode] = useState(planMode);\n const [showSettingsMenu, setShowSettingsMenu] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Persistent widgets: keyed by widget.id, survives across messages\n const [persistentWidgets, setPersistentWidgets] = useState<Map<string, Widget>>(new Map());\n\n // Collect persistent widgets from all messages\n const updatePersistentWidgets = useCallback((msgs: MessageType[]) => {\n setPersistentWidgets(prev => {\n const next = new Map(prev);\n let changed = false;\n for (const msg of msgs) {\n if (!msg.widgets) continue;\n for (const w of msg.widgets) {\n if (!w.persistent) continue;\n const existing = next.get(w.id);\n // Update if new or props changed\n if (!existing || existing !== w) {\n next.set(w.id, w);\n changed = true;\n }\n }\n }\n return changed ? next : prev;\n });\n }, []);\n\n // Sync persistent widgets whenever messages change\n useEffect(() => {\n updatePersistentWidgets(messages);\n }, [messages, updatePersistentWidgets]);\n\n const persistentWidgetList = useMemo(() => Array.from(persistentWidgets.values()), [persistentWidgets]);\n const persistentWidgetIds = useMemo(() => new Set(persistentWidgets.keys()), [persistentWidgets]);\n\n // Store handleSendMessage ref so we can call it from useImperativeHandle\n const handleSendMessageRef = useRef<((text: string, files?: File[], isSystem?: boolean) => Promise<void>) | null>(null);\n\n // Expose imperative methods via ref\n useImperativeHandle(ref, () => ({\n sendMessage: async (text: string) => {\n if (handleSendMessageRef.current) {\n await handleSendMessageRef.current(text);\n }\n },\n sendSystemMessage: async (text: string) => {\n if (handleSendMessageRef.current) {\n await handleSendMessageRef.current(text, undefined, true);\n }\n },\n getMessages: () => messages,\n clearMessages: () => setMessages([]),\n }), [messages]);\n\n // Generate effective context with widget definitions if enabled\n const effectiveContext = useMemo(() => {\n if (!enableWidgets) return context;\n const widgetContext = compactWidgetContext\n ? generateCompactWidgetContext(availableWidgets)\n : generateWidgetContext(availableWidgets);\n return context ? `${context}\\n${widgetContext}` : widgetContext;\n }, [context, enableWidgets, availableWidgets, compactWidgetContext]);\n\n // Configure API client if props provided\n useEffect(() => {\n if (apiUrl || apiKey) {\n aptevaClient.configure({\n ...(apiUrl && { apiUrl }),\n ...(apiKey && { apiKey }),\n });\n }\n }, [apiUrl, apiKey]);\n\n useEffect(() => {\n if (threadId) {\n onThreadChange?.(threadId);\n }\n }, [threadId, onThreadChange]);\n\n // Auto-load thread messages when threadId is provided\n // TODO: Enable when thread loading API is ready\n // useEffect(() => {\n // if (!threadId || useMock) return;\n // let cancelled = false;\n // async function loadThreadMessages() {\n // try {\n // const apiMessages = await aptevaClient.getThreadMessages(threadId!);\n // if (cancelled) return;\n // const converted = convertApiMessages(apiMessages as ApiMessage[]);\n // setMessages(converted);\n // } catch (err) {\n // console.error('[Chat] Failed to load thread messages:', err);\n // }\n // }\n // loadThreadMessages();\n // return () => { cancelled = true; };\n // }, [threadId, useMock]);\n\n // Sync internal plan mode with prop\n useEffect(() => {\n setInternalPlanMode(planMode);\n }, [planMode]);\n\n // Close settings menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (showSettingsMenu && !target.closest('.settings-menu-container')) {\n setShowSettingsMenu(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showSettingsMenu]);\n\n const handleModeChange = (newMode: 'chat' | 'command') => {\n setMode(newMode);\n onModeChange?.(newMode);\n // Reset command state when switching modes\n if (newMode === 'command') {\n setCommandState('idle');\n setCommandResult(null);\n setCommandError(null);\n }\n };\n\n const defaultPlaceholder = mode === 'chat' ? 'Type a message...' : 'Enter your command...';\n\n // Default widget action handler - sends form data as a chat message\n const handleWidgetAction = useCallback((action: import('../../types/actions').ActionEvent) => {\n // Always forward to consumer's onAction\n onAction?.(action);\n\n // Default behavior: send form submissions as chat messages\n if (action.type === 'submit' && action.payload?.formData) {\n const formData = action.payload.formData;\n const lines: string[] = [];\n for (const [key, value] of Object.entries(formData)) {\n // Skip file objects - just include file names\n if (Array.isArray(value) && value.length > 0 && value[0] instanceof File) {\n const fileNames = (value as File[]).map(f => f.name).join(', ');\n lines.push(`${key}: ${fileNames}`);\n } else if (value !== '' && value !== false && value != null) {\n lines.push(`${key}: ${value}`);\n }\n }\n if (lines.length > 0 && handleSendMessageRef.current) {\n // Collect any File objects from formData for upload\n const files: File[] = [];\n for (const value of Object.values(formData)) {\n if (Array.isArray(value) && value.length > 0 && value[0] instanceof File) {\n files.push(...(value as File[]));\n }\n }\n handleSendMessageRef.current(lines.join('\\n'), files.length > 0 ? files : undefined);\n }\n }\n }, [onAction]);\n\n // ==================== CHAT MODE LOGIC ====================\n const handleSendMessage = async (text: string, files?: File[], isSystem?: boolean) => {\n // Build display content for user message\n const hasFiles = files && files.length > 0;\n\n // Create attachment objects with previews for display\n const attachments = hasFiles ? files.map(f => ({\n name: f.name,\n type: f.type,\n size: f.size,\n preview: f.type.startsWith('image/') ? URL.createObjectURL(f) : undefined,\n })) : [];\n\n // Only add user message to UI if not a system message\n if (!isSystem) {\n const userMessage: MessageType = {\n id: `msg-${Date.now()}`,\n role: 'user',\n content: text,\n timestamp: new Date(),\n metadata: hasFiles ? { attachments } : undefined,\n };\n\n setMessages((prev) => [...prev, userMessage]);\n onMessageSent?.(userMessage);\n }\n setIsLoading(true);\n\n try {\n // Build structured message with attachments\n const messagePayload = await buildMessageWithAttachments(text, files);\n\n if (useMock) {\n const response = await generateMockResponse(1000);\n setMessages((prev) => [...prev, response]);\n } else {\n let contentSegments: Array<{ type: 'text'; content: string } | { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; inputLength?: number; result?: any; streamOutput?: string }> = [];\n let currentTextBuffer = '';\n let accumulatedWidgets: Widget[] = [];\n let responseThreadId = currentThreadId;\n const toolInputBuffers: Record<string, string> = {}; // Per-tool input buffers\n const receivingTimeouts: Record<string, ReturnType<typeof setTimeout>> = {};\n const streamingMessageId = `msg-${Date.now()}-res`; // Stable ID for entire stream\n\n const updateMessage = () => {\n const segments = [...contentSegments];\n if (currentTextBuffer) {\n const lastSegment = segments[segments.length - 1];\n if (lastSegment && lastSegment.type === 'text') {\n lastSegment.content = currentTextBuffer;\n } else {\n segments.push({ type: 'text', content: currentTextBuffer });\n }\n }\n\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n return [\n ...prev.slice(0, -1),\n {\n ...lastMessage,\n content: currentTextBuffer,\n widgets: accumulatedWidgets.length > 0 ? accumulatedWidgets : undefined,\n metadata: { ...lastMessage.metadata, content_segments: segments, isStreaming: true },\n }\n ];\n } else {\n return [\n ...prev,\n {\n id: streamingMessageId,\n role: 'assistant' as const,\n content: currentTextBuffer,\n widgets: accumulatedWidgets.length > 0 ? accumulatedWidgets : undefined,\n timestamp: new Date(),\n metadata: { content_segments: segments, isStreaming: true },\n }\n ];\n }\n });\n };\n\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: messagePayload,\n stream: true,\n ...(currentThreadId && { thread_id: currentThreadId }),\n ...(effectiveContext && { system: effectiveContext }),\n },\n (chunk) => {\n switch (chunk.type) {\n case 'thread_id':\n if (chunk.thread_id) {\n responseThreadId = chunk.thread_id;\n if (!currentThreadId) {\n setCurrentThreadId(chunk.thread_id);\n onThreadChange?.(chunk.thread_id);\n }\n }\n break;\n case 'request_id':\n if (chunk.request_id) {\n setCurrentRequestId(chunk.request_id);\n }\n break;\n case 'content':\n case 'token':\n if (chunk.content) {\n // Trim leading whitespace at start of each text segment\n // Some models emit \"\\n\\n\" as the first token\n if (!currentTextBuffer) {\n currentTextBuffer = chunk.content.trimStart();\n } else {\n currentTextBuffer += chunk.content;\n }\n if (currentTextBuffer) {\n updateMessage();\n }\n }\n break;\n case 'tool_call':\n if (chunk.tool_id && chunk.tool_name) {\n const displayName = chunk.tool_display_name || chunk.tool_name;\n if (currentTextBuffer) {\n contentSegments.push({ type: 'text', content: currentTextBuffer.trimEnd() });\n currentTextBuffer = '';\n }\n contentSegments.push({ type: 'tool', id: chunk.tool_id, name: displayName, status: 'preparing' });\n toolInputBuffers[chunk.tool_id] = ''; // Initialize per-tool buffer\n setChatToolName(displayName); // Show tool name in header\n onToolCall?.(chunk.tool_name, chunk.tool_id);\n updateMessage();\n }\n break;\n case 'tool_input_delta':\n if (chunk.tool_id && chunk.content) {\n const toolId = chunk.tool_id;\n // Initialize buffer if not exists (in case we missed tool_call)\n if (toolInputBuffers[toolId] === undefined) {\n toolInputBuffers[toolId] = '';\n }\n toolInputBuffers[toolId] += chunk.content;\n\n // Set isReceiving to true and update inputLength\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === toolId) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; inputLength?: number; result?: any } | undefined;\n if (toolSegment) {\n toolSegment.isReceiving = true;\n toolSegment.inputLength = toolInputBuffers[toolId].length;\n updateMessage();\n // Clear isReceiving after a short delay if no more chunks\n if (receivingTimeouts[toolId]) clearTimeout(receivingTimeouts[toolId]);\n receivingTimeouts[toolId] = setTimeout(() => {\n if (toolSegment.status === 'preparing') {\n toolSegment.isReceiving = false;\n updateMessage();\n }\n }, 150);\n }\n }\n break;\n case 'tool_use':\n // Tool input complete, now executing\n if (chunk.tool_id) {\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === chunk.tool_id) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; result?: any; streamOutput?: string } | undefined;\n if (toolSegment && toolSegment.status === 'preparing') {\n toolSegment.status = 'running';\n toolSegment.isReceiving = false;\n updateMessage();\n }\n }\n break;\n case 'tool_stream':\n // Handle streaming output from tool execution\n // Chunks accumulate within a group. Log/progress events mark reset for next group.\n if (chunk.tool_id) {\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === chunk.tool_id) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; streamOutput?: string; pendingReset?: boolean } | undefined;\n if (toolSegment) {\n if (chunk.event === 'chunk' && chunk.content) {\n // If pending reset, clear before accumulating new group\n if (toolSegment.pendingReset) {\n toolSegment.streamOutput = '';\n toolSegment.pendingReset = false;\n }\n // Accumulate chunk content\n toolSegment.streamOutput = (toolSegment.streamOutput || '') + chunk.content;\n updateMessage();\n } else if (chunk.event === 'log' || chunk.event === 'progress') {\n // Mark for reset on next chunk (keeps current output visible until then)\n toolSegment.pendingReset = true;\n }\n }\n }\n break;\n case 'tool_result':\n if (chunk.tool_id) {\n const toolSegment = contentSegments.find((s) => s.type === 'tool' && s.id === chunk.tool_id) as { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; result?: any } | undefined;\n if (toolSegment) {\n toolSegment.result = chunk.content;\n toolSegment.status = 'completed';\n toolSegment.isReceiving = false;\n onToolResult?.(toolSegment.name, chunk.content);\n }\n setChatToolName(null); // Clear tool name from header\n updateMessage();\n }\n break;\n case 'widget':\n if (chunk.widget) {\n accumulatedWidgets.push(chunk.widget);\n // Widget reporting happens in Message.tsx to avoid duplicates\n updateMessage();\n }\n break;\n case 'error':\n throw new Error(chunk.message || 'Stream error');\n }\n },\n (threadId) => {\n currentTextBuffer = currentTextBuffer.trimEnd();\n if (currentTextBuffer) {\n const lastSegment = contentSegments[contentSegments.length - 1];\n if (lastSegment && lastSegment.type === 'text') {\n lastSegment.content = currentTextBuffer;\n } else {\n contentSegments.push({ type: 'text', content: currentTextBuffer });\n }\n }\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n return [\n ...prev.slice(0, -1),\n {\n ...lastMessage,\n // Keep the same ID to avoid React remounting the component\n content: currentTextBuffer || 'Response received',\n widgets: accumulatedWidgets.length > 0 ? accumulatedWidgets : undefined,\n metadata: { thread_id: threadId, content_segments: contentSegments, isStreaming: false },\n }\n ];\n }\n return prev;\n });\n if (threadId && threadId !== currentThreadId) {\n setCurrentThreadId(threadId);\n onThreadChange?.(threadId);\n }\n setIsLoading(false);\n setCurrentRequestId(null);\n setChatToolName(null);\n },\n (error) => {\n const errorMessage: MessageType = {\n id: `msg-${Date.now()}-error`,\n role: 'assistant',\n content: `Error: ${error.message}`,\n timestamp: new Date(),\n metadata: { error: true },\n };\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.id.includes('streaming')) {\n return [...prev.slice(0, -1), errorMessage];\n }\n return [...prev, errorMessage];\n });\n setIsLoading(false);\n setCurrentRequestId(null);\n setChatToolName(null);\n onError?.(error);\n }\n );\n }\n } catch (error) {\n const errorMessage: MessageType = {\n id: `msg-${Date.now()}-error`,\n role: 'assistant',\n content: error instanceof Error ? `Error: ${error.message}` : 'An error occurred',\n timestamp: new Date(),\n metadata: { error: true },\n };\n setMessages((prev) => [...prev, errorMessage]);\n onError?.(error instanceof Error ? error : new Error('Unknown error'));\n } finally {\n setIsLoading(false);\n }\n };\n\n // Assign to ref so useImperativeHandle can call it\n handleSendMessageRef.current = handleSendMessage;\n\n // ==================== COMMAND MODE LOGIC ====================\n const executeCommand = async (commandOverride?: string, files?: File[]) => {\n const currentCommand = commandOverride || commandInput;\n if (!currentCommand.trim() && (!files || files.length === 0)) {\n setCommandError(new Error('Please enter a command'));\n setCommandState('error');\n return;\n }\n\n // Plan mode: show plan first\n if (internalPlanMode && commandState !== 'plan-pending') {\n setCommandState('loading');\n setCommandError(null);\n setCommandInput('');\n\n if (useMock) {\n setTimeout(() => {\n const mockPlan = `1. Analyze the request: \"${currentCommand}\"\\n2. Process the data\\n3. Generate response\\n4. Return results`;\n setPlan(mockPlan);\n setPendingCommand(currentCommand);\n setCommandState('plan-pending');\n }, 800);\n } else {\n try {\n const planningInstruction = `CRITICAL PLANNING MODE: You are ONLY creating a plan. Write a numbered list of steps describing what WOULD be done. DO NOT execute anything.`;\n const systemMessage = effectiveContext ? `${effectiveContext}\\n\\n${planningInstruction}` : planningInstruction;\n\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: currentCommand,\n stream: false,\n system: systemMessage,\n });\n setPlan(response.message);\n setPendingCommand(currentCommand);\n setCommandState('plan-pending');\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to generate plan');\n setCommandError(error);\n setCommandState('error');\n onError?.(error);\n }\n }\n return;\n }\n\n setCommandState('loading');\n setCommandError(null);\n setProgress(0);\n setStreamedContent('');\n setCommandInput('');\n\n try {\n if (useMock) {\n if (enableStreaming) {\n let accumulatedContent = '';\n generateMockCommandStream(\n currentCommand,\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n }\n },\n (threadId) => {\n const result: CommandResult = {\n success: true,\n data: { summary: accumulatedContent, thread_id: threadId },\n message: accumulatedContent || 'Command executed successfully',\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n onComplete?.(result);\n },\n (error) => {\n setCommandError(error);\n setCommandState('error');\n onError?.(error);\n }\n );\n } else {\n await new Promise(resolve => setTimeout(resolve, 1500));\n const result: CommandResult = {\n success: true,\n data: { summary: `Executed: ${currentCommand}` },\n message: `Command executed successfully`,\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n onComplete?.(result);\n }\n } else {\n // Real API\n const commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute the command immediately. Make reasonable assumptions based on context. Use sensible defaults for missing details. DO NOT ask questions unless something is truly impossible without user input (e.g., missing required password). State what you\\'re doing or the result. Examples: \"Analyzing customer data from last quarter...\" or \"Created 5 new database entries successfully\" or \"Search complete: found 12 matching results\". NO greetings, NO filler words, NO clarification requests. Action/result only.';\n const systemMessage = effectiveContext ? `${effectiveContext}\\n\\n${commandInstruction}` : commandInstruction;\n\n // Build message with attachments if files provided\n const messagePayload = files && files.length > 0\n ? await buildMessageWithAttachments(currentCommand, files)\n : currentCommand;\n\n if (enableStreaming) {\n let accumulatedContent = '';\n let lastToolName = '';\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: messagePayload,\n stream: true,\n ...(currentThreadId && { thread_id: currentThreadId }),\n system: systemMessage,\n },\n (chunk) => {\n if ((chunk.type === 'token' || chunk.type === 'content') && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n setCurrentToolName(null); // Clear tool name when we get content\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n } else if (chunk.type === 'tool_call' && chunk.tool_name) {\n const displayName = chunk.tool_display_name || chunk.tool_name;\n lastToolName = chunk.tool_name;\n setCurrentToolName(displayName);\n onToolCall?.(chunk.tool_name, chunk.tool_id || '');\n // Reset for display - show only tool, not accumulated text\n accumulatedContent = '';\n setStreamedContent('');\n } else if (chunk.type === 'tool_result') {\n onToolResult?.(lastToolName, chunk.content);\n setCurrentToolName(null); // Tool finished, will show next content\n } else if (chunk.type === 'thread_id' && chunk.thread_id) {\n if (!currentThreadId) {\n setCurrentThreadId(chunk.thread_id);\n onThreadChange?.(chunk.thread_id);\n }\n } else if (chunk.type === 'request_id' && chunk.request_id) {\n setCurrentRequestId(chunk.request_id);\n }\n },\n (threadId) => {\n const result: CommandResult = {\n success: true,\n data: { summary: accumulatedContent, thread_id: threadId },\n message: accumulatedContent || 'Command executed successfully',\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n setCurrentRequestId(null);\n onComplete?.(result);\n },\n (error) => {\n setCommandError(error);\n setCommandState('error');\n setCurrentRequestId(null);\n onError?.(error);\n }\n );\n } else {\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: messagePayload,\n stream: false,\n ...(currentThreadId && { thread_id: currentThreadId }),\n system: systemMessage,\n });\n const result: CommandResult = {\n success: true,\n data: { summary: response.message, thread_id: response.thread_id },\n widgets: response.widgets,\n message: response.message,\n };\n setCommandResult(result);\n setCommandState('success');\n setProgress(100);\n onComplete?.(result);\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setCommandError(error);\n setCommandState('error');\n onError?.(error);\n }\n };\n\n const resetCommand = () => {\n setCommandState('idle');\n setCommandResult(null);\n setCommandError(null);\n setProgress(0);\n setCommandInput('');\n setPlan('');\n setPendingCommand('');\n setStreamedContent('');\n setCurrentToolName(null);\n };\n\n const approvePlan = () => {\n const planToExecute = plan;\n setPlan('');\n setPendingCommand('');\n const executionMessage = `Execute this plan now:\\n\\n${planToExecute}`;\n executeCommand(executionMessage);\n };\n\n const rejectPlan = () => {\n setCommandInput(pendingCommand);\n setPlan('');\n setPendingCommand('');\n setCommandState('idle');\n };\n\n // Stop generation handler\n const handleStop = async () => {\n // Call cancel API if we have a request ID\n if (currentRequestId && agentId) {\n try {\n await aptevaClient.cancelRequest(agentId, currentRequestId);\n } catch (error) {\n console.error('Failed to cancel request:', error);\n }\n }\n\n // For chat mode\n setIsLoading(false);\n // For command mode\n if (commandState === 'loading') {\n setCommandState('idle');\n setStreamedContent('');\n setCurrentToolName(null);\n setProgress(0);\n }\n // Clear request ID\n setCurrentRequestId(null);\n };\n\n const isCompact = commandVariant === 'compact';\n\n // ==================== RENDER ====================\n return (\n <div className={cn('apteva-chat flex flex-col h-full', variant !== 'default' && `apteva-chat-${variant}`, className)}>\n {/* Header - only show in chat mode when showHeader is true */}\n {showHeader && mode === 'chat' && (\n <div className=\"apteva-chat-header px-4 py-3\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n {onHeaderBack && (\n <button onClick={onHeaderBack} className=\"apteva-chat-back\" style={{ flexShrink: 0 }}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M10 12L6 8l4-4\"/></svg>\n </button>\n )}\n <div>\n <div className=\"apteva-chat-title\">{headerTitle}</div>\n <div className={cn(\n \"apteva-chat-status\",\n isLoading\n ? chatToolName\n ? \"apteva-chat-status-tool\"\n : \"apteva-chat-status-thinking\"\n : \"apteva-chat-status-ready\"\n )}>\n {isLoading\n ? chatToolName\n ? `Using ${chatToolName}...`\n : 'Thinking...'\n : 'Ready'}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* CHAT MODE */}\n {mode === 'chat' && (\n <>\n {persistentWidgetList.length > 0 && (\n <PersistentWidgetPanel widgets={persistentWidgetList} onAction={handleWidgetAction} />\n )}\n <MessageList\n messages={messages}\n onAction={handleWidgetAction}\n welcomeTitle={welcomeTitle}\n welcomeSubtitle={welcomeSubtitle}\n welcomeIcon={welcomeIcon}\n suggestedPrompts={suggestedPrompts}\n welcomeVariant={welcomeVariant}\n chatVariant={variant}\n onPromptClick={(prompt) => handleSendMessage(prompt)}\n enableWidgets={enableWidgets}\n onWidgetRender={onWidgetRender}\n persistentWidgetIds={persistentWidgetIds}\n toolCallStyle={toolCallStyle}\n />\n <Composer\n onSendMessage={handleSendMessage}\n placeholder={placeholder || defaultPlaceholder}\n disabled={isLoading}\n isLoading={isLoading}\n onStop={handleStop}\n onFileUpload={onFileUpload}\n onSwitchMode={showModeToggle ? () => handleModeChange('command') : undefined}\n speechToText={speechToText}\n />\n </>\n )}\n\n {/* COMMAND MODE - Self-contained composer with inline response */}\n {mode === 'command' && (\n <div className=\"w-full\">\n <CommandComposer\n onExecute={(text, files) => {\n setCommandInput(text);\n executeCommand(text, files);\n }}\n state={commandState}\n response={commandResult?.data?.summary || commandResult?.message}\n error={commandError?.message}\n plan={plan}\n streamedContent={streamedContent}\n toolName={currentToolName}\n onApprove={approvePlan}\n onReject={rejectPlan}\n onReset={resetCommand}\n onStop={handleStop}\n onExpand={showModeToggle ? () => handleModeChange('chat') : undefined}\n placeholder={placeholder || 'Enter your command...'}\n />\n </div>\n )}\n\n <style dangerouslySetInnerHTML={{\n __html: `\n @keyframes pulse-border {\n 0%, 100% { border-color: rgb(59, 130, 246); }\n 50% { border-color: rgb(147, 197, 253); }\n }\n .animate-pulse-border {\n animation: pulse-border 2s ease-in-out infinite;\n }\n .apteva-composer {\n border-radius: var(--apteva-border-radius, 1rem) !important;\n }\n `\n }} />\n </div>\n );\n});\n","import { useEffect, useRef } from 'react';\nimport { Message as MessageType } from '../../types/messages';\nimport { SuggestedPrompt } from '../../types/components';\nimport { Widget } from '../../types/widgets';\nimport { Message } from './Message';\nimport { WelcomeScreen } from './WelcomeScreen';\nimport { ActionEvent } from '../../types/actions';\n\ninterface MessageListProps {\n messages: MessageType[];\n onAction?: (action: ActionEvent) => void;\n // Welcome screen props\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeIcon?: React.ReactNode;\n suggestedPrompts?: (string | SuggestedPrompt)[];\n welcomeVariant?: 'centered' | 'minimal';\n chatVariant?: 'default' | 'minimal' | 'terminal';\n onPromptClick?: (prompt: string) => void;\n // Widget detection\n enableWidgets?: boolean;\n onWidgetRender?: (widget: Widget) => void;\n // Persistent widgets (rendered in panel, show reference card in messages)\n persistentWidgetIds?: Set<string>;\n // Tool call display style\n toolCallStyle?: 'card' | 'inline';\n}\n\nexport function MessageList({\n messages,\n onAction,\n welcomeTitle,\n welcomeSubtitle,\n welcomeIcon,\n suggestedPrompts,\n welcomeVariant,\n chatVariant,\n onPromptClick,\n enableWidgets,\n onWidgetRender,\n persistentWidgetIds,\n toolCallStyle,\n}: MessageListProps) {\n const listRef = useRef<HTMLDivElement>(null);\n const isNearBottomRef = useRef(true);\n const lastScrollHeightRef = useRef(0);\n\n // Track if user is near bottom\n const handleScroll = () => {\n if (listRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = listRef.current;\n // Consider \"near bottom\" if within 100px of the bottom\n isNearBottomRef.current = scrollHeight - scrollTop - clientHeight < 100;\n }\n };\n\n useEffect(() => {\n // Only auto-scroll if user is near bottom\n if (listRef.current && isNearBottomRef.current) {\n const currentScrollHeight = listRef.current.scrollHeight;\n // Only scroll if content height actually changed\n if (currentScrollHeight !== lastScrollHeightRef.current) {\n listRef.current.scrollTop = currentScrollHeight;\n lastScrollHeightRef.current = currentScrollHeight;\n }\n }\n }, [messages]);\n\n return (\n <div ref={listRef} className=\"apteva-message-list apteva-scrollbar-hidden\" onScroll={handleScroll}>\n {messages.length === 0 ? (\n <WelcomeScreen\n title={welcomeTitle}\n subtitle={welcomeSubtitle}\n icon={welcomeIcon}\n prompts={suggestedPrompts}\n variant={welcomeVariant}\n chatVariant={chatVariant}\n onPromptClick={onPromptClick || (() => {})}\n />\n ) : (\n messages.map((message) => (\n <div key={message.id} className={message.role === 'user' ? 'apteva-message-row-user' : 'apteva-message-row-assistant'}>\n <Message message={message} onAction={onAction} enableWidgets={enableWidgets} onWidgetRender={onWidgetRender} persistentWidgetIds={persistentWidgetIds} toolCallStyle={toolCallStyle} />\n </div>\n ))\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useMemo } from 'react';\nimport { Message as MessageType } from '../../types/messages';\nimport { Widget } from '../../types/widgets';\nimport { cn, parseWidgetsFromText, formatFileSize } from '../../utils';\nimport { Widgets } from '../Widgets';\nimport { ActionEvent } from '../../types/actions';\nimport { MarkdownContent } from './MarkdownContent';\nimport { ToolCall } from './ToolCall';\nimport { ToolCallGroup } from './ToolCallGroup';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { WidgetSkeleton } from '../Widgets/WidgetSkeleton';\nimport { PersistentWidgetRef } from './PersistentWidgetRef';\n\ninterface Attachment {\n name: string;\n type: string;\n size: number;\n preview?: string;\n}\n\ntype ContentSegment =\n | { type: 'text'; content: string }\n | { type: 'tool'; id: string; name: string; status?: 'preparing' | 'running' | 'completed' | 'error'; isReceiving?: boolean; inputLength?: number; result?: any; streamOutput?: string };\n\ninterface MessageProps {\n message: MessageType;\n onAction?: (action: ActionEvent) => void;\n enableWidgets?: boolean;\n onWidgetRender?: (widget: Widget) => void;\n persistentWidgetIds?: Set<string>;\n toolCallStyle?: 'card' | 'inline';\n}\n\nexport function Message({ message, onAction, enableWidgets, onWidgetRender, persistentWidgetIds, toolCallStyle = 'card' }: MessageProps) {\n const isUser = message.role === 'user';\n const contentSegments = message.metadata?.content_segments as ContentSegment[] | undefined;\n const isStreaming = message.metadata?.isStreaming === true;\n const hasContent = message.content || (contentSegments && contentSegments.length > 0);\n\n // Track which widgets we've already reported to avoid duplicates\n const reportedWidgetsRef = useRef<Set<string>>(new Set());\n\n // Parse widgets from content (memoized to avoid reparsing on every render)\n const parsedWidgets = useMemo(() => {\n if (!enableWidgets || isUser || !message.content) {\n return [];\n }\n const parsed = parseWidgetsFromText(message.content);\n return parsed.segments\n .filter((seg): seg is { type: 'widget'; widget: Widget } => seg.type === 'widget' && !!seg.widget)\n .map(seg => seg.widget);\n }, [enableWidgets, isUser, message.content]);\n\n // Report message.widgets when they change\n useEffect(() => {\n if (onWidgetRender && message.widgets) {\n for (const widget of message.widgets) {\n if (!reportedWidgetsRef.current.has(widget.id)) {\n reportedWidgetsRef.current.add(widget.id);\n onWidgetRender(widget);\n }\n }\n }\n }, [message.widgets, onWidgetRender]);\n\n // Report parsed widgets from text content (after render)\n useEffect(() => {\n if (onWidgetRender && parsedWidgets.length > 0) {\n for (const widget of parsedWidgets) {\n if (!reportedWidgetsRef.current.has(widget.id)) {\n reportedWidgetsRef.current.add(widget.id);\n onWidgetRender(widget);\n }\n }\n }\n }, [parsedWidgets, onWidgetRender]);\n\n // Render text content (markdown only, no widgets - widgets rendered separately)\n const renderTextContent = (text: string) => {\n if (!enableWidgets || isUser) {\n return <MarkdownContent content={text} />;\n }\n\n // Parse to get cleaned text (strips @ui: patterns)\n const parsed = parseWidgetsFromText(text);\n\n // Combine all text segments\n const cleanedText = parsed.segments\n .filter(seg => seg.type === 'text' && seg.content)\n .map(seg => seg.content)\n .join('');\n\n if (!cleanedText.trim()) {\n return null;\n }\n\n return <MarkdownContent content={cleanedText} />;\n };\n\n // Render content with widgets as separate elements (like tool calls)\n const renderContentWithWidgets = () => {\n if (!enableWidgets || isUser || !message.content) {\n return null;\n }\n\n const parsed = parseWidgetsFromText(message.content);\n const elements: React.ReactNode[] = [];\n let textBuffer = '';\n\n parsed.segments.forEach((segment, index) => {\n if (segment.type === 'text' && segment.content) {\n textBuffer += segment.content;\n } else if (segment.type === 'widget' && segment.widget) {\n // Flush text buffer as a bubble\n if (textBuffer.trim()) {\n elements.push(\n <div key={`text-${index}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n // Render widget standalone\n elements.push(\n <div key={`widget-${index}`} className=\"apteva-widget-standalone\">\n <WidgetRenderer widget={segment.widget} onAction={onAction} />\n </div>\n );\n } else if (segment.type === 'widget_pending' && segment.pendingType) {\n // Flush text buffer as a bubble\n if (textBuffer.trim()) {\n elements.push(\n <div key={`text-${index}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n // Render skeleton standalone\n elements.push(\n <div key={`pending-${index}`} className=\"apteva-widget-standalone\">\n <WidgetSkeleton type={segment.pendingType} />\n </div>\n );\n }\n });\n\n // Flush remaining text\n if (textBuffer.trim()) {\n elements.push(\n <div key=\"text-final\" className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n }\n\n return elements.length > 0 ? elements : null;\n };\n\n // Get attachments from metadata\n const attachments = (message.metadata?.attachments as Attachment[] | undefined) || [];\n const hasAttachments = attachments.length > 0;\n\n // Render attachments for user messages\n const renderAttachments = () => {\n if (!hasAttachments) return null;\n\n return (\n <div className=\"apteva-message-attachments flex flex-wrap gap-2 mb-2 justify-end\">\n {attachments.map((att, index) => {\n const isImage = att.type.startsWith('image/');\n const isPdf = att.type === 'application/pdf';\n\n if (isImage && att.preview) {\n return (\n <div key={index} className=\"apteva-attachment-image relative rounded-lg overflow-hidden shadow-sm\">\n <img\n src={att.preview}\n alt={att.name}\n className=\"max-w-[150px] max-h-[150px] object-cover\"\n />\n </div>\n );\n }\n\n // PDF and other documents\n return (\n <div\n key={index}\n className=\"apteva-attachment-doc flex items-center gap-3 px-4 py-3 bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-xl shadow-sm\"\n >\n <div className=\"w-10 h-10 flex items-center justify-center bg-red-100 dark:bg-red-900/30 rounded-lg text-red-600 dark:text-red-400\">\n {isPdf ? (\n <svg className=\"w-5 h-5\" 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 <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium text-neutral-800 dark:text-neutral-200 truncate max-w-[180px]\">\n {att.name}\n </span>\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {isPdf ? 'PDF' : 'Document'} · {formatFileSize(att.size)}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n };\n\n // Render content with inline tool calls\n const renderContent = () => {\n if (isUser) {\n return <div className=\"apteva-message-text\">{message.content}</div>;\n }\n\n // Show typing indicator for streaming messages without content\n if (isStreaming && !hasContent) {\n return (\n <div className=\"apteva-typing-indicator\">\n <span></span>\n <span></span>\n <span></span>\n </div>\n );\n }\n\n // If we have content segments, render them in order\n // This is handled differently - returns array of elements for split bubbles\n if (contentSegments && contentSegments.length > 0) {\n return null; // Handled by renderSegmentedContent\n }\n\n // Fallback to just content\n return renderTextContent(message.content);\n };\n\n // Render text segment with widgets separated out\n const renderTextSegmentWithWidgets = (text: string, keyPrefix: string) => {\n if (!enableWidgets) {\n return (\n <div key={keyPrefix} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={text} />\n </div>\n </div>\n );\n }\n\n const parsed = parseWidgetsFromText(text);\n const elements: React.ReactNode[] = [];\n let textBuffer = '';\n\n parsed.segments.forEach((seg, idx) => {\n if (seg.type === 'text' && seg.content) {\n textBuffer += seg.content;\n } else if (seg.type === 'widget' && seg.widget) {\n if (textBuffer.trim()) {\n elements.push(\n <div key={`${keyPrefix}-text-${idx}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n elements.push(\n <div key={`${keyPrefix}-widget-${idx}`} className=\"apteva-widget-standalone\">\n <WidgetRenderer widget={seg.widget} onAction={onAction} />\n </div>\n );\n } else if (seg.type === 'widget_pending' && seg.pendingType) {\n if (textBuffer.trim()) {\n elements.push(\n <div key={`${keyPrefix}-text-${idx}`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n textBuffer = '';\n }\n elements.push(\n <div key={`${keyPrefix}-pending-${idx}`} className=\"apteva-widget-standalone\">\n <WidgetSkeleton type={seg.pendingType} />\n </div>\n );\n }\n });\n\n if (textBuffer.trim()) {\n elements.push(\n <div key={`${keyPrefix}-text-final`} className=\"apteva-message-bubble apteva-message-assistant\">\n <div className=\"apteva-message-content-assistant\">\n <MarkdownContent content={textBuffer} />\n </div>\n </div>\n );\n }\n\n return elements;\n };\n\n // Render segmented content with separate bubbles for text and tool calls outside bubbles\n const renderSegmentedContent = () => {\n if (!contentSegments || contentSegments.length === 0) {\n return null;\n }\n\n // Group consecutive tool segments into runs\n const groups: Array<\n | { type: 'text'; content: string; index: number }\n | { type: 'tools'; tools: ContentSegment[] }\n > = [];\n\n let currentToolRun: ContentSegment[] = [];\n\n const flushToolRun = () => {\n if (currentToolRun.length > 0) {\n groups.push({ type: 'tools', tools: [...currentToolRun] });\n currentToolRun = [];\n }\n };\n\n contentSegments.forEach((segment, index) => {\n if (segment.type === 'tool') {\n currentToolRun.push(segment);\n } else {\n flushToolRun();\n if (segment.type === 'text' && segment.content) {\n groups.push({ type: 'text', content: segment.content, index });\n }\n }\n });\n flushToolRun();\n\n const elements: React.ReactNode[] = [];\n\n groups.forEach((group, groupIndex) => {\n if (group.type === 'text') {\n const textElements = renderTextSegmentWithWidgets(group.content, `seg-${group.index}`);\n if (Array.isArray(textElements)) {\n elements.push(...textElements);\n } else {\n elements.push(textElements);\n }\n } else if (group.type === 'tools') {\n if (toolCallStyle === 'inline') {\n // Inline mode: render each tool as a simple divider line\n group.tools.forEach(segment => {\n if (segment.type === 'tool') {\n elements.push(\n <div key={segment.id} className=\"apteva-tool-call-standalone\">\n <ToolCall\n name={segment.name}\n status={segment.status || (segment.result !== undefined ? 'completed' : 'running')}\n isReceiving={segment.isReceiving}\n inputLength={segment.inputLength}\n streamOutput={segment.streamOutput}\n variant=\"inline\"\n />\n </div>\n );\n }\n });\n } else if (group.tools.length >= 3) {\n // Render as compact group\n const toolData = group.tools.map(t => {\n const tool = t as Extract<ContentSegment, { type: 'tool' }>;\n return {\n id: tool.id,\n name: tool.name,\n status: tool.status || (tool.result !== undefined ? 'completed' as const : 'running' as const),\n isReceiving: tool.isReceiving,\n streamOutput: tool.streamOutput,\n };\n });\n elements.push(\n <div key={`tool-group-${groupIndex}`} className=\"apteva-tool-call-standalone\">\n <ToolCallGroup tools={toolData} />\n </div>\n );\n } else {\n // Render individually (1-2 tools)\n group.tools.forEach(segment => {\n if (segment.type === 'tool') {\n elements.push(\n <div key={segment.id} className=\"apteva-tool-call-standalone\">\n <ToolCall\n name={segment.name}\n status={segment.status || (segment.result !== undefined ? 'completed' : 'running')}\n isReceiving={segment.isReceiving}\n inputLength={segment.inputLength}\n streamOutput={segment.streamOutput}\n />\n </div>\n );\n }\n });\n }\n }\n });\n\n return elements;\n };\n\n // Render message widgets, showing reference cards for persistent ones\n const renderMessageWidgets = () => {\n if (!message.widgets || message.widgets.length === 0) return null;\n\n const inlineWidgets = message.widgets.filter(w => !persistentWidgetIds?.has(w.id));\n const persistentRefs = message.widgets.filter(w => persistentWidgetIds?.has(w.id));\n\n return (\n <>\n {persistentRefs.map(w => (\n <div key={`ref-${w.id}`} className=\"apteva-widget-standalone\">\n <PersistentWidgetRef widget={w} />\n </div>\n ))}\n {inlineWidgets.length > 0 && (\n <div className=\"apteva-widget-standalone\">\n <Widgets widgets={inlineWidgets} onAction={onAction} layout=\"stack\" />\n </div>\n )}\n </>\n );\n };\n\n // For assistant messages with content segments (tool calls) or streaming, render as separate bubbles\n // Using segmented layout during streaming prevents layout jump when tool calls appear\n if (!isUser && (contentSegments && contentSegments.length > 0)) {\n return (\n <div className=\"apteva-message-segmented\">\n {renderSegmentedContent()}\n {renderMessageWidgets()}\n\n <div className=\"apteva-message-timestamp apteva-message-timestamp-assistant\" suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n }\n\n // For assistant messages with widgets in content, render with separate bubbles\n const widgetContent = renderContentWithWidgets();\n if (!isUser && enableWidgets && widgetContent) {\n return (\n <div className=\"apteva-message-segmented\">\n {widgetContent}\n {renderMessageWidgets()}\n\n <div className=\"apteva-message-timestamp apteva-message-timestamp-assistant\" suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n }\n\n // For user messages with attachments, render attachments outside bubble (like Claude/ChatGPT)\n if (isUser && hasAttachments) {\n return (\n <div className=\"apteva-message-segmented apteva-message-user-with-attachments flex flex-col items-end\">\n {renderAttachments()}\n\n {message.content && (\n <div className=\"apteva-message-bubble apteva-message-user\">\n <div className=\"apteva-message-content-user\">\n <div className=\"apteva-message-text\">{message.content}</div>\n </div>\n </div>\n )}\n\n <div className=\"apteva-message-timestamp apteva-message-timestamp-user\" suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'apteva-message-bubble',\n isUser ? 'apteva-message-user' : 'apteva-message-assistant'\n )}\n >\n <div className={isUser ? 'apteva-message-content-user' : 'apteva-message-content-assistant'}>\n {renderContent()}\n </div>\n\n {renderMessageWidgets()}\n\n <div className={cn('apteva-message-timestamp', isUser ? 'apteva-message-timestamp-user' : 'apteva-message-timestamp-assistant')} suppressHydrationWarning>\n {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { Message, Thread } from '../types/messages';\nimport { Widget } from '../types/widgets';\n\nexport const mockMessages: Message[] = [\n {\n id: 'msg-1',\n role: 'assistant',\n content: 'Hello! I\\'m your AI assistant. How can I help you today?',\n timestamp: new Date(Date.now() - 3600000),\n },\n {\n id: 'msg-2',\n role: 'user',\n content: 'I want to plan a trip to Europe',\n timestamp: new Date(Date.now() - 3500000),\n },\n {\n id: 'msg-3',\n role: 'assistant',\n content: 'Great choice! Europe has amazing destinations. What\\'s your budget and how many days do you have?',\n timestamp: new Date(Date.now() - 3400000),\n },\n {\n id: 'msg-4',\n role: 'user',\n content: 'Around $2000 for 5 days',\n timestamp: new Date(Date.now() - 3300000),\n },\n {\n id: 'msg-5',\n role: 'assistant',\n content: 'Perfect! I found some great destinations that fit your budget:',\n widgets: [\n {\n type: 'list',\n id: 'destinations-1',\n props: {\n items: [\n {\n id: 'paris',\n title: 'Paris, France',\n subtitle: '5 days • $1,850',\n description: 'The City of Light with iconic landmarks',\n metadata: { city: 'Paris', country: 'France', lat: 48.8566, lng: 2.3522, price: 1850, days: 5 },\n },\n {\n id: 'rome',\n title: 'Rome, Italy',\n subtitle: '5 days • $1,650',\n description: 'Ancient history meets modern culture',\n metadata: { city: 'Rome', country: 'Italy', lat: 41.9028, lng: 12.4964, price: 1650, days: 5 },\n },\n {\n id: 'barcelona',\n title: 'Barcelona, Spain',\n subtitle: '5 days • $1,450',\n description: 'Beautiful beaches and Gaudí architecture',\n metadata: { city: 'Barcelona', country: 'Spain', lat: 41.3851, lng: 2.1734, price: 1450, days: 5 },\n },\n ],\n },\n actions: [\n {\n type: 'select_destination',\n label: 'Select',\n handler: 'client',\n payload: {},\n },\n {\n type: 'view_details',\n label: 'Details',\n handler: 'server',\n payload: {},\n },\n ],\n },\n ],\n timestamp: new Date(Date.now() - 3200000),\n },\n];\n\nexport const mockThreads: Thread[] = [\n {\n id: 'thread-1',\n title: 'Trip to Europe',\n preview: 'Planning a 5-day trip...',\n createdAt: new Date(Date.now() - 86400000),\n updatedAt: new Date(Date.now() - 3600000),\n messageCount: 12,\n },\n {\n id: 'thread-2',\n title: 'Restaurant Recommendations',\n preview: 'Looking for good places...',\n createdAt: new Date(Date.now() - 172800000),\n updatedAt: new Date(Date.now() - 86400000),\n messageCount: 8,\n },\n {\n id: 'thread-3',\n title: 'Budget Planning',\n preview: 'Help with monthly budget',\n createdAt: new Date(Date.now() - 259200000),\n updatedAt: new Date(Date.now() - 172800000),\n messageCount: 15,\n },\n];\n\nexport const mockWidgets: Widget[] = [\n {\n type: 'card',\n id: 'card-1',\n props: {\n title: 'Paris, France',\n description: '5-day adventure in the City of Light',\n image: 'https://images.unsplash.com/photo-1502602898657-3e91760cbb34',\n footer: 'Total: $1,850',\n },\n actions: [\n {\n type: 'book_trip',\n label: 'Book Now',\n handler: 'client',\n payload: { tripId: 'trip-paris' },\n },\n ],\n },\n {\n type: 'card',\n id: 'card-2',\n props: {\n title: 'Rome, Italy',\n description: 'Explore ancient wonders',\n image: 'https://images.unsplash.com/photo-1552832230-c0197dd311b5',\n footer: 'Total: $1,650',\n },\n actions: [\n {\n type: 'book_trip',\n label: 'Book Now',\n handler: 'client',\n payload: { tripId: 'trip-rome' },\n },\n ],\n },\n];\n\nexport function generateMockResponse(delay: number = 1000): Promise<Message> {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({\n id: `msg-${Date.now()}`,\n role: 'assistant',\n content: 'This is a mock response. In production, this would come from your AI agent API.',\n timestamp: new Date(),\n });\n }, delay);\n });\n}\n\nexport function generateMockStreamingResponse(\n text: string,\n onChunk: (chunk: string) => void,\n typingSpeed: number = 30\n): Promise<void> {\n return new Promise((resolve) => {\n const words = text.split(' ');\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n if (currentIndex < words.length) {\n onChunk(words[currentIndex] + ' ');\n currentIndex++;\n } else {\n clearInterval(interval);\n resolve();\n }\n }, typingSpeed);\n });\n}\n\n// Generate mock plan based on command content\nexport function generateMockPlan(command: string): string {\n const lowerCommand = command.toLowerCase();\n\n if (lowerCommand.includes('analyze') || lowerCommand.includes('analysis')) {\n return `**Plan:**\\n\\n1. Fetch data from the analytics database\\n2. Apply filters and aggregations\\n3. Calculate key metrics and trends\\n4. Generate visualization data\\n5. Compile insights and recommendations`;\n }\n\n if (lowerCommand.includes('sales') || lowerCommand.includes('revenue')) {\n return `**Plan:**\\n\\n1. Query sales records for the specified period\\n2. Calculate total revenue and growth rates\\n3. Break down performance by product category\\n4. Analyze regional distribution\\n5. Present findings in charts and summary`;\n }\n\n if (lowerCommand.includes('report') || lowerCommand.includes('summary')) {\n return `**Plan:**\\n\\n1. Gather data from all relevant sources\\n2. Aggregate metrics across categories\\n3. Identify key trends and anomalies\\n4. Generate executive summary\\n5. Create detailed breakdowns with visualizations`;\n }\n\n if (lowerCommand.includes('customer') || lowerCommand.includes('user')) {\n return `**Plan:**\\n\\n1. Pull customer data from CRM\\n2. Calculate engagement metrics\\n3. Segment users by behavior patterns\\n4. Analyze satisfaction scores\\n5. Generate customer insights report`;\n }\n\n if (lowerCommand.includes('task') || lowerCommand.includes('todo') || lowerCommand.includes('work') || lowerCommand.includes('completed')) {\n return `**Plan:**\\n\\n1. Retrieve task records from the database\\n2. Filter by status and date range\\n3. Organize by priority and category\\n4. Calculate completion metrics\\n5. Display in interactive list format`;\n }\n\n // Default plan\n return `**Plan:**\\n\\n1. Parse and understand the command requirements\\n2. Gather necessary data from available sources\\n3. Process and analyze the information\\n4. Format results for optimal presentation\\n5. Return response with any relevant visualizations`;\n}\n\n// Generate mock command response based on command content\nexport function generateMockCommandResponse(command: string): string {\n const lowerCommand = command.toLowerCase();\n\n if (lowerCommand.includes('analyze') || lowerCommand.includes('analysis')) {\n return `Analysis complete for \"${command}\". Found 247 records with an average value of $1,234. The data shows a 23% increase compared to last quarter. Key insights: Revenue is up, customer satisfaction improved by 15%, and operational costs decreased by 8%.`;\n }\n\n if (lowerCommand.includes('sales') || lowerCommand.includes('revenue')) {\n return `Sales data processed: Q4 2024 revenue reached $2.4M, representing 18% growth year-over-year. Top performing products: Enterprise Plan (+45%), Pro Plan (+32%), Basic Plan (+12%). Regional breakdown: North America (52%), Europe (31%), APAC (17%).`;\n }\n\n if (lowerCommand.includes('report') || lowerCommand.includes('summary')) {\n return `Report generated successfully. Executive Summary: Overall performance exceeded targets by 12%. Marketing ROI improved to 3.2x, customer acquisition cost reduced by 18%, and lifetime value increased by 24%. Detailed breakdown available in attached widgets.`;\n }\n\n if (lowerCommand.includes('data') || lowerCommand.includes('metrics')) {\n return `Data metrics retrieved: 1,847 active users, 12,394 sessions this month, 94.2% uptime, average response time 127ms. Performance is within acceptable parameters. No critical issues detected.`;\n }\n\n if (lowerCommand.includes('customer') || lowerCommand.includes('user')) {\n return `Customer analysis complete: 523 new customers this month, 89% retention rate, average satisfaction score 4.6/5. Top feedback themes: excellent support (87%), easy to use (72%), good value (68%). 3 support tickets pending review.`;\n }\n\n // Default response\n return `This is a mock response showing how your agent would process and respond to commands. The actual response would be generated by your AI agent based on real data and context.`;\n}\n\n// Generate mock command response with widgets\nexport function generateMockCommandWithWidgets(command: string): { message: string; widgets: Widget[]; action?: { type: string; payload: any } } {\n const message = generateMockCommandResponse(command);\n const lowerCommand = command.toLowerCase();\n\n let widgets: Widget[] = [];\n let action: { type: string; payload: any } | undefined;\n\n // Add relevant widgets based on command type\n if (lowerCommand.includes('sales') || lowerCommand.includes('revenue') || lowerCommand.includes('analyze')) {\n widgets.push({\n type: 'card',\n id: `widget-${Date.now()}-1`,\n props: {\n title: 'Q4 2024 Performance',\n description: 'Revenue: $2.4M (+18% YoY)',\n footer: 'Updated: ' + new Date().toLocaleDateString(),\n },\n actions: [\n {\n type: 'view_details',\n label: 'View Details',\n handler: 'client',\n payload: { reportId: 'q4-2024' },\n },\n ],\n });\n }\n\n if (lowerCommand.includes('customer') || lowerCommand.includes('user')) {\n widgets.push({\n type: 'list',\n id: `widget-${Date.now()}-2`,\n props: {\n items: [\n {\n id: 'metric-1',\n title: 'Active Users',\n subtitle: '1,847 users',\n description: '+12% from last month',\n },\n {\n id: 'metric-2',\n title: 'Retention Rate',\n subtitle: '89%',\n description: 'Above industry average',\n },\n {\n id: 'metric-3',\n title: 'Satisfaction Score',\n subtitle: '4.6/5',\n description: 'Based on 234 reviews',\n },\n ],\n },\n });\n }\n\n // Add task widget for task-related commands\n if (lowerCommand.includes('task') || lowerCommand.includes('todo') || lowerCommand.includes('work') || lowerCommand.includes('completed')) {\n widgets.push({\n type: 'list',\n id: `widget-${Date.now()}-tasks`,\n props: {\n items: [\n {\n id: 'task-1',\n title: 'Implement user authentication',\n subtitle: 'Created just now',\n description: 'Added OAuth 2.0 support with Google and GitHub providers',\n backgroundColor: 'rgba(59, 130, 246, 0.15)',\n metadata: {\n status: 'created',\n priority: 'high',\n tags: ['backend', 'security']\n }\n },\n {\n id: 'task-2',\n title: 'Update API documentation',\n subtitle: 'Modified 2 minutes ago',\n description: 'Changed endpoint descriptions and added new examples',\n backgroundColor: 'rgba(234, 179, 8, 0.15)',\n metadata: {\n status: 'modified',\n priority: 'medium',\n tags: ['docs']\n }\n },\n {\n id: 'task-3',\n title: 'Fix login redirect bug',\n subtitle: 'Completed 5 minutes ago',\n description: 'Users now properly redirected after successful login',\n backgroundColor: 'rgba(34, 197, 94, 0.15)',\n metadata: {\n status: 'completed',\n priority: 'urgent',\n tags: ['bugfix', 'auth']\n }\n }\n ],\n },\n actions: [\n {\n type: 'view_task',\n label: 'View',\n handler: 'client',\n payload: {}\n },\n {\n type: 'undo',\n label: 'Undo',\n handler: 'server',\n payload: {}\n }\n ]\n });\n\n // Agent also wants to update the database after showing tasks\n action = {\n type: 'update_database',\n payload: {\n table: 'tasks',\n operation: 'mark_as_viewed',\n taskIds: ['task-1', 'task-2', 'task-3'],\n timestamp: new Date().toISOString()\n }\n };\n }\n\n // Add agent action for analysis commands\n if (lowerCommand.includes('analyze') || lowerCommand.includes('analysis')) {\n action = {\n type: 'send_notification',\n payload: {\n recipient: 'team@company.com',\n subject: 'Analysis Complete',\n message: 'Your requested analysis has been completed and is ready for review.'\n }\n };\n }\n\n return { message, widgets, action };\n}\n\n// Simulate streaming command response\nexport function generateMockCommandStream(\n command: string,\n onChunk: (chunk: { type: 'token' | 'widget' | 'complete'; content?: string; widget?: Widget }) => void,\n onComplete: (threadId: string) => void,\n onError: (error: Error) => void,\n typingSpeed: number = 30\n): void {\n const { message, widgets } = generateMockCommandWithWidgets(command);\n const words = message.split(' ');\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n try {\n if (currentIndex < words.length) {\n onChunk({ type: 'token', content: words[currentIndex] + ' ' });\n currentIndex++;\n } else {\n clearInterval(interval);\n\n // Send widgets after text is complete\n widgets.forEach(widget => {\n onChunk({ type: 'widget', widget });\n });\n\n // Signal completion\n const threadId = `mock_thread_${Date.now()}`;\n onChunk({ type: 'complete' });\n onComplete(threadId);\n }\n } catch (error) {\n clearInterval(interval);\n onError(error instanceof Error ? error : new Error('Mock streaming error'));\n }\n }, typingSpeed);\n}\n","/**\n * File utilities for converting files to base64 and creating content blocks\n */\n\nexport interface ContentBlock {\n type: 'text' | 'image' | 'document';\n text?: string;\n source?: {\n type: 'base64';\n media_type: string;\n data: string;\n };\n}\n\n/**\n * Convert a File to base64 string\n */\nexport function fileToBase64(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 (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1];\n resolve(base64);\n };\n reader.onerror = () => reject(new Error('Failed to read file'));\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Determine the content block type based on file MIME type\n */\nexport function getContentBlockType(mimeType: string): 'image' | 'document' {\n if (mimeType.startsWith('image/')) {\n return 'image';\n }\n return 'document';\n}\n\n/**\n * Check if a file type is supported for upload\n */\nexport function isSupportedFileType(file: File): boolean {\n const supportedTypes = [\n // Images\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n // Documents\n 'application/pdf',\n 'text/plain',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n ];\n return supportedTypes.includes(file.type);\n}\n\n/**\n * Convert a File to a content block for the agent API\n */\nexport async function fileToContentBlock(file: File): Promise<ContentBlock> {\n const base64 = await fileToBase64(file);\n const blockType = getContentBlockType(file.type);\n\n return {\n type: blockType,\n source: {\n type: 'base64',\n media_type: file.type,\n data: base64,\n },\n };\n}\n\n/**\n * Convert multiple files to content blocks\n */\nexport async function filesToContentBlocks(files: FileList | File[]): Promise<ContentBlock[]> {\n const fileArray = Array.from(files);\n const blocks = await Promise.all(\n fileArray.map(file => fileToContentBlock(file))\n );\n return blocks;\n}\n\n/**\n * Build a structured message with text and file attachments\n */\nexport async function buildMessageWithAttachments(\n text: string,\n files?: FileList | File[]\n): Promise<string | ContentBlock[]> {\n // If no files, return simple text\n if (!files || files.length === 0) {\n return text;\n }\n\n // Build content blocks array\n const blocks: ContentBlock[] = [];\n\n // Add text block first if there's text\n if (text.trim()) {\n blocks.push({ type: 'text', text: text.trim() });\n }\n\n // Convert files to content blocks\n const fileBlocks = await filesToContentBlocks(files);\n blocks.push(...fileBlocks);\n\n return blocks;\n}\n\n/**\n * Get a human-readable file size 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 * Maximum file size (10MB)\n */\nexport const MAX_FILE_SIZE = 10 * 1024 * 1024;\n\n/**\n * Validate file for upload\n */\nexport function validateFile(file: File): { valid: boolean; error?: string } {\n if (!isSupportedFileType(file)) {\n return { valid: false, error: `Unsupported file type: ${file.type}` };\n }\n if (file.size > MAX_FILE_SIZE) {\n return { valid: false, error: `File too large: ${formatFileSize(file.size)} (max ${formatFileSize(MAX_FILE_SIZE)})` };\n }\n return { valid: true };\n}\n","import { Widget } from '../types/widgets';\n\nexport interface ParsedSegment {\n type: 'text' | 'widget' | 'widget_pending';\n content?: string;\n widget?: Widget & { isStreaming?: boolean };\n pendingType?: string; // Widget type being streamed\n}\n\nexport interface ParsedContent {\n segments: ParsedSegment[];\n hasWidgets: boolean;\n hasPendingWidget: boolean;\n}\n\n/**\n * Types that support incremental item streaming\n */\nconst STREAMABLE_WIDGET_TYPES = ['list', 'table'];\n\n/**\n * Parse complete items from a partial JSON array string\n * Returns array of parsed items and whether there's more coming\n */\nfunction parsePartialItemsArray(partialJson: string): { items: any[]; isStreaming: boolean } {\n const items: any[] = [];\n let isStreaming = false;\n\n // Find the \"items\" array start\n const itemsMatch = partialJson.match(/\"items\"\\s*:\\s*\\[/);\n if (!itemsMatch) {\n return { items, isStreaming: false };\n }\n\n const arrayStart = partialJson.indexOf('[', itemsMatch.index);\n if (arrayStart === -1) {\n return { items, isStreaming: true };\n }\n\n // Try to find complete objects within the array\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n let objectStart = -1;\n\n for (let i = arrayStart + 1; i < partialJson.length; i++) {\n const char = partialJson[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === '{') {\n if (depth === 0) {\n objectStart = i;\n }\n depth++;\n } else if (char === '}') {\n depth--;\n if (depth === 0 && objectStart !== -1) {\n // Complete object found\n const objectJson = partialJson.slice(objectStart, i + 1);\n try {\n const item = JSON.parse(objectJson);\n // Ensure item has an id\n if (!item.id) {\n item.id = `item-${items.length}-${simpleHash(objectJson)}`;\n }\n items.push(item);\n } catch (e) {\n // Invalid JSON, skip\n }\n objectStart = -1;\n }\n } else if (char === ']' && depth === 0) {\n // Array closed - not streaming anymore\n isStreaming = false;\n break;\n }\n }\n\n // If we didn't find a closing bracket, we're still streaming\n if (depth > 0 || objectStart !== -1) {\n isStreaming = true;\n }\n\n // Check if array is still open (no closing ])\n const afterItems = partialJson.slice(arrayStart);\n const closingBracket = findMatchingBracket(afterItems, 0);\n if (closingBracket === -1) {\n isStreaming = true;\n }\n\n return { items, isStreaming };\n}\n\n/**\n * Simple hash function to generate stable IDs from content\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Find the matching closing bracket, handling nested brackets\n */\nfunction findMatchingBracket(text: string, startIndex: number): number {\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n\n for (let i = startIndex; i < text.length; i++) {\n const char = text[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === '[' || char === '{') {\n depth++;\n } else if (char === ']' || char === '}') {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1; // No match found\n}\n\n/**\n * Parse text content and extract widgets from @ui:type[{props}] syntax\n */\nexport function parseWidgetsFromText(text: string): ParsedContent {\n const segments: ParsedSegment[] = [];\n let hasWidgets = false;\n let hasPendingWidget = false;\n let currentIndex = 0;\n let pendingWidgetType: string | null = null;\n\n // Strip stray <ui>, </ui>, <ui/>, etc. tags the AI sometimes outputs\n let processText = text.replace(/<\\/?ui\\s*\\/?>/gi, '');\n const lastWidgetStart = text.lastIndexOf('@ui:');\n\n if (lastWidgetStart !== -1) {\n // Check if this last @ui: pattern is complete\n const afterStart = text.slice(lastWidgetStart);\n const typeMatch = afterStart.match(/^@ui:(\\w+)/);\n\n if (typeMatch) {\n const widgetType = typeMatch[1];\n const bracketOpenIndex = afterStart.indexOf('[');\n\n if (bracketOpenIndex === -1) {\n // No opening bracket yet - incomplete, show skeleton\n processText = text.slice(0, lastWidgetStart);\n pendingWidgetType = widgetType;\n hasPendingWidget = true;\n } else {\n // Has opening bracket, check if it's closed\n const fullBracketStart = lastWidgetStart + bracketOpenIndex;\n const bracketEnd = findMatchingBracket(text, fullBracketStart);\n\n if (bracketEnd === -1) {\n // Bracket not closed - incomplete widget\n // For streamable types (list, table), try to parse partial items\n if (STREAMABLE_WIDGET_TYPES.includes(widgetType)) {\n const partialContent = text.slice(fullBracketStart + 1);\n const { items, isStreaming } = parsePartialItemsArray(partialContent);\n\n if (items.length > 0) {\n // We have some items! Show them (with streaming indicator only if items array is incomplete)\n processText = text.slice(0, lastWidgetStart);\n const widgetId = `widget-${widgetType}-streaming-${simpleHash(partialContent)}`;\n\n // Add text before if any\n const textBefore = processText.replace(/[\\s:;\\-–—\\.]+$/g, '').trim();\n if (textBefore) {\n segments.push({ type: 'text', content: textBefore });\n }\n\n // Add the widget - only show streaming indicator if items array itself is incomplete\n segments.push({\n type: 'widget',\n widget: {\n type: widgetType,\n id: widgetId,\n props: widgetType === 'table' ? { rows: items, columns: [] } : { items },\n isStreaming // Use actual streaming state from items array parsing\n }\n });\n\n hasWidgets = true;\n hasPendingWidget = false; // We're showing real content, not skeleton\n processText = ''; // All text handled\n } else {\n // No items yet, show skeleton\n processText = text.slice(0, lastWidgetStart);\n pendingWidgetType = widgetType;\n hasPendingWidget = true;\n }\n } else {\n // Non-streamable widget, show skeleton\n processText = text.slice(0, lastWidgetStart);\n pendingWidgetType = widgetType;\n hasPendingWidget = true;\n }\n }\n }\n }\n }\n\n // Clean up trailing whitespace before pending widget\n if (hasPendingWidget) {\n processText = processText.replace(/[\\s:;\\-–—\\.]+$/g, '');\n }\n\n // Pattern to find @ui:type[ starts\n const startPattern = /@ui:(\\w+)\\[/g;\n\n let match;\n while ((match = startPattern.exec(processText)) !== null) {\n const widgetType = match[1];\n const bracketStart = match.index + match[0].length - 1; // Position of '['\n\n // Find the matching ']'\n const bracketEnd = findMatchingBracket(processText, bracketStart);\n\n if (bracketEnd === -1) {\n // No matching bracket - shouldn't happen after pre-processing, but skip just in case\n continue;\n }\n\n // Extract the JSON content (everything between [ and ])\n const jsonContent = processText.slice(bracketStart + 1, bracketEnd);\n\n // Add text before the widget\n if (match.index > currentIndex) {\n const textContent = processText.slice(currentIndex, match.index).trim();\n if (textContent) {\n segments.push({\n type: 'text',\n content: textContent\n });\n }\n }\n\n // Parse and add the widget\n try {\n // Trim and normalize JSON content\n const trimmedJson = jsonContent.trim();\n const parsed = JSON.parse(trimmedJson);\n // Generate stable ID based on widget type and content\n const widgetId = `widget-${widgetType}-${simpleHash(trimmedJson)}`;\n\n // Extract metadata and actions fields to widget root, rest goes to props\n const { metadata, actions, ...props } = parsed;\n\n segments.push({\n type: 'widget',\n widget: {\n type: widgetType,\n id: widgetId,\n props,\n ...(actions && { actions }),\n ...(metadata && { metadata })\n }\n });\n hasWidgets = true;\n } catch (e) {\n // JSON parsing failed - hide the raw syntax entirely\n }\n\n currentIndex = bracketEnd + 1;\n startPattern.lastIndex = currentIndex;\n }\n\n // Add remaining text (already cleaned of incomplete widgets)\n if (currentIndex < processText.length) {\n const remainingText = processText.slice(currentIndex).trim();\n if (remainingText) {\n segments.push({\n type: 'text',\n content: remainingText\n });\n }\n }\n\n // If no segments were created, use the processed text\n if (segments.length === 0 && processText.trim()) {\n segments.push({\n type: 'text',\n content: processText.trim()\n });\n }\n\n // Add pending widget skeleton at the end if we detected one\n if (pendingWidgetType) {\n segments.push({\n type: 'widget_pending',\n pendingType: pendingWidgetType\n });\n }\n\n return { segments, hasWidgets, hasPendingWidget };\n}\n\n/**\n * Check if text contains any widget syntax\n */\nexport function containsWidgets(text: string): boolean {\n return /@ui:\\w+\\[/.test(text);\n}\n\n/**\n * Strip widget syntax from text, returning only plain text content\n */\nexport function stripWidgets(text: string): string {\n const parsed = parseWidgetsFromText(text);\n return parsed.segments\n .filter(s => s.type === 'text' && s.content)\n .map(s => s.content)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","/**\n * Widget definitions for context injection\n */\nexport const WIDGET_DEFINITIONS = {\n card: {\n schema: 'title, description?, image?, footer?, actions?: [{type, label}]',\n example: '@ui:card[{\"title\": \"Summary\", \"description\": \"Details here\"}]'\n },\n list: {\n schema: 'items: [{id, title, subtitle?, description?, image?, metadata?: {any extra data}}], actions?: [{type, label}] - metadata is sent as action payload when clicked',\n example: '@ui:list[{\"items\": [{\"id\": \"1\", \"title\": \"Item\", \"subtitle\": \"Info\", \"metadata\": {\"key\": \"value\"}}]}]'\n },\n button_group: {\n schema: 'buttons: [{id, label, variant?}] - Use for standalone buttons only, NOT for form submits',\n example: '@ui:button_group[{\"buttons\": [{\"id\": \"ok\", \"label\": \"OK\"}]}]'\n },\n form: {\n schema: 'title?, fields: [{name, type: text|password|number|select|checkbox|textarea|date, label, required?, placeholder?, options?}], actions: [{type, label}] - Button is built-in via actions, do NOT add separate button',\n example: '@ui:form[{\"title\": \"Settings\", \"fields\": [{\"name\": \"apiKey\", \"type\": \"password\", \"label\": \"API Key\", \"required\": true}], \"actions\": [{\"type\": \"save\", \"label\": \"Save\"}]}]'\n },\n table: {\n schema: 'columns: [{key, label}], rows: [...], striped?, compact?',\n example: '@ui:table[{\"columns\": [{\"key\": \"name\", \"label\": \"Name\"}], \"rows\": [{\"name\": \"A\"}]}]'\n },\n image: {\n schema: 'src, alt, caption?',\n example: '@ui:image[{\"src\": \"url\", \"alt\": \"desc\"}]'\n },\n chart: {\n schema: 'chartType: line|bar|pie, data: {labels, datasets}',\n example: '@ui:chart[{\"chartType\": \"bar\", \"data\": {\"labels\": [\"A\"], \"datasets\": [{\"label\": \"X\", \"data\": [10]}]}}]'\n },\n flow: {\n schema: 'title, subtitle?, icon?: research|schedule|analyze|deploy|recurring|automation|data, steps: [{id, label, type?, color?: blue|purple|cyan|amber|emerald|rose|indigo|orange, status?: pending|active|completed|error|skipped}] - Horizontal pipeline. Use @label for agents. Types auto-detected from label.',\n example: '@ui:flow[{\"title\": \"Deploy Pipeline\", \"icon\": \"deploy\", \"steps\": [{\"id\": \"1\", \"label\": \"Test\", \"color\": \"cyan\"}, {\"id\": \"2\", \"label\": \"Build\", \"color\": \"amber\"}, {\"id\": \"3\", \"label\": \"Deploy\", \"color\": \"rose\"}]}]'\n }\n} as const;\n\nexport type WidgetType = keyof typeof WIDGET_DEFINITIONS;\n\nexport const ALL_WIDGET_TYPES: WidgetType[] = Object.keys(WIDGET_DEFINITIONS) as WidgetType[];\n\n// Widgets disabled from default context injection (still renderable if received)\nconst DISABLED_WIDGETS: WidgetType[] = ['flow'];\nexport const DEFAULT_WIDGET_TYPES: WidgetType[] = ALL_WIDGET_TYPES.filter(t => !DISABLED_WIDGETS.includes(t));\n\n/**\n * Generate system prompt context describing available widgets\n */\nexport function generateWidgetContext(enabledWidgets?: WidgetType[]): string {\n const widgets = enabledWidgets || DEFAULT_WIDGET_TYPES;\n\n let context = `\\n## UI Widgets\nSYNTAX: @ui:type[{json}] - MUST use SQUARE BRACKETS [] around the JSON object.\nCORRECT: @ui:list[{\"items\": [...]}]\nWRONG: @ui:list{\"items\": [...]} (missing square brackets)\n\n`;\n\n for (const type of widgets) {\n const def = WIDGET_DEFINITIONS[type];\n if (!def) continue;\n context += `${type}: ${def.schema} | ${def.example}\\n`;\n }\n\n context += `\\nPer-item \"metadata\" is sent as payload on action click.\\n`;\n\n return context;\n}\n\n/**\n * Generate a compact version of widget context\n */\nexport function generateCompactWidgetContext(enabledWidgets?: WidgetType[]): string {\n const widgets = enabledWidgets || DEFAULT_WIDGET_TYPES;\n return `\\nWidgets: @ui:type[{json}] - MUST use square brackets []. Example: @ui:list[{\"items\": [...]}]. Types: ${widgets.join(', ')}. Per-item \"metadata\" is sent as action payload.\\n`;\n}\n","import { InterfaceSpec, InterfaceUpdate } from '../types/interface';\n\n/**\n * Find matching bracket/brace, handling nested structures and strings\n */\nfunction findMatchingBracket(text: string, startIndex: number): number {\n const openChar = text[startIndex];\n const closeChar = openChar === '[' ? ']' : '}';\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n\n for (let i = startIndex; i < text.length; i++) {\n const char = text[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (char === openChar || char === (openChar === '[' ? '{' : '[')) {\n if (char === openChar) depth++;\n } else if (char === closeChar || char === (closeChar === ']' ? '}' : ']')) {\n if (char === closeChar) {\n depth--;\n if (depth === 0) return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Parse a full interface spec from text containing @interface[{...}]\n */\nexport function parseInterfaceFromText(text: string): InterfaceSpec | null {\n const marker = '@interface[';\n const idx = text.indexOf(marker);\n if (idx === -1) return null;\n\n const bracketStart = idx + marker.length - 1; // position of '['\n const bracketEnd = findMatchingBracket(text, bracketStart);\n if (bracketEnd === -1) return null; // Incomplete\n\n const jsonContent = text.slice(bracketStart + 1, bracketEnd);\n\n try {\n const parsed = JSON.parse(jsonContent);\n\n // Validate basic structure\n if (!parsed.root || !parsed.root.id) return null;\n\n return {\n version: parsed.version || 1,\n root: parsed.root,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse update operations from text containing @update[{...}] or @update[[{...}, ...]]\n */\nexport function parseUpdatesFromText(text: string): InterfaceUpdate[] {\n const updates: InterfaceUpdate[] = [];\n const marker = '@update[';\n let searchFrom = 0;\n\n while (true) {\n const idx = text.indexOf(marker, searchFrom);\n if (idx === -1) break;\n\n const bracketStart = idx + marker.length - 1;\n const bracketEnd = findMatchingBracket(text, bracketStart);\n if (bracketEnd === -1) break; // Incomplete\n\n const jsonContent = text.slice(bracketStart + 1, bracketEnd);\n\n try {\n const parsed = JSON.parse(jsonContent);\n\n if (Array.isArray(parsed)) {\n updates.push(...parsed);\n } else if (parsed.op && parsed.target) {\n updates.push(parsed);\n }\n } catch {\n // Skip malformed JSON\n }\n\n searchFrom = bracketEnd + 1;\n }\n\n return updates;\n}\n\n/**\n * Check if text contains interface syntax\n */\nexport function containsInterface(text: string): boolean {\n return text.includes('@interface[') || text.includes('@update[');\n}\n\n/**\n * Strip interface syntax from text, returning only plain text\n */\nexport function stripInterface(text: string): string {\n let result = text;\n\n // Remove @interface[...] blocks\n const ifacePattern = /@interface\\[/g;\n let match;\n while ((match = ifacePattern.exec(result)) !== null) {\n const bracketStart = match.index + match[0].length - 1;\n const bracketEnd = findMatchingBracket(result, bracketStart);\n if (bracketEnd === -1) break;\n result = result.slice(0, match.index) + result.slice(bracketEnd + 1);\n ifacePattern.lastIndex = match.index;\n }\n\n // Remove @update[...] blocks\n const updatePattern = /@update\\[/g;\n while ((match = updatePattern.exec(result)) !== null) {\n const bracketStart = match.index + match[0].length - 1;\n const bracketEnd = findMatchingBracket(result, bracketStart);\n if (bracketEnd === -1) break;\n result = result.slice(0, match.index) + result.slice(bracketEnd + 1);\n updatePattern.lastIndex = match.index;\n }\n\n return result.replace(/\\s+/g, ' ').trim();\n}\n","/**\n * Generate system prompt context for AutoInterface mode\n * Tells the AI how to generate full interfaces with layouts and widgets\n */\nexport function generateInterfaceContext(): string {\n return `## Auto Interface Mode\n\nYou generate full page interfaces as JSON. When asked for a dashboard, form, or any UI, respond with an @interface block.\n\n### CRITICAL FORMAT RULES\n1. Wrap your JSON in: @interface[{...}]\n2. Every node MUST have: \"type\", \"id\", and \"props\" (an object)\n3. Widget properties go INSIDE \"props\", NOT at the top level\n4. The \"type\" field is the ACTUAL widget name (e.g. \"form\", \"kpi\", \"table\") — NEVER use \"widget\" as a type\n5. Layout nodes use type: \"layout\" with a \"layout\" field for the layout kind\n\n### Node structure\n\nLayout node:\n{\"type\": \"layout\", \"id\": \"unique-id\", \"layout\": \"page|row|stack|columns|sidebar|tabs\", \"props\": {...}, \"children\": [...]}\n\nWidget node:\n{\"type\": \"kpi|text_block|form|table|chart|list|card|spacer|button_group|image\", \"id\": \"unique-id\", \"props\": {...}}\n\n### Layout types and their props\n- page: { title?, padding?: \"none\"|\"sm\"|\"md\"|\"lg\", maxWidth?: \"sm\"|\"md\"|\"lg\"|\"xl\"|\"full\" }\n- row: { columns?: number[] (e.g. [1,2] for 1/3+2/3), gap?: \"none\"|\"sm\"|\"md\"|\"lg\" }\n- stack: { gap?: \"none\"|\"sm\"|\"md\"|\"lg\", align?: \"left\"|\"center\"|\"right\"|\"stretch\" }\n- columns: { count?: number, gap?: \"none\"|\"sm\"|\"md\"|\"lg\" }\n- sidebar: { side?: \"left\"|\"right\", width?: string }\n- tabs: { labels: string[], defaultTab?: number }\n\n### Widget types and their props\n- kpi: { label: string, value: string, change?: string, trend?: \"up\"|\"down\"|\"flat\" }\n- text_block: { content: string (markdown), variant?: \"heading\"|\"body\"|\"caption\" }\n- spacer: { height?: \"sm\"|\"md\"|\"lg\", variant?: \"line\"|\"space\" }\n- card: { title: string, description?: string, image?: string, footer?: string }\n- list: { items: [{ id: string, title: string, subtitle?: string }] }\n- table: { columns: [{ key: string, label: string }], rows: [{ key: value, ... }], striped?: boolean, compact?: boolean }\n- chart: { chartType: \"line\"|\"bar\"|\"pie\", title?: string, data: { labels: string[], datasets: [{ label: string, data: number[] }] } }\n- form: { title?: string, fields: [{ name: string, type: \"text\"|\"email\"|\"select\"|\"textarea\"|\"checkbox\", label: string, required?: boolean, placeholder?: string, options?: [{ label: string, value: string }] }] }\n- button_group: { buttons: [{ id: string, label: string, variant?: string }] }\n- image: { src: string, alt: string, caption?: string }\n\n### CORRECT example\n\n@interface[{\"version\":1,\"root\":{\"type\":\"layout\",\"id\":\"root\",\"layout\":\"page\",\"props\":{\"title\":\"My Form\"},\"children\":[{\"type\":\"text_block\",\"id\":\"t1\",\"props\":{\"content\":\"Fill out the form below\",\"variant\":\"body\"}},{\"type\":\"form\",\"id\":\"f1\",\"props\":{\"fields\":[{\"name\":\"name\",\"type\":\"text\",\"label\":\"Name\",\"required\":true},{\"name\":\"email\",\"type\":\"email\",\"label\":\"Email\"}]}},{\"type\":\"button_group\",\"id\":\"b1\",\"props\":{\"buttons\":[{\"id\":\"submit\",\"label\":\"Submit\"}]}}]}}]\n\n### WRONG (do NOT do these)\n- {\"type\": \"widget\", \"props\": {\"widget\": \"form\"}} — WRONG, type must be \"form\" directly\n- {\"type\": \"text_block\", \"content\": \"hello\"} — WRONG, content must be inside props\n- {\"type\": \"text_block\", \"props\": {\"style\": \"heading\"}} — WRONG, use \"variant\" not \"style\"\n\n### Guidelines\n- Always use unique IDs for every node\n- Organize content logically: KPIs in a row, charts with supporting lists, etc.\n- Use text_block for descriptions and headings within layouts\n- Use spacer with variant \"line\" to separate sections\n- You can include normal text before/after the @interface block\n- For updates use: @update[{\"op\": \"update\", \"target\": \"widget-id\", \"props\": {\"key\": \"new-value\"}}]`;\n}\n\n/**\n * Compact version for the initial prompt (separate API call)\n */\nexport function generateCompactInterfaceContext(): string {\n return `Generate a UI interface as JSON wrapped in @interface[{...}].\n\nSTRICT FORMAT — every node needs \"type\", \"id\", and \"props\" (object):\n- Layout: {\"type\":\"layout\",\"id\":\"x\",\"layout\":\"page|row|stack|tabs\",\"props\":{...},\"children\":[...]}\n- Widget: {\"type\":\"kpi|text_block|form|table|chart|list|card|spacer|button_group|image\",\"id\":\"x\",\"props\":{...}}\n\nNEVER use type:\"widget\". The type IS the widget name. All widget properties go INSIDE \"props\".\n\nWidget props:\n- kpi: {label,value,change?,trend?}\n- text_block: {content,variant?:\"heading\"|\"body\"|\"caption\"}\n- form: {fields:[{name,type,label,required?,placeholder?}]}\n- table: {columns:[{key,label}],rows:[{...}]}\n- chart: {chartType:\"line\"|\"bar\"|\"pie\",data:{labels,datasets:[{label,data}]}}\n- list: {items:[{id,title,subtitle?}]}\n- button_group: {buttons:[{id,label}]}\n\nRow props: {columns:[1,2]} means 1/3+2/3. Page props: {title:\"...\"}.\n\nExample: @interface[{\"version\":1,\"root\":{\"type\":\"layout\",\"id\":\"root\",\"layout\":\"page\",\"props\":{\"title\":\"Form\"},\"children\":[{\"type\":\"form\",\"id\":\"f1\",\"props\":{\"fields\":[{\"name\":\"name\",\"type\":\"text\",\"label\":\"Name\"}]}}]}}]`;\n}\n","import { InterfaceNode, InterfaceSpec, InterfaceUpdate } from '../types/interface';\n\n/**\n * Find a node by ID in the interface tree\n */\nexport function findNode(root: InterfaceNode, id: string): InterfaceNode | null {\n if (root.id === id) return root;\n if (root.children) {\n for (const child of root.children) {\n const found = findNode(child, id);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Deep clone a node tree\n */\nfunction cloneNode(node: InterfaceNode): InterfaceNode {\n return {\n ...node,\n props: { ...node.props },\n children: node.children?.map(cloneNode),\n actions: node.actions ? [...node.actions] : undefined,\n metadata: node.metadata ? { ...node.metadata } : undefined,\n };\n}\n\n/**\n * Replace a node by ID, returning a new tree\n */\nfunction replaceNode(root: InterfaceNode, targetId: string, newNode: InterfaceNode): InterfaceNode {\n if (root.id === targetId) return newNode;\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => replaceNode(child, targetId, newNode));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Update a node's props by ID (shallow merge), returning a new tree\n */\nfunction updateNodeProps(root: InterfaceNode, targetId: string, props: Record<string, any>): InterfaceNode {\n if (root.id === targetId) {\n return { ...root, props: { ...root.props, ...props } };\n }\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => updateNodeProps(child, targetId, props));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Remove a node by ID, returning a new tree\n */\nfunction removeNode(root: InterfaceNode, targetId: string): InterfaceNode | null {\n if (root.id === targetId) return null;\n if (!root.children) return root;\n\n const newChildren = root.children\n .map(child => removeNode(child, targetId))\n .filter((child): child is InterfaceNode => child !== null);\n\n if (newChildren.length === root.children.length &&\n newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Append a child to a container by ID, returning a new tree\n */\nfunction appendNode(root: InterfaceNode, targetId: string, newNode: InterfaceNode): InterfaceNode {\n if (root.id === targetId) {\n return { ...root, children: [...(root.children || []), newNode] };\n }\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => appendNode(child, targetId, newNode));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Prepend a child to a container by ID, returning a new tree\n */\nfunction prependNode(root: InterfaceNode, targetId: string, newNode: InterfaceNode): InterfaceNode {\n if (root.id === targetId) {\n return { ...root, children: [newNode, ...(root.children || [])] };\n }\n if (!root.children) return root;\n\n const newChildren = root.children.map(child => prependNode(child, targetId, newNode));\n if (newChildren.every((child, i) => child === root.children![i])) return root;\n return { ...root, children: newChildren };\n}\n\n/**\n * Apply a single update operation to an InterfaceSpec\n */\nexport function applyUpdate(spec: InterfaceSpec, update: InterfaceUpdate): InterfaceSpec {\n let newRoot: InterfaceNode | null = spec.root;\n\n switch (update.op) {\n case 'replace':\n if (!update.node) return spec;\n newRoot = replaceNode(spec.root, update.target, update.node);\n break;\n case 'update':\n if (!update.props) return spec;\n newRoot = updateNodeProps(spec.root, update.target, update.props);\n break;\n case 'remove':\n newRoot = removeNode(spec.root, update.target);\n if (!newRoot) return spec; // Can't remove root\n break;\n case 'append':\n if (!update.node) return spec;\n newRoot = appendNode(spec.root, update.target, update.node);\n break;\n case 'prepend':\n if (!update.node) return spec;\n newRoot = prependNode(spec.root, update.target, update.node);\n break;\n default:\n return spec;\n }\n\n if (newRoot === spec.root) return spec;\n return { ...spec, root: newRoot };\n}\n\n/**\n * Apply multiple updates in sequence\n */\nexport function applyUpdates(spec: InterfaceSpec, updates: InterfaceUpdate[]): InterfaceSpec {\n return updates.reduce((s, update) => applyUpdate(s, update), spec);\n}\n","import { Message } from '../types/messages';\n\n/**\n * A content block from the API message format.\n * API messages can have `content` as either a string or an array of these blocks.\n */\nexport interface ApiContentBlock {\n type: 'text' | 'tool_use' | 'tool_result';\n // text block\n text?: string;\n // tool_use block\n id?: string;\n name?: string;\n input?: any;\n // tool_result block\n tool_use_id?: string;\n content?: string | Array<{ type: string; text?: string }>;\n is_error?: boolean;\n}\n\n/**\n * An API message as returned by the thread messages endpoint.\n */\nexport interface ApiMessage {\n role: 'user' | 'assistant' | 'system';\n content: string | ApiContentBlock[];\n id?: string;\n created_at?: string;\n timestamp?: string;\n}\n\ntype ContentSegment =\n | { type: 'text'; content: string }\n | { type: 'tool'; id: string; name: string; status: 'preparing' | 'running' | 'completed' | 'error'; result?: any };\n\n/**\n * Convert API messages (from thread history) to internal Message format.\n *\n * Key transformations:\n * - Simple string content messages map directly\n * - Assistant messages with tool_use blocks become content_segments\n * - User messages with tool_result blocks are merged into the previous\n * assistant message's tool segments (not shown as separate user messages)\n */\nexport function convertApiMessages(apiMessages: ApiMessage[]): Message[] {\n const result: Message[] = [];\n // Keep a reference to the last assistant's content_segments so we can\n // merge tool_result messages into them\n let lastAssistantSegments: ContentSegment[] | null = null;\n\n for (let i = 0; i < apiMessages.length; i++) {\n const msg = apiMessages[i];\n const timestamp = msg.created_at || msg.timestamp\n ? new Date(msg.created_at || msg.timestamp!)\n : new Date();\n\n if (typeof msg.content === 'string') {\n // Simple text message\n const message: Message = {\n id: msg.id || `thread-msg-${i}`,\n role: msg.role,\n content: msg.content,\n timestamp,\n };\n result.push(message);\n lastAssistantSegments = null;\n } else if (Array.isArray(msg.content)) {\n if (msg.role === 'assistant') {\n const segments: ContentSegment[] = [];\n let textContent = '';\n\n for (const block of msg.content) {\n if (block.type === 'text' && block.text) {\n segments.push({ type: 'text', content: block.text });\n textContent += block.text;\n } else if (block.type === 'tool_use') {\n segments.push({\n type: 'tool',\n id: block.id || `tool-${i}-${segments.length}`,\n name: block.name || 'unknown',\n status: 'completed',\n });\n }\n }\n\n const message: Message = {\n id: msg.id || `thread-msg-${i}`,\n role: 'assistant',\n content: textContent,\n timestamp,\n metadata: segments.length > 0 ? { content_segments: segments } : undefined,\n };\n result.push(message);\n lastAssistantSegments = segments;\n } else if (msg.role === 'user') {\n const hasToolResults = msg.content.some(b => b.type === 'tool_result');\n\n if (hasToolResults && lastAssistantSegments) {\n // Merge tool results into the previous assistant's tool segments\n for (const block of msg.content) {\n if (block.type === 'tool_result' && block.tool_use_id) {\n const toolSegment = lastAssistantSegments.find(\n s => s.type === 'tool' && s.id === block.tool_use_id\n );\n if (toolSegment && toolSegment.type === 'tool') {\n // Extract text content from result\n toolSegment.result = typeof block.content === 'string'\n ? block.content\n : Array.isArray(block.content)\n ? block.content.map(c => c.text || '').join('')\n : undefined;\n toolSegment.status = block.is_error ? 'error' : 'completed';\n }\n }\n }\n // Don't create a separate user message for tool results\n } else {\n // Regular user message with content blocks (shouldn't normally happen, but handle it)\n const textContent = msg.content\n .filter(b => b.type === 'text')\n .map(b => b.text || '')\n .join('');\n\n if (textContent) {\n result.push({\n id: msg.id || `thread-msg-${i}`,\n role: 'user',\n content: textContent,\n timestamp,\n });\n }\n lastAssistantSegments = null;\n }\n }\n }\n }\n\n return result;\n}\n","import { useEffect } from 'react';\nimport { WidgetsProps } from '../../types/components';\nimport { WidgetRenderer } from './WidgetRenderer';\nimport { cn } from '../../utils';\n\nexport function Widgets({\n widgets,\n onAction,\n onWidgetMount,\n layout = 'stack',\n spacing = 'normal',\n columns = 3,\n className,\n}: WidgetsProps) {\n useEffect(() => {\n widgets.forEach((widget) => {\n onWidgetMount?.(widget.id);\n });\n }, [widgets, onWidgetMount]);\n\n const layoutClasses = {\n stack: 'flex flex-col',\n grid: `grid grid-cols-1 md:grid-cols-${columns}`,\n masonry: 'columns-1 md:columns-2 lg:columns-3',\n };\n\n const spacingClasses = {\n tight: 'gap-2',\n normal: 'gap-4',\n loose: 'gap-6',\n };\n\n return (\n <div className={cn(layoutClasses[layout], spacingClasses[spacing], className)}>\n {widgets.map((widget) => (\n <WidgetRenderer key={widget.id} widget={widget} onAction={onAction} />\n ))}\n </div>\n );\n}\n","// No direct imports needed 'react';\nimport { CardWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface CardProps {\n widget: CardWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function Card({ widget, onAction }: CardProps) {\n const { title, description, image, footer } = widget.props;\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 overflow-hidden\">\n {image && <img src={image} alt={title} className=\"w-full h-48 object-cover\" />}\n\n <div className=\"p-4\">\n <h3 className=\"!text-lg font-semibold !text-neutral-900 dark:!text-white\">{title}</h3>\n {description && <p className=\"!text-neutral-600 dark:!text-neutral-400 mt-2\">{description}</p>}\n </div>\n\n {(footer || (widget.actions && widget.actions.length > 0)) && (\n <div className=\"border-t border-neutral-200 dark:border-neutral-700 p-4 flex justify-between items-center\">\n {footer && <span className=\"!text-sm !text-neutral-600 dark:!text-neutral-400\">{footer}</span>}\n\n {widget.actions && widget.actions.length > 0 && (\n <div className=\"flex gap-2\">\n {widget.actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() =>\n onAction?.({\n type: action.type,\n payload: action.payload,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n className=\"px-3 py-1.5 !text-sm rounded-lg font-medium transition-colors bg-blue-500 !text-white hover:bg-blue-600\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { ListWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface ListProps {\n widget: ListWidget & { isStreaming?: boolean };\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function List({ widget, onAction }: ListProps) {\n const { items } = widget.props;\n const isStreaming = widget.isStreaming ?? false;\n\n // Track seen item IDs to detect new items\n const seenItemsRef = useRef<Set<string>>(new Set());\n const [newItemIds, setNewItemIds] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const currentIds = new Set(items.map(item => item.id));\n const newIds = new Set<string>();\n\n // Find items we haven't seen before\n items.forEach(item => {\n if (!seenItemsRef.current.has(item.id)) {\n newIds.add(item.id);\n }\n });\n\n // Update seen items\n items.forEach(item => seenItemsRef.current.add(item.id));\n\n // Mark new items for animation\n if (newIds.size > 0) {\n setNewItemIds(newIds);\n\n // Clear animation class after animation completes\n const timer = setTimeout(() => {\n setNewItemIds(new Set());\n }, 500);\n\n return () => clearTimeout(timer);\n }\n }, [items]);\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 overflow-hidden\">\n {items.map((item, index) => {\n const isNew = newItemIds.has(item.id);\n const isLast = index === items.length - 1;\n\n return (\n <div\n key={item.id}\n className={`apteva-list-item flex items-center p-4 transition-colors ${\n !isLast || isStreaming ? 'border-b border-neutral-200 dark:border-neutral-700' : ''\n } ${!item.backgroundColor ? 'hover:bg-neutral-50 dark:hover:bg-neutral-800' : ''} ${\n isNew ? 'apteva-list-item-new' : ''\n }`}\n style={item.backgroundColor ? { backgroundColor: item.backgroundColor } : undefined}\n >\n {item.image && <img src={item.image} alt={item.title} className=\"w-16 h-16 rounded object-cover\" />}\n\n <div className={`flex-1 ${item.image ? 'ml-4' : ''}`}>\n <h4 className=\"font-semibold !text-neutral-900 dark:!text-white\">{item.title}</h4>\n {item.subtitle && <p className=\"!text-sm !text-neutral-600 dark:!text-neutral-400\">{item.subtitle}</p>}\n {item.description && (\n <p className=\"!text-xs !text-neutral-500 dark:!text-neutral-500 mt-1\">{item.description}</p>\n )}\n </div>\n\n {widget.actions && widget.actions.length > 0 && (\n <div className=\"flex gap-2\">\n {widget.actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() =>\n onAction?.({\n type: action.type,\n payload: item.metadata || item,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n className=\"px-3 py-1.5 !text-sm rounded-lg font-medium transition-colors bg-blue-500 !text-white hover:bg-blue-600\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Streaming indicator */}\n {isStreaming && (\n <div className=\"apteva-list-streaming flex items-center gap-3 p-4 text-neutral-500 dark:text-neutral-400\">\n <div className=\"apteva-streaming-dots flex gap-1\">\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '300ms' }} />\n </div>\n <span className=\"text-sm\">Loading more...</span>\n </div>\n )}\n </div>\n );\n}\n","// No direct imports needed 'react';\nimport { ButtonWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\nimport { cn } from '../../../utils';\n\ninterface ButtonProps {\n widget: ButtonWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function Button({ widget, onAction }: ButtonProps) {\n const { label, variant = 'primary', disabled = false } = widget.props;\n\n const variantClasses = {\n primary: 'bg-blue-500 !text-white hover:bg-blue-600',\n secondary: 'bg-neutral-500 !text-white hover:bg-neutral-600',\n outline: 'border-2 border-blue-500 !text-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900',\n ghost: '!text-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900',\n };\n\n return (\n <button\n onClick={() =>\n widget.actions?.[0] &&\n onAction?.({\n type: widget.actions[0].type,\n payload: widget.actions[0].payload,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n disabled={disabled}\n className={cn('px-4 py-2 rounded-lg font-medium transition-colors', variantClasses[variant], {\n 'opacity-50 cursor-not-allowed': disabled,\n })}\n >\n {label}\n </button>\n );\n}\n","import { ButtonGroupWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\nimport { cn } from '../../../utils';\n\ninterface ButtonGroupProps {\n widget: ButtonGroupWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function ButtonGroup({ widget, onAction }: ButtonGroupProps) {\n const { layout = 'horizontal', buttons } = widget.props;\n\n const variantClasses = {\n primary: 'bg-blue-500 !text-white hover:bg-blue-600',\n secondary: 'bg-neutral-200 dark:bg-neutral-700 !text-neutral-800 dark:!text-neutral-200 hover:bg-neutral-300 dark:hover:bg-neutral-600',\n outline: 'border border-neutral-300 dark:border-neutral-600 !text-neutral-700 dark:!text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800',\n };\n\n // Find action for a specific button by id\n const getActionForButton = (buttonId: string) => {\n return widget.actions?.find(action => action.payload?.buttonId === buttonId) || widget.actions?.[0];\n };\n\n return (\n <div\n className={cn(\n 'flex gap-2',\n layout === 'vertical' ? 'flex-col' : 'flex-row flex-wrap'\n )}\n >\n {buttons.map((button) => {\n const action = getActionForButton(button.id);\n return (\n <button\n key={button.id}\n onClick={() => {\n if (action) {\n onAction?.({\n type: action.type,\n payload: { ...action.payload, buttonId: button.id },\n widgetId: widget.id,\n timestamp: new Date(),\n });\n }\n }}\n className={cn(\n 'px-4 py-2 rounded-lg font-medium transition-colors text-sm',\n variantClasses[button.variant || 'secondary']\n )}\n >\n {button.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { TableWidget } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\nimport { cn } from '../../../utils/cn';\n\ninterface TableProps {\n widget: TableWidget & { isStreaming?: boolean };\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function Table({ widget, onAction }: TableProps) {\n const { columns, rows, caption, compact = false, striped = false } = widget.props;\n const isStreaming = widget.isStreaming ?? false;\n\n // Track seen row IDs to detect new rows\n const seenRowsRef = useRef<Set<string>>(new Set());\n const [newRowIds, setNewRowIds] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const newIds = new Set<string>();\n\n // Find rows we haven't seen before\n rows.forEach((row, index) => {\n const rowId = row.id || `row-${index}`;\n if (!seenRowsRef.current.has(rowId)) {\n newIds.add(rowId);\n }\n });\n\n // Update seen rows\n rows.forEach((row, index) => {\n const rowId = row.id || `row-${index}`;\n seenRowsRef.current.add(rowId);\n });\n\n // Mark new rows for animation\n if (newIds.size > 0) {\n setNewRowIds(newIds);\n\n // Clear animation class after animation completes\n const timer = setTimeout(() => {\n setNewRowIds(new Set());\n }, 500);\n\n return () => clearTimeout(timer);\n }\n }, [rows]);\n\n const getAlignment = (align?: 'left' | 'center' | 'right') => {\n switch (align) {\n case 'center': return 'text-center';\n case 'right': return 'text-right';\n default: return 'text-left';\n }\n };\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n {caption && (\n <caption className=\"px-4 py-2 text-sm text-neutral-600 dark:text-neutral-400 text-left bg-neutral-50 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n {caption}\n </caption>\n )}\n <thead>\n <tr className=\"bg-neutral-50 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n 'font-semibold text-neutral-900 dark:text-white',\n compact ? 'px-3 py-2 text-xs' : 'px-4 py-3 text-sm',\n getAlignment(column.align)\n )}\n style={column.width ? { width: column.width } : undefined}\n >\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIndex) => {\n const rowId = row.id || `row-${rowIndex}`;\n const isNew = newRowIds.has(rowId);\n\n return (\n <tr\n key={rowId}\n className={cn(\n 'apteva-table-row border-b border-neutral-200 dark:border-neutral-700 last:border-b-0',\n 'transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-800',\n striped && rowIndex % 2 === 1 && 'bg-neutral-50/50 dark:bg-neutral-800/50',\n isNew && 'apteva-table-row-new'\n )}\n onClick={() => {\n if (widget.actions && widget.actions.length > 0) {\n onAction?.({\n type: widget.actions[0].type,\n payload: row,\n widgetId: widget.id,\n timestamp: new Date(),\n });\n }\n }}\n style={{ cursor: widget.actions?.length ? 'pointer' : 'default' }}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n 'text-neutral-700 dark:text-neutral-300',\n compact ? 'px-3 py-2 text-xs' : 'px-4 py-3 text-sm',\n getAlignment(column.align)\n )}\n >\n {row[column.key] ?? '—'}\n </td>\n ))}\n </tr>\n );\n })}\n {rows.length === 0 && !isStreaming && (\n <tr>\n <td\n colSpan={columns.length || 1}\n className=\"px-4 py-8 text-center text-sm text-neutral-500 dark:text-neutral-400\"\n >\n No data available\n </td>\n </tr>\n )}\n {/* Streaming indicator row */}\n {isStreaming && (\n <tr className=\"apteva-table-streaming\">\n <td\n colSpan={columns.length || 1}\n className=\"px-4 py-3 text-center\"\n >\n <div className=\"flex items-center justify-center gap-3 text-neutral-500 dark:text-neutral-400\">\n <div className=\"flex gap-1\">\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-2 h-2 bg-current rounded-full animate-pulse\" style={{ animationDelay: '300ms' }} />\n </div>\n <span className=\"text-sm\">Loading more...</span>\n </div>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FormWidget, FormField } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface FormProps {\n widget: FormWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Portal Dropdown - renders into document.body, positioned to anchor */\n/* ------------------------------------------------------------------ */\nfunction PortalDropdown({\n anchorRef,\n open,\n onClose,\n width,\n children,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n open: boolean;\n onClose: () => void;\n width?: 'match' | 'auto';\n children: React.ReactNode;\n}) {\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ top: number; left: number; width: number }>({ top: 0, left: 0, width: 0 });\n\n // Position the dropdown below the anchor\n useEffect(() => {\n if (!open || !anchorRef.current) return;\n const update = () => {\n const rect = anchorRef.current!.getBoundingClientRect();\n setPos({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n };\n update();\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [open, anchorRef]);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n if (\n dropdownRef.current && !dropdownRef.current.contains(target) &&\n anchorRef.current && !anchorRef.current.contains(target)\n ) {\n onClose();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, onClose, anchorRef]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n ref={dropdownRef}\n className=\"apteva-widget\"\n style={{\n position: 'absolute',\n top: pos.top,\n left: pos.left,\n width: width === 'match' ? pos.width : undefined,\n zIndex: 99999,\n }}\n >\n {children}\n </div>,\n document.body\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Custom Select */\n/* ------------------------------------------------------------------ */\nfunction CustomSelect({\n name,\n value,\n options,\n placeholder,\n required,\n onChange,\n}: {\n name: string;\n value: string;\n options?: Array<{ label: string; value: string }>;\n placeholder?: string;\n required?: boolean;\n onChange: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const selected = options?.find((o) => o.value === value);\n const close = useCallback(() => setOpen(false), []);\n\n return (\n <div className=\"apteva-select relative\">\n {/* Hidden native select for form validation */}\n <select\n name={name}\n value={value}\n required={required}\n onChange={() => {}}\n tabIndex={-1}\n className=\"absolute inset-0 opacity-0 pointer-events-none\"\n aria-hidden\n >\n <option value=\"\" />\n {options?.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"apteva-select-trigger w-full flex items-center justify-between px-3 py-2 rounded-lg border transition-colors text-left\"\n >\n <span className={selected ? 'apteva-select-value' : 'apteva-select-placeholder'}>\n {selected ? selected.label : (placeholder || 'Select...')}\n </span>\n <svg\n className={`apteva-select-chevron w-4 h-4 flex-shrink-0 transition-transform ${open ? 'rotate-180' : ''}`}\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n <PortalDropdown anchorRef={triggerRef} open={open} onClose={close} width=\"match\">\n <div className=\"apteva-select-dropdown rounded-lg border shadow-lg overflow-hidden\">\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {options?.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => { onChange(opt.value); close(); }}\n className={`apteva-select-option w-full text-left px-3 py-2 text-sm transition-colors ${\n opt.value === value ? 'apteva-select-option-active' : ''\n }`}\n >\n {opt.label}\n </button>\n ))}\n {(!options || options.length === 0) && (\n <div className=\"px-3 py-2 text-sm apteva-select-placeholder\">No options</div>\n )}\n </div>\n </div>\n </PortalDropdown>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Custom Date Picker */\n/* ------------------------------------------------------------------ */\nfunction CustomDatePicker({\n name,\n value,\n placeholder,\n required,\n onChange,\n}: {\n name: string;\n value: string;\n placeholder?: string;\n required?: boolean;\n onChange: (value: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const close = useCallback(() => setOpen(false), []);\n\n // Parse current value or default to today's month\n const parseDate = (v: string) => {\n if (v) {\n const [y, m, d] = v.split('-').map(Number);\n return { year: y, month: m - 1, day: d };\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth(), day: 0 };\n };\n\n const parsed = parseDate(value);\n const [viewYear, setViewYear] = useState(parsed.year);\n const [viewMonth, setViewMonth] = useState(parsed.month);\n\n // Sync view when value changes externally\n useEffect(() => {\n if (value) {\n const p = parseDate(value);\n setViewYear(p.year);\n setViewMonth(p.month);\n }\n }, [value]);\n\n const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();\n const firstDayOfWeek = new Date(viewYear, viewMonth, 1).getDay(); // 0=Sun\n const startOffset = (firstDayOfWeek + 6) % 7; // Shift so Monday=0\n\n const prevMonth = () => {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(viewYear - 1); }\n else setViewMonth(viewMonth - 1);\n };\n const nextMonth = () => {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(viewYear + 1); }\n else setViewMonth(viewMonth + 1);\n };\n\n const selectDay = (day: number) => {\n const m = String(viewMonth + 1).padStart(2, '0');\n const d = String(day).padStart(2, '0');\n onChange(`${viewYear}-${m}-${d}`);\n close();\n };\n\n const formatDisplay = (v: string) => {\n if (!v) return '';\n const [y, m, d] = v.split('-');\n return `${d}/${m}/${y}`;\n };\n\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const dayLabels = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\n const isSelected = (day: number) => {\n if (!value) return false;\n const p = parseDate(value);\n return p.year === viewYear && p.month === viewMonth && p.day === day;\n };\n\n const isToday = (day: number) => {\n const now = new Date();\n return now.getFullYear() === viewYear && now.getMonth() === viewMonth && now.getDate() === day;\n };\n\n return (\n <div className=\"apteva-datepicker relative\">\n {/* Hidden native input for form validation */}\n <input\n type=\"text\"\n name={name}\n value={value}\n required={required}\n onChange={() => {}}\n tabIndex={-1}\n className=\"absolute inset-0 opacity-0 pointer-events-none\"\n aria-hidden\n />\n\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"apteva-datepicker-trigger w-full flex items-center justify-between px-3 py-2 rounded-lg border transition-colors text-left\"\n >\n <span className={value ? 'apteva-datepicker-value' : 'apteva-select-placeholder'}>\n {value ? formatDisplay(value) : (placeholder || 'Select date...')}\n </span>\n <svg className=\"apteva-select-chevron w-4 h-4 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </button>\n\n <PortalDropdown anchorRef={triggerRef} open={open} onClose={close} width=\"auto\">\n <div className=\"apteva-datepicker-dropdown rounded-lg border shadow-lg overflow-hidden\">\n {/* Header */}\n <div className=\"apteva-datepicker-header flex items-center justify-between px-3 py-2\">\n <button type=\"button\" onClick={prevMonth} className=\"apteva-datepicker-nav p-1 rounded transition-colors\">\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=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <span className=\"apteva-datepicker-title text-sm font-semibold\">\n {monthNames[viewMonth]} {viewYear}\n </span>\n <button type=\"button\" onClick={nextMonth} className=\"apteva-datepicker-nav p-1 rounded transition-colors\">\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=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 px-2\">\n {dayLabels.map((d) => (\n <div key={d} className=\"apteva-datepicker-daylabel text-center text-xs font-medium py-1\">{d}</div>\n ))}\n </div>\n\n {/* Day grid */}\n <div className=\"grid grid-cols-7 px-2 pb-2\">\n {Array.from({ length: startOffset }).map((_, i) => (\n <div key={`empty-${i}`} />\n ))}\n {Array.from({ length: daysInMonth }).map((_, i) => {\n const day = i + 1;\n const sel = isSelected(day);\n const today = isToday(day);\n return (\n <button\n key={day}\n type=\"button\"\n onClick={() => selectDay(day)}\n className={[\n 'apteva-datepicker-day text-center text-sm py-1 rounded transition-colors',\n sel ? 'apteva-datepicker-day-selected' : '',\n today && !sel ? 'apteva-datepicker-day-today' : '',\n ].join(' ')}\n >\n {day}\n </button>\n );\n })}\n </div>\n </div>\n </PortalDropdown>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Form Component */\n/* ------------------------------------------------------------------ */\nexport function Form({ widget, onAction }: FormProps) {\n const { title, fields } = widget.props;\n\n const fileInputRefs = useRef<Record<string, HTMLInputElement | null>>({});\n\n // Initialize form state with default values\n const [formData, setFormData] = useState<Record<string, any>>(() => {\n const initial: Record<string, any> = {};\n fields.forEach((field) => {\n if (field.type === 'file') {\n initial[field.name] = [];\n } else {\n initial[field.name] = field.defaultValue ?? (field.type === 'checkbox' ? false : '');\n }\n });\n return initial;\n });\n\n const handleChange = useCallback((name: string, value: any) => {\n setFormData((prev) => ({ ...prev, [name]: value }));\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (widget.actions?.[0] && onAction) {\n onAction({\n type: widget.actions[0].type,\n payload: { ...widget.actions[0].payload, formData },\n widgetId: widget.id,\n timestamp: new Date(),\n });\n }\n };\n\n const renderField = (field: FormField) => {\n const baseInputClass =\n 'apteva-input w-full px-3 py-2 rounded-lg border transition-colors ' +\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent';\n\n switch (field.type) {\n case 'text':\n case 'password':\n case 'number':\n return (\n <input\n type={field.type}\n name={field.name}\n value={formData[field.name] || ''}\n onChange={(e) => handleChange(field.name, field.type === 'number' ? Number(e.target.value) : e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n className={baseInputClass}\n />\n );\n\n case 'date':\n return (\n <CustomDatePicker\n name={field.name}\n value={formData[field.name] || ''}\n placeholder={field.placeholder}\n required={field.required}\n onChange={(v) => handleChange(field.name, v)}\n />\n );\n\n case 'textarea':\n return (\n <textarea\n name={field.name}\n value={formData[field.name] || ''}\n onChange={(e) => handleChange(field.name, e.target.value)}\n placeholder={field.placeholder}\n required={field.required}\n rows={3}\n className={baseInputClass}\n />\n );\n\n case 'select':\n return (\n <CustomSelect\n name={field.name}\n value={formData[field.name] || ''}\n options={field.options}\n placeholder={field.placeholder}\n required={field.required}\n onChange={(v) => handleChange(field.name, v)}\n />\n );\n\n case 'checkbox':\n return (\n <label className=\"apteva-checkbox flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n name={field.name}\n checked={formData[field.name] || false}\n onChange={(e) => handleChange(field.name, e.target.checked)}\n className=\"w-4 h-4 rounded\"\n />\n <span>{field.label}</span>\n </label>\n );\n\n case 'file': {\n const files: File[] = formData[field.name] || [];\n return (\n <div className=\"space-y-2\">\n <input\n ref={(el) => { fileInputRefs.current[field.name] = el; }}\n type=\"file\"\n name={field.name}\n multiple={field.multiple ?? true}\n accept={field.accept}\n onChange={(e) => {\n const newFiles = Array.from(e.target.files || []);\n if (field.multiple !== false) {\n handleChange(field.name, [...files, ...newFiles]);\n } else {\n handleChange(field.name, newFiles);\n }\n if (fileInputRefs.current[field.name]) {\n fileInputRefs.current[field.name]!.value = '';\n }\n }}\n className=\"hidden\"\n />\n <button\n type=\"button\"\n onClick={() => fileInputRefs.current[field.name]?.click()}\n className=\"apteva-file-drop w-full px-3 py-3 rounded-lg border-2 border-dashed transition-colors cursor-pointer !text-sm\"\n >\n {field.placeholder || 'Click to add files'}\n </button>\n {files.length > 0 && (\n <ul className=\"space-y-1\">\n {files.map((file, idx) => (\n <li\n key={`${file.name}-${idx}`}\n className=\"apteva-file-item-row flex items-center justify-between px-2 py-1.5 rounded-lg !text-sm\"\n >\n <span className=\"truncate mr-2\">\n {file.name}\n <span className=\"ml-1\" style={{ opacity: 0.6 }}>\n ({(file.size / 1024).toFixed(0)} KB)\n </span>\n </span>\n <button\n type=\"button\"\n onClick={() => handleChange(field.name, files.filter((_, i) => i !== idx))}\n className=\"apteva-file-remove-btn transition-colors flex-shrink-0\"\n >\n ✕\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n const submitAction = widget.actions?.find((a) => a.type === 'submit') || widget.actions?.[0];\n\n return (\n <form onSubmit={handleSubmit} className=\"border rounded-xl overflow-hidden\">\n <div className=\"p-4\">\n {title && (\n <h3 className=\"!text-lg font-semibold mb-4\">{title}</h3>\n )}\n\n <div className=\"space-y-3\">\n {fields.map((field) => (\n <div key={field.name} className={field.type === 'checkbox' ? '' : 'space-y-1'}>\n {field.type !== 'checkbox' && (\n <label className=\"apteva-field-label block !text-sm font-medium\">\n {field.label}\n {field.required && <span style={{ color: 'var(--aw-danger)' }} className=\"ml-1\">*</span>}\n </label>\n )}\n {renderField(field)}\n </div>\n ))}\n </div>\n </div>\n\n {submitAction && (\n <div className=\"px-4 pb-4\">\n <button\n type=\"submit\"\n className=\"px-3 py-1.5 !text-sm rounded-lg font-medium transition-colors\"\n >\n {submitAction.label || 'Submit'}\n </button>\n </div>\n )}\n </form>\n );\n}\n","import { ImageWidget } from '../../../types/widgets';\n\ninterface ImageProps {\n widget: ImageWidget;\n}\n\nexport function Image({ widget }: ImageProps) {\n const { src, alt, caption } = widget.props;\n\n return (\n <figure className=\"overflow-hidden rounded-xl\">\n <img\n src={src}\n alt={alt}\n className=\"w-full h-auto object-contain bg-neutral-100 dark:bg-neutral-800\"\n loading=\"lazy\"\n />\n {caption && (\n <figcaption className=\"mt-2 text-center text-sm text-neutral-600 dark:text-neutral-400\">\n {caption}\n </figcaption>\n )}\n </figure>\n );\n}\n","import { FlowWidget, FlowStep } from '../../../types/widgets';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface FlowProps {\n widget: FlowWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\n// Icon components for different step types\nfunction StepIcon({ type, status }: { type?: string; status?: FlowStep['status'] }) {\n // Status-based icons (for execution tracking)\n if (status === 'completed') {\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n );\n }\n if (status === 'error') {\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n );\n }\n if (status === 'active') {\n return (\n <div className=\"w-3.5 h-3.5 rounded-full bg-current animate-pulse\" />\n );\n }\n\n // Type-based icons\n const iconClass = \"w-4 h-4\";\n\n if (type === 'time' || type === 'schedule' || type === 'clock') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n );\n }\n if (type === 'recurring' || type === 'repeat') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n );\n }\n if (type === 'agent' || type?.startsWith('@')) {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n }\n if (type === 'email' || type === 'mail') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n );\n }\n if (type === 'slack' || type === 'message' || type === 'chat') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n );\n }\n if (type === 'webhook' || type === 'api') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n );\n }\n if (type === 'build' || type === 'compile' || type === 'package') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\" />\n </svg>\n );\n }\n if (type === 'test' || type === 'check' || type === 'verify') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 </svg>\n );\n }\n if (type === 'deploy' || type === 'rocket' || type === 'launch') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n );\n }\n if (type === 'push' || type === 'upload' || type === 'cloud') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n );\n }\n if (type === 'generate' || type === 'create' || type === 'document' || type === 'file') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 if (type === 'review' || type === 'inspect' || type === 'eye') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n );\n }\n if (type === 'analyze' || type === 'research' || type === 'chart') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n );\n }\n if (type === 'scrape' || type === 'crawl' || type === 'spider') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\" />\n </svg>\n );\n }\n if (type === 'data' || type === 'database' || type === 'storage') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\" />\n </svg>\n );\n }\n if (type === 'notification' || type === 'bell' || type === 'alert') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\n </svg>\n );\n }\n if (type === 'transform' || type === 'process' || type === 'convert') {\n return (\n <svg className={iconClass} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4\" />\n </svg>\n );\n }\n\n // Default circle icon\n return (\n <div className=\"w-2 h-2 rounded-full bg-current opacity-50\" />\n );\n}\n\n// Header icon based on flow type\nfunction HeaderIcon({ icon }: { icon?: string }) {\n const baseClass = \"w-6 h-6\";\n\n if (icon === 'research' || icon === 'multi-agent' || icon === 'agents') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-purple-100 dark:bg-purple-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-purple-600 dark:text-purple-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'schedule' || icon === 'report' || icon === 'calendar') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-amber-100 dark:bg-amber-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-amber-600 dark:text-amber-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'recurring' || icon === 'repeat' || icon === 'sync') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-cyan-100 dark:bg-cyan-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-cyan-600 dark:text-cyan-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n );\n }\n if (icon === 'analyze' || icon === 'analysis' || icon === 'chart') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-cyan-100 dark:bg-cyan-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-cyan-600 dark:text-cyan-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'deploy' || icon === 'rocket' || icon === 'launch') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-blue-100 dark:bg-blue-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-blue-600 dark:text-blue-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'automation' || icon === 'workflow' || icon === 'process') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-indigo-100 dark:bg-indigo-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-indigo-600 dark:text-indigo-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z\" />\n </svg>\n </div>\n );\n }\n if (icon === 'data' || icon === 'pipeline' || icon === 'etl') {\n return (\n <div className=\"w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/20 flex items-center justify-center\">\n <svg className={`${baseClass} text-emerald-600 dark:text-emerald-400`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4\" />\n </svg>\n </div>\n );\n }\n\n // Default task/workflow icon\n return (\n <div className=\"w-10 h-10 rounded-lg bg-neutral-100 dark:bg-neutral-700 flex items-center justify-center\">\n <svg className={`${baseClass} text-neutral-600 dark:text-neutral-300`} fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 2\" />\n </svg>\n </div>\n );\n}\n\nfunction Chevron() {\n return (\n <svg className=\"w-4 h-4 text-neutral-400 dark:text-neutral-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\n// Step color styles - using static Tailwind classes\ntype StepColor = 'blue' | 'purple' | 'cyan' | 'amber' | 'emerald' | 'rose' | 'indigo' | 'orange' | 'neutral';\n\nconst STEP_COLOR_CLASSES: Record<StepColor, string> = {\n blue: 'bg-blue-100 dark:bg-blue-900/40 !text-blue-700 dark:!text-blue-300 border-blue-300 dark:border-blue-500',\n purple: 'bg-purple-100 dark:bg-purple-900/40 !text-purple-700 dark:!text-purple-300 border-purple-300 dark:border-purple-500',\n cyan: 'bg-cyan-100 dark:bg-cyan-900/40 !text-cyan-700 dark:!text-cyan-300 border-cyan-300 dark:border-cyan-500',\n amber: 'bg-amber-100 dark:bg-amber-900/40 !text-amber-700 dark:!text-amber-300 border-amber-300 dark:border-amber-500',\n emerald: 'bg-emerald-100 dark:bg-emerald-900/40 !text-emerald-700 dark:!text-emerald-300 border-emerald-300 dark:border-emerald-500',\n rose: 'bg-rose-100 dark:bg-rose-900/40 !text-rose-700 dark:!text-rose-300 border-rose-300 dark:border-rose-500',\n indigo: 'bg-indigo-100 dark:bg-indigo-900/40 !text-indigo-700 dark:!text-indigo-300 border-indigo-300 dark:border-indigo-500',\n orange: 'bg-orange-100 dark:bg-orange-900/40 !text-orange-700 dark:!text-orange-300 border-orange-300 dark:border-orange-500',\n neutral: 'bg-neutral-100 dark:bg-neutral-800 !text-neutral-600 dark:!text-neutral-300 border-neutral-300 dark:border-neutral-600',\n};\n\n// Get color based on step type\nfunction getStepColorClass(step: FlowStep, stepType?: string): string {\n // If step has explicit color\n if (step.color && STEP_COLOR_CLASSES[step.color as StepColor]) {\n return STEP_COLOR_CLASSES[step.color as StepColor];\n }\n\n // Auto-assign colors based on step type\n if (stepType === 'time' || stepType === 'schedule' || stepType === 'clock') {\n return STEP_COLOR_CLASSES.blue;\n }\n if (stepType === 'agent' || stepType?.startsWith('@')) {\n return STEP_COLOR_CLASSES.purple;\n }\n if (stepType === 'email' || stepType === 'slack' || stepType === 'message' || stepType === 'notification') {\n return STEP_COLOR_CLASSES.cyan;\n }\n if (stepType === 'generate' || stepType === 'document' || stepType === 'create') {\n return STEP_COLOR_CLASSES.amber;\n }\n if (stepType === 'deploy' || stepType === 'rocket' || stepType === 'launch') {\n return STEP_COLOR_CLASSES.rose;\n }\n if (stepType === 'build' || stepType === 'compile' || stepType === 'package') {\n return STEP_COLOR_CLASSES.indigo;\n }\n if (stepType === 'test' || stepType === 'check' || stepType === 'verify') {\n return STEP_COLOR_CLASSES.emerald;\n }\n if (stepType === 'data' || stepType === 'database' || stepType === 'storage') {\n return STEP_COLOR_CLASSES.orange;\n }\n\n // Default blue\n return STEP_COLOR_CLASSES.blue;\n}\n\nexport function Flow({ widget }: FlowProps) {\n const { title, subtitle, icon, steps } = widget.props as any;\n\n return (\n <div className=\"rounded-xl bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-700 overflow-hidden\">\n {/* Header */}\n <div className=\"px-4 py-4 flex items-center gap-4\">\n <HeaderIcon icon={icon} />\n\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-semibold text-base text-neutral-900 dark:text-white truncate\">{title}</h3>\n {subtitle && (\n <p className=\"text-sm text-neutral-500 dark:text-neutral-400 truncate mt-0.5\">{subtitle}</p>\n )}\n </div>\n </div>\n\n {/* Steps - Horizontal pill flow */}\n <div className=\"px-4 pb-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {steps.map((step: FlowStep, index: number) => {\n const isLast = index === steps.length - 1;\n const isActive = step.status === 'active';\n const isCompleted = step.status === 'completed';\n const isError = step.status === 'error';\n const isSkipped = step.status === 'skipped';\n\n // Determine step type from label or explicit type\n const label = step.label;\n let stepType = step.type;\n if (!stepType) {\n // Auto-detect type from label\n if (label.startsWith('@')) stepType = 'agent';\n else if (/^\\d+[ap]m$/i.test(label) || /^(mon|tue|wed|thu|fri|sat|sun)/i.test(label)) stepType = 'time';\n else {\n const lowerLabel = label.toLowerCase();\n const typeMap: Record<string, string> = {\n 'test': 'test', 'build': 'build', 'push': 'push', 'deploy': 'deploy',\n 'email': 'email', 'slack': 'slack', 'generate': 'generate', 'review': 'review',\n 'analyze': 'analyze', 'scrape': 'scrape', 'transform': 'transform',\n 'notify': 'notification', 'alert': 'notification', 'webhook': 'webhook',\n 'api': 'api', 'data': 'data', 'process': 'process'\n };\n stepType = typeMap[lowerLabel];\n }\n }\n\n // Get classes based on status or step type\n let pillClasses: string;\n let extraClasses = '';\n\n if (isActive) {\n pillClasses = 'bg-blue-100 dark:bg-blue-900/40 !text-blue-700 dark:!text-blue-300 border-blue-400 dark:border-blue-400 ring-2 ring-blue-400';\n } else if (isCompleted) {\n pillClasses = 'bg-emerald-100 dark:bg-emerald-900/40 !text-emerald-700 dark:!text-emerald-300 border-emerald-400 dark:border-emerald-400';\n } else if (isError) {\n pillClasses = 'bg-red-100 dark:bg-red-900/40 !text-red-700 dark:!text-red-300 border-red-400 dark:border-red-400';\n } else if (isSkipped) {\n pillClasses = 'bg-neutral-100 dark:bg-neutral-800 !text-neutral-400 dark:!text-neutral-500 border-neutral-300 dark:border-neutral-600';\n extraClasses = 'line-through';\n } else {\n // Proposal mode - use colorful pills based on type\n pillClasses = getStepColorClass(step, stepType);\n }\n\n return (\n <div key={step.id} className=\"flex items-center gap-2\">\n <span className={`inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-medium border transition-colors ${pillClasses} ${extraClasses}`}>\n <StepIcon type={stepType} status={step.status} />\n {label}\n </span>\n {!isLast && <Chevron />}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n","import { KpiWidget } from '../../../types/interface';\nimport { ActionEvent } from '../../../types/actions';\n\ninterface KpiProps {\n widget: KpiWidget;\n onAction?: (action: ActionEvent) => void;\n}\n\nconst trendIcons: Record<string, { symbol: string; color: string }> = {\n up: { symbol: '\\u2191', color: 'text-emerald-500' },\n down: { symbol: '\\u2193', color: 'text-red-500' },\n flat: { symbol: '\\u2192', color: 'text-neutral-400' },\n};\n\nexport function Kpi({ widget, onAction }: KpiProps) {\n const { title, label = '', value = '', change, trend } = widget.props || {};\n const trendInfo = trend ? trendIcons[trend] : null;\n\n return (\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-900 p-5\">\n {title && (\n <h3 className=\"!text-base font-semibold !text-neutral-900 dark:!text-white mb-3\">{title}</h3>\n )}\n <div className=\"!text-sm font-medium !text-neutral-500 dark:!text-neutral-400 mb-1\">{label}</div>\n <div className=\"flex items-end gap-2\">\n <div className=\"apteva-kpi-value !text-2xl font-bold !text-neutral-900 dark:!text-white\">{value}</div>\n {change && trendInfo && (\n <div className={`flex items-center gap-0.5 !text-sm font-medium ${trendInfo.color} mb-0.5`}>\n <span>{trendInfo.symbol}</span>\n <span>{change}</span>\n </div>\n )}\n {change && !trendInfo && (\n <div className=\"!text-sm font-medium !text-neutral-400 mb-0.5\">{change}</div>\n )}\n </div>\n {widget.actions && widget.actions.length > 0 && (\n <div className=\"flex gap-2 mt-3 pt-3 border-t border-neutral-200 dark:border-neutral-700\">\n {widget.actions.map((action, idx) => (\n <button\n key={idx}\n onClick={() =>\n onAction?.({\n type: action.type,\n payload: action.payload,\n widgetId: widget.id,\n timestamp: new Date(),\n })\n }\n className=\"px-2 py-1 !text-xs rounded font-medium transition-colors bg-neutral-100 dark:bg-neutral-800 !text-neutral-600 dark:!text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700\"\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { TextBlockWidget } from '../../../types/interface';\n\ninterface TextBlockProps {\n widget: TextBlockWidget;\n}\n\nexport function TextBlock({ widget }: TextBlockProps) {\n const { content = '', variant = 'body' } = widget.props || {};\n\n const variantClasses: Record<string, string> = {\n heading: '!text-xl font-bold !text-neutral-900 dark:!text-white',\n body: '!text-sm !text-neutral-700 dark:!text-neutral-300 leading-relaxed',\n caption: '!text-xs !text-neutral-500 dark:!text-neutral-400',\n };\n\n // Simple markdown: **bold**, *italic*, `code`, [links](url), ## headings, - lists\n const renderMarkdown = (text: string) => {\n const lines = text.split('\\n');\n const elements: React.ReactNode[] = [];\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n\n // Headings\n if (line.startsWith('### ')) {\n elements.push(\n <h3 key={i} className=\"!text-base font-semibold !text-neutral-900 dark:!text-white mt-3 mb-1\">\n {renderInline(line.slice(4))}\n </h3>\n );\n } else if (line.startsWith('## ')) {\n elements.push(\n <h2 key={i} className=\"!text-lg font-bold !text-neutral-900 dark:!text-white mt-4 mb-1\">\n {renderInline(line.slice(3))}\n </h2>\n );\n }\n // List items\n else if (/^[-*+]\\s/.test(line)) {\n const listItems: React.ReactNode[] = [];\n while (i < lines.length && /^[-*+]\\s/.test(lines[i])) {\n listItems.push(\n <li key={i} className=\"ml-4 list-disc\">{renderInline(lines[i].slice(2))}</li>\n );\n i++;\n }\n elements.push(<ul key={`list-${i}`} className=\"my-1 space-y-0.5\">{listItems}</ul>);\n continue; // skip the i++ at bottom\n }\n // Empty line\n else if (line.trim() === '') {\n elements.push(<div key={i} className=\"h-2\" />);\n }\n // Normal paragraph\n else {\n elements.push(<p key={i} className=\"my-0.5\">{renderInline(line)}</p>);\n }\n\n i++;\n }\n\n return elements;\n };\n\n const renderInline = (text: string): React.ReactNode => {\n // Process inline markdown: **bold**, *italic*, `code`, [link](url)\n const parts: React.ReactNode[] = [];\n let remaining = text;\n let key = 0;\n\n while (remaining.length > 0) {\n // Bold\n const boldMatch = remaining.match(/\\*\\*(.+?)\\*\\*/);\n // Code\n const codeMatch = remaining.match(/`(.+?)`/);\n // Link\n const linkMatch = remaining.match(/\\[(.+?)\\]\\((.+?)\\)/);\n\n // Find earliest match\n const matches = [\n boldMatch ? { type: 'bold', index: boldMatch.index!, match: boldMatch } : null,\n codeMatch ? { type: 'code', index: codeMatch.index!, match: codeMatch } : null,\n linkMatch ? { type: 'link', index: linkMatch.index!, match: linkMatch } : null,\n ].filter(Boolean).sort((a, b) => a!.index - b!.index);\n\n if (matches.length === 0) {\n parts.push(remaining);\n break;\n }\n\n const first = matches[0]!;\n if (first.index > 0) {\n parts.push(remaining.slice(0, first.index));\n }\n\n if (first.type === 'bold') {\n parts.push(<strong key={key++} className=\"font-semibold\">{first.match[1]}</strong>);\n remaining = remaining.slice(first.index + first.match[0].length);\n } else if (first.type === 'code') {\n parts.push(\n <code key={key++} className=\"px-1 py-0.5 bg-neutral-100 dark:bg-neutral-800 rounded text-xs font-mono\">\n {first.match[1]}\n </code>\n );\n remaining = remaining.slice(first.index + first.match[0].length);\n } else if (first.type === 'link') {\n parts.push(\n <a key={key++} href={first.match[2]} className=\"text-blue-500 hover:underline\" target=\"_blank\" rel=\"noopener noreferrer\">\n {first.match[1]}\n </a>\n );\n remaining = remaining.slice(first.index + first.match[0].length);\n }\n }\n\n return parts.length === 1 ? parts[0] : <>{parts}</>;\n };\n\n return (\n <div className={variantClasses[variant] || variantClasses.body}>\n {renderMarkdown(content)}\n </div>\n );\n}\n","import { SpacerWidget } from '../../../types/interface';\n\ninterface SpacerProps {\n widget: SpacerWidget;\n}\n\nconst heightClasses: Record<string, string> = {\n sm: 'h-2',\n md: 'h-4',\n lg: 'h-8',\n};\n\nexport function Spacer({ widget }: SpacerProps) {\n const { height = 'md', variant = 'space' } = widget.props || {};\n\n if (variant === 'line') {\n return (\n <div className={heightClasses[height] || heightClasses.md + ' flex items-center'}>\n <hr className=\"w-full border-neutral-200 dark:border-neutral-700\" />\n </div>\n );\n }\n\n return <div className={heightClasses[height] || heightClasses.md} />;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { LiveViewWidget } from '../../../types/widgets';\nimport { cn } from '../../../utils';\n\ninterface LiveViewProps {\n widget: LiveViewWidget;\n}\n\nexport function LiveView({ widget }: LiveViewProps) {\n const { src, title, height, aspectRatio = '16/9', allowFullscreen = true, sandbox, allow, refreshInterval, showToolbar = true } = widget.props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const [refreshKey, setRefreshKey] = useState(0);\n\n const handleRefresh = useCallback(() => {\n setIsLoading(true);\n setHasError(false);\n setRefreshKey(k => k + 1);\n }, []);\n\n const handleFullscreen = useCallback(() => {\n iframeRef.current?.requestFullscreen?.();\n }, []);\n\n const handleOpenExternal = useCallback(() => {\n window.open(src, '_blank', 'noopener,noreferrer');\n }, [src]);\n\n useEffect(() => {\n if (!refreshInterval || refreshInterval <= 0) return;\n const interval = setInterval(handleRefresh, refreshInterval * 1000);\n return () => clearInterval(interval);\n }, [refreshInterval, handleRefresh]);\n\n const aspectMap = { '16/9': '56.25%', '4/3': '75%', '1/1': '100%' };\n const useFixedHeight = !!height;\n\n return (\n <div className=\"rounded-xl overflow-hidden border border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900\">\n {/* Toolbar */}\n {showToolbar && (\n <div className=\"flex items-center justify-between px-3 py-2 bg-neutral-100 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className={cn(\n 'w-2 h-2 rounded-full flex-shrink-0',\n hasError ? 'bg-red-500' : isLoading ? 'bg-amber-500 animate-pulse' : 'bg-emerald-500'\n )} />\n <span className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300 truncate\">\n {title || 'Live View'}\n </span>\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <button\n onClick={handleRefresh}\n className=\"p-1.5 rounded-md text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title=\"Refresh\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </button>\n <button\n onClick={handleOpenExternal}\n className=\"p-1.5 rounded-md text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title=\"Open in new tab\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n </svg>\n </button>\n {allowFullscreen && (\n <button\n onClick={handleFullscreen}\n className=\"p-1.5 rounded-md text-neutral-500 hover:text-neutral-700 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title=\"Fullscreen\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5v-4m0 4h-4m4 0l-5-5\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Iframe container */}\n <div\n className=\"relative bg-white dark:bg-neutral-950\"\n style={useFixedHeight\n ? { height }\n : { paddingBottom: aspectMap[aspectRatio] || aspectMap['16/9'] }\n }\n >\n {/* Loading overlay */}\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-neutral-100 dark:bg-neutral-900 z-10\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-6 h-6 border-2 border-neutral-300 dark:border-neutral-600 border-t-blue-500 rounded-full animate-spin\" />\n <span className=\"text-xs text-neutral-500\">Loading...</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {hasError && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-neutral-100 dark:bg-neutral-900 z-10\">\n <div className=\"flex flex-col items-center gap-2 text-center px-4\">\n <svg className=\"w-8 h-8 text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" />\n </svg>\n <span className=\"text-sm text-neutral-500\">Failed to load</span>\n <button\n onClick={handleRefresh}\n className=\"text-xs text-blue-500 hover:text-blue-600 underline\"\n >\n Try again\n </button>\n </div>\n </div>\n )}\n\n <iframe\n key={refreshKey}\n ref={iframeRef}\n src={src}\n title={title || 'Live View'}\n className={cn(\n 'border-0 bg-white dark:bg-neutral-950',\n useFixedHeight ? 'w-full h-full' : 'absolute inset-0 w-full h-full'\n )}\n allowFullScreen={allowFullscreen}\n sandbox={sandbox}\n allow={allow}\n onLoad={() => setIsLoading(false)}\n onError={() => { setIsLoading(false); setHasError(true); }}\n />\n </div>\n </div>\n );\n}\n","// No direct imports needed 'react';\nimport { Widget } from '../../types/widgets';\nimport { ActionEvent } from '../../types/actions';\nimport { Card, List, Button, ButtonGroup, Table, Form, Image, Flow, Kpi, TextBlock, Spacer, LiveView } from './widget-library';\n\ninterface WidgetRendererProps {\n widget: Widget;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function WidgetRenderer({ widget, onAction }: WidgetRendererProps) {\n const renderWidget = () => {\n switch (widget.type) {\n case 'card':\n return <Card widget={widget as any} onAction={onAction} />;\n case 'list':\n return <List widget={widget as any} onAction={onAction} />;\n case 'button':\n return <Button widget={widget as any} onAction={onAction} />;\n case 'button_group':\n return <ButtonGroup widget={widget as any} onAction={onAction} />;\n case 'table':\n return <Table widget={widget as any} onAction={onAction} />;\n case 'form':\n return <Form widget={widget as any} onAction={onAction} />;\n case 'image':\n return <Image widget={widget as any} />;\n case 'flow':\n return <Flow widget={widget as any} />;\n case 'kpi':\n return <Kpi widget={widget as any} onAction={onAction} />;\n case 'text_block':\n return <TextBlock widget={widget as any} />;\n case 'spacer':\n return <Spacer widget={widget as any} />;\n case 'live_view':\n return <LiveView widget={widget as any} />;\n default:\n return (\n <div className=\"p-4 border border-yellow-300 bg-yellow-50 rounded-lg\">\n <p className=\"text-sm text-yellow-800\">Unknown widget type: {widget.type}</p>\n <pre className=\"text-xs mt-2 overflow-auto\">{JSON.stringify(widget, null, 2)}</pre>\n </div>\n );\n }\n };\n\n return <div className=\"apteva-widget\">{renderWidget()}</div>;\n}\n","import { cn } from '../../utils/cn';\n\ninterface WidgetSkeletonProps {\n type: string;\n className?: string;\n}\n\nexport function WidgetSkeleton({ type, className }: WidgetSkeletonProps) {\n // Render different skeletons based on widget type\n // Using neutral colors for true black/white theme\n switch (type) {\n case 'card':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 overflow-hidden', className)}>\n <div className=\"p-4 space-y-3\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-3/4\"></div>\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-full\"></div>\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-5/6\"></div>\n </div>\n </div>\n );\n\n case 'list':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse space-y-2', className)}>\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex items-center gap-3 p-3 rounded-lg border border-neutral-200 dark:border-neutral-800\">\n <div className=\"w-10 h-10 bg-neutral-200 dark:bg-neutral-700 rounded-full flex-shrink-0\"></div>\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2\"></div>\n <div className=\"h-2 bg-neutral-200 dark:bg-neutral-700 rounded w-3/4\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n\n case 'button_group':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse flex gap-2', className)}>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded-lg w-20\"></div>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded-lg w-20\"></div>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded-lg w-20\"></div>\n </div>\n );\n\n case 'form':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 p-4 space-y-4', className)}>\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/3\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-10 bg-neutral-200 dark:bg-neutral-700 rounded\"></div>\n <div className=\"h-10 bg-neutral-200 dark:bg-neutral-700 rounded\"></div>\n </div>\n <div className=\"h-9 bg-neutral-200 dark:bg-neutral-700 rounded w-24\"></div>\n </div>\n );\n\n case 'chart':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 p-4', className)}>\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/4 mb-4\"></div>\n <div className=\"flex items-end gap-2 h-32\">\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-1/2\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-3/4\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-1/3\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-full\"></div>\n <div className=\"flex-1 bg-neutral-200 dark:bg-neutral-700 rounded-t h-2/3\"></div>\n </div>\n </div>\n );\n\n case 'image':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse', className)}>\n <div className=\"aspect-video bg-neutral-200 dark:bg-neutral-700 rounded-lg\"></div>\n </div>\n );\n\n case 'gallery':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse grid grid-cols-3 gap-2', className)}>\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"aspect-square bg-neutral-200 dark:bg-neutral-700 rounded-lg\"></div>\n ))}\n </div>\n );\n\n case 'map':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse', className)}>\n <div className=\"h-48 bg-neutral-200 dark:bg-neutral-700 rounded-lg flex items-center justify-center\">\n <svg className=\"w-8 h-8 text-neutral-400 dark:text-neutral-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n </div>\n );\n\n case 'table':\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 overflow-hidden', className)}>\n {/* Header */}\n <div className=\"flex bg-neutral-100 dark:bg-neutral-800 border-b border-neutral-200 dark:border-neutral-700\">\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-300 dark:bg-neutral-600 rounded w-16\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-300 dark:bg-neutral-600 rounded w-20\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-300 dark:bg-neutral-600 rounded w-14\"></div>\n </div>\n </div>\n {/* Rows */}\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"flex border-b border-neutral-200 dark:border-neutral-800 last:border-b-0\">\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-24\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-16\"></div>\n </div>\n <div className=\"flex-1 px-4 py-3\">\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-20\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n\n default:\n // Generic skeleton for unknown widget types\n return (\n <div className={cn('apteva-widget-skeleton animate-pulse rounded-lg border border-neutral-200 dark:border-neutral-800 p-4', className)}>\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2 mb-2\"></div>\n <div className=\"h-3 bg-neutral-200 dark:bg-neutral-700 rounded w-full\"></div>\n </div>\n );\n }\n}\n","import React from 'react';\n\ninterface MarkdownContentProps {\n content: string;\n className?: string;\n}\n\n// Check if URL points to an image\nfunction isImageUrl(url: string): boolean {\n const imageExtensions = /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico)(\\?.*)?$/i;\n return imageExtensions.test(url);\n}\n\nfunction parseInlineMarkdown(text: string, keyPrefix: string = ''): React.ReactNode[] {\n const result: React.ReactNode[] = [];\n // Combined regex for inline elements:\n // 1. Images: ![alt](url)\n // 2. Links: [text](url)\n // 3. Bold: **text** or __text__\n // 4. Inline code: `code`\n const inlineRegex = /!\\[([^\\]]*)\\]\\(([^)]+)\\)|\\[([^\\]]+)\\]\\(([^)]+)\\)|(\\*\\*|__)(.+?)\\5|`([^`]+)`/g;\n\n let lastIndex = 0;\n let match;\n let key = 0;\n\n while ((match = inlineRegex.exec(text)) !== null) {\n // Add text before the match\n if (match.index > lastIndex) {\n result.push(text.slice(lastIndex, match.index));\n }\n\n if (match[1] !== undefined || match[2] !== undefined) {\n // Image: ![alt](url)\n const alt = match[1] || '';\n const src = match[2];\n result.push(\n <img\n key={`${keyPrefix}img${key++}`}\n src={src}\n alt={alt}\n className=\"apteva-md-img\"\n />\n );\n } else if (match[3] !== undefined || match[4] !== undefined) {\n // Link: [text](url)\n const linkText = match[3];\n const href = match[4];\n\n // Check if link URL is an image - render as image instead\n if (isImageUrl(href)) {\n result.push(\n <img\n key={`${keyPrefix}img${key++}`}\n src={href}\n alt={linkText}\n className=\"apteva-md-img\"\n />\n );\n } else {\n result.push(\n <a\n key={`${keyPrefix}a${key++}`}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"apteva-md-link\"\n >\n {linkText}\n </a>\n );\n }\n } else if (match[5] !== undefined) {\n // Bold: **text** or __text__\n result.push(<strong key={`${keyPrefix}b${key++}`}>{match[6]}</strong>);\n } else if (match[7] !== undefined) {\n // Inline code: `code`\n result.push(\n <code key={`${keyPrefix}code${key++}`} className=\"apteva-md-inline-code\">\n {match[7]}\n </code>\n );\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (lastIndex < text.length) {\n result.push(text.slice(lastIndex));\n }\n\n return result.length > 0 ? result : [text];\n}\n\nfunction parseMarkdown(content: string): React.ReactNode[] {\n const lines = content.split('\\n');\n const result: React.ReactNode[] = [];\n let key = 0;\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Check for headings (## or ###)\n const h2Match = line.match(/^##\\s+(.*)$/);\n if (h2Match) {\n result.push(\n <h2 key={`h2${key++}`} className=\"apteva-md-h2\">\n {parseInlineMarkdown(h2Match[1], `${key}`)}\n </h2>\n );\n i++;\n continue;\n }\n\n const h3Match = line.match(/^###\\s+(.*)$/);\n if (h3Match) {\n result.push(\n <h3 key={`h3${key++}`} className=\"apteva-md-h3\">\n {parseInlineMarkdown(h3Match[1], `${key}`)}\n </h3>\n );\n i++;\n continue;\n }\n\n // Check for unordered list item (-, *, +)\n const ulMatch = line.match(/^(\\s*)([-*+])\\s+(.*)$/);\n if (ulMatch) {\n const listItems: React.ReactNode[] = [];\n const indent = ulMatch[1].length;\n\n while (i < lines.length) {\n const itemMatch = lines[i].match(/^(\\s*)([-*+])\\s+(.*)$/);\n if (itemMatch && itemMatch[1].length === indent) {\n listItems.push(\n <li key={`li${key++}`} className=\"apteva-md-li\">{parseInlineMarkdown(itemMatch[3], `${key}`)}</li>\n );\n i++;\n } else {\n break;\n }\n }\n\n result.push(\n <ul key={`ul${key++}`} className=\"apteva-md-ul\">\n {listItems}\n </ul>\n );\n continue;\n }\n\n // Check for ordered list item (1., 2., etc.)\n const olMatch = line.match(/^(\\s*)(\\d+)\\.\\s+(.*)$/);\n if (olMatch) {\n const listItems: React.ReactNode[] = [];\n const indent = olMatch[1].length;\n\n while (i < lines.length) {\n const itemMatch = lines[i].match(/^(\\s*)(\\d+)\\.\\s+(.*)$/);\n if (itemMatch && itemMatch[1].length === indent) {\n listItems.push(\n <li key={`li${key++}`} className=\"apteva-md-li\">{parseInlineMarkdown(itemMatch[3], `${key}`)}</li>\n );\n i++;\n } else {\n break;\n }\n }\n\n result.push(\n <ol key={`ol${key++}`} className=\"apteva-md-ol\">\n {listItems}\n </ol>\n );\n continue;\n }\n\n // Check for markdown table\n const tableMatch = line.match(/^\\|(.+)\\|$/);\n if (tableMatch && i + 1 < lines.length) {\n // Check if next line is separator (|---|---|)\n const separatorLine = lines[i + 1];\n const separatorMatch = separatorLine.match(/^\\|([\\s:-]+\\|)+$/);\n\n if (separatorMatch) {\n // Parse header\n const headerCells = line.split('|').filter(cell => cell.trim() !== '').map(cell => cell.trim());\n\n // Skip header and separator lines\n i += 2;\n\n // Parse body rows\n const bodyRows: string[][] = [];\n while (i < lines.length) {\n const rowMatch = lines[i].match(/^\\|(.+)\\|$/);\n if (rowMatch) {\n const cells = lines[i].split('|').filter(cell => cell.trim() !== '').map(cell => cell.trim());\n bodyRows.push(cells);\n i++;\n } else {\n break;\n }\n }\n\n result.push(\n <div key={`table-wrapper${key++}`} className=\"apteva-md-table-wrapper\">\n <table className=\"apteva-md-table\">\n <thead>\n <tr>\n {headerCells.map((cell, idx) => (\n <th key={`th${idx}`} className=\"apteva-md-th\">{parseInlineMarkdown(cell, `th${key}${idx}`)}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {bodyRows.map((row, rowIdx) => (\n <tr key={`tr${rowIdx}`}>\n {row.map((cell, cellIdx) => (\n <td key={`td${cellIdx}`} className=\"apteva-md-td\">{parseInlineMarkdown(cell, `td${key}${rowIdx}${cellIdx}`)}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n continue;\n }\n }\n\n // Regular line - parse inline markdown and preserve line breaks\n if (line === '') {\n result.push(<br key={`br${key++}`} />);\n } else {\n result.push(\n <span key={`p${key++}`}>\n {parseInlineMarkdown(line, `${key}`)}\n {i < lines.length - 1 ? '\\n' : ''}\n </span>\n );\n }\n i++;\n }\n\n return result;\n}\n\nexport function MarkdownContent({ content, className = '' }: MarkdownContentProps) {\n // Strip stray <ui> tags the AI sometimes outputs\n const cleaned = content.replace(/<\\/?ui\\s*\\/?>/gi, '');\n return (\n <div className={`apteva-md ${className}`}>\n {parseMarkdown(cleaned)}\n </div>\n );\n}\n","interface ToolCallProps {\n name: string;\n status: 'preparing' | 'running' | 'completed' | 'error';\n isReceiving?: boolean; // True when actively receiving chunks\n inputLength?: number; // Character count of tool input\n streamOutput?: string; // Accumulated output from tool_stream chunks\n variant?: 'card' | 'inline';\n}\n\nexport function ToolCall({ name, status, isReceiving = false, inputLength = 0, streamOutput, variant = 'card' }: ToolCallProps) {\n // ==================== INLINE VARIANT ====================\n if (variant === 'inline') {\n const statusText = status === 'preparing'\n ? `${name} preparing...`\n : status === 'running'\n ? streamOutput ? `${name} · ${streamOutput}` : `${name}...`\n : status === 'error'\n ? `${name} failed`\n : name;\n\n return (\n <div className=\"apteva-tool-inline\">\n <div className=\"apteva-tool-inline-line\" />\n <div className=\"apteva-tool-inline-content\">\n {status === 'running' || status === 'preparing' ? (\n <svg className=\"apteva-tool-inline-icon apteva-tool-icon-spin\" width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"></path>\n </svg>\n ) : (\n <svg className=\"apteva-tool-inline-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" fill=\"currentColor\" />\n </svg>\n )}\n <span className=\"apteva-tool-inline-text\">{statusText}</span>\n </div>\n <div className=\"apteva-tool-inline-line\" />\n </div>\n );\n }\n\n // ==================== CARD VARIANT (default) ====================\n if (status === 'preparing') {\n return (\n <div className=\"apteva-tool-card apteva-tool-card-preparing\">\n <svg className=\"apteva-tool-icon apteva-tool-icon-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"></path>\n </svg>\n <span className=\"apteva-tool-label\">\n <strong>{name}</strong>\n <span className=\"apteva-tool-status-text\"> preparing...</span>\n </span>\n </div>\n );\n }\n\n if (status === 'running') {\n return (\n <div className=\"apteva-tool-card apteva-tool-card-running\">\n <svg className=\"apteva-tool-icon apteva-tool-icon-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"></path>\n </svg>\n <span className=\"apteva-tool-label\">\n <strong>{name}</strong>\n {streamOutput ? (\n <span className=\"apteva-tool-stream-separator\"> · </span>\n ) : null}\n {streamOutput ? (\n <span className=\"apteva-tool-stream-output\">{streamOutput}</span>\n ) : (\n <>\n <span className=\"apteva-tool-status-text\"> running</span>\n <span className=\"apteva-tool-dots\">\n <span>.</span><span>.</span><span>.</span>\n </span>\n </>\n )}\n </span>\n </div>\n );\n }\n\n if (status === 'completed') {\n return (\n <div className=\"apteva-tool-card apteva-tool-card-completed\">\n <svg className=\"apteva-tool-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\"></path>\n </svg>\n <span className=\"apteva-tool-label\">{name}</span>\n </div>\n );\n }\n\n // Error state\n return (\n <div className=\"apteva-tool-card apteva-tool-card-error\">\n <svg className=\"apteva-tool-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n <span className=\"apteva-tool-label\">{name} failed</span>\n </div>\n );\n}\n","import { useState } from 'react';\n\ninterface ToolSegment {\n id: string;\n name: string;\n status: 'preparing' | 'running' | 'completed' | 'error';\n isReceiving?: boolean;\n streamOutput?: string;\n}\n\ninterface ToolCallGroupProps {\n tools: ToolSegment[];\n}\n\nexport function ToolCallGroup({ tools }: ToolCallGroupProps) {\n const completed = tools.filter(t => t.status === 'completed').length;\n const errored = tools.filter(t => t.status === 'error').length;\n const running = tools.filter(t => t.status === 'running').length;\n const preparing = tools.filter(t => t.status === 'preparing').length;\n const total = tools.length;\n const allDone = completed + errored === total;\n\n const [expanded, setExpanded] = useState(false);\n\n // Show expanded by default while tools are still running\n const isExpanded = allDone ? expanded : true;\n\n // Find the currently active tool (for stream output display)\n const activeStreamTool = tools.find(t => t.status === 'running' && t.streamOutput);\n\n const statusText = allDone\n ? `Used ${total} tools`\n : `Using ${total} tools${completed > 0 ? ` · ${completed}/${total} done` : ''}`;\n\n // Overall card style based on group status\n const cardClass = allDone\n ? errored > 0\n ? 'apteva-tool-group apteva-tool-group-error'\n : 'apteva-tool-group apteva-tool-group-completed'\n : 'apteva-tool-group apteva-tool-group-running';\n\n return (\n <div className={cardClass}>\n {/* Header */}\n <button\n className=\"apteva-tool-group-header\"\n onClick={() => setExpanded(!expanded)}\n >\n <div className=\"apteva-tool-group-header-left\">\n {allDone ? (\n <svg className=\"apteva-tool-group-icon\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"apteva-tool-group-icon apteva-tool-icon-spin\" width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"apteva-tool-spinner-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"apteva-tool-spinner-fill\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n )}\n <span className=\"apteva-tool-group-status\">{statusText}</span>\n </div>\n <svg\n className={`apteva-tool-group-chevron ${isExpanded ? 'apteva-tool-group-chevron-open' : ''}`}\n width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {/* Active stream output (shown even when collapsed) */}\n {!isExpanded && activeStreamTool && (\n <div className=\"apteva-tool-group-stream\">\n <span className=\"apteva-tool-group-stream-name\">{activeStreamTool.name}:</span>\n <span className=\"apteva-tool-group-stream-text\">{activeStreamTool.streamOutput}</span>\n </div>\n )}\n\n {/* Expanded tool list */}\n {isExpanded && (\n <div className=\"apteva-tool-group-list\">\n {tools.map(tool => (\n <div key={tool.id} className=\"apteva-tool-group-item\">\n {tool.status === 'completed' ? (\n <svg className=\"apteva-tool-group-item-icon apteva-tool-group-item-done\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : tool.status === 'error' ? (\n <svg className=\"apteva-tool-group-item-icon apteva-tool-group-item-error\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ) : (\n <div className=\"apteva-tool-group-item-icon apteva-tool-group-item-spinner\" />\n )}\n <span className=\"apteva-tool-group-item-name\">{tool.name}</span>\n {tool.streamOutput && tool.status === 'running' && (\n <span className=\"apteva-tool-group-item-stream\">{tool.streamOutput}</span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { Widget } from '../../types/widgets';\n\ninterface PersistentWidgetRefProps {\n widget: Widget;\n}\n\n/** Compact inline reference card shown in messages for widgets that live in the persistent panel */\nexport function PersistentWidgetRef({ widget }: PersistentWidgetRefProps) {\n const title = widget.props.title || widget.type.replace(/_/g, ' ');\n\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-neutral-100 dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 text-sm\">\n <div className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse flex-shrink-0\" />\n <span className=\"text-neutral-600 dark:text-neutral-400 capitalize\">{title}</span>\n <span className=\"text-neutral-400 dark:text-neutral-500 text-xs ml-auto\">pinned above</span>\n </div>\n );\n}\n","import { SuggestedPrompt } from '../../types/components';\nimport { cn } from '../../utils';\n\ninterface WelcomeScreenProps {\n title?: string;\n subtitle?: string;\n icon?: React.ReactNode;\n prompts?: (string | SuggestedPrompt)[];\n variant?: 'centered' | 'minimal';\n chatVariant?: 'default' | 'minimal' | 'terminal';\n onPromptClick: (prompt: string) => void;\n}\n\n// Default icon - chat bubble\nconst DefaultIcon = () => (\n <svg className=\"w-12 h-12 sm:w-16 sm:h-16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n);\n\n\n// Default prompt icons\nconst ArrowIcon = () => (\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=\"M13 7l5 5m0 0l-5 5m5-5H6\" />\n </svg>\n);\n\nexport function WelcomeScreen({\n title,\n subtitle,\n icon,\n prompts,\n variant = 'centered',\n chatVariant = 'default',\n onPromptClick,\n}: WelcomeScreenProps) {\n // Normalize prompts to SuggestedPrompt format\n const normalizedPrompts: SuggestedPrompt[] = (prompts || []).map((p) =>\n typeof p === 'string' ? { text: p } : p\n );\n\n const hasPrompts = normalizedPrompts.length > 0;\n const hasHeader = title || subtitle || icon;\n\n // If nothing to show, render default empty state\n if (!hasHeader && !hasPrompts) {\n return (\n <div className=\"flex items-center justify-center h-full !text-neutral-500 dark:!text-neutral-400\">\n <div className=\"text-center space-y-2\">\n <div className=\"flex justify-center\">\n <DefaultIcon />\n </div>\n <p className=\"text-sm\">No messages yet. Start a conversation!</p>\n </div>\n </div>\n );\n }\n\n // Minimal variant - just prompts as a list (good for mobile/embedded)\n if (variant === 'minimal') {\n return (\n <div className=\"flex flex-col h-full px-4 py-4\">\n {hasHeader && (\n <div className=\"mb-4\">\n {title && (\n <h2 className=\"text-lg font-semibold !text-neutral-900 dark:!text-white\">{title}</h2>\n )}\n {subtitle && (\n <p className=\"text-sm !text-neutral-500 dark:!text-neutral-400 mt-1\">{subtitle}</p>\n )}\n </div>\n )}\n {hasPrompts && (\n <div className=\"flex-1 space-y-2\">\n {normalizedPrompts.map((prompt, index) => (\n <button\n key={index}\n onClick={() => onPromptClick(prompt.text)}\n className={cn(\n 'w-full text-left px-4 py-3 rounded-xl',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border border-neutral-200 dark:border-neutral-700',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'hover:border-neutral-300 dark:hover:border-neutral-600',\n 'transition-all duration-200',\n 'group'\n )}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-shrink-0 !text-neutral-400 dark:!text-neutral-500 group-hover:!text-blue-500 dark:group-hover:!text-blue-400 transition-colors\">\n {prompt.icon || <ArrowIcon />}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium !text-neutral-900 dark:!text-white truncate\">\n {prompt.text}\n </p>\n {prompt.description && (\n <p className=\"text-xs !text-neutral-500 dark:!text-neutral-400 mt-0.5 truncate\">\n {prompt.description}\n </p>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n // Centered variant - hero style with grid of prompts (default)\n return (\n <div className=\"flex flex-col items-center justify-center h-full px-4 py-6 sm:py-8\">\n {/* Header Section */}\n <div className=\"text-center mb-6 sm:mb-8 max-w-md\">\n {/* Icon */}\n <div className=\"mb-4 !text-neutral-400 dark:!text-neutral-500 flex justify-center\">\n {icon || <DefaultIcon />}\n </div>\n\n {/* Title */}\n {title && (\n <h1 className=\"text-xl sm:text-2xl font-semibold !text-neutral-900 dark:!text-white mb-2\">\n {title}\n </h1>\n )}\n\n {/* Subtitle */}\n {subtitle && (\n <p className=\"text-sm sm:text-base !text-neutral-500 dark:!text-neutral-400\">{subtitle}</p>\n )}\n </div>\n\n {/* Prompts Section */}\n {hasPrompts && (\n <div className=\"w-full max-w-2xl\">\n {/* Mobile: Vertical list */}\n <div className=\"sm:hidden space-y-2\">\n {normalizedPrompts.map((prompt, index) => (\n <button\n key={index}\n onClick={() => onPromptClick(prompt.text)}\n className={cn(\n 'w-full text-left px-4 py-3 rounded-xl',\n 'bg-white dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'hover:border-blue-300 dark:hover:border-blue-600',\n 'active:scale-[0.98]',\n 'transition-all duration-200',\n 'shadow-sm hover:shadow',\n 'group'\n )}\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-lg bg-neutral-100 dark:bg-neutral-700 flex items-center justify-center !text-neutral-500 dark:!text-neutral-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/30 group-hover:!text-blue-600 dark:group-hover:!text-blue-400 transition-colors\">\n {prompt.icon || <ArrowIcon />}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium !text-neutral-900 dark:!text-white\">\n {prompt.text}\n </p>\n {prompt.description && (\n <p className=\"text-xs !text-neutral-500 dark:!text-neutral-400 mt-0.5 line-clamp-1\">\n {prompt.description}\n </p>\n )}\n </div>\n <svg\n className=\"w-4 h-4 !text-neutral-400 group-hover:!text-blue-500 transition-colors flex-shrink-0\"\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 5l7 7-7 7\"\n />\n </svg>\n </div>\n </button>\n ))}\n </div>\n\n {/* Desktop: Grid layout */}\n <div className=\"hidden sm:grid sm:grid-cols-2 gap-3\">\n {normalizedPrompts.map((prompt, index) => (\n <button\n key={index}\n onClick={() => onPromptClick(prompt.text)}\n className={cn(\n 'text-left p-4 rounded-xl',\n 'bg-white dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'hover:border-blue-300 dark:hover:border-blue-600',\n 'hover:shadow-md',\n 'active:scale-[0.98]',\n 'transition-all duration-200',\n 'group'\n )}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-shrink-0 w-9 h-9 rounded-lg bg-neutral-100 dark:bg-neutral-700 flex items-center justify-center !text-neutral-500 dark:!text-neutral-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/30 group-hover:!text-blue-600 dark:group-hover:!text-blue-400 transition-colors\">\n {prompt.icon || <ArrowIcon />}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium !text-neutral-900 dark:!text-white leading-snug\">\n {prompt.text}\n </p>\n {prompt.description && (\n <p className=\"text-xs !text-neutral-500 dark:!text-neutral-400 mt-1 line-clamp-2\">\n {prompt.description}\n </p>\n )}\n </div>\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback, KeyboardEvent, useRef } from 'react';\nimport { validateFile, formatFileSize } from '../../utils';\n\n// Web Speech API type declarations (not in default TS lib)\ninterface SpeechRecognitionResult {\n readonly isFinal: boolean;\n readonly length: number;\n [index: number]: { transcript: string; confidence: number };\n}\n\ninterface SpeechRecognitionResultList {\n readonly length: number;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionEvent extends Event {\n readonly results: SpeechRecognitionResultList;\n readonly resultIndex: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n readonly error: string;\n readonly message: string;\n}\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ninterface SpeechToTextConfig {\n language?: string;\n silenceTimeout?: number;\n autoSend?: boolean;\n}\n\ninterface ComposerProps {\n onSendMessage: (text: string, files?: File[]) => void;\n placeholder?: string;\n disabled?: boolean;\n isLoading?: boolean;\n onStop?: () => void;\n onFileUpload?: (files: FileList) => void;\n onSwitchMode?: () => void;\n speechToText?: boolean | SpeechToTextConfig;\n}\n\ninterface PendingFile {\n file: File;\n preview?: string;\n}\n\n// Check browser support for SpeechRecognition\nconst getSpeechRecognition = (): (new () => SpeechRecognition) | null => {\n if (typeof window === 'undefined') return null;\n return (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition || null;\n};\n\nexport function Composer({ onSendMessage, placeholder = 'Type a message...', disabled = false, isLoading = false, onStop, onFileUpload, onSwitchMode, speechToText }: ComposerProps) {\n const [text, setText] = useState('');\n const [showMenu, setShowMenu] = useState(false);\n const [pendingFiles, setPendingFiles] = useState<PendingFile[]>([]);\n const [fileError, setFileError] = useState<string | null>(null);\n const [isMultiLine, setIsMultiLine] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n // Speech-to-text state\n const [isRecording, setIsRecording] = useState(false);\n const [recordingTime, setRecordingTime] = useState(0);\n const [transcriptFlash, setTranscriptFlash] = useState<string | null>(null);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const animFrameRef = useRef<number>(0);\n const silenceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const recordingTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const finalTranscriptRef = useRef('');\n const manualStopRef = useRef(false);\n\n // Parse speech config\n const sttConfig: SpeechToTextConfig | null = speechToText\n ? (typeof speechToText === 'object' ? speechToText : {})\n : null;\n const sttSupported = !!sttConfig && !!getSpeechRecognition();\n const silenceTimeout = sttConfig?.silenceTimeout ?? 2000;\n const autoSend = sttConfig?.autoSend !== false;\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n stopRecording(true);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const drawWaveform = useCallback(() => {\n const canvas = canvasRef.current;\n const analyser = analyserRef.current;\n if (!canvas || !analyser) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n const draw = () => {\n animFrameRef.current = requestAnimationFrame(draw);\n analyser.getByteTimeDomainData(dataArray);\n\n const { width, height } = canvas;\n ctx.clearRect(0, 0, width, height);\n\n // Draw bars (ChatGPT style)\n const barCount = 32;\n const barWidth = Math.max(2, (width - (barCount - 1) * 2) / barCount);\n const gap = 2;\n const samplesPerBar = Math.floor(bufferLength / barCount);\n\n for (let i = 0; i < barCount; i++) {\n // Average amplitude for this bar\n let sum = 0;\n for (let j = 0; j < samplesPerBar; j++) {\n const val = dataArray[i * samplesPerBar + j] - 128;\n sum += Math.abs(val);\n }\n const avg = sum / samplesPerBar;\n // Scale to bar height (min 3px, max 80% of canvas height)\n const barHeight = Math.max(3, (avg / 128) * height * 2.5);\n\n const x = i * (barWidth + gap);\n const y = (height - barHeight) / 2;\n\n ctx.fillStyle = '#3b82f6';\n ctx.beginPath();\n ctx.roundRect(x, y, barWidth, barHeight, barWidth / 2);\n ctx.fill();\n }\n };\n\n draw();\n }, []);\n\n const startRecording = useCallback(async () => {\n const SpeechRecognitionCtor = getSpeechRecognition();\n if (!SpeechRecognitionCtor) return;\n\n try {\n // Request mic access\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n\n // Set up audio analyser for waveform\n const audioCtx = new AudioContext();\n audioContextRef.current = audioCtx;\n const source = audioCtx.createMediaStreamSource(stream);\n const analyser = audioCtx.createAnalyser();\n analyser.fftSize = 256;\n source.connect(analyser);\n analyserRef.current = analyser;\n\n // Set up speech recognition\n const recognition = new SpeechRecognitionCtor();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang = sttConfig?.language || navigator.language || 'en-US';\n recognitionRef.current = recognition;\n\n finalTranscriptRef.current = '';\n manualStopRef.current = false;\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n let final = '';\n let interim = '';\n for (let i = 0; i < event.results.length; i++) {\n const result = event.results[i];\n if (result.isFinal) {\n final += result[0].transcript;\n } else {\n interim += result[0].transcript;\n }\n }\n finalTranscriptRef.current = final;\n\n // Reset silence timer on new speech\n if (silenceTimerRef.current) {\n clearTimeout(silenceTimerRef.current);\n }\n silenceTimerRef.current = setTimeout(() => {\n // Silence detected — auto-stop\n stopRecording(false);\n }, silenceTimeout);\n };\n\n recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n if (event.error !== 'aborted') {\n console.warn('Speech recognition error:', event.error);\n }\n stopRecording(true);\n };\n\n recognition.onend = () => {\n // If recognition ends unexpectedly (not from our manual stop), finalize\n if (!manualStopRef.current && isRecording) {\n finishRecording();\n }\n };\n\n recognition.start();\n setIsRecording(true);\n setRecordingTime(0);\n\n // Start timer\n recordingTimerRef.current = setInterval(() => {\n setRecordingTime(t => t + 1);\n }, 1000);\n\n // Start waveform drawing\n // Small delay to ensure canvas is mounted\n requestAnimationFrame(() => drawWaveform());\n\n // Start initial silence timer (if user doesn't speak at all)\n silenceTimerRef.current = setTimeout(() => {\n stopRecording(false);\n }, silenceTimeout + 1000); // Give a bit more time at start\n } catch (err) {\n console.warn('Microphone access denied or error:', err);\n setFileError('Microphone access denied');\n setTimeout(() => setFileError(null), 3000);\n }\n }, [sttConfig?.language, silenceTimeout, drawWaveform]);\n\n const finishRecording = useCallback(() => {\n const transcript = finalTranscriptRef.current.trim();\n setIsRecording(false);\n setRecordingTime(0);\n\n if (transcript) {\n if (autoSend) {\n // Flash the transcript briefly, then auto-send\n setTranscriptFlash(transcript);\n setTimeout(() => {\n setTranscriptFlash(null);\n onSendMessage(transcript);\n }, 600);\n } else {\n // Insert into textarea for review\n setText(prev => prev ? `${prev} ${transcript}` : transcript);\n }\n }\n }, [autoSend, onSendMessage]);\n\n const stopRecording = useCallback((isCleanupOnly: boolean) => {\n manualStopRef.current = true;\n\n // Stop silence timer\n if (silenceTimerRef.current) {\n clearTimeout(silenceTimerRef.current);\n silenceTimerRef.current = null;\n }\n\n // Stop recording timer\n if (recordingTimerRef.current) {\n clearInterval(recordingTimerRef.current);\n recordingTimerRef.current = null;\n }\n\n // Stop waveform animation\n if (animFrameRef.current) {\n cancelAnimationFrame(animFrameRef.current);\n animFrameRef.current = 0;\n }\n\n // Stop speech recognition\n if (recognitionRef.current) {\n try { recognitionRef.current.stop(); } catch (_e) {}\n recognitionRef.current = null;\n }\n\n // Stop media stream\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(t => t.stop());\n mediaStreamRef.current = null;\n }\n\n // Close audio context\n if (audioContextRef.current) {\n try { audioContextRef.current.close(); } catch (_e) {}\n audioContextRef.current = null;\n }\n analyserRef.current = null;\n\n if (!isCleanupOnly) {\n finishRecording();\n } else {\n setIsRecording(false);\n setRecordingTime(0);\n }\n }, [finishRecording]);\n\n const formatTime = (seconds: number) => {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleSend = () => {\n const hasText = text.trim();\n const hasFiles = pendingFiles.length > 0;\n\n if ((hasText || hasFiles) && !disabled) {\n const filesToSend = pendingFiles.map(pf => pf.file);\n onSendMessage(text.trim(), filesToSend.length > 0 ? filesToSend : undefined);\n setText('');\n setPendingFiles([]);\n setFileError(null);\n setIsMultiLine(false);\n // Reset textarea height\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n\n // Reset height to measure true content height\n e.target.style.height = 'auto';\n const scrollHeight = e.target.scrollHeight;\n e.target.style.height = `${scrollHeight}px`;\n\n const hasNewline = e.target.value.includes('\\n');\n\n // Single line height ≈ line-height + vertical padding (~36px)\n const singleLineHeight = 36;\n const isOverflowing = scrollHeight > singleLineHeight;\n\n // Switch TO multi-line when:\n // 1. User explicitly added newline (Shift+Enter), OR\n // 2. Content actually overflows to second line\n if (!isMultiLine && (hasNewline || isOverflowing)) {\n setIsMultiLine(true);\n }\n // Switch BACK to single-line when:\n // 1. No newlines, AND\n // 2. Content fits in single line, AND\n // 3. Text is short (hysteresis to prevent flicker)\n else if (isMultiLine && !hasNewline && !isOverflowing && e.target.value.length < 20) {\n setIsMultiLine(false);\n }\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n const files = Array.from(e.target.files);\n const validFiles: PendingFile[] = [];\n const errors: string[] = [];\n\n files.forEach(file => {\n const validation = validateFile(file);\n if (validation.valid) {\n const pending: PendingFile = { file };\n // Create preview for images\n if (file.type.startsWith('image/')) {\n pending.preview = URL.createObjectURL(file);\n }\n validFiles.push(pending);\n } else {\n errors.push(validation.error || 'Invalid file');\n }\n });\n\n if (validFiles.length > 0) {\n setPendingFiles(prev => [...prev, ...validFiles]);\n }\n\n if (errors.length > 0) {\n setFileError(errors.join(', '));\n setTimeout(() => setFileError(null), 5000);\n }\n\n // Also call the legacy callback if provided\n onFileUpload?.(e.target.files);\n setShowMenu(false);\n\n // Reset input so same file can be selected again\n e.target.value = '';\n }\n };\n\n const removeFile = (index: number) => {\n setPendingFiles(prev => {\n const file = prev[index];\n // Revoke object URL to prevent memory leak\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n return prev.filter((_, i) => i !== index);\n });\n };\n\n const getFileIcon = (mimeType: string) => {\n if (mimeType.startsWith('image/')) {\n return (\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=\"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 }\n if (mimeType === 'application/pdf') {\n return (\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=\"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 return (\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=\"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\n // Determine grid layout\n const hasMic = sttSupported && !isRecording;\n const gridCols = hasMic ? 'auto 1fr auto auto' : 'auto 1fr auto';\n const gridAreas = isRecording\n ? '\"plus waveform waveform stop\"'\n : isMultiLine\n ? hasMic\n ? '\"textarea textarea textarea textarea\" \"plus . mic send\"'\n : '\"textarea textarea textarea\" \"plus . send\"'\n : hasMic\n ? '\"plus textarea mic send\"'\n : '\"plus textarea send\"';\n const gridColsRecording = 'auto 1fr auto';\n\n return (\n <div className=\"px-4 py-3 relative\">\n {/* File Error Toast */}\n {fileError && (\n <div className=\"apteva-file-error\">\n <div className=\"apteva-file-error-content\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{fileError}</span>\n </div>\n </div>\n )}\n\n {/* Transcript Flash (shows briefly before auto-send) */}\n {transcriptFlash && (\n <div className=\"apteva-transcript-flash\">\n <span>{transcriptFlash}</span>\n </div>\n )}\n\n {/* Pending Files Preview */}\n {pendingFiles.length > 0 && !isRecording && (\n <div className=\"apteva-file-preview\">\n {pendingFiles.map((pf, index) => (\n <div key={index} className=\"apteva-file-item\">\n {pf.preview ? (\n <img src={pf.preview} alt={pf.file.name} className=\"apteva-file-thumb\" />\n ) : (\n <div className=\"apteva-file-icon\">\n {getFileIcon(pf.file.type)}\n </div>\n )}\n <div className=\"apteva-file-info\">\n <span className=\"apteva-file-name\">{pf.file.name}</span>\n <span className=\"apteva-file-size\">{formatFileSize(pf.file.size)}</span>\n </div>\n <button\n onClick={() => removeFile(index)}\n className=\"apteva-file-remove\"\n title=\"Remove file\"\n >\n <svg 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 </div>\n ))}\n </div>\n )}\n\n <div\n className=\"apteva-composer\"\n style={{\n gridTemplateColumns: isRecording ? gridColsRecording : gridCols,\n gridTemplateAreas: isRecording\n ? '\"plus waveform stop\"'\n : gridAreas,\n alignItems: 'end'\n }}\n >\n {/* Menu button / Recording indicator */}\n <div className=\"relative flex-shrink-0 self-end\" style={{ gridArea: 'plus' }}>\n {isRecording ? (\n <div className=\"apteva-composer-rec-dot\" title=\"Recording...\">\n <span />\n </div>\n ) : (\n <>\n <button\n ref={menuButtonRef}\n onClick={() => setShowMenu(!showMenu)}\n className=\"apteva-composer-menu-btn w-8 h-8 rounded-lg flex items-center justify-center transition-all !text-neutral-700 dark:!text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"More options\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 5v10M5 10h10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n\n {/* Menu Popup - fixed positioning to escape overflow:hidden */}\n {showMenu && (\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setShowMenu(false)} />\n <div\n className=\"apteva-composer-menu fixed bg-neutral-800 dark:bg-neutral-800 rounded-xl shadow-lg overflow-hidden z-[9999] min-w-[200px]\"\n style={{\n left: menuButtonRef.current?.getBoundingClientRect().left ?? 0,\n bottom: window.innerHeight - (menuButtonRef.current?.getBoundingClientRect().top ?? 0) + 8,\n }}\n >\n <button\n onClick={() => {\n fileInputRef.current?.click();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.5 3.5L5.5 8.5C4.67157 9.32843 4.67157 10.6716 5.5 11.5C6.32843 12.3284 7.67157 12.3284 8.5 11.5L14.5 5.5C15.8807 4.11929 15.8807 1.88071 14.5 0.5C13.1193 -0.880711 10.8807 -0.880711 9.5 0.5L3.5 6.5C1.56846 8.43154 1.56846 11.5685 3.5 13.5C5.43154 15.4315 8.56846 15.4315 10.5 13.5L15.5 8.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(2, 3)\"/>\n </svg>\n <span className=\"!text-sm font-medium\">Add photos & files</span>\n </button>\n {onSwitchMode && (\n <button\n onClick={() => {\n onSwitchMode();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left border-t border-neutral-700 dark:border-neutral-700\"\n >\n <svg className=\"w-4.5 h-4.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n <span className=\"!text-sm font-medium\">Switch to command mode</span>\n </button>\n )}\n </div>\n </>\n )}\n </>\n )}\n </div>\n\n {isRecording ? (\n <>\n {/* Waveform + Timer */}\n <div className=\"apteva-composer-waveform\" style={{ gridArea: 'waveform' }}>\n <canvas\n ref={canvasRef}\n width={300}\n height={36}\n className=\"apteva-composer-waveform-canvas\"\n />\n <span className=\"apteva-composer-recording-timer\">{formatTime(recordingTime)}</span>\n </div>\n\n {/* Stop button */}\n <div className=\"self-end\" style={{ gridArea: 'stop' }}>\n <button\n onClick={() => stopRecording(false)}\n className=\"apteva-composer-stop-btn\"\n title=\"Stop recording\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"10\" height=\"10\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n </button>\n </div>\n </>\n ) : (\n <>\n {/* Textarea */}\n <textarea\n ref={textareaRef}\n value={text}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className=\"apteva-composer-textarea resize-none bg-transparent border-none focus:outline-none !text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 py-1 disabled:opacity-50 disabled:cursor-not-allowed overflow-y-auto max-h-[200px]\"\n style={{ gridArea: 'textarea' }}\n rows={1}\n />\n\n {/* Mic button (only if STT enabled and supported) */}\n {sttSupported && (\n <div className=\"self-end\" style={{ gridArea: 'mic' }}>\n <button\n onClick={startRecording}\n disabled={disabled || isLoading}\n className=\"apteva-composer-mic-btn\"\n title=\"Voice input\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 1a3 3 0 00-3 3v8a3 3 0 006 0V4a3 3 0 00-3-3z\" fill=\"currentColor\"/>\n <path d=\"M19 10v2a7 7 0 01-14 0v-2\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M12 19v4M8 23h8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n </div>\n )}\n\n {/* Send/Stop button */}\n <div className=\"self-end\" style={{ gridArea: 'send' }}>\n {isLoading && onStop ? (\n <button\n onClick={onStop}\n className=\"apteva-composer-stop-btn\"\n title=\"Stop generation\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"10\" height=\"10\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n </button>\n ) : (\n <button\n onClick={handleSend}\n disabled={(!text.trim() && pendingFiles.length === 0) || disabled}\n className=\"apteva-composer-send-btn w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0 border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 !text-neutral-700 dark:!text-neutral-300 hover:bg-neutral-50 dark:hover:bg-neutral-700 disabled:opacity-30 disabled:cursor-not-allowed !text-lg\"\n title=\"Send message\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n )}\n </div>\n </>\n )}\n </div>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileSelect}\n className=\"hidden\"\n accept=\"image/*,application/pdf,.doc,.docx,.txt\"\n />\n </div>\n );\n}\n","import { useState, useRef, KeyboardEvent } from 'react';\nimport { cn, validateFile, formatFileSize } from '../../utils';\n\ntype CommandState = 'idle' | 'loading' | 'success' | 'error' | 'plan-pending';\n\ninterface PendingFile {\n file: File;\n preview?: string;\n}\n\ninterface CommandComposerProps {\n onExecute: (command: string, files?: File[]) => void;\n state: CommandState;\n response?: string;\n error?: string;\n plan?: string;\n streamedContent?: string;\n toolName?: string | null;\n onApprove?: () => void;\n onReject?: () => void;\n onReset?: () => void;\n onStop?: () => void;\n onExpand?: () => void;\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport function CommandComposer({\n onExecute,\n state,\n response,\n error,\n plan,\n streamedContent,\n toolName,\n onApprove,\n onReject,\n onReset,\n onStop,\n onExpand,\n placeholder = 'Enter your command...',\n disabled = false,\n}: CommandComposerProps) {\n const [input, setInput] = useState('');\n const [pendingFiles, setPendingFiles] = useState<PendingFile[]>([]);\n const [fileError, setFileError] = useState<string | null>(null);\n const [showMenu, setShowMenu] = useState(false);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const menuButtonRef = useRef<HTMLButtonElement>(null);\n\n const handleSubmit = () => {\n const hasText = input.trim();\n const hasFiles = pendingFiles.length > 0;\n\n if ((hasText || hasFiles) && !disabled && state === 'idle') {\n const filesToSend = pendingFiles.map(pf => pf.file);\n onExecute(input.trim(), filesToSend.length > 0 ? filesToSend : undefined);\n setInput('');\n setPendingFiles([]);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const handleNewCommand = () => {\n onReset?.();\n inputRef.current?.focus();\n };\n\n const handleInputChange = (value: string) => {\n setInput(value);\n if (inputRef.current) {\n inputRef.current.style.height = 'auto';\n inputRef.current.style.height = `${Math.min(inputRef.current.scrollHeight, 120)}px`;\n }\n };\n\n const handleFileSelect = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n const files = Array.from(e.target.files);\n const validFiles: PendingFile[] = [];\n const errors: string[] = [];\n\n files.forEach(file => {\n const validation = validateFile(file);\n if (validation.valid) {\n const pending: PendingFile = { file };\n if (file.type.startsWith('image/')) {\n pending.preview = URL.createObjectURL(file);\n }\n validFiles.push(pending);\n } else {\n errors.push(validation.error || 'Invalid file');\n }\n });\n\n if (validFiles.length > 0) {\n setPendingFiles(prev => [...prev, ...validFiles]);\n }\n\n if (errors.length > 0) {\n setFileError(errors.join(', '));\n setTimeout(() => setFileError(null), 5000);\n }\n\n setShowMenu(false);\n e.target.value = '';\n }\n };\n\n const removeFile = (index: number) => {\n setPendingFiles(prev => {\n const file = prev[index];\n if (file.preview) {\n URL.revokeObjectURL(file.preview);\n }\n return prev.filter((_, i) => i !== index);\n });\n };\n\n const getFileIcon = (mimeType: string) => {\n if (mimeType.startsWith('image/')) {\n return (\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=\"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 }\n if (mimeType === 'application/pdf') {\n return (\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=\"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 return (\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=\"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\n // Get display content based on state - show ONE thing at a time, replacing previous\n const getDisplayContent = (): { text: string; isToolCall: boolean } => {\n if (state === 'loading') {\n // Priority: tool call > streamed content > processing message\n if (toolName) {\n return { text: toolName, isToolCall: true };\n }\n // Only show streamed content if we have it (and no active tool)\n if (streamedContent) {\n return { text: streamedContent, isToolCall: false };\n }\n return { text: 'Processing...', isToolCall: false };\n }\n if (state === 'success' && response) {\n return { text: response, isToolCall: false };\n }\n if (state === 'error' && error) {\n return { text: error, isToolCall: false };\n }\n if (state === 'plan-pending' && plan) {\n return { text: plan, isToolCall: false };\n }\n return { text: '', isToolCall: false };\n };\n\n const isShowingResult = state !== 'idle';\n const { text: displayContent, isToolCall } = getDisplayContent();\n\n return (\n <div className=\"w-full relative\">\n {/* File Error Toast */}\n {fileError && (\n <div className=\"apteva-file-error\" style={{ top: '-3rem', bottom: 'auto' }}>\n <div className=\"apteva-file-error-content\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>{fileError}</span>\n </div>\n </div>\n )}\n\n {/* Single input/output box */}\n <div\n className={cn(\n 'apteva-composer flex items-center gap-2 px-3 py-2 border-2 bg-white dark:bg-neutral-900 transition-all duration-200',\n state === 'idle' && 'border-neutral-200 dark:border-neutral-700',\n state === 'loading' && 'border-blue-400 dark:border-blue-500',\n state === 'plan-pending' && 'border-amber-400 dark:border-amber-500',\n state === 'success' && 'border-green-400 dark:border-green-500',\n state === 'error' && 'border-red-400 dark:border-red-500'\n )}\n >\n {/* Left side indicator area - fixed width to prevent layout shift */}\n <div className=\"w-8 h-8 flex items-center justify-center flex-shrink-0\">\n {/* Add file button - only in idle state */}\n {state === 'idle' && (\n <div className=\"relative\">\n <button\n ref={menuButtonRef}\n onClick={() => setShowMenu(!showMenu)}\n className=\"apteva-composer-menu-btn w-8 h-8 rounded-lg flex items-center justify-center transition-all !text-neutral-500 dark:!text-neutral-400 hover:!text-neutral-700 dark:hover:!text-neutral-200 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"More options\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 5v10M5 10h10\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n\n {/* Menu Popup - fixed positioning to escape overflow:hidden */}\n {showMenu && (\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setShowMenu(false)} />\n <div\n className=\"apteva-composer-menu fixed bg-neutral-800 dark:bg-neutral-800 rounded-xl shadow-lg overflow-hidden z-[9999] min-w-[200px]\"\n style={{\n left: menuButtonRef.current?.getBoundingClientRect().left ?? 0,\n top: (menuButtonRef.current?.getBoundingClientRect().bottom ?? 0) + 8,\n }}\n >\n <button\n onClick={() => {\n fileInputRef.current?.click();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.5 3.5L5.5 8.5C4.67157 9.32843 4.67157 10.6716 5.5 11.5C6.32843 12.3284 7.67157 12.3284 8.5 11.5L14.5 5.5C15.8807 4.11929 15.8807 1.88071 14.5 0.5C13.1193 -0.880711 10.8807 -0.880711 9.5 0.5L3.5 6.5C1.56846 8.43154 1.56846 11.5685 3.5 13.5C5.43154 15.4315 8.56846 15.4315 10.5 13.5L15.5 8.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(2, 3)\"/>\n </svg>\n <span className=\"!text-sm font-medium\">Add photos & files</span>\n </button>\n {onExpand && (\n <button\n onClick={() => {\n onExpand();\n setShowMenu(false);\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 hover:bg-neutral-700 dark:hover:bg-neutral-700 transition-colors !text-white text-left border-t border-neutral-700 dark:border-neutral-700\"\n >\n <svg className=\"w-4.5 h-4.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n <span className=\"!text-sm font-medium\">Expand to chat</span>\n </button>\n )}\n </div>\n </>\n )}\n </div>\n )}\n\n {/* Loading spinner - show when loading without tool */}\n {state === 'loading' && !toolName && (\n <div className=\"w-4 h-4 border-2 border-blue-200 border-t-blue-500 rounded-full animate-spin\" />\n )}\n\n {/* Tool indicator - blinking dot like in chat mode */}\n {state === 'loading' && toolName && (\n <div className=\"w-2 h-2 rounded-full bg-blue-500 animate-pulse\" />\n )}\n </div>\n\n {/* Inline file badges - compact display */}\n {pendingFiles.length > 0 && state === 'idle' && (\n <div className=\"apteva-file-badges\">\n {pendingFiles.map((pf, index) => (\n <div key={index} className=\"apteva-file-badge\" title={pf.file.name}>\n {pf.preview ? (\n <img src={pf.preview} alt={pf.file.name} className=\"apteva-file-badge-img\" />\n ) : (\n <span className=\"apteva-file-badge-icon\">\n {getFileIcon(pf.file.type)}\n </span>\n )}\n <button\n onClick={() => removeFile(index)}\n className=\"apteva-file-badge-remove\"\n title=\"Remove\"\n >\n <svg 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 </div>\n ))}\n </div>\n )}\n\n {/* Content area - input OR result */}\n {state === 'idle' ? (\n <textarea\n ref={inputRef}\n value={input}\n onChange={(e) => handleInputChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={pendingFiles.length > 0 ? 'Add a message...' : placeholder}\n disabled={disabled}\n rows={1}\n className={cn(\n 'flex-1 resize-none bg-transparent border-none focus:outline-none',\n '!text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500',\n 'text-sm leading-relaxed py-1',\n 'disabled:opacity-50'\n )}\n style={{ minHeight: '24px', maxHeight: '120px' }}\n />\n ) : (\n <div\n className={cn(\n 'flex-1 text-sm py-1 truncate flex items-center gap-2',\n state === 'loading' && !isToolCall && '!text-neutral-600 dark:!text-neutral-400',\n state === 'loading' && isToolCall && '!text-blue-600 dark:!text-blue-400',\n state === 'success' && '!text-neutral-900 dark:!text-neutral-100',\n state === 'error' && '!text-red-600 dark:!text-red-400',\n state === 'plan-pending' && '!text-amber-700 dark:!text-amber-300'\n )}\n >\n {isToolCall ? (\n <>\n <span className=\"font-mono\">{displayContent}</span>\n <span className=\"text-neutral-400 dark:text-neutral-500\">Running...</span>\n </>\n ) : (\n displayContent\n )}\n </div>\n )}\n\n {/* Action buttons - fixed width container to prevent layout shift */}\n <div className=\"w-8 h-8 flex items-center justify-center flex-shrink-0\">\n {/* Plan mode buttons - these expand, so handle separately */}\n {state === 'plan-pending' ? (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={onApprove}\n className=\"px-2 py-1 bg-amber-500 text-white rounded-lg hover:bg-amber-600 transition-colors text-xs font-medium\"\n >\n Approve\n </button>\n <button\n onClick={onReject}\n className=\"px-2 py-1 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-xs font-medium\"\n >\n Modify\n </button>\n </div>\n ) : (\n <>\n {/* Stop button - during loading */}\n {state === 'loading' && onStop && (\n <button\n onClick={onStop}\n className=\"apteva-composer-stop-btn\"\n title=\"Stop generation\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"10\" height=\"10\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n </button>\n )}\n\n {/* Clear/New command button - after result */}\n {(state === 'success' || state === 'error') && (\n <button\n onClick={handleNewCommand}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center !text-neutral-400 hover:!text-neutral-600 dark:hover:!text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors\"\n title=\"New command\"\n >\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=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n\n {/* Send button - only in idle state */}\n {state === 'idle' && (\n <button\n onClick={handleSubmit}\n disabled={(!input.trim() && pendingFiles.length === 0) || disabled}\n className={cn(\n 'apteva-composer-send-btn w-8 h-8 rounded-lg flex items-center justify-center transition-all',\n 'border border-neutral-200 dark:border-neutral-700',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n (input.trim() || pendingFiles.length > 0)\n ? 'bg-neutral-900 dark:bg-white !text-white dark:!text-neutral-900 border-neutral-900 dark:border-white'\n : 'bg-white dark:bg-neutral-800 !text-neutral-400'\n )}\n title=\"Execute command\"\n >\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=\"M5 12h14M12 5l7 7-7 7\" />\n </svg>\n </button>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileSelect}\n className=\"hidden\"\n accept=\"image/*,application/pdf,.doc,.docx,.txt\"\n />\n </div>\n );\n}\n","export interface AptevaClientConfig {\n apiUrl?: string;\n apiKey?: string;\n}\n\ninterface ResolvedConfig {\n apiUrl: string;\n apiKey: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string | Array<{\n type: 'text' | 'tool_use' | 'tool_result';\n text?: string;\n id?: string;\n name?: string;\n input?: any;\n tool_use_id?: string;\n content?: string | Array<{ type: string; text?: string }>;\n is_error?: boolean;\n }>;\n id?: string;\n created_at?: string;\n}\n\nexport interface ChatRequest {\n agent_id: string;\n message: string | Array<{\n type: 'text' | 'image' | 'document';\n text?: string;\n source?: {\n type: 'base64';\n media_type: string;\n data: string;\n };\n }>;\n thread_id?: string;\n stream?: boolean;\n system?: string;\n}\n\nexport interface ChatResponse {\n message: string;\n thread_id: string;\n widgets?: any[];\n}\n\nexport interface StreamChunk {\n type: 'start' | 'thread_id' | 'request_id' | 'content' | 'token' | 'tool_call' | 'tool_input_delta' | 'tool_use' | 'tool_result' | 'tool_stream' | 'stop' | 'widget' | 'complete' | 'done' | 'error';\n content?: string;\n widget?: any;\n thread_id?: string;\n request_id?: string;\n tool_id?: string;\n tool_name?: string;\n tool_display_name?: string;\n error?: string;\n message?: string;\n event?: 'chunk' | 'log' | 'progress'; // For tool_stream events\n progress?: number; // For tool_stream progress events\n}\n\nclass AptevaClient {\n private config: ResolvedConfig;\n\n constructor(config?: AptevaClientConfig) {\n this.config = {\n apiUrl: config?.apiUrl ?? '',\n apiKey: config?.apiKey ?? '',\n };\n }\n\n /**\n * Update client configuration (optional - users can override defaults)\n */\n configure(config: AptevaClientConfig) {\n if (config.apiUrl !== undefined) this.config.apiUrl = config.apiUrl;\n if (config.apiKey !== undefined) this.config.apiKey = config.apiKey;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ResolvedConfig {\n return { ...this.config };\n }\n\n /**\n * Send a chat message to an agent\n */\n async chat(request: ChatRequest): Promise<ChatResponse> {\n try {\n console.log('[AptevaClient] Chat request:', {\n agent_id: request.agent_id,\n message: typeof request.message === 'string' ? request.message.substring(0, 100) + '...' : '[multi-part message]',\n system: request.system,\n stream: request.stream,\n });\n\n const response = await fetch(`${this.config.apiUrl}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n\n // Map API response format to expected format\n // API returns: { response, thread_id, success, model, trace_id }\n // We expect: { message, thread_id, widgets }\n return {\n message: data.response || data.message || '',\n thread_id: data.thread_id,\n widgets: data.widgets,\n };\n } catch (error) {\n console.error('Chat API error:', error);\n throw error;\n }\n }\n\n /**\n * Send a chat message with streaming response\n */\n async chatStream(\n request: ChatRequest,\n onChunk: (chunk: StreamChunk) => void,\n onComplete?: (threadId: string) => void,\n onError?: (error: Error) => void\n ): Promise<void> {\n try {\n console.log('[AptevaClient] Chat stream request:', {\n agent_id: request.agent_id,\n message: typeof request.message === 'string' ? request.message.substring(0, 100) + '...' : '[multi-part message]',\n system: request.system,\n stream: request.stream,\n });\n\n const response = await fetch(`${this.config.apiUrl}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n ...request,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let threadId = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) continue;\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n\n if (data === '[DONE]') {\n onComplete?.(threadId);\n return;\n }\n\n try {\n const chunk = JSON.parse(data);\n\n // Store thread_id if present in chunk\n if (chunk.thread_id) {\n threadId = chunk.thread_id;\n }\n\n // Pass through ALL chunk types to the handler\n onChunk(chunk);\n\n } catch (e) {\n console.warn('[AptevaClient] Failed to parse SSE data:', data);\n }\n }\n }\n }\n\n onComplete?.(threadId);\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Unknown error');\n onError?.(err);\n throw err;\n }\n }\n\n /**\n * Create a new thread\n */\n async createThread(agentId: string, metadata?: Record<string, any>): Promise<string> {\n const response = await fetch(`${this.config.apiUrl}/agents/${agentId}/threads`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ metadata }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n return data.thread_id;\n }\n\n /**\n * Get thread messages\n */\n async getThreadMessages(threadId: string): Promise<ChatMessage[]> {\n const response = await fetch(`${this.config.apiUrl}/threads/${threadId}/messages`, {\n method: 'GET',\n headers: {\n 'X-API-Key': this.config.apiKey,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(error.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n return data.messages;\n }\n\n /**\n * Cancel an in-progress request\n */\n async cancelRequest(agentId: string, requestId: string): Promise<void> {\n try {\n const response = await fetch(`${this.config.apiUrl}/agents/${agentId}/requests/${requestId}/cancel`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Cancel request failed' }));\n throw new Error(error.error || `Cancel request failed with status ${response.status}`);\n }\n } catch (error) {\n console.error('[AptevaClient] Cancel request error:', error);\n throw error;\n }\n }\n}\n\n// Export singleton instance\nexport const aptevaClient = new AptevaClient();\n\n// Export class for custom instances\nexport { AptevaClient };\n","import { useState } from 'react';\nimport { Widget } from '../../types/widgets';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { ActionEvent } from '../../types/actions';\nimport { cn } from '../../utils';\n\ninterface PersistentWidgetPanelProps {\n widgets: Widget[];\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function PersistentWidgetPanel({ widgets, onAction }: PersistentWidgetPanelProps) {\n const [collapsed, setCollapsed] = useState(false);\n\n if (widgets.length === 0) return null;\n\n return (\n <div className=\"apteva-persistent-panel border-b border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-900\">\n {/* Panel header */}\n <div className=\"flex items-center justify-between px-3 py-1.5\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400 uppercase tracking-wider\">\n Live\n </span>\n </div>\n <button\n onClick={() => setCollapsed(c => !c)}\n className=\"p-1 rounded text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n >\n <svg\n className={cn('w-3.5 h-3.5 transition-transform', collapsed && 'rotate-180')}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* Panel content */}\n {!collapsed && (\n <div className=\"px-3 pb-3 flex flex-col gap-3\">\n {widgets.map((widget) => (\n <WidgetRenderer key={widget.id} widget={widget} onAction={onAction} />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { cn } from '../../utils';\nimport { Widget } from '../../types/widgets';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { MarkdownContent } from './MarkdownContent';\nimport { ActionEvent } from '../../types/actions';\n\ninterface CommandOutputProps {\n state: 'idle' | 'loading' | 'success' | 'error' | 'plan-pending';\n streamedContent?: string;\n loadingText?: string;\n progress?: number;\n showProgress?: boolean;\n plan?: string;\n error?: Error | null;\n result?: {\n success: boolean;\n data: any;\n widgets?: Widget[];\n message?: string;\n } | null;\n onApprove?: () => void;\n onReject?: () => void;\n onReset?: () => void;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function CommandOutput({\n state,\n streamedContent,\n loadingText = 'Processing...',\n progress = 0,\n showProgress = true,\n plan,\n error,\n result,\n onApprove,\n onReject,\n onReset,\n onAction,\n}: CommandOutputProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Don't render anything in idle state\n if (state === 'idle') {\n return null;\n }\n\n // Loading state - compact inline indicator\n if (state === 'loading') {\n return (\n <div className=\"mx-4 mb-3\">\n <div className=\"flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-xl\">\n <div className=\"w-4 h-4 border-2 border-blue-300 border-t-blue-600 rounded-full animate-spin flex-shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-blue-700 dark:text-blue-300 truncate\">\n {streamedContent || loadingText}\n </p>\n {showProgress && progress > 0 && (\n <div className=\"mt-2 w-full bg-blue-200 dark:bg-blue-800 rounded-full h-1\">\n <div\n className=\"bg-blue-600 h-1 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Plan pending state\n if (state === 'plan-pending' && plan) {\n return (\n <div className=\"mx-4 mb-3\">\n <div className=\"p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-xl\">\n <div className=\"flex items-start gap-3 mb-3\">\n <svg className=\"w-5 h-5 text-blue-600 dark:text-blue-400 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-blue-800 dark:text-blue-300 mb-2\">Proposed Plan</h3>\n <div className=\"text-blue-700 dark:text-blue-300 text-sm whitespace-pre-line leading-relaxed\">\n {plan}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n onClick={onApprove}\n className=\"flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm font-medium\"\n >\n Approve & Execute\n </button>\n <button\n onClick={onReject}\n className=\"flex-1 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-sm font-medium\"\n >\n Modify\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Error state\n if (state === 'error' && error) {\n return (\n <div className=\"mx-4 mb-3\">\n <div className=\"p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-xl\">\n <div className=\"flex items-start gap-3\">\n <svg className=\"w-5 h-5 text-red-600 dark:text-red-400 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-red-800 dark:text-red-400\">Error</h3>\n <p className=\"text-red-700 dark:text-red-300 text-sm mt-1\">{error.message}</p>\n </div>\n <button\n onClick={onReset}\n className=\"p-1.5 text-red-600 dark:text-red-400 hover:bg-red-100 dark:hover:bg-red-900/30 rounded-lg transition-colors\"\n title=\"Dismiss\"\n >\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=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n // Success state - collapsible\n if (state === 'success' && result) {\n const hasDetailedContent = result.data?.summary || (result.widgets && result.widgets.length > 0);\n\n return (\n <div className=\"mx-4 mb-3\">\n <div className={cn(\n \"border border-green-200 dark:border-green-800 rounded-xl overflow-hidden transition-all duration-200\",\n isExpanded ? \"bg-white dark:bg-neutral-900\" : \"bg-green-50 dark:bg-green-900/20\"\n )}>\n {/* Collapsed header - always visible */}\n <div\n className={cn(\n \"flex items-center gap-3 p-3 cursor-pointer\",\n isExpanded && \"border-b border-green-200 dark:border-green-800 bg-green-50 dark:bg-green-900/20\"\n )}\n onClick={() => hasDetailedContent && setIsExpanded(!isExpanded)}\n >\n <svg className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-green-700 dark:text-green-300 truncate\">\n {result.message || 'Command executed successfully'}\n </p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {hasDetailedContent && (\n <button\n className=\"p-1.5 text-green-600 dark:text-green-400 hover:bg-green-100 dark:hover:bg-green-900/30 rounded-lg transition-colors\"\n title={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n <svg\n className={cn(\"w-4 h-4 transition-transform duration-200\", isExpanded && \"rotate-180\")}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n )}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onReset?.();\n }}\n className=\"p-1.5 text-green-600 dark:text-green-400 hover:bg-green-100 dark:hover:bg-green-900/30 rounded-lg transition-colors\"\n title=\"New command\"\n >\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=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Expanded content */}\n {isExpanded && hasDetailedContent && (\n <div className=\"p-4 space-y-4\">\n {result.data?.summary && (\n <div className=\"text-neutral-700 dark:text-neutral-300 text-sm leading-relaxed\">\n <MarkdownContent content={result.data.summary} />\n </div>\n )}\n {result.widgets && result.widgets.length > 0 && (\n <div className=\"space-y-3\">\n {result.widgets.map((widget) => (\n <WidgetRenderer key={widget.id} widget={widget} onAction={onAction} />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n return null;\n}\n","import React, { useState, useEffect } from 'react';\nimport { CommandProps, CommandResult } from '../../types/components';\nimport { cn, generateMockCommandWithWidgets, generateMockCommandStream, generateMockPlan } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\n\nexport function Command({\n agentId,\n command: initialCommand,\n context,\n autoExecute = false,\n allowInput = true,\n placeholder = 'Enter your command...',\n submitButtonText = 'Execute',\n variant = 'default',\n useMock = false,\n planMode = false,\n onPlanModeChange,\n enableFileUpload = true,\n onStart,\n onProgress,\n onChunk,\n onComplete,\n onError,\n onFileUpload,\n onAction,\n loadingText = 'Processing...',\n showProgress = true,\n enableStreaming = false,\n resultRenderer,\n className,\n}: CommandProps) {\n const [state, setState] = useState<'idle' | 'loading' | 'success' | 'error' | 'plan-pending'>('idle');\n const [result, setResult] = useState<CommandResult | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [progress, setProgress] = useState(0);\n const [command, setCommand] = useState(initialCommand || '');\n const [streamedContent, setStreamedContent] = useState('');\n const [plan, setPlan] = useState<string>('');\n const [pendingCommand, setPendingCommand] = useState<string>('');\n const [showPlanDetails, setShowPlanDetails] = useState(false);\n const [uploadedFiles, setUploadedFiles] = useState<Array<{ type: 'image' | 'document'; data: string; mediaType: string; preview?: string; name: string }>>([]);\n const [showSettingsMenu, setShowSettingsMenu] = useState(false);\n const [internalPlanMode, setInternalPlanMode] = useState(planMode);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (autoExecute && state === 'idle' && command) {\n executeCommand();\n }\n }, [autoExecute]);\n\n // Sync internal plan mode with prop when prop changes\n useEffect(() => {\n setInternalPlanMode(planMode);\n }, [planMode]);\n\n // Close settings menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (showSettingsMenu && !target.closest('.settings-menu-container')) {\n setShowSettingsMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showSettingsMenu]);\n\n const executeCommand = async (commandOverride?: string) => {\n const currentCommand = commandOverride || command;\n\n if (!currentCommand.trim()) {\n setError(new Error('Please enter a command'));\n setState('error');\n return;\n }\n\n // Plan mode: show plan first\n if (internalPlanMode && state !== 'plan-pending') {\n setState('loading');\n setError(null);\n setCommand(''); // Clear input\n\n // Generate plan (mock or real)\n if (useMock) {\n setTimeout(() => {\n const mockPlan = generateMockPlan(currentCommand);\n setPlan(mockPlan);\n setPendingCommand(currentCommand);\n setState('plan-pending');\n }, 800);\n } else {\n // Real API plan generation\n try {\n // Build message - multi-part if files are uploaded\n let messageContent: any;\n\n if (uploadedFiles.length > 0) {\n messageContent = [\n {\n type: 'text',\n text: currentCommand,\n },\n ...uploadedFiles.map(file => ({\n type: file.type,\n source: {\n type: 'base64',\n media_type: file.mediaType,\n data: file.data,\n },\n })),\n ];\n } else {\n messageContent = currentCommand;\n }\n\n // System instruction for planning only\n let systemMessage = context || '';\n const planningInstruction = `CRITICAL PLANNING MODE - READ CAREFULLY:\n\nYou are ONLY creating a plan. You are NOT executing anything.\n\nYOUR TASK: Write a numbered list of steps describing what WOULD be done.\nDO NOT: Execute any actions, make API calls, access databases, modify data, or perform any operations.\nDO NOT: Ask questions or clarifications. Make reasonable assumptions.\nDO: Describe the steps as \"Step 1: Would search database...\", \"Step 2: Would analyze results...\", etc.\nDO: Use default values or best practices if details are missing.\n\nFORMAT REQUIRED:\n1. [First action that would be taken]\n2. [Second action that would be taken]\n3. [Third action that would be taken]\n...\n\nIMPORTANT: This is COMMAND MODE - figure things out yourself. Make intelligent assumptions based on context. ONLY ask questions if something is absolutely impossible to proceed without (e.g., missing required credentials). Otherwise, use sensible defaults and proceed with the plan.\n\nREMEMBER: This is ONLY a plan. The user will approve it, THEN it will be executed. Right now you are just describing what would happen - NOT doing it.`;\n\n\n systemMessage = systemMessage\n ? `${systemMessage}\\n\\n${planningInstruction}`\n : planningInstruction;\n\n aptevaClient.chat({\n agent_id: agentId,\n message: messageContent,\n stream: false,\n system: systemMessage,\n }).then((response) => {\n setPlan(response.message);\n setPendingCommand(currentCommand);\n setState('plan-pending');\n }).catch((err) => {\n const error = err instanceof Error ? err : new Error('Failed to generate plan');\n setError(error);\n setState('error');\n onError?.(error);\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to generate plan');\n setError(error);\n setState('error');\n onError?.(error);\n }\n }\n return;\n }\n\n setState('loading');\n setError(null);\n setProgress(0);\n setStreamedContent('');\n setCommand(''); // Clear input for next command\n setUploadedFiles([]); // Clear uploaded files after sending\n onStart?.();\n\n try {\n if (useMock) {\n // MOCK MODE\n if (enableStreaming) {\n // Mock streaming\n let accumulatedContent = '';\n\n generateMockCommandStream(\n currentCommand,\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n onChunk?.(chunk.content);\n\n // Estimate progress based on content length\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n onProgress?.(estimatedProgress);\n } else if (chunk.type === 'widget' && chunk.widget) {\n // Handle widgets in streamed response\n const widget = chunk.widget;\n setResult((prev) => ({\n success: true,\n data: prev?.data || {},\n widgets: [...(prev?.widgets || []), widget],\n message: accumulatedContent || 'Command executed successfully',\n }));\n }\n },\n (threadId) => {\n // On complete\n const result: CommandResult = {\n success: true,\n data: {\n summary: accumulatedContent,\n thread_id: threadId,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n },\n message: accumulatedContent || 'Command executed successfully',\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n },\n (error) => {\n // On error\n setError(error);\n setState('error');\n onError?.(error);\n }\n );\n } else {\n // Mock non-streaming\n const progressInterval = setInterval(() => {\n setProgress((prev) => {\n const next = Math.min(prev + 10, 90);\n onProgress?.(next);\n return next;\n });\n }, 200);\n\n // Simulate network delay\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n clearInterval(progressInterval);\n\n const mockResponse = generateMockCommandWithWidgets(currentCommand);\n\n const result: CommandResult = {\n success: true,\n data: {\n summary: mockResponse.message,\n thread_id: `mock_thread_${Date.now()}`,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n action: mockResponse.action, // Include agent action intent\n },\n widgets: mockResponse.widgets,\n message: mockResponse.message,\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n }\n } else {\n // REAL API MODE\n if (enableStreaming) {\n // Real streaming API call\n let accumulatedContent = '';\n\n // Build message - multi-part if files are uploaded\n let messageContent: any;\n\n if (uploadedFiles.length > 0) {\n // Multi-part message with text and images\n messageContent = [\n {\n type: 'text',\n text: currentCommand,\n },\n ...uploadedFiles.map(file => ({\n type: file.type, // 'image' or 'document'\n source: {\n type: 'base64',\n media_type: file.mediaType,\n data: file.data,\n },\n })),\n ];\n } else {\n // Simple text message\n messageContent = currentCommand;\n }\n\n // Build system message - add command execution instruction\n let systemMessage = context || '';\n\n // Always include command mode instruction for brevity\n let commandInstruction: string;\n if (isCompact) {\n // Compact mode - extremely terse\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute immediately, make intelligent assumptions, use defaults when needed. NO questions unless absolutely critical (missing required credentials). State action or result ONLY. Examples: \"Searching database for matching records...\" or \"Found 3 user records in database\" or \"Task completed successfully\". NO greetings, NO explanations, NO clarification requests. Just execute and report.';\n } else {\n // Default mode - still very brief\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute the command immediately. Make reasonable assumptions based on context. Use sensible defaults for missing details. DO NOT ask questions unless something is truly impossible without user input (e.g., missing required password). State what you\\'re doing or the result. Examples: \"Analyzing customer data from last quarter...\" or \"Created 5 new database entries successfully\" or \"Search complete: found 12 matching results\". NO greetings, NO filler words, NO clarification requests. Action/result only.';\n }\n\n systemMessage = systemMessage\n ? `${systemMessage}\\n\\n${commandInstruction}`\n : commandInstruction;\n\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: messageContent,\n stream: true,\n ...(systemMessage && { system: systemMessage }),\n },\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedContent += chunk.content;\n setStreamedContent(accumulatedContent);\n onChunk?.(chunk.content);\n\n // Estimate progress based on content length (rough approximation)\n const estimatedProgress = Math.min(Math.round(accumulatedContent.length / 10), 90);\n setProgress(estimatedProgress);\n onProgress?.(estimatedProgress);\n } else if (chunk.type === 'widget' && chunk.widget) {\n // Handle widgets in streamed response\n const widget = chunk.widget;\n setResult((prev) => ({\n success: true,\n data: prev?.data || {},\n widgets: [...(prev?.widgets || []), widget],\n message: accumulatedContent || 'Command executed successfully',\n }));\n }\n },\n (threadId) => {\n // On complete\n const result: CommandResult = {\n success: true,\n data: {\n summary: accumulatedContent,\n thread_id: threadId,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n },\n message: accumulatedContent || 'Command executed successfully',\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n },\n (error) => {\n // On error\n const err = error instanceof Error ? error : new Error('Unknown error');\n setError(err);\n setState('error');\n onError?.(err);\n }\n );\n } else {\n // Non-streaming API call\n const progressInterval = setInterval(() => {\n setProgress((prev) => {\n const next = Math.min(prev + 10, 90);\n onProgress?.(next);\n return next;\n });\n }, 200);\n\n // Build message - multi-part if files are uploaded\n let messageContent: any;\n\n if (uploadedFiles.length > 0) {\n // Multi-part message with text and images\n messageContent = [\n {\n type: 'text',\n text: currentCommand,\n },\n ...uploadedFiles.map(file => ({\n type: file.type, // 'image' or 'document'\n source: {\n type: 'base64',\n media_type: file.mediaType,\n data: file.data,\n },\n })),\n ];\n } else {\n // Simple text message\n messageContent = currentCommand;\n }\n\n // Build system message - add command execution instruction\n let systemMessage = context || '';\n\n // Always include command mode instruction for brevity\n let commandInstruction: string;\n if (isCompact) {\n // Compact mode - extremely terse\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute immediately, make intelligent assumptions, use defaults when needed. NO questions unless absolutely critical (missing required credentials). State action or result ONLY. Examples: \"Searching database for matching records...\" or \"Found 3 user records in database\" or \"Task completed successfully\". NO greetings, NO explanations, NO clarification requests. Just execute and report.';\n } else {\n // Default mode - still very brief\n commandInstruction = 'CRITICAL COMMAND MODE: Maximum 10 words per response. Execute the command immediately. Make reasonable assumptions based on context. Use sensible defaults for missing details. DO NOT ask questions unless something is truly impossible without user input (e.g., missing required password). State what you\\'re doing or the result. Examples: \"Analyzing customer data from last quarter...\" or \"Created 5 new database entries successfully\" or \"Search complete: found 12 matching results\". NO greetings, NO filler words, NO clarification requests. Action/result only.';\n }\n\n systemMessage = systemMessage\n ? `${systemMessage}\\n\\n${commandInstruction}`\n : commandInstruction;\n\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: messageContent,\n stream: false,\n ...(systemMessage && { system: systemMessage }),\n });\n\n clearInterval(progressInterval);\n\n const result: CommandResult = {\n success: true,\n data: {\n summary: response.message,\n thread_id: response.thread_id,\n agentId,\n context,\n timestamp: new Date().toISOString(),\n },\n widgets: response.widgets,\n message: response.message,\n };\n\n setResult(result);\n setState('success');\n setProgress(100);\n onComplete?.(result);\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n setError(error);\n setState('error');\n onError?.(error);\n }\n };\n\n const resetCommand = () => {\n setState('idle');\n setResult(null);\n setError(null);\n setProgress(0);\n setCommand('');\n setPlan('');\n setPendingCommand('');\n setShowPlanDetails(false);\n setUploadedFiles([]);\n };\n\n const approvePlan = () => {\n // Execute the plan after approval\n // Send the plan to the agent with \"execute this now\" instruction\n setShowPlanDetails(false);\n const planToExecute = plan;\n setPlan('');\n setPendingCommand('');\n\n // Execute with the plan as the command\n const executionMessage = `Execute this plan now:\\n\\n${planToExecute}`;\n executeCommand(executionMessage);\n };\n\n const rejectPlan = () => {\n // Reset to idle and restore the command for editing\n setCommand(pendingCommand);\n setPlan('');\n setPendingCommand('');\n setShowPlanDetails(false);\n setState('idle');\n };\n\n const handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n onFileUpload?.(e.target.files);\n\n // Convert files to base64 for API\n const files: Array<{ type: 'image' | 'document'; data: string; mediaType: string; preview?: string; name: string }> = [];\n\n for (let i = 0; i < e.target.files.length; i++) {\n const file = e.target.files[i];\n\n const reader = new FileReader();\n\n await new Promise<void>((resolve) => {\n reader.onload = (event) => {\n if (event.target?.result) {\n const fullDataUrl = event.target.result as string;\n const base64Data = fullDataUrl.split(',')[1]; // Remove data:...;base64, prefix\n\n if (file.type.startsWith('image/')) {\n // Images with preview\n files.push({\n type: 'image',\n data: base64Data,\n mediaType: file.type,\n preview: fullDataUrl, // Keep full data URL for preview\n name: file.name,\n });\n } else if (file.type === 'application/pdf' || file.type.startsWith('application/')) {\n // Documents (PDF, etc.) without preview\n files.push({\n type: 'document',\n data: base64Data,\n mediaType: file.type,\n name: file.name,\n });\n }\n }\n resolve();\n };\n reader.readAsDataURL(file);\n });\n }\n\n setUploadedFiles(prev => [...prev, ...files]); // Append to existing files\n }\n };\n\n const removeFile = (index: number) => {\n setUploadedFiles(prev => prev.filter((_, i) => i !== index));\n };\n\n const isCompact = variant === 'compact';\n\n return (\n <div\n className={cn(\n 'relative border-2 rounded-xl bg-white dark:bg-neutral-900 transition-all duration-300 flex flex-col',\n state === 'loading' && 'animate-pulse-border',\n state === 'idle' && 'border-neutral-300 dark:border-neutral-700',\n state === 'loading' && 'border-blue-500',\n state === 'plan-pending' && 'border-blue-400',\n state === 'success' && 'border-green-500',\n state === 'error' && 'border-red-500',\n className\n )}\n style={{ minHeight: isCompact ? 'auto' : '180px' }}\n >\n {/* Input/Display Area */}\n <div className={cn('flex-1 flex', isCompact ? 'flex-row items-center p-3 gap-3' : 'flex-col p-4')}>\n {state === 'idle' && allowInput && !isCompact && (\n <>\n <textarea\n value={command}\n onChange={(e) => setCommand(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n executeCommand();\n }\n }}\n placeholder={placeholder}\n className=\"flex-1 w-full resize-none bg-transparent border-none focus:outline-none !text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500\"\n rows={6}\n />\n {/* File Previews - Non-Compact */}\n {uploadedFiles.length > 0 && (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {uploadedFiles.map((file, index) => (\n <div key={index} className=\"relative group\">\n {file.type === 'image' ? (\n <img\n src={file.preview}\n alt={file.name}\n className=\"w-20 h-20 object-cover rounded-lg border-2 border-neutral-300 dark:border-neutral-600\"\n />\n ) : (\n <div className=\"w-20 h-20 flex flex-col items-center justify-center rounded-lg border-2 border-neutral-300 dark:border-neutral-600 bg-neutral-50 dark:bg-neutral-800\">\n <svg className=\"w-8 h-8 text-neutral-500 dark:text-neutral-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z\" clipRule=\"evenodd\" />\n </svg>\n <span className=\"text-[8px] text-neutral-500 dark:text-neutral-400 mt-1 px-1 truncate max-w-full\">\n {file.name.length > 12 ? file.name.slice(0, 12) + '...' : file.name}\n </span>\n </div>\n )}\n <button\n onClick={() => removeFile(index)}\n className=\"absolute -top-2 -right-2 w-6 h-6 bg-red-500 hover:bg-red-600 text-white rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"\n title={`Remove ${file.type}`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n\n {state === 'idle' && allowInput && isCompact && (\n <>\n <div className=\"flex items-center gap-0.5 flex-shrink-0\">\n {enableFileUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 !text-neutral-500 dark:!text-neutral-500 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"Attach file\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.4 2.8L4.4 6.8C3.736 7.464 3.736 8.536 4.4 9.2C5.064 9.864 6.136 9.864 6.8 9.2L11.6 4.4C12.704 3.296 12.704 1.504 11.6 0.4C10.496 -0.704 8.704 -0.704 7.6 0.4L2.8 5.2C1.256 6.744 1.256 9.256 2.8 10.8C4.344 12.344 6.856 12.344 8.4 10.8L12.4 6.8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(1.6, 2.4)\"/>\n </svg>\n </button>\n )}\n {planMode && (\n <div className=\"relative settings-menu-container\">\n <button\n onClick={() => setShowSettingsMenu(!showSettingsMenu)}\n className={cn(\n \"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n internalPlanMode ? \"!text-blue-600 dark:!text-blue-400\" : \"!text-neutral-500 dark:!text-neutral-500\"\n )}\n title=\"Settings\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"></line>\n <line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"></line>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"></line>\n <line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"></line>\n <line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"></line>\n <line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"></line>\n <line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"></line>\n <line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"></line>\n </svg>\n </button>\n {showSettingsMenu && (\n <div className=\"absolute top-10 left-0 z-50 w-56 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-lg p-2.5 settings-menu-container\">\n <label className=\"flex items-center justify-between cursor-pointer group\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-3.5 h-3.5 text-neutral-500 dark:text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div>\n <div className=\"text-xs font-medium text-neutral-700 dark:text-neutral-300\">Plan Mode</div>\n <div className=\"text-[10px] text-neutral-500 dark:text-neutral-400\">Review first</div>\n </div>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n setInternalPlanMode(!internalPlanMode);\n }}\n className={cn(\n \"relative inline-flex h-4 w-8 items-center rounded-full transition-colors\",\n internalPlanMode ? \"bg-blue-600\" : \"bg-neutral-300 dark:bg-neutral-600\"\n )}\n type=\"button\"\n >\n <span\n className={cn(\n \"inline-block h-3 w-3 transform rounded-full bg-white transition-transform\",\n internalPlanMode ? \"translate-x-4.5\" : \"translate-x-0.5\"\n )}\n />\n </button>\n </label>\n </div>\n )}\n </div>\n )}\n </div>\n {/* File Previews - Compact */}\n {uploadedFiles.length > 0 && (\n <div className=\"flex gap-1 flex-shrink-0\">\n {uploadedFiles.map((file, index) => (\n <div key={index} className=\"relative group\">\n {file.type === 'image' ? (\n <img\n src={file.preview}\n alt={file.name}\n className=\"w-8 h-8 object-cover rounded border border-neutral-300 dark:border-neutral-600\"\n />\n ) : (\n <div className=\"w-8 h-8 flex items-center justify-center rounded border border-neutral-300 dark:border-neutral-600 bg-neutral-50 dark:bg-neutral-800\" title={file.name}>\n <svg className=\"w-4 h-4 text-neutral-500 dark:text-neutral-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n )}\n <button\n onClick={() => removeFile(index)}\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 hover:bg-red-600 text-white rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"\n title=\"Remove\"\n >\n <svg className=\"w-2.5 h-2.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n <input\n type=\"text\"\n value={command}\n onChange={(e) => setCommand(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n executeCommand();\n }\n }}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent border-none focus:outline-none !text-neutral-900 dark:!text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 py-1\"\n />\n <button\n onClick={() => executeCommand()}\n disabled={!command.trim()}\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0',\n 'border border-neutral-300 dark:border-neutral-600',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-700 dark:!text-neutral-300',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n '!text-lg',\n !command.trim() && 'border-neutral-200 dark:border-neutral-700 !text-neutral-400 dark:!text-neutral-600'\n )}\n title=\"Execute\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n </>\n )}\n\n {state === 'loading' && !isCompact && (\n <div className=\"flex-1 flex flex-col items-center justify-center space-y-4 py-8\">\n <div className=\"w-6 h-6 border-2 border-neutral-300 border-t-blue-500 rounded-full animate-spin\"></div>\n <div className=\"text-neutral-600 dark:text-neutral-400 text-sm text-center max-w-md\">\n {enableStreaming && streamedContent ? streamedContent : loadingText}\n </div>\n {showProgress && (\n <div className=\"w-full max-w-sm\">\n <div className=\"w-full bg-neutral-200 dark:bg-neutral-700 rounded-full h-1.5\">\n <div\n className=\"bg-blue-500 h-1.5 rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <p className=\"text-xs text-neutral-500 mt-2 text-center\">{progress}%</p>\n </div>\n )}\n </div>\n )}\n\n {state === 'loading' && isCompact && (\n <>\n <div className=\"flex-1 flex items-center gap-3 py-1\">\n <div className=\"w-4 h-4 border-2 border-neutral-300 border-t-blue-500 rounded-full animate-spin\"></div>\n <div className=\"text-neutral-600 dark:text-neutral-400 text-sm truncate\">\n {enableStreaming && streamedContent ? streamedContent : loadingText}\n </div>\n </div>\n <button\n disabled\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0',\n 'border border-neutral-200 dark:border-neutral-700',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-400 dark:!text-neutral-600',\n '!text-lg',\n 'opacity-30 cursor-not-allowed'\n )}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n </>\n )}\n\n {state === 'plan-pending' && !isCompact && (\n <div className=\"flex-1 flex flex-col\">\n <div className=\"mb-4 p-4 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg\">\n <div className=\"flex items-start gap-2 mb-3\">\n <svg className=\"w-5 h-5 text-blue-600 dark:text-blue-400 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-blue-800 dark:text-blue-300 mb-1\">Proposed Plan</h3>\n <div className=\"text-blue-700 dark:text-blue-300 text-sm whitespace-pre-line leading-relaxed\">\n {plan}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 mt-4\">\n <button\n onClick={approvePlan}\n className=\"flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm font-medium\"\n >\n Approve & Execute\n </button>\n <button\n onClick={rejectPlan}\n className=\"flex-1 px-4 py-2 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-sm font-medium\"\n >\n Modify\n </button>\n </div>\n </div>\n </div>\n )}\n\n {state === 'plan-pending' && isCompact && (\n <>\n <button\n onClick={() => setShowPlanDetails(true)}\n className=\"flex-1 flex items-center gap-2 px-3 py-2 bg-blue-50 dark:bg-blue-900/30 hover:bg-blue-100 dark:hover:bg-blue-900/40 border border-blue-200 dark:border-blue-800 rounded-lg transition-colors\"\n >\n <svg className=\"w-4 h-4 text-blue-600 dark:text-blue-400 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <span className=\"text-sm font-medium text-blue-700 dark:text-blue-300 truncate flex-1\">View Execution Plan</span>\n </button>\n <div className=\"flex gap-2 flex-shrink-0\">\n <button\n onClick={approvePlan}\n className=\"px-3 py-1.5 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-xs font-medium\"\n >\n Approve\n </button>\n <button\n onClick={rejectPlan}\n className=\"px-3 py-1.5 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors text-xs font-medium\"\n >\n Modify\n </button>\n </div>\n </>\n )}\n\n {state === 'error' && (\n <div className=\"flex-1 flex flex-col\">\n <div className=\"mb-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <div className=\"flex items-start gap-2\">\n <svg className=\"w-5 h-5 text-red-600 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div>\n <h3 className=\"text-sm font-semibold text-red-800 dark:text-red-400\">Error</h3>\n <p className=\"text-red-700 dark:text-red-300 text-sm mt-1\">{error?.message}</p>\n </div>\n </div>\n </div>\n {allowInput && (\n <textarea\n value={command}\n onChange={(e) => setCommand(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n executeCommand();\n }\n }}\n placeholder={placeholder}\n className=\"flex-1 w-full resize-none bg-transparent border-none focus:outline-none text-neutral-900 dark:text-white placeholder-neutral-400\"\n rows={4}\n />\n )}\n </div>\n )}\n\n {state === 'success' && result && !isCompact && (\n <div className=\"flex-1 overflow-auto\">\n {resultRenderer ? (\n resultRenderer(result.data)\n ) : (\n <div className=\"space-y-4\">\n <div className=\"flex items-start gap-3 p-3 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg\">\n <svg className=\"w-5 h-5 text-green-600 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-green-800 dark:text-green-400 mb-1\">Success</h3>\n <p className=\"text-green-700 dark:text-green-300 text-sm\">Command executed successfully</p>\n </div>\n </div>\n {result.data?.summary && (\n <div className=\"text-neutral-700 dark:text-neutral-300 text-sm leading-relaxed whitespace-pre-line\">\n {result.data.summary}\n </div>\n )}\n {result.widgets && result.widgets.length > 0 && (\n <div className=\"space-y-3\">\n {result.widgets.map((widget) => (\n <WidgetRenderer\n key={widget.id}\n widget={widget}\n onAction={onAction}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {state === 'success' && result && isCompact && (\n <>\n <div\n className=\"flex-1 flex items-center gap-2 py-1 cursor-text min-w-0\"\n onClick={() => {\n setState('idle');\n setResult(null);\n }}\n >\n <svg className=\"w-4 h-4 text-green-600 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"text-green-700 dark:text-green-300 text-sm truncate flex-1 min-w-0\">\n {resultRenderer ? resultRenderer(result.data) : (result.message || 'Command executed successfully')}\n </div>\n </div>\n <button\n onClick={() => {\n setState('idle');\n setResult(null);\n }}\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all flex-shrink-0',\n 'border border-neutral-300 dark:border-neutral-600',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-700 dark:!text-neutral-300',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n '!text-lg'\n )}\n title=\"New command\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n </>\n )}\n </div>\n\n {/* Bottom Action Bar - Only show for default variant when not in compact mode */}\n {!isCompact && (\n <div className=\"p-3 flex items-center justify-between gap-2\">\n {/* Left side - Attachment and Settings buttons */}\n <div className=\"flex items-center gap-1\">\n {state === 'idle' && allowInput && (\n <>\n {enableFileUpload && (\n <button\n onClick={() => fileInputRef.current?.click()}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 !text-neutral-500 dark:!text-neutral-500 hover:bg-neutral-100 dark:hover:bg-neutral-800\"\n title=\"Attach file\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.4 2.8L4.4 6.8C3.736 7.464 3.736 8.536 4.4 9.2C5.064 9.864 6.136 9.864 6.8 9.2L11.6 4.4C12.704 3.296 12.704 1.504 11.6 0.4C10.496 -0.704 8.704 -0.704 7.6 0.4L2.8 5.2C1.256 6.744 1.256 9.256 2.8 10.8C4.344 12.344 6.856 12.344 8.4 10.8L12.4 6.8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" transform=\"translate(1.6, 2.4)\"/>\n </svg>\n </button>\n )}\n {planMode && (\n <div className=\"relative settings-menu-container\">\n <button\n onClick={() => setShowSettingsMenu(!showSettingsMenu)}\n className={cn(\n \"w-8 h-8 rounded-lg flex items-center justify-center transition-all flex-shrink-0 hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n internalPlanMode ? \"!text-blue-600 dark:!text-blue-400\" : \"!text-neutral-500 dark:!text-neutral-500\"\n )}\n title=\"Settings\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"></line>\n <line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"></line>\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"></line>\n <line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"></line>\n <line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"></line>\n <line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"></line>\n <line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"></line>\n <line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"></line>\n </svg>\n </button>\n {showSettingsMenu && (\n <div className=\"absolute top-10 left-0 z-50 w-64 bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-lg p-3 settings-menu-container\">\n <label className=\"flex items-center justify-between cursor-pointer group\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 text-neutral-500 dark:text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <div>\n <div className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\">Plan Mode</div>\n <div className=\"text-xs text-neutral-500 dark:text-neutral-400\">Review before executing</div>\n </div>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n setInternalPlanMode(!internalPlanMode);\n }}\n className={cn(\n \"relative inline-flex h-5 w-9 items-center rounded-full transition-colors\",\n internalPlanMode ? \"bg-blue-600\" : \"bg-neutral-300 dark:bg-neutral-600\"\n )}\n type=\"button\"\n >\n <span\n className={cn(\n \"inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform\",\n internalPlanMode ? \"translate-x-5\" : \"translate-x-0.5\"\n )}\n />\n </button>\n </label>\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Spacer when no attachment button */}\n {!(state === 'idle' && allowInput) && <div />}\n\n {/* Right side - Action buttons */}\n <div className=\"flex items-center gap-2\">\n {(state === 'success' || state === 'error') && allowInput && (\n <button\n onClick={resetCommand}\n className=\"px-3 py-1.5 text-sm text-neutral-600 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white transition-colors\"\n >\n Reset\n </button>\n )}\n\n {(state === 'idle' || state === 'error') && (\n <button\n onClick={() => executeCommand()}\n disabled={!command.trim()}\n className={cn(\n 'w-8 h-8 rounded-lg flex items-center justify-center font-bold transition-all',\n 'border border-neutral-300 dark:border-neutral-600',\n 'bg-white dark:bg-neutral-800',\n '!text-neutral-700 dark:!text-neutral-300',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'disabled:opacity-30 disabled:cursor-not-allowed',\n '!text-lg',\n !command.trim() && 'border-neutral-200 dark:border-neutral-700 !text-neutral-400 dark:!text-neutral-600'\n )}\n title={state === 'error' ? 'Retry' : 'Execute'}\n >\n {state === 'error' ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13 8C13 10.7614 10.7614 13 8 13C5.23858 13 3 10.7614 3 8C3 5.23858 5.23858 3 8 3C9.65685 3 11.1257 3.82818 12 5.09091M12 3V5.09091M12 5.09091H9.81818\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3L8 13M8 3L4 7M8 3L12 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Plan Modal - Only for compact mode */}\n {showPlanDetails && isCompact && state === 'plan-pending' && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\" onClick={() => setShowPlanDetails(false)}>\n <div className=\"bg-white dark:bg-neutral-900 rounded-2xl shadow-2xl max-w-2xl w-full max-h-[80vh] overflow-hidden\" onClick={(e) => e.stopPropagation()}>\n {/* Modal Header */}\n <div className=\"flex items-center justify-between p-6 border-b border-neutral-200 dark:border-neutral-700\">\n <div className=\"flex items-center gap-3\">\n <svg className=\"w-6 h-6 text-blue-600 dark:text-blue-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" />\n </svg>\n <h2 className=\"text-xl font-semibold text-neutral-900 dark:text-white\">Proposed Execution Plan</h2>\n </div>\n <button\n onClick={() => setShowPlanDetails(false)}\n className=\"text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Modal Content */}\n <div className=\"p-6 overflow-y-auto max-h-[calc(80vh-180px)]\">\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <div className=\"text-neutral-700 dark:text-neutral-300 whitespace-pre-line leading-relaxed\">\n {plan}\n </div>\n </div>\n </div>\n\n {/* Modal Footer */}\n <div className=\"flex items-center justify-end gap-3 p-6 border-t border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-800/50\">\n <button\n onClick={rejectPlan}\n className=\"px-6 py-2.5 bg-neutral-200 dark:bg-neutral-700 text-neutral-700 dark:text-neutral-300 rounded-lg hover:bg-neutral-300 dark:hover:bg-neutral-600 transition-colors font-medium\"\n >\n Modify Command\n </button>\n <button\n onClick={approvePlan}\n className=\"px-6 py-2.5 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium\"\n >\n Approve & Execute\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n onChange={handleFileSelect}\n className=\"hidden\"\n accept=\"image/*,application/pdf,.doc,.docx,.txt\"\n />\n\n <style dangerouslySetInnerHTML={{\n __html: `\n @keyframes pulse-border {\n 0%, 100% {\n border-color: rgb(59, 130, 246);\n }\n 50% {\n border-color: rgb(147, 197, 253);\n }\n }\n .animate-pulse-border {\n animation: pulse-border 2s ease-in-out infinite;\n }\n `\n }} />\n </div>\n );\n}\n","import { useState, KeyboardEvent } from 'react';\nimport { PromptProps } from '../../types/components';\nimport { cn } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\n\nexport function Prompt({\n agentId,\n placeholder = 'Enter your prompt...',\n initialValue = '',\n useMock = true,\n submitOn = 'button',\n debounceMs = 0,\n minLength = 0,\n maxLength,\n onSubmit,\n onResult,\n onChange,\n variant = 'inline',\n showSuggestions = false,\n className,\n}: PromptProps) {\n const [value, setValue] = useState(initialValue);\n const [isLoading, setIsLoading] = useState(false);\n const [suggestions] = useState(['Plan a trip', 'Write a description', 'Analyze data']);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!maxLength || newValue.length <= maxLength) {\n setValue(newValue);\n onChange?.(newValue);\n }\n };\n\n const handleSubmit = async () => {\n if (value.length < minLength) return;\n\n onSubmit?.(value);\n setIsLoading(true);\n\n try {\n if (useMock) {\n // MOCK MODE\n await new Promise((resolve) => setTimeout(resolve, 1500));\n const mockResult = `Enhanced version: ${value} [AI-generated content]`;\n onResult?.(mockResult);\n setValue('');\n } else {\n // REAL API MODE\n const response = await aptevaClient.chat({\n agent_id: agentId,\n message: value,\n });\n onResult?.(response.message);\n setValue('');\n }\n } catch (error) {\n console.error('Error processing prompt:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (submitOn === 'enter' && e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const handleBlur = () => {\n if (submitOn === 'blur' && value.trim()) {\n handleSubmit();\n }\n };\n\n return (\n <div className={cn('space-y-2', className)}>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={isLoading}\n className=\"flex-1 px-4 py-2 border border-neutral-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-apteva-500 dark:bg-neutral-800 dark:border-neutral-600 dark:text-white\"\n />\n\n {submitOn === 'button' && (\n <button\n onClick={handleSubmit}\n disabled={isLoading || value.length < minLength}\n className=\"px-6 py-2 bg-apteva-500 text-white rounded-lg hover:bg-apteva-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium\"\n >\n {isLoading ? 'Processing...' : 'Generate'}\n </button>\n )}\n </div>\n\n {maxLength && (\n <p className=\"text-xs text-neutral-500\">\n {value.length} / {maxLength} characters\n </p>\n )}\n\n {showSuggestions && !value && (\n <div className=\"flex flex-wrap gap-2\">\n {suggestions.map((suggestion, idx) => (\n <button\n key={idx}\n onClick={() => setValue(suggestion)}\n className=\"px-3 py-1 text-sm bg-neutral-100 hover:bg-neutral-200 text-neutral-700 rounded-full transition-colors\"\n >\n {suggestion}\n </button>\n ))}\n </div>\n )}\n\n {isLoading && (\n <div className=\"flex items-center gap-2 text-sm text-neutral-500\">\n <div className=\"w-4 h-4 border-2 border-apteva-500 border-t-transparent rounded-full animate-spin\" />\n <span>AI is processing your request...</span>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { StreamProps } from '../../types/components';\nimport { cn, generateMockStreamingResponse } from '../../utils';\nimport { aptevaClient } from '../../lib/apteva-client';\n\nexport function Stream({\n agentId,\n prompt,\n context,\n autoStart = false,\n useMock = true,\n onStart,\n onChunk,\n onComplete,\n onError,\n variant = 'prose',\n showCursor = true,\n typingSpeed = 30,\n className,\n}: StreamProps) {\n const [text, setText] = useState('');\n const [isStreaming, setIsStreaming] = useState(false);\n const [isComplete, setIsComplete] = useState(false);\n\n useEffect(() => {\n if (autoStart && !isStreaming && !isComplete) {\n startStreaming();\n }\n }, [autoStart]);\n\n const startStreaming = async () => {\n setIsStreaming(true);\n onStart?.();\n\n try {\n if (useMock) {\n // MOCK MODE\n const mockText =\n 'This is a simulated streaming response from the AI agent. ' +\n 'In a real implementation, this would stream data from your backend API. ' +\n 'The text appears word by word to simulate the streaming effect. ' +\n 'You can customize the typing speed and styling based on your needs.';\n\n await generateMockStreamingResponse(\n mockText,\n (chunk) => {\n setText((prev) => prev + chunk);\n onChunk?.(chunk);\n },\n typingSpeed\n );\n\n setIsComplete(true);\n setIsStreaming(false);\n onComplete?.(text + mockText);\n } else {\n // REAL API MODE\n let accumulatedText = '';\n\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message: prompt,\n stream: true,\n },\n (chunk) => {\n if (chunk.type === 'token' && chunk.content) {\n accumulatedText += chunk.content;\n setText(accumulatedText);\n onChunk?.(chunk.content);\n }\n },\n () => {\n // On complete\n setIsComplete(true);\n setIsStreaming(false);\n onComplete?.(accumulatedText);\n },\n (error) => {\n // On error\n const err = error instanceof Error ? error : new Error('Streaming error');\n onError?.(err);\n setIsStreaming(false);\n }\n );\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Streaming error');\n onError?.(err);\n setIsStreaming(false);\n }\n };\n\n const variantClasses = {\n prose: 'prose prose-sm max-w-none dark:prose-invert',\n code: 'font-mono text-sm bg-neutral-900 text-green-400 p-4 rounded-lg',\n plain: 'text-neutral-900 dark:text-neutral-100',\n };\n\n if (!isStreaming && !isComplete) {\n return (\n <div className={cn('p-4', className)}>\n <button\n onClick={startStreaming}\n className=\"px-6 py-3 bg-apteva-500 text-white rounded-lg hover:bg-apteva-600 transition-colors font-medium\"\n >\n Start Streaming\n </button>\n </div>\n );\n }\n\n return (\n <div className={cn(variantClasses[variant], className)}>\n {text}\n {isStreaming && showCursor && <span className=\"apteva-stream-cursor\" />}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { Thread } from '../../types/messages';\nimport { ThreadItem } from './ThreadItem';\n\ninterface ThreadListProps {\n threads: Thread[];\n currentThreadId?: string;\n onThreadSelect?: (threadId: string) => void;\n onThreadDelete?: (threadId: string) => void;\n showSearch?: boolean;\n groupBy?: 'date' | 'agent' | 'none';\n}\n\nexport function ThreadList({\n threads,\n currentThreadId,\n onThreadSelect,\n onThreadDelete,\n showSearch = false,\n groupBy = 'none',\n}: ThreadListProps) {\n const [searchQuery, setSearchQuery] = useState('');\n\n const filteredThreads = threads.filter(\n (thread) =>\n thread.title.toLowerCase().includes(searchQuery.toLowerCase()) ||\n thread.preview?.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n const groupedThreads = groupBy === 'date' ? groupThreadsByDate(filteredThreads) : { All: filteredThreads };\n\n return (\n <div className=\"flex flex-col h-full\">\n {showSearch && (\n <div className=\"p-3 border-b border-neutral-200 dark:border-neutral-700\">\n <input\n type=\"text\"\n placeholder=\"Search conversations...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full px-3 py-2 text-sm border border-neutral-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-apteva-500 dark:bg-neutral-800 dark:border-neutral-600 dark:text-white\"\n />\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto\">\n {Object.entries(groupedThreads).map(([group, groupThreads]) => (\n <div key={group}>\n {groupBy !== 'none' && (\n <div className=\"px-3 py-2 text-xs font-semibold text-neutral-500 uppercase\">{group}</div>\n )}\n {groupThreads.map((thread) => (\n <ThreadItem\n key={thread.id}\n thread={thread}\n isActive={thread.id === currentThreadId}\n onSelect={() => onThreadSelect?.(thread.id)}\n onDelete={() => onThreadDelete?.(thread.id)}\n />\n ))}\n </div>\n ))}\n\n {filteredThreads.length === 0 && (\n <div className=\"p-8 text-center text-neutral-500\">\n <svg className=\"w-10 h-10 mx-auto mb-2 opacity-50\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n <p>No conversations found</p>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction groupThreadsByDate(threads: Thread[]): Record<string, Thread[]> {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n const lastWeek = new Date(today);\n lastWeek.setDate(lastWeek.getDate() - 7);\n\n return threads.reduce(\n (groups, thread) => {\n const threadDate = new Date(thread.updatedAt);\n let group = 'Older';\n\n if (threadDate >= today) {\n group = 'Today';\n } else if (threadDate >= yesterday) {\n group = 'Yesterday';\n } else if (threadDate >= lastWeek) {\n group = 'Last 7 Days';\n }\n\n if (!groups[group]) groups[group] = [];\n groups[group].push(thread);\n return groups;\n },\n {} as Record<string, Thread[]>\n );\n}\n","// No direct imports needed 'react';\nimport { Thread } from '../../types/messages';\nimport { cn } from '../../utils';\n\ninterface ThreadItemProps {\n thread: Thread;\n isActive?: boolean;\n onSelect?: () => void;\n onDelete?: () => void;\n}\n\nexport function ThreadItem({ thread, isActive = false, onSelect, onDelete }: ThreadItemProps) {\n return (\n <div\n className={cn('apteva-thread-item', {\n 'apteva-thread-item-active': isActive,\n })}\n onClick={onSelect}\n >\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-semibold text-neutral-900 dark:text-white truncate\">{thread.title}</h4>\n {thread.preview && <p className=\"text-sm text-neutral-600 dark:text-neutral-400 truncate\">{thread.preview}</p>}\n <div className=\"flex items-center gap-2 mt-1 text-xs text-neutral-500\">\n <span>{thread.messageCount} messages</span>\n <span>•</span>\n <span>{formatRelativeTime(thread.updatedAt)}</span>\n </div>\n </div>\n\n {onDelete && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n className=\"p-2 text-neutral-400 hover:text-red-500 hover:bg-red-50 rounded transition-colors\"\n title=\"Delete thread\"\n >\n 🗑️\n </button>\n )}\n </div>\n );\n}\n\nfunction formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n return date.toLocaleDateString();\n}\n","// No direct imports needed 'react';\nimport { ThreadsProps } from '../../types/components';\nimport { ThreadList } from './ThreadList';\nimport { cn } from '../../utils';\n\nexport function Threads({\n threads,\n currentThreadId,\n onThreadSelect,\n onThreadDelete,\n onNewThread,\n variant = 'sidebar',\n showSearch = false,\n showNewButton = true,\n groupBy = 'none',\n className,\n}: ThreadsProps) {\n const variantClasses = {\n sidebar: 'h-full border-r border-neutral-200 dark:border-neutral-700 bg-white dark:bg-neutral-900',\n dropdown: 'absolute top-full left-0 right-0 mt-2 bg-white dark:bg-neutral-800 rounded-lg shadow-lg border border-neutral-200 dark:border-neutral-700 max-h-96 overflow-hidden',\n tabs: 'flex gap-2 border-b border-neutral-200 dark:border-neutral-700 overflow-x-auto',\n };\n\n if (variant === 'tabs') {\n return (\n <div className={cn(variantClasses[variant], className)}>\n {threads.slice(0, 5).map((thread) => (\n <button\n key={thread.id}\n onClick={() => onThreadSelect?.(thread.id)}\n className={cn(\n 'px-4 py-2 whitespace-nowrap font-medium transition-colors',\n thread.id === currentThreadId\n ? 'border-b-2 border-apteva-500 text-apteva-500'\n : 'text-neutral-600 hover:text-neutral-900'\n )}\n >\n {thread.title}\n </button>\n ))}\n {showNewButton && onNewThread && (\n <button\n onClick={onNewThread}\n className=\"px-4 py-2 text-neutral-600 hover:text-apteva-500 transition-colors font-medium\"\n >\n + New\n </button>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(variantClasses[variant], 'flex flex-col', className)}>\n {showNewButton && onNewThread && (\n <div className=\"p-3 border-b border-neutral-200 dark:border-neutral-700\">\n <button\n onClick={onNewThread}\n className=\"w-full px-4 py-2 bg-apteva-500 text-white rounded-lg hover:bg-apteva-600 transition-colors font-medium\"\n >\n + New Conversation\n </button>\n </div>\n )}\n\n <ThreadList\n threads={threads}\n currentThreadId={currentThreadId}\n onThreadSelect={onThreadSelect}\n onThreadDelete={onThreadDelete}\n showSearch={showSearch}\n groupBy={groupBy}\n />\n </div>\n );\n}\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { AutoInterfaceProps, InterfaceSpec, InterfaceUpdate } from '../../types/interface';\nimport { ActionEvent } from '../../types/actions';\nimport { Chat } from '../Chat';\nimport { ChatHandle } from '../Chat/Chat';\nimport { InterfaceRenderer } from './InterfaceRenderer';\nimport { InterfaceSkeleton } from './InterfaceSkeleton';\nimport { applyUpdates } from '../../utils/interface-operations';\nimport { parseInterfaceFromText, parseUpdatesFromText } from '../../utils/interface-parser';\nimport { generateInterfaceContext, generateCompactInterfaceContext } from '../../utils/interface-context';\nimport { cn } from '../../utils/cn';\n\n/**\n * Make a separate (non-chat) API call to generate the initial interface.\n * Uses streaming to collect the full response, then parses it for @interface.\n */\nasync function generateInitialInterface(\n apiUrl: string,\n apiKey: string | undefined,\n agentId: string,\n prompt: string,\n): Promise<{ spec: InterfaceSpec | null; threadId: string | null }> {\n const systemContext = generateCompactInterfaceContext();\n const message = `${systemContext}\\n\\nGenerate an interface for: ${prompt}`;\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (apiKey) headers['X-API-Key'] = apiKey;\n\n const response = await fetch(`${apiUrl}/chat`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n agent_id: agentId,\n message,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(err.error || `Request failed with status ${response.status}`);\n }\n\n const data = await response.json();\n const text = data.response || data.message || '';\n\n console.log('[AutoInterface] Raw API response:', data);\n console.log('[AutoInterface] Extracted text (' + text.length + ' chars):', text.substring(0, 500));\n\n const spec = parseInterfaceFromText(text);\n console.log('[AutoInterface] Parsed spec:', spec ? 'OK' : 'null', spec ? JSON.stringify(spec).substring(0, 300) + '...' : '');\n\n return { spec, threadId: data.thread_id || null };\n}\n\nexport function AutoInterface({\n agentId,\n threadId,\n initialPrompt,\n initialInterface,\n context,\n apiUrl,\n apiKey,\n onInterfaceChange,\n onAction,\n onThreadChange,\n onError,\n chatPosition = 'right',\n chatWidth = '380px',\n chatCollapsible = true,\n chatPlaceholder = 'Ask the AI to generate or update the interface...',\n chatWelcomeTitle = 'Auto Interface',\n useMock,\n theme,\n className,\n}: AutoInterfaceProps) {\n const [interfaceSpec, setInterfaceSpec] = useState<InterfaceSpec | null>(initialInterface || null);\n const [isGenerating, setIsGenerating] = useState(false);\n const [chatCollapsed, setChatCollapsed] = useState(false);\n const chatRef = useRef<ChatHandle>(null);\n\n // Build the system context for AI\n const systemContext = [\n generateInterfaceContext(),\n context || '',\n ].filter(Boolean).join('\\n\\n');\n\n // Handle interface spec changes\n const updateInterface = useCallback((newSpec: InterfaceSpec) => {\n setInterfaceSpec(newSpec);\n onInterfaceChange?.(newSpec);\n }, [onInterfaceChange]);\n\n // Handle widget actions from the rendered interface\n const handleAction = useCallback((action: ActionEvent) => {\n onAction?.(action);\n\n // For server-handled actions, send to AI via chat\n if (chatRef.current) {\n chatRef.current.sendMessage(\n `[Action: ${action.type} on widget ${action.widgetId || 'unknown'}. Payload: ${JSON.stringify(action.payload)}]`\n );\n }\n }, [onAction]);\n\n // Process assistant messages for interface specs and updates\n const handleMessageComplete = useCallback((result: any) => {\n if (!result?.data) return;\n\n const text = typeof result.data === 'string' ? result.data : result.data.message || '';\n console.log('[AutoInterface] Chat message complete, text (' + text.length + ' chars):', text.substring(0, 300));\n\n // Try to parse a full interface spec\n const parsed = parseInterfaceFromText(text);\n if (parsed) {\n console.log('[AutoInterface] Parsed full interface from chat');\n updateInterface(parsed);\n setIsGenerating(false);\n return;\n }\n\n // Try to parse updates\n const updates = parseUpdatesFromText(text);\n if (updates.length > 0 && interfaceSpec) {\n console.log('[AutoInterface] Parsed', updates.length, 'updates from chat');\n const newSpec = applyUpdates(interfaceSpec, updates);\n updateInterface(newSpec);\n } else {\n console.log('[AutoInterface] No interface or updates found in chat message');\n }\n\n setIsGenerating(false);\n }, [interfaceSpec, updateInterface]);\n\n // Generate initial interface via separate API call (not through chat)\n useEffect(() => {\n if (!initialPrompt || initialInterface || useMock) return;\n if (!apiUrl) return;\n\n let cancelled = false;\n setIsGenerating(true);\n\n console.log('[AutoInterface] Generating initial interface for prompt:', initialPrompt);\n console.log('[AutoInterface] API URL:', apiUrl, '| Agent:', agentId);\n\n generateInitialInterface(apiUrl, apiKey, agentId, initialPrompt)\n .then(({ spec, threadId }) => {\n if (cancelled) return;\n console.log('[AutoInterface] Generation complete. Spec:', spec ? 'parsed OK' : 'null', '| Thread:', threadId);\n if (spec) {\n console.log('[AutoInterface] Setting interface with', JSON.stringify(spec).length, 'bytes');\n updateInterface(spec);\n } else {\n console.warn('[AutoInterface] Agent did not return a parseable @interface block');\n }\n setIsGenerating(false);\n })\n .catch((err) => {\n if (cancelled) return;\n console.error('[AutoInterface] Initial generation failed:', err);\n onError?.(err instanceof Error ? err : new Error(String(err)));\n setIsGenerating(false);\n });\n\n return () => { cancelled = true; };\n }, [initialPrompt]);\n\n const hasInterface = interfaceSpec !== null;\n const showSkeleton = isGenerating && !hasInterface;\n\n return (\n <div className={cn(\n 'flex h-full bg-neutral-50 dark:bg-black',\n chatPosition === 'bottom' ? 'flex-col' : 'flex-row',\n className\n )}>\n {/* Interface area */}\n <div className={cn(\n 'flex-1 overflow-y-auto min-w-0',\n hasInterface || showSkeleton ? '' : 'hidden'\n )}>\n {showSkeleton && <InterfaceSkeleton />}\n {hasInterface && interfaceSpec && (\n <div className=\"p-4\">\n <InterfaceRenderer\n node={interfaceSpec.root}\n onAction={handleAction}\n />\n </div>\n )}\n </div>\n\n {/* Collapse toggle */}\n {chatCollapsible && hasInterface && chatPosition === 'right' && (\n <button\n onClick={() => setChatCollapsed(!chatCollapsed)}\n className=\"flex-shrink-0 w-6 flex items-center justify-center border-l border-neutral-200 dark:border-neutral-700 bg-neutral-100 dark:bg-neutral-800 hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors\"\n title={chatCollapsed ? 'Show chat' : 'Hide chat'}\n >\n <span className=\"!text-xs !text-neutral-500 dark:!text-neutral-400\">\n {chatCollapsed ? '\\u25C0' : '\\u25B6'}\n </span>\n </button>\n )}\n\n {/* Chat panel */}\n <div\n className={cn(\n 'flex-shrink-0 border-neutral-200 dark:border-neutral-700',\n chatPosition === 'right' ? 'border-l' : 'border-t',\n chatCollapsed && 'hidden',\n // When no interface is generated yet, chat takes full width\n !hasInterface && !showSkeleton && 'flex-1',\n )}\n style={hasInterface || showSkeleton ? (\n chatPosition === 'right'\n ? { width: chatWidth }\n : { height: '300px' }\n ) : undefined}\n >\n <Chat\n ref={chatRef}\n agentId={agentId}\n threadId={threadId}\n apiUrl={apiUrl}\n apiKey={apiKey}\n useMock={useMock}\n context={systemContext}\n placeholder={chatPlaceholder}\n welcomeTitle={chatWelcomeTitle}\n welcomeSubtitle=\"Describe the interface you want to create\"\n enableStreaming={true}\n enableWidgets={true}\n showHeader={true}\n headerTitle=\"Chat\"\n onThreadChange={onThreadChange}\n onComplete={handleMessageComplete}\n onError={onError}\n className=\"h-full\"\n suggestedPrompts={!hasInterface ? [\n 'Show me a sales dashboard',\n 'Create a user management panel',\n 'Build a project overview page',\n ] : undefined}\n />\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { InterfaceNode } from '../../types/interface';\nimport { ActionEvent } from '../../types/actions';\nimport { cn } from '../../utils/cn';\n\ninterface LayoutRendererProps {\n node: InterfaceNode;\n onAction?: (action: ActionEvent) => void;\n renderNode: (node: InterfaceNode) => React.ReactNode;\n}\n\nconst gapClasses: Record<string, string> = {\n none: 'gap-0',\n sm: 'gap-2',\n md: 'gap-4',\n lg: 'gap-6',\n};\n\nconst paddingClasses: Record<string, string> = {\n none: 'p-0',\n sm: 'p-2',\n md: 'p-4',\n lg: 'p-6',\n};\n\nconst maxWidthClasses: Record<string, string> = {\n sm: 'max-w-2xl',\n md: 'max-w-4xl',\n lg: 'max-w-6xl',\n xl: 'max-w-7xl',\n full: 'max-w-full',\n};\n\nexport function LayoutRenderer({ node, onAction, renderNode }: LayoutRendererProps) {\n const children = node.children || [];\n\n switch (node.layout) {\n case 'page':\n return <PageLayout node={node} renderNode={renderNode} />;\n case 'row':\n return <RowLayout node={node} renderNode={renderNode} />;\n case 'columns':\n return <ColumnsLayout node={node} renderNode={renderNode} />;\n case 'stack':\n return <StackLayout node={node} renderNode={renderNode} />;\n case 'sidebar':\n return <SidebarLayout node={node} renderNode={renderNode} />;\n case 'tabs':\n return <TabsLayout node={node} renderNode={renderNode} />;\n default:\n // Unknown layout — just stack children\n return (\n <div className=\"space-y-4\">\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n }\n}\n\nfunction PageLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { title, padding = 'md', maxWidth = 'xl' } = node.props || {};\n const children = node.children || [];\n\n return (\n <div className={cn('w-full mx-auto', paddingClasses[padding], maxWidthClasses[maxWidth])}>\n {title && (\n <h1 className=\"!text-2xl font-bold !text-neutral-900 dark:!text-white mb-6\">{title}</h1>\n )}\n <div className=\"space-y-6\">\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n </div>\n );\n}\n\nfunction RowLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { columns, gap = 'md', align = 'stretch' } = node.props || {};\n const children = node.children || [];\n\n const templateColumns = columns\n ? columns.map((c: number) => `${c}fr`).join(' ')\n : `repeat(${children.length}, 1fr)`;\n\n const alignClasses: Record<string, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n };\n\n return (\n <div\n className={cn('grid', gapClasses[gap], alignClasses[align])}\n style={{ gridTemplateColumns: templateColumns }}\n >\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n}\n\nfunction ColumnsLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { count, gap = 'md' } = node.props || {};\n const children = node.children || [];\n const colCount = count || children.length;\n\n return (\n <div\n className={cn('grid', gapClasses[gap])}\n style={{ gridTemplateColumns: `repeat(${colCount}, 1fr)` }}\n >\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n}\n\nfunction StackLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { gap = 'md', align = 'stretch' } = node.props || {};\n const children = node.children || [];\n\n const alignClasses: Record<string, string> = {\n left: 'items-start',\n center: 'items-center',\n right: 'items-end',\n stretch: 'items-stretch',\n };\n\n return (\n <div className={cn('flex flex-col', gapClasses[gap], alignClasses[align])}>\n {children.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n}\n\nfunction SidebarLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { side = 'left', width = '280px' } = node.props || {};\n const children = node.children || [];\n const [sidebarChild, ...mainChildren] = side === 'left' ? children : [...children].reverse();\n\n if (!sidebarChild) return null;\n\n const sidebar = (\n <div\n className=\"flex-shrink-0 overflow-y-auto border-neutral-200 dark:border-neutral-700\"\n style={{ width }}\n >\n {renderNode(sidebarChild)}\n </div>\n );\n\n const main = (\n <div className=\"flex-1 overflow-y-auto min-w-0\">\n {mainChildren.map(child => (\n <div key={child.id}>{renderNode(child)}</div>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex h-full gap-4\">\n {side === 'left' ? <>{sidebar}{main}</> : <>{main}{sidebar}</>}\n </div>\n );\n}\n\nfunction TabsLayout({ node, renderNode }: { node: InterfaceNode; renderNode: (n: InterfaceNode) => React.ReactNode }) {\n const { labels = [], defaultTab = 0 } = node.props || {};\n const children = node.children || [];\n const [activeTab, setActiveTab] = useState(defaultTab);\n\n return (\n <div>\n <div className=\"flex border-b border-neutral-200 dark:border-neutral-700 mb-4\">\n {labels.map((label: string, idx: number) => (\n <button\n key={idx}\n onClick={() => setActiveTab(idx)}\n className={cn(\n 'px-4 py-2 !text-sm font-medium transition-colors border-b-2 -mb-px',\n activeTab === idx\n ? 'border-blue-500 !text-blue-600 dark:!text-blue-400'\n : 'border-transparent !text-neutral-500 hover:!text-neutral-700 dark:hover:!text-neutral-300'\n )}\n >\n {label}\n </button>\n ))}\n </div>\n {children[activeTab] && renderNode(children[activeTab])}\n </div>\n );\n}\n","import { InterfaceNode } from '../../types/interface';\nimport { ActionEvent } from '../../types/actions';\nimport { WidgetRenderer } from '../Widgets/WidgetRenderer';\nimport { LayoutRenderer } from './LayoutRenderer';\n\n// Known structural keys on InterfaceNode — everything else is a widget prop\nconst STRUCTURAL_KEYS = new Set(['type', 'id', 'layout', 'props', 'children', 'actions', 'metadata', 'isStreaming']);\n\n/**\n * Normalize a node to handle various agent output quirks:\n * 1. Props at top level instead of inside `props`\n * { type: \"text_block\", id: \"x\", content: \"Hello\" } → props: { content: \"Hello\" }\n * 2. type: \"widget\" with actual type in props.widget\n * { type: \"widget\", props: { widget: \"form\", fields: [...] } } → type: \"form\", props: { fields: [...] }\n * 3. Variant/style mismatches (style→variant)\n */\nfunction normalizeNode(n: InterfaceNode): InterfaceNode {\n let node = { ...n };\n\n // Fix type: \"widget\" with actual type in props.widget\n if (node.type === 'widget' && node.props?.widget) {\n node.type = node.props.widget;\n const { widget: _, ...rest } = node.props;\n node.props = rest;\n }\n\n // Merge top-level extra keys into props\n const explicit = node.props || {};\n const extra: Record<string, any> = {};\n for (const key of Object.keys(node)) {\n if (!STRUCTURAL_KEYS.has(key)) {\n extra[key] = (node as any)[key];\n }\n }\n node.props = { ...extra, ...explicit };\n\n // Normalize common aliases: style → variant\n if (node.props.style && !node.props.variant) {\n node.props.variant = node.props.style;\n delete node.props.style;\n }\n\n // Recursively normalize children\n if (node.children) {\n node.children = node.children.map(normalizeNode);\n }\n\n return node;\n}\n\ninterface InterfaceRendererProps {\n node: InterfaceNode;\n onAction?: (action: ActionEvent) => void;\n}\n\nexport function InterfaceRenderer({ node, onAction }: InterfaceRendererProps) {\n const renderNode = (rawNode: InterfaceNode): React.ReactNode => {\n const n = normalizeNode(rawNode);\n\n // Layouts with children\n if (n.type === 'layout' && n.layout) {\n return (\n <LayoutRenderer\n key={n.id}\n node={n}\n onAction={onAction}\n renderNode={renderNode}\n />\n );\n }\n\n // Leaf widget — delegate to WidgetRenderer\n return (\n <WidgetRenderer\n key={n.id}\n widget={{\n type: n.type,\n id: n.id,\n props: n.props || {},\n actions: n.actions,\n metadata: n.metadata,\n isStreaming: n.isStreaming,\n }}\n onAction={onAction}\n />\n );\n };\n\n return <>{renderNode(node)}</>;\n}\n","import { cn } from '../../utils/cn';\n\ninterface InterfaceSkeletonProps {\n className?: string;\n}\n\nexport function InterfaceSkeleton({ className }: InterfaceSkeletonProps) {\n return (\n <div className={cn('animate-pulse space-y-6 p-6', className)}>\n {/* Title skeleton */}\n <div className=\"h-7 bg-neutral-200 dark:bg-neutral-700 rounded w-1/3\" />\n\n {/* KPI row skeleton */}\n <div className=\"grid grid-cols-4 gap-4\">\n {[1, 2, 3, 4].map(i => (\n <div key={i} className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl p-5 space-y-2\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-2/3\" />\n <div className=\"h-8 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2\" />\n </div>\n ))}\n </div>\n\n {/* Chart + list row skeleton */}\n <div className=\"grid grid-cols-3 gap-4\">\n <div className=\"col-span-2 border border-neutral-200 dark:border-neutral-700 rounded-xl p-5 space-y-3\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/4\" />\n <div className=\"h-40 bg-neutral-200 dark:bg-neutral-700 rounded\" />\n </div>\n <div className=\"border border-neutral-200 dark:border-neutral-700 rounded-xl p-5 space-y-3\">\n <div className=\"h-4 bg-neutral-200 dark:bg-neutral-700 rounded w-1/2\" />\n {[1, 2, 3].map(i => (\n <div key={i} className=\"h-10 bg-neutral-200 dark:bg-neutral-700 rounded\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Theme initialization script that runs before React hydration\n * This prevents flickering by setting the theme before the page renders\n * Must be inlined in the HTML <head> as a blocking script\n */\n\nexport const themeScript = `\n(function() {\n try {\n // Get system preference\n const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n const colorMode = isDark ? 'dark' : 'light';\n\n // Set attributes before render\n document.documentElement.setAttribute('data-color-mode', colorMode);\n\n // Add dark class for Tailwind\n if (isDark) {\n document.documentElement.classList.add('dark');\n }\n } catch (e) {\n console.error('Failed to initialize theme:', e);\n }\n})();\n`;\n\nexport function getThemeScript() {\n return themeScript;\n}\n","import { useState, useCallback } from 'react';\nimport { InterfaceSpec, InterfaceUpdate } from '../types/interface';\nimport { findNode, applyUpdate, applyUpdates } from '../utils/interface-operations';\n\nexport function useInterfaceState(initialSpec?: InterfaceSpec | null) {\n const [spec, setSpec] = useState<InterfaceSpec | null>(initialSpec || null);\n const [isStreaming, setIsStreaming] = useState(false);\n\n const setInterface = useCallback((newSpec: InterfaceSpec) => {\n setSpec(newSpec);\n }, []);\n\n const clearInterface = useCallback(() => {\n setSpec(null);\n }, []);\n\n const applyInterfaceUpdate = useCallback((update: InterfaceUpdate) => {\n setSpec(prev => {\n if (!prev) return prev;\n return applyUpdate(prev, update);\n });\n }, []);\n\n const applyInterfaceUpdates = useCallback((updates: InterfaceUpdate[]) => {\n setSpec(prev => {\n if (!prev) return prev;\n return applyUpdates(prev, updates);\n });\n }, []);\n\n const getNode = useCallback((id: string) => {\n if (!spec) return null;\n return findNode(spec.root, id);\n }, [spec]);\n\n return {\n spec,\n isStreaming,\n setInterface,\n clearInterface,\n applyInterfaceUpdate,\n applyInterfaceUpdates,\n setIsStreaming,\n getNode,\n };\n}\n","import { useCallback, useRef } from 'react';\nimport { InterfaceSpec, InterfaceUpdate } from '../types/interface';\nimport { aptevaClient } from '../lib/apteva-client';\nimport { parseInterfaceFromText, parseUpdatesFromText } from '../utils/interface-parser';\nimport { generateInterfaceContext } from '../utils/interface-context';\n\ninterface UseInterfaceAIOptions {\n agentId: string;\n apiUrl?: string;\n apiKey?: string;\n context?: string;\n onInterface?: (spec: InterfaceSpec) => void;\n onUpdates?: (updates: InterfaceUpdate[]) => void;\n onError?: (error: Error) => void;\n onStreamStart?: () => void;\n onStreamEnd?: () => void;\n}\n\nexport function useInterfaceAI({\n agentId,\n apiUrl,\n apiKey,\n context,\n onInterface,\n onUpdates,\n onError,\n onStreamStart,\n onStreamEnd,\n}: UseInterfaceAIOptions) {\n const threadIdRef = useRef<string | null>(null);\n const accumulatedTextRef = useRef('');\n\n // Configure client if URLs provided\n if (apiUrl || apiKey) {\n aptevaClient.configure({\n ...(apiUrl && { apiUrl }),\n ...(apiKey && { apiKey }),\n });\n }\n\n const sendMessage = useCallback(async (message: string) => {\n accumulatedTextRef.current = '';\n onStreamStart?.();\n\n const systemPrompt = [\n generateInterfaceContext(),\n context || '',\n ].filter(Boolean).join('\\n\\n');\n\n try {\n await aptevaClient.chatStream(\n {\n agent_id: agentId,\n message,\n thread_id: threadIdRef.current || undefined,\n stream: true,\n system: systemPrompt,\n },\n // onChunk\n (chunk) => {\n if (chunk.thread_id) {\n threadIdRef.current = chunk.thread_id;\n }\n\n if (chunk.type === 'content' || chunk.type === 'token') {\n accumulatedTextRef.current += chunk.content || '';\n\n // Try to parse interface from accumulated text\n const parsed = parseInterfaceFromText(accumulatedTextRef.current);\n if (parsed) {\n onInterface?.(parsed);\n }\n\n // Try to parse updates\n const updates = parseUpdatesFromText(accumulatedTextRef.current);\n if (updates.length > 0) {\n onUpdates?.(updates);\n }\n }\n },\n // onComplete\n () => {\n onStreamEnd?.();\n },\n // onError\n (error) => {\n onError?.(error);\n onStreamEnd?.();\n }\n );\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error('Unknown error'));\n onStreamEnd?.();\n }\n }, [agentId, context, onInterface, onUpdates, onError, onStreamStart, onStreamEnd]);\n\n return {\n sendMessage,\n threadId: threadIdRef.current,\n };\n}\n"],"mappings":"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","names":["useState","useEffect","useRef","useMemo","useCallback","useEffect","useRef","useEffect","useRef","findMatchingBracket","useEffect","jsx","jsxs","jsx","jsx","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","useState","useCallback","useRef","useEffect","jsx","jsxs","useRef","useState","useCallback","useEffect","jsx","jsxs","jsx","useEffect","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","jsx","jsxs","jsx","useRef","useEffect","useState","useEffect","useCallback","useRef","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","useRef","Fragment","jsx","jsxs","useState","useRef","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","Chat","useState","useRef","useCallback","useEffect","useMemo","threadId","useState","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","error","result","useState","jsx","jsxs","useState","useState","useEffect","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","useRef","useCallback","useEffect","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useCallback","useEffect","threadId","useState","useCallback","useState","useCallback","useCallback","useRef","useRef","useCallback"]}