veryfront 0.0.72 → 0.0.74

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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/react/components/theme.ts", "../../../src/ai/react/components/chat.tsx", "../../../src/ai/react/primitives/chat-container.tsx", "../../../src/ai/react/primitives/message-list.tsx", "../../../src/ai/react/primitives/input-box.tsx", "../../../src/ai/react/primitives/agent-primitives.tsx", "../../../src/ai/react/primitives/tool-primitives.tsx", "../../../src/ai/react/hooks/use-voice-input.ts", "../../../src/ai/react/components/markdown.tsx", "../../../src/ai/react/components/agent-card.tsx", "../../../src/ai/react/components/message.tsx", "../../../src/ai/react/components/error-boundary.tsx"],
4
- "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * Theme System for Styled Components\n *\n * Provides default theme and utilities for customization.\n */\n\nexport interface ChatTheme {\n /** Container styles */\n container?: string;\n\n /** Message styles by role */\n message?: {\n user?: string;\n assistant?: string;\n system?: string;\n tool?: string;\n };\n\n /** Input styles */\n input?: string;\n\n /** Button styles */\n button?: string;\n\n /** Loading indicator styles */\n loading?: string;\n}\n\n/**\n * Default theme using Tailwind CSS - Apple Messages inspired, clean & minimal\n */\nexport const defaultChatTheme: ChatTheme = {\n container: \"flex flex-col h-full overflow-hidden bg-white dark:bg-neutral-900\",\n message: {\n user: \"bg-blue-500 text-white rounded-[20px] rounded-br-[4px] px-4 py-2.5 max-w-[75%]\",\n assistant:\n \"bg-neutral-100 dark:bg-neutral-800 text-neutral-900 dark:text-neutral-100 rounded-[20px] rounded-bl-[4px] px-4 py-2.5 max-w-[75%]\",\n system:\n \"bg-neutral-100 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 rounded-2xl px-4 py-2 text-sm mx-auto text-center\",\n tool:\n \"bg-neutral-50 dark:bg-neutral-800 text-neutral-600 dark:text-neutral-300 rounded-xl px-3 py-2 text-sm font-mono border border-neutral-200 dark:border-neutral-700\",\n },\n input:\n \"flex-1 px-4 py-2.5 bg-neutral-100 dark:bg-neutral-800 border-0 rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500/30 dark:text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 text-[15px]\",\n button:\n \"w-9 h-9 flex items-center justify-center bg-blue-500 hover:bg-blue-600 active:scale-95 text-white rounded-full transition-all disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-blue-500 disabled:active:scale-100\",\n loading: \"w-1.5 h-1.5 bg-neutral-400 rounded-full animate-bounce\",\n};\n\nexport interface AgentTheme {\n /** Container styles */\n container?: string;\n\n /** Status styles */\n status?: string;\n\n /** Thinking indicator styles */\n thinking?: string;\n\n /** Tool invocation styles */\n tool?: string;\n\n /** Tool result styles */\n toolResult?: string;\n}\n\n/**\n * Default agent theme - Apple-inspired, clean & minimal\n */\nexport const defaultAgentTheme: AgentTheme = {\n container:\n \"border border-neutral-200 dark:border-neutral-800 rounded-2xl p-6 space-y-4 bg-white dark:bg-neutral-900\",\n status: \"inline-flex items-center px-3 py-1.5 rounded-full text-sm font-medium\",\n thinking:\n \"bg-amber-50 dark:bg-amber-900/20 rounded-xl px-4 py-3 italic text-neutral-700 dark:text-neutral-300 border border-amber-200 dark:border-amber-800\",\n tool:\n \"rounded-xl px-4 py-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800\",\n toolResult:\n \"mt-2 p-3 bg-neutral-100 dark:bg-neutral-800 rounded-xl font-mono text-sm overflow-x-auto\",\n};\n\n/**\n * Merge themes (user theme overrides default)\n */\nexport function mergeThemes<T extends Record<string, any>>(\n defaultTheme: T,\n userTheme?: Partial<T>,\n): T {\n if (!userTheme) return defaultTheme;\n\n const merged = { ...defaultTheme };\n\n for (const key in userTheme) {\n const value = userTheme[key];\n\n if (value === undefined) {\n continue;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n // Merge nested objects\n merged[key] = { ...defaultTheme[key], ...value } as T[Extract<keyof T, string>];\n } else {\n merged[key] = value as T[Extract<keyof T, string>];\n }\n }\n\n return merged;\n}\n\n/**\n * Utility to combine class names\n * (Simple version - in production use 'clsx' or 'cn' from shadcn)\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n", "/**\n * Chat Component - Layer 3 (Styled)\n *\n * Production-ready, fully styled chat component.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n ChatContainer,\n InputBox,\n MessageItem,\n MessageList,\n SubmitButton,\n} from \"../primitives/index.ts\";\nimport { useVoiceInput } from \"../hooks/use-voice-input.ts\";\nimport type { DynamicToolUIPart, ToolUIPart, UIMessage, UIMessagePart } from \"../hooks/use-chat.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\nimport { Markdown } from \"./markdown.tsx\";\n\n/**\n * Get text content from UIMessage parts\n */\nfunction getTextContent(message: UIMessage): string {\n return message.parts\n .filter((p): p is UIMessagePart & { type: \"text\" } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Get tool parts from UIMessage\n * Matches tool-${toolName} pattern (AI SDK v5) and dynamic-tool\n */\nfunction getToolParts(message: UIMessage): (ToolUIPart | DynamicToolUIPart)[] {\n return message.parts.filter(\n (p): p is ToolUIPart | DynamicToolUIPart =>\n p.type.startsWith(\"tool-\") || p.type === \"dynamic-tool\",\n );\n}\n\nexport interface ChatProps {\n /** Messages to display (AI SDK v5 format) */\n messages: UIMessage[];\n\n /** Current input value */\n input: string;\n\n /** Input change handler (alternative naming) */\n onChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Input change handler (from useChat) */\n handleInputChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler (alternative naming) */\n onSubmit?: (e: React.FormEvent) => void | Promise<void>;\n\n /** Submit handler (from useChat) */\n handleSubmit?: (e: React.FormEvent) => void | Promise<void>;\n\n /** Stop handler - called when stop button is clicked during loading */\n stop?: () => void;\n\n /** Enable built-in voice input (uses Web Speech API) */\n enableVoice?: boolean;\n\n /** Custom voice input handler - overrides built-in voice if provided */\n onVoice?: () => void;\n\n /** Setter for input value (required for voice input to work) */\n setInput?: (value: string) => void;\n\n /** Loading state */\n isLoading?: boolean;\n\n /** Error state */\n error?: Error | null;\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Max height */\n maxHeight?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Custom message renderer */\n renderMessage?: (message: UIMessage) => React.ReactNode;\n\n /** Custom tool renderer (v5 format) */\n renderTool?: (tool: ToolUIPart | DynamicToolUIPart) => React.ReactNode;\n\n /** Enable multiline input */\n multiline?: boolean;\n}\n\n/**\n * Chat - Complete chat interface\n *\n * Production-ready chat component with sensible defaults.\n *\n * @example\n * ```tsx\n * import { Chat } from 'veryfront/ai/components';\n * import { useChat } from 'veryfront/ai/react';\n *\n * export default function ChatPage() {\n * const chat = useChat({ api: '/api/chat' });\n * return <Chat {...chat} />;\n * }\n * ```\n */\nexport const Chat = React.forwardRef<HTMLDivElement, ChatProps>(\n (\n {\n messages,\n input,\n onChange,\n handleInputChange,\n onSubmit,\n handleSubmit,\n stop,\n enableVoice = false,\n onVoice,\n setInput,\n isLoading,\n error,\n placeholder = \"Type a message...\",\n maxHeight = \"100%\",\n className,\n theme: userTheme,\n renderMessage,\n renderTool,\n multiline = false,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n const messagesEndRef = React.useRef<HTMLDivElement>(null);\n\n // Support both naming conventions from useChat\n const inputChangeHandler = onChange || handleInputChange || (() => {});\n const submitHandler = onSubmit || handleSubmit;\n\n // Built-in voice input\n const voice = useVoiceInput({\n onTranscript: (transcript, isFinal) => {\n if (setInput && isFinal) {\n setInput(transcript);\n }\n },\n });\n\n // Determine voice handler - custom or built-in\n const voiceHandler = React.useMemo(() => {\n if (onVoice) return onVoice;\n if (enableVoice && voice.isSupported && setInput) {\n return voice.toggle;\n }\n return undefined;\n }, [onVoice, enableVoice, voice.isSupported, voice.toggle, setInput]);\n\n // Auto-scroll to bottom on new messages\n React.useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n return (\n <ChatContainer\n ref={ref}\n className={cn(theme.container, className)}\n style={{ maxHeight }}\n >\n {/* Message List - scrollable content area */}\n <MessageList className=\"flex-1 min-h-0 overflow-y-auto\">\n <div className=\"max-w-2xl mx-auto px-4 py-4 space-y-2\">\n {messages.map((msg) => {\n const content = getTextContent(msg);\n const toolParts = getToolParts(msg);\n return renderMessage\n ? <React.Fragment key={msg.id}>{renderMessage(msg)}</React.Fragment>\n : (\n <MessageItem\n key={msg.id}\n role={msg.role}\n className={cn(\n \"flex\",\n msg.role === \"user\" ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div className={theme.message?.[msg.role] || theme.message?.assistant}>\n {msg.role === \"user\"\n ? (\n <p className=\"whitespace-pre-wrap text-[15px] leading-relaxed\">\n {content}\n </p>\n )\n : (\n <Markdown className=\"text-[15px] leading-relaxed\">\n {content}\n </Markdown>\n )}\n {/* Render tool parts (v5) */}\n {toolParts.length > 0 && (\n <div className=\"mt-2 space-y-1\">\n {toolParts.map((tool) =>\n renderTool\n ? (\n <React.Fragment key={tool.toolCallId}>\n {renderTool(tool)}\n </React.Fragment>\n )\n : (\n <div\n key={tool.toolCallId}\n className={cn(\n \"text-xs rounded px-2 py-1\",\n tool.type === \"dynamic-tool\"\n ? \"bg-blue-50 dark:bg-blue-900/20\"\n : \"bg-neutral-100 dark:bg-neutral-800\",\n )}\n >\n <span className=\"font-mono\">{tool.toolName}</span>\n <span className=\"ml-2 opacity-70\">[{tool.state}]</span>\n {tool.errorText && (\n <div className=\"text-red-600 dark:text-red-400 mt-1\">\n {tool.errorText}\n </div>\n )}\n </div>\n )\n )}\n </div>\n )}\n </div>\n </MessageItem>\n );\n })}\n\n {/* Loading indicator */}\n {isLoading && (\n <div className=\"flex justify-start\">\n <div className=\"bg-neutral-100 dark:bg-neutral-800 rounded-[20px] rounded-bl-[4px] px-4 py-3\">\n <div className=\"flex gap-1.5 items-center\">\n <span className={cn(theme.loading)} />\n <span className={cn(theme.loading)} style={{ animationDelay: \"0.15s\" }} />\n <span className={cn(theme.loading)} style={{ animationDelay: \"0.3s\" }} />\n </div>\n </div>\n </div>\n )}\n\n {/* Auto-scroll anchor */}\n <div ref={messagesEndRef} />\n </div>\n </MessageList>\n\n {/* Error display */}\n {error && (\n <div className=\"mx-4 mb-2 px-4 py-3 bg-red-50 dark:bg-red-900/20 rounded-2xl text-red-600 dark:text-red-400 text-sm\">\n {error.message}\n </div>\n )}\n\n {/* Input area - fixed at bottom */}\n <div className=\"flex-shrink-0 bg-white dark:bg-neutral-900 border-t border-neutral-200 dark:border-neutral-800\">\n <form\n onSubmit={submitHandler}\n className=\"max-w-2xl mx-auto px-4 py-3\"\n >\n <div className=\"flex gap-2 items-center\">\n <InputBox\n value={voice.isListening ? voice.transcript || input : input}\n onChange={inputChangeHandler}\n placeholder={voice.isListening ? \"Listening...\" : placeholder}\n disabled={isLoading || voice.isListening}\n multiline={multiline}\n className={theme.input}\n />\n <SubmitButton\n isLoading={isLoading || voice.isListening}\n hasInput={!!input.trim()}\n onStop={voice.isListening ? voice.stop : stop}\n onVoice={voiceHandler}\n disabled={!input.trim()}\n className={theme.button}\n />\n </div>\n </form>\n </div>\n </ChatContainer>\n );\n },\n);\n\nChat.displayName = \"Chat\";\n\n// Composition API (for advanced usage)\nconst ChatHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-b border-gray-200 dark:border-gray-800 p-4 bg-gray-50 dark:bg-gray-900\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatHeader.displayName = \"ChatHeader\";\n\nconst ChatMessages = MessageList;\nChatMessages.displayName = \"ChatMessages\";\n\nconst ChatInput = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n React.ComponentProps<typeof InputBox>\n>(({ className, ...props }, ref) => {\n return (\n <div className=\"border-t border-gray-200 dark:border-gray-800 p-4\">\n <div className=\"flex gap-2\">\n <InputBox\n ref={ref}\n className={cn(defaultChatTheme.input, className)}\n {...props}\n />\n </div>\n </div>\n );\n});\nChatInput.displayName = \"ChatInput\";\n\nconst ChatFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-t border-gray-200 dark:border-gray-800 p-4 text-sm text-gray-500\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatFooter.displayName = \"ChatFooter\";\n\n// Attach subcomponents for composition API\nexport const ChatComponents = Object.assign(Chat, {\n Header: ChatHeader,\n Messages: ChatMessages,\n Input: ChatInput,\n Footer: ChatFooter,\n});\n", "/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { UIMessage } from \"../hooks/index.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: UIMessage[\"role\"];\n\n /** Message content (can be children or prop) - deprecated, use children with parts */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading/streaming state - shows stop button */\n isLoading?: boolean;\n\n /** Whether input has text - determines voice vs submit icon */\n hasInput?: boolean;\n\n /** Handler for stop action */\n onStop?: () => void;\n\n /** Handler for voice input */\n onVoice?: () => void;\n\n /** Custom icons */\n icons?: {\n submit?: React.ReactNode;\n stop?: React.ReactNode;\n voice?: React.ReactNode;\n };\n\n children?: React.ReactNode;\n}\n\n/** Default submit icon (paper plane) */\nconst SubmitIcon = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n);\n\n/** Default stop icon (square) */\nconst StopIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n\n/** Default voice icon (microphone) */\nconst VoiceIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n);\n\n/**\n * SubmitButton - Smart submit button with three states\n *\n * States:\n * 1. **Voice** (no input): Shows microphone icon, triggers onVoice\n * 2. **Submit** (has input): Shows arrow icon, submits form\n * 3. **Stop** (loading): Shows stop icon, triggers onStop\n *\n * @example\n * ```tsx\n * <SubmitButton\n * hasInput={!!input.trim()}\n * isLoading={isLoading}\n * onStop={stop}\n * onVoice={() => console.log('Voice input')}\n * className=\"w-9 h-9 bg-blue-500 text-white rounded-full\"\n * />\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>((\n { className, isLoading, hasInput, onStop, onVoice, icons, disabled, children, ...props },\n ref,\n) => {\n // Determine button state and behavior\n const showStop = isLoading;\n const showVoice = !isLoading && !hasInput && onVoice;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (showStop && onStop) {\n e.preventDefault();\n onStop();\n } else if (showVoice && onVoice) {\n e.preventDefault();\n onVoice();\n }\n // For submit, let form handle it naturally\n };\n\n // Determine icon to show\n let icon: React.ReactNode;\n let ariaLabel: string;\n\n if (showStop) {\n icon = icons?.stop || <StopIcon />;\n ariaLabel = \"Stop generating\";\n } else if (showVoice) {\n icon = icons?.voice || <VoiceIcon />;\n ariaLabel = \"Voice input\";\n } else {\n icon = icons?.submit || <SubmitIcon />;\n ariaLabel = \"Send message\";\n }\n\n return (\n <button\n ref={ref}\n type={showStop || showVoice ? \"button\" : \"submit\"}\n className={className}\n disabled={disabled && !showStop}\n onClick={handleClick}\n data-submit-button=\"\"\n data-state={showStop ? \"stop\" : showVoice ? \"voice\" : \"submit\"}\n data-loading={isLoading}\n aria-label={ariaLabel}\n {...props}\n >\n {children || icon}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Supports both regular tools and dynamic tools (MCP, user-defined).\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { DynamicToolUIPart, ToolState, ToolUIPart } from \"../hooks/index.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool input */\n input?: unknown;\n\n /** Tool output */\n output?: unknown;\n\n /** Tool state (v5 format) */\n state?: ToolState;\n\n /** Error text if tool failed */\n errorText?: string;\n\n /** Whether this is a dynamic tool (MCP, user-defined) */\n dynamic?: boolean;\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={part.toolName}\n * input={part.input}\n * state={part.state}\n * dynamic={part.type === 'dynamic-tool'}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult output={part.output} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>((\n { className, name, input, output: _output, state, errorText, dynamic, children, ...props },\n ref,\n) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-state={state}\n data-dynamic={dynamic || undefined}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {state && <span data-tool-state=\"\">({state})</span>}\n {dynamic && <span data-tool-dynamic=\"\">[dynamic]</span>}\n </div>\n\n {input !== undefined && (\n <div data-tool-input=\"\">\n <pre>{JSON.stringify(input, null, 2)}</pre>\n </div>\n )}\n\n {errorText && (\n <div data-tool-error=\"\">\n {errorText}\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool output data */\n output: unknown;\n\n /** Custom renderer */\n renderOutput?: (output: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolResult\n * output={part.output}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, output, renderOutput, ...props }, ref) => {\n const content = renderOutput ? renderOutput(output) : JSON.stringify(output, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\n/** Union type for both tool types from v5 parts */\ntype ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool parts to display (v5 format) */\n tools: ToolPart[];\n\n /** Render each tool */\n renderTool?: (tool: ToolPart) => React.ReactNode;\n}\n\n/**\n * Check if a part is a dynamic tool\n */\nfunction isDynamicTool(tool: ToolPart): tool is DynamicToolUIPart {\n return tool.type === \"dynamic-tool\";\n}\n\n/**\n * ToolList - Display list of tool calls (v5 compatible)\n *\n * @example\n * ```tsx\n * // Filter tool parts - matches tool-${toolName} pattern (AI SDK v5) and dynamic-tool\n * const toolParts = message.parts.filter(\n * p => p.type.startsWith('tool-') || p.type === 'dynamic-tool'\n * );\n *\n * <ToolList\n * tools={toolParts}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation\n * name={tool.toolName}\n * state={tool.state}\n * dynamic={tool.type === 'dynamic-tool'}\n * >\n * {tool.output && <ToolResult output={tool.output} />}\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, tools, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {tools.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.toolCallId}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.toolCallId}\n name={tool.toolName}\n input={tool.input}\n state={tool.state}\n errorText={tool.errorText}\n dynamic={isDynamicTool(tool)}\n >\n {tool.output !== undefined && <ToolResult output={tool.output} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n", "/**\n * useVoiceInput - Web Speech API hook for voice input\n *\n * Provides browser-based speech recognition for chat input.\n */\n\nimport * as React from \"react\";\n\nexport interface UseVoiceInputOptions {\n /** Language for speech recognition (default: browser default) */\n language?: string;\n\n /** Continuous listening mode (default: false) */\n continuous?: boolean;\n\n /** Show interim results while speaking (default: true) */\n interimResults?: boolean;\n\n /** Callback when transcript is received */\n onTranscript?: (transcript: string, isFinal: boolean) => void;\n\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n\n /** Callback when listening starts */\n onStart?: () => void;\n\n /** Callback when listening ends */\n onEnd?: () => void;\n}\n\nexport interface UseVoiceInputResult {\n /** Whether voice input is supported in this browser */\n isSupported: boolean;\n\n /** Whether currently listening */\n isListening: boolean;\n\n /** Current transcript (interim or final) */\n transcript: string;\n\n /** Start listening */\n start: () => void;\n\n /** Stop listening */\n stop: () => void;\n\n /** Toggle listening on/off */\n toggle: () => void;\n\n /** Clear the transcript */\n clear: () => void;\n\n /** Last error message */\n error: string | null;\n}\n\n// Type for SpeechRecognition (not in all TypeScript libs)\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n resultIndex: number;\n}\n\ninterface SpeechRecognitionResultList {\n length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n 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 onstart: (() => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition?: new () => SpeechRecognition;\n webkitSpeechRecognition?: new () => SpeechRecognition;\n }\n}\n\n/**\n * useVoiceInput - Voice input hook using Web Speech API\n *\n * @example\n * ```tsx\n * const { isListening, transcript, toggle, isSupported } = useVoiceInput({\n * onTranscript: (text, isFinal) => {\n * if (isFinal) setInput(text);\n * }\n * });\n *\n * if (!isSupported) return <span>Voice not supported</span>;\n *\n * return (\n * <button onClick={toggle}>\n * {isListening ? 'Stop' : 'Start'} Voice\n * </button>\n * );\n * ```\n */\nexport function useVoiceInput(\n options: UseVoiceInputOptions = {},\n): UseVoiceInputResult {\n const {\n language,\n continuous = false,\n interimResults = true,\n onTranscript,\n onError,\n onStart,\n onEnd,\n } = options;\n\n const [isListening, setIsListening] = React.useState(false);\n const [transcript, setTranscript] = React.useState(\"\");\n const [error, setError] = React.useState<string | null>(null);\n\n const recognitionRef = React.useRef<SpeechRecognition | null>(null);\n\n // Check browser support\n const isSupported = React.useMemo(() => {\n if (typeof globalThis === \"undefined\") return false;\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n return !!(g.SpeechRecognition || g.webkitSpeechRecognition);\n }, []);\n\n // Initialize recognition\n React.useEffect(() => {\n if (!isSupported) return;\n\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n const SpeechRecognitionAPI = g.SpeechRecognition || g.webkitSpeechRecognition;\n\n if (!SpeechRecognitionAPI) return;\n\n const recognition = new SpeechRecognitionAPI();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n\n if (language) {\n recognition.lang = language;\n }\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result || !result[0]) continue;\n\n if (result.isFinal) {\n finalTranscript += result[0].transcript;\n } else {\n interimTranscript += result[0].transcript;\n }\n }\n\n const currentTranscript = finalTranscript || interimTranscript;\n setTranscript(currentTranscript);\n\n if (onTranscript) {\n onTranscript(currentTranscript, !!finalTranscript);\n }\n };\n\n recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n const errorMessage = getErrorMessage(event.error);\n setError(errorMessage);\n setIsListening(false);\n\n if (onError) {\n onError(errorMessage);\n }\n };\n\n recognition.onstart = () => {\n setIsListening(true);\n setError(null);\n\n if (onStart) {\n onStart();\n }\n };\n\n recognition.onend = () => {\n setIsListening(false);\n\n if (onEnd) {\n onEnd();\n }\n };\n\n recognitionRef.current = recognition;\n\n return () => {\n recognition.abort();\n };\n }, [isSupported, language, continuous, interimResults, onTranscript, onError, onStart, onEnd]);\n\n const start = React.useCallback(() => {\n if (!recognitionRef.current || isListening) return;\n\n setTranscript(\"\");\n setError(null);\n\n try {\n recognitionRef.current.start();\n } catch {\n // Already started\n console.warn(\"Speech recognition already started\");\n }\n }, [isListening]);\n\n const stop = React.useCallback(() => {\n if (!recognitionRef.current || !isListening) return;\n\n recognitionRef.current.stop();\n }, [isListening]);\n\n const toggle = React.useCallback(() => {\n if (isListening) {\n stop();\n } else {\n start();\n }\n }, [isListening, start, stop]);\n\n const clear = React.useCallback(() => {\n setTranscript(\"\");\n }, []);\n\n return {\n isSupported,\n isListening,\n transcript,\n start,\n stop,\n toggle,\n clear,\n error,\n };\n}\n\nfunction getErrorMessage(error: string): string {\n switch (error) {\n case \"no-speech\":\n return \"No speech detected. Please try again.\";\n case \"audio-capture\":\n return \"No microphone found. Please check your device.\";\n case \"not-allowed\":\n return \"Microphone permission denied. Please allow access.\";\n case \"network\":\n return \"Network error. Please check your connection.\";\n case \"aborted\":\n return \"Speech recognition was aborted.\";\n case \"language-not-supported\":\n return \"Language not supported.\";\n case \"service-not-allowed\":\n return \"Speech recognition service not allowed.\";\n default:\n return `Speech recognition error: ${error}`;\n }\n}\n", "/**\n * Markdown Component - Rich markdown renderer for chat messages\n *\n * Supports:\n * - GitHub Flavored Markdown (tables, strikethrough, etc.)\n * - Syntax highlighted code blocks\n * - Mermaid diagrams (lazy loaded, client-side only)\n *\n * Works in: Deno, Node.js, Bun (client-side React)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"./theme.ts\";\n\nexport interface MarkdownProps {\n /** Markdown content to render */\n children: string;\n /** Additional class name */\n className?: string;\n /** Enable mermaid diagram rendering (default: true, client-side only) */\n enableMermaid?: boolean;\n /** Custom code block renderer */\n renderCodeBlock?: (props: CodeBlockProps) => React.ReactNode;\n}\n\nexport interface CodeBlockProps {\n language: string | undefined;\n code: string;\n inline?: boolean;\n}\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n// esm.sh CDN URLs for browser-side dynamic imports\n// These URLs are stored in variables to prevent bundler transforms\nconst ESM_REACT_MARKDOWN = \"https://esm.sh/react-markdown@9?external=react\";\nconst ESM_REMARK_GFM = \"https://esm.sh/remark-gfm@4\";\nconst ESM_REHYPE_HIGHLIGHT = \"https://esm.sh/rehype-highlight@7\";\nconst ESM_MERMAID = \"https://esm.sh/mermaid@11\";\n\n// Lazy load heavy dependencies\n// deno-lint-ignore no-explicit-any\nlet ReactMarkdown: any = null;\n// deno-lint-ignore no-explicit-any\nlet remarkGfm: any = null;\n// deno-lint-ignore no-explicit-any\nlet rehypeHighlight: any = null;\n\n// Mermaid state (browser only)\n// deno-lint-ignore no-explicit-any\nlet mermaidPromise: Promise<any> | null = null;\n// deno-lint-ignore no-explicit-any\nlet mermaidModule: any = null;\n\nasync function loadMermaid() {\n if (!isBrowser) return null;\n if (mermaidModule) return mermaidModule;\n if (!mermaidPromise) {\n // Use Function constructor to prevent bundler from transforming the import\n const dynamicImport = new Function(\"url\", \"return import(url)\");\n mermaidPromise = dynamicImport(ESM_MERMAID);\n }\n mermaidModule = await mermaidPromise;\n mermaidModule.default.initialize({\n startOnLoad: false,\n theme: \"neutral\",\n securityLevel: \"loose\",\n });\n return mermaidModule;\n}\n\n/**\n * Mermaid diagram component with lazy loading (client-side only)\n */\nfunction MermaidDiagram({ code }: { code: string }) {\n const [svg, setSvg] = React.useState<string>(\"\");\n const [error, setError] = React.useState<string>(\"\");\n\n React.useEffect(() => {\n // Only render in browser\n if (!isBrowser) return;\n\n let cancelled = false;\n\n async function render() {\n try {\n const mermaid = await loadMermaid();\n if (!mermaid) return;\n\n const id = `mermaid-${Math.random().toString(36).slice(2, 9)}`;\n const { svg: renderedSvg } = await mermaid.default.render(id, code);\n if (!cancelled) {\n setSvg(renderedSvg);\n setError(\"\");\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to render diagram\");\n }\n }\n }\n\n render();\n return () => {\n cancelled = true;\n };\n }, [code]);\n\n // Server-side: show code block fallback\n if (!isBrowser) {\n return (\n <pre className=\"my-4 p-4 bg-neutral-100 dark:bg-neutral-800 rounded-lg overflow-auto\">\n <code>{code}</code>\n </pre>\n );\n }\n\n if (error) {\n return (\n <div className=\"my-4 p-4 bg-red-50 dark:bg-red-900/20 rounded-lg text-red-600 dark:text-red-400 text-sm\">\n <p className=\"font-medium\">Mermaid Error</p>\n <p>{error}</p>\n <pre className=\"mt-2 text-xs overflow-auto\">{code}</pre>\n </div>\n );\n }\n\n if (!svg) {\n return (\n <div className=\"my-4 p-4 bg-neutral-100 dark:bg-neutral-800 rounded-lg animate-pulse\">\n <div className=\"h-32 flex items-center justify-center text-neutral-400\">\n Loading diagram...\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"my-4 flex justify-center overflow-auto\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n\n/**\n * Code block component with syntax highlighting and mermaid support\n */\nfunction CodeBlock({\n language,\n code,\n inline,\n enableMermaid,\n renderCodeBlock,\n}: CodeBlockProps & {\n enableMermaid: boolean;\n renderCodeBlock?: MarkdownProps[\"renderCodeBlock\"];\n}) {\n // Custom renderer takes priority\n if (renderCodeBlock) {\n return <>{renderCodeBlock({ language, code, inline })}</>;\n }\n\n // Inline code\n if (inline) {\n return (\n <code className=\"bg-neutral-100 dark:bg-neutral-800 px-1.5 py-0.5 rounded text-sm font-mono\">\n {code}\n </code>\n );\n }\n\n // Mermaid diagrams\n if (enableMermaid && language === \"mermaid\") {\n return <MermaidDiagram code={code} />;\n }\n\n // Regular code block (syntax highlighting handled by rehype-highlight)\n return (\n <pre className=\"my-4 p-4 bg-neutral-900 dark:bg-neutral-950 rounded-lg overflow-auto\">\n <code className={language ? `language-${language} hljs` : \"hljs\"}>\n {code}\n </code>\n </pre>\n );\n}\n\n/**\n * Rich Markdown renderer with GFM, syntax highlighting, and mermaid support\n */\nexport function Markdown({\n children,\n className,\n enableMermaid = true,\n renderCodeBlock,\n}: MarkdownProps): React.ReactElement {\n const [isLoaded, setIsLoaded] = React.useState(false);\n const [, forceUpdate] = React.useReducer((x) => x + 1, 0);\n\n // Lazy load react-markdown and plugins\n React.useEffect(() => {\n async function load() {\n if (!ReactMarkdown) {\n // Always use esm.sh URLs - the bundle runs in browser\n // Using Function constructor to prevent bundler from transforming the imports\n const dynamicImport = new Function(\"url\", \"return import(url)\");\n const [rmModule, gfmModule, highlightModule] = await Promise.all([\n dynamicImport(ESM_REACT_MARKDOWN),\n dynamicImport(ESM_REMARK_GFM),\n dynamicImport(ESM_REHYPE_HIGHLIGHT),\n ]);\n ReactMarkdown = rmModule.default;\n remarkGfm = gfmModule.default;\n rehypeHighlight = highlightModule.default;\n }\n setIsLoaded(true);\n forceUpdate();\n }\n load();\n }, []);\n\n // Fallback while loading\n if (!isLoaded || !ReactMarkdown) {\n return (\n <div className={cn(\"prose prose-sm dark:prose-invert max-w-none\", className)}>\n <p className=\"whitespace-pre-wrap\">{children}</p>\n </div>\n );\n }\n\n return (\n <div className={cn(\"prose prose-sm dark:prose-invert max-w-none\", className)}>\n <ReactMarkdown\n remarkPlugins={remarkGfm ? [remarkGfm] : []}\n rehypePlugins={rehypeHighlight ? [rehypeHighlight] : []}\n components={{\n // Custom code rendering\n // deno-lint-ignore no-explicit-any\n code(props: any) {\n const { className: codeClassName, children: codeChildren, node } = props;\n const match = /language-(\\w+)/.exec(codeClassName || \"\");\n const language = match ? match[1] : undefined;\n const code = String(codeChildren).replace(/\\n$/, \"\");\n const isInline = !node?.position?.start?.line;\n\n return (\n <CodeBlock\n language={language}\n code={code}\n inline={isInline}\n enableMermaid={enableMermaid}\n renderCodeBlock={renderCodeBlock}\n />\n );\n },\n // Style tables\n // deno-lint-ignore no-explicit-any\n table(props: any) {\n return (\n <div className=\"my-4 overflow-auto\">\n <table className=\"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700\">\n {props.children}\n </table>\n </div>\n );\n },\n // Style links\n // deno-lint-ignore no-explicit-any\n a(props: any) {\n return (\n <a\n href={props.href}\n className=\"text-blue-600 dark:text-blue-400 hover:underline\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {props.children}\n </a>\n );\n },\n // Style blockquotes\n // deno-lint-ignore no-explicit-any\n blockquote(props: any) {\n return (\n <blockquote className=\"border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 my-4 text-neutral-600 dark:text-neutral-400 italic\">\n {props.children}\n </blockquote>\n );\n },\n }}\n >\n {children}\n </ReactMarkdown>\n </div>\n );\n}\n\nexport default Markdown;\n", "/**\n * AgentCard Component - Layer 3 (Styled)\n *\n * Production-ready agent status and tool visualization.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n AgentContainer,\n AgentStatus as AgentStatusPrimitive,\n ThinkingIndicator,\n ToolInvocation,\n ToolList,\n ToolResult,\n} from \"../primitives/index.ts\";\nimport type { AgentStatus, Message, ToolCall } from \"../../types/agent.ts\";\nimport { type AgentTheme, cn, defaultAgentTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface AgentCardProps {\n /** Agent messages */\n messages?: Message[];\n\n /** Tool calls */\n toolCalls?: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text */\n thinking?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<AgentTheme>;\n\n /** Custom tool renderer */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * AgentCard - Agent status and tool visualization\n *\n * @example\n * ```tsx\n * import { AgentCard } from 'veryfront/ai/components';\n * import { useAgent } from 'veryfront/ai/react';\n *\n * export default function AgentInterface() {\n * const agent = useAgent({ agent: 'support' });\n * return <AgentCard {...agent} />;\n * }\n * ```\n */\nexport const AgentCard = React.forwardRef<HTMLDivElement, AgentCardProps>(\n (\n {\n messages,\n toolCalls = [],\n status,\n thinking,\n className,\n theme: userTheme,\n renderTool,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultAgentTheme, userTheme);\n\n return (\n <AgentContainer ref={ref} className={cn(theme.container, className)}>\n {/* Status */}\n <AgentStatusPrimitive\n status={status}\n className={cn(theme.status, getStatusColor(status))}\n />\n\n {/* Thinking indicator */}\n {thinking && (\n <ThinkingIndicator className={theme.thinking}>\n <span className=\"font-semibold\">Thinking:</span>\n {thinking}\n </ThinkingIndicator>\n )}\n\n {/* Tool calls */}\n {toolCalls.length > 0 && (\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-neutral-700 dark:text-neutral-300\">\n Tool Calls\n </h3>\n <ToolList\n toolCalls={toolCalls}\n className=\"space-y-3\"\n renderTool={renderTool ||\n ((tool) => (\n <ToolInvocation\n name={tool.name}\n args={tool.args}\n status={tool.status}\n className={theme.tool}\n >\n {tool.result !== undefined && (\n <ToolResult result={tool.result} className={theme.toolResult} />\n )}\n {tool.error && (\n <div className=\"mt-2 p-3 bg-red-50 dark:bg-red-900/20 text-red-900 dark:text-red-100 rounded-xl text-sm border border-red-200 dark:border-red-800\">\n Error: {tool.error}\n </div>\n )}\n </ToolInvocation>\n ))}\n />\n </div>\n )}\n\n {/* Messages (if provided) */}\n {messages && messages.length > 0 && (\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-neutral-700 dark:text-neutral-300\">\n Messages\n </h3>\n <div className=\"space-y-2 max-h-96 overflow-y-auto\">\n {messages.map((msg) => (\n <div\n key={msg.id}\n className=\"text-sm p-3 rounded-xl bg-neutral-50 dark:bg-neutral-800\"\n >\n <span className=\"font-semibold capitalize text-neutral-900 dark:text-neutral-100\">\n {msg.role}:\n </span>\n <span className=\"text-neutral-600 dark:text-neutral-400 ml-1\">\n {msg.content.substring(0, 200)}...\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </AgentContainer>\n );\n },\n);\n\nAgentCard.displayName = \"AgentCard\";\n\n/**\n * Get status color classes - Apple-inspired status colors\n */\nfunction getStatusColor(status: AgentStatus): string {\n switch (status) {\n case \"idle\":\n return \"bg-neutral-100 text-neutral-700 dark:bg-neutral-800 dark:text-neutral-300\";\n case \"thinking\":\n return \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300\";\n case \"tool_execution\":\n return \"bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300\";\n case \"streaming\":\n return \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300\";\n case \"completed\":\n return \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300\";\n case \"error\":\n return \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300\";\n default:\n return \"bg-neutral-100 text-neutral-700 dark:bg-neutral-800 dark:text-neutral-300\";\n }\n}\n", "/**\n * Message Component - Layer 3 (Styled)\n *\n * Production-ready message display with AI SDK v5 parts support.\n */\n\nimport * as React from \"react\";\nimport { MessageContent, MessageItem, MessageRole } from \"../primitives/index.ts\";\nimport type { ToolUIPart, UIMessage, UIMessagePart } from \"../hooks/index.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface MessageProps {\n /** Message to display (v5 UIMessage format) */\n message: UIMessage;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Show role label */\n showRole?: boolean;\n\n /** Show timestamp */\n showTimestamp?: boolean;\n\n /** Custom renderer for tool calls (matches tool-${toolName} pattern) */\n renderToolCall?: (part: ToolUIPart) => React.ReactNode;\n\n /** Custom renderer for dynamic tools */\n renderDynamicTool?: (\n part: Extract<UIMessagePart, { type: \"dynamic-tool\" }>,\n ) => React.ReactNode;\n\n /** Custom renderer for reasoning */\n renderReasoning?: (part: Extract<UIMessagePart, { type: \"reasoning\" }>) => React.ReactNode;\n}\n\n/**\n * Helper to extract text content from v5 parts array\n */\nfunction getTextFromParts(parts: UIMessagePart[]): string {\n return parts\n .filter((p): p is Extract<UIMessagePart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Message - Styled message component with v5 parts support\n *\n * @example\n * ```tsx\n * import { Message } from 'veryfront/ai/components';\n *\n * <Message\n * message={msg}\n * showRole={true}\n * renderToolCall={(part) => <MyToolUI part={part} />}\n * />\n * ```\n */\nexport const Message = React.forwardRef<HTMLDivElement, MessageProps>(\n (\n {\n message,\n className,\n theme: userTheme,\n showRole = false,\n showTimestamp = false,\n renderToolCall,\n renderDynamicTool,\n renderReasoning,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n\n return (\n <MessageItem\n ref={ref}\n role={message.role}\n className={cn(\n \"flex\",\n message.role === \"user\" ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div className={theme.message?.[message.role] || theme.message?.assistant}>\n {showRole && (\n <MessageRole className=\"block text-xs font-semibold mb-1 opacity-75 uppercase\">\n {message.role}\n </MessageRole>\n )}\n\n {/* Render parts array (v5 format) */}\n {message.parts.map((part, index) => {\n const key = `${message.id}-part-${index}`;\n\n switch (part.type) {\n case \"text\":\n return (\n <MessageContent key={key}>\n {part.text}\n </MessageContent>\n );\n\n case \"reasoning\":\n if (renderReasoning) {\n return <React.Fragment key={key}>{renderReasoning(part)}</React.Fragment>;\n }\n return (\n <div key={key} className=\"text-sm italic opacity-70 my-2 pl-2 border-l-2\">\n {part.text}\n </div>\n );\n\n case \"dynamic-tool\":\n if (renderDynamicTool) {\n return <React.Fragment key={key}>{renderDynamicTool(part)}</React.Fragment>;\n }\n return (\n <div key={key} className=\"text-xs bg-blue-50 rounded p-2 my-2\">\n <span className=\"font-mono\">{part.toolName}</span>\n <span className=\"ml-2 text-blue-500\">[dynamic: {part.state}]</span>\n {part.errorText && <div className=\"text-red-600 mt-1\">{part.errorText}</div>}\n </div>\n );\n\n default:\n // Handle tool-${toolName} pattern (AI SDK v5) - type starts with \"tool-\"\n if (part.type.startsWith(\"tool-\") && \"toolCallId\" in part) {\n const toolPart = part as ToolUIPart;\n if (renderToolCall) {\n return <React.Fragment key={key}>{renderToolCall(toolPart)}</React.Fragment>;\n }\n return (\n <div key={key} className=\"text-xs bg-gray-100 rounded p-2 my-2\">\n <span className=\"font-mono\">{toolPart.toolName}</span>\n <span className=\"ml-2 text-gray-500\">[{toolPart.state}]</span>\n {toolPart.errorText && (\n <div className=\"text-red-600 mt-1\">{toolPart.errorText}</div>\n )}\n </div>\n );\n }\n return null;\n }\n })}\n\n {showTimestamp && message.createdAt && (\n <div className=\"text-xs opacity-60 mt-1\">\n {new Date(message.createdAt).toLocaleTimeString()}\n </div>\n )}\n </div>\n </MessageItem>\n );\n },\n);\n\nMessage.displayName = \"Message\";\n\nexport interface StreamingMessageProps {\n /** Streaming parts (v5 format) */\n parts: UIMessagePart[];\n\n /** Show typing cursor */\n showCursor?: boolean;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n}\n\n/**\n * StreamingMessage - Display streaming message with v5 parts\n *\n * @example\n * ```tsx\n * import { StreamingMessage } from 'veryfront/ai/components';\n *\n * {isStreaming && (\n * <StreamingMessage parts={streamingParts} showCursor={true} />\n * )}\n * ```\n */\nexport const StreamingMessage = React.forwardRef<\n HTMLDivElement,\n StreamingMessageProps\n>(({ parts, showCursor = true, className, theme: userTheme }, ref) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n const textContent = getTextFromParts(parts);\n\n return (\n <MessageItem\n ref={ref}\n role=\"assistant\"\n className={cn(\"flex justify-start\", className)}\n >\n <div className={theme.message?.assistant}>\n <MessageContent>\n {textContent}\n {showCursor && <span className=\"inline-block w-1 h-4 bg-current ml-1 animate-pulse\" />}\n </MessageContent>\n </div>\n </MessageItem>\n );\n});\n\nStreamingMessage.displayName = \"StreamingMessage\";\n", "/**\n * Error Boundary for AI Components\n *\n * React error boundary specifically designed for AI component errors.\n */\n\nimport * as React from \"react\";\n\nexport interface AIErrorBoundaryProps {\n /** Children to wrap */\n children: React.ReactNode;\n\n /** Fallback UI when error occurs */\n fallback?: React.ReactNode | ((error: Error, reset: () => void) => React.ReactNode);\n\n /** Callback when error occurs */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\ninterface AIErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * AIErrorBoundary - Error boundary for AI components\n *\n * @example\n * ```tsx\n * import { AIErrorBoundary } from 'veryfront/ai/components';\n *\n * <AIErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={reset}>Try Again</button>\n * </div>\n * )}\n * >\n * <Chat {...chat} />\n * </AIErrorBoundary>\n * ```\n */\nexport class AIErrorBoundary extends React.Component<\n AIErrorBoundaryProps,\n AIErrorBoundaryState\n> {\n constructor(props: AIErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): AIErrorBoundaryState {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Log error\n console.error(\"[AIErrorBoundary] Caught error:\", error, errorInfo);\n\n // Call error callback\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError && this.state.error) {\n // Custom fallback\n if (this.props.fallback) {\n if (typeof this.props.fallback === \"function\") {\n return this.props.fallback(this.state.error, this.reset);\n }\n return this.props.fallback;\n }\n\n // Default fallback UI - Apple-inspired design\n return (\n <div\n className=\"border border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-900/20 rounded-2xl p-6\"\n role=\"alert\"\n >\n <div className=\"flex items-start gap-4\">\n <div className=\"w-10 h-10 rounded-full bg-red-100 dark:bg-red-900/40 flex items-center justify-center flex-shrink-0\">\n <svg\n className=\"w-5 h-5 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-base font-semibold text-red-900 dark:text-red-100\">\n {this.props.errorMessage || \"An error occurred in the AI component\"}\n </h3>\n\n <p className=\"mt-1.5 text-sm text-red-700 dark:text-red-300 leading-relaxed\">\n {this.state.error.message}\n </p>\n\n <button\n type=\"button\"\n onClick={this.reset}\n className=\"mt-4 px-5 py-2.5 text-sm font-medium text-white bg-red-500 hover:bg-red-600 active:scale-[0.98] rounded-full transition-all\"\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Hook version of error boundary\n */\nexport function useAIErrorHandler() {\n const [error, setError] = React.useState<Error | null>(null);\n\n const handleError = React.useCallback((error: Error) => {\n console.error(\"[useAIErrorHandler] Error:\", error);\n setError(error);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n error,\n handleError,\n clearError,\n hasError: error !== null,\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["React", "React", "jsx", "React", "jsx", "React", "jsx", "React", "jsx", "jsxs", "React", "React", "Fragment", "jsx", "jsxs", "jsx", "jsxs", "React", "jsx", "jsxs", "React", "jsx", "jsxs", "React", "jsx", "jsxs", "error"]
4
+ "sourcesContent": ["/**\n * Shim for Deno.env in Node.js environment\n * This file is injected by esbuild to provide Deno.env compatibility\n */\n\n// @ts-ignore - Global Deno shim for Node.js\nglobalThis.Deno = globalThis.Deno || {\n env: {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n },\n};\n", "/**\n * Theme System for Styled Components\n *\n * Provides default theme and utilities for customization.\n */\n\nexport interface ChatTheme {\n /** Container styles */\n container?: string;\n\n /** Message styles by role */\n message?: {\n user?: string;\n assistant?: string;\n system?: string;\n tool?: string;\n };\n\n /** Input styles */\n input?: string;\n\n /** Button styles */\n button?: string;\n\n /** Loading indicator styles */\n loading?: string;\n}\n\n/**\n * Default theme using Tailwind CSS - Apple Messages inspired, clean & minimal\n */\nexport const defaultChatTheme: ChatTheme = {\n container: \"flex flex-col h-full overflow-hidden bg-white dark:bg-neutral-900\",\n message: {\n user: \"bg-blue-500 text-white rounded-[20px] rounded-br-[4px] px-4 py-2.5 max-w-[75%]\",\n assistant:\n \"bg-neutral-100 dark:bg-neutral-800 text-neutral-900 dark:text-neutral-100 rounded-[20px] rounded-bl-[4px] px-4 py-2.5 max-w-[75%]\",\n system:\n \"bg-neutral-100 dark:bg-neutral-800 text-neutral-500 dark:text-neutral-400 rounded-2xl px-4 py-2 text-sm mx-auto text-center\",\n tool:\n \"bg-neutral-50 dark:bg-neutral-800 text-neutral-600 dark:text-neutral-300 rounded-xl px-3 py-2 text-sm font-mono border border-neutral-200 dark:border-neutral-700\",\n },\n input:\n \"flex-1 px-4 py-2.5 bg-neutral-100 dark:bg-neutral-800 border-0 rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500/30 dark:text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 text-[15px]\",\n button:\n \"w-9 h-9 flex items-center justify-center bg-blue-500 hover:bg-blue-600 active:scale-95 text-white rounded-full transition-all disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-blue-500 disabled:active:scale-100\",\n loading: \"w-1.5 h-1.5 bg-neutral-400 rounded-full animate-bounce\",\n};\n\nexport interface AgentTheme {\n /** Container styles */\n container?: string;\n\n /** Status styles */\n status?: string;\n\n /** Thinking indicator styles */\n thinking?: string;\n\n /** Tool invocation styles */\n tool?: string;\n\n /** Tool result styles */\n toolResult?: string;\n}\n\n/**\n * Default agent theme - Apple-inspired, clean & minimal\n */\nexport const defaultAgentTheme: AgentTheme = {\n container:\n \"border border-neutral-200 dark:border-neutral-800 rounded-2xl p-6 space-y-4 bg-white dark:bg-neutral-900\",\n status: \"inline-flex items-center px-3 py-1.5 rounded-full text-sm font-medium\",\n thinking:\n \"bg-amber-50 dark:bg-amber-900/20 rounded-xl px-4 py-3 italic text-neutral-700 dark:text-neutral-300 border border-amber-200 dark:border-amber-800\",\n tool:\n \"rounded-xl px-4 py-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800\",\n toolResult:\n \"mt-2 p-3 bg-neutral-100 dark:bg-neutral-800 rounded-xl font-mono text-sm overflow-x-auto\",\n};\n\n/**\n * Merge themes (user theme overrides default)\n */\nexport function mergeThemes<T extends Record<string, any>>(\n defaultTheme: T,\n userTheme?: Partial<T>,\n): T {\n if (!userTheme) return defaultTheme;\n\n const merged = { ...defaultTheme };\n\n for (const key in userTheme) {\n const value = userTheme[key];\n\n if (value === undefined) {\n continue;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n // Merge nested objects\n merged[key] = { ...defaultTheme[key], ...value } as T[Extract<keyof T, string>];\n } else {\n merged[key] = value as T[Extract<keyof T, string>];\n }\n }\n\n return merged;\n}\n\n/**\n * Utility to combine class names\n * (Simple version - in production use 'clsx' or 'cn' from shadcn)\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n", "/**\n * Chat Component - Layer 3 (Styled)\n *\n * Production-ready, fully styled chat component.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n ChatContainer,\n InputBox,\n MessageItem,\n MessageList,\n SubmitButton,\n} from \"../primitives/index.ts\";\nimport { useVoiceInput } from \"../hooks/use-voice-input.ts\";\nimport type { DynamicToolUIPart, ToolUIPart, UIMessage, UIMessagePart } from \"../hooks/use-chat.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\nimport { Markdown } from \"./markdown.tsx\";\n\n/**\n * Icons for tool UI (AI Elements style - Lucide icons)\n */\nfunction CircleIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n );\n}\n\nfunction ClockIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\nfunction CheckCircleIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n );\n}\n\nfunction XCircleIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n}\n\nfunction WrenchIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\nfunction BrainIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\" />\n <path d=\"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\" />\n <path d=\"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\" />\n <path d=\"M17.599 6.5a3 3 0 0 0 .399-1.375\" />\n <path d=\"M6.003 5.125A3 3 0 0 0 6.401 6.5\" />\n <path d=\"M3.477 10.896a4 4 0 0 1 .585-.396\" />\n <path d=\"M19.938 10.5a4 4 0 0 1 .585.396\" />\n <path d=\"M6 18a4 4 0 0 1-1.967-.516\" />\n <path d=\"M19.967 17.484A4 4 0 0 1 18 18\" />\n </svg>\n );\n}\n\nfunction MessageSquareIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\nfunction ArrowDownIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <polyline points=\"19 12 12 19 5 12\" />\n </svg>\n );\n}\n\nfunction _SendIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n );\n}\n\nfunction _StopIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n </svg>\n );\n}\n\nfunction RefreshCwIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n );\n}\n\nfunction CopyIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n );\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={cn(\"size-4\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * Shimmer animation for loading states (AI Elements style)\n */\nfunction Shimmer({ children }: { children: React.ReactNode }) {\n return (\n <span className=\"relative inline-block overflow-hidden\">\n <span className=\"animate-pulse\">{children}</span>\n </span>\n );\n}\n\n/**\n * Reasoning card component - displays AI thinking/reasoning process\n * Styled to match AI Elements (https://ai-sdk.dev/elements)\n */\nfunction ReasoningCard({ text, isStreaming = false }: { text: string; isStreaming?: boolean }) {\n const [isOpen, setIsOpen] = React.useState(true);\n\n // Auto-close after streaming ends\n React.useEffect(() => {\n if (!isStreaming && isOpen) {\n const timer = setTimeout(() => {\n setIsOpen(false);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [isStreaming, isOpen]);\n\n return (\n <div className=\"not-prose mb-4\">\n {/* Trigger */}\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground\"\n >\n <BrainIcon className=\"size-4\" />\n {isStreaming ? <Shimmer>Thinking...</Shimmer> : <span>Thought process</span>}\n <ChevronDownIcon\n className={cn(\n \"size-4 transition-transform\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Content */}\n {isOpen && (\n <div className=\"mt-4 text-sm text-muted-foreground border-l-2 border-muted pl-4 ml-2\">\n <Markdown className=\"text-sm\">{text}</Markdown>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Suggestion component - ChatGPT-style suggestion card\n */\nexport interface SuggestionProps {\n suggestion: string;\n onClick?: (suggestion: string) => void;\n className?: string;\n /** Optional icon to display */\n icon?: React.ReactNode;\n}\n\nexport function Suggestion({ suggestion, onClick, className, icon }: SuggestionProps) {\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(suggestion)}\n className={cn(\n \"group flex items-start gap-3 rounded-xl border border-border bg-background p-4 text-left text-sm text-foreground transition-all hover:bg-muted hover:border-muted-foreground/20\",\n className,\n )}\n >\n {icon && (\n <span className=\"shrink-0 text-muted-foreground group-hover:text-foreground transition-colors\">\n {icon}\n </span>\n )}\n <span className=\"line-clamp-2\">{suggestion}</span>\n </button>\n );\n}\n\n/**\n * Suggestions container - ChatGPT-style 2x2 grid layout\n */\nexport interface SuggestionsProps {\n children: React.ReactNode;\n className?: string;\n /** Layout mode: 'grid' for 2x2 grid (ChatGPT style), 'horizontal' for scrollable pills */\n layout?: \"grid\" | \"horizontal\";\n}\n\nexport function Suggestions({ children, className, layout = \"grid\" }: SuggestionsProps) {\n if (layout === \"horizontal\") {\n return (\n <div className={cn(\"flex gap-2 overflow-x-auto pb-2 scrollbar-hide\", className)}>\n {children}\n </div>\n );\n }\n\n return (\n <div className={cn(\"grid grid-cols-2 gap-3 max-w-2xl mx-auto\", className)}>\n {children}\n </div>\n );\n}\n\n/**\n * ConversationEmptyState - ChatGPT-style empty state with large greeting\n */\nexport interface ConversationEmptyStateProps {\n icon?: React.ReactNode;\n title?: string;\n description?: string;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function ConversationEmptyState({\n icon,\n title = \"What can I help with?\",\n description,\n children,\n className,\n}: ConversationEmptyStateProps) {\n return (\n <div className={cn(\"flex flex-col items-center justify-center text-center\", className)}>\n {icon && <div className=\"mb-4 text-muted-foreground\">{icon}</div>}\n <h1 className=\"text-3xl font-semibold text-foreground\">{title}</h1>\n {description && <p className=\"mt-2 text-base text-muted-foreground max-w-md\">{description}\n </p>}\n {children}\n </div>\n );\n}\n\n/**\n * ConversationScrollButton - scroll to bottom button\n */\nexport interface ConversationScrollButtonProps {\n onClick?: () => void;\n visible?: boolean;\n className?: string;\n}\n\nexport function ConversationScrollButton({\n onClick,\n visible = true,\n className,\n}: ConversationScrollButtonProps) {\n if (!visible) return null;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"absolute bottom-4 left-1/2 -translate-x-1/2 rounded-full border border-border bg-background p-2 shadow-lg transition-all hover:bg-muted\",\n className,\n )}\n >\n <ArrowDownIcon className=\"size-4\" />\n </button>\n );\n}\n\n/**\n * MessageActions component - copy button for messages\n */\nexport interface MessageActionsProps {\n content: string;\n className?: string;\n}\n\nexport function MessageActions({ content, className }: MessageActionsProps) {\n const [copied, setCopied] = React.useState(false);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers\n const textarea = document.createElement(\"textarea\");\n textarea.value = content;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n document.body.removeChild(textarea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n return (\n <div className={cn(\"flex items-center gap-1 mt-2\", className)}>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors\"\n title={copied ? \"Copied!\" : \"Copy to clipboard\"}\n >\n {copied\n ? (\n <>\n <CheckIcon className=\"size-3\" />\n <span>Copied</span>\n </>\n )\n : (\n <>\n <CopyIcon className=\"size-3\" />\n <span>Copy</span>\n </>\n )}\n </button>\n </div>\n );\n}\n\n/**\n * Loader component - animated loading dots\n */\nexport function Loader({ className, size = 16 }: { className?: string; size?: number }) {\n return (\n <div className={cn(\"flex items-center gap-1\", className)}>\n <span\n className=\"animate-bounce rounded-full bg-muted-foreground\"\n style={{ width: size / 4, height: size / 4, animationDelay: \"0ms\" }}\n />\n <span\n className=\"animate-bounce rounded-full bg-muted-foreground\"\n style={{ width: size / 4, height: size / 4, animationDelay: \"150ms\" }}\n />\n <span\n className=\"animate-bounce rounded-full bg-muted-foreground\"\n style={{ width: size / 4, height: size / 4, animationDelay: \"300ms\" }}\n />\n </div>\n );\n}\n\n/**\n * Tool call status badge component (AI Elements style)\n */\nfunction ToolStatusBadge({ state }: { state: string }) {\n const labels: Record<string, string> = {\n \"input-streaming\": \"Pending\",\n \"input-available\": \"Running\",\n \"approval-requested\": \"Awaiting Approval\",\n \"approval-responded\": \"Responded\",\n \"output-available\": \"Completed\",\n \"output-error\": \"Error\",\n \"output-denied\": \"Denied\",\n // Legacy states\n \"call\": \"Running\",\n \"partial-call\": \"Running\",\n \"result\": \"Completed\",\n \"error\": \"Error\",\n };\n\n const icons: Record<string, React.ReactNode> = {\n \"input-streaming\": <CircleIcon className=\"size-3.5\" />,\n \"input-available\": <ClockIcon className=\"size-3.5 animate-pulse\" />,\n \"approval-requested\": <ClockIcon className=\"size-3.5 text-yellow-600\" />,\n \"approval-responded\": <CheckCircleIcon className=\"size-3.5 text-blue-600\" />,\n \"output-available\": <CheckCircleIcon className=\"size-3.5 text-green-600\" />,\n \"output-error\": <XCircleIcon className=\"size-3.5 text-red-600\" />,\n \"output-denied\": <XCircleIcon className=\"size-3.5 text-orange-600\" />,\n // Legacy states\n \"call\": <ClockIcon className=\"size-3.5 animate-pulse\" />,\n \"partial-call\": <ClockIcon className=\"size-3.5 animate-pulse\" />,\n \"result\": <CheckCircleIcon className=\"size-3.5 text-green-600\" />,\n \"error\": <XCircleIcon className=\"size-3.5 text-red-600\" />,\n };\n\n return (\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-secondary px-2.5 py-0.5 text-xs font-medium text-secondary-foreground border border-border\">\n {icons[state] || <CircleIcon className=\"size-3.5\" />}\n {labels[state] || state}\n </span>\n );\n}\n\n/**\n * Format JSON with syntax highlighting\n */\nfunction formatJsonWithHighlight(obj: unknown): React.ReactNode {\n if (obj === undefined || obj === null) return null;\n\n const jsonStr = typeof obj === \"string\" ? obj : JSON.stringify(obj, null, 2);\n\n // Simple syntax highlighting\n const highlighted = jsonStr\n .replace(/\"([^\"]+)\":/g, '<span class=\"text-green-600 dark:text-green-400\">\"$1\"</span>:')\n .replace(/: \"([^\"]*)\"/g, ': <span class=\"text-amber-600 dark:text-amber-400\">\"$1\"</span>')\n .replace(/: (\\d+)/g, ': <span class=\"text-blue-600 dark:text-blue-400\">$1</span>')\n .replace(/: (true|false)/g, ': <span class=\"text-purple-600 dark:text-purple-400\">$1</span>');\n\n return (\n <pre\n className=\"text-sm font-mono whitespace-pre-wrap\"\n dangerouslySetInnerHTML={{ __html: highlighted }}\n />\n );\n}\n\n/**\n * Render output as table if it's an array of objects\n */\nfunction renderOutputAsTable(output: unknown): React.ReactNode | null {\n if (!Array.isArray(output) || output.length === 0) return null;\n\n const firstItem = output[0];\n if (typeof firstItem !== \"object\" || firstItem === null) return null;\n\n const keys = Object.keys(firstItem);\n if (keys.length === 0) return null;\n\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full text-sm\">\n <thead>\n <tr className=\"border-b border-neutral-200 dark:border-neutral-700\">\n {keys.map((key) => (\n <th\n key={key}\n className=\"px-4 py-2 text-left font-semibold text-neutral-900 dark:text-neutral-100\"\n >\n {key.replace(/_/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {output.map((row, i) => (\n <tr key={i} className=\"border-b border-neutral-100 dark:border-neutral-800\">\n {keys.map((key) => (\n <td key={key} className=\"px-4 py-2 text-neutral-700 dark:text-neutral-300\">\n {String((row as Record<string, unknown>)[key] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n/**\n * Tool call card component - renders tool invocations with parameters and results\n * Styled to match AI Elements (https://ai-sdk.dev/elements)\n */\nfunction ToolCallCard({ tool }: { tool: ToolUIPart | DynamicToolUIPart }) {\n const [isExpanded, setIsExpanded] = React.useState(true);\n\n const tableOutput = tool.output !== undefined ? renderOutputAsTable(tool.output) : null;\n\n return (\n <div className=\"not-prose w-full rounded-md border border-border bg-card\">\n {/* Header - CollapsibleTrigger style */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"group flex w-full items-center justify-between gap-4 p-3 hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <WrenchIcon className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm text-foreground\">{tool.toolName}</span>\n <ToolStatusBadge state={tool.state} />\n </div>\n <ChevronDownIcon\n className={cn(\n \"size-4 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Content - CollapsibleContent style */}\n {isExpanded && (\n <div className=\"border-t border-border\">\n {/* Parameters section - ToolInput style */}\n {tool.input !== undefined && (\n <div className=\"space-y-2 overflow-hidden p-4\">\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n Parameters\n </h4>\n <div className=\"rounded-md bg-muted/50 p-3\">\n {formatJsonWithHighlight(tool.input)}\n </div>\n </div>\n )}\n\n {/* Result section - ToolOutput style */}\n {tool.output !== undefined && (\n <div className=\"space-y-2 p-4 border-t border-border\">\n <h4 className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n Result\n </h4>\n <div className=\"overflow-x-auto rounded-md bg-muted/50 text-foreground\">\n {tableOutput || (\n <div className=\"p-3\">\n {formatJsonWithHighlight(tool.output)}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Error section */}\n {tool.errorText && (\n <div className=\"space-y-2 p-4 border-t border-border\">\n <h4 className=\"font-medium text-destructive text-xs uppercase tracking-wide\">\n Error\n </h4>\n <div className=\"rounded-md bg-destructive/10 text-destructive p-3 text-sm\">\n {tool.errorText}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Get text content from UIMessage parts\n */\nfunction getTextContent(message: UIMessage): string {\n return message.parts\n .filter((p): p is UIMessagePart & { type: \"text\" } => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Get tool parts from UIMessage\n * Matches tool-${toolName} pattern (AI SDK v5) and dynamic-tool\n * Excludes tool-result parts since those are handled by the main tool part\n */\nfunction _getToolParts(message: UIMessage): (ToolUIPart | DynamicToolUIPart)[] {\n return message.parts.filter(\n (p): p is ToolUIPart | DynamicToolUIPart =>\n (p.type.startsWith(\"tool-\") && p.type !== \"tool-result\") || p.type === \"dynamic-tool\",\n );\n}\n\n/**\n * Check if a part is a tool part\n */\nfunction isToolPart(part: UIMessagePart): part is ToolUIPart | DynamicToolUIPart {\n return (part.type.startsWith(\"tool-\") && part.type !== \"tool-result\") ||\n part.type === \"dynamic-tool\";\n}\n\n/**\n * Check if a part is a reasoning part\n */\nfunction isReasoningPart(\n part: UIMessagePart,\n): part is { type: \"reasoning\"; text: string; state?: string } {\n return part.type === \"reasoning\";\n}\n\n/**\n * Part group types for ordered rendering\n */\ntype PartGroup =\n | { type: \"text\"; content: string }\n | { type: \"tool\"; tool: ToolUIPart | DynamicToolUIPart }\n | { type: \"reasoning\"; text: string; isStreaming: boolean };\n\n/**\n * Group consecutive parts for ordered rendering\n * Returns an array of groups, each containing either consecutive text parts, a tool part, or a reasoning part\n */\nfunction groupPartsInOrder(parts: UIMessagePart[]): PartGroup[] {\n const groups: PartGroup[] = [];\n let currentTextGroup: string[] = [];\n\n for (const part of parts) {\n if (part.type === \"text\") {\n currentTextGroup.push(part.text);\n } else if (isToolPart(part)) {\n // Flush any accumulated text\n if (currentTextGroup.length > 0) {\n groups.push({ type: \"text\", content: currentTextGroup.join(\"\") });\n currentTextGroup = [];\n }\n groups.push({ type: \"tool\", tool: part });\n } else if (isReasoningPart(part)) {\n // Flush any accumulated text\n if (currentTextGroup.length > 0) {\n groups.push({ type: \"text\", content: currentTextGroup.join(\"\") });\n currentTextGroup = [];\n }\n groups.push({\n type: \"reasoning\",\n text: part.text,\n isStreaming: part.state === \"streaming\",\n });\n }\n // Skip tool-result and other non-renderable parts\n }\n\n // Flush remaining text\n if (currentTextGroup.length > 0) {\n groups.push({ type: \"text\", content: currentTextGroup.join(\"\") });\n }\n\n return groups;\n}\n\nexport interface ChatProps {\n /** Messages to display (AI SDK v5 format) */\n messages: UIMessage[];\n\n /** Current input value */\n input: string;\n\n /** Input change handler (alternative naming) */\n onChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Input change handler (from useChat) */\n handleInputChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler (alternative naming) */\n onSubmit?: (e: React.FormEvent) => void | Promise<void>;\n\n /** Submit handler (from useChat) */\n handleSubmit?: (e: React.FormEvent) => void | Promise<void>;\n\n /** Stop handler - called when stop button is clicked during loading */\n stop?: () => void;\n\n /** Reload handler - called to retry the last message (from useChat) */\n reload?: () => void;\n\n /** Enable built-in voice input (uses Web Speech API) */\n enableVoice?: boolean;\n\n /** Custom voice input handler - overrides built-in voice if provided */\n onVoice?: () => void;\n\n /** Setter for input value (required for voice input to work) */\n setInput?: (value: string) => void;\n\n /** Loading state */\n isLoading?: boolean;\n\n /** Error state */\n error?: Error | null;\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Max height */\n maxHeight?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Custom message renderer */\n renderMessage?: (message: UIMessage) => React.ReactNode;\n\n /** Custom tool renderer (v5 format) */\n renderTool?: (tool: ToolUIPart | DynamicToolUIPart) => React.ReactNode;\n\n /** Enable multiline input */\n multiline?: boolean;\n\n /** Suggestions to show when no messages exist */\n suggestions?: string[];\n\n /** Handler for suggestion clicks */\n onSuggestionClick?: (suggestion: string) => void;\n\n /** Empty state configuration */\n emptyState?: {\n icon?: React.ReactNode;\n title?: string;\n description?: string;\n };\n\n /** Show scroll-to-bottom button */\n showScrollButton?: boolean;\n\n /** Show message actions (copy button) on assistant messages */\n showMessageActions?: boolean;\n}\n\n/**\n * Chat - Complete chat interface\n *\n * Production-ready chat component with sensible defaults.\n *\n * @example\n * ```tsx\n * import { Chat } from 'veryfront/ai/components';\n * import { useChat } from 'veryfront/ai/react';\n *\n * export default function ChatPage() {\n * const chat = useChat({ api: '/api/chat' });\n * return <Chat {...chat} />;\n * }\n * ```\n */\nexport const Chat = React.forwardRef<HTMLDivElement, ChatProps>(\n (\n {\n messages,\n input,\n onChange,\n handleInputChange,\n onSubmit,\n handleSubmit,\n stop,\n reload,\n enableVoice = false,\n onVoice,\n setInput,\n isLoading,\n error,\n placeholder = \"Type a message...\",\n maxHeight = \"100%\",\n className,\n theme: userTheme,\n renderMessage,\n renderTool,\n multiline = false,\n suggestions,\n onSuggestionClick,\n emptyState,\n showScrollButton = false,\n showMessageActions = true,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n const messagesEndRef = React.useRef<HTMLDivElement>(null);\n\n // Support both naming conventions from useChat\n const inputChangeHandler = onChange || handleInputChange || (() => {});\n const submitHandler = onSubmit || handleSubmit;\n\n // Built-in voice input\n const voice = useVoiceInput({\n onTranscript: (transcript, isFinal) => {\n if (setInput && isFinal) {\n setInput(transcript);\n }\n },\n });\n\n // Determine voice handler - custom or built-in\n const voiceHandler = React.useMemo(() => {\n if (onVoice) return onVoice;\n if (enableVoice && voice.isSupported && setInput) {\n return voice.toggle;\n }\n return undefined;\n }, [onVoice, enableVoice, voice.isSupported, voice.toggle, setInput]);\n\n // Auto-scroll to bottom on new messages\n React.useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n return (\n <ChatContainer\n ref={ref}\n className={cn(theme.container, className)}\n style={{ maxHeight }}\n >\n {/* Message List - scrollable content area */}\n <MessageList className=\"flex-1 min-h-0 overflow-y-auto relative\">\n {/* Empty state - centered vertically like ChatGPT */}\n {messages.length === 0\n ? (\n <div className=\"flex flex-col items-center justify-center h-full px-4\">\n <div className=\"flex-1\" />\n <ConversationEmptyState\n icon={emptyState?.icon || <MessageSquareIcon className=\"size-10\" />}\n title={emptyState?.title || \"What can I help with?\"}\n description={emptyState?.description}\n />\n {/* Suggestions grid - ChatGPT style */}\n {suggestions && suggestions.length > 0 && (\n <div className=\"w-full max-w-2xl mt-6 mb-8\">\n <Suggestions layout=\"grid\">\n {suggestions.map((suggestion) => (\n <Suggestion\n key={suggestion}\n suggestion={suggestion}\n onClick={onSuggestionClick}\n />\n ))}\n </Suggestions>\n </div>\n )}\n <div className=\"flex-1\" />\n </div>\n )\n : (\n <div className=\"max-w-2xl mx-auto px-4 py-4 space-y-2\">\n {messages.map((msg) => {\n // For user messages, use simple text extraction\n if (msg.role === \"user\") {\n const content = getTextContent(msg);\n return renderMessage\n ? <React.Fragment key={msg.id}>{renderMessage(msg)}</React.Fragment>\n : (\n <MessageItem\n key={msg.id}\n role={msg.role}\n className={cn(\"flex\", \"justify-end\")}\n >\n <div className={theme.message?.[msg.role] || theme.message?.user}>\n <p className=\"whitespace-pre-wrap text-[15px] leading-relaxed\">\n {content}\n </p>\n </div>\n </MessageItem>\n );\n }\n\n // For assistant messages, render parts in order\n const partGroups = groupPartsInOrder(msg.parts);\n const textContent = getTextContent(msg);\n return renderMessage\n ? <React.Fragment key={msg.id}>{renderMessage(msg)}</React.Fragment>\n : (\n <MessageItem\n key={msg.id}\n role={msg.role}\n className={cn(\"flex\", \"justify-start\")}\n >\n <div className={theme.message?.[msg.role] || theme.message?.assistant}>\n {partGroups.map((group, index) => {\n if (group.type === \"text\") {\n return (\n <Markdown\n key={`text-${index}`}\n className=\"text-[15px] leading-relaxed\"\n >\n {group.content}\n </Markdown>\n );\n }\n if (group.type === \"reasoning\") {\n return (\n <ReasoningCard\n key={`reasoning-${index}`}\n text={group.text}\n isStreaming={group.isStreaming}\n />\n );\n }\n // Tool part\n return (\n <div key={group.tool.toolCallId} className=\"my-3\">\n {renderTool\n ? renderTool(group.tool)\n : <ToolCallCard tool={group.tool} />}\n </div>\n );\n })}\n {/* Message actions for assistant messages */}\n {showMessageActions && textContent && (\n <MessageActions content={textContent} />\n )}\n </div>\n </MessageItem>\n );\n })}\n\n {/* Loading indicator */}\n {isLoading && (\n <div className=\"flex justify-start\">\n <div className=\"bg-neutral-100 dark:bg-neutral-800 rounded-[20px] rounded-bl-[4px] px-4 py-3\">\n <div className=\"flex gap-1.5 items-center\">\n <span className={cn(theme.loading)} />\n <span className={cn(theme.loading)} style={{ animationDelay: \"0.15s\" }} />\n <span className={cn(theme.loading)} style={{ animationDelay: \"0.3s\" }} />\n </div>\n </div>\n </div>\n )}\n\n {/* Auto-scroll anchor */}\n <div ref={messagesEndRef} />\n </div>\n )}\n\n {/* Scroll to bottom button */}\n {showScrollButton && (\n <ConversationScrollButton\n onClick={() => messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" })}\n />\n )}\n </MessageList>\n\n {/* Error display with retry button */}\n {error && (\n <div className=\"mx-4 mb-2 px-4 py-3 bg-red-50 dark:bg-red-900/20 rounded-2xl text-red-600 dark:text-red-400 text-sm flex items-center justify-between gap-3\">\n <span>{error.message}</span>\n {reload && (\n <button\n type=\"button\"\n onClick={reload}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-900/40 hover:bg-red-200 dark:hover:bg-red-900/60 rounded-lg transition-colors\"\n >\n <RefreshCwIcon className=\"size-3.5\" />\n Retry\n </button>\n )}\n </div>\n )}\n\n {/* Input area - fixed at bottom */}\n <div className=\"flex-shrink-0 bg-white dark:bg-neutral-900 border-t border-neutral-200 dark:border-neutral-800\">\n <form\n onSubmit={submitHandler}\n className=\"max-w-2xl mx-auto px-4 py-3\"\n >\n <div className=\"flex gap-2 items-center\">\n <InputBox\n value={voice.isListening ? voice.transcript || input : input}\n onChange={inputChangeHandler}\n placeholder={voice.isListening ? \"Listening...\" : placeholder}\n disabled={isLoading || voice.isListening}\n multiline={multiline}\n className={theme.input}\n />\n <SubmitButton\n isLoading={isLoading || voice.isListening}\n hasInput={!!input.trim()}\n onStop={voice.isListening ? voice.stop : stop}\n onVoice={voiceHandler}\n disabled={!input.trim()}\n className={theme.button}\n />\n </div>\n </form>\n </div>\n </ChatContainer>\n );\n },\n);\n\nChat.displayName = \"Chat\";\n\n// Composition API (for advanced usage)\nconst ChatHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-b border-gray-200 dark:border-gray-800 p-4 bg-gray-50 dark:bg-gray-900\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatHeader.displayName = \"ChatHeader\";\n\nconst ChatMessages = MessageList;\nChatMessages.displayName = \"ChatMessages\";\n\nconst ChatInput = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n React.ComponentProps<typeof InputBox>\n>(({ className, ...props }, ref) => {\n return (\n <div className=\"border-t border-gray-200 dark:border-gray-800 p-4\">\n <div className=\"flex gap-2\">\n <InputBox\n ref={ref}\n className={cn(defaultChatTheme.input, className)}\n {...props}\n />\n </div>\n </div>\n );\n});\nChatInput.displayName = \"ChatInput\";\n\nconst ChatFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-t border-gray-200 dark:border-gray-800 p-4 text-sm text-gray-500\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatFooter.displayName = \"ChatFooter\";\n\n// Attach subcomponents for composition API\nexport const ChatComponents = Object.assign(Chat, {\n Header: ChatHeader,\n Messages: ChatMessages,\n Input: ChatInput,\n Footer: ChatFooter,\n});\n", "/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { UIMessage } from \"../hooks/index.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: UIMessage[\"role\"];\n\n /** Message content (can be children or prop) - deprecated, use children with parts */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading/streaming state - shows stop button */\n isLoading?: boolean;\n\n /** Whether input has text - determines voice vs submit icon */\n hasInput?: boolean;\n\n /** Handler for stop action */\n onStop?: () => void;\n\n /** Handler for voice input */\n onVoice?: () => void;\n\n /** Custom icons */\n icons?: {\n submit?: React.ReactNode;\n stop?: React.ReactNode;\n voice?: React.ReactNode;\n };\n\n children?: React.ReactNode;\n}\n\n/** Default submit icon (paper plane) */\nconst SubmitIcon = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n);\n\n/** Default stop icon (square) */\nconst StopIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n\n/** Default voice icon (microphone) */\nconst VoiceIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n);\n\n/**\n * SubmitButton - Smart submit button with three states\n *\n * States:\n * 1. **Voice** (no input): Shows microphone icon, triggers onVoice\n * 2. **Submit** (has input): Shows arrow icon, submits form\n * 3. **Stop** (loading): Shows stop icon, triggers onStop\n *\n * @example\n * ```tsx\n * <SubmitButton\n * hasInput={!!input.trim()}\n * isLoading={isLoading}\n * onStop={stop}\n * onVoice={() => console.log('Voice input')}\n * className=\"w-9 h-9 bg-blue-500 text-white rounded-full\"\n * />\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>((\n { className, isLoading, hasInput, onStop, onVoice, icons, disabled, children, ...props },\n ref,\n) => {\n // Determine button state and behavior\n const showStop = isLoading;\n const showVoice = !isLoading && !hasInput && onVoice;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (showStop && onStop) {\n e.preventDefault();\n onStop();\n } else if (showVoice && onVoice) {\n e.preventDefault();\n onVoice();\n }\n // For submit, let form handle it naturally\n };\n\n // Determine icon to show\n let icon: React.ReactNode;\n let ariaLabel: string;\n\n if (showStop) {\n icon = icons?.stop || <StopIcon />;\n ariaLabel = \"Stop generating\";\n } else if (showVoice) {\n icon = icons?.voice || <VoiceIcon />;\n ariaLabel = \"Voice input\";\n } else {\n icon = icons?.submit || <SubmitIcon />;\n ariaLabel = \"Send message\";\n }\n\n return (\n <button\n ref={ref}\n type={showStop || showVoice ? \"button\" : \"submit\"}\n className={className}\n disabled={disabled && !showStop}\n onClick={handleClick}\n data-submit-button=\"\"\n data-state={showStop ? \"stop\" : showVoice ? \"voice\" : \"submit\"}\n data-loading={isLoading}\n aria-label={ariaLabel}\n {...props}\n >\n {children || icon}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Supports both regular tools and dynamic tools (MCP, user-defined).\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { DynamicToolUIPart, ToolState, ToolUIPart } from \"../hooks/index.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool input */\n input?: unknown;\n\n /** Tool output */\n output?: unknown;\n\n /** Tool state (v5 format) */\n state?: ToolState;\n\n /** Error text if tool failed */\n errorText?: string;\n\n /** Whether this is a dynamic tool (MCP, user-defined) */\n dynamic?: boolean;\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={part.toolName}\n * input={part.input}\n * state={part.state}\n * dynamic={part.type === 'dynamic-tool'}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult output={part.output} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>((\n { className, name, input, output: _output, state, errorText, dynamic, children, ...props },\n ref,\n) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-state={state}\n data-dynamic={dynamic || undefined}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {state && <span data-tool-state=\"\">({state})</span>}\n {dynamic && <span data-tool-dynamic=\"\">[dynamic]</span>}\n </div>\n\n {input !== undefined && (\n <div data-tool-input=\"\">\n <pre>{JSON.stringify(input, null, 2)}</pre>\n </div>\n )}\n\n {errorText && (\n <div data-tool-error=\"\">\n {errorText}\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool output data */\n output: unknown;\n\n /** Custom renderer */\n renderOutput?: (output: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display (v5 compatible)\n *\n * @example\n * ```tsx\n * <ToolResult\n * output={part.output}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, output, renderOutput, ...props }, ref) => {\n const content = renderOutput ? renderOutput(output) : JSON.stringify(output, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\n/** Union type for both tool types from v5 parts */\ntype ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool parts to display (v5 format) */\n tools: ToolPart[];\n\n /** Render each tool */\n renderTool?: (tool: ToolPart) => React.ReactNode;\n}\n\n/**\n * Check if a part is a dynamic tool\n */\nfunction isDynamicTool(tool: ToolPart): tool is DynamicToolUIPart {\n return tool.type === \"dynamic-tool\";\n}\n\n/**\n * ToolList - Display list of tool calls (v5 compatible)\n *\n * @example\n * ```tsx\n * // Filter tool parts - matches tool-${toolName} pattern (AI SDK v5) and dynamic-tool\n * const toolParts = message.parts.filter(\n * p => p.type.startsWith('tool-') || p.type === 'dynamic-tool'\n * );\n *\n * <ToolList\n * tools={toolParts}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation\n * name={tool.toolName}\n * state={tool.state}\n * dynamic={tool.type === 'dynamic-tool'}\n * >\n * {tool.output && <ToolResult output={tool.output} />}\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, tools, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {tools.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.toolCallId}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.toolCallId}\n name={tool.toolName}\n input={tool.input}\n state={tool.state}\n errorText={tool.errorText}\n dynamic={isDynamicTool(tool)}\n >\n {tool.output !== undefined && <ToolResult output={tool.output} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n", "/**\n * useVoiceInput - Web Speech API hook for voice input\n *\n * Provides browser-based speech recognition for chat input.\n */\n\nimport * as React from \"react\";\n\nexport interface UseVoiceInputOptions {\n /** Language for speech recognition (default: browser default) */\n language?: string;\n\n /** Continuous listening mode (default: false) */\n continuous?: boolean;\n\n /** Show interim results while speaking (default: true) */\n interimResults?: boolean;\n\n /** Callback when transcript is received */\n onTranscript?: (transcript: string, isFinal: boolean) => void;\n\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n\n /** Callback when listening starts */\n onStart?: () => void;\n\n /** Callback when listening ends */\n onEnd?: () => void;\n}\n\nexport interface UseVoiceInputResult {\n /** Whether voice input is supported in this browser */\n isSupported: boolean;\n\n /** Whether currently listening */\n isListening: boolean;\n\n /** Current transcript (interim or final) */\n transcript: string;\n\n /** Start listening */\n start: () => void;\n\n /** Stop listening */\n stop: () => void;\n\n /** Toggle listening on/off */\n toggle: () => void;\n\n /** Clear the transcript */\n clear: () => void;\n\n /** Last error message */\n error: string | null;\n}\n\n// Type for SpeechRecognition (not in all TypeScript libs)\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n resultIndex: number;\n}\n\ninterface SpeechRecognitionResultList {\n length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n 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 onstart: (() => void) | null;\n onend: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition?: new () => SpeechRecognition;\n webkitSpeechRecognition?: new () => SpeechRecognition;\n }\n}\n\n/**\n * useVoiceInput - Voice input hook using Web Speech API\n *\n * @example\n * ```tsx\n * const { isListening, transcript, toggle, isSupported } = useVoiceInput({\n * onTranscript: (text, isFinal) => {\n * if (isFinal) setInput(text);\n * }\n * });\n *\n * if (!isSupported) return <span>Voice not supported</span>;\n *\n * return (\n * <button onClick={toggle}>\n * {isListening ? 'Stop' : 'Start'} Voice\n * </button>\n * );\n * ```\n */\nexport function useVoiceInput(\n options: UseVoiceInputOptions = {},\n): UseVoiceInputResult {\n const {\n language,\n continuous = false,\n interimResults = true,\n onTranscript,\n onError,\n onStart,\n onEnd,\n } = options;\n\n const [isListening, setIsListening] = React.useState(false);\n const [transcript, setTranscript] = React.useState(\"\");\n const [error, setError] = React.useState<string | null>(null);\n\n const recognitionRef = React.useRef<SpeechRecognition | null>(null);\n\n // Check browser support\n const isSupported = React.useMemo(() => {\n if (typeof globalThis === \"undefined\") return false;\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n return !!(g.SpeechRecognition || g.webkitSpeechRecognition);\n }, []);\n\n // Initialize recognition\n React.useEffect(() => {\n if (!isSupported) return;\n\n // deno-lint-ignore no-explicit-any\n const g = globalThis as any;\n const SpeechRecognitionAPI = g.SpeechRecognition || g.webkitSpeechRecognition;\n\n if (!SpeechRecognitionAPI) return;\n\n const recognition = new SpeechRecognitionAPI();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n\n if (language) {\n recognition.lang = language;\n }\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n let finalTranscript = \"\";\n let interimTranscript = \"\";\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result || !result[0]) continue;\n\n if (result.isFinal) {\n finalTranscript += result[0].transcript;\n } else {\n interimTranscript += result[0].transcript;\n }\n }\n\n const currentTranscript = finalTranscript || interimTranscript;\n setTranscript(currentTranscript);\n\n if (onTranscript) {\n onTranscript(currentTranscript, !!finalTranscript);\n }\n };\n\n recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n const errorMessage = getErrorMessage(event.error);\n setError(errorMessage);\n setIsListening(false);\n\n if (onError) {\n onError(errorMessage);\n }\n };\n\n recognition.onstart = () => {\n setIsListening(true);\n setError(null);\n\n if (onStart) {\n onStart();\n }\n };\n\n recognition.onend = () => {\n setIsListening(false);\n\n if (onEnd) {\n onEnd();\n }\n };\n\n recognitionRef.current = recognition;\n\n return () => {\n recognition.abort();\n };\n }, [isSupported, language, continuous, interimResults, onTranscript, onError, onStart, onEnd]);\n\n const start = React.useCallback(() => {\n if (!recognitionRef.current || isListening) return;\n\n setTranscript(\"\");\n setError(null);\n\n try {\n recognitionRef.current.start();\n } catch {\n // Already started\n console.warn(\"Speech recognition already started\");\n }\n }, [isListening]);\n\n const stop = React.useCallback(() => {\n if (!recognitionRef.current || !isListening) return;\n\n recognitionRef.current.stop();\n }, [isListening]);\n\n const toggle = React.useCallback(() => {\n if (isListening) {\n stop();\n } else {\n start();\n }\n }, [isListening, start, stop]);\n\n const clear = React.useCallback(() => {\n setTranscript(\"\");\n }, []);\n\n return {\n isSupported,\n isListening,\n transcript,\n start,\n stop,\n toggle,\n clear,\n error,\n };\n}\n\nfunction getErrorMessage(error: string): string {\n switch (error) {\n case \"no-speech\":\n return \"No speech detected. Please try again.\";\n case \"audio-capture\":\n return \"No microphone found. Please check your device.\";\n case \"not-allowed\":\n return \"Microphone permission denied. Please allow access.\";\n case \"network\":\n return \"Network error. Please check your connection.\";\n case \"aborted\":\n return \"Speech recognition was aborted.\";\n case \"language-not-supported\":\n return \"Language not supported.\";\n case \"service-not-allowed\":\n return \"Speech recognition service not allowed.\";\n default:\n return `Speech recognition error: ${error}`;\n }\n}\n", "/**\n * Markdown Component - Rich markdown renderer for chat messages\n *\n * Supports:\n * - GitHub Flavored Markdown (tables, strikethrough, etc.)\n * - Syntax highlighted code blocks\n * - Mermaid diagrams (lazy loaded, client-side only)\n *\n * Works in: Deno, Node.js, Bun (client-side React)\n */\n\nimport * as React from \"react\";\nimport { cn } from \"./theme.ts\";\n\nexport interface MarkdownProps {\n /** Markdown content to render */\n children: string;\n /** Additional class name */\n className?: string;\n /** Enable mermaid diagram rendering (default: true, client-side only) */\n enableMermaid?: boolean;\n /** Custom code block renderer */\n renderCodeBlock?: (props: CodeBlockProps) => React.ReactNode;\n}\n\nexport interface CodeBlockProps {\n language: string | undefined;\n code: string;\n inline?: boolean;\n}\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n// esm.sh CDN URLs for browser-side dynamic imports\n// These URLs are stored in variables to prevent bundler transforms\nconst ESM_REACT_MARKDOWN = \"https://esm.sh/react-markdown@9?external=react\";\nconst ESM_REMARK_GFM = \"https://esm.sh/remark-gfm@4\";\nconst ESM_REHYPE_HIGHLIGHT = \"https://esm.sh/rehype-highlight@7\";\nconst ESM_MERMAID = \"https://esm.sh/mermaid@11\";\n\n// Lazy load heavy dependencies\n// deno-lint-ignore no-explicit-any\nlet ReactMarkdown: any = null;\n// deno-lint-ignore no-explicit-any\nlet remarkGfm: any = null;\n// deno-lint-ignore no-explicit-any\nlet rehypeHighlight: any = null;\n\n// Mermaid state (browser only)\n// deno-lint-ignore no-explicit-any\nlet mermaidPromise: Promise<any> | null = null;\n// deno-lint-ignore no-explicit-any\nlet mermaidModule: any = null;\n\nasync function loadMermaid() {\n if (!isBrowser) return null;\n if (mermaidModule) return mermaidModule;\n if (!mermaidPromise) {\n // Use Function constructor to prevent bundler from transforming the import\n const dynamicImport = new Function(\"url\", \"return import(url)\");\n mermaidPromise = dynamicImport(ESM_MERMAID);\n }\n mermaidModule = await mermaidPromise;\n mermaidModule.default.initialize({\n startOnLoad: false,\n theme: \"neutral\",\n securityLevel: \"loose\",\n });\n return mermaidModule;\n}\n\n/**\n * Mermaid diagram component with lazy loading (client-side only)\n */\nfunction MermaidDiagram({ code }: { code: string }) {\n const [svg, setSvg] = React.useState<string>(\"\");\n const [error, setError] = React.useState<string>(\"\");\n\n React.useEffect(() => {\n // Only render in browser\n if (!isBrowser) return;\n\n let cancelled = false;\n\n async function render() {\n try {\n const mermaid = await loadMermaid();\n if (!mermaid) return;\n\n const id = `mermaid-${Math.random().toString(36).slice(2, 9)}`;\n const { svg: renderedSvg } = await mermaid.default.render(id, code);\n if (!cancelled) {\n setSvg(renderedSvg);\n setError(\"\");\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to render diagram\");\n }\n }\n }\n\n render();\n return () => {\n cancelled = true;\n };\n }, [code]);\n\n // Server-side: show code block fallback\n if (!isBrowser) {\n return (\n <pre className=\"my-4 p-4 bg-neutral-100 dark:bg-neutral-800 rounded-lg overflow-auto\">\n <code>{code}</code>\n </pre>\n );\n }\n\n if (error) {\n return (\n <div className=\"my-4 p-4 bg-red-50 dark:bg-red-900/20 rounded-lg text-red-600 dark:text-red-400 text-sm\">\n <p className=\"font-medium\">Mermaid Error</p>\n <p>{error}</p>\n <pre className=\"mt-2 text-xs overflow-auto\">{code}</pre>\n </div>\n );\n }\n\n if (!svg) {\n return (\n <div className=\"my-4 p-4 bg-neutral-100 dark:bg-neutral-800 rounded-lg animate-pulse\">\n <div className=\"h-32 flex items-center justify-center text-neutral-400\">\n Loading diagram...\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"my-4 flex justify-center overflow-auto\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n\n/**\n * Code block component with syntax highlighting and mermaid support\n */\nfunction CodeBlock({\n language,\n code,\n inline,\n enableMermaid,\n renderCodeBlock,\n}: CodeBlockProps & {\n enableMermaid: boolean;\n renderCodeBlock?: MarkdownProps[\"renderCodeBlock\"];\n}) {\n // Custom renderer takes priority\n if (renderCodeBlock) {\n return <>{renderCodeBlock({ language, code, inline })}</>;\n }\n\n // Inline code\n if (inline) {\n return (\n <code className=\"bg-neutral-100 dark:bg-neutral-800 px-1.5 py-0.5 rounded text-sm font-mono\">\n {code}\n </code>\n );\n }\n\n // Mermaid diagrams\n if (enableMermaid && language === \"mermaid\") {\n return <MermaidDiagram code={code} />;\n }\n\n // Regular code block (syntax highlighting handled by rehype-highlight)\n return (\n <pre className=\"my-4 p-4 bg-neutral-900 dark:bg-neutral-950 rounded-lg overflow-auto\">\n <code className={language ? `language-${language} hljs` : \"hljs\"}>\n {code}\n </code>\n </pre>\n );\n}\n\n/**\n * Rich Markdown renderer with GFM, syntax highlighting, and mermaid support\n */\nexport function Markdown({\n children,\n className,\n enableMermaid = true,\n renderCodeBlock,\n}: MarkdownProps): React.ReactElement {\n const [isLoaded, setIsLoaded] = React.useState(false);\n const [, forceUpdate] = React.useReducer((x) => x + 1, 0);\n\n // Lazy load react-markdown and plugins\n React.useEffect(() => {\n async function load() {\n if (!ReactMarkdown) {\n // Always use esm.sh URLs - the bundle runs in browser\n // Using Function constructor to prevent bundler from transforming the imports\n const dynamicImport = new Function(\"url\", \"return import(url)\");\n const [rmModule, gfmModule, highlightModule] = await Promise.all([\n dynamicImport(ESM_REACT_MARKDOWN),\n dynamicImport(ESM_REMARK_GFM),\n dynamicImport(ESM_REHYPE_HIGHLIGHT),\n ]);\n ReactMarkdown = rmModule.default;\n remarkGfm = gfmModule.default;\n rehypeHighlight = highlightModule.default;\n }\n setIsLoaded(true);\n forceUpdate();\n }\n load();\n }, []);\n\n // Fallback while loading\n if (!isLoaded || !ReactMarkdown) {\n return (\n <div className={cn(\"prose prose-sm dark:prose-invert max-w-none\", className)}>\n <p className=\"whitespace-pre-wrap\">{children}</p>\n </div>\n );\n }\n\n return (\n <div className={cn(\"prose prose-sm dark:prose-invert max-w-none\", className)}>\n <ReactMarkdown\n remarkPlugins={remarkGfm ? [remarkGfm] : []}\n rehypePlugins={rehypeHighlight ? [rehypeHighlight] : []}\n components={{\n // Custom code rendering\n // deno-lint-ignore no-explicit-any\n code(props: any) {\n const { className: codeClassName, children: codeChildren, node } = props;\n const match = /language-(\\w+)/.exec(codeClassName || \"\");\n const language = match ? match[1] : undefined;\n const code = String(codeChildren).replace(/\\n$/, \"\");\n const isInline = !node?.position?.start?.line;\n\n return (\n <CodeBlock\n language={language}\n code={code}\n inline={isInline}\n enableMermaid={enableMermaid}\n renderCodeBlock={renderCodeBlock}\n />\n );\n },\n // Style tables\n // deno-lint-ignore no-explicit-any\n table(props: any) {\n return (\n <div className=\"my-4 overflow-auto\">\n <table className=\"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700\">\n {props.children}\n </table>\n </div>\n );\n },\n // Style links\n // deno-lint-ignore no-explicit-any\n a(props: any) {\n return (\n <a\n href={props.href}\n className=\"text-blue-600 dark:text-blue-400 hover:underline\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {props.children}\n </a>\n );\n },\n // Style blockquotes\n // deno-lint-ignore no-explicit-any\n blockquote(props: any) {\n return (\n <blockquote className=\"border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 my-4 text-neutral-600 dark:text-neutral-400 italic\">\n {props.children}\n </blockquote>\n );\n },\n }}\n >\n {children}\n </ReactMarkdown>\n </div>\n );\n}\n\nexport default Markdown;\n", "/**\n * AgentCard Component - Layer 3 (Styled)\n *\n * Production-ready agent status and tool visualization.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n AgentContainer,\n AgentStatus as AgentStatusPrimitive,\n ThinkingIndicator,\n ToolInvocation,\n ToolList,\n ToolResult,\n} from \"../primitives/index.ts\";\nimport type { AgentStatus, Message, ToolCall } from \"../../types/agent.ts\";\nimport { type AgentTheme, cn, defaultAgentTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface AgentCardProps {\n /** Agent messages */\n messages?: Message[];\n\n /** Tool calls */\n toolCalls?: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text */\n thinking?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<AgentTheme>;\n\n /** Custom tool renderer */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * AgentCard - Agent status and tool visualization\n *\n * @example\n * ```tsx\n * import { AgentCard } from 'veryfront/ai/components';\n * import { useAgent } from 'veryfront/ai/react';\n *\n * export default function AgentInterface() {\n * const agent = useAgent({ agent: 'support' });\n * return <AgentCard {...agent} />;\n * }\n * ```\n */\nexport const AgentCard = React.forwardRef<HTMLDivElement, AgentCardProps>(\n (\n {\n messages,\n toolCalls = [],\n status,\n thinking,\n className,\n theme: userTheme,\n renderTool,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultAgentTheme, userTheme);\n\n return (\n <AgentContainer ref={ref} className={cn(theme.container, className)}>\n {/* Status */}\n <AgentStatusPrimitive\n status={status}\n className={cn(theme.status, getStatusColor(status))}\n />\n\n {/* Thinking indicator */}\n {thinking && (\n <ThinkingIndicator className={theme.thinking}>\n <span className=\"font-semibold\">Thinking:</span>\n {thinking}\n </ThinkingIndicator>\n )}\n\n {/* Tool calls */}\n {toolCalls.length > 0 && (\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-neutral-700 dark:text-neutral-300\">\n Tool Calls\n </h3>\n <ToolList\n toolCalls={toolCalls}\n className=\"space-y-3\"\n renderTool={renderTool ||\n ((tool) => (\n <ToolInvocation\n name={tool.name}\n args={tool.args}\n status={tool.status}\n className={theme.tool}\n >\n {tool.result !== undefined && (\n <ToolResult result={tool.result} className={theme.toolResult} />\n )}\n {tool.error && (\n <div className=\"mt-2 p-3 bg-red-50 dark:bg-red-900/20 text-red-900 dark:text-red-100 rounded-xl text-sm border border-red-200 dark:border-red-800\">\n Error: {tool.error}\n </div>\n )}\n </ToolInvocation>\n ))}\n />\n </div>\n )}\n\n {/* Messages (if provided) */}\n {messages && messages.length > 0 && (\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-neutral-700 dark:text-neutral-300\">\n Messages\n </h3>\n <div className=\"space-y-2 max-h-96 overflow-y-auto\">\n {messages.map((msg) => (\n <div\n key={msg.id}\n className=\"text-sm p-3 rounded-xl bg-neutral-50 dark:bg-neutral-800\"\n >\n <span className=\"font-semibold capitalize text-neutral-900 dark:text-neutral-100\">\n {msg.role}:\n </span>\n <span className=\"text-neutral-600 dark:text-neutral-400 ml-1\">\n {msg.content.substring(0, 200)}...\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </AgentContainer>\n );\n },\n);\n\nAgentCard.displayName = \"AgentCard\";\n\n/**\n * Get status color classes - Apple-inspired status colors\n */\nfunction getStatusColor(status: AgentStatus): string {\n switch (status) {\n case \"idle\":\n return \"bg-neutral-100 text-neutral-700 dark:bg-neutral-800 dark:text-neutral-300\";\n case \"thinking\":\n return \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300\";\n case \"tool_execution\":\n return \"bg-violet-100 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300\";\n case \"streaming\":\n return \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300\";\n case \"completed\":\n return \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300\";\n case \"error\":\n return \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300\";\n default:\n return \"bg-neutral-100 text-neutral-700 dark:bg-neutral-800 dark:text-neutral-300\";\n }\n}\n", "/**\n * Message Component - Layer 3 (Styled)\n *\n * Production-ready message display with AI SDK v5 parts support.\n */\n\nimport * as React from \"react\";\nimport { MessageContent, MessageItem, MessageRole } from \"../primitives/index.ts\";\nimport type { ToolUIPart, UIMessage, UIMessagePart } from \"../hooks/index.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface MessageProps {\n /** Message to display (v5 UIMessage format) */\n message: UIMessage;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Show role label */\n showRole?: boolean;\n\n /** Show timestamp */\n showTimestamp?: boolean;\n\n /** Custom renderer for tool calls (matches tool-${toolName} pattern) */\n renderToolCall?: (part: ToolUIPart) => React.ReactNode;\n\n /** Custom renderer for dynamic tools */\n renderDynamicTool?: (\n part: Extract<UIMessagePart, { type: \"dynamic-tool\" }>,\n ) => React.ReactNode;\n\n /** Custom renderer for reasoning */\n renderReasoning?: (part: Extract<UIMessagePart, { type: \"reasoning\" }>) => React.ReactNode;\n}\n\n/**\n * Helper to extract text content from v5 parts array\n */\nfunction getTextFromParts(parts: UIMessagePart[]): string {\n return parts\n .filter((p): p is Extract<UIMessagePart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n}\n\n/**\n * Message - Styled message component with v5 parts support\n *\n * @example\n * ```tsx\n * import { Message } from 'veryfront/ai/components';\n *\n * <Message\n * message={msg}\n * showRole={true}\n * renderToolCall={(part) => <MyToolUI part={part} />}\n * />\n * ```\n */\nexport const Message = React.forwardRef<HTMLDivElement, MessageProps>(\n (\n {\n message,\n className,\n theme: userTheme,\n showRole = false,\n showTimestamp = false,\n renderToolCall,\n renderDynamicTool,\n renderReasoning,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n\n return (\n <MessageItem\n ref={ref}\n role={message.role}\n className={cn(\n \"flex\",\n message.role === \"user\" ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div className={theme.message?.[message.role] || theme.message?.assistant}>\n {showRole && (\n <MessageRole className=\"block text-xs font-semibold mb-1 opacity-75 uppercase\">\n {message.role}\n </MessageRole>\n )}\n\n {/* Render parts array (v5 format) */}\n {message.parts.map((part, index) => {\n const key = `${message.id}-part-${index}`;\n\n switch (part.type) {\n case \"text\":\n return (\n <MessageContent key={key}>\n {part.text}\n </MessageContent>\n );\n\n case \"reasoning\":\n if (renderReasoning) {\n return <React.Fragment key={key}>{renderReasoning(part)}</React.Fragment>;\n }\n return (\n <div key={key} className=\"text-sm italic opacity-70 my-2 pl-2 border-l-2\">\n {part.text}\n </div>\n );\n\n case \"dynamic-tool\":\n if (renderDynamicTool) {\n return <React.Fragment key={key}>{renderDynamicTool(part)}</React.Fragment>;\n }\n return (\n <div key={key} className=\"text-xs bg-blue-50 rounded p-2 my-2\">\n <span className=\"font-mono\">{part.toolName}</span>\n <span className=\"ml-2 text-blue-500\">[dynamic: {part.state}]</span>\n {part.errorText && <div className=\"text-red-600 mt-1\">{part.errorText}</div>}\n </div>\n );\n\n default:\n // Handle tool-${toolName} pattern (AI SDK v5) - type starts with \"tool-\"\n if (part.type.startsWith(\"tool-\") && \"toolCallId\" in part) {\n const toolPart = part as ToolUIPart;\n if (renderToolCall) {\n return <React.Fragment key={key}>{renderToolCall(toolPart)}</React.Fragment>;\n }\n return (\n <div key={key} className=\"text-xs bg-gray-100 rounded p-2 my-2\">\n <span className=\"font-mono\">{toolPart.toolName}</span>\n <span className=\"ml-2 text-gray-500\">[{toolPart.state}]</span>\n {toolPart.errorText && (\n <div className=\"text-red-600 mt-1\">{toolPart.errorText}</div>\n )}\n </div>\n );\n }\n return null;\n }\n })}\n\n {showTimestamp && message.createdAt && (\n <div className=\"text-xs opacity-60 mt-1\">\n {new Date(message.createdAt).toLocaleTimeString()}\n </div>\n )}\n </div>\n </MessageItem>\n );\n },\n);\n\nMessage.displayName = \"Message\";\n\nexport interface StreamingMessageProps {\n /** Streaming parts (v5 format) */\n parts: UIMessagePart[];\n\n /** Show typing cursor */\n showCursor?: boolean;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n}\n\n/**\n * StreamingMessage - Display streaming message with v5 parts\n *\n * @example\n * ```tsx\n * import { StreamingMessage } from 'veryfront/ai/components';\n *\n * {isStreaming && (\n * <StreamingMessage parts={streamingParts} showCursor={true} />\n * )}\n * ```\n */\nexport const StreamingMessage = React.forwardRef<\n HTMLDivElement,\n StreamingMessageProps\n>(({ parts, showCursor = true, className, theme: userTheme }, ref) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n const textContent = getTextFromParts(parts);\n\n return (\n <MessageItem\n ref={ref}\n role=\"assistant\"\n className={cn(\"flex justify-start\", className)}\n >\n <div className={theme.message?.assistant}>\n <MessageContent>\n {textContent}\n {showCursor && <span className=\"inline-block w-1 h-4 bg-current ml-1 animate-pulse\" />}\n </MessageContent>\n </div>\n </MessageItem>\n );\n});\n\nStreamingMessage.displayName = \"StreamingMessage\";\n", "/**\n * Error Boundary for AI Components\n *\n * React error boundary specifically designed for AI component errors.\n */\n\nimport * as React from \"react\";\n\nexport interface AIErrorBoundaryProps {\n /** Children to wrap */\n children: React.ReactNode;\n\n /** Fallback UI when error occurs */\n fallback?: React.ReactNode | ((error: Error, reset: () => void) => React.ReactNode);\n\n /** Callback when error occurs */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\ninterface AIErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * AIErrorBoundary - Error boundary for AI components\n *\n * @example\n * ```tsx\n * import { AIErrorBoundary } from 'veryfront/ai/components';\n *\n * <AIErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={reset}>Try Again</button>\n * </div>\n * )}\n * >\n * <Chat {...chat} />\n * </AIErrorBoundary>\n * ```\n */\nexport class AIErrorBoundary extends React.Component<\n AIErrorBoundaryProps,\n AIErrorBoundaryState\n> {\n constructor(props: AIErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): AIErrorBoundaryState {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Log error\n console.error(\"[AIErrorBoundary] Caught error:\", error, errorInfo);\n\n // Call error callback\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError && this.state.error) {\n // Custom fallback\n if (this.props.fallback) {\n if (typeof this.props.fallback === \"function\") {\n return this.props.fallback(this.state.error, this.reset);\n }\n return this.props.fallback;\n }\n\n // Default fallback UI - Apple-inspired design\n return (\n <div\n className=\"border border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-900/20 rounded-2xl p-6\"\n role=\"alert\"\n >\n <div className=\"flex items-start gap-4\">\n <div className=\"w-10 h-10 rounded-full bg-red-100 dark:bg-red-900/40 flex items-center justify-center flex-shrink-0\">\n <svg\n className=\"w-5 h-5 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-base font-semibold text-red-900 dark:text-red-100\">\n {this.props.errorMessage || \"An error occurred in the AI component\"}\n </h3>\n\n <p className=\"mt-1.5 text-sm text-red-700 dark:text-red-300 leading-relaxed\">\n {this.state.error.message}\n </p>\n\n <button\n type=\"button\"\n onClick={this.reset}\n className=\"mt-4 px-5 py-2.5 text-sm font-medium text-white bg-red-500 hover:bg-red-600 active:scale-[0.98] rounded-full transition-all\"\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Hook version of error boundary\n */\nexport function useAIErrorHandler() {\n const [error, setError] = React.useState<Error | null>(null);\n\n const handleError = React.useCallback((error: Error) => {\n console.error(\"[useAIErrorHandler] Error:\", error);\n setError(error);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n error,\n handleError,\n clearError,\n hasError: error !== null,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "React", "jsx", "React", "jsx", "React", "jsx", "React", "jsx", "jsxs", "React", "React", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "jsxs", "jsx", "Fragment", "jsx", "jsxs", "jsxs", "jsx", "React", "jsx", "jsxs", "React", "jsx", "jsxs", "React", "jsx", "jsxs", "error"]
7
7
  }