@iota-uz/sdk 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bichat/index.cjs +2993 -642
- package/dist/bichat/index.cjs.map +1 -1
- package/dist/bichat/index.css +386 -43
- package/dist/bichat/index.css.map +1 -1
- package/dist/bichat/index.d.cts +1280 -88
- package/dist/bichat/index.d.ts +1280 -88
- package/dist/bichat/index.mjs +2871 -551
- package/dist/bichat/index.mjs.map +1 -1
- package/dist/bichat/styles.css +516 -46
- package/package.json +3 -2
- package/tailwind/compiled.css +1 -1
- package/tailwind/iota.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../ui/src/bichat/components/MarkdownRenderer.tsx","../../ui/src/bichat/types/index.ts","../../ui/src/bichat/utils/RateLimiter.ts","../../ui/src/bichat/context/ChatContext.tsx","../../ui/src/bichat/context/IotaContext.tsx","../../ui/src/bichat/locales/defaults.ts","../../ui/src/bichat/hooks/useTranslation.ts","../../ui/src/bichat/hooks/useBranding.ts","../../ui/src/bichat/components/ChatHeader.tsx","../../ui/src/bichat/utils/fileUtils.ts","../../ui/src/bichat/components/AttachmentGrid.tsx","../../ui/src/bichat/components/ImageModal.tsx","../../ui/src/bichat/components/UserTurnView.tsx","../../ui/src/bichat/components/CodeOutputsPanel.tsx","../../ui/src/bichat/components/StreamingCursor.tsx","../../ui/src/bichat/components/ChartCard.tsx","../../ui/src/bichat/components/SourcesPanel.tsx","../../ui/src/bichat/components/DownloadCard.tsx","../../ui/src/bichat/components/InlineQuestionForm.tsx","../../ui/src/bichat/components/AssistantTurnView.tsx","../../ui/src/bichat/components/TurnBubble.tsx","../../ui/src/bichat/components/ScrollToBottomButton.tsx","../../ui/src/bichat/components/MessageList.tsx","../../ui/src/bichat/components/MessageInput.tsx","../../ui/src/bichat/components/WelcomeContent.tsx","../../ui/src/bichat/components/ChatSession.tsx","../../ui/src/bichat/index.ts","../../ui/src/bichat/animations/variants.ts","../../ui/src/bichat/components/EmptyState.tsx","../../ui/src/bichat/components/EditableText.tsx","../../ui/src/bichat/components/SearchInput.tsx","../../ui/src/bichat/components/Skeleton.tsx","../../ui/src/bichat/config/ConfigContext.tsx","../../ui/src/bichat/hooks/useStreaming.ts","../../ui/src/bichat/theme/themes.ts","../../ui/src/bichat/theme/ThemeProvider.tsx","../../ui/src/bichat/api/csrf.ts","../../ui/src/bichat/data/HttpDataSource.ts"],"names":["jsx","SyntaxHighlighter","MessageRole","createContext","useContext","jsxs","useState","useEffect","X","Fragment","MarkdownRenderer","formatDistanceToNow","Copy","useRef","prompt","motion","sizeClasses","forwardRef","useImperativeHandle","memo","hasPermission","useCallback","useMemo"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * MarkdownRenderer component\n * Renders markdown with syntax highlighting and citations\n */\n\nimport ReactMarkdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport rehypeSanitize from 'rehype-sanitize'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { tomorrow } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport { Citation } from '../types'\n\ninterface MarkdownRendererProps {\n content: string\n citations?: Citation[] | null\n}\n\nexport function MarkdownRenderer({ content }: MarkdownRendererProps) {\n return (\n <div className=\"prose prose-sm max-w-none\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeSanitize]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '')\n const isInline = !match\n return !isInline && match ? (\n <SyntaxHighlighter\n style={tomorrow as any}\n language={match[1]}\n PreTag=\"div\"\n >\n {String(children).replace(/\\n$/, '')}\n </SyntaxHighlighter>\n ) : (\n <code className={className} {...props}>\n {children}\n </code>\n )\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n )\n}\n","/**\n * Type definitions for BI-Chat UI components\n */\n\nexport interface Session {\n id: string\n title: string\n status: 'active' | 'archived'\n pinned: boolean\n createdAt: string\n updatedAt: string\n}\n\nexport enum MessageRole {\n User = 'user',\n Assistant = 'assistant',\n System = 'system',\n Tool = 'tool',\n}\n\nexport interface Message {\n id: string\n sessionId: string\n role: MessageRole\n content: string\n createdAt: string\n toolCalls?: ToolCall[]\n citations?: Citation[]\n chartData?: ChartData\n artifacts?: Artifact[]\n explanation?: string\n}\n\nexport interface ToolCall {\n id: string\n name: string\n arguments: string\n}\n\nexport interface Citation {\n id: string\n source: string\n url?: string\n excerpt?: string\n}\n\nexport interface Attachment {\n id: string\n filename: string\n mimeType: string\n sizeBytes: number\n base64Data?: string\n}\n\n// Image attachment with preview for MessageInput\nexport interface ImageAttachment {\n filename: string\n mimeType: string\n sizeBytes: number\n base64Data: string\n preview: string // data URL for img src\n}\n\n// Code interpreter output\nexport interface CodeOutput {\n type: 'image' | 'text' | 'error'\n content: string | ImageAttachment\n}\n\n// Queued message for offline/loading state\nexport interface QueuedMessage {\n content: string\n attachments: ImageAttachment[]\n}\n\nexport interface ChartData {\n type: 'bar' | 'line' | 'pie' | 'area'\n title?: string\n data: any[]\n xAxisKey?: string\n yAxisKey?: string\n}\n\nexport interface Artifact {\n type: 'excel' | 'pdf'\n filename: string\n url: string\n sizeReadable?: string\n rowCount?: number\n description?: string\n}\n\nexport interface PendingQuestion {\n id: string\n turnId: string\n question: string\n type: 'MULTIPLE_CHOICE' | 'FREE_TEXT'\n options?: string[]\n status: 'PENDING' | 'ANSWERED' | 'CANCELLED'\n}\n\nexport type QuestionAnswers = Record<string, string>\n\nexport interface StreamChunk {\n type: 'chunk' | 'error' | 'done' | 'user_message'\n content?: string\n error?: string\n sessionId?: string\n}\n\nexport interface ChatDataSource {\n createSession(): Promise<Session>\n fetchSession(id: string): Promise<{\n session: Session\n messages: Message[]\n pendingQuestion?: PendingQuestion | null\n } | null>\n sendMessage(\n sessionId: string,\n content: string,\n attachments?: Attachment[],\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk>\n submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<{ success: boolean; error?: string }>\n cancelPendingQuestion(questionId: string): Promise<{ success: boolean; error?: string }>\n navigateToSession?(sessionId: string): void\n}\n\nexport interface ChatSessionContextValue {\n // State\n message: string\n messages: Message[]\n loading: boolean\n error: string | null\n currentSessionId?: string\n pendingQuestion: PendingQuestion | null\n session: Session | null\n fetching: boolean\n streamingContent: string\n isStreaming: boolean\n messageQueue: QueuedMessage[]\n codeOutputs: CodeOutput[]\n\n // Setters\n setMessage: (message: string) => void\n setError: (error: string | null) => void\n setCodeOutputs: (outputs: CodeOutput[]) => void\n\n // Handlers\n handleSubmit: (e: React.FormEvent, attachments?: ImageAttachment[]) => void\n handleRegenerate?: (messageId: string) => Promise<void>\n handleEdit?: (messageId: string, newContent: string) => Promise<void>\n handleCopy: (text: string) => Promise<void>\n handleSubmitQuestionAnswers: (answers: QuestionAnswers) => void\n handleCancelPendingQuestion: () => Promise<void>\n handleUnqueue: () => { content: string; attachments: ImageAttachment[] } | null\n sendMessage: (content: string, attachments?: Attachment[]) => Promise<void>\n cancel: () => void\n}\n\n// Translations\nexport type Translations = Record<string, string>\n\n// Branding\nexport interface ExamplePrompt {\n category: string\n text: string\n icon: string\n}\n\nexport interface BrandingConfig {\n appName: string\n logoUrl?: string\n theme?: {\n primary?: string\n secondary?: string\n accent?: string\n }\n welcome?: {\n title?: string\n description?: string\n examplePrompts?: ExamplePrompt[]\n }\n colors?: {\n primary?: string\n secondary?: string\n accent?: string\n }\n logo?: {\n src?: string\n alt?: string\n }\n}\n","/**\n * Per-session rate limiter\n * Prevents excessive requests within a time window\n */\n\nexport interface RateLimiterConfig {\n maxRequests: number\n windowMs: number\n}\n\nexport class RateLimiter {\n private timestamps: number[] = []\n private maxRequests: number\n private windowMs: number\n\n constructor(config: RateLimiterConfig) {\n this.maxRequests = config.maxRequests\n this.windowMs = config.windowMs\n }\n\n /**\n * Check if a request can be made\n * Updates internal state if request is allowed\n */\n canMakeRequest(): boolean {\n const now = Date.now()\n\n // Remove timestamps outside the current window\n this.timestamps = this.timestamps.filter(t => now - t < this.windowMs)\n\n // Check if limit exceeded\n if (this.timestamps.length >= this.maxRequests) {\n return false\n }\n\n // Add current timestamp\n this.timestamps.push(now)\n return true\n }\n\n /**\n * Get milliseconds until next request is allowed\n * Returns 0 if request can be made immediately\n */\n getTimeUntilNextRequest(): number {\n if (this.timestamps.length < this.maxRequests) {\n return 0\n }\n\n const now = Date.now()\n const oldestTimestamp = this.timestamps[0]\n const timeElapsed = now - oldestTimestamp\n const timeRemaining = this.windowMs - timeElapsed\n\n return Math.max(0, timeRemaining)\n }\n\n /**\n * Reset the rate limiter state\n */\n reset(): void {\n this.timestamps = []\n }\n}\n","/**\n * Chat session context provider and hook\n * Manages state for chat sessions including messages, loading, streaming, and HITL\n */\n\nimport { createContext, useContext, useState, useCallback, useEffect, ReactNode, useRef } from 'react'\nimport type {\n ChatDataSource,\n Session,\n Message,\n PendingQuestion,\n QuestionAnswers,\n Attachment,\n ImageAttachment,\n QueuedMessage,\n CodeOutput,\n ChatSessionContextValue,\n} from '../types'\nimport { MessageRole } from '../types'\nimport { RateLimiter } from '../utils/RateLimiter'\n\nconst ChatSessionContext = createContext<ChatSessionContextValue | null>(null)\n\ninterface ChatSessionProviderProps {\n dataSource: ChatDataSource\n sessionId?: string\n rateLimiter?: RateLimiter\n children: ReactNode\n}\n\n// Default rate limiter configuration\nconst DEFAULT_RATE_LIMIT_CONFIG = {\n maxRequests: 20,\n windowMs: 60000, // 1 minute\n}\n\nexport function ChatSessionProvider({\n dataSource,\n sessionId,\n rateLimiter: externalRateLimiter,\n children\n}: ChatSessionProviderProps) {\n // Form state\n const [message, setMessage] = useState('')\n\n // Message state\n const [messages, setMessages] = useState<Message[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Session state\n const [currentSessionId, setCurrentSessionId] = useState<string | undefined>(sessionId)\n const [session, setSession] = useState<Session | null>(null)\n const [fetching, setFetching] = useState(false)\n\n // Question state\n const [pendingQuestion, setPendingQuestion] = useState<PendingQuestion | null>(null)\n\n // Streaming state\n const [streamingContent, setStreamingContent] = useState('')\n const [isStreaming, setIsStreaming] = useState(false)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n // Queue and code outputs state\n const [messageQueue, setMessageQueue] = useState<QueuedMessage[]>([])\n const [codeOutputs, setCodeOutputs] = useState<CodeOutput[]>([])\n\n // Rate limiter (use provided or create default)\n const rateLimiterRef = useRef<RateLimiter>(\n externalRateLimiter || new RateLimiter(DEFAULT_RATE_LIMIT_CONFIG)\n )\n\n // Update sessionId when prop changes\n useEffect(() => {\n setCurrentSessionId(sessionId)\n }, [sessionId])\n\n // Fetch session on mount/sessionId change\n useEffect(() => {\n if (!currentSessionId || currentSessionId === 'new') {\n setSession(null)\n setMessages([])\n setPendingQuestion(null)\n setFetching(false)\n return\n }\n\n let cancelled = false\n\n setFetching(true)\n setError(null)\n\n dataSource\n .fetchSession(currentSessionId)\n .then((state) => {\n if (cancelled) return\n\n if (state) {\n setSession(state.session)\n setMessages(state.messages)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setError('Session not found')\n }\n setFetching(false)\n })\n .catch((err) => {\n if (cancelled) return\n setError(err.message || 'Failed to load session')\n setFetching(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [dataSource, currentSessionId])\n\n const handleCopy = useCallback(async (text: string) => {\n await navigator.clipboard.writeText(text)\n }, [])\n\n const sendMessageDirect = useCallback(\n async (content: string, attachments: Attachment[] = []): Promise<void> => {\n if (!content.trim() || loading) return\n\n // Check rate limit\n if (!rateLimiterRef.current.canMakeRequest()) {\n const timeUntilNext = rateLimiterRef.current.getTimeUntilNextRequest()\n const seconds = Math.ceil(timeUntilNext / 1000)\n setError(`Rate limit exceeded. Please wait ${seconds} seconds before sending another message.`)\n setTimeout(() => setError(null), 5000)\n return\n }\n\n setMessage('')\n setLoading(true)\n setError(null)\n setStreamingContent('')\n\n // Create abort controller for this request\n abortControllerRef.current = new AbortController()\n\n // Add optimistic user message\n const tempUserMessage: Message = {\n id: `temp-user-${Date.now()}`,\n sessionId: currentSessionId || 'new',\n role: MessageRole.User,\n content,\n createdAt: new Date().toISOString(),\n }\n setMessages((prev) => [...prev, tempUserMessage])\n\n try {\n // Create session if needed\n let activeSessionId = currentSessionId\n let shouldNavigateAfter = false\n\n if (!activeSessionId || activeSessionId === 'new') {\n const result = await dataSource.createSession()\n if (result) {\n activeSessionId = result.id\n setCurrentSessionId(activeSessionId)\n shouldNavigateAfter = true\n }\n }\n\n // Stream response\n let accumulatedContent = ''\n let createdSessionId: string | undefined\n setIsStreaming(true)\n\n for await (const chunk of dataSource.sendMessage(\n activeSessionId || 'new',\n content,\n attachments,\n abortControllerRef.current?.signal\n )) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break\n }\n\n if (chunk.type === 'chunk' && chunk.content) {\n accumulatedContent += chunk.content\n setStreamingContent(accumulatedContent)\n } else if (chunk.type === 'error') {\n throw new Error(chunk.error || 'Stream error')\n } else if (chunk.type === 'done') {\n if (chunk.sessionId) {\n createdSessionId = chunk.sessionId\n }\n // Refetch session to get final state\n const finalSessionId = createdSessionId || activeSessionId\n if (finalSessionId && finalSessionId !== 'new') {\n const state = await dataSource.fetchSession(finalSessionId)\n if (state) {\n setSession(state.session)\n setMessages(state.messages)\n setPendingQuestion(state.pendingQuestion || null)\n }\n }\n } else if (chunk.type === 'user_message' && chunk.sessionId) {\n createdSessionId = chunk.sessionId\n }\n }\n\n // Navigate to session page if a new session was created\n const targetSessionId = createdSessionId || activeSessionId\n if (shouldNavigateAfter && targetSessionId && targetSessionId !== 'new') {\n dataSource.navigateToSession?.(targetSessionId)\n }\n } catch (err) {\n // Check if error is due to cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n // Stream was cancelled - restore input message\n setMessage(content)\n return\n }\n\n // Remove optimistic message on error\n setMessages((prev) => prev.filter((m) => m.id !== tempUserMessage.id))\n\n const errorMessage = err instanceof Error ? err.message : 'Failed to send message'\n setError(errorMessage)\n console.error('Send message error:', err)\n } finally {\n setLoading(false)\n setStreamingContent('')\n setIsStreaming(false)\n abortControllerRef.current = null\n }\n },\n [currentSessionId, loading, dataSource]\n )\n\n const cancelStream = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n setIsStreaming(false)\n setLoading(false)\n }\n }, [])\n\n const handleSubmit = useCallback(\n (e: React.FormEvent, attachments: ImageAttachment[] = []) => {\n e.preventDefault()\n if (!message.trim() && attachments.length === 0) return\n\n // Convert ImageAttachment to Attachment for the data source\n const convertedAttachments: Attachment[] = attachments.map(att => ({\n id: '', // Will be assigned by backend\n filename: att.filename,\n mimeType: att.mimeType,\n sizeBytes: att.sizeBytes,\n base64Data: att.base64Data\n }))\n\n sendMessageDirect(message, convertedAttachments)\n },\n [message, sendMessageDirect]\n )\n\n const handleUnqueue = useCallback(() => {\n if (messageQueue.length === 0) {\n return null\n }\n\n const lastQueued = messageQueue[messageQueue.length - 1]\n setMessageQueue(prev => prev.slice(0, -1))\n\n return {\n content: lastQueued.content,\n attachments: lastQueued.attachments\n }\n }, [messageQueue])\n\n const handleRegenerate = useCallback(\n async (messageId: string) => {\n if (!currentSessionId || currentSessionId === 'new') return\n\n const messageIndex = messages.findIndex((m) => m.id === messageId)\n if (messageIndex <= 0) return\n\n setLoading(true)\n setError(null)\n\n try {\n // Find the user message before this assistant message\n const userMessage = messages[messageIndex - 1]\n if (userMessage && userMessage.role === MessageRole.User) {\n await sendMessageDirect(userMessage.content, [])\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to regenerate message'\n setError(errorMessage)\n console.error('Regenerate error:', err)\n } finally {\n setLoading(false)\n }\n },\n [messages, currentSessionId, sendMessageDirect]\n )\n\n const handleEdit = useCallback(\n async (messageId: string, newContent: string) => {\n if (!currentSessionId || currentSessionId === 'new') {\n setMessage(newContent)\n setMessages((prev) => prev.filter((m) => m.id !== messageId))\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n // For edit, we resend the edited message\n await sendMessageDirect(newContent, [])\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to edit message'\n setError(errorMessage)\n console.error('Edit error:', err)\n } finally {\n setLoading(false)\n }\n },\n [currentSessionId, sendMessageDirect]\n )\n\n const handleSubmitQuestionAnswers = useCallback(\n (answers: QuestionAnswers) => {\n if (!currentSessionId || !pendingQuestion) return\n\n setLoading(true)\n setError(null)\n const previousPendingQuestion = pendingQuestion\n setPendingQuestion(null)\n\n ;(async () => {\n try {\n const result = await dataSource.submitQuestionAnswers(\n currentSessionId,\n previousPendingQuestion.id,\n answers\n )\n\n if (result.success) {\n if (currentSessionId !== 'new') {\n try {\n const state = await dataSource.fetchSession(currentSessionId)\n if (state) {\n setMessages(state.messages)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setPendingQuestion(previousPendingQuestion)\n setError('Failed to load updated session')\n }\n } catch (fetchErr) {\n setPendingQuestion(previousPendingQuestion)\n const errorMessage =\n fetchErr instanceof Error\n ? fetchErr.message\n : 'Failed to load updated session'\n setError(errorMessage)\n }\n }\n } else {\n setPendingQuestion(previousPendingQuestion)\n setError(result.error || 'Failed to submit answers')\n }\n } catch (err) {\n setPendingQuestion(previousPendingQuestion)\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to submit answers'\n setError(errorMessage)\n } finally {\n setLoading(false)\n }\n })()\n },\n [currentSessionId, pendingQuestion, dataSource]\n )\n\n const handleCancelPendingQuestion = useCallback(async () => {\n if (!currentSessionId || !pendingQuestion) return\n\n try {\n const result = await dataSource.cancelPendingQuestion(pendingQuestion.id)\n\n if (result.success) {\n setPendingQuestion(null)\n } else {\n setError(result.error || 'Failed to cancel question')\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to cancel question'\n setError(errorMessage)\n }\n }, [currentSessionId, pendingQuestion, dataSource])\n\n const value: ChatSessionContextValue = {\n // State\n message,\n messages,\n loading,\n error,\n currentSessionId,\n pendingQuestion,\n session,\n fetching,\n streamingContent,\n isStreaming,\n messageQueue,\n codeOutputs,\n\n // Setters\n setMessage,\n setError,\n setCodeOutputs,\n\n // Handlers\n handleCopy,\n handleRegenerate,\n handleEdit,\n handleSubmit,\n handleSubmitQuestionAnswers,\n handleCancelPendingQuestion,\n handleUnqueue,\n sendMessage: sendMessageDirect,\n cancel: cancelStream,\n }\n\n return (\n <ChatSessionContext.Provider value={value}>\n {children}\n </ChatSessionContext.Provider>\n )\n}\n\nexport function useChat(): ChatSessionContextValue {\n const context = useContext(ChatSessionContext)\n if (!context) {\n throw new Error('useChat must be used within ChatSessionProvider')\n }\n return context\n}\n","/**\n * IOTA SDK integration context provider\n * Consumes server-side context from window.__BICHAT_CONTEXT__\n */\n\nimport { createContext, useContext, ReactNode } from 'react'\nimport type { IotaContext as IotaContextType } from '../types/iota'\n\nconst IotaContext = createContext<IotaContextType | null>(null)\n\ninterface IotaContextProviderProps {\n children: ReactNode\n}\n\nexport function IotaContextProvider({ children }: IotaContextProviderProps) {\n // Read initial context from window object injected by server\n const initialContext = window.__BICHAT_CONTEXT__\n\n if (!initialContext) {\n throw new Error('BICHAT_CONTEXT not found. Ensure server injected context into window object.')\n }\n\n return (\n <IotaContext.Provider value={initialContext}>\n {children}\n </IotaContext.Provider>\n )\n}\n\nexport function useIotaContext(): IotaContextType {\n const context = useContext(IotaContext)\n if (!context) {\n throw new Error('useIotaContext must be used within IotaContextProvider')\n }\n return context\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(permission: string): boolean {\n const context = window.__BICHAT_CONTEXT__\n if (!context) {\n return false\n }\n return context.user.permissions.includes(permission)\n}\n","/**\n * Default English translations for BiChat UI.\n * These serve as fallback when no custom translations are provided.\n *\n * Key naming convention:\n * - Use dot notation for namespacing: \"section.key\"\n * - Use {param} for interpolation: \"You have {count} messages\"\n */\n\nimport type { Translations } from '../types'\n\nexport const defaultTranslations: Translations = {\n // Welcome screen\n 'welcome.title': 'Welcome to BiChat',\n 'welcome.description':\n 'Your intelligent business analytics assistant. Ask questions about your data, generate reports, or explore insights.',\n 'welcome.tryAsking': 'Try asking',\n\n // Chat header\n 'chat.newChat': 'New Chat',\n 'chat.archived': 'Archived',\n 'chat.pinned': 'Pinned',\n 'chat.goBack': 'Go back',\n\n // Message input\n 'input.placeholder': 'Type a message...',\n 'input.attachFiles': 'Attach files',\n 'input.attachImages': 'Attach images',\n 'input.dropImages': 'Drop images here',\n 'input.sendMessage': 'Send message',\n 'input.aiThinking': 'AI is thinking...',\n 'input.processing': 'Processing...',\n 'input.messagesQueued': '{count} message(s) queued',\n 'input.dismissError': 'Dismiss error',\n\n // Message actions\n 'message.copy': 'Copy',\n 'message.copied': 'Copied!',\n 'message.regenerate': 'Regenerate',\n 'message.edit': 'Edit',\n 'message.save': 'Save',\n 'message.cancel': 'Cancel',\n\n // Assistant turn\n 'assistant.thinking': 'Thinking...',\n 'assistant.toolCall': 'Using tool: {name}',\n 'assistant.generating': 'Generating response...',\n\n // Question form\n 'question.submit': 'Submit',\n 'question.selectOne': 'Select one option',\n 'question.selectMulti': 'Select one or more options',\n 'question.required': 'This field is required',\n 'question.other': 'Other',\n 'question.specifyOther': 'Please specify',\n\n // Errors\n 'error.generic': 'Something went wrong',\n 'error.networkError': 'Network error. Please try again.',\n 'error.sessionExpired': 'Session expired. Please refresh.',\n 'error.fileTooLarge': 'File is too large',\n 'error.invalidFile': 'Invalid file type',\n 'error.maxFiles': 'Maximum {max} files allowed',\n\n // Empty states\n 'empty.noMessages': 'No messages yet',\n 'empty.noSessions': 'No chat sessions',\n 'empty.startChat': 'Start a new chat to begin',\n\n // Sources panel\n 'sources.title': 'Sources',\n 'sources.viewMore': 'View more',\n 'sources.citations': '{count} citation(s)',\n\n // Code outputs\n 'codeOutputs.title': 'Code Outputs',\n 'codeOutputs.download': 'Download',\n 'codeOutputs.expand': 'Expand',\n 'codeOutputs.collapse': 'Collapse',\n\n // Charts\n 'chart.download': 'Download chart',\n 'chart.fullscreen': 'View fullscreen',\n 'chart.noData': 'No data available',\n\n // Example prompt categories\n 'category.analysis': 'Data Analysis',\n 'category.reports': 'Reports',\n 'category.insights': 'Insights',\n}\n","/**\n * Translation hook using locale from IotaContext\n */\n\nimport { useIotaContext } from '../context/IotaContext'\nimport { defaultTranslations } from '../locales/defaults'\n\nexport function useTranslation() {\n const { locale } = useIotaContext()\n\n /**\n * Translate a key with optional parameter interpolation\n * @param key - Translation key (e.g., 'bichat.title')\n * @param params - Optional parameters for interpolation (e.g., { name: 'John' })\n * @returns Translated string\n */\n const t = (key: string, params?: Record<string, any>): string => {\n let text = locale.translations[key] || defaultTranslations[key] || key\n\n // Simple interpolation: replace {{key}} with params[key]\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n const value = params[paramKey]\n text = text.replace(new RegExp(`{{${paramKey}}}`, 'g'), String(value))\n })\n }\n\n return text\n }\n\n return {\n t,\n locale: locale.language,\n }\n}\n","/**\n * Branding hook for UI customization.\n *\n * Provides access to branding configuration injected from the backend\n * via window.__BICHAT_CONTEXT__.extensions.branding\n */\n\nimport { useMemo } from 'react'\nimport { useIotaContext } from '../context/IotaContext'\nimport type { BrandingConfig, ExamplePrompt } from '../types'\nimport { useTranslation } from './useTranslation'\n\n/**\n * Default example prompts when none are configured.\n */\nconst defaultExamplePrompts: ExamplePrompt[] = [\n {\n category: 'Data Analysis',\n text: 'Show me sales trends for the last quarter',\n icon: 'chart-bar',\n },\n {\n category: 'Reports',\n text: 'Generate a summary of recent activity',\n icon: 'file-text',\n },\n {\n category: 'Insights',\n text: 'What are the top performing items?',\n icon: 'lightbulb',\n },\n]\n\n/**\n * Hook to access branding configuration.\n *\n * Returns merged branding with fallbacks to defaults and translations.\n */\nexport function useBranding() {\n const context = useIotaContext()\n const { t } = useTranslation()\n\n const branding = useMemo((): BrandingConfig => {\n const customBranding = context.extensions?.branding || {}\n\n // Get example prompts with category translations\n let examplePrompts = customBranding.welcome?.examplePrompts\n if (!examplePrompts || examplePrompts.length === 0) {\n // Use defaults with translated categories\n examplePrompts = defaultExamplePrompts.map((p) => ({\n ...p,\n category: t(`category.${p.category.toLowerCase().replace(/\\s+/g, '')}`) || p.category,\n }))\n }\n\n return {\n appName: customBranding.appName || 'BiChat',\n logoUrl: customBranding.logoUrl,\n welcome: {\n title: customBranding.welcome?.title || t('welcome.title'),\n description: customBranding.welcome?.description || t('welcome.description'),\n examplePrompts,\n },\n theme: customBranding.theme,\n }\n }, [context.extensions?.branding, t])\n\n return branding\n}\n\n/**\n * Hook to access feature flags.\n */\nexport function useFeatureFlags() {\n const context = useIotaContext()\n\n return useMemo(\n () => ({\n vision: context.extensions?.features?.vision ?? false,\n webSearch: context.extensions?.features?.webSearch ?? false,\n codeInterpreter: context.extensions?.features?.codeInterpreter ?? false,\n multiAgent: context.extensions?.features?.multiAgent ?? false,\n }),\n [context.extensions?.features]\n )\n}\n","/**\n * Chat header component\n * Displays session title and controls\n *\n * Supports customization via:\n * - logoSlot: Custom logo component\n * - actionsSlot: Custom action buttons\n * - Translations for \"New Chat\", \"Archived\", etc.\n */\n\nimport { ReactNode } from 'react'\nimport { Session } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { useBranding } from '../hooks/useBranding'\n\ninterface ChatHeaderProps {\n session: Session | null\n onBack?: () => void\n /** Custom logo component to display */\n logoSlot?: ReactNode\n /** Custom action buttons */\n actionsSlot?: ReactNode\n}\n\nexport function ChatHeader({ session, onBack, logoSlot, actionsSlot }: ChatHeaderProps) {\n const { t } = useTranslation()\n const branding = useBranding()\n\n const BackButton = onBack ? (\n <button\n onClick={onBack}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label={t('chat.goBack')}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n ) : null\n\n const Logo = logoSlot || (branding.logoUrl ? (\n <img src={branding.logoUrl} alt={branding.appName} className=\"h-6 w-auto\" />\n ) : null)\n\n if (!session) {\n return (\n <header className=\"bichat-header border-b border-[var(--bichat-border)] px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {BackButton}\n {Logo}\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)]\">\n {t('chat.newChat')}\n </h1>\n </div>\n {actionsSlot && <div className=\"flex items-center gap-2\">{actionsSlot}</div>}\n </div>\n </header>\n )\n }\n\n return (\n <header className=\"bichat-header border-b border-[var(--bichat-border)] px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {BackButton}\n {Logo}\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)]\">{session.title}</h1>\n {session.pinned && (\n <svg\n className=\"w-4 h-4 text-[var(--bichat-primary)]\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n aria-label={t('chat.pinned')}\n >\n <path d=\"M10 2a1 1 0 011 1v1.323l3.954 1.582 1.599-.8a1 1 0 01.894 1.79l-1.233.616 1.738 5.42a1 1 0 01-.285 1.05A3.989 3.989 0 0115 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.715-5.349L11 6.477V16h2a1 1 0 110 2H7a1 1 0 110-2h2V6.477L6.237 7.582l1.715 5.349a1 1 0 01-.285 1.05A3.989 3.989 0 015 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.738-5.42-1.233-.617a1 1 0 01.894-1.788l1.599.799L9 4.323V3a1 1 0 011-1z\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {session.status === 'archived' && (\n <span className=\"px-2 py-1 text-xs bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded\">\n {t('chat.archived')}\n </span>\n )}\n {actionsSlot}\n </div>\n </div>\n </header>\n )\n}\n","/**\n * File Utilities\n * Validation, conversion, and formatting for file attachments\n */\n\nconst MAX_FILE_SIZE_BYTES = 20 * 1024 * 1024 // 20MB\nconst ALLOWED_IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']\n\n/**\n * Validates an image file against size and type constraints\n * @throws Error if validation fails\n */\nexport function validateImageFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n if (!ALLOWED_IMAGE_TYPES.includes(file.type)) {\n throw new Error(`Invalid file type: ${file.type}. Only PNG, JPEG, WebP, and GIF are allowed.`)\n }\n if (file.size > maxSizeBytes) {\n const sizeMB = (file.size / 1024 / 1024).toFixed(1)\n const maxSizeMB = (maxSizeBytes / 1024 / 1024).toFixed(0)\n throw new Error(`File too large: ${sizeMB}MB exceeds ${maxSizeMB}MB limit`)\n }\n}\n\n/**\n * Converts a file to base64 string (without data URL prefix)\n */\nexport async function convertToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = reader.result as string\n // Strip data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1]\n resolve(base64)\n }\n reader.onerror = () => reject(new Error('Failed to read file'))\n reader.readAsDataURL(file)\n })\n}\n\n/**\n * Creates a data URL from base64 string and MIME type\n */\nexport function createDataUrl(base64: string, mimeType: string): string {\n return `data:${mimeType};base64,${base64}`\n}\n\n/**\n * Formats file size in human-readable format\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`\n}\n\n/**\n * Validates multiple files don't exceed count limit\n * @throws Error if count exceeds limit\n */\nexport function validateFileCount(currentCount: number, newCount: number, maxCount: number = 10): void {\n const total = currentCount + newCount\n if (total > maxCount) {\n throw new Error(`Cannot attach more than ${maxCount} files (attempting to add ${total})`)\n }\n}\n","/**\n * AttachmentGrid Component\n * Displays image attachments in a responsive grid\n * Supports both view-only mode and edit mode (with remove buttons)\n */\n\nimport { X } from '@phosphor-icons/react'\nimport { formatFileSize } from '../utils/fileUtils'\nimport type { ImageAttachment } from '../types'\n\ninterface AttachmentGridProps {\n attachments: ImageAttachment[]\n onRemove?: (index: number) => void\n onView?: (index: number) => void\n className?: string\n}\n\nexport default function AttachmentGrid({\n attachments,\n onRemove,\n onView,\n className = ''\n}: AttachmentGridProps) {\n if (attachments.length === 0) return null\n\n const isEditable = !!onRemove\n const isViewable = !!onView\n\n return (\n <div className={`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2 ${className}`}>\n {attachments.map((attachment, index) => (\n <div key={index} className=\"relative group\">\n <img\n src={attachment.preview}\n alt={attachment.filename}\n className={`w-full h-24 object-cover rounded-lg border border-gray-200 dark:border-gray-700 ${\n isViewable ? 'cursor-pointer hover:opacity-80 transition-opacity' : ''\n }`}\n onClick={() => isViewable && onView(index)}\n role={isViewable ? 'button' : undefined}\n tabIndex={isViewable ? 0 : undefined}\n onKeyDown={(e) => {\n if (isViewable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n onView(index)\n }\n }}\n />\n\n {isEditable && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove(index)\n }}\n className=\"absolute top-1 right-1 p-1 bg-red-500 hover:bg-red-600 text-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity shadow-md\"\n aria-label={`Remove ${attachment.filename}`}\n >\n <X size={16} weight=\"bold\" />\n </button>\n )}\n\n <div className=\"mt-1 px-1\">\n <div className=\"text-xs text-gray-600 dark:text-gray-400 truncate\" title={attachment.filename}>\n {attachment.filename.length > 20\n ? `${attachment.filename.substring(0, 20)}...`\n : attachment.filename}\n </div>\n <div className=\"text-xs text-gray-500 dark:text-gray-500\">\n {formatFileSize(attachment.sizeBytes)}\n </div>\n </div>\n </div>\n ))}\n </div>\n )\n}\n","/**\n * ImageModal Component\n * Full-screen image viewer with navigation for multiple images\n */\n\nimport { useState, useEffect } from 'react'\nimport { X, CaretLeft, CaretRight } from '@phosphor-icons/react'\nimport type { ImageAttachment } from '../types'\n\ninterface ImageModalProps {\n images: ImageAttachment[]\n initialIndex: number\n onClose: () => void\n}\n\nexport default function ImageModal({ images, initialIndex, onClose }: ImageModalProps) {\n const [currentIndex, setCurrentIndex] = useState(initialIndex)\n\n const handlePrevious = () => {\n setCurrentIndex((prev) => (prev > 0 ? prev - 1 : images.length - 1))\n }\n\n const handleNext = () => {\n setCurrentIndex((prev) => (prev < images.length - 1 ? prev + 1 : 0))\n }\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n } else if (e.key === 'ArrowLeft') {\n handlePrevious()\n } else if (e.key === 'ArrowRight') {\n handleNext()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [onClose])\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = ''\n }\n }, [])\n\n return (\n <div\n className=\"fixed inset-0 z-50 bg-black/90 flex items-center justify-center\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Image viewer\"\n >\n {/* Close button */}\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-white hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"Close image viewer\"\n >\n <X size={24} weight=\"bold\" />\n </button>\n\n {/* Navigation buttons (only show if multiple images) */}\n {images.length > 1 && (\n <>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handlePrevious()\n }}\n className=\"absolute left-4 p-2 text-white hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"Previous image\"\n >\n <CaretLeft size={32} weight=\"bold\" />\n </button>\n <button\n onClick={(e) => {\n e.stopPropagation()\n handleNext()\n }}\n className=\"absolute right-4 p-2 text-white hover:bg-white/10 rounded-lg transition-colors\"\n aria-label=\"Next image\"\n >\n <CaretRight size={32} weight=\"bold\" />\n </button>\n </>\n )}\n\n {/* Image */}\n <img\n src={images[currentIndex].preview}\n alt={images[currentIndex].filename}\n className=\"max-w-[90vw] max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n\n {/* Image counter and filename */}\n <div\n className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 text-white text-sm bg-black/50 px-4 py-2 rounded-lg backdrop-blur\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"text-center font-medium mb-1\">\n {images[currentIndex].filename}\n </div>\n {images.length > 1 && (\n <div className=\"text-center text-xs opacity-80\">\n {currentIndex + 1} / {images.length}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * UserTurnView Component\n * Displays user messages with attachments, image modal, and actions\n * Clean, professional design\n */\n\nimport { useState } from 'react'\nimport { Copy, PencilSimple } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport AttachmentGrid from './AttachmentGrid'\nimport ImageModal from './ImageModal'\nimport { useChat } from '../context/ChatContext'\nimport type { Message, ImageAttachment } from '../types'\n\ninterface UserTurnViewProps {\n message: Message & {\n attachments?: ImageAttachment[]\n }\n}\n\nexport function UserTurnView({ message }: UserTurnViewProps) {\n const { handleEdit, handleCopy } = useChat()\n const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null)\n\n const handleCopyClick = async () => {\n if (handleCopy) {\n await handleCopy(message.content)\n } else {\n try {\n await navigator.clipboard.writeText(message.content)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n }\n\n const handleEditClick = () => {\n if (handleEdit) {\n const newContent = prompt('Edit message:', message.content)\n if (newContent && newContent !== message.content) {\n handleEdit(message.id, newContent)\n }\n }\n }\n\n return (\n <div className=\"flex gap-3 justify-end group\">\n <div className=\"flex-1 flex flex-col items-end max-w-[75%]\">\n {/* Attachments */}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"mb-2 w-full\">\n <AttachmentGrid\n attachments={message.attachments}\n onView={(index) => setSelectedImageIndex(index)}\n />\n </div>\n )}\n\n {/* Message bubble - solid primary color */}\n {message.content && (\n <div className=\"bg-primary-600 text-white rounded-2xl rounded-br-sm px-4 py-3\">\n <div className=\"text-[15px] whitespace-pre-wrap break-words leading-relaxed\">\n {message.content}\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 mt-2 opacity-0 group-hover:opacity-100 transition-opacity duration-150\">\n <span className=\"text-xs text-gray-400 dark:text-gray-500 mr-1\">\n {formatDistanceToNow(new Date(message.createdAt), { addSuffix: true })}\n </span>\n\n <button\n onClick={handleCopyClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Copy message\"\n title=\"Copy\"\n >\n <Copy size={14} weight=\"regular\" />\n </button>\n\n {handleEdit && (\n <button\n onClick={handleEditClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Edit message\"\n title=\"Edit\"\n >\n <PencilSimple size={14} weight=\"regular\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Avatar - solid primary color */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-sm\">\n U\n </div>\n\n {/* Image modal */}\n {selectedImageIndex !== null && message.attachments && (\n <ImageModal\n images={message.attachments}\n initialIndex={selectedImageIndex}\n onClose={() => setSelectedImageIndex(null)}\n />\n )}\n </div>\n )\n}\n","/**\n * CodeOutputsPanel Component\n * Displays code interpreter outputs (images, text, errors)\n */\n\nimport type { CodeOutput, ImageAttachment } from '../types'\n\ninterface CodeOutputsPanelProps {\n outputs: CodeOutput[]\n}\n\nexport default function CodeOutputsPanel({ outputs }: CodeOutputsPanelProps) {\n if (!outputs || outputs.length === 0) return null\n\n return (\n <div className=\"mb-2 p-3 bg-gray-50 dark:bg-gray-900/50 rounded-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 mb-2\">\n Code Output\n </div>\n <div className=\"space-y-2\">\n {outputs.map((output, index) => (\n <div key={index}>\n {output.type === 'image' && (\n <img\n src={(output.content as ImageAttachment).preview}\n alt=\"Code output\"\n className=\"max-w-full rounded border border-gray-300 dark:border-gray-600\"\n />\n )}\n {output.type === 'text' && (\n <pre className=\"text-xs bg-white dark:bg-gray-800 p-2 rounded overflow-x-auto border border-gray-200 dark:border-gray-700\">\n <code className=\"text-gray-900 dark:text-gray-100\">\n {output.content as string}\n </code>\n </pre>\n )}\n {output.type === 'error' && (\n <div className=\"text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 p-2 rounded border border-red-200 dark:border-red-800\">\n {output.content as string}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * StreamingCursor Component\n * Animated cursor shown during AI response streaming\n */\n\n\nexport default function StreamingCursor() {\n return (\n <span\n className=\"inline-block w-1.5 h-4 ml-0.5 bg-primary-600 dark:bg-primary-500 animate-pulse\"\n aria-label=\"AI is typing\"\n />\n )\n}\n","/**\n * ChartCard component\n * Renders charts using recharts\n */\n\nimport {\n BarChart,\n Bar,\n LineChart,\n Line,\n PieChart,\n Pie,\n AreaChart,\n Area,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n ResponsiveContainer,\n Cell,\n} from 'recharts'\nimport { ChartData } from '../types'\n\ninterface ChartCardProps {\n chartData: ChartData\n}\n\nconst COLORS = ['#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899']\n\nexport function ChartCard({ chartData }: ChartCardProps) {\n const { type, title, data, xAxisKey = 'name', yAxisKey = 'value' } = chartData\n\n const renderChart = () => {\n switch (type) {\n case 'bar':\n return (\n <BarChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey={xAxisKey} />\n <YAxis />\n <Tooltip />\n <Legend />\n <Bar dataKey={yAxisKey} fill=\"#3b82f6\" />\n </BarChart>\n )\n case 'line':\n return (\n <LineChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey={xAxisKey} />\n <YAxis />\n <Tooltip />\n <Legend />\n <Line type=\"monotone\" dataKey={yAxisKey} stroke=\"#3b82f6\" />\n </LineChart>\n )\n case 'pie':\n return (\n <PieChart>\n <Pie\n data={data}\n dataKey={yAxisKey}\n nameKey={xAxisKey}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius={80}\n label\n >\n {data.map((_entry, index) => (\n <Cell key={`cell-${index}`} fill={COLORS[index % COLORS.length]} />\n ))}\n </Pie>\n <Tooltip />\n <Legend />\n </PieChart>\n )\n case 'area':\n return (\n <AreaChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey={xAxisKey} />\n <YAxis />\n <Tooltip />\n <Legend />\n <Area type=\"monotone\" dataKey={yAxisKey} stroke=\"#3b82f6\" fill=\"#3b82f6\" />\n </AreaChart>\n )\n default:\n return <div>Unsupported chart type</div>\n }\n }\n\n return (\n <div className=\"border border-[var(--bichat-border)] rounded-lg p-4 bg-white\">\n {title && <h3 className=\"text-lg font-semibold mb-4\">{title}</h3>}\n <ResponsiveContainer width=\"100%\" height={300}>\n {renderChart()}\n </ResponsiveContainer>\n </div>\n )\n}\n","/**\n * SourcesPanel component\n * Displays citations and sources\n */\n\nimport { useState } from 'react'\nimport { Citation } from '../types'\n\ninterface SourcesPanelProps {\n citations: Citation[]\n}\n\nexport function SourcesPanel({ citations }: SourcesPanelProps) {\n const [expanded, setExpanded] = useState(false)\n\n if (!citations || citations.length === 0) {\n return null\n }\n\n return (\n <div className=\"mt-4 border-t border-[var(--bichat-border)] pt-3\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 text-sm text-gray-600 hover:text-gray-800 transition-colors\"\n aria-expanded={expanded}\n >\n <svg\n className={`w-4 h-4 transition-transform ${expanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n <span>{citations.length} {citations.length === 1 ? 'source' : 'sources'}</span>\n </button>\n {expanded && (\n <div className=\"mt-2 space-y-2\">\n {citations.map((citation, index) => (\n <div\n key={citation.id}\n className=\"p-3 bg-gray-50 rounded-lg text-sm\"\n >\n <div className=\"flex items-start gap-2\">\n <span className=\"flex-shrink-0 w-5 h-5 bg-[var(--bichat-primary)] text-white rounded-full flex items-center justify-center text-xs\">\n {index + 1}\n </span>\n <div className=\"flex-1\">\n <div className=\"font-medium text-gray-900\">{citation.source}</div>\n {citation.url && (\n <a\n href={citation.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[var(--bichat-primary)] hover:underline\"\n >\n {citation.url}\n </a>\n )}\n {citation.excerpt && (\n <div className=\"mt-1 text-gray-600 italic\">\"{citation.excerpt}\"</div>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * DownloadCard component\n * Displays downloadable artifacts (Excel, PDF)\n */\n\nimport { Artifact } from '../types'\n\ninterface DownloadCardProps {\n artifact: Artifact\n}\n\nexport function DownloadCard({ artifact }: DownloadCardProps) {\n const { type, filename, url, sizeReadable, rowCount, description } = artifact\n\n const icon =\n type === 'excel' ? (\n <svg className=\"w-8 h-8 text-green-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M9 2a2 2 0 00-2 2v8a2 2 0 002 2h6a2 2 0 002-2V6.414A2 2 0 0016.414 5L14 2.586A2 2 0 0012.586 2H9z\" />\n <path d=\"M3 8a2 2 0 012-2v10h8a2 2 0 01-2 2H5a2 2 0 01-2-2V8z\" />\n </svg>\n ) : (\n <svg className=\"w-8 h-8 text-red-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n\n return (\n <a\n href={url}\n download={filename}\n className=\"flex items-center gap-3 p-4 border border-[var(--bichat-border)] rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <div>{icon}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-gray-900 truncate\">{filename}</div>\n <div className=\"flex items-center gap-2 text-sm text-gray-600\">\n {sizeReadable && <span>{sizeReadable}</span>}\n {rowCount !== undefined && (\n <>\n <span>•</span>\n <span>{rowCount} rows</span>\n </>\n )}\n </div>\n {description && <div className=\"text-sm text-gray-600 mt-1\">{description}</div>}\n </div>\n <svg\n className=\"w-5 h-5 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n </a>\n )\n}\n","/**\n * InlineQuestionForm component\n * Handles HITL (Human-in-the-Loop) questions from the AI agent\n */\n\nimport { useState } from 'react'\nimport { PendingQuestion, QuestionAnswers } from '../types'\nimport { useChat } from '../context/ChatContext'\n\ninterface InlineQuestionFormProps {\n pendingQuestion: PendingQuestion\n}\n\nexport function InlineQuestionForm({ pendingQuestion }: InlineQuestionFormProps) {\n const { handleSubmitQuestionAnswers, handleCancelPendingQuestion } = useChat()\n const [answers, setAnswers] = useState<QuestionAnswers>({})\n const [textInput, setTextInput] = useState('')\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n\n if (pendingQuestion.type === 'MULTIPLE_CHOICE' && !answers.choice) {\n return\n }\n\n if (pendingQuestion.type === 'FREE_TEXT' && !textInput.trim()) {\n return\n }\n\n const finalAnswers =\n pendingQuestion.type === 'MULTIPLE_CHOICE'\n ? answers\n : { answer: textInput }\n\n handleSubmitQuestionAnswers(finalAnswers)\n }\n\n return (\n <div className=\"border border-[var(--bichat-border)] rounded-lg p-4 bg-yellow-50\">\n <form onSubmit={handleSubmit}>\n <div className=\"flex items-start gap-2 mb-4\">\n <svg\n className=\"w-5 h-5 text-yellow-600 flex-shrink-0 mt-0.5\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <div className=\"flex-1\">\n <h4 className=\"font-medium text-gray-900 mb-2\">\n Question from AI\n </h4>\n <p className=\"text-gray-700\">{pendingQuestion.question}</p>\n </div>\n </div>\n\n {pendingQuestion.type === 'MULTIPLE_CHOICE' && pendingQuestion.options && (\n <div className=\"space-y-2 mb-4\">\n {pendingQuestion.options.map((option, index) => (\n <label\n key={index}\n className=\"flex items-center gap-2 p-2 hover:bg-yellow-100 rounded cursor-pointer\"\n >\n <input\n type=\"radio\"\n name=\"choice\"\n value={option}\n checked={answers.choice === option}\n onChange={(e) =>\n setAnswers({ ...answers, choice: e.target.value })\n }\n className=\"w-4 h-4 text-[var(--bichat-primary)]\"\n />\n <span className=\"text-gray-900\">{option}</span>\n </label>\n ))}\n </div>\n )}\n\n {pendingQuestion.type === 'FREE_TEXT' && (\n <div className=\"mb-4\">\n <textarea\n value={textInput}\n onChange={(e) => setTextInput(e.target.value)}\n placeholder=\"Type your answer...\"\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[var(--bichat-primary)] focus:border-transparent resize-none\"\n rows={3}\n />\n </div>\n )}\n\n <div className=\"flex gap-2\">\n <button\n type=\"submit\"\n className=\"px-4 py-2 bg-[var(--bichat-primary)] text-white rounded-lg hover:opacity-90 transition-opacity\"\n >\n Submit Answer\n </button>\n <button\n type=\"button\"\n onClick={handleCancelPendingQuestion}\n className=\"px-4 py-2 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n Cancel\n </button>\n </div>\n </form>\n </div>\n )\n}\n","/**\n * AssistantTurnView Component\n * Displays assistant messages with markdown, charts, sources, downloads, code outputs, and streaming cursor\n * Clean, professional design\n */\n\nimport { useState, lazy, Suspense } from 'react'\nimport { Copy, ArrowsClockwise } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport CodeOutputsPanel from './CodeOutputsPanel'\nimport StreamingCursor from './StreamingCursor'\nimport { ChartCard } from './ChartCard'\nimport { SourcesPanel } from './SourcesPanel'\nimport { DownloadCard } from './DownloadCard'\nimport { InlineQuestionForm } from './InlineQuestionForm'\nimport { useChat } from '../context/ChatContext'\nimport type { Message, CodeOutput } from '../types'\n\nconst MarkdownRenderer = lazy(() =>\n import('./MarkdownRenderer').then((module) => ({ default: module.MarkdownRenderer }))\n)\n\ninterface AssistantTurnViewProps {\n message: Message & {\n codeOutputs?: CodeOutput[]\n isStreaming?: boolean\n }\n}\n\nexport function AssistantTurnView({ message }: AssistantTurnViewProps) {\n const { handleCopy, handleRegenerate, pendingQuestion } = useChat()\n const [explanationExpanded, setExplanationExpanded] = useState(false)\n\n const hasContent = message.content?.trim().length > 0\n const hasExplanation = !!message.explanation?.trim()\n const hasPendingQuestion =\n !!pendingQuestion &&\n pendingQuestion.status === 'PENDING' &&\n pendingQuestion.turnId === message.id\n\n const handleCopyClick = async () => {\n if (handleCopy) {\n await handleCopy(message.content)\n } else {\n try {\n await navigator.clipboard.writeText(message.content)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n }\n\n const handleRegenerateClick = async () => {\n if (handleRegenerate) {\n await handleRegenerate(message.id)\n }\n }\n\n return (\n <div className=\"flex gap-3 group\">\n {/* Avatar - solid primary color */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-xs\">\n AI\n </div>\n\n <div className=\"flex-1 flex flex-col gap-3 max-w-[85%]\">\n {/* Code outputs */}\n {message.codeOutputs && message.codeOutputs.length > 0 && (\n <CodeOutputsPanel outputs={message.codeOutputs} />\n )}\n\n {/* Chart visualization */}\n {message.chartData && (\n <div className=\"mb-1 w-full\">\n <ChartCard chartData={message.chartData} />\n </div>\n )}\n\n {/* Artifact cards */}\n {message.artifacts && message.artifacts.length > 0 && (\n <div className=\"mb-1 flex flex-wrap gap-2\">\n {message.artifacts.map((artifact, index) => (\n <DownloadCard key={`${artifact.filename}-${index}`} artifact={artifact} />\n ))}\n </div>\n )}\n\n {/* Message bubble - clean card style */}\n {hasContent && (\n <div className=\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-2xl rounded-bl-sm px-4 py-3\">\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 text-sm text-gray-400 dark:text-gray-500\">\n <div className=\"w-4 h-4 border-2 border-gray-300 dark:border-gray-600 border-t-transparent rounded-full animate-spin\" />\n Loading...\n </div>\n }\n >\n <MarkdownRenderer content={message.content} citations={message.citations} />\n </Suspense>\n\n {/* Streaming cursor */}\n {message.isStreaming && <StreamingCursor />}\n\n {/* Sources panel */}\n {message.citations && message.citations.length > 0 && (\n <SourcesPanel citations={message.citations} />\n )}\n\n {/* Explanation section */}\n {hasExplanation && (\n <div className=\"mt-4 border-t border-gray-100 dark:border-gray-700 pt-4\">\n <button\n type=\"button\"\n onClick={() => setExplanationExpanded(!explanationExpanded)}\n className=\"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors\"\n aria-expanded={explanationExpanded}\n >\n <svg\n className={`w-4 h-4 transition-transform duration-150 ${explanationExpanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n <span className=\"font-medium\">How I arrived at this</span>\n </button>\n {explanationExpanded && (\n <div className=\"pt-3 text-sm text-gray-600 dark:text-gray-400\">\n <Suspense fallback={<div>Loading...</div>}>\n <MarkdownRenderer content={message.explanation!} />\n </Suspense>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Inline Question Form */}\n {hasPendingQuestion && <InlineQuestionForm pendingQuestion={pendingQuestion} />}\n\n {/* Actions */}\n {hasContent && (\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity duration-150\">\n <span className=\"text-xs text-gray-400 dark:text-gray-500 mr-1\">\n {formatDistanceToNow(new Date(message.createdAt), { addSuffix: true })}\n </span>\n\n <button\n onClick={handleCopyClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Copy message\"\n title=\"Copy\"\n >\n <Copy size={14} weight=\"regular\" />\n </button>\n\n {handleRegenerate && (\n <button\n onClick={handleRegenerateClick}\n className=\"p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-md transition-colors duration-150\"\n aria-label=\"Regenerate message\"\n title=\"Regenerate\"\n >\n <ArrowsClockwise size={14} weight=\"regular\" />\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * TurnBubble component\n * Container for individual messages with role-based styling\n */\n\nimport { ReactNode } from 'react'\nimport { Message, MessageRole } from '../types'\nimport { UserTurnView } from './UserTurnView'\nimport { AssistantTurnView } from './AssistantTurnView'\n\ninterface TurnBubbleProps {\n message: Message\n renderUserMessage?: (message: Message) => ReactNode\n renderAssistantMessage?: (message: Message) => ReactNode\n}\n\nexport function TurnBubble({\n message,\n renderUserMessage,\n renderAssistantMessage,\n}: TurnBubbleProps) {\n if (message.role === MessageRole.User) {\n if (renderUserMessage) {\n return <>{renderUserMessage(message)}</>\n }\n return <UserTurnView message={message} />\n }\n\n if (message.role === MessageRole.Assistant) {\n if (renderAssistantMessage) {\n return <>{renderAssistantMessage(message)}</>\n }\n return <AssistantTurnView message={message} />\n }\n\n // System and Tool messages are hidden by default\n return null\n}\n","/**\n * ScrollToBottomButton Component\n * Floating button to scroll chat to bottom, shown when user scrolls up\n */\n\nimport { ArrowDown } from '@phosphor-icons/react'\nimport { motion, AnimatePresence } from 'framer-motion'\n\ninterface ScrollToBottomButtonProps {\n show: boolean\n onClick: () => void\n unreadCount?: number\n}\n\nexport default function ScrollToBottomButton({\n show,\n onClick,\n unreadCount = 0\n}: ScrollToBottomButtonProps) {\n return (\n <AnimatePresence>\n {show && (\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n onClick={onClick}\n className=\"absolute bottom-24 right-8 p-3 bg-white dark:bg-gray-800 rounded-full shadow-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors z-10\"\n aria-label=\"Scroll to bottom\"\n >\n <div className=\"relative\">\n <ArrowDown size={20} weight=\"bold\" className=\"text-gray-700 dark:text-gray-300\" />\n\n {/* Unread count badge */}\n {unreadCount > 0 && (\n <span className=\"absolute -top-2 -right-2 min-w-[18px] h-[18px] bg-primary-600 dark:bg-primary-500 text-white text-xs font-semibold rounded-full flex items-center justify-center px-1\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </div>\n </motion.button>\n )}\n </AnimatePresence>\n )\n}\n","/**\n * MessageList component\n * Displays messages with auto-scroll and grouping\n */\n\nimport { useEffect, useRef, ReactNode, useState } from 'react'\nimport { useChat } from '../context/ChatContext'\nimport { Message } from '../types'\nimport { TurnBubble } from './TurnBubble'\nimport ScrollToBottomButton from './ScrollToBottomButton'\n\ninterface MessageListProps {\n renderUserMessage?: (message: Message) => ReactNode\n renderAssistantMessage?: (message: Message) => ReactNode\n}\n\nexport function MessageList({ renderUserMessage, renderAssistantMessage }: MessageListProps) {\n const { messages, streamingContent, isStreaming } = useChat()\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const [showScrollButton, setShowScrollButton] = useState(false)\n\n // Auto-scroll to bottom on new messages\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages.length, streamingContent])\n\n // Scroll detection for ScrollToBottomButton\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = container\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100\n setShowScrollButton(!isNearBottom)\n }\n\n container.addEventListener('scroll', handleScroll)\n return () => container.removeEventListener('scroll', handleScroll)\n }, [])\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }\n\n return (\n <div className=\"relative flex-1 min-h-0\">\n <div ref={containerRef} className=\"h-full overflow-y-auto px-4 py-6\">\n <div className=\"max-w-4xl mx-auto space-y-6\">\n {messages.map((message) => (\n <TurnBubble\n key={message.id}\n message={message}\n renderUserMessage={renderUserMessage}\n renderAssistantMessage={renderAssistantMessage}\n />\n ))}\n {isStreaming && streamingContent && (\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white\">\n AI\n </div>\n <div className=\"flex-1 max-w-[80%] rounded-2xl px-4 py-3 bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 shadow-sm\">\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n {streamingContent}\n <span className=\"inline-block w-2 h-4 ml-1 bg-primary-600 animate-pulse\" />\n </div>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n </div>\n <ScrollToBottomButton show={showScrollButton} onClick={scrollToBottom} />\n </div>\n )\n}\n","/**\n * MessageInput Component\n * Advanced input with file upload, drag-drop, keyboard shortcuts, and message queuing\n * Clean, professional design\n */\n\nimport { useState, useRef, useEffect, forwardRef, useImperativeHandle } from 'react'\nimport { Paperclip, PaperPlaneRight, X } from '@phosphor-icons/react'\nimport AttachmentGrid from './AttachmentGrid'\nimport { validateImageFile, validateFileCount, convertToBase64, createDataUrl } from '../utils/fileUtils'\nimport type { ImageAttachment, QueuedMessage } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\n\nexport interface MessageInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport interface MessageInputProps {\n message: string\n loading: boolean\n fetching?: boolean\n disabled?: boolean\n messageQueue?: QueuedMessage[]\n onMessageChange: (value: string) => void\n onSubmit: (e: React.FormEvent, attachments: ImageAttachment[]) => void\n onUnqueue?: () => { content: string; attachments: ImageAttachment[] } | null\n placeholder?: string\n maxFiles?: number\n maxFileSize?: number\n containerClassName?: string\n}\n\nconst MAX_FILES_DEFAULT = 10\nconst MAX_FILE_SIZE_DEFAULT = 20 * 1024 * 1024 // 20MB\nconst MAX_HEIGHT = 192 // 12 lines approx\n\nexport const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(\n (\n {\n message,\n loading,\n fetching = false,\n disabled = false,\n messageQueue = [],\n onMessageChange,\n onSubmit,\n onUnqueue,\n placeholder: placeholderOverride,\n maxFiles = MAX_FILES_DEFAULT,\n maxFileSize = MAX_FILE_SIZE_DEFAULT,\n containerClassName,\n },\n ref\n ) => {\n const { t } = useTranslation()\n const [attachments, setAttachments] = useState<ImageAttachment[]>([])\n const [isDragging, setIsDragging] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [isFocused, setIsFocused] = useState(false)\n\n // Use override or translation\n const placeholder = placeholderOverride || t('input.placeholder')\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useImperativeHandle(ref, () => ({\n focus: () => textareaRef.current?.focus(),\n clear: () => {\n onMessageChange('')\n setAttachments([])\n setError(null)\n }\n }))\n\n useEffect(() => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n textarea.style.height = 'auto'\n const newHeight = Math.min(textarea.scrollHeight, MAX_HEIGHT)\n textarea.style.height = `${newHeight}px`\n }, [message])\n\n useEffect(() => {\n if (!error) return\n const timer = setTimeout(() => setError(null), 5000)\n return () => clearTimeout(timer)\n }, [error])\n\n const handleFileSelect = async (files: FileList | null) => {\n if (!files || files.length === 0) return\n\n try {\n validateFileCount(attachments.length, files.length, maxFiles)\n\n const newAttachments: ImageAttachment[] = []\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]\n validateImageFile(file, maxFileSize)\n const base64Data = await convertToBase64(file)\n const preview = createDataUrl(base64Data, file.type)\n\n newAttachments.push({\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data,\n preview\n })\n }\n\n setAttachments((prev) => [...prev, ...newAttachments])\n setError(null)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to process files')\n }\n }\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFileSelect(e.target.files)\n e.target.value = ''\n }\n\n const handleRemoveAttachment = (index: number) => {\n setAttachments((prev) => prev.filter((_, i) => i !== index))\n setError(null)\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(true)\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n }\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n await handleFileSelect(e.dataTransfer.files)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (!loading && (message.trim() || attachments.length > 0)) {\n handleFormSubmit(e as unknown as React.FormEvent)\n }\n }\n\n if (e.key === 'Escape') {\n onMessageChange('')\n setAttachments([])\n setError(null)\n }\n\n if (e.key === 'ArrowUp' && !message.trim() && onUnqueue) {\n const unqueued = onUnqueue()\n if (unqueued) {\n onMessageChange(unqueued.content)\n setAttachments(unqueued.attachments)\n }\n }\n }\n\n const handleFormSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (loading || disabled || (!message.trim() && attachments.length === 0)) {\n return\n }\n\n onSubmit(e, attachments)\n setAttachments([])\n setError(null)\n }\n\n const canSubmit = !loading && !disabled && (message.trim() || attachments.length > 0)\n const defaultContainerClassName = \"shrink-0 p-4 pb-6\"\n\n return (\n <div\n ref={containerRef}\n className={containerClassName ?? defaultContainerClassName}\n >\n <form onSubmit={handleFormSubmit} className=\"max-w-4xl mx-auto\">\n {/* Error display */}\n {error && (\n <div className=\"mb-3 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg text-sm text-red-600 dark:text-red-400 flex items-center justify-between\">\n <span>{error}</span>\n <button\n type=\"button\"\n onClick={() => setError(null)}\n className=\"ml-2 p-1 hover:bg-red-100 dark:hover:bg-red-800 rounded transition-colors\"\n aria-label={t('input.dismissError')}\n >\n <X size={14} />\n </button>\n </div>\n )}\n\n {/* Queue badge */}\n {messageQueue.length > 0 && (\n <div className=\"mb-3 text-xs text-gray-500 dark:text-gray-400\">\n <span className=\"px-2.5 py-1 bg-primary-50 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 rounded font-medium\">\n {t('input.messagesQueued', { count: messageQueue.length })}\n </span>\n </div>\n )}\n\n {/* Attachment preview */}\n {attachments.length > 0 && (\n <div className=\"mb-3\">\n <AttachmentGrid attachments={attachments} onRemove={handleRemoveAttachment} />\n </div>\n )}\n\n {/* Input container with drag-drop */}\n <div\n className=\"relative\"\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Drag overlay */}\n {isDragging && (\n <div className=\"absolute inset-0 z-10 bg-primary-50/95 dark:bg-primary-900/90 border-2 border-dashed border-primary-400 rounded-2xl flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-800 flex items-center justify-center\">\n <Paperclip size={20} className=\"text-primary-600 dark:text-primary-400\" />\n </div>\n <span className=\"text-sm text-primary-700 dark:text-primary-300 font-medium\">\n {t('input.dropImages')}\n </span>\n </div>\n </div>\n )}\n\n {/* Input container - using inline Tailwind classes */}\n <div\n className={`flex items-center gap-2 rounded-2xl p-2.5 bg-white dark:bg-gray-800 border shadow-sm transition-all duration-150 ${\n isFocused\n ? 'border-primary-400 dark:border-primary-500 ring-3 ring-primary-500/10 dark:ring-primary-500/15'\n : 'border-gray-200 dark:border-gray-700'\n }`}\n >\n {/* Attach button */}\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={loading || disabled || attachments.length >= maxFiles}\n className=\"flex-shrink-0 self-center p-2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n aria-label={t('input.attachFiles')}\n title={t('input.attachImages')}\n >\n <Paperclip size={18} />\n </button>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n multiple\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-label=\"File input\"\n />\n\n {/* Textarea */}\n <div className=\"flex-1 self-stretch flex items-center\">\n <textarea\n ref={textareaRef}\n value={message}\n onChange={(e) => onMessageChange(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={placeholder}\n className=\"resize-none bg-transparent border-none outline-none px-1 py-2 w-full text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 text-[15px] leading-relaxed\"\n style={{ maxHeight: `${MAX_HEIGHT}px` }}\n rows={1}\n disabled={loading || disabled}\n aria-label=\"Message input\"\n />\n </div>\n\n {/* Send button - using inline Tailwind classes */}\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"flex-shrink-0 self-center p-2 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-primary-600\"\n aria-label={t('input.sendMessage')}\n >\n {loading ? (\n <div className=\"w-[18px] h-[18px] border-2 border-white/60 border-t-transparent rounded-full animate-spin\" />\n ) : (\n <PaperPlaneRight size={18} weight=\"fill\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Loading indicator */}\n {(loading || fetching) && (\n <div className=\"mt-3 flex items-center justify-center gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" />\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" style={{ animationDelay: '0.15s' }} />\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" style={{ animationDelay: '0.3s' }} />\n </div>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {loading ? t('input.aiThinking') : t('input.processing')}\n </span>\n </div>\n )}\n </form>\n </div>\n )\n }\n)\n\nMessageInput.displayName = 'MessageInput'\n","/**\n * WelcomeContent Component\n * Landing page shown when starting a new chat session\n * Clean, professional design for enterprise BI applications\n */\n\nimport { motion } from 'framer-motion'\nimport { ChartBar, FileText, Lightbulb, type Icon } from '@phosphor-icons/react'\n\ninterface ExamplePrompt {\n category: string\n icon: Icon\n text: string\n}\n\ninterface WelcomeContentProps {\n onPromptSelect?: (prompt: string) => void\n title?: string\n description?: string\n disabled?: boolean\n}\n\nconst EXAMPLE_PROMPTS: ExamplePrompt[] = [\n {\n category: 'Data Analysis',\n icon: ChartBar,\n text: 'Show me sales trends for the last quarter',\n },\n {\n category: 'Reports',\n icon: FileText,\n text: 'Generate a summary of customer feedback',\n },\n {\n category: 'Insights',\n icon: Lightbulb,\n text: 'What are the top performing products?',\n }\n]\n\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.08,\n delayChildren: 0.05\n }\n }\n}\n\nconst itemVariants = {\n hidden: { opacity: 0, y: 12 },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.3,\n ease: [0.4, 0, 0.2, 1]\n }\n }\n}\n\nexport default function WelcomeContent({\n onPromptSelect,\n title = 'Welcome to BiChat',\n description = 'Your intelligent business analytics assistant. Ask questions about your data, generate reports, or explore insights.',\n disabled = false\n}: WelcomeContentProps) {\n const handlePromptClick = (prompt: string) => {\n if (onPromptSelect && !disabled) {\n onPromptSelect(prompt)\n }\n }\n\n return (\n <motion.div\n className=\"w-full max-w-3xl mx-auto px-6 py-12 text-center\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {/* Title */}\n <motion.h1\n className=\"text-3xl sm:text-4xl font-semibold text-gray-900 dark:text-white mb-4\"\n variants={itemVariants}\n >\n {title}\n </motion.h1>\n\n {/* Description */}\n <motion.p\n className=\"text-base text-gray-500 dark:text-gray-400 mb-12 max-w-xl mx-auto leading-relaxed\"\n variants={itemVariants}\n >\n {description}\n </motion.p>\n\n {/* Example prompts */}\n <motion.div variants={itemVariants}>\n <p className=\"text-xs font-medium text-gray-400 dark:text-gray-500 uppercase tracking-wide mb-4\">\n Try asking\n </p>\n\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {EXAMPLE_PROMPTS.map((prompt, index) => (\n <motion.button\n key={index}\n onClick={() => handlePromptClick(prompt.text)}\n disabled={disabled}\n className=\"group flex flex-col items-start text-left p-5 rounded-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 shadow-sm hover:shadow-md hover:border-gray-300 dark:hover:border-gray-600 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-primary-500/50 focus:ring-offset-2 dark:focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed\"\n variants={itemVariants}\n whileHover={disabled ? {} : { y: -2 }}\n whileTap={disabled ? {} : { scale: 0.98 }}\n >\n {/* Icon */}\n <div className=\"w-9 h-9 rounded-lg bg-gray-100 dark:bg-gray-700 flex items-center justify-center mb-3\">\n <prompt.icon\n size={18}\n weight=\"regular\"\n className=\"text-gray-600 dark:text-gray-300\"\n />\n </div>\n\n {/* Category */}\n <span className=\"text-xs font-medium text-gray-400 dark:text-gray-500 mb-1.5\">\n {prompt.category}\n </span>\n\n {/* Prompt text */}\n <p className=\"text-sm text-gray-700 dark:text-gray-200 leading-relaxed\">\n {prompt.text}\n </p>\n </motion.button>\n ))}\n </div>\n </motion.div>\n </motion.div>\n )\n}\n","/**\n * Main ChatSession component\n * Composes ChatHeader, MessageList, and MessageInput\n *\n * Supports customization via slots:\n * - headerSlot: Custom content above the message list\n * - welcomeSlot: Replace the default welcome screen for new chats\n * - logoSlot: Custom logo in the header\n * - actionsSlot: Custom action buttons in the header\n */\n\nimport { ReactNode } from 'react'\nimport { ChatSessionProvider, useChat } from '../context/ChatContext'\nimport { ChatDataSource, Message } from '../types'\nimport { ChatHeader } from './ChatHeader'\nimport { MessageList } from './MessageList'\nimport { MessageInput } from './MessageInput'\nimport WelcomeContent from './WelcomeContent'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface ChatSessionProps {\n dataSource: ChatDataSource\n sessionId?: string\n isReadOnly?: boolean\n renderUserMessage?: (message: Message) => ReactNode\n renderAssistantMessage?: (message: Message) => ReactNode\n className?: string\n /** Custom content to display as header */\n headerSlot?: ReactNode\n /** Custom welcome screen component (replaces default WelcomeContent) */\n welcomeSlot?: ReactNode\n /** Custom logo for the header */\n logoSlot?: ReactNode\n /** Custom action buttons for the header */\n actionsSlot?: ReactNode\n /** Callback when user navigates back */\n onBack?: () => void\n}\n\nfunction ChatSessionCore({\n isReadOnly,\n renderUserMessage,\n renderAssistantMessage,\n className = '',\n headerSlot,\n welcomeSlot,\n logoSlot,\n actionsSlot,\n onBack,\n}: Omit<ChatSessionProps, 'dataSource' | 'sessionId'>) {\n const { t } = useTranslation()\n const {\n session,\n messages,\n fetching,\n error,\n message,\n setMessage,\n loading,\n handleSubmit,\n messageQueue,\n handleUnqueue,\n } = useChat()\n\n if (fetching) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500 dark:text-gray-400\">{t('input.processing')}</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-red-500 dark:text-red-400\">{t('error.generic')}: {error}</div>\n </div>\n )\n }\n\n // Show welcome screen for new sessions with no messages\n const showWelcome = !session && messages.length === 0\n\n const handlePromptSelect = (prompt: string) => {\n setMessage(prompt)\n }\n\n return (\n <main\n className={`flex-1 flex flex-col overflow-hidden min-h-0 bg-gray-50 dark:bg-gray-900 ${className}`}\n >\n {/* Header slot or default header */}\n {headerSlot || (\n <ChatHeader session={session} onBack={onBack} logoSlot={logoSlot} actionsSlot={actionsSlot} />\n )}\n\n {/* Welcome screen or message list */}\n {showWelcome ? (\n <div className=\"flex-1 flex items-center justify-center overflow-auto\">\n {welcomeSlot || <WelcomeContent onPromptSelect={handlePromptSelect} disabled={loading} />}\n </div>\n ) : (\n <MessageList\n renderUserMessage={renderUserMessage}\n renderAssistantMessage={renderAssistantMessage}\n />\n )}\n\n {/* Input area */}\n {!isReadOnly && (\n <MessageInput\n message={message}\n loading={loading}\n fetching={fetching}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n messageQueue={messageQueue}\n onUnqueue={handleUnqueue}\n />\n )}\n </main>\n )\n}\n\nexport function ChatSession(props: ChatSessionProps) {\n const { dataSource, sessionId, ...coreProps } = props\n\n return (\n <ChatSessionProvider dataSource={dataSource} sessionId={sessionId}>\n <ChatSessionCore {...coreProps} />\n </ChatSessionProvider>\n )\n}\n\nexport type { ChatSessionProps }\n","/**\n * BI-Chat UI Components\n * Main export file\n */\n\n// Import styles (will be bundled as style.css)\nimport './styles.css'\n\n// Components\nexport { ChatSession } from './components/ChatSession'\nexport { ChatHeader } from './components/ChatHeader'\nexport { MessageList } from './components/MessageList'\nexport { TurnBubble } from './components/TurnBubble'\nexport { UserTurnView } from './components/UserTurnView'\nexport { AssistantTurnView } from './components/AssistantTurnView'\nexport { MarkdownRenderer } from './components/MarkdownRenderer'\nexport { ChartCard } from './components/ChartCard'\nexport { SourcesPanel } from './components/SourcesPanel'\nexport { DownloadCard } from './components/DownloadCard'\nexport { InlineQuestionForm } from './components/InlineQuestionForm'\nexport { MessageInput, type MessageInputRef, type MessageInputProps } from './components/MessageInput'\nexport { default as AttachmentGrid } from './components/AttachmentGrid'\nexport { default as ImageModal } from './components/ImageModal'\nexport { default as WelcomeContent } from './components/WelcomeContent'\nexport { default as CodeOutputsPanel } from './components/CodeOutputsPanel'\nexport { default as StreamingCursor } from './components/StreamingCursor'\nexport { default as ScrollToBottomButton } from './components/ScrollToBottomButton'\nexport { default as EmptyState, type EmptyStateProps } from './components/EmptyState'\nexport { default as EditableText, type EditableTextProps, type EditableTextRef } from './components/EditableText'\nexport { default as SearchInput, type SearchInputProps } from './components/SearchInput'\nexport {\n default as Skeleton,\n SkeletonGroup,\n SkeletonText,\n SkeletonAvatar,\n SkeletonCard,\n ListItemSkeleton,\n type SkeletonProps,\n type SkeletonGroupProps,\n} from './components/Skeleton'\n\n// Animations\nexport * from './animations'\n\n// Context\nexport { ChatSessionProvider, useChat } from './context/ChatContext'\nexport { IotaContextProvider, useIotaContext, hasPermission } from './context/IotaContext'\nexport {\n ConfigProvider,\n useConfig,\n useRequiredConfig,\n hasPermission as hasConfigPermission,\n} from './config/ConfigContext'\n\n// Hooks\nexport { useStreaming } from './hooks/useStreaming'\nexport { useTranslation } from './hooks/useTranslation'\n\n// Theme\nexport { ThemeProvider, useTheme } from './theme/ThemeProvider'\nexport { lightTheme, darkTheme } from './theme/themes'\n\n// API utilities\nexport { getCSRFToken, addCSRFHeader, createHeadersWithCSRF } from './api/csrf'\n\n// Data sources\nexport { HttpDataSource, createHttpDataSource } from './data/HttpDataSource'\n\n// Utilities\nexport { RateLimiter } from './utils/RateLimiter'\nexport * from './utils/fileUtils'\n\n// Types\nexport type {\n Session,\n Message,\n ToolCall,\n Citation,\n Attachment,\n ImageAttachment,\n QueuedMessage,\n CodeOutput,\n ChartData,\n Artifact,\n PendingQuestion,\n QuestionAnswers,\n StreamChunk,\n ChatDataSource,\n ChatSessionContextValue,\n} from './types'\n\nexport type { Theme, ThemeColors, ThemeSpacing, ThemeBorderRadius } from './theme/types'\n\nexport type {\n UserContext,\n TenantContext,\n LocaleContext,\n AppConfig,\n IotaContext,\n} from './types/iota'\n\nexport type { BiChatConfig } from './config/ConfigContext'\nexport type { RateLimiterConfig } from './utils/RateLimiter'\nexport type { HttpDataSourceConfig } from './data/HttpDataSource'\n\n// Enums\nexport { MessageRole } from './types'\n\n// Styles (import separately)\n// import '@iota-uz/sdk/bichat/styles.css'\n","/**\n * Framer Motion animation variants for BiChat UI\n * Subtle, professional animations for enterprise applications\n * Respects prefers-reduced-motion for accessibility\n */\n\nconst prefersReducedMotion = () => {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/**\n * Fade in animation\n */\nexport const fadeInVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Fade in with subtle slide up\n */\nexport const fadeInUpVariants = {\n initial: { opacity: 0, y: 8 },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n y: 8,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Scale fade for modals and popups\n */\nexport const scaleFadeVariants = {\n initial: { opacity: 0, scale: 0.98 },\n animate: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.98,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.1,\n },\n },\n}\n\n/**\n * Modal backdrop\n */\nexport const backdropVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: 0.15,\n },\n },\n}\n\n/**\n * Button press feedback\n */\nexport const buttonVariants = {\n tap: {\n scale: 0.98,\n },\n}\n\n/**\n * Stagger container for lists\n */\nexport const staggerContainerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.03,\n delayChildren: 0.05,\n },\n },\n}\n\n/**\n * List item animation\n */\nexport const listItemVariants = {\n initial: { opacity: 0, x: -8 },\n animate: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.2 },\n },\n exit: {\n opacity: 0,\n x: -8,\n transition: { duration: 0.15 },\n },\n}\n\n/**\n * Message entrance animation\n */\nexport const messageVariants = {\n initial: {\n opacity: 0,\n y: 8,\n },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Container for staggered messages\n */\nexport const messageContainerVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n delayChildren: 0.05,\n },\n },\n}\n\n/**\n * Typing indicator dots\n */\nexport const typingDotVariants = {\n initial: { opacity: 0.4 },\n animate: {\n opacity: [0.4, 1, 0.4],\n transition: {\n duration: prefersReducedMotion() ? 0 : 1,\n repeat: Infinity,\n ease: 'easeInOut',\n },\n },\n}\n\n/**\n * Floating button (scroll to bottom, etc.)\n */\nexport const floatingButtonVariants = {\n initial: {\n opacity: 0,\n scale: 0.9,\n },\n animate: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.9,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Dropdown menu\n */\nexport const dropdownVariants = {\n initial: { opacity: 0, y: -4 },\n animate: {\n opacity: 1,\n y: 0,\n transition: { duration: prefersReducedMotion() ? 0 : 0.15 },\n },\n exit: {\n opacity: 0,\n y: -4,\n transition: { duration: 0.1 },\n },\n}\n\n/**\n * Toast notification\n */\nexport const toastVariants = {\n initial: { opacity: 0, y: -8 },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n y: -8,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n","/**\n * EmptyState Component\n * Reusable empty state display with icon, title, description, and action\n */\n\nimport { memo, type ReactNode } from 'react'\nimport { motion } from 'framer-motion'\nimport { fadeInVariants } from '../animations/variants'\n\nexport interface EmptyStateProps {\n /** Optional icon to display */\n icon?: ReactNode\n /** Main title text */\n title: string\n /** Optional description text */\n description?: string\n /** Optional action element (button, link, etc.) */\n action?: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-6 px-3',\n title: 'text-sm',\n description: 'text-xs',\n },\n md: {\n container: 'py-8 px-4',\n title: 'text-base',\n description: 'text-sm',\n },\n lg: {\n container: 'py-12 px-6',\n title: 'text-lg',\n description: 'text-base',\n },\n}\n\nfunction EmptyState({\n icon,\n title,\n description,\n action,\n className = '',\n size = 'md',\n}: EmptyStateProps) {\n const sizes = sizeClasses[size]\n\n return (\n <motion.div\n className={`flex items-center justify-center ${sizes.container} ${className}`}\n variants={fadeInVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n >\n <div className=\"text-center max-w-md\">\n {/* Icon */}\n {icon && (\n <motion.div\n className=\"mb-4 flex justify-center\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.4, delay: 0.1 }}\n >\n {icon}\n </motion.div>\n )}\n\n {/* Title */}\n <motion.h3\n className={`${sizes.title} font-medium text-gray-900 dark:text-white mb-2`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.2 }}\n >\n {title}\n </motion.h3>\n\n {/* Description */}\n {description && (\n <motion.p\n className={`${sizes.description} text-gray-500 dark:text-gray-400 mb-4`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.3 }}\n >\n {description}\n </motion.p>\n )}\n\n {/* Action */}\n {action && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.4 }}\n >\n {action}\n </motion.div>\n )}\n </div>\n </motion.div>\n )\n}\n\nexport default memo(EmptyState)\n","/**\n * EditableText Component\n * Inline editable text with double-click to edit\n * Features: auto-focus, auto-select, Enter to save, Escape to cancel\n * Can be triggered programmatically via ref.startEditing()\n */\n\nimport { useState, useRef, useEffect, useImperativeHandle, forwardRef, memo } from 'react'\nimport { CircleNotch } from '@phosphor-icons/react'\n\nexport interface EditableTextProps {\n /** Current text value */\n value: string\n /** Callback when text is saved */\n onSave: (newValue: string) => void\n /** Maximum character length */\n maxLength?: number\n /** Whether the component is in loading state */\n isLoading?: boolean\n /** Placeholder text when empty */\n placeholder?: string\n /** Additional CSS classes for the text display */\n className?: string\n /** Additional CSS classes for the input */\n inputClassName?: string\n /** Font size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport interface EditableTextRef {\n /** Programmatically start editing mode */\n startEditing: () => void\n /** Programmatically cancel editing */\n cancelEditing: () => void\n}\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n}\n\nconst EditableText = forwardRef<EditableTextRef, EditableTextProps>(\n (\n {\n value,\n onSave,\n maxLength = 100,\n isLoading = false,\n placeholder = 'Untitled',\n className = '',\n inputClassName = '',\n size = 'sm',\n },\n ref\n ) => {\n const [isEditing, setIsEditing] = useState(false)\n const [editValue, setEditValue] = useState(value)\n const inputRef = useRef<HTMLInputElement>(null)\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n startEditing: () => {\n if (!isLoading) {\n setIsEditing(true)\n }\n },\n cancelEditing: () => {\n setEditValue(value)\n setIsEditing(false)\n },\n }))\n\n // Update edit value when value prop changes\n useEffect(() => {\n setEditValue(value)\n }, [value])\n\n // Auto-focus and select when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [isEditing])\n\n const handleSave = () => {\n const trimmed = editValue.trim()\n\n // Don't save if empty - revert to original\n if (!trimmed) {\n setEditValue(value)\n setIsEditing(false)\n return\n }\n\n // Only call onSave if value actually changed\n if (trimmed !== value) {\n onSave(trimmed)\n }\n\n setIsEditing(false)\n }\n\n const handleCancel = () => {\n setEditValue(value)\n setIsEditing(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleSave()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n handleCancel()\n }\n }\n\n const handleDoubleClick = () => {\n if (!isLoading) {\n setIsEditing(true)\n }\n }\n\n const handleBlur = () => {\n handleSave()\n }\n\n const sizeClass = sizeClasses[size]\n\n if (isEditing) {\n return (\n <div\n className=\"flex items-center gap-2 flex-1\"\n onClick={(e) => e.preventDefault()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n maxLength={maxLength}\n placeholder={placeholder}\n className={`flex-1 px-2 py-1 ${sizeClass} bg-white dark:bg-gray-700 border border-primary-500 dark:border-primary-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/30 dark:focus:ring-primary-600/30 text-gray-900 dark:text-white ${inputClassName}`}\n aria-label=\"Edit text. Press Enter to save, Escape to cancel\"\n />\n </div>\n )\n }\n\n const displayValue = value || placeholder\n\n return (\n <span\n onDoubleClick={handleDoubleClick}\n className={`${sizeClass} font-medium truncate flex-1 cursor-pointer select-none hover:text-primary-600 dark:hover:text-primary-400 transition-colors ${className}`}\n title=\"Double-click to edit\"\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleDoubleClick()\n }\n }}\n >\n {isLoading ? (\n <span className=\"inline-flex items-center gap-2 text-gray-400 dark:text-gray-500\">\n <CircleNotch size={12} className=\"animate-spin\" />\n <span className=\"italic\">{displayValue}</span>\n </span>\n ) : (\n <span className={!value ? 'text-gray-400 dark:text-gray-500 italic' : ''}>\n {displayValue}\n </span>\n )}\n </span>\n )\n }\n)\n\nEditableText.displayName = 'EditableText'\n\nexport default memo(EditableText)\n","/**\n * SearchInput Component\n * Reusable search input with icon, clear button, and keyboard shortcuts\n */\n\nimport { useEffect, useRef, memo, type KeyboardEvent } from 'react'\nimport { MagnifyingGlass, X } from '@phosphor-icons/react'\n\nexport interface SearchInputProps {\n /** Current search value */\n value: string\n /** Callback when value changes */\n onChange: (value: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Auto-focus on mount */\n autoFocus?: boolean\n /** Callback when Enter is pressed */\n onSubmit?: (value: string) => void\n /** Callback when Escape is pressed */\n onEscape?: () => void\n /** Additional CSS classes for the container */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Disable the input */\n disabled?: boolean\n /** ARIA label for accessibility */\n ariaLabel?: string\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-1.5 pl-8 pr-8 text-xs',\n icon: 14,\n clearBtn: 'p-1',\n },\n md: {\n container: 'py-2.5 pl-10 pr-10 text-sm',\n icon: 16,\n clearBtn: 'p-1.5',\n },\n lg: {\n container: 'py-3 pl-12 pr-12 text-base',\n icon: 18,\n clearBtn: 'p-2',\n },\n}\n\nfunction SearchInput({\n value,\n onChange,\n placeholder = 'Search...',\n autoFocus = false,\n onSubmit,\n onEscape,\n className = '',\n size = 'md',\n disabled = false,\n ariaLabel = 'Search',\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const sizes = sizeClasses[size]\n\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus()\n }\n }, [autoFocus])\n\n const handleClear = () => {\n onChange('')\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onSubmit) {\n e.preventDefault()\n onSubmit(value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n if (value && !onEscape) {\n // Default behavior: clear on Escape if no handler provided\n handleClear()\n } else if (onEscape) {\n onEscape()\n }\n }\n }\n\n return (\n <div className={`relative w-full ${className}`} role=\"search\">\n {/* Search Icon */}\n <span className=\"absolute inset-y-0 left-3 flex items-center pointer-events-none\">\n <MagnifyingGlass\n size={sizes.icon}\n weight=\"bold\"\n className=\"text-gray-400 dark:text-gray-500\"\n aria-hidden=\"true\"\n />\n </span>\n\n {/* Input Field */}\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={`w-full ${sizes.container} bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700/50 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary-500/30 dark:focus:ring-primary-500/20 focus:border-primary-400 dark:focus:border-primary-600 text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed`}\n aria-label={ariaLabel}\n />\n\n {/* Clear Button */}\n {value && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className={`absolute inset-y-0 right-2 flex items-center ${sizes.clearBtn} rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700 transition-all duration-200 text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300`}\n aria-label=\"Clear search\"\n title=\"Clear search\"\n >\n <X size={sizes.icon - 2} weight=\"bold\" />\n </button>\n )}\n </div>\n )\n}\n\nexport default memo(SearchInput)\n","/**\n * Skeleton Component\n * Reusable loading skeleton with multiple variants\n */\n\nimport { memo } from 'react'\n\nexport interface SkeletonProps {\n /** Skeleton variant */\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded'\n /** Width (CSS value or number for pixels) */\n width?: string | number\n /** Height (CSS value or number for pixels) */\n height?: string | number\n /** Additional CSS classes */\n className?: string\n /** Enable animation */\n animate?: boolean\n}\n\nexport interface SkeletonGroupProps {\n /** Number of skeleton items to render */\n count?: number\n /** Gap between items */\n gap?: 'sm' | 'md' | 'lg'\n /** Additional CSS classes for the container */\n className?: string\n /** Render function for each skeleton item */\n children?: (index: number) => React.ReactNode\n}\n\nconst variantClasses = {\n text: 'rounded',\n circular: 'rounded-full',\n rectangular: 'rounded-none',\n rounded: 'rounded-lg',\n}\n\nconst gapClasses = {\n sm: 'space-y-1',\n md: 'space-y-2',\n lg: 'space-y-3',\n}\n\nfunction Skeleton({\n variant = 'text',\n width,\n height,\n className = '',\n animate = true,\n}: SkeletonProps) {\n const variantClass = variantClasses[variant]\n\n const style: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n }\n\n return (\n <div\n className={`bg-gray-200 dark:bg-gray-700 ${variantClass} ${animate ? 'animate-pulse' : ''} ${className}`}\n style={style}\n aria-hidden=\"true\"\n />\n )\n}\n\n/**\n * SkeletonGroup - Renders multiple skeleton items\n */\nexport function SkeletonGroup({\n count = 3,\n gap = 'md',\n className = '',\n children,\n}: SkeletonGroupProps) {\n const gapClass = gapClasses[gap]\n\n return (\n <div className={`${gapClass} ${className}`} aria-hidden=\"true\">\n {Array.from({ length: count }).map((_, index) =>\n children ? (\n <div key={index}>{children(index)}</div>\n ) : (\n <Skeleton key={index} variant=\"text\" height={16} />\n )\n )}\n </div>\n )\n}\n\n/**\n * SkeletonText - Text line skeleton with configurable width\n */\nexport function SkeletonText({\n lines = 1,\n className = '',\n}: {\n lines?: number\n className?: string\n}) {\n const widths = ['100%', '90%', '80%', '95%', '85%']\n\n return (\n <div className={`space-y-2 ${className}`} aria-hidden=\"true\">\n {Array.from({ length: lines }).map((_, index) => (\n <Skeleton\n key={index}\n variant=\"text\"\n width={widths[index % widths.length]}\n height={14}\n />\n ))}\n </div>\n )\n}\n\n/**\n * SkeletonAvatar - Circular avatar skeleton\n */\nexport function SkeletonAvatar({\n size = 40,\n className = '',\n}: {\n size?: number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"circular\"\n width={size}\n height={size}\n className={className}\n />\n )\n}\n\n/**\n * SkeletonCard - Card-shaped skeleton\n */\nexport function SkeletonCard({\n width,\n height = 120,\n className = '',\n}: {\n width?: string | number\n height?: string | number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"rounded\"\n width={width}\n height={height}\n className={className}\n />\n )\n}\n\n/**\n * ListItemSkeleton - Common list item skeleton with icon and text\n */\nexport function ListItemSkeleton({ className = '' }: { className?: string }) {\n return (\n <div className={`flex items-center gap-3 px-3 py-2 ${className}`}>\n <Skeleton variant=\"rounded\" width={20} height={20} />\n <Skeleton variant=\"text\" height={16} className=\"flex-1\" />\n </div>\n )\n}\n\nexport default memo(Skeleton)\n","/**\n * Configuration context provider for BiChat\n * Provides props-based configuration with optional window global fallback\n */\n\nimport { createContext, useContext, ReactNode } from 'react'\n\nexport interface BiChatConfig {\n user: {\n id: string\n email: string\n firstName: string\n lastName: string\n permissions: string[]\n }\n tenant: {\n id: string\n name: string\n }\n locale: {\n language: string\n translations: Record<string, string>\n }\n endpoints: {\n graphQL: string\n stream: string\n }\n csrfToken?: string\n}\n\nconst ConfigContext = createContext<BiChatConfig | null>(null)\n\ninterface ConfigProviderProps {\n config?: BiChatConfig\n useGlobalConfig?: boolean\n children: ReactNode\n}\n\n/**\n * ConfigProvider component\n * Provides configuration to the BiChat library\n *\n * @param config - Configuration object (preferred method)\n * @param useGlobalConfig - If true, falls back to window.__BICHAT_CONTEXT__ when config is not provided\n * @param children - React children\n */\nexport function ConfigProvider({ config, useGlobalConfig = false, children }: ConfigProviderProps) {\n let resolvedConfig: BiChatConfig | null = null\n\n if (config) {\n resolvedConfig = config\n } else if (useGlobalConfig && typeof window !== 'undefined') {\n const globalContext = (window as any).__BICHAT_CONTEXT__\n const globalCSRF = (window as any).__CSRF_TOKEN__\n\n if (globalContext) {\n resolvedConfig = {\n user: {\n id: String(globalContext.user?.id || ''),\n email: globalContext.user?.email || '',\n firstName: globalContext.user?.firstName || '',\n lastName: globalContext.user?.lastName || '',\n permissions: globalContext.user?.permissions || [],\n },\n tenant: {\n id: globalContext.tenant?.id || '',\n name: globalContext.tenant?.name || '',\n },\n locale: {\n language: globalContext.locale?.language || 'en',\n translations: globalContext.locale?.translations || {},\n },\n endpoints: {\n graphQL: globalContext.config?.graphQLEndpoint || '/graphql',\n stream: globalContext.config?.streamEndpoint || '/stream',\n },\n csrfToken: globalCSRF,\n }\n }\n }\n\n return (\n <ConfigContext.Provider value={resolvedConfig}>\n {children}\n </ConfigContext.Provider>\n )\n}\n\n/**\n * Hook to access BiChat configuration\n * Returns null if no configuration is available\n */\nexport function useConfig(): BiChatConfig | null {\n return useContext(ConfigContext)\n}\n\n/**\n * Hook to access BiChat configuration (required)\n * Throws an error if configuration is not available\n */\nexport function useRequiredConfig(): BiChatConfig {\n const config = useContext(ConfigContext)\n if (!config) {\n throw new Error(\n 'BiChat configuration not found. ' +\n 'Wrap your app with <ConfigProvider config={...}> or use useGlobalConfig={true}.'\n )\n }\n return config\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(config: BiChatConfig | null, permission: string): boolean {\n if (!config) {\n return false\n }\n return config.user.permissions.includes(permission)\n}\n","/**\n * useStreaming hook\n * Handles AsyncGenerator streaming responses with cancellation support\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { StreamChunk } from '../types'\n\ninterface UseStreamingOptions {\n onChunk?: (content: string) => void\n onError?: (error: string) => void\n onDone?: () => void\n}\n\nexport function useStreaming(options: UseStreamingOptions = {}) {\n const [content, setContent] = useState('')\n const [isStreaming, setIsStreaming] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n const processStream = useCallback(\n async (stream: AsyncGenerator<StreamChunk>, signal?: AbortSignal) => {\n setIsStreaming(true)\n setError(null)\n setContent('')\n\n // Create abort controller for this stream\n abortControllerRef.current = new AbortController()\n\n // Link external signal if provided\n if (signal) {\n signal.addEventListener('abort', () => {\n abortControllerRef.current?.abort()\n })\n }\n\n try {\n for await (const chunk of stream) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break\n }\n\n if (chunk.type === 'chunk' && chunk.content) {\n setContent((prev) => {\n const newContent = prev + chunk.content\n options.onChunk?.(newContent)\n return newContent\n })\n } else if (chunk.type === 'error') {\n const errorMsg = chunk.error || 'Stream error'\n const err = new Error(errorMsg)\n setError(err)\n options.onError?.(errorMsg)\n break\n } else if (chunk.type === 'done') {\n options.onDone?.()\n break\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n // Stream was cancelled - this is expected\n return\n }\n\n const errorObj = err instanceof Error ? err : new Error('Unknown error')\n setError(errorObj)\n options.onError?.(errorObj.message)\n } finally {\n setIsStreaming(false)\n abortControllerRef.current = null\n }\n },\n [options]\n )\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n setIsStreaming(false)\n }\n }, [])\n\n const reset = useCallback(() => {\n setContent('')\n setError(null)\n setIsStreaming(false)\n }, [])\n\n return {\n content,\n isStreaming,\n error,\n processStream,\n cancel,\n reset,\n }\n}\n","/**\n * Predefined theme configurations\n */\n\nimport { Theme } from './types'\n\nexport const lightTheme: Theme = {\n name: 'light',\n colors: {\n background: '#ffffff',\n surface: '#f9fafb',\n primary: '#3b82f6',\n secondary: '#6b7280',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n success: '#10b981',\n warning: '#f59e0b',\n userBubble: '#3b82f6',\n assistantBubble: '#f3f4f6',\n userText: '#ffffff',\n assistantText: '#111827',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n}\n\nexport const darkTheme: Theme = {\n name: 'dark',\n colors: {\n background: '#111827',\n surface: '#1f2937',\n primary: '#60a5fa',\n secondary: '#9ca3af',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n success: '#34d399',\n warning: '#fbbf24',\n userBubble: '#2563eb',\n assistantBubble: '#1f2937',\n userText: '#f9fafb',\n assistantText: '#f9fafb',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n}\n","/**\n * Theme provider component and hook\n * Manages theme state and applies CSS variables to document root\n */\n\nimport { createContext, useContext, useEffect, useMemo, ReactNode } from 'react'\nimport { Theme } from './types'\nimport { lightTheme, darkTheme } from './themes'\n\ninterface ThemeContextValue {\n theme: Theme\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nexport interface ThemeProviderProps {\n theme?: Theme | 'light' | 'dark' | 'system'\n children: ReactNode\n}\n\n/**\n * Detect system theme preference\n */\nfunction getSystemTheme(): Theme {\n if (typeof window === 'undefined') {\n return lightTheme\n }\n\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n return prefersDark ? darkTheme : lightTheme\n}\n\n/**\n * Resolve theme prop to Theme object\n */\nfunction resolveTheme(themeProp: Theme | 'light' | 'dark' | 'system'): Theme {\n if (typeof themeProp === 'object') {\n return themeProp\n }\n\n switch (themeProp) {\n case 'light':\n return lightTheme\n case 'dark':\n return darkTheme\n case 'system':\n return getSystemTheme()\n default:\n return lightTheme\n }\n}\n\n/**\n * Apply theme CSS variables to document root\n */\nfunction applyThemeVariables(theme: Theme): void {\n if (typeof document === 'undefined') {\n return\n }\n\n const root = document.documentElement\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-${key}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-radius-${key}`, value)\n })\n}\n\n/**\n * Theme provider component\n * Wraps the application and provides theme context\n */\nexport function ThemeProvider({ theme = 'system', children }: ThemeProviderProps) {\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme])\n\n useEffect(() => {\n applyThemeVariables(resolvedTheme)\n }, [resolvedTheme])\n\n // Listen for system theme changes when using 'system'\n useEffect(() => {\n if (theme !== 'system') {\n return\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = () => {\n const newTheme = getSystemTheme()\n applyThemeVariables(newTheme)\n }\n\n mediaQuery.addEventListener('change', handleChange)\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange)\n }\n }, [theme])\n\n const value: ThemeContextValue = {\n theme: resolvedTheme,\n }\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n\n/**\n * Hook to access current theme\n */\nexport function useTheme(): Theme {\n const context = useContext(ThemeContext)\n\n if (!context) {\n throw new Error('useTheme must be used within ThemeProvider')\n }\n\n return context.theme\n}\n","/**\n * CSRF token management for API requests\n */\n\n/**\n * Get CSRF token from window object\n * @returns CSRF token string\n */\nexport function getCSRFToken(): string {\n const token = window.__CSRF_TOKEN__\n if (!token) {\n console.warn('CSRF token not found in window object')\n return ''\n }\n return token\n}\n\n/**\n * Add CSRF token to request headers\n * @param headers - Headers object to modify\n * @returns Modified headers object\n */\nexport function addCSRFHeader(headers: Headers): Headers {\n const token = getCSRFToken()\n if (token) {\n headers.set('X-CSRF-Token', token)\n }\n return headers\n}\n\n/**\n * Create headers with CSRF token\n * @param init - Optional initial headers\n * @returns Headers object with CSRF token\n */\nexport function createHeadersWithCSRF(init?: HeadersInit): Headers {\n const headers = new Headers(init)\n return addCSRFHeader(headers)\n}\n","/**\n * Built-in HTTP data source with SSE streaming and AbortController\n * Implements ChatDataSource interface with real HTTP/GraphQL calls\n */\n\nimport type {\n ChatDataSource,\n Session,\n Message,\n PendingQuestion,\n Attachment,\n StreamChunk,\n QuestionAnswers,\n} from '../types'\n\nexport interface HttpDataSourceConfig {\n baseUrl: string\n graphQLEndpoint?: string\n streamEndpoint?: string\n csrfToken?: string | (() => string)\n headers?: Record<string, string>\n timeout?: number\n}\n\ninterface SessionState {\n session: Session\n messages: Message[]\n pendingQuestion?: PendingQuestion | null\n}\n\ninterface Result<T> {\n success: boolean\n data?: T\n error?: string\n}\n\nexport class HttpDataSource implements ChatDataSource {\n private config: HttpDataSourceConfig\n private abortController: AbortController | null = null\n\n constructor(config: HttpDataSourceConfig) {\n this.config = {\n graphQLEndpoint: '/graphql',\n streamEndpoint: '/stream',\n timeout: 30000,\n ...config,\n }\n }\n\n /**\n * Get CSRF token from config\n */\n private getCSRFToken(): string {\n if (!this.config.csrfToken) {\n return ''\n }\n return typeof this.config.csrfToken === 'function'\n ? this.config.csrfToken()\n : this.config.csrfToken\n }\n\n /**\n * Create headers for HTTP requests\n */\n private createHeaders(additionalHeaders?: Record<string, string>): Headers {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...this.config.headers,\n ...additionalHeaders,\n })\n\n const csrfToken = this.getCSRFToken()\n if (csrfToken) {\n headers.set('X-CSRF-Token', csrfToken)\n }\n\n return headers\n }\n\n /**\n * Execute GraphQL query\n */\n private async graphql<T>(query: string, variables?: Record<string, any>): Promise<T> {\n const url = `${this.config.baseUrl}${this.config.graphQLEndpoint}`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.createHeaders(),\n body: JSON.stringify({ query, variables }),\n signal: this.abortController?.signal,\n })\n\n if (!response.ok) {\n throw new Error(`GraphQL request failed: ${response.statusText}`)\n }\n\n const result = await response.json()\n\n if (result.errors && result.errors.length > 0) {\n throw new Error(result.errors[0].message || 'GraphQL error')\n }\n\n return result.data\n }\n\n /**\n * Create a new chat session\n */\n async createSession(): Promise<Session> {\n const query = `\n mutation CreateChatSession {\n createChatSession {\n id\n title\n status\n pinned\n createdAt\n updatedAt\n }\n }\n `\n\n const data = await this.graphql<{ createChatSession: Session }>(query)\n return data.createChatSession\n }\n\n /**\n * Fetch an existing session with messages\n */\n async fetchSession(id: string): Promise<SessionState | null> {\n const query = `\n query GetChatSession($id: ID!) {\n chatSession(id: $id) {\n session {\n id\n title\n status\n pinned\n createdAt\n updatedAt\n }\n messages {\n id\n sessionId\n role\n content\n createdAt\n toolCalls {\n id\n name\n arguments\n }\n citations {\n id\n source\n url\n excerpt\n }\n chartData {\n type\n title\n data\n xAxisKey\n yAxisKey\n }\n artifacts {\n type\n filename\n url\n sizeReadable\n rowCount\n description\n }\n explanation\n }\n pendingQuestion {\n id\n turnId\n question\n type\n options\n status\n }\n }\n }\n `\n\n try {\n const data = await this.graphql<{ chatSession: SessionState | null }>(query, { id })\n return data.chatSession\n } catch (err) {\n console.error('Failed to fetch session:', err)\n return null\n }\n }\n\n /**\n * Send a message and stream the response using SSE\n */\n async *sendMessage(\n sessionId: string,\n content: string,\n attachments: Attachment[] = [],\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk> {\n // Create new abort controller for this stream\n this.abortController = new AbortController()\n\n // Link external signal if provided\n if (signal) {\n signal.addEventListener('abort', () => {\n this.abortController?.abort()\n })\n }\n\n const url = `${this.config.baseUrl}${this.config.streamEndpoint}`\n\n const payload = {\n sessionId,\n content,\n attachments: attachments.map(a => ({\n id: a.id,\n filename: a.filename,\n mimeType: a.mimeType,\n sizeBytes: a.sizeBytes,\n base64Data: a.base64Data,\n })),\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.createHeaders(),\n body: JSON.stringify(payload),\n signal: this.abortController.signal,\n })\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`)\n }\n\n if (!response.body) {\n throw new Error('Response body is null')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n break\n }\n\n buffer += decoder.decode(value, { stream: true })\n\n // Process SSE events in buffer\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) {\n continue\n }\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n\n try {\n const chunk = JSON.parse(data) as StreamChunk\n yield chunk\n\n // Stop if done or error\n if (chunk.type === 'done' || chunk.type === 'error') {\n return\n }\n } catch (parseErr) {\n console.error('Failed to parse SSE data:', parseErr)\n yield {\n type: 'error',\n error: 'Failed to parse stream data',\n }\n return\n }\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n } catch (err) {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n yield {\n type: 'error',\n error: 'Stream cancelled',\n }\n } else {\n yield {\n type: 'error',\n error: err.message,\n }\n }\n } else {\n yield {\n type: 'error',\n error: 'Unknown error',\n }\n }\n } finally {\n this.abortController = null\n }\n }\n\n /**\n * Cancel ongoing stream\n */\n cancelStream(): void {\n if (this.abortController) {\n this.abortController.abort()\n this.abortController = null\n }\n }\n\n /**\n * Submit answers to a pending question\n */\n async submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<Result<void>> {\n const query = `\n mutation SubmitQuestionAnswers($sessionId: ID!, $questionId: ID!, $answers: JSON!) {\n submitQuestionAnswers(sessionId: $sessionId, questionId: $questionId, answers: $answers) {\n success\n error\n }\n }\n `\n\n try {\n const data = await this.graphql<{\n submitQuestionAnswers: Result<void>\n }>(query, { sessionId, questionId, answers })\n\n return data.submitQuestionAnswers\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to submit answers',\n }\n }\n }\n\n /**\n * Cancel a pending question\n */\n async cancelPendingQuestion(questionId: string): Promise<Result<void>> {\n const query = `\n mutation CancelPendingQuestion($questionId: ID!) {\n cancelPendingQuestion(questionId: $questionId) {\n success\n error\n }\n }\n `\n\n try {\n const data = await this.graphql<{\n cancelPendingQuestion: Result<void>\n }>(query, { questionId })\n\n return data.cancelPendingQuestion\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to cancel question',\n }\n }\n }\n\n /**\n * Navigate to a session (optional, for SPA routing)\n */\n navigateToSession?(sessionId: string): void {\n // Default implementation - can be overridden\n if (typeof window !== 'undefined') {\n window.location.href = `/chat/${sessionId}`\n }\n }\n}\n\n/**\n * Factory function to create HttpDataSource\n */\nexport function createHttpDataSource(config: HttpDataSourceConfig): ChatDataSource {\n return new HttpDataSource(config)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../ui/src/bichat/utils/citationProcessor.ts","../../ui/src/bichat/components/TableExportButton.tsx","../../ui/src/bichat/components/TableWithExport.tsx","../../ui/src/bichat/components/CodeBlock.tsx","../../ui/src/bichat/components/MarkdownRenderer.tsx","../../ui/src/bichat/utils/RateLimiter.ts","../../ui/src/bichat/context/ChatContext.tsx","../../ui/src/bichat/context/IotaContext.tsx","../../ui/src/bichat/locales/defaults.ts","../../ui/src/bichat/hooks/useTranslation.ts","../../ui/src/bichat/hooks/useBranding.ts","../../ui/src/bichat/components/ChatHeader.tsx","../../ui/src/bichat/utils/fileUtils.ts","../../ui/src/bichat/components/AttachmentGrid.tsx","../../ui/src/bichat/hooks/useModalLock.ts","../../ui/src/bichat/hooks/useFocusTrap.ts","../../ui/src/bichat/components/LoadingSpinner.tsx","../../ui/src/bichat/components/ImageModal.tsx","../../ui/src/bichat/components/UserMessage.tsx","../../ui/src/bichat/components/UserTurnView.tsx","../../ui/src/bichat/components/CodeOutputsPanel.tsx","../../ui/src/bichat/components/StreamingCursor.tsx","../../ui/src/bichat/components/ChartCard.tsx","../../ui/src/bichat/components/SourcesPanel.tsx","../../ui/src/bichat/components/DownloadCard.tsx","../../ui/src/bichat/components/InlineQuestionForm.tsx","../../ui/src/bichat/components/AssistantMessage.tsx","../../ui/src/bichat/components/AssistantTurnView.tsx","../../ui/src/bichat/components/TurnBubble.tsx","../../ui/src/bichat/components/ScrollToBottomButton.tsx","../../ui/src/bichat/components/MessageList.tsx","../../ui/src/bichat/components/MessageInput.tsx","../../ui/src/bichat/components/WelcomeContent.tsx","../../ui/src/bichat/components/ChatSession.tsx","../../ui/src/bichat/index.ts","../../ui/src/bichat/animations/variants.ts","../../ui/src/bichat/components/EmptyState.tsx","../../ui/src/bichat/components/EditableText.tsx","../../ui/src/bichat/components/SearchInput.tsx","../../ui/src/bichat/components/Skeleton.tsx","../../ui/src/bichat/components/Toast.tsx","../../ui/src/bichat/components/ToastContainer.tsx","../../ui/src/bichat/components/ConfirmModal.tsx","../../ui/src/bichat/components/UserAvatar.tsx","../../ui/src/bichat/components/PermissionGuard.tsx","../../ui/src/bichat/components/ErrorBoundary.tsx","../../ui/src/bichat/components/TypingIndicator.tsx","../../ui/src/bichat/primitives/Slot.tsx","../../ui/src/bichat/primitives/Turn.tsx","../../ui/src/bichat/primitives/Avatar.tsx","../../ui/src/bichat/primitives/Bubble.tsx","../../ui/src/bichat/primitives/ActionButton.tsx","../../ui/src/bichat/hooks/useStreaming.ts","../../ui/src/bichat/hooks/useToast.ts","../../ui/src/bichat/hooks/useImageGallery.ts","../../ui/src/bichat/hooks/useAutoScroll.ts","../../ui/src/bichat/hooks/useMessageActions.ts","../../ui/src/bichat/hooks/useAttachments.ts","../../ui/src/bichat/hooks/useMarkdownCopy.ts","../../ui/src/bichat/config/ConfigContext.tsx","../../ui/src/bichat/theme/themes.ts","../../ui/src/bichat/theme/ThemeProvider.tsx","../../ui/src/bichat/api/csrf.ts","../../ui/src/bichat/data/HttpDataSource.ts","../../ui/src/bichat/types/index.ts"],"names":["memo","TableExportButton","jsxs","jsx","TableWithExport","useCallback","Fragment","useState","useRef","useEffect","Copy","SyntaxHighlighter","useMemo","CodeBlock","createContext","useContext","focusableElements","sizeClasses","gapClasses","X","Download","isMultiSelect","CaretLeft","CaretRight","MarkdownRenderer","lazy","defaultClassNames","mergeClassNames","formatDistanceToNow","Suspense","motion","forwardRef","useImperativeHandle","CircleNotch","AnimatePresence","hasPermission","prefersReducedMotion","generateId","fileArray","removed","MessageRole"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Citation Processing Utility\n *\n * Transforms OpenAI citations from raw markers (e.g., ≡cite≡turn0search2≡)\n * to formatted inline citation markers (e.g., [1], [2]).\n *\n * Process:\n * 1. Sort citations by startIndex (descending) to process from end to start\n * 2. Replace character ranges [startIndex, endIndex] with numbered markers\n * 3. Return processed content with clean inline citation references\n */\n\nimport type { Citation } from '../types'\n\nexport interface ProcessedContent {\n /** Content with citation markers replaced by [1], [2], etc. */\n content: string\n /** Citations array with their display indices */\n citations: Array<Citation & { displayIndex: number }>\n}\n\n/**\n * Process message content to replace raw citation markers with formatted inline citations\n *\n * @param content - Raw message content with potential citation markers\n * @param citations - Array of citations with startIndex/endIndex positions\n * @returns Processed content with clean citation markers and indexed citations\n *\n * @example\n * ```ts\n * const result = processCitations(\n * \"Tesla reported $28B ≡cite≡turn0search2≡ revenue\",\n * [{ startIndex: 20, endIndex: 42, title: \"...\", url: \"...\", type: \"url_citation\" }]\n * )\n * // result.content = \"Tesla reported $28B [1] revenue\"\n * // result.citations = [{ ..., displayIndex: 1 }]\n * ```\n */\nexport function processCitations(\n content: string,\n citations: Citation[] | null | undefined\n): ProcessedContent {\n // If no citations, return content as-is\n if (!citations || citations.length === 0) {\n return { content, citations: [] }\n }\n\n // Sort citations by startIndex (descending) to process from end to start\n // This prevents index shifting issues when replacing text\n const sortedCitations = [...citations].sort((a, b) => b.startIndex - a.startIndex)\n\n let processedContent = content\n const processedCitations: Array<Citation & { displayIndex: number }> = []\n\n // Process each citation from end to start\n sortedCitations.forEach((citation, index) => {\n const { startIndex, endIndex } = citation\n\n // Validate indices\n if (startIndex < 0 || endIndex > processedContent.length || startIndex >= endIndex) {\n console.warn('[citationProcessor] Invalid citation indices:', {\n startIndex,\n endIndex,\n contentLength: processedContent.length,\n })\n return\n }\n\n // Calculate display index (1-based, in original order)\n const displayIndex = citations.length - index\n\n // Replace the citation marker range with [N]\n const before = processedContent.slice(0, startIndex)\n const after = processedContent.slice(endIndex)\n processedContent = `${before}[${displayIndex}]${after}`\n\n // Store citation with its display index\n processedCitations.unshift({\n ...citation,\n displayIndex,\n })\n })\n\n return {\n content: processedContent,\n citations: processedCitations,\n }\n}\n","/**\n * TableExportButton Component\n * Small inline button for exporting markdown tables to Excel\n */\n\nimport { memo } from 'react'\nimport { FileXls } from '@phosphor-icons/react'\n\ninterface TableExportButtonProps {\n /** Click handler for export action */\n onClick: () => void\n /** Whether the button should be disabled */\n disabled?: boolean\n /** Export button label (defaults to \"Export\") */\n label?: string\n /** Disabled tooltip text */\n disabledTooltip?: string\n}\n\nexport const TableExportButton = memo(function TableExportButton({\n onClick,\n disabled = false,\n label = 'Export',\n disabledTooltip = 'Please wait...',\n}: TableExportButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-green-600 dark:text-green-500 opacity-60 hover:opacity-90 disabled:opacity-30 disabled:cursor-not-allowed transition-opacity\"\n aria-label={label}\n title={disabled ? disabledTooltip : label}\n >\n <FileXls size={16} weight=\"fill\" />\n <span>{label}</span>\n </button>\n )\n})\n","/**\n * TableWithExport Component\n * Wraps markdown tables with an export button that sends a message to export the table\n */\n\nimport { memo, useCallback, type ReactNode } from 'react'\nimport { TableExportButton } from './TableExportButton'\n\n/** Default message sent when user clicks the export button */\nconst DEFAULT_EXPORT_MESSAGE = 'Export the table above to Excel'\n\ninterface TableWithExportProps {\n /** The table content to render */\n children: ReactNode\n /** Function to send a message (from chat context) */\n sendMessage?: (content: string) => void\n /** Whether sending is disabled (loading or streaming) */\n disabled?: boolean\n /** Custom export message to send */\n exportMessage?: string\n /** Export button label */\n exportLabel?: string\n}\n\nexport const TableWithExport = memo(function TableWithExport({\n children,\n sendMessage,\n disabled = false,\n exportMessage = DEFAULT_EXPORT_MESSAGE,\n exportLabel = 'Export',\n}: TableWithExportProps) {\n const handleExport = useCallback(() => {\n sendMessage?.(exportMessage)\n }, [sendMessage, exportMessage])\n\n return (\n <>\n <div className=\"markdown-table-wrapper overflow-x-auto\">\n <table className=\"markdown-table w-full border-collapse\">{children}</table>\n </div>\n {sendMessage && (\n <div className=\"flex justify-end mt-1\">\n <TableExportButton onClick={handleExport} disabled={disabled} label={exportLabel} />\n </div>\n )}\n </>\n )\n})\n","/**\n * CodeBlock Component\n * Syntax highlighted code blocks with copy functionality and dark mode support\n */\n\nimport { useState, useEffect, useRef, memo } from 'react'\nimport { Copy, Check } from '@phosphor-icons/react'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { vscDarkPlus, vs } from 'react-syntax-highlighter/dist/esm/styles/prism'\n\ninterface CodeBlockProps {\n /** Programming language for syntax highlighting */\n language: string\n /** Code content to display */\n value: string\n /** Whether to render as inline code */\n inline?: boolean\n /** Copy button label (defaults to \"Copy\") */\n copyLabel?: string\n /** Copied confirmation label (defaults to \"Copied!\") */\n copiedLabel?: string\n}\n\n// Get initial dark mode state from DOM\nconst getInitialDarkMode = () => {\n if (typeof document === 'undefined') return false\n return document.documentElement.classList.contains('dark')\n}\n\n// Language aliases for normalization\nconst languageMap: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n jsx: 'jsx',\n tsx: 'tsx',\n py: 'python',\n rb: 'ruby',\n yml: 'yaml',\n yaml: 'yaml',\n sh: 'bash',\n bash: 'bash',\n json: 'json',\n xml: 'xml',\n html: 'html',\n css: 'css',\n sql: 'sql',\n go: 'go',\n java: 'java',\n cpp: 'cpp',\n c: 'c',\n csharp: 'csharp',\n php: 'php',\n}\n\nfunction normalizeLanguage(lang: string): string {\n if (!lang) return 'text'\n return languageMap[lang.toLowerCase()] || lang.toLowerCase()\n}\n\nfunction CodeBlock({\n language,\n value,\n inline,\n copyLabel = 'Copy',\n copiedLabel = 'Copied!',\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n const [isDarkMode, setIsDarkMode] = useState(getInitialDarkMode)\n const [isLoaded, setIsLoaded] = useState(false)\n const copyTimeoutRef = useRef<number | null>(null)\n\n const normalizedLanguage = normalizeLanguage(language)\n\n // Detect dark mode and mark as loaded\n useEffect(() => {\n setIsDarkMode(document.documentElement.classList.contains('dark'))\n setIsLoaded(true)\n\n // Watch for dark mode changes\n const observer = new MutationObserver(() => {\n setIsDarkMode(document.documentElement.classList.contains('dark'))\n })\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n return () => observer.disconnect()\n }, [])\n\n // Cleanup copy timeout on unmount\n useEffect(() => {\n return () => {\n if (copyTimeoutRef.current !== null) {\n clearTimeout(copyTimeoutRef.current)\n }\n }\n }, [])\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value)\n setCopied(true)\n // Clear any existing timeout before setting a new one\n if (copyTimeoutRef.current !== null) {\n clearTimeout(copyTimeoutRef.current)\n }\n copyTimeoutRef.current = window.setTimeout(() => {\n setCopied(false)\n copyTimeoutRef.current = null\n }, 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n // Inline code styling\n if (inline) {\n return (\n <code className=\"px-1.5 py-0.5 bg-gray-100 dark:bg-gray-800 text-red-600 dark:text-red-400 rounded text-sm font-mono\">\n {value}\n </code>\n )\n }\n\n // Loading fallback\n if (!isLoaded) {\n return (\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4 border border-gray-300 dark:border-gray-700\">\n <code className=\"text-gray-700 dark:text-gray-300 text-sm font-mono\">{value}</code>\n </pre>\n )\n }\n\n // Code block with syntax highlighting\n return (\n <div className=\"relative group my-4 rounded-lg overflow-hidden border border-gray-300 dark:border-gray-700\">\n {/* Language label and copy button */}\n <div className=\"flex items-center justify-between px-4 py-2 bg-gray-200 dark:bg-gray-800 border-b border-gray-300 dark:border-gray-700\">\n <span className=\"text-xs text-gray-600 dark:text-gray-400 font-medium uppercase\">\n {normalizedLanguage}\n </span>\n <button\n onClick={handleCopy}\n className=\"text-xs text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors flex items-center gap-1.5\"\n title={copyLabel}\n aria-live=\"polite\"\n >\n {copied ? (\n <>\n <Check size={16} className=\"w-4 h-4\" />\n <span>{copiedLabel}</span>\n </>\n ) : (\n <>\n <Copy size={16} className=\"w-4 h-4\" />\n <span>{copyLabel}</span>\n </>\n )}\n </button>\n </div>\n\n {/* Code content */}\n <SyntaxHighlighter\n language={normalizedLanguage}\n style={isDarkMode ? vscDarkPlus : vs}\n customStyle={{\n margin: 0,\n borderRadius: 0,\n fontSize: '0.875rem',\n lineHeight: '1.5',\n padding: '1rem',\n }}\n showLineNumbers={false}\n wrapLines={true}\n codeTagProps={{\n style: {\n fontFamily: '\"JetBrains Mono\", \"Fira Code\", \"Menlo\", monospace',\n },\n }}\n >\n {value}\n </SyntaxHighlighter>\n </div>\n )\n}\n\nconst MemoizedCodeBlock = memo(CodeBlock)\nMemoizedCodeBlock.displayName = 'CodeBlock'\n\nexport { MemoizedCodeBlock as CodeBlock }\nexport default MemoizedCodeBlock\n","/**\n * MarkdownRenderer Component\n * Renders markdown with syntax highlighting, citations, and table export\n *\n * Features:\n * - Lazy-loaded CodeBlock for bundle optimization\n * - Citation processing (converts raw markers to numbered references)\n * - Table export functionality\n * - Custom CSS class names for styling flexibility\n * - GFM (GitHub Flavored Markdown) support\n */\n\nimport { memo, lazy, Suspense, useMemo } from 'react'\nimport ReactMarkdown, { Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport { processCitations } from '../utils/citationProcessor'\nimport type { Citation } from '../types'\nimport { TableWithExport } from './TableWithExport'\n\n// Lazy load CodeBlock for bundle optimization\nconst CodeBlock = lazy(() => import('./CodeBlock').then((module) => ({ default: module.CodeBlock })))\n\ninterface MarkdownRendererProps {\n /** Markdown content to render */\n content: string\n /** Optional citations to process and display */\n citations?: Citation[] | null\n /** Optional function to send messages (enables table export) */\n sendMessage?: (content: string) => void\n /** Whether message sending is disabled */\n sendDisabled?: boolean\n /** Copy button label for code blocks */\n copyLabel?: string\n /** Copied confirmation label for code blocks */\n copiedLabel?: string\n /** Export button label for tables */\n exportLabel?: string\n}\n\ninterface CodeProps {\n inline?: boolean\n className?: string\n children?: React.ReactNode\n}\n\nfunction MarkdownRenderer({\n content,\n citations,\n sendMessage,\n sendDisabled = false,\n copyLabel = 'Copy',\n copiedLabel = 'Copied!',\n exportLabel = 'Export',\n}: MarkdownRendererProps) {\n // Process citations to replace raw markers with [1], [2], etc.\n const processed = useMemo(() => {\n return processCitations(content, citations)\n }, [content, citations])\n\n const components: Components = {\n // Remove <pre> wrapper for code blocks - CodeBlock provides its own container\n pre: ({ children }) => <>{children}</>,\n code({ inline, className, children }: CodeProps) {\n const match = /language-(\\w+)/.exec(className || '')\n const language = match ? match[1] : ''\n const value = String(children).replace(/\\n$/, '')\n\n // Treat as inline only when explicitly marked inline by the renderer.\n // Fenced blocks without a language should still render as block code.\n const isInline = inline === true\n\n if (isInline) {\n return (\n <code className=\"px-1.5 py-0.5 bg-gray-100 dark:bg-gray-800 text-red-600 dark:text-red-400 rounded text-sm font-mono\">\n {value}\n </code>\n )\n }\n\n // Block code - rendered outside of <p> context due to pre handler above\n return (\n <Suspense\n fallback={\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto my-4\">\n <code className=\"text-sm font-mono\">{value}</code>\n </pre>\n }\n >\n <CodeBlock\n language={language}\n value={value}\n inline={false}\n copyLabel={copyLabel}\n copiedLabel={copiedLabel}\n />\n </Suspense>\n )\n },\n p: ({ children }) => <p className=\"markdown-p my-2\">{children}</p>,\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"markdown-link text-[var(--bichat-primary)] hover:underline\"\n >\n {children}\n </a>\n ),\n h1: ({ children }) => <h1 className=\"markdown-h1 text-2xl font-bold mt-6 mb-3\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"markdown-h2 text-xl font-bold mt-5 mb-2\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"markdown-h3 text-lg font-semibold mt-4 mb-2\">{children}</h3>,\n h4: ({ children }) => <h4 className=\"markdown-h4 text-base font-semibold mt-3 mb-1\">{children}</h4>,\n h5: ({ children }) => <h5 className=\"markdown-h5 text-sm font-semibold mt-2 mb-1\">{children}</h5>,\n h6: ({ children }) => <h6 className=\"markdown-h6 text-sm font-medium mt-2 mb-1\">{children}</h6>,\n ul: ({ children }) => <ul className=\"markdown-ul list-disc list-inside my-2 space-y-1\">{children}</ul>,\n ol: ({ children }) => <ol className=\"markdown-ol list-decimal list-inside my-2 space-y-1\">{children}</ol>,\n li: ({ children }) => <li className=\"markdown-li\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"markdown-blockquote border-l-4 border-gray-300 dark:border-gray-600 pl-4 my-2 italic text-gray-600 dark:text-gray-400\">\n {children}\n </blockquote>\n ),\n table: ({ children }) => (\n <TableWithExport\n sendMessage={sendMessage}\n disabled={sendDisabled}\n exportLabel={exportLabel}\n >\n {children}\n </TableWithExport>\n ),\n thead: ({ children }) => (\n <thead className=\"markdown-thead bg-gray-100 dark:bg-gray-800\">{children}</thead>\n ),\n tbody: ({ children }) => <tbody className=\"markdown-tbody\">{children}</tbody>,\n tr: ({ children }) => (\n <tr className=\"markdown-tr border-b border-gray-200 dark:border-gray-700\">{children}</tr>\n ),\n th: ({ children }) => (\n <th className=\"markdown-th px-3 py-2 text-left text-sm font-semibold text-gray-700 dark:text-gray-300\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"markdown-td px-3 py-2 text-sm text-gray-600 dark:text-gray-400\">{children}</td>\n ),\n hr: () => <hr className=\"markdown-hr my-4 border-gray-200 dark:border-gray-700\" />,\n strong: ({ children }) => <strong className=\"markdown-strong font-semibold\">{children}</strong>,\n em: ({ children }) => <em className=\"markdown-em italic\">{children}</em>,\n }\n\n return (\n <div className=\"markdown-content\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>\n {processed.content}\n </ReactMarkdown>\n </div>\n )\n}\n\nconst MemoizedMarkdownRenderer = memo(MarkdownRenderer)\nMemoizedMarkdownRenderer.displayName = 'MarkdownRenderer'\n\nexport { MemoizedMarkdownRenderer as MarkdownRenderer }\nexport default MemoizedMarkdownRenderer\n","/**\n * Per-session rate limiter\n * Prevents excessive requests within a time window\n */\n\nexport interface RateLimiterConfig {\n maxRequests: number\n windowMs: number\n}\n\nexport class RateLimiter {\n private timestamps: number[] = []\n private maxRequests: number\n private windowMs: number\n\n constructor(config: RateLimiterConfig) {\n this.maxRequests = config.maxRequests\n this.windowMs = config.windowMs\n }\n\n /**\n * Check if a request can be made\n * Updates internal state if request is allowed\n */\n canMakeRequest(): boolean {\n const now = Date.now()\n\n // Remove timestamps outside the current window\n this.timestamps = this.timestamps.filter(t => now - t < this.windowMs)\n\n // Check if limit exceeded\n if (this.timestamps.length >= this.maxRequests) {\n return false\n }\n\n // Add current timestamp\n this.timestamps.push(now)\n return true\n }\n\n /**\n * Get milliseconds until next request is allowed\n * Returns 0 if request can be made immediately\n */\n getTimeUntilNextRequest(): number {\n if (this.timestamps.length < this.maxRequests) {\n return 0\n }\n\n const now = Date.now()\n const oldestTimestamp = this.timestamps[0]\n const timeElapsed = now - oldestTimestamp\n const timeRemaining = this.windowMs - timeElapsed\n\n return Math.max(0, timeRemaining)\n }\n\n /**\n * Reset the rate limiter state\n */\n reset(): void {\n this.timestamps = []\n }\n}\n","/**\n * Chat session context provider and hook\n * Manages state for chat sessions including turns, loading, streaming, and HITL\n *\n * Uses turn-based architecture where each ConversationTurn groups\n * a user message with its assistant response.\n */\n\nimport { createContext, useContext, useState, useCallback, useEffect, ReactNode, useRef } from 'react'\nimport type {\n ChatDataSource,\n Session,\n ConversationTurn,\n PendingQuestion,\n QuestionAnswers,\n Attachment,\n ImageAttachment,\n QueuedMessage,\n CodeOutput,\n ChatSessionContextValue,\n} from '../types'\nimport { RateLimiter } from '../utils/RateLimiter'\n\nconst ChatSessionContext = createContext<ChatSessionContextValue | null>(null)\n\ninterface ChatSessionProviderProps {\n dataSource: ChatDataSource\n sessionId?: string\n rateLimiter?: RateLimiter\n children: ReactNode\n}\n\n// Default rate limiter configuration\nconst DEFAULT_RATE_LIMIT_CONFIG = {\n maxRequests: 20,\n windowMs: 60000, // 1 minute\n}\n\n/**\n * Generate a temporary ID for optimistic updates\n */\nfunction generateTempId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n\n/**\n * Create a new conversation turn with user message (assistant turn pending)\n */\nfunction createPendingTurn(\n sessionId: string,\n content: string,\n attachments: Attachment[] = []\n): ConversationTurn {\n const now = new Date().toISOString()\n return {\n id: generateTempId('turn'),\n sessionId,\n userTurn: {\n id: generateTempId('user'),\n content,\n attachments,\n createdAt: now,\n },\n // No assistantTurn yet - it will be added when streaming completes\n createdAt: now,\n }\n}\n\nexport function ChatSessionProvider({\n dataSource,\n sessionId,\n rateLimiter: externalRateLimiter,\n children\n}: ChatSessionProviderProps) {\n // Form state\n const [message, setMessage] = useState('')\n\n // Turn-based state (replaces messages)\n const [turns, setTurns] = useState<ConversationTurn[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Session state\n const [currentSessionId, setCurrentSessionId] = useState<string | undefined>(sessionId)\n const [session, setSession] = useState<Session | null>(null)\n const [fetching, setFetching] = useState(false)\n\n // Question state\n const [pendingQuestion, setPendingQuestion] = useState<PendingQuestion | null>(null)\n\n // Streaming state\n const [streamingContent, setStreamingContent] = useState('')\n const [isStreaming, setIsStreaming] = useState(false)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n // Queue and code outputs state\n const [messageQueue, setMessageQueue] = useState<QueuedMessage[]>([])\n const [codeOutputs, setCodeOutputs] = useState<CodeOutput[]>([])\n\n // Rate limiter (use provided or create default)\n const rateLimiterRef = useRef<RateLimiter>(\n externalRateLimiter || new RateLimiter(DEFAULT_RATE_LIMIT_CONFIG)\n )\n\n // Update sessionId when prop changes\n useEffect(() => {\n setCurrentSessionId(sessionId)\n }, [sessionId])\n\n // Fetch session on mount/sessionId change\n useEffect(() => {\n if (!currentSessionId || currentSessionId === 'new') {\n setSession(null)\n setTurns([])\n setPendingQuestion(null)\n setFetching(false)\n return\n }\n\n let cancelled = false\n\n setFetching(true)\n setError(null)\n\n dataSource\n .fetchSession(currentSessionId)\n .then((state) => {\n if (cancelled) return\n\n if (state) {\n setSession(state.session)\n setTurns(state.turns)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setError('Session not found')\n }\n setFetching(false)\n })\n .catch((err) => {\n if (cancelled) return\n setError(err.message || 'Failed to load session')\n setFetching(false)\n })\n\n return () => {\n cancelled = true\n }\n }, [dataSource, currentSessionId])\n\n const handleCopy = useCallback(async (text: string) => {\n await navigator.clipboard.writeText(text)\n }, [])\n\n const sendMessageDirect = useCallback(\n async (content: string, attachments: Attachment[] = []): Promise<void> => {\n if (!content.trim() || loading) return\n\n // Check rate limit\n if (!rateLimiterRef.current.canMakeRequest()) {\n const timeUntilNext = rateLimiterRef.current.getTimeUntilNextRequest()\n const seconds = Math.ceil(timeUntilNext / 1000)\n setError(`Rate limit exceeded. Please wait ${seconds} seconds before sending another message.`)\n setTimeout(() => setError(null), 5000)\n return\n }\n\n setMessage('')\n setLoading(true)\n setError(null)\n setStreamingContent('')\n\n // Create abort controller for this request\n abortControllerRef.current = new AbortController()\n\n // Add optimistic turn (user message only, no assistant response yet)\n const tempTurn = createPendingTurn(currentSessionId || 'new', content, attachments)\n setTurns((prev) => [...prev, tempTurn])\n\n try {\n // Create session if needed\n let activeSessionId = currentSessionId\n let shouldNavigateAfter = false\n\n if (!activeSessionId || activeSessionId === 'new') {\n const result = await dataSource.createSession()\n if (result) {\n activeSessionId = result.id\n setCurrentSessionId(activeSessionId)\n shouldNavigateAfter = true\n }\n }\n\n // Stream response\n let accumulatedContent = ''\n let createdSessionId: string | undefined\n setIsStreaming(true)\n\n for await (const chunk of dataSource.sendMessage(\n activeSessionId || 'new',\n content,\n attachments,\n abortControllerRef.current?.signal\n )) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break\n }\n\n if (chunk.type === 'chunk' && chunk.content) {\n accumulatedContent += chunk.content\n setStreamingContent(accumulatedContent)\n } else if (chunk.type === 'error') {\n throw new Error(chunk.error || 'Stream error')\n } else if (chunk.type === 'done') {\n if (chunk.sessionId) {\n createdSessionId = chunk.sessionId\n }\n // Refetch session to get final state with proper turns\n const finalSessionId = createdSessionId || activeSessionId\n if (finalSessionId && finalSessionId !== 'new') {\n const state = await dataSource.fetchSession(finalSessionId)\n if (state) {\n setSession(state.session)\n setTurns(state.turns)\n setPendingQuestion(state.pendingQuestion || null)\n }\n }\n } else if (chunk.type === 'user_message' && chunk.sessionId) {\n createdSessionId = chunk.sessionId\n }\n }\n\n // Navigate to session page if a new session was created\n const targetSessionId = createdSessionId || activeSessionId\n if (shouldNavigateAfter && targetSessionId && targetSessionId !== 'new') {\n dataSource.navigateToSession?.(targetSessionId)\n }\n } catch (err) {\n // Check if error is due to cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n // Stream was cancelled - restore input message\n setMessage(content)\n return\n }\n\n // Remove optimistic turn on error\n setTurns((prev) => prev.filter((t) => t.id !== tempTurn.id))\n\n const errorMessage = err instanceof Error ? err.message : 'Failed to send message'\n setError(errorMessage)\n console.error('Send message error:', err)\n } finally {\n setLoading(false)\n setStreamingContent('')\n setIsStreaming(false)\n abortControllerRef.current = null\n }\n },\n [currentSessionId, loading, dataSource]\n )\n\n const cancelStream = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n setIsStreaming(false)\n setLoading(false)\n }\n }, [])\n\n const handleSubmit = useCallback(\n (e: React.FormEvent, attachments: ImageAttachment[] = []) => {\n e.preventDefault()\n if (!message.trim() && attachments.length === 0) return\n\n // Convert ImageAttachment to Attachment for the data source\n const convertedAttachments: Attachment[] = attachments.map(att => ({\n id: '', // Will be assigned by backend\n filename: att.filename,\n mimeType: att.mimeType,\n sizeBytes: att.sizeBytes,\n base64Data: att.base64Data\n }))\n\n sendMessageDirect(message, convertedAttachments)\n },\n [message, sendMessageDirect]\n )\n\n const handleUnqueue = useCallback(() => {\n if (messageQueue.length === 0) {\n return null\n }\n\n const lastQueued = messageQueue[messageQueue.length - 1]\n setMessageQueue(prev => prev.slice(0, -1))\n\n return {\n content: lastQueued.content,\n attachments: lastQueued.attachments\n }\n }, [messageQueue])\n\n const handleRegenerate = useCallback(\n async (turnId: string) => {\n if (!currentSessionId || currentSessionId === 'new') return\n\n const turn = turns.find((t) => t.id === turnId)\n if (!turn) return\n\n setLoading(true)\n setError(null)\n\n try {\n // Resend the user message from this turn\n await sendMessageDirect(turn.userTurn.content, turn.userTurn.attachments)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to regenerate response'\n setError(errorMessage)\n console.error('Regenerate error:', err)\n } finally {\n setLoading(false)\n }\n },\n [turns, currentSessionId, sendMessageDirect]\n )\n\n const handleEdit = useCallback(\n async (turnId: string, newContent: string) => {\n if (!currentSessionId || currentSessionId === 'new') {\n setMessage(newContent)\n setTurns((prev) => prev.filter((t) => t.id !== turnId))\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n // For edit, we resend with the edited content\n await sendMessageDirect(newContent, [])\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to edit message'\n setError(errorMessage)\n console.error('Edit error:', err)\n } finally {\n setLoading(false)\n }\n },\n [currentSessionId, sendMessageDirect]\n )\n\n const handleSubmitQuestionAnswers = useCallback(\n (answers: QuestionAnswers) => {\n if (!currentSessionId || !pendingQuestion) return\n\n setLoading(true)\n setError(null)\n const previousPendingQuestion = pendingQuestion\n setPendingQuestion(null)\n\n ;(async () => {\n try {\n const result = await dataSource.submitQuestionAnswers(\n currentSessionId,\n previousPendingQuestion.id,\n answers\n )\n\n if (result.success) {\n if (currentSessionId !== 'new') {\n try {\n const state = await dataSource.fetchSession(currentSessionId)\n if (state) {\n setTurns(state.turns)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setPendingQuestion(previousPendingQuestion)\n setError('Failed to load updated session')\n }\n } catch (fetchErr) {\n setPendingQuestion(previousPendingQuestion)\n const errorMessage =\n fetchErr instanceof Error\n ? fetchErr.message\n : 'Failed to load updated session'\n setError(errorMessage)\n }\n }\n } else {\n setPendingQuestion(previousPendingQuestion)\n setError(result.error || 'Failed to submit answers')\n }\n } catch (err) {\n setPendingQuestion(previousPendingQuestion)\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to submit answers'\n setError(errorMessage)\n } finally {\n setLoading(false)\n }\n })()\n },\n [currentSessionId, pendingQuestion, dataSource]\n )\n\n const handleCancelPendingQuestion = useCallback(async () => {\n if (!currentSessionId || !pendingQuestion) return\n\n try {\n const result = await dataSource.cancelPendingQuestion(pendingQuestion.id)\n\n if (result.success) {\n setPendingQuestion(null)\n } else {\n setError(result.error || 'Failed to cancel question')\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to cancel question'\n setError(errorMessage)\n }\n }, [currentSessionId, pendingQuestion, dataSource])\n\n const value: ChatSessionContextValue = {\n // State\n message,\n turns,\n loading,\n error,\n currentSessionId,\n pendingQuestion,\n session,\n fetching,\n streamingContent,\n isStreaming,\n messageQueue,\n codeOutputs,\n\n // Setters\n setMessage,\n setError,\n setCodeOutputs,\n\n // Handlers\n handleCopy,\n handleRegenerate,\n handleEdit,\n handleSubmit,\n handleSubmitQuestionAnswers,\n handleCancelPendingQuestion,\n handleUnqueue,\n sendMessage: sendMessageDirect,\n cancel: cancelStream,\n }\n\n return (\n <ChatSessionContext.Provider value={value}>\n {children}\n </ChatSessionContext.Provider>\n )\n}\n\nexport function useChat(): ChatSessionContextValue {\n const context = useContext(ChatSessionContext)\n if (!context) {\n throw new Error('useChat must be used within ChatSessionProvider')\n }\n return context\n}\n","/**\n * IOTA SDK integration context provider\n * Consumes server-side context from window.__BICHAT_CONTEXT__\n */\n\nimport { createContext, useContext, ReactNode } from 'react'\nimport type { IotaContext as IotaContextType } from '../types/iota'\n\nconst IotaContext = createContext<IotaContextType | null>(null)\n\ninterface IotaContextProviderProps {\n children: ReactNode\n}\n\nexport function IotaContextProvider({ children }: IotaContextProviderProps) {\n // Read initial context from window object injected by server\n const initialContext = window.__BICHAT_CONTEXT__\n\n if (!initialContext) {\n throw new Error('BICHAT_CONTEXT not found. Ensure server injected context into window object.')\n }\n\n return (\n <IotaContext.Provider value={initialContext}>\n {children}\n </IotaContext.Provider>\n )\n}\n\nexport function useIotaContext(): IotaContextType {\n const context = useContext(IotaContext)\n if (!context) {\n throw new Error('useIotaContext must be used within IotaContextProvider')\n }\n return context\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(permission: string): boolean {\n const context = window.__BICHAT_CONTEXT__\n if (!context) {\n return false\n }\n return context.user.permissions.includes(permission)\n}\n","/**\n * Default English translations for BiChat UI.\n * These serve as fallback when no custom translations are provided.\n *\n * Key naming convention:\n * - Use dot notation for namespacing: \"section.key\"\n * - Use {param} for interpolation: \"You have {count} messages\"\n */\n\nimport type { Translations } from '../types'\n\nexport const defaultTranslations: Translations = {\n // Welcome screen\n 'welcome.title': 'Welcome to BiChat',\n 'welcome.description':\n 'Your intelligent business analytics assistant. Ask questions about your data, generate reports, or explore insights.',\n 'welcome.tryAsking': 'Try asking',\n\n // Chat header\n 'chat.newChat': 'New Chat',\n 'chat.archived': 'Archived',\n 'chat.pinned': 'Pinned',\n 'chat.goBack': 'Go back',\n\n // Message input\n 'input.placeholder': 'Type a message...',\n 'input.attachFiles': 'Attach files',\n 'input.attachImages': 'Attach images',\n 'input.dropImages': 'Drop images here',\n 'input.sendMessage': 'Send message',\n 'input.aiThinking': 'AI is thinking...',\n 'input.processing': 'Processing...',\n 'input.messagesQueued': '{count} message(s) queued',\n 'input.dismissError': 'Dismiss error',\n\n // Message actions\n 'message.copy': 'Copy',\n 'message.copied': 'Copied!',\n 'message.regenerate': 'Regenerate',\n 'message.edit': 'Edit',\n 'message.save': 'Save',\n 'message.cancel': 'Cancel',\n\n // Assistant turn\n 'assistant.thinking': 'Thinking...',\n 'assistant.toolCall': 'Using tool: {name}',\n 'assistant.generating': 'Generating response...',\n\n // Question form\n 'question.submit': 'Submit',\n 'question.selectOne': 'Select one option',\n 'question.selectMulti': 'Select one or more options',\n 'question.required': 'This field is required',\n 'question.other': 'Other',\n 'question.specifyOther': 'Please specify',\n\n // Errors\n 'error.generic': 'Something went wrong',\n 'error.networkError': 'Network error. Please try again.',\n 'error.sessionExpired': 'Session expired. Please refresh.',\n 'error.fileTooLarge': 'File is too large',\n 'error.invalidFile': 'Invalid file type',\n 'error.maxFiles': 'Maximum {max} files allowed',\n\n // Empty states\n 'empty.noMessages': 'No messages yet',\n 'empty.noSessions': 'No chat sessions',\n 'empty.startChat': 'Start a new chat to begin',\n\n // Sources panel\n 'sources.title': 'Sources',\n 'sources.viewMore': 'View more',\n 'sources.citations': '{count} citation(s)',\n\n // Code outputs\n 'codeOutputs.title': 'Code Outputs',\n 'codeOutputs.download': 'Download',\n 'codeOutputs.expand': 'Expand',\n 'codeOutputs.collapse': 'Collapse',\n\n // Charts\n 'chart.download': 'Download chart',\n 'chart.fullscreen': 'View fullscreen',\n 'chart.noData': 'No data available',\n\n // Example prompt categories\n 'category.analysis': 'Data Analysis',\n 'category.reports': 'Reports',\n 'category.insights': 'Insights',\n}\n","/**\n * Translation hook using locale from IotaContext\n */\n\nimport { useIotaContext } from '../context/IotaContext'\nimport { defaultTranslations } from '../locales/defaults'\n\nexport function useTranslation() {\n const { locale } = useIotaContext()\n\n /**\n * Translate a key with optional parameter interpolation\n * @param key - Translation key (e.g., 'bichat.title')\n * @param params - Optional parameters for interpolation (e.g., { name: 'John' })\n * @returns Translated string\n */\n const t = (key: string, params?: Record<string, any>): string => {\n let text = locale.translations[key] || defaultTranslations[key] || key\n\n // Simple interpolation: replace {{key}} with params[key]\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n const value = params[paramKey]\n text = text.replace(new RegExp(`{{${paramKey}}}`, 'g'), String(value))\n })\n }\n\n return text\n }\n\n return {\n t,\n locale: locale.language,\n }\n}\n","/**\n * Branding hook for UI customization.\n *\n * Provides access to branding configuration injected from the backend\n * via window.__BICHAT_CONTEXT__.extensions.branding\n */\n\nimport { useMemo } from 'react'\nimport { useIotaContext } from '../context/IotaContext'\nimport type { BrandingConfig, ExamplePrompt } from '../types'\nimport { useTranslation } from './useTranslation'\n\n/**\n * Default example prompts when none are configured.\n */\nconst defaultExamplePrompts: ExamplePrompt[] = [\n {\n category: 'Data Analysis',\n text: 'Show me sales trends for the last quarter',\n icon: 'chart-bar',\n },\n {\n category: 'Reports',\n text: 'Generate a summary of recent activity',\n icon: 'file-text',\n },\n {\n category: 'Insights',\n text: 'What are the top performing items?',\n icon: 'lightbulb',\n },\n]\n\n/**\n * Hook to access branding configuration.\n *\n * Returns merged branding with fallbacks to defaults and translations.\n */\nexport function useBranding() {\n const context = useIotaContext()\n const { t } = useTranslation()\n\n const branding = useMemo((): BrandingConfig => {\n const customBranding = context.extensions?.branding || {}\n\n // Get example prompts with category translations\n let examplePrompts = customBranding.welcome?.examplePrompts\n if (!examplePrompts || examplePrompts.length === 0) {\n // Use defaults with translated categories\n examplePrompts = defaultExamplePrompts.map((p) => ({\n ...p,\n category: t(`category.${p.category.toLowerCase().replace(/\\s+/g, '')}`) || p.category,\n }))\n }\n\n return {\n appName: customBranding.appName || 'BiChat',\n logoUrl: customBranding.logoUrl,\n welcome: {\n title: customBranding.welcome?.title || t('welcome.title'),\n description: customBranding.welcome?.description || t('welcome.description'),\n examplePrompts,\n },\n theme: customBranding.theme,\n }\n }, [context.extensions?.branding, t])\n\n return branding\n}\n\n/**\n * Hook to access feature flags.\n */\nexport function useFeatureFlags() {\n const context = useIotaContext()\n\n return useMemo(\n () => ({\n vision: context.extensions?.features?.vision ?? false,\n webSearch: context.extensions?.features?.webSearch ?? false,\n codeInterpreter: context.extensions?.features?.codeInterpreter ?? false,\n multiAgent: context.extensions?.features?.multiAgent ?? false,\n }),\n [context.extensions?.features]\n )\n}\n","/**\n * Chat header component\n * Displays session title and controls\n *\n * Supports customization via:\n * - logoSlot: Custom logo component\n * - actionsSlot: Custom action buttons\n * - Translations for \"New Chat\", \"Archived\", etc.\n */\n\nimport { ReactNode } from 'react'\nimport { Session } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { useBranding } from '../hooks/useBranding'\n\ninterface ChatHeaderProps {\n session: Session | null\n onBack?: () => void\n /** Custom logo component to display */\n logoSlot?: ReactNode\n /** Custom action buttons */\n actionsSlot?: ReactNode\n}\n\nexport function ChatHeader({ session, onBack, logoSlot, actionsSlot }: ChatHeaderProps) {\n const { t } = useTranslation()\n const branding = useBranding()\n\n const BackButton = onBack ? (\n <button\n onClick={onBack}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 active:bg-gray-200 dark:active:bg-gray-600 rounded-lg transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={t('chat.goBack')}\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n ) : null\n\n const Logo = logoSlot || (branding.logoUrl ? (\n <img src={branding.logoUrl} alt={branding.appName} className=\"h-6 w-auto\" />\n ) : null)\n\n if (!session) {\n return (\n <header className=\"bichat-header border-b border-[var(--bichat-border)] px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {BackButton}\n {Logo}\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)]\">\n {t('chat.newChat')}\n </h1>\n </div>\n {actionsSlot && <div className=\"flex items-center gap-2\">{actionsSlot}</div>}\n </div>\n </header>\n )\n }\n\n return (\n <header className=\"bichat-header border-b border-[var(--bichat-border)] px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {BackButton}\n {Logo}\n <h1 className=\"text-lg font-semibold text-[var(--bichat-text)]\">{session.title}</h1>\n {session.pinned && (\n <svg\n className=\"w-4 h-4 text-[var(--bichat-primary)]\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n aria-label={t('chat.pinned')}\n >\n <path d=\"M10 2a1 1 0 011 1v1.323l3.954 1.582 1.599-.8a1 1 0 01.894 1.79l-1.233.616 1.738 5.42a1 1 0 01-.285 1.05A3.989 3.989 0 0115 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.715-5.349L11 6.477V16h2a1 1 0 110 2H7a1 1 0 110-2h2V6.477L6.237 7.582l1.715 5.349a1 1 0 01-.285 1.05A3.989 3.989 0 015 15a3.989 3.989 0 01-2.667-1.019 1 1 0 01-.285-1.05l1.738-5.42-1.233-.617a1 1 0 01.894-1.788l1.599.799L9 4.323V3a1 1 0 011-1z\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {session.status === 'archived' && (\n <span className=\"px-2 py-1 text-xs bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded\">\n {t('chat.archived')}\n </span>\n )}\n {actionsSlot}\n </div>\n </div>\n </header>\n )\n}\n","/**\n * File Utilities\n * Validation, conversion, and formatting for file attachments\n */\n\nconst MAX_FILE_SIZE_BYTES = 20 * 1024 * 1024 // 20MB\nconst ALLOWED_IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']\n\n/**\n * Validates an image file against size and type constraints\n * @throws Error if validation fails\n */\nexport function validateImageFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n if (!ALLOWED_IMAGE_TYPES.includes(file.type)) {\n throw new Error(`Invalid file type: ${file.type}. Only PNG, JPEG, WebP, and GIF are allowed.`)\n }\n if (file.size > maxSizeBytes) {\n const sizeMB = (file.size / 1024 / 1024).toFixed(1)\n const maxSizeMB = (maxSizeBytes / 1024 / 1024).toFixed(0)\n throw new Error(`File too large: ${sizeMB}MB exceeds ${maxSizeMB}MB limit`)\n }\n}\n\n/**\n * Converts a file to base64 string (without data URL prefix)\n */\nexport async function convertToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = reader.result as string\n // Strip data URL prefix (e.g., \"data:image/png;base64,\")\n const base64 = result.split(',')[1]\n resolve(base64)\n }\n reader.onerror = () => reject(new Error('Failed to read file'))\n reader.readAsDataURL(file)\n })\n}\n\n/**\n * Creates a data URL from base64 string and MIME type\n */\nexport function createDataUrl(base64: string, mimeType: string): string {\n return `data:${mimeType};base64,${base64}`\n}\n\n/**\n * Formats file size in human-readable format\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`\n}\n\n/**\n * Validates multiple files don't exceed count limit\n * @throws Error if count exceeds limit\n */\nexport function validateFileCount(currentCount: number, newCount: number, maxCount: number = 10): void {\n const total = currentCount + newCount\n if (total > maxCount) {\n throw new Error(`Cannot attach more than ${maxCount} files (attempting to add ${total})`)\n }\n}\n","/**\n * AttachmentGrid Component\n * Displays image attachments in a responsive grid\n *\n * Features:\n * - Responsive grid (2 cols mobile, 3 tablet, 4 desktop)\n * - View-only or edit mode (with remove buttons)\n * - Optional maxDisplay limit\n * - Max capacity indicator (10 images)\n * - Memoized items for performance\n * - Readonly mode support\n */\n\nimport React, { useMemo } from 'react'\nimport { X } from '@phosphor-icons/react'\nimport { formatFileSize } from '../utils/fileUtils'\nimport type { ImageAttachment } from '../types'\n\ninterface AttachmentGridProps {\n /** Array of image attachments to display */\n attachments: ImageAttachment[]\n /** Optional callback when remove button is clicked */\n onRemove?: (index: number) => void\n /** Optional callback when thumbnail is clicked for preview */\n onView?: (index: number) => void\n /** Additional CSS class */\n className?: string\n /** If true, disable all interactions */\n readonly?: boolean\n /** Maximum number of attachments to display (default: all) */\n maxDisplay?: number\n /** Maximum total capacity (for warning display, default: 10) */\n maxCapacity?: number\n /** Empty state message */\n emptyMessage?: string\n /** Show count label above grid */\n showCount?: boolean\n}\n\n/**\n * Responsive grid component for displaying image attachments\n *\n * Layout:\n * - Mobile: 2 columns (grid-cols-2)\n * - Tablet: 3 columns (sm:grid-cols-3)\n * - Desktop: 4 columns (md:grid-cols-4)\n */\nfunction AttachmentGrid({\n attachments,\n onRemove,\n onView,\n className = '',\n readonly = false,\n maxDisplay,\n maxCapacity = 10,\n emptyMessage = 'No images attached',\n showCount = false,\n}: AttachmentGridProps) {\n // Limit attachments to maxDisplay if specified\n const displayedAttachments = useMemo(\n () =>\n maxDisplay && attachments.length > maxDisplay\n ? attachments.slice(0, maxDisplay)\n : attachments,\n [attachments, maxDisplay]\n )\n\n // Determine if we're at maximum capacity\n const isAtMaxCapacity = attachments.length >= maxCapacity\n\n // Return null for truly empty state (no empty message needed in most cases)\n if (displayedAttachments.length === 0) {\n if (!showCount) return null\n return (\n <div className=\"text-center text-gray-500 dark:text-gray-400 py-4\">{emptyMessage}</div>\n )\n }\n\n const isEditable = !readonly && !!onRemove\n const isViewable = !readonly && !!onView\n\n return (\n <div className={`space-y-2 ${className}`}>\n {/* Count label */}\n {showCount && (\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n {displayedAttachments.length} image{displayedAttachments.length !== 1 ? 's' : ''} attached\n </div>\n )}\n\n {/* Grid container */}\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-2\">\n {displayedAttachments.map((attachment, index) => (\n <MemoizedAttachmentItem\n key={`${attachment.filename}-${index}`}\n attachment={attachment}\n index={index}\n onRemove={isEditable ? onRemove : undefined}\n onView={isViewable ? onView : undefined}\n />\n ))}\n </div>\n\n {/* Overflow indicator when maxDisplay is set */}\n {maxDisplay && attachments.length > maxDisplay && (\n <div className=\"text-sm text-gray-500 dark:text-gray-400\">\n +{attachments.length - maxDisplay} more\n </div>\n )}\n\n {/* Maximum capacity indicator */}\n {isAtMaxCapacity && isEditable && (\n <div className=\"text-sm text-amber-600 dark:text-amber-400\">\n Maximum {maxCapacity} images\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Individual attachment preview item\n */\ninterface AttachmentItemProps {\n attachment: ImageAttachment\n index: number\n onRemove?: (index: number) => void\n onView?: (index: number) => void\n}\n\nfunction AttachmentItem({ attachment, index, onRemove, onView }: AttachmentItemProps) {\n const isEditable = !!onRemove\n const isViewable = !!onView\n\n return (\n <div className=\"relative group\">\n <img\n src={attachment.preview}\n alt={attachment.filename}\n className={`w-full h-24 object-cover rounded-lg border border-gray-200 dark:border-gray-700 ${\n isViewable\n ? 'cursor-pointer hover:opacity-80 transition-opacity duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900'\n : ''\n }`}\n onClick={() => isViewable && onView?.(index)}\n role={isViewable ? 'button' : undefined}\n tabIndex={isViewable ? 0 : undefined}\n onKeyDown={(e) => {\n if (isViewable && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault()\n onView?.(index)\n }\n }}\n />\n\n {isEditable && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove?.(index)\n }}\n className=\"absolute top-1 right-1 p-1 bg-red-500 hover:bg-red-600 active:bg-red-700 text-white rounded-full opacity-0 group-hover:opacity-100 transition-all duration-150 shadow-md focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50\"\n aria-label={`Remove ${attachment.filename}`}\n >\n <X size={16} weight=\"bold\" />\n </button>\n )}\n\n <div className=\"mt-1 px-1\">\n <div\n className=\"text-xs text-gray-600 dark:text-gray-400 truncate\"\n title={attachment.filename}\n >\n {attachment.filename.length > 20\n ? `${attachment.filename.substring(0, 20)}...`\n : attachment.filename}\n </div>\n <div className=\"text-xs text-gray-500 dark:text-gray-500\">\n {formatFileSize(attachment.sizeBytes)}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Memoized AttachmentItem to prevent unnecessary re-renders\n * Only re-renders when the attachment or callbacks actually change\n */\nconst MemoizedAttachmentItem = React.memo(\n AttachmentItem,\n (prevProps, nextProps) => {\n // Custom equality check: only re-render if attachment content or callbacks change\n return (\n prevProps.attachment.base64Data === nextProps.attachment.base64Data &&\n prevProps.attachment.filename === nextProps.attachment.filename &&\n prevProps.attachment.preview === nextProps.attachment.preview &&\n prevProps.index === nextProps.index &&\n prevProps.onRemove === nextProps.onRemove &&\n prevProps.onView === nextProps.onView\n )\n }\n)\n\nconst MemoizedAttachmentGrid = React.memo(AttachmentGrid)\nMemoizedAttachmentGrid.displayName = 'AttachmentGrid'\n\nexport { MemoizedAttachmentGrid as AttachmentGrid }\nexport default MemoizedAttachmentGrid\n","import { useEffect } from 'react'\n\n/**\n * Hook to prevent body scroll when modal is open\n * Restores scroll on cleanup or when modal closes\n *\n * @param isOpen - Whether the modal is currently open\n *\n * @example\n * const [isModalOpen, setIsModalOpen] = useState(false)\n * useModalLock(isModalOpen)\n */\nexport function useModalLock(isOpen: boolean) {\n useEffect(() => {\n if (!isOpen) return\n\n // Store original scroll position\n const originalOverflow = document.body.style.overflow\n\n // Prevent scroll\n document.body.style.overflow = 'hidden'\n\n // Cleanup: restore scroll\n return () => {\n document.body.style.overflow = originalOverflow\n }\n }, [isOpen])\n}\n","import { useEffect, RefObject } from 'react'\n\n/**\n * Hook to trap focus within a container (for modals, sidebars)\n * Ensures Tab and Shift+Tab cycle through focusable elements only\n *\n * @param containerRef - React ref to the container element\n * @param isActive - Whether the focus trap is currently active\n * @param restoreFocusOnDeactivate - Element to restore focus to when deactivated\n *\n * @example\n * const modalRef = useRef<HTMLDivElement>(null)\n * useFocusTrap(modalRef, isOpen)\n */\nexport function useFocusTrap(\n containerRef: RefObject<HTMLElement | null>,\n isActive: boolean,\n restoreFocusOnDeactivate?: HTMLElement | null\n) {\n useEffect(() => {\n if (!isActive || !containerRef.current) return\n\n const container = containerRef.current\n const previouslyFocused = document.activeElement as HTMLElement\n\n // Get all focusable elements\n const getFocusableElements = (): HTMLElement[] => {\n const selector = [\n 'button:not([disabled])',\n '[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(', ')\n\n return Array.from(container.querySelectorAll(selector)) as HTMLElement[]\n }\n\n // Focus first element on activation\n const focusableElements = getFocusableElements()\n if (focusableElements.length > 0) {\n focusableElements[0].focus()\n }\n\n // Handle Tab key to cycle focus\n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return\n\n const focusableElements = getFocusableElements()\n if (focusableElements.length === 0) return\n\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n if (e.shiftKey) {\n // Shift+Tab: cycle backwards\n if (document.activeElement === firstElement) {\n e.preventDefault()\n lastElement.focus()\n }\n } else {\n // Tab: cycle forwards\n if (document.activeElement === lastElement) {\n e.preventDefault()\n firstElement.focus()\n }\n }\n }\n\n container.addEventListener('keydown', handleTabKey)\n\n // Cleanup and restore focus\n return () => {\n container.removeEventListener('keydown', handleTabKey)\n\n // Restore focus to previously focused element or custom element\n if (restoreFocusOnDeactivate) {\n restoreFocusOnDeactivate.focus()\n } else if (previouslyFocused instanceof HTMLElement) {\n previouslyFocused.focus()\n }\n }\n }, [containerRef, isActive, restoreFocusOnDeactivate])\n}\n","/**\n * LoadingSpinner Component\n * Displays animated loading indicators\n */\n\nimport { memo } from 'react'\nimport { CircleNotch } from '@phosphor-icons/react'\n\ntype SpinnerVariant = 'spinner' | 'dots' | 'pulse'\n\ninterface LoadingSpinnerProps {\n variant?: SpinnerVariant\n size?: 'sm' | 'md' | 'lg'\n message?: string\n}\n\nfunction SpinnerLoader({\n size = 'md',\n message,\n}: {\n size: 'sm' | 'md' | 'lg'\n message?: string\n}) {\n const sizeMap = {\n sm: 16,\n md: 32,\n lg: 48,\n }\n\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n }\n\n return (\n <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n <CircleNotch\n size={sizeMap[size]}\n className={`${sizeClasses[size]} animate-spin text-[var(--bichat-primary)]`}\n />\n {message && <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n </div>\n )\n}\n\nfunction DotsLoader({\n size = 'md',\n message,\n}: {\n size: 'sm' | 'md' | 'lg'\n message?: string\n}) {\n const dotSizeClasses = {\n sm: 'w-1.5 h-1.5',\n md: 'w-2 h-2',\n lg: 'w-3 h-3',\n }\n\n const gapClasses = {\n sm: 'gap-0.5',\n md: 'gap-1',\n lg: 'gap-1.5',\n }\n\n return (\n <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n <div className={`flex ${gapClasses[size]}`}>\n {[0, 1, 2].map((index) => (\n <div\n key={index}\n className={`${dotSizeClasses[size]} bg-[var(--bichat-primary)] rounded-full animate-bounce`}\n style={{ animationDelay: `${index * 0.15}s` }}\n />\n ))}\n </div>\n {message && <p className=\"mt-3 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n </div>\n )\n}\n\nfunction PulseLoader({\n size = 'md',\n message,\n}: {\n size: 'sm' | 'md' | 'lg'\n message?: string\n}) {\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-8 w-8',\n lg: 'h-12 w-12',\n }\n\n return (\n <div className=\"flex flex-col items-center justify-center\" role=\"status\" aria-live=\"polite\">\n <div className={`${sizeClasses[size]} bg-[var(--bichat-primary)] rounded-full animate-pulse`} />\n {message && <p className=\"mt-2 text-sm text-gray-600 dark:text-gray-400\">{message}</p>}\n </div>\n )\n}\n\nfunction LoadingSpinner({ variant = 'spinner', size = 'md', message }: LoadingSpinnerProps) {\n switch (variant) {\n case 'dots':\n return <DotsLoader size={size} message={message} />\n case 'pulse':\n return <PulseLoader size={size} message={message} />\n case 'spinner':\n default:\n return <SpinnerLoader size={size} message={message} />\n }\n}\n\nconst MemoizedLoadingSpinner = memo(LoadingSpinner)\nMemoizedLoadingSpinner.displayName = 'LoadingSpinner'\n\nexport { MemoizedLoadingSpinner as LoadingSpinner }\nexport default MemoizedLoadingSpinner\n","/**\n * ImageModal Component\n * Full-screen image viewer with navigation, loading state, and accessibility\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X, CaretLeft, CaretRight } from '@phosphor-icons/react'\nimport type { ImageAttachment } from '../types'\nimport { createDataUrl, formatFileSize } from '../utils/fileUtils'\nimport { useModalLock } from '../hooks/useModalLock'\nimport { useFocusTrap } from '../hooks/useFocusTrap'\nimport LoadingSpinner from './LoadingSpinner'\n\ninterface ImageModalProps {\n /** Whether the modal is open */\n isOpen: boolean\n\n /** Callback to close the modal */\n onClose: () => void\n\n /** The current attachment to display */\n attachment: ImageAttachment\n\n /** Optional: all attachments for navigation */\n allAttachments?: ImageAttachment[]\n\n /** Optional: current index for navigation state */\n currentIndex?: number\n\n /** Optional: callback for navigation (prev/next) */\n onNavigate?: (direction: 'prev' | 'next') => void\n}\n\n/**\n * Full-screen image modal component for viewing attachments\n *\n * Features:\n * - Full-screen overlay with dark backdrop (90% opacity)\n * - Large image display centered on screen\n * - Close button (X) in top-right corner\n * - Image metadata: filename, file size, MIME type\n * - Navigation arrows (left/right) for image carousel\n * - Keyboard support: Escape to close, Arrow keys to navigate\n * - Click backdrop to close\n * - Focus trap within modal\n * - Body scroll locked when open\n * - Image loading state with spinner\n * - Navigation disabled at boundaries (not circular)\n */\nfunction ImageModal({\n isOpen,\n onClose,\n attachment,\n allAttachments,\n currentIndex = 0,\n onNavigate,\n}: ImageModalProps) {\n const modalRef = useRef<HTMLDivElement>(null)\n const [isImageLoaded, setIsImageLoaded] = useState(false)\n const [imageError, setImageError] = useState(false)\n const hasMultipleImages = allAttachments && allAttachments.length > 1\n const canNavigatePrev = hasMultipleImages && currentIndex > 0\n const canNavigateNext =\n hasMultipleImages && currentIndex < (allAttachments?.length || 1) - 1\n\n // Lock body scroll when modal is open\n useModalLock(isOpen)\n\n // Trap focus within modal\n useFocusTrap(modalRef, isOpen)\n\n // Handle keyboard events\n useEffect(() => {\n if (!isOpen) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n } else if (e.key === 'ArrowLeft' && onNavigate && canNavigatePrev) {\n onNavigate('prev')\n } else if (e.key === 'ArrowRight' && onNavigate && canNavigateNext) {\n onNavigate('next')\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [isOpen, onClose, onNavigate, canNavigatePrev, canNavigateNext])\n\n // Reset image loading state when attachment changes\n useEffect(() => {\n setIsImageLoaded(false)\n setImageError(false)\n }, [attachment])\n\n if (!isOpen) return null\n\n const previewUrl =\n attachment.preview || createDataUrl(attachment.base64Data, attachment.mimeType)\n return createPortal(\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/90 transition-opacity duration-200 z-40\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Modal Container */}\n <div\n className=\"fixed inset-0 flex items-center justify-center z-50 p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"modal-image-title\"\n aria-describedby=\"modal-image-description\"\n >\n <div\n ref={modalRef}\n className=\"relative flex flex-col items-center justify-center w-full h-full\"\n >\n {/* Close Button */}\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 z-50 flex items-center justify-center w-10 h-10 bg-white/10 hover:bg-white/20 text-white rounded-full transition-colors duration-200\"\n aria-label=\"Close modal\"\n type=\"button\"\n >\n <X size={24} weight=\"bold\" />\n </button>\n\n {/* Image Container */}\n <div className=\"flex flex-col items-center justify-center w-full h-full max-w-4xl\">\n {/* Image Loading State */}\n {!isImageLoaded && !imageError && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <LoadingSpinner />\n </div>\n )}\n\n {/* Error State */}\n {imageError && (\n <div className=\"flex flex-col items-center justify-center text-white\">\n <p className=\"text-lg font-medium mb-2\">Failed to load image</p>\n <p className=\"text-sm text-gray-300\">{attachment.filename}</p>\n </div>\n )}\n\n {/* Image */}\n <img\n src={previewUrl}\n alt={attachment.filename}\n className={`\n max-w-4xl max-h-screen object-contain\n transition-opacity duration-200\n ${isImageLoaded ? 'opacity-100' : 'opacity-0'}\n `}\n onLoad={() => setIsImageLoaded(true)}\n onError={() => setImageError(true)}\n loading=\"lazy\"\n />\n </div>\n\n {/* Metadata */}\n {isImageLoaded && !imageError && (\n <div className=\"absolute bottom-0 left-0 right-0 flex flex-col items-center text-white text-center pb-4 bg-gradient-to-t from-black/50 to-transparent pt-8\">\n <p id=\"modal-image-title\" className=\"text-lg font-medium\">\n {attachment.filename}\n </p>\n <div id=\"modal-image-description\" className=\"text-sm text-gray-300 space-x-2\">\n <span>{formatFileSize(attachment.sizeBytes)}</span>\n <span>•</span>\n <span>{attachment.mimeType}</span>\n </div>\n </div>\n )}\n\n {/* Navigation Arrows - Previous */}\n {hasMultipleImages && (\n <button\n onClick={() => onNavigate?.('prev')}\n disabled={!canNavigatePrev}\n className={`\n absolute left-4 z-40 flex items-center justify-center w-12 h-12\n rounded-full transition-all duration-200\n ${\n canNavigatePrev\n ? 'bg-white/10 hover:bg-white/20 text-white cursor-pointer'\n : 'bg-white/5 text-white/30 cursor-not-allowed'\n }\n `}\n aria-label=\"Previous image\"\n type=\"button\"\n >\n <CaretLeft size={28} weight=\"bold\" />\n </button>\n )}\n\n {/* Navigation Arrows - Next */}\n {hasMultipleImages && (\n <button\n onClick={() => onNavigate?.('next')}\n disabled={!canNavigateNext}\n className={`\n absolute right-4 z-40 flex items-center justify-center w-12 h-12\n rounded-full transition-all duration-200\n ${\n canNavigateNext\n ? 'bg-white/10 hover:bg-white/20 text-white cursor-pointer'\n : 'bg-white/5 text-white/30 cursor-not-allowed'\n }\n `}\n aria-label=\"Next image\"\n type=\"button\"\n >\n <CaretRight size={28} weight=\"bold\" />\n </button>\n )}\n\n {/* Image Counter */}\n {hasMultipleImages && (\n <div className=\"absolute top-4 left-4 bg-white/10 text-white px-3 py-1 rounded-full text-sm\">\n {currentIndex + 1} / {allAttachments?.length}\n </div>\n )}\n </div>\n </div>\n </>,\n document.body\n )\n}\n\nexport { ImageModal }\nexport default ImageModal\n","/**\n * UserMessage Component (Layer 3 Composite)\n * Styled component with slot-based customization for user messages\n */\n\nimport { useState, useCallback, type ReactNode } from 'react'\nimport { Copy, PencilSimple } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport AttachmentGrid from './AttachmentGrid'\nimport ImageModal from './ImageModal'\nimport type { UserTurn, ImageAttachment } from '../types'\n\n/* -------------------------------------------------------------------------------------------------\n * Slot Props Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UserMessageAvatarSlotProps {\n /** Default initials */\n initials: string\n}\n\nexport interface UserMessageContentSlotProps {\n /** Message content text */\n content: string\n}\n\nexport interface UserMessageAttachmentsSlotProps {\n /** Image attachments */\n attachments: ImageAttachment[]\n /** Handler to open image viewer */\n onView: (index: number) => void\n}\n\nexport interface UserMessageActionsSlotProps {\n /** Copy content to clipboard */\n onCopy: () => void\n /** Edit message (if available) */\n onEdit?: () => void\n /** Formatted timestamp */\n timestamp: string\n /** Whether copy action is available */\n canCopy: boolean\n /** Whether edit action is available */\n canEdit: boolean\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UserMessageSlots {\n /** Custom avatar renderer */\n avatar?: ReactNode | ((props: UserMessageAvatarSlotProps) => ReactNode)\n /** Custom content renderer */\n content?: ReactNode | ((props: UserMessageContentSlotProps) => ReactNode)\n /** Custom attachments renderer */\n attachments?: ReactNode | ((props: UserMessageAttachmentsSlotProps) => ReactNode)\n /** Custom actions renderer */\n actions?: ReactNode | ((props: UserMessageActionsSlotProps) => ReactNode)\n}\n\nexport interface UserMessageClassNames {\n /** Root container */\n root?: string\n /** Inner content wrapper */\n wrapper?: string\n /** Avatar container */\n avatar?: string\n /** Message bubble */\n bubble?: string\n /** Content text */\n content?: string\n /** Attachments container */\n attachments?: string\n /** Actions container */\n actions?: string\n /** Action button */\n actionButton?: string\n /** Timestamp */\n timestamp?: string\n}\n\nexport interface UserMessageProps {\n /** User turn data */\n turn: UserTurn\n /** Turn ID for edit operations */\n turnId?: string\n /** User initials for avatar */\n initials?: string\n /** Slot overrides */\n slots?: UserMessageSlots\n /** Class name overrides */\n classNames?: UserMessageClassNames\n /** Copy handler */\n onCopy?: (content: string) => Promise<void> | void\n /** Edit handler */\n onEdit?: (turnId: string, newContent: string) => void\n /** Hide avatar */\n hideAvatar?: boolean\n /** Hide actions */\n hideActions?: boolean\n /** Hide timestamp */\n hideTimestamp?: boolean\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Default Styles\n * -----------------------------------------------------------------------------------------------*/\n\nconst defaultClassNames: Required<UserMessageClassNames> = {\n root: 'flex gap-3 justify-end group',\n wrapper: 'flex-1 flex flex-col items-end max-w-[75%]',\n avatar: 'flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-sm',\n bubble: 'bg-primary-600 text-white rounded-2xl rounded-br-sm px-4 py-3',\n content: 'text-[15px] whitespace-pre-wrap break-words leading-relaxed',\n attachments: 'mb-2 w-full',\n actions: 'flex items-center gap-1 mt-2 opacity-0 group-hover:opacity-100 transition-opacity duration-150',\n actionButton: 'p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 rounded-md transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50',\n timestamp: 'text-xs text-gray-400 dark:text-gray-500 mr-1',\n}\n\nfunction mergeClassNames(\n defaults: Required<UserMessageClassNames>,\n overrides?: UserMessageClassNames\n): Required<UserMessageClassNames> {\n if (!overrides) return defaults\n return {\n root: overrides.root ?? defaults.root,\n wrapper: overrides.wrapper ?? defaults.wrapper,\n avatar: overrides.avatar ?? defaults.avatar,\n bubble: overrides.bubble ?? defaults.bubble,\n content: overrides.content ?? defaults.content,\n attachments: overrides.attachments ?? defaults.attachments,\n actions: overrides.actions ?? defaults.actions,\n actionButton: overrides.actionButton ?? defaults.actionButton,\n timestamp: overrides.timestamp ?? defaults.timestamp,\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * -----------------------------------------------------------------------------------------------*/\n\nexport function UserMessage({\n turn,\n turnId,\n initials = 'U',\n slots,\n classNames: classNameOverrides,\n onCopy,\n onEdit,\n hideAvatar = false,\n hideActions = false,\n hideTimestamp = false,\n}: UserMessageProps) {\n const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null)\n const [isEditing, setIsEditing] = useState(false)\n const [draftContent, setDraftContent] = useState('')\n const classes = mergeClassNames(defaultClassNames, classNameOverrides)\n\n // Convert attachments to ImageAttachment format\n const imageAttachments: ImageAttachment[] = turn.attachments\n .filter((a) => a.mimeType.startsWith('image/'))\n .map((a) => ({\n filename: a.filename,\n mimeType: a.mimeType,\n sizeBytes: a.sizeBytes,\n base64Data: a.base64Data || '',\n preview: a.base64Data ? `data:${a.mimeType};base64,${a.base64Data}` : '',\n }))\n\n const handleCopyClick = useCallback(async () => {\n if (onCopy) {\n await onCopy(turn.content)\n } else {\n try {\n await navigator.clipboard.writeText(turn.content)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n }, [onCopy, turn.content])\n\n const handleEditClick = useCallback(() => {\n if (onEdit && turnId) {\n setDraftContent(turn.content)\n setIsEditing(true)\n }\n }, [onEdit, turnId, turn.content])\n\n const handleEditCancel = useCallback(() => {\n setIsEditing(false)\n setDraftContent('')\n }, [])\n\n const handleEditSave = useCallback(() => {\n if (!onEdit || !turnId) return\n const newContent = draftContent\n if (!newContent.trim()) return\n if (newContent === turn.content) {\n setIsEditing(false)\n return\n }\n onEdit(turnId, newContent)\n setIsEditing(false)\n }, [onEdit, turnId, draftContent, turn.content])\n\n const handleNavigate = useCallback(\n (direction: 'prev' | 'next') => {\n if (selectedImageIndex === null) return\n\n if (direction === 'prev' && selectedImageIndex > 0) {\n setSelectedImageIndex(selectedImageIndex - 1)\n } else if (direction === 'next' && selectedImageIndex < imageAttachments.length - 1) {\n setSelectedImageIndex(selectedImageIndex + 1)\n }\n },\n [selectedImageIndex, imageAttachments.length]\n )\n\n const currentAttachment =\n selectedImageIndex !== null ? imageAttachments[selectedImageIndex] : null\n\n const timestamp = formatDistanceToNow(new Date(turn.createdAt), { addSuffix: true })\n\n // Slot props\n const avatarSlotProps: UserMessageAvatarSlotProps = { initials }\n const contentSlotProps: UserMessageContentSlotProps = { content: turn.content }\n const attachmentsSlotProps: UserMessageAttachmentsSlotProps = {\n attachments: imageAttachments,\n onView: (index) => setSelectedImageIndex(index),\n }\n const actionsSlotProps: UserMessageActionsSlotProps = {\n onCopy: handleCopyClick,\n onEdit: onEdit && turnId ? handleEditClick : undefined,\n timestamp,\n canCopy: true,\n canEdit: !!onEdit && !!turnId,\n }\n\n // Render helpers\n const renderSlot = <T,>(\n slot: ReactNode | ((props: T) => ReactNode) | undefined,\n props: T,\n defaultContent: ReactNode\n ): ReactNode => {\n if (slot === undefined) return defaultContent\n if (typeof slot === 'function') return slot(props)\n return slot\n }\n\n return (\n <div className={classes.root}>\n <div className={classes.wrapper}>\n {/* Attachments */}\n {imageAttachments.length > 0 && (\n <div className={classes.attachments}>\n {renderSlot(\n slots?.attachments,\n attachmentsSlotProps,\n <AttachmentGrid\n attachments={imageAttachments}\n onView={(index) => setSelectedImageIndex(index)}\n />\n )}\n </div>\n )}\n\n {/* Message bubble */}\n {turn.content && (\n <div className={classes.bubble}>\n <div className={classes.content}>\n {isEditing ? (\n <div className=\"space-y-2\">\n <textarea\n value={draftContent}\n onChange={(e) => setDraftContent(e.target.value)}\n className=\"w-full min-h-[80px] resize-y rounded-lg px-3 py-2 bg-white/10 text-white placeholder-white/70 outline-none focus:ring-2 focus:ring-white/30\"\n aria-label=\"Edit message\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={handleEditCancel}\n className=\"px-3 py-1.5 rounded-lg bg-white/10 hover:bg-white/15 transition-colors text-sm font-medium\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleEditSave}\n className=\"px-3 py-1.5 rounded-lg bg-white/20 hover:bg-white/25 transition-colors text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed\"\n disabled={!draftContent.trim() || draftContent === turn.content}\n >\n Save\n </button>\n </div>\n </div>\n ) : (\n renderSlot(slots?.content, contentSlotProps, turn.content)\n )}\n </div>\n </div>\n )}\n\n {/* Actions */}\n {!hideActions && (\n <div className={classes.actions}>\n {renderSlot(\n slots?.actions,\n actionsSlotProps,\n <>\n {!hideTimestamp && <span className={classes.timestamp}>{timestamp}</span>}\n\n <button\n onClick={handleCopyClick}\n className={classes.actionButton}\n aria-label=\"Copy message\"\n title=\"Copy\"\n >\n <Copy size={14} weight=\"regular\" />\n </button>\n\n {onEdit && turnId && (\n <button\n onClick={handleEditClick}\n className={classes.actionButton}\n aria-label=\"Edit message\"\n title=\"Edit\"\n disabled={isEditing}\n >\n <PencilSimple size={14} weight=\"regular\" />\n </button>\n )}\n </>\n )}\n </div>\n )}\n </div>\n\n {/* Avatar */}\n {!hideAvatar && (\n <div className={classes.avatar}>\n {renderSlot(slots?.avatar, avatarSlotProps, initials)}\n </div>\n )}\n\n {/* Image modal */}\n {currentAttachment && (\n <ImageModal\n isOpen={selectedImageIndex !== null}\n onClose={() => setSelectedImageIndex(null)}\n attachment={currentAttachment}\n allAttachments={imageAttachments}\n currentIndex={selectedImageIndex ?? 0}\n onNavigate={handleNavigate}\n />\n )}\n </div>\n )\n}\n\nexport default UserMessage\n","/**\n * UserTurnView Component (Layer 4 - Backward Compatible)\n * Displays user messages with attachments, image modal, and actions\n *\n * Uses turn-based architecture - receives a ConversationTurn and displays\n * the userTurn content.\n *\n * For more customization, use the UserMessage component directly with slots.\n */\n\nimport { useChat } from '../context/ChatContext'\nimport { UserMessage, type UserMessageSlots, type UserMessageClassNames } from './UserMessage'\nimport type { ConversationTurn } from '../types'\n\nexport interface UserTurnViewProps {\n /** The conversation turn containing the user message */\n turn: ConversationTurn\n /** Slot overrides for customization */\n slots?: UserMessageSlots\n /** Class name overrides */\n classNames?: UserMessageClassNames\n /** User initials for avatar */\n initials?: string\n /** Hide avatar */\n hideAvatar?: boolean\n /** Hide actions */\n hideActions?: boolean\n /** Hide timestamp */\n hideTimestamp?: boolean\n}\n\nexport function UserTurnView({\n turn,\n slots,\n classNames,\n initials = 'U',\n hideAvatar,\n hideActions,\n hideTimestamp,\n}: UserTurnViewProps) {\n const { handleEdit, handleCopy } = useChat()\n\n return (\n <UserMessage\n turn={turn.userTurn}\n turnId={turn.id}\n initials={initials}\n slots={slots}\n classNames={classNames}\n onCopy={handleCopy}\n onEdit={handleEdit}\n hideAvatar={hideAvatar}\n hideActions={hideActions}\n hideTimestamp={hideTimestamp}\n />\n )\n}\n\nexport default UserTurnView\n","/**\n * CodeOutputsPanel Component\n * Displays code interpreter outputs (images, text, errors)\n *\n * Output types:\n * - image: Base64-encoded image data (content is base64 string, mimeType specifies format)\n * - text: Plain text output from code execution\n * - error: Error messages from failed code execution\n */\n\nimport { Download } from '@phosphor-icons/react'\nimport type { CodeOutput } from '../types'\nimport { formatFileSize } from '../utils/fileUtils'\n\ninterface CodeOutputsPanelProps {\n outputs: CodeOutput[]\n}\n\nfunction toBase64(str: string): string {\n // btoa() only supports Latin1; this converts UTF-8 bytes to a binary string first.\n const bytes = new TextEncoder().encode(str)\n let binary = ''\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\nfunction CodeOutputsPanel({ outputs }: CodeOutputsPanelProps) {\n if (!outputs || outputs.length === 0) return null\n\n return (\n <div className=\"mb-2 p-3 bg-gray-50 dark:bg-gray-900/50 rounded-lg border border-gray-200 dark:border-gray-700\">\n <div className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 mb-2\">\n Code Output\n </div>\n <div className=\"space-y-2\">\n {outputs.map((output, index) => (\n <div key={index}>\n {output.type === 'image' && (\n <div className=\"relative group\">\n <img\n src={\n output.content.startsWith('data:')\n ? output.content\n : `data:${output.mimeType || 'image/png'};base64,${output.content}`\n }\n alt={output.filename || 'Code output'}\n className=\"max-w-full rounded border border-gray-300 dark:border-gray-600\"\n />\n {/* File info overlay */}\n {output.filename && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/60 to-transparent p-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <div className=\"flex items-center justify-between text-white text-xs\">\n <span className=\"truncate\">{output.filename}</span>\n {output.sizeBytes && (\n <span className=\"text-gray-300\">{formatFileSize(output.sizeBytes)}</span>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n {output.type === 'text' && (\n <div>\n <pre className=\"text-xs bg-white dark:bg-gray-800 p-2 rounded overflow-x-auto border border-gray-200 dark:border-gray-700\">\n <code className=\"text-gray-900 dark:text-gray-100\">{output.content}</code>\n </pre>\n {/* File download link */}\n {output.filename && (\n <div className=\"flex items-center gap-2 mt-1 text-xs\">\n <a\n href={`data:${output.mimeType || 'text/plain'};base64,${toBase64(output.content)}`}\n download={output.filename}\n className=\"flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline\"\n >\n <Download size={12} weight=\"bold\" />\n {output.filename}\n </a>\n {output.sizeBytes && (\n <span className=\"text-gray-500 dark:text-gray-400\">\n ({formatFileSize(output.sizeBytes)})\n </span>\n )}\n </div>\n )}\n </div>\n )}\n {output.type === 'error' && (\n <div className=\"text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 p-2 rounded border border-red-200 dark:border-red-800\">\n <div className=\"font-semibold mb-1\">Error</div>\n <pre className=\"whitespace-pre-wrap\">{output.content}</pre>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport { CodeOutputsPanel }\nexport default CodeOutputsPanel\n","/**\n * StreamingCursor Component\n * Animated cursor shown during AI response streaming\n */\n\n\nfunction StreamingCursor() {\n return (\n <span\n className=\"inline-block w-1.5 h-4 ml-0.5 bg-primary-600 dark:bg-primary-500 animate-pulse\"\n aria-label=\"AI is typing\"\n />\n )\n}\n\nexport { StreamingCursor }\nexport default StreamingCursor\n","/**\n * ChartCard Component\n * Renders chart visualizations using ApexCharts\n *\n * Supports multiple chart types: line, bar, pie, area, donut\n * Includes PNG export functionality and responsive styling\n */\n\nimport { useState, useId } from 'react'\nimport ReactApexChart from 'react-apexcharts'\nimport ApexCharts, { ApexOptions } from 'apexcharts'\nimport { Download } from '@phosphor-icons/react'\nimport type { ChartData } from '../types'\n\ninterface ChartCardProps {\n chartData: ChartData\n}\n\n// Default color palette if none provided\nconst DEFAULT_COLORS = ['#008FFB', '#00E396', '#FEB019', '#FF4560', '#775DD0']\n\n/**\n * ChartCard renders a single chart visualization with optional PNG export.\n *\n * Chart types:\n * - line: Line chart with multiple series\n * - bar: Bar chart with multiple series\n * - area: Area chart with multiple series (filled)\n * - pie: Pie chart (single series)\n * - donut: Donut chart (single series)\n *\n * @param chartData - Chart specification from GraphQL API\n */\nexport function ChartCard({ chartData }: ChartCardProps) {\n // Generate unique chart ID using React's useId hook\n const chartId = useId().replace(/:/g, '_')\n const [isExporting, setIsExporting] = useState(false)\n\n const { chartType, title, series, labels, colors, height = 350 } = chartData\n\n // Validate chart data to prevent ApexCharts crash\n // Series must exist, have at least one series, and that series must have data\n const hasValidData =\n series && series.length > 0 && series.some((s) => s.data && s.data.length > 0)\n\n if (!hasValidData) {\n return (\n <div className=\"bg-white dark:bg-gray-800 rounded-lg border border-[var(--bichat-border)] p-4 my-2 shadow-sm w-full max-w-full\">\n <p className=\"text-gray-500 dark:text-gray-400 text-sm\">\n {title && <span className=\"font-medium\">{title}: </span>}\n No data available for chart visualization.\n </p>\n </div>\n )\n }\n\n // Map series to ApexCharts format\n // Pie/donut charts expect flat array of values, other charts expect array of series objects\n const apexSeries =\n chartType === 'pie' || chartType === 'donut'\n ? series[0]?.data ?? [] // Pie/donut use flat array\n : series.map((s) => ({ name: s.name, data: s.data }))\n\n // Build xaxis config for non-pie charts\n const xaxisConfig =\n chartType !== 'pie' && chartType !== 'donut'\n ? { categories: (labels ?? []).filter((l): l is string => l !== null) }\n : {}\n\n // Build labels config for pie/donut charts\n const labelsConfig =\n chartType === 'pie' || chartType === 'donut'\n ? (labels ?? []).filter((l): l is string => l !== null)\n : []\n\n const options: ApexOptions = {\n chart: {\n id: chartId,\n type: chartType as 'line' | 'bar' | 'area' | 'pie' | 'donut',\n toolbar: { show: false },\n animations: { enabled: false },\n },\n title: {\n text: title,\n align: 'left',\n style: { fontSize: '14px', fontWeight: 600 },\n },\n colors: colors?.length ? colors : DEFAULT_COLORS,\n xaxis: xaxisConfig,\n labels: labelsConfig,\n legend: { position: 'bottom', horizontalAlign: 'center' },\n dataLabels: { enabled: chartType === 'pie' || chartType === 'donut' },\n stroke: {\n curve: 'smooth',\n width: chartType === 'line' || chartType === 'area' ? 2 : 0,\n },\n fill: { opacity: chartType === 'area' ? 0.4 : 1 },\n }\n\n /**\n * Export chart as PNG image\n * Uses ApexCharts.getChartByID to access chart instance and dataURI method\n */\n const handleExportPNG = async () => {\n setIsExporting(true)\n\n try {\n // Access ApexCharts instance via chart ID\n const chart = ApexCharts.getChartByID(chartId)\n if (!chart) {\n console.error('Chart instance not available')\n setIsExporting(false)\n return\n }\n const result = await chart.dataURI({ scale: 2 })\n\n // dataURI returns { imgURI } when successful\n if (!('imgURI' in result)) {\n console.error('Unexpected dataURI result format')\n return\n }\n\n // Create download link and trigger download\n const link = document.createElement('a')\n link.href = result.imgURI\n link.download = `${title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}_chart.png`\n link.click()\n } catch (error) {\n console.error('Failed to export chart:', error)\n } finally {\n setIsExporting(false)\n }\n }\n\n // Fixed width to fit within max-w-2xl container (672px - 32px padding)\n const chartWidth = 600\n\n return (\n <div className=\"bg-white dark:bg-gray-800 rounded-lg border border-[var(--bichat-border)] p-4 my-2 shadow-sm w-full max-w-[632px] min-w-0 overflow-hidden\">\n <div className=\"w-full min-w-0\">\n <ReactApexChart\n options={options}\n series={apexSeries}\n type={chartType}\n width={chartWidth}\n height={height}\n />\n </div>\n <div className=\"flex justify-end mt-2\">\n <button\n onClick={handleExportPNG}\n disabled={isExporting}\n className=\"text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 flex items-center gap-1 transition-colors\"\n title=\"Download chart as PNG\"\n >\n {isExporting ? (\n <span>Exporting...</span>\n ) : (\n <>\n <Download className=\"w-4 h-4\" />\n Download PNG\n </>\n )}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * SourcesPanel component\n * Displays citations and sources\n */\n\nimport { useState } from 'react'\nimport { Citation } from '../types'\n\ninterface SourcesPanelProps {\n citations: Citation[]\n}\n\nexport function SourcesPanel({ citations }: SourcesPanelProps) {\n const [expanded, setExpanded] = useState(false)\n\n if (!citations || citations.length === 0) {\n return null\n }\n\n return (\n <div className=\"mt-4 border-t border-[var(--bichat-border)] pt-3\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded-md p-1 -m-1\"\n aria-expanded={expanded}\n >\n <svg\n className={`w-4 h-4 transition-transform duration-150 ${expanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n <span>{citations.length} {citations.length === 1 ? 'source' : 'sources'}</span>\n </button>\n {expanded && (\n <div className=\"mt-2 space-y-2\">\n {citations.map((citation, index) => (\n <div\n key={citation.id}\n className=\"p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg text-sm\"\n >\n <div className=\"flex items-start gap-2\">\n <span className=\"flex-shrink-0 w-5 h-5 bg-[var(--bichat-primary)] text-white rounded-full flex items-center justify-center text-xs\">\n {index + 1}\n </span>\n <div className=\"flex-1\">\n <div className=\"font-medium text-gray-900 dark:text-gray-100\">{citation.title || citation.source}</div>\n {citation.url && (\n <a\n href={citation.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[var(--bichat-primary)] hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded\"\n >\n {citation.url}\n </a>\n )}\n {citation.excerpt && (\n <div className=\"mt-1 text-gray-600 dark:text-gray-400 italic\">\"{citation.excerpt}\"</div>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * DownloadCard component\n * Displays downloadable artifacts (Excel, PDF)\n */\n\nimport { Artifact } from '../types'\n\ninterface DownloadCardProps {\n artifact: Artifact\n}\n\nexport function DownloadCard({ artifact }: DownloadCardProps) {\n const { type, filename, url, sizeReadable, rowCount, description } = artifact\n\n const icon =\n type === 'excel' ? (\n <svg className=\"w-8 h-8 text-green-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M9 2a2 2 0 00-2 2v8a2 2 0 002 2h6a2 2 0 002-2V6.414A2 2 0 0016.414 5L14 2.586A2 2 0 0012.586 2H9z\" />\n <path d=\"M3 8a2 2 0 012-2v10h8a2 2 0 01-2 2H5a2 2 0 01-2-2V8z\" />\n </svg>\n ) : (\n <svg className=\"w-8 h-8 text-red-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n\n return (\n <a\n href={url}\n download={filename}\n className=\"flex items-center gap-3 p-4 border border-[var(--bichat-border)] rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <div>{icon}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-gray-900 truncate\">{filename}</div>\n <div className=\"flex items-center gap-2 text-sm text-gray-600\">\n {sizeReadable && <span>{sizeReadable}</span>}\n {rowCount !== undefined && (\n <>\n <span>•</span>\n <span>{rowCount} rows</span>\n </>\n )}\n </div>\n {description && <div className=\"text-sm text-gray-600 mt-1\">{description}</div>}\n </div>\n <svg\n className=\"w-5 h-5 text-gray-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n </a>\n )\n}\n","/**\n * InlineQuestionForm component\n * Handles HITL (Human-in-the-Loop) questions from the AI agent\n *\n * Supports multiple questions with multi-step navigation:\n * - SINGLE_CHOICE: Radio buttons + always-present \"Other\" text input\n * - MULTIPLE_CHOICE: Checkboxes + always-present \"Other\" text input\n */\n\nimport { useState, useCallback } from 'react'\nimport { CaretLeft, CaretRight, Question } from '@phosphor-icons/react'\nimport { PendingQuestion, QuestionAnswers } from '../types'\nimport { useChat } from '../context/ChatContext'\n\ninterface InlineQuestionFormProps {\n pendingQuestion: PendingQuestion\n}\n\nexport function InlineQuestionForm({ pendingQuestion }: InlineQuestionFormProps) {\n const { handleSubmitQuestionAnswers, handleCancelPendingQuestion, loading } = useChat()\n const [currentStep, setCurrentStep] = useState(0)\n const [answers, setAnswers] = useState<QuestionAnswers>({})\n const [otherTexts, setOtherTexts] = useState<Record<string, string>>({})\n\n const questions = pendingQuestion.questions\n const currentQuestion = questions[currentStep]\n const isLastStep = currentStep === questions.length - 1\n const isFirstStep = currentStep === 0\n const totalSteps = questions.length\n\n // Get current answer for the current question\n const currentAnswer = answers[currentQuestion?.id]\n const currentOtherText = otherTexts[currentQuestion?.id] || ''\n\n const handleOptionChange = useCallback(\n (optionLabel: string, checked: boolean) => {\n if (!currentQuestion) return\n const questionId = currentQuestion.id\n const existingAnswer = answers[questionId] || { options: [] }\n const isOtherOption = optionLabel === '__other__'\n const isMultiSelect = currentQuestion.type === 'MULTIPLE_CHOICE'\n\n // \"Other\" is mutually exclusive with predefined options.\n if (isOtherOption) {\n setAnswers({\n ...answers,\n [questionId]: {\n options: [],\n customText: checked ? currentOtherText : undefined,\n },\n })\n return\n }\n\n let newOptions: string[]\n if (isMultiSelect) {\n // Multi-select: toggle option\n if (!checked) {\n newOptions = existingAnswer.options.filter((o) => o !== optionLabel)\n } else if (existingAnswer.options.includes(optionLabel)) {\n newOptions = existingAnswer.options\n } else {\n newOptions = [...existingAnswer.options, optionLabel]\n }\n } else {\n // Single-select: replace selection (radio)\n newOptions = checked ? [optionLabel] : []\n }\n\n setAnswers({\n ...answers,\n [questionId]: {\n options: newOptions,\n customText: undefined,\n },\n })\n },\n [currentQuestion, answers, currentOtherText]\n )\n\n const handleOtherTextChange = useCallback(\n (text: string) => {\n if (!currentQuestion) return\n const questionId = currentQuestion.id\n setOtherTexts({ ...otherTexts, [questionId]: text })\n\n // Update the answer with custom text (\"Other\" is selected when customText is set)\n setAnswers({\n ...answers,\n [questionId]: {\n options: [],\n customText: text,\n },\n })\n },\n [currentQuestion, answers, otherTexts]\n )\n\n const isCurrentAnswerValid = (): boolean => {\n if (!currentQuestion) return false\n\n const answer = answers[currentQuestion.id]\n const required = currentQuestion.required ?? true\n\n if (!answer) return !required\n\n const hasOptionSelection = answer.options.length > 0\n const hasOtherSelected = answer.customText !== undefined\n const hasOtherText = (answer.customText?.trim().length ?? 0) > 0\n\n if (!hasOptionSelection && !hasOtherSelected) {\n return !required\n }\n\n if (hasOptionSelection) {\n return true\n }\n\n // \"Other\" selected: require non-empty text if required\n return !required || hasOtherText\n }\n\n const handleNext = () => {\n if (!isCurrentAnswerValid()) return\n\n if (isLastStep) {\n handleSubmitQuestionAnswers(answers)\n } else {\n setCurrentStep(currentStep + 1)\n }\n }\n\n const handleBack = () => {\n if (!isFirstStep) {\n setCurrentStep(currentStep - 1)\n }\n }\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n handleNext()\n }\n\n if (!currentQuestion) return null\n\n const isMultiSelect = currentQuestion.type === 'MULTIPLE_CHOICE'\n const options = currentQuestion.options || []\n const isOtherSelected = currentAnswer?.customText !== undefined\n\n return (\n <div className=\"border border-amber-200 dark:border-amber-800 rounded-lg p-4 bg-amber-50 dark:bg-amber-900/20\">\n <form onSubmit={handleSubmit}>\n {/* Header with progress */}\n <div className=\"flex items-start gap-2 mb-4\">\n <Question\n className=\"w-5 h-5 text-amber-600 dark:text-amber-400 flex-shrink-0 mt-0.5\"\n weight=\"fill\"\n />\n <div className=\"flex-1\">\n <div className=\"flex items-center justify-between mb-1\">\n <h4 className=\"font-medium text-gray-900 dark:text-gray-100\">Question from AI</h4>\n {totalSteps > 1 && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {currentStep + 1} of {totalSteps}\n </span>\n )}\n </div>\n <p className=\"text-gray-700 dark:text-gray-300\">{currentQuestion.text}</p>\n </div>\n </div>\n\n {/* Progress bar for multi-step */}\n {totalSteps > 1 && (\n <div className=\"flex gap-1 mb-4\">\n {questions.map((_, index) => (\n <div\n key={index}\n className={`h-1 flex-1 rounded-full transition-colors ${\n index <= currentStep\n ? 'bg-amber-500 dark:bg-amber-400'\n : 'bg-gray-200 dark:bg-gray-700'\n }`}\n />\n ))}\n </div>\n )}\n\n {/* Question content */}\n <div className=\"space-y-2 mb-4\">\n {options.map((option) => (\n <label\n key={option.id}\n className=\"flex items-center gap-2 p-2 hover:bg-amber-100 dark:hover:bg-amber-900/30 rounded cursor-pointer\"\n >\n <input\n type={isMultiSelect ? 'checkbox' : 'radio'}\n name={`question-${currentQuestion.id}`}\n value={option.value}\n checked={currentAnswer?.options.includes(option.label) || false}\n onChange={(e) => handleOptionChange(option.label, e.target.checked)}\n className=\"w-4 h-4 text-amber-600 focus:ring-amber-500\"\n />\n <span className=\"text-gray-900 dark:text-gray-100\">{option.label}</span>\n </label>\n ))}\n\n {/* Always-present \"Other\" option */}\n <label className=\"flex items-center gap-2 p-2 hover:bg-amber-100 dark:hover:bg-amber-900/30 rounded cursor-pointer\">\n <input\n type={isMultiSelect ? 'checkbox' : 'radio'}\n name={`question-${currentQuestion.id}`}\n value=\"__other__\"\n checked={isOtherSelected}\n onChange={(e) => handleOptionChange('__other__', e.target.checked)}\n className=\"w-4 h-4 text-amber-600 focus:ring-amber-500\"\n />\n <span className=\"text-gray-900 dark:text-gray-100\">Other</span>\n </label>\n\n {/* Other text input */}\n {isOtherSelected && (\n <div className=\"ml-6\">\n <input\n type=\"text\"\n value={currentOtherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n placeholder=\"Please specify...\"\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-amber-500 focus:border-transparent\"\n />\n </div>\n )}\n </div>\n\n {/* Navigation buttons */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-2\">\n {!isFirstStep && (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"flex items-center gap-1 px-3 py-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors\"\n >\n <CaretLeft size={16} weight=\"bold\" />\n Back\n </button>\n )}\n </div>\n\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={handleCancelPendingQuestion}\n disabled={loading}\n className=\"px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={loading || !isCurrentAnswerValid()}\n className=\"flex items-center gap-1 px-4 py-2 bg-amber-600 text-white rounded-lg hover:bg-amber-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isLastStep ? 'Submit' : 'Next'}\n {!isLastStep && <CaretRight size={16} weight=\"bold\" />}\n </button>\n </div>\n </div>\n </form>\n </div>\n )\n}\n","/**\n * AssistantMessage Component (Layer 3 Composite)\n * Styled component with slot-based customization for assistant messages\n */\n\nimport { useState, useCallback, lazy, Suspense, type ReactNode } from 'react'\nimport { Copy, ArrowsClockwise } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport CodeOutputsPanel from './CodeOutputsPanel'\nimport StreamingCursor from './StreamingCursor'\nimport { ChartCard } from './ChartCard'\nimport { SourcesPanel } from './SourcesPanel'\nimport { DownloadCard } from './DownloadCard'\nimport { InlineQuestionForm } from './InlineQuestionForm'\nimport type { AssistantTurn, Citation, ChartData, Artifact, CodeOutput, PendingQuestion } from '../types'\n\nconst MarkdownRenderer = lazy(() =>\n import('./MarkdownRenderer').then((module) => ({ default: module.MarkdownRenderer }))\n)\n\n/* -------------------------------------------------------------------------------------------------\n * Slot Props Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AssistantMessageAvatarSlotProps {\n /** Default text */\n text: string\n}\n\nexport interface AssistantMessageContentSlotProps {\n /** Message content (markdown) */\n content: string\n /** Citations */\n citations?: Citation[]\n /** Whether streaming is active */\n isStreaming: boolean\n}\n\nexport interface AssistantMessageSourcesSlotProps {\n /** Citations to display */\n citations: Citation[]\n}\n\nexport interface AssistantMessageChartsSlotProps {\n /** Chart data */\n chartData: ChartData\n}\n\nexport interface AssistantMessageCodeOutputsSlotProps {\n /** Code execution outputs */\n outputs: CodeOutput[]\n}\n\nexport interface AssistantMessageArtifactsSlotProps {\n /** Downloadable artifacts */\n artifacts: Artifact[]\n}\n\nexport interface AssistantMessageActionsSlotProps {\n /** Copy content to clipboard */\n onCopy: () => void\n /** Regenerate response */\n onRegenerate?: () => void\n /** Formatted timestamp */\n timestamp: string\n /** Whether copy action is available */\n canCopy: boolean\n /** Whether regenerate action is available */\n canRegenerate: boolean\n}\n\nexport interface AssistantMessageExplanationSlotProps {\n /** Explanation content (markdown) */\n explanation: string\n /** Whether expanded */\n isExpanded: boolean\n /** Toggle expansion */\n onToggle: () => void\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AssistantMessageSlots {\n /** Custom avatar renderer */\n avatar?: ReactNode | ((props: AssistantMessageAvatarSlotProps) => ReactNode)\n /** Custom content renderer */\n content?: ReactNode | ((props: AssistantMessageContentSlotProps) => ReactNode)\n /** Custom sources renderer */\n sources?: ReactNode | ((props: AssistantMessageSourcesSlotProps) => ReactNode)\n /** Custom charts renderer */\n charts?: ReactNode | ((props: AssistantMessageChartsSlotProps) => ReactNode)\n /** Custom code outputs renderer */\n codeOutputs?: ReactNode | ((props: AssistantMessageCodeOutputsSlotProps) => ReactNode)\n /** Custom artifacts renderer */\n artifacts?: ReactNode | ((props: AssistantMessageArtifactsSlotProps) => ReactNode)\n /** Custom actions renderer */\n actions?: ReactNode | ((props: AssistantMessageActionsSlotProps) => ReactNode)\n /** Custom explanation renderer */\n explanation?: ReactNode | ((props: AssistantMessageExplanationSlotProps) => ReactNode)\n}\n\nexport interface AssistantMessageClassNames {\n /** Root container */\n root?: string\n /** Inner content wrapper */\n wrapper?: string\n /** Avatar container */\n avatar?: string\n /** Message bubble */\n bubble?: string\n /** Code outputs container */\n codeOutputs?: string\n /** Charts container */\n charts?: string\n /** Artifacts container */\n artifacts?: string\n /** Sources container */\n sources?: string\n /** Explanation container */\n explanation?: string\n /** Actions container */\n actions?: string\n /** Action button */\n actionButton?: string\n /** Timestamp */\n timestamp?: string\n}\n\nexport interface AssistantMessageProps {\n /** Assistant turn data */\n turn: AssistantTurn\n /** Turn ID for regenerate operations */\n turnId?: string\n /** Whether response is being streamed */\n isStreaming?: boolean\n /** Pending question for HITL */\n pendingQuestion?: PendingQuestion | null\n /** Slot overrides */\n slots?: AssistantMessageSlots\n /** Class name overrides */\n classNames?: AssistantMessageClassNames\n /** Copy handler */\n onCopy?: (content: string) => Promise<void> | void\n /** Regenerate handler */\n onRegenerate?: (turnId: string) => Promise<void> | void\n /** Send message handler (for markdown links) */\n onSendMessage?: (content: string) => void\n /** Whether sending is disabled */\n sendDisabled?: boolean\n /** Hide avatar */\n hideAvatar?: boolean\n /** Hide actions */\n hideActions?: boolean\n /** Hide timestamp */\n hideTimestamp?: boolean\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Default Styles\n * -----------------------------------------------------------------------------------------------*/\n\nconst defaultClassNames: Required<AssistantMessageClassNames> = {\n root: 'flex gap-3 group',\n wrapper: 'flex-1 flex flex-col gap-3 max-w-[85%]',\n avatar: 'flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white font-medium text-xs',\n bubble: 'bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-2xl rounded-bl-sm px-4 py-3',\n codeOutputs: '',\n charts: 'mb-1 w-full',\n artifacts: 'mb-1 flex flex-wrap gap-2',\n sources: '',\n explanation: 'mt-4 border-t border-gray-100 dark:border-gray-700 pt-4',\n actions: 'flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity duration-150',\n actionButton: 'p-1.5 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 active:bg-gray-200 dark:active:bg-gray-700 rounded-md transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50',\n timestamp: 'text-xs text-gray-400 dark:text-gray-500 mr-1',\n}\n\nfunction mergeClassNames(\n defaults: Required<AssistantMessageClassNames>,\n overrides?: AssistantMessageClassNames\n): Required<AssistantMessageClassNames> {\n if (!overrides) return defaults\n return {\n root: overrides.root ?? defaults.root,\n wrapper: overrides.wrapper ?? defaults.wrapper,\n avatar: overrides.avatar ?? defaults.avatar,\n bubble: overrides.bubble ?? defaults.bubble,\n codeOutputs: overrides.codeOutputs ?? defaults.codeOutputs,\n charts: overrides.charts ?? defaults.charts,\n artifacts: overrides.artifacts ?? defaults.artifacts,\n sources: overrides.sources ?? defaults.sources,\n explanation: overrides.explanation ?? defaults.explanation,\n actions: overrides.actions ?? defaults.actions,\n actionButton: overrides.actionButton ?? defaults.actionButton,\n timestamp: overrides.timestamp ?? defaults.timestamp,\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Component\n * -----------------------------------------------------------------------------------------------*/\n\nexport function AssistantMessage({\n turn,\n turnId,\n isStreaming = false,\n pendingQuestion,\n slots,\n classNames: classNameOverrides,\n onCopy,\n onRegenerate,\n onSendMessage,\n sendDisabled = false,\n hideAvatar = false,\n hideActions = false,\n hideTimestamp = false,\n}: AssistantMessageProps) {\n const [explanationExpanded, setExplanationExpanded] = useState(false)\n const classes = mergeClassNames(defaultClassNames, classNameOverrides)\n\n const hasContent = turn.content?.trim().length > 0\n const hasExplanation = !!turn.explanation?.trim()\n const hasPendingQuestion =\n !!pendingQuestion &&\n pendingQuestion.status === 'PENDING' &&\n pendingQuestion.turnId === turnId\n\n const handleCopyClick = useCallback(async () => {\n if (onCopy) {\n await onCopy(turn.content)\n } else {\n try {\n await navigator.clipboard.writeText(turn.content)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n }, [onCopy, turn.content])\n\n const handleRegenerateClick = useCallback(async () => {\n if (onRegenerate && turnId) {\n await onRegenerate(turnId)\n }\n }, [onRegenerate, turnId])\n\n const timestamp = formatDistanceToNow(new Date(turn.createdAt), { addSuffix: true })\n\n // Slot props\n const avatarSlotProps: AssistantMessageAvatarSlotProps = { text: 'AI' }\n const contentSlotProps: AssistantMessageContentSlotProps = {\n content: turn.content,\n citations: turn.citations,\n isStreaming,\n }\n const sourcesSlotProps: AssistantMessageSourcesSlotProps = {\n citations: turn.citations || [],\n }\n const chartsSlotProps: AssistantMessageChartsSlotProps = {\n chartData: turn.chartData!,\n }\n const codeOutputsSlotProps: AssistantMessageCodeOutputsSlotProps = {\n outputs: turn.codeOutputs || [],\n }\n const artifactsSlotProps: AssistantMessageArtifactsSlotProps = {\n artifacts: turn.artifacts || [],\n }\n const actionsSlotProps: AssistantMessageActionsSlotProps = {\n onCopy: handleCopyClick,\n onRegenerate: onRegenerate && turnId ? handleRegenerateClick : undefined,\n timestamp,\n canCopy: hasContent,\n canRegenerate: !!onRegenerate && !!turnId,\n }\n const explanationSlotProps: AssistantMessageExplanationSlotProps = {\n explanation: turn.explanation || '',\n isExpanded: explanationExpanded,\n onToggle: () => setExplanationExpanded(!explanationExpanded),\n }\n\n // Render helpers\n const renderSlot = <T,>(\n slot: ReactNode | ((props: T) => ReactNode) | undefined,\n props: T,\n defaultContent: ReactNode\n ): ReactNode => {\n if (slot === undefined) return defaultContent\n if (typeof slot === 'function') return slot(props)\n return slot\n }\n\n return (\n <div className={classes.root}>\n {/* Avatar */}\n {!hideAvatar && (\n <div className={classes.avatar}>\n {renderSlot(slots?.avatar, avatarSlotProps, 'AI')}\n </div>\n )}\n\n <div className={classes.wrapper}>\n {/* Code outputs */}\n {turn.codeOutputs && turn.codeOutputs.length > 0 && (\n <div className={classes.codeOutputs}>\n {renderSlot(\n slots?.codeOutputs,\n codeOutputsSlotProps,\n <CodeOutputsPanel outputs={turn.codeOutputs} />\n )}\n </div>\n )}\n\n {/* Charts */}\n {turn.chartData && (\n <div className={classes.charts}>\n {renderSlot(slots?.charts, chartsSlotProps, <ChartCard chartData={turn.chartData} />)}\n </div>\n )}\n\n {/* Artifacts */}\n {turn.artifacts && turn.artifacts.length > 0 && (\n <div className={classes.artifacts}>\n {renderSlot(\n slots?.artifacts,\n artifactsSlotProps,\n turn.artifacts.map((artifact, index) => (\n <DownloadCard key={`${artifact.filename}-${index}`} artifact={artifact} />\n ))\n )}\n </div>\n )}\n\n {/* Message bubble */}\n {hasContent && (\n <div className={classes.bubble}>\n {renderSlot(\n slots?.content,\n contentSlotProps,\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 text-sm text-gray-400 dark:text-gray-500\">\n <div className=\"w-4 h-4 border-2 border-gray-300 dark:border-gray-600 border-t-transparent rounded-full animate-spin\" />\n Loading...\n </div>\n }\n >\n <MarkdownRenderer\n content={turn.content}\n citations={turn.citations}\n sendMessage={onSendMessage}\n sendDisabled={sendDisabled || isStreaming}\n />\n </Suspense>\n )}\n\n {/* Streaming cursor */}\n {isStreaming && <StreamingCursor />}\n\n {/* Sources panel */}\n {turn.citations && turn.citations.length > 0 && (\n <div className={classes.sources}>\n {renderSlot(\n slots?.sources,\n sourcesSlotProps,\n <SourcesPanel citations={turn.citations} />\n )}\n </div>\n )}\n\n {/* Explanation section */}\n {hasExplanation && (\n <div className={classes.explanation}>\n {renderSlot(\n slots?.explanation,\n explanationSlotProps,\n <>\n <button\n type=\"button\"\n onClick={() => setExplanationExpanded(!explanationExpanded)}\n className=\"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded-md p-1 -m-1\"\n aria-expanded={explanationExpanded}\n >\n <svg\n className={`w-4 h-4 transition-transform duration-150 ${explanationExpanded ? 'rotate-90' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n <span className=\"font-medium\">How I arrived at this</span>\n </button>\n {explanationExpanded && (\n <div className=\"pt-3 text-sm text-gray-600 dark:text-gray-400\">\n <Suspense fallback={<div>Loading...</div>}>\n <MarkdownRenderer content={turn.explanation!} />\n </Suspense>\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Inline Question Form */}\n {hasPendingQuestion && pendingQuestion && (\n <InlineQuestionForm pendingQuestion={pendingQuestion} />\n )}\n\n {/* Actions */}\n {hasContent && !hideActions && (\n <div className={classes.actions}>\n {renderSlot(\n slots?.actions,\n actionsSlotProps,\n <>\n {!hideTimestamp && <span className={classes.timestamp}>{timestamp}</span>}\n\n <button\n onClick={handleCopyClick}\n className={classes.actionButton}\n aria-label=\"Copy message\"\n title=\"Copy\"\n >\n <Copy size={14} weight=\"regular\" />\n </button>\n\n {onRegenerate && turnId && (\n <button\n onClick={handleRegenerateClick}\n className={classes.actionButton}\n aria-label=\"Regenerate response\"\n title=\"Regenerate\"\n >\n <ArrowsClockwise size={14} weight=\"regular\" />\n </button>\n )}\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default AssistantMessage\n","/**\n * AssistantTurnView Component (Layer 4 - Backward Compatible)\n * Displays assistant messages with markdown, charts, sources, downloads, code outputs, and streaming cursor\n *\n * Uses turn-based architecture - receives a ConversationTurn and displays\n * the assistantTurn content.\n *\n * For more customization, use the AssistantMessage component directly with slots.\n */\n\nimport { useChat } from '../context/ChatContext'\nimport { AssistantMessage, type AssistantMessageSlots, type AssistantMessageClassNames } from './AssistantMessage'\nimport type { ConversationTurn } from '../types'\n\nexport interface AssistantTurnViewProps {\n /** The conversation turn containing the assistant response */\n turn: ConversationTurn\n /** Whether the response is currently being streamed */\n isStreaming?: boolean\n /** Slot overrides for customization */\n slots?: AssistantMessageSlots\n /** Class name overrides */\n classNames?: AssistantMessageClassNames\n /** Hide avatar */\n hideAvatar?: boolean\n /** Hide actions */\n hideActions?: boolean\n /** Hide timestamp */\n hideTimestamp?: boolean\n}\n\nexport function AssistantTurnView({\n turn,\n isStreaming = false,\n slots,\n classNames,\n hideAvatar,\n hideActions,\n hideTimestamp,\n}: AssistantTurnViewProps) {\n const { handleCopy, handleRegenerate, pendingQuestion, sendMessage, loading } = useChat()\n\n const assistantTurn = turn.assistantTurn\n if (!assistantTurn) return null\n\n return (\n <AssistantMessage\n turn={assistantTurn}\n turnId={turn.id}\n isStreaming={isStreaming}\n pendingQuestion={pendingQuestion}\n slots={slots}\n classNames={classNames}\n onCopy={handleCopy}\n onRegenerate={handleRegenerate}\n onSendMessage={sendMessage}\n sendDisabled={loading || isStreaming}\n hideAvatar={hideAvatar}\n hideActions={hideActions}\n hideTimestamp={hideTimestamp}\n />\n )\n}\n\nexport default AssistantTurnView\n","/**\n * TurnBubble component (Layer 4 - Backward Compatible)\n * Container for a conversation turn (user message + assistant response)\n *\n * Renders both the user's message and the assistant's response in a single\n * visual grouping. If the assistant hasn't responded yet, only shows user message.\n *\n * For primitive-level control, use Turn from '@iota-uz/sdk/bichat/primitives'\n */\n\nimport { type ReactNode } from 'react'\nimport type { ConversationTurn } from '../types'\nimport { UserTurnView, type UserTurnViewProps } from './UserTurnView'\nimport { AssistantTurnView, type AssistantTurnViewProps } from './AssistantTurnView'\nimport type { UserMessageSlots, UserMessageClassNames } from './UserMessage'\nimport type { AssistantMessageSlots, AssistantMessageClassNames } from './AssistantMessage'\n\nexport interface TurnBubbleClassNames {\n /** Root container */\n root?: string\n /** User turn wrapper */\n userTurn?: string\n /** Assistant turn wrapper */\n assistantTurn?: string\n}\n\nexport interface TurnBubbleProps {\n /** The conversation turn containing user and optional assistant content */\n turn: ConversationTurn\n /** Custom render function for user turn (full control) */\n renderUserTurn?: (turn: ConversationTurn) => ReactNode\n /** Custom render function for assistant turn (full control) */\n renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n /** Props passed to UserTurnView (when not using custom renderer) */\n userTurnProps?: Omit<UserTurnViewProps, 'turn'>\n /** Props passed to AssistantTurnView (when not using custom renderer) */\n assistantTurnProps?: Omit<AssistantTurnViewProps, 'turn'>\n /** Slots for user message customization */\n userMessageSlots?: UserMessageSlots\n /** Slots for assistant message customization */\n assistantMessageSlots?: AssistantMessageSlots\n /** Class names for user message */\n userMessageClassNames?: UserMessageClassNames\n /** Class names for assistant message */\n assistantMessageClassNames?: AssistantMessageClassNames\n /** Class names for turn bubble container */\n classNames?: TurnBubbleClassNames\n /** Whether assistant response is streaming */\n isStreaming?: boolean\n}\n\nconst defaultClassNames: Required<TurnBubbleClassNames> = {\n root: 'space-y-4',\n userTurn: '',\n assistantTurn: '',\n}\n\nexport function TurnBubble({\n turn,\n renderUserTurn,\n renderAssistantTurn,\n userTurnProps,\n assistantTurnProps,\n userMessageSlots,\n assistantMessageSlots,\n userMessageClassNames,\n assistantMessageClassNames,\n classNames,\n isStreaming = false,\n}: TurnBubbleProps) {\n const classes = {\n root: classNames?.root ?? defaultClassNames.root,\n userTurn: classNames?.userTurn ?? defaultClassNames.userTurn,\n assistantTurn: classNames?.assistantTurn ?? defaultClassNames.assistantTurn,\n }\n\n return (\n <div className={classes.root} data-turn-id={turn.id}>\n {/* User message */}\n <div className={classes.userTurn}>\n {renderUserTurn ? (\n renderUserTurn(turn)\n ) : (\n <UserTurnView\n turn={turn}\n slots={userMessageSlots}\n classNames={userMessageClassNames}\n {...userTurnProps}\n />\n )}\n </div>\n\n {/* Assistant response (if available) */}\n {turn.assistantTurn && (\n <div className={classes.assistantTurn}>\n {renderAssistantTurn ? (\n renderAssistantTurn(turn)\n ) : (\n <AssistantTurnView\n turn={turn}\n isStreaming={isStreaming}\n slots={assistantMessageSlots}\n classNames={assistantMessageClassNames}\n {...assistantTurnProps}\n />\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport default TurnBubble\n","/**\n * ScrollToBottomButton Component\n * Floating button to scroll chat to bottom, shown when user scrolls up\n */\n\nimport { ArrowDown } from '@phosphor-icons/react'\nimport { motion, AnimatePresence } from 'framer-motion'\n\ninterface ScrollToBottomButtonProps {\n show: boolean\n onClick: () => void\n unreadCount?: number\n}\n\nfunction ScrollToBottomButton({\n show,\n onClick,\n unreadCount = 0\n}: ScrollToBottomButtonProps) {\n return (\n <AnimatePresence>\n {show && (\n <motion.button\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n onClick={onClick}\n className=\"absolute bottom-24 right-8 p-3 bg-white dark:bg-gray-800 rounded-full shadow-lg border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 active:bg-gray-100 dark:active:bg-gray-600 transition-colors duration-150 z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-900\"\n aria-label=\"Scroll to bottom\"\n >\n <div className=\"relative\">\n <ArrowDown size={20} weight=\"bold\" className=\"text-gray-700 dark:text-gray-300\" />\n\n {/* Unread count badge */}\n {unreadCount > 0 && (\n <span className=\"absolute -top-2 -right-2 min-w-[18px] h-[18px] bg-primary-600 dark:bg-primary-500 text-white text-xs font-semibold rounded-full flex items-center justify-center px-1\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </div>\n </motion.button>\n )}\n </AnimatePresence>\n )\n}\n\nexport { ScrollToBottomButton }\nexport default ScrollToBottomButton\n","/**\n * MessageList component\n * Displays conversation turns with auto-scroll and grouping\n *\n * Uses turn-based architecture where each ConversationTurn groups\n * a user message with its assistant response.\n */\n\nimport { useEffect, useRef, ReactNode, useState } from 'react'\nimport { useChat } from '../context/ChatContext'\nimport { ConversationTurn } from '../types'\nimport { TurnBubble } from './TurnBubble'\nimport ScrollToBottomButton from './ScrollToBottomButton'\n\ninterface MessageListProps {\n /** Custom render function for user turns */\n renderUserTurn?: (turn: ConversationTurn) => ReactNode\n /** Custom render function for assistant turns */\n renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n}\n\nexport function MessageList({ renderUserTurn, renderAssistantTurn }: MessageListProps) {\n const { turns, streamingContent, isStreaming } = useChat()\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const [showScrollButton, setShowScrollButton] = useState(false)\n\n // Auto-scroll to bottom on new turns or streaming content\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [turns.length, streamingContent])\n\n // Scroll detection for ScrollToBottomButton\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = container\n const isNearBottom = scrollHeight - scrollTop - clientHeight < 100\n setShowScrollButton(!isNearBottom)\n }\n\n container.addEventListener('scroll', handleScroll)\n return () => container.removeEventListener('scroll', handleScroll)\n }, [])\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }\n\n return (\n <div className=\"relative flex-1 min-h-0\">\n <div ref={containerRef} className=\"h-full overflow-y-auto px-4 py-6\">\n <div className=\"max-w-4xl mx-auto space-y-6\">\n {turns.map((turn) => (\n <TurnBubble\n key={turn.id}\n turn={turn}\n renderUserTurn={renderUserTurn}\n renderAssistantTurn={renderAssistantTurn}\n />\n ))}\n {isStreaming && streamingContent && (\n <div className=\"flex gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-primary-600 flex items-center justify-center text-white\">\n AI\n </div>\n <div className=\"flex-1 max-w-[80%] rounded-2xl px-4 py-3 bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 shadow-sm\">\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n {streamingContent}\n <span className=\"inline-block w-2 h-4 ml-1 bg-primary-600 animate-pulse\" />\n </div>\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n </div>\n <ScrollToBottomButton show={showScrollButton} onClick={scrollToBottom} />\n </div>\n )\n}\n","/**\n * MessageInput Component\n * Advanced input with file upload, drag-drop, keyboard shortcuts, and message queuing\n * Clean, professional design\n */\n\nimport { useState, useRef, useEffect, forwardRef, useImperativeHandle } from 'react'\nimport { Paperclip, PaperPlaneRight, X } from '@phosphor-icons/react'\nimport AttachmentGrid from './AttachmentGrid'\nimport { validateImageFile, validateFileCount, convertToBase64, createDataUrl } from '../utils/fileUtils'\nimport type { ImageAttachment, QueuedMessage } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\n\nexport interface MessageInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport interface MessageInputProps {\n message: string\n loading: boolean\n fetching?: boolean\n disabled?: boolean\n messageQueue?: QueuedMessage[]\n onMessageChange: (value: string) => void\n onSubmit: (e: React.FormEvent, attachments: ImageAttachment[]) => void\n onUnqueue?: () => { content: string; attachments: ImageAttachment[] } | null\n placeholder?: string\n maxFiles?: number\n maxFileSize?: number\n containerClassName?: string\n}\n\nconst MAX_FILES_DEFAULT = 10\nconst MAX_FILE_SIZE_DEFAULT = 20 * 1024 * 1024 // 20MB\nconst MAX_HEIGHT = 192 // 12 lines approx\n\nexport const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(\n (\n {\n message,\n loading,\n fetching = false,\n disabled = false,\n messageQueue = [],\n onMessageChange,\n onSubmit,\n onUnqueue,\n placeholder: placeholderOverride,\n maxFiles = MAX_FILES_DEFAULT,\n maxFileSize = MAX_FILE_SIZE_DEFAULT,\n containerClassName,\n },\n ref\n ) => {\n const { t } = useTranslation()\n const [attachments, setAttachments] = useState<ImageAttachment[]>([])\n const [isDragging, setIsDragging] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [isFocused, setIsFocused] = useState(false)\n\n // Use override or translation\n const placeholder = placeholderOverride || t('input.placeholder')\n\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n\n useImperativeHandle(ref, () => ({\n focus: () => textareaRef.current?.focus(),\n clear: () => {\n onMessageChange('')\n setAttachments([])\n setError(null)\n }\n }))\n\n useEffect(() => {\n const textarea = textareaRef.current\n if (!textarea) return\n\n textarea.style.height = 'auto'\n const newHeight = Math.min(textarea.scrollHeight, MAX_HEIGHT)\n textarea.style.height = `${newHeight}px`\n }, [message])\n\n useEffect(() => {\n if (!error) return\n const timer = setTimeout(() => setError(null), 5000)\n return () => clearTimeout(timer)\n }, [error])\n\n const handleFileSelect = async (files: FileList | null) => {\n if (!files || files.length === 0) return\n\n try {\n validateFileCount(attachments.length, files.length, maxFiles)\n\n const newAttachments: ImageAttachment[] = []\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]\n validateImageFile(file, maxFileSize)\n const base64Data = await convertToBase64(file)\n const preview = createDataUrl(base64Data, file.type)\n\n newAttachments.push({\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data,\n preview\n })\n }\n\n setAttachments((prev) => [...prev, ...newAttachments])\n setError(null)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to process files')\n }\n }\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFileSelect(e.target.files)\n e.target.value = ''\n }\n\n const handleRemoveAttachment = (index: number) => {\n setAttachments((prev) => prev.filter((_, i) => i !== index))\n setError(null)\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(true)\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n }\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragging(false)\n await handleFileSelect(e.dataTransfer.files)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (!loading && (message.trim() || attachments.length > 0)) {\n handleFormSubmit(e as unknown as React.FormEvent)\n }\n }\n\n if (e.key === 'Escape') {\n onMessageChange('')\n setAttachments([])\n setError(null)\n }\n\n if (e.key === 'ArrowUp' && !message.trim() && onUnqueue) {\n const unqueued = onUnqueue()\n if (unqueued) {\n onMessageChange(unqueued.content)\n setAttachments(unqueued.attachments)\n }\n }\n }\n\n const handleFormSubmit = (e: React.FormEvent) => {\n e.preventDefault()\n if (loading || disabled || (!message.trim() && attachments.length === 0)) {\n return\n }\n\n onSubmit(e, attachments)\n setAttachments([])\n setError(null)\n }\n\n const canSubmit = !loading && !disabled && (message.trim() || attachments.length > 0)\n const defaultContainerClassName = \"shrink-0 p-4 pb-6\"\n\n return (\n <div\n ref={containerRef}\n className={containerClassName ?? defaultContainerClassName}\n >\n <form onSubmit={handleFormSubmit} className=\"max-w-4xl mx-auto\">\n {/* Error display */}\n {error && (\n <div className=\"mb-3 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg text-sm text-red-600 dark:text-red-400 flex items-center justify-between\">\n <span>{error}</span>\n <button\n type=\"button\"\n onClick={() => setError(null)}\n className=\"ml-2 p-1 hover:bg-red-100 dark:hover:bg-red-800 rounded transition-colors\"\n aria-label={t('input.dismissError')}\n >\n <X size={14} />\n </button>\n </div>\n )}\n\n {/* Queue badge */}\n {messageQueue.length > 0 && (\n <div className=\"mb-3 text-xs text-gray-500 dark:text-gray-400\">\n <span className=\"px-2.5 py-1 bg-primary-50 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 rounded font-medium\">\n {t('input.messagesQueued', { count: messageQueue.length })}\n </span>\n </div>\n )}\n\n {/* Attachment preview */}\n {attachments.length > 0 && (\n <div className=\"mb-3\">\n <AttachmentGrid attachments={attachments} onRemove={handleRemoveAttachment} />\n </div>\n )}\n\n {/* Input container with drag-drop */}\n <div\n className=\"relative\"\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* Drag overlay */}\n {isDragging && (\n <div className=\"absolute inset-0 z-10 bg-primary-50/95 dark:bg-primary-900/90 border-2 border-dashed border-primary-400 rounded-2xl flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-800 flex items-center justify-center\">\n <Paperclip size={20} className=\"text-primary-600 dark:text-primary-400\" />\n </div>\n <span className=\"text-sm text-primary-700 dark:text-primary-300 font-medium\">\n {t('input.dropImages')}\n </span>\n </div>\n </div>\n )}\n\n {/* Input container - using inline Tailwind classes */}\n <div\n className={`flex items-center gap-2 rounded-2xl p-2.5 bg-white dark:bg-gray-800 border shadow-sm transition-all duration-150 ${\n isFocused\n ? 'border-primary-400 dark:border-primary-500 ring-2 ring-primary-500/15 dark:ring-primary-500/20'\n : 'border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'\n }`}\n >\n {/* Attach button */}\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={loading || disabled || attachments.length >= maxFiles}\n className=\"flex-shrink-0 self-center p-2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n aria-label={t('input.attachFiles')}\n title={t('input.attachImages')}\n >\n <Paperclip size={18} />\n </button>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp,image/gif\"\n multiple\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-label=\"File input\"\n />\n\n {/* Textarea */}\n <div className=\"flex-1 self-stretch flex items-center\">\n <textarea\n ref={textareaRef}\n value={message}\n onChange={(e) => onMessageChange(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={placeholder}\n className=\"resize-none bg-transparent border-none outline-none px-1 py-2 w-full text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 text-[15px] leading-relaxed\"\n style={{ maxHeight: `${MAX_HEIGHT}px` }}\n rows={1}\n disabled={loading || disabled}\n aria-label=\"Message input\"\n />\n </div>\n\n {/* Send button - using inline Tailwind classes */}\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"flex-shrink-0 self-center p-2 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-primary-600\"\n aria-label={t('input.sendMessage')}\n >\n {loading ? (\n <div className=\"w-[18px] h-[18px] border-2 border-white/60 border-t-transparent rounded-full animate-spin\" />\n ) : (\n <PaperPlaneRight size={18} weight=\"fill\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Loading indicator */}\n {(loading || fetching) && (\n <div className=\"mt-3 flex items-center justify-center gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" />\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" style={{ animationDelay: '0.15s' }} />\n <div className=\"w-1.5 h-1.5 bg-gray-400 dark:bg-gray-500 rounded-full animate-pulse\" style={{ animationDelay: '0.3s' }} />\n </div>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {loading ? t('input.aiThinking') : t('input.processing')}\n </span>\n </div>\n )}\n </form>\n </div>\n )\n }\n)\n\nMessageInput.displayName = 'MessageInput'\n","/**\n * WelcomeContent Component\n * Landing page shown when starting a new chat session\n * Clean, professional design for enterprise BI applications\n */\n\nimport { motion } from 'framer-motion'\nimport { ChartBar, FileText, Lightbulb, type Icon } from '@phosphor-icons/react'\n\ninterface ExamplePrompt {\n category: string\n icon: Icon\n text: string\n}\n\ninterface WelcomeContentProps {\n onPromptSelect?: (prompt: string) => void\n title?: string\n description?: string\n disabled?: boolean\n}\n\nconst EXAMPLE_PROMPTS: ExamplePrompt[] = [\n {\n category: 'Data Analysis',\n icon: ChartBar,\n text: 'Show me sales trends for the last quarter',\n },\n {\n category: 'Reports',\n icon: FileText,\n text: 'Generate a summary of customer feedback',\n },\n {\n category: 'Insights',\n icon: Lightbulb,\n text: 'What are the top performing products?',\n }\n]\n\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.08,\n delayChildren: 0.05\n }\n }\n}\n\nconst itemVariants = {\n hidden: { opacity: 0, y: 12 },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.3,\n ease: [0.4, 0, 0.2, 1]\n }\n }\n}\n\nfunction WelcomeContent({\n onPromptSelect,\n title = 'Welcome to BiChat',\n description = 'Your intelligent business analytics assistant. Ask questions about your data, generate reports, or explore insights.',\n disabled = false\n}: WelcomeContentProps) {\n const handlePromptClick = (prompt: string) => {\n if (onPromptSelect && !disabled) {\n onPromptSelect(prompt)\n }\n }\n\n return (\n <motion.div\n className=\"w-full max-w-3xl mx-auto px-6 py-12 text-center\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {/* Title */}\n <motion.h1\n className=\"text-3xl sm:text-4xl font-semibold text-gray-900 dark:text-white mb-4\"\n variants={itemVariants}\n >\n {title}\n </motion.h1>\n\n {/* Description */}\n <motion.p\n className=\"text-base text-gray-500 dark:text-gray-400 mb-12 max-w-xl mx-auto leading-relaxed\"\n variants={itemVariants}\n >\n {description}\n </motion.p>\n\n {/* Example prompts */}\n <motion.div variants={itemVariants}>\n <p className=\"text-xs font-medium text-gray-400 dark:text-gray-500 uppercase tracking-wide mb-4\">\n Try asking\n </p>\n\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {EXAMPLE_PROMPTS.map((prompt, index) => (\n <motion.button\n key={index}\n onClick={() => handlePromptClick(prompt.text)}\n disabled={disabled}\n className=\"group flex flex-col items-start text-left p-5 rounded-xl bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 shadow-sm hover:shadow-md hover:border-gray-300 dark:hover:border-gray-600 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-primary-500/50 focus:ring-offset-2 dark:focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed\"\n variants={itemVariants}\n whileHover={disabled ? {} : { y: -2, scale: 1.01 }}\n whileTap={disabled ? {} : { scale: 0.98 }}\n >\n {/* Icon */}\n <div className=\"w-9 h-9 rounded-lg bg-gray-100 dark:bg-gray-700 group-hover:bg-primary-50 dark:group-hover:bg-primary-900/30 flex items-center justify-center mb-3 transition-colors duration-200\">\n <prompt.icon\n size={18}\n weight=\"regular\"\n className=\"text-gray-600 dark:text-gray-300 group-hover:text-primary-600 dark:group-hover:text-primary-400 transition-colors duration-200\"\n />\n </div>\n\n {/* Category */}\n <span className=\"text-xs font-medium text-gray-400 dark:text-gray-500 mb-1.5\">\n {prompt.category}\n </span>\n\n {/* Prompt text */}\n <p className=\"text-sm text-gray-700 dark:text-gray-200 leading-relaxed\">\n {prompt.text}\n </p>\n </motion.button>\n ))}\n </div>\n </motion.div>\n </motion.div>\n )\n}\n\nexport { WelcomeContent }\nexport default WelcomeContent\n","/**\n * Main ChatSession component\n * Composes ChatHeader, MessageList, and MessageInput\n *\n * Uses turn-based architecture where each ConversationTurn groups\n * a user message with its assistant response.\n *\n * Supports customization via slots:\n * - headerSlot: Custom content above the message list\n * - welcomeSlot: Replace the default welcome screen for new chats\n * - logoSlot: Custom logo in the header\n * - actionsSlot: Custom action buttons in the header\n */\n\nimport { ReactNode } from 'react'\nimport { ChatSessionProvider, useChat } from '../context/ChatContext'\nimport { ChatDataSource, ConversationTurn } from '../types'\nimport { ChatHeader } from './ChatHeader'\nimport { MessageList } from './MessageList'\nimport { MessageInput } from './MessageInput'\nimport WelcomeContent from './WelcomeContent'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface ChatSessionProps {\n dataSource: ChatDataSource\n sessionId?: string\n isReadOnly?: boolean\n /** Custom render function for user turns */\n renderUserTurn?: (turn: ConversationTurn) => ReactNode\n /** Custom render function for assistant turns */\n renderAssistantTurn?: (turn: ConversationTurn) => ReactNode\n className?: string\n /** Custom content to display as header */\n headerSlot?: ReactNode\n /** Custom welcome screen component (replaces default WelcomeContent) */\n welcomeSlot?: ReactNode\n /** Custom logo for the header */\n logoSlot?: ReactNode\n /** Custom action buttons for the header */\n actionsSlot?: ReactNode\n /** Callback when user navigates back */\n onBack?: () => void\n}\n\nfunction ChatSessionCore({\n isReadOnly,\n renderUserTurn,\n renderAssistantTurn,\n className = '',\n headerSlot,\n welcomeSlot,\n logoSlot,\n actionsSlot,\n onBack,\n}: Omit<ChatSessionProps, 'dataSource' | 'sessionId'>) {\n const { t } = useTranslation()\n const {\n session,\n turns,\n fetching,\n error,\n message,\n setMessage,\n loading,\n handleSubmit,\n messageQueue,\n handleUnqueue,\n } = useChat()\n\n if (fetching) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500 dark:text-gray-400\">{t('input.processing')}</div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-red-500 dark:text-red-400\">{t('error.generic')}: {error}</div>\n </div>\n )\n }\n\n // Show welcome screen for new sessions with no turns\n const showWelcome = !session && turns.length === 0\n\n const handlePromptSelect = (prompt: string) => {\n setMessage(prompt)\n }\n\n return (\n <main\n className={`flex-1 flex flex-col overflow-hidden min-h-0 bg-gray-50 dark:bg-gray-900 ${className}`}\n >\n {/* Header slot or default header */}\n {headerSlot || (\n <ChatHeader session={session} onBack={onBack} logoSlot={logoSlot} actionsSlot={actionsSlot} />\n )}\n\n {/* Welcome screen or message list */}\n {showWelcome ? (\n <div className=\"flex-1 flex items-center justify-center overflow-auto\">\n {welcomeSlot || <WelcomeContent onPromptSelect={handlePromptSelect} disabled={loading} />}\n </div>\n ) : (\n <MessageList\n renderUserTurn={renderUserTurn}\n renderAssistantTurn={renderAssistantTurn}\n />\n )}\n\n {/* Input area */}\n {!isReadOnly && (\n <MessageInput\n message={message}\n loading={loading}\n fetching={fetching}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n messageQueue={messageQueue}\n onUnqueue={handleUnqueue}\n />\n )}\n </main>\n )\n}\n\nexport function ChatSession(props: ChatSessionProps) {\n const { dataSource, sessionId, ...coreProps } = props\n\n return (\n <ChatSessionProvider dataSource={dataSource} sessionId={sessionId}>\n <ChatSessionCore {...coreProps} />\n </ChatSessionProvider>\n )\n}\n\nexport type { ChatSessionProps }\n","/**\n * BI-Chat UI Components\n * Main export file\n */\n\n// Import styles (will be bundled as style.css)\nimport './styles.css'\n\n// =============================================================================\n// Layer 4: Full Components (Backward Compatible API)\n// =============================================================================\n\nexport { ChatSession } from './components/ChatSession'\nexport { ChatHeader } from './components/ChatHeader'\nexport { MessageList } from './components/MessageList'\nexport { TurnBubble, type TurnBubbleProps, type TurnBubbleClassNames } from './components/TurnBubble'\nexport { UserTurnView, type UserTurnViewProps } from './components/UserTurnView'\nexport { AssistantTurnView, type AssistantTurnViewProps } from './components/AssistantTurnView'\nexport { MarkdownRenderer } from './components/MarkdownRenderer'\nexport { ChartCard } from './components/ChartCard'\nexport { SourcesPanel } from './components/SourcesPanel'\nexport { DownloadCard } from './components/DownloadCard'\nexport { InlineQuestionForm } from './components/InlineQuestionForm'\nexport { MessageInput, type MessageInputRef, type MessageInputProps } from './components/MessageInput'\nexport { AttachmentGrid } from './components/AttachmentGrid'\nexport { ImageModal } from './components/ImageModal'\nexport { WelcomeContent } from './components/WelcomeContent'\nexport { CodeOutputsPanel } from './components/CodeOutputsPanel'\nexport { StreamingCursor } from './components/StreamingCursor'\nexport { ScrollToBottomButton } from './components/ScrollToBottomButton'\nexport { EmptyState, type EmptyStateProps } from './components/EmptyState'\nexport { EditableText, type EditableTextProps, type EditableTextRef } from './components/EditableText'\nexport { SearchInput, type SearchInputProps } from './components/SearchInput'\nexport {\n Skeleton,\n SkeletonGroup,\n SkeletonText,\n SkeletonAvatar,\n SkeletonCard,\n ListItemSkeleton,\n type SkeletonProps,\n type SkeletonGroupProps,\n} from './components/Skeleton'\n\n// Phase 2 components\nexport { CodeBlock } from './components/CodeBlock'\nexport { LoadingSpinner } from './components/LoadingSpinner'\nexport { TableExportButton } from './components/TableExportButton'\nexport { TableWithExport } from './components/TableWithExport'\n\n// Phase 5 generic components\nexport { Toast, type ToastProps } from './components/Toast'\nexport { ToastContainer } from './components/ToastContainer'\nexport { ConfirmModal, type ConfirmModalProps } from './components/ConfirmModal'\nexport { UserAvatar, type UserAvatarProps } from './components/UserAvatar'\nexport { PermissionGuard, type PermissionGuardProps } from './components/PermissionGuard'\nexport { ErrorBoundary, DefaultErrorContent } from './components/ErrorBoundary'\nexport { TypingIndicator, type TypingIndicatorProps, type TypingIndicatorVariant } from './components/TypingIndicator'\n\n// =============================================================================\n// Layer 3: Composites (Styled with Slots)\n// =============================================================================\n\nexport {\n UserMessage,\n type UserMessageProps,\n type UserMessageSlots,\n type UserMessageClassNames,\n type UserMessageAvatarSlotProps,\n type UserMessageContentSlotProps,\n type UserMessageAttachmentsSlotProps,\n type UserMessageActionsSlotProps,\n} from './components/UserMessage'\n\nexport {\n AssistantMessage,\n type AssistantMessageProps,\n type AssistantMessageSlots,\n type AssistantMessageClassNames,\n type AssistantMessageAvatarSlotProps,\n type AssistantMessageContentSlotProps,\n type AssistantMessageSourcesSlotProps,\n type AssistantMessageChartsSlotProps,\n type AssistantMessageCodeOutputsSlotProps,\n type AssistantMessageArtifactsSlotProps,\n type AssistantMessageActionsSlotProps,\n type AssistantMessageExplanationSlotProps,\n} from './components/AssistantMessage'\n\n// =============================================================================\n// Layer 2: Primitives (Unstyled Compound Components)\n// =============================================================================\n\n// Primitives are exported from a separate entry point for tree-shaking\n// import { Turn, Avatar, Bubble, ActionButton } from '@iota-uz/sdk/bichat/primitives'\nexport * from './primitives'\n\n// =============================================================================\n// Layer 1: Headless Hooks\n// =============================================================================\n\n// Existing hooks\nexport { useStreaming } from './hooks/useStreaming'\nexport { useTranslation } from './hooks/useTranslation'\nexport { useModalLock } from './hooks/useModalLock'\nexport { useFocusTrap } from './hooks/useFocusTrap'\nexport { useToast, type ToastItem, type ToastType, type UseToastReturn } from './hooks/useToast'\n\n// New composability hooks\nexport {\n useImageGallery,\n type UseImageGalleryOptions,\n type UseImageGalleryReturn,\n} from './hooks/useImageGallery'\n\nexport {\n useAutoScroll,\n type UseAutoScrollOptions,\n type UseAutoScrollReturn,\n} from './hooks/useAutoScroll'\n\nexport {\n useMessageActions,\n type UseMessageActionsOptions,\n type UseMessageActionsReturn,\n} from './hooks/useMessageActions'\n\nexport {\n useAttachments,\n type UseAttachmentsOptions,\n type UseAttachmentsReturn,\n type FileValidationError,\n} from './hooks/useAttachments'\n\nexport {\n useMarkdownCopy,\n type UseMarkdownCopyOptions,\n type UseMarkdownCopyReturn,\n} from './hooks/useMarkdownCopy'\n\n// =============================================================================\n// Animations\n// =============================================================================\n\nexport * from './animations'\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport { ChatSessionProvider, useChat } from './context/ChatContext'\nexport { IotaContextProvider, useIotaContext, hasPermission } from './context/IotaContext'\nexport {\n ConfigProvider,\n useConfig,\n useRequiredConfig,\n hasPermission as hasConfigPermission,\n} from './config/ConfigContext'\n\n// =============================================================================\n// Theme\n// =============================================================================\n\nexport { ThemeProvider, useTheme } from './theme/ThemeProvider'\nexport { lightTheme, darkTheme } from './theme/themes'\n\n// =============================================================================\n// API Utilities\n// =============================================================================\n\nexport { getCSRFToken, addCSRFHeader, createHeadersWithCSRF } from './api/csrf'\n\n// =============================================================================\n// Data Sources\n// =============================================================================\n\nexport { HttpDataSource, createHttpDataSource } from './data/HttpDataSource'\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { RateLimiter } from './utils/RateLimiter'\nexport * from './utils/fileUtils'\nexport { processCitations, type ProcessedContent } from './utils/citationProcessor'\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n // Core types\n Session,\n ToolCall,\n Citation,\n Attachment,\n ImageAttachment,\n QueuedMessage,\n CodeOutput,\n ChartData,\n ChartSeries,\n Artifact,\n // HITL question types\n PendingQuestion,\n Question,\n QuestionOption,\n QuestionAnswerData,\n QuestionAnswers,\n // Streaming types\n StreamChunk,\n // Data source interface\n ChatDataSource,\n ChatSessionContextValue,\n // Turn-based architecture types\n ConversationTurn,\n UserTurn,\n AssistantTurn,\n} from './types'\n\nexport type { Theme, ThemeColors, ThemeSpacing, ThemeBorderRadius } from './theme/types'\n\nexport type {\n UserContext,\n TenantContext,\n LocaleContext,\n AppConfig,\n IotaContext,\n} from './types/iota'\n\nexport type { BiChatConfig } from './config/ConfigContext'\nexport type { RateLimiterConfig } from './utils/RateLimiter'\nexport type { HttpDataSourceConfig } from './data/HttpDataSource'\n\n// =============================================================================\n// Enums\n// =============================================================================\n\nexport { MessageRole } from './types'\n\n// =============================================================================\n// CSS Variables Reference\n// =============================================================================\n// The styles.css file provides comprehensive CSS variables for theming.\n// Import styles: import '@iota-uz/sdk/bichat/styles.css'\n//\n// Key variable prefixes:\n// - --bichat-spacing-* : Spacing scale (0-16, xs/sm/md/lg/xl/2xl)\n// - --bichat-color-* : Colors (gray, primary, semantic, component-specific)\n// - --bichat-font-* : Typography (family, size, weight, line-height)\n// - --bichat-radius-* : Border radius (sm/md/lg/xl/2xl/full, semantic)\n// - --bichat-shadow-* : Box shadows (xs/sm/md/lg/xl/2xl)\n// - --bichat-transition-* : Transition durations\n// - --bichat-z-* : Z-index scale\n//\n// Dark mode: Use .dark class or [data-theme=\"dark\"] attribute\n","/**\n * Framer Motion animation variants for BiChat UI\n * Subtle, professional animations for enterprise applications\n * Respects prefers-reduced-motion for accessibility\n */\n\nconst prefersReducedMotion = () => {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/**\n * Fade in animation\n */\nexport const fadeInVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Fade in with subtle slide up\n */\nexport const fadeInUpVariants = {\n initial: { opacity: 0, y: 8 },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n y: 8,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Scale fade for modals and popups\n */\nexport const scaleFadeVariants = {\n initial: { opacity: 0, scale: 0.98 },\n animate: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.98,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.1,\n },\n },\n}\n\n/**\n * Modal backdrop\n */\nexport const backdropVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: 0.15,\n },\n },\n}\n\n/**\n * Button press feedback\n */\nexport const buttonVariants = {\n tap: {\n scale: 0.98,\n },\n}\n\n/**\n * Stagger container for lists\n */\nexport const staggerContainerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.03,\n delayChildren: 0.05,\n },\n },\n}\n\n/**\n * List item animation\n */\nexport const listItemVariants = {\n initial: { opacity: 0, x: -8 },\n animate: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.2 },\n },\n exit: {\n opacity: 0,\n x: -8,\n transition: { duration: 0.15 },\n },\n}\n\n/**\n * Message entrance animation\n */\nexport const messageVariants = {\n initial: {\n opacity: 0,\n y: 8,\n },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Container for staggered messages\n */\nexport const messageContainerVariants = {\n initial: { opacity: 0 },\n animate: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n delayChildren: 0.05,\n },\n },\n}\n\n/**\n * Typing indicator dots\n */\nexport const typingDotVariants = {\n initial: { opacity: 0.4 },\n animate: {\n opacity: [0.4, 1, 0.4],\n transition: {\n duration: prefersReducedMotion() ? 0 : 1,\n repeat: Infinity,\n ease: 'easeInOut',\n },\n },\n}\n\n/**\n * Floating button (scroll to bottom, etc.)\n */\nexport const floatingButtonVariants = {\n initial: {\n opacity: 0,\n scale: 0.9,\n },\n animate: {\n opacity: 1,\n scale: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n scale: 0.9,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n\n/**\n * Dropdown menu\n */\nexport const dropdownVariants = {\n initial: { opacity: 0, y: -4 },\n animate: {\n opacity: 1,\n y: 0,\n transition: { duration: prefersReducedMotion() ? 0 : 0.15 },\n },\n exit: {\n opacity: 0,\n y: -4,\n transition: { duration: 0.1 },\n },\n}\n\n/**\n * Toast notification\n */\nexport const toastVariants = {\n initial: { opacity: 0, y: -8 },\n animate: {\n opacity: 1,\n y: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n y: -8,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\n },\n },\n}\n","/**\n * EmptyState Component\n * Reusable empty state display with icon, title, description, and action\n */\n\nimport { memo, type ReactNode } from 'react'\nimport { motion } from 'framer-motion'\nimport { fadeInVariants } from '../animations/variants'\n\nexport interface EmptyStateProps {\n /** Optional icon to display */\n icon?: ReactNode\n /** Main title text */\n title: string\n /** Optional description text */\n description?: string\n /** Optional action element (button, link, etc.) */\n action?: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-6 px-3',\n title: 'text-sm',\n description: 'text-xs',\n },\n md: {\n container: 'py-8 px-4',\n title: 'text-base',\n description: 'text-sm',\n },\n lg: {\n container: 'py-12 px-6',\n title: 'text-lg',\n description: 'text-base',\n },\n}\n\nfunction EmptyState({\n icon,\n title,\n description,\n action,\n className = '',\n size = 'md',\n}: EmptyStateProps) {\n const sizes = sizeClasses[size]\n\n return (\n <motion.div\n className={`flex items-center justify-center ${sizes.container} ${className}`}\n variants={fadeInVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n >\n <div className=\"text-center max-w-md\">\n {/* Icon */}\n {icon && (\n <motion.div\n className=\"mb-4 flex justify-center\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.4, delay: 0.1 }}\n >\n {icon}\n </motion.div>\n )}\n\n {/* Title */}\n <motion.h3\n className={`${sizes.title} font-medium text-gray-900 dark:text-white mb-2`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.2 }}\n >\n {title}\n </motion.h3>\n\n {/* Description */}\n {description && (\n <motion.p\n className={`${sizes.description} text-gray-500 dark:text-gray-400 mb-4`}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.3 }}\n >\n {description}\n </motion.p>\n )}\n\n {/* Action */}\n {action && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.4 }}\n >\n {action}\n </motion.div>\n )}\n </div>\n </motion.div>\n )\n}\n\nconst MemoizedEmptyState = memo(EmptyState)\nMemoizedEmptyState.displayName = 'EmptyState'\n\nexport { MemoizedEmptyState as EmptyState }\nexport default MemoizedEmptyState\n","/**\n * EditableText Component\n * Inline editable text with double-click to edit\n * Features: auto-focus, auto-select, Enter to save, Escape to cancel\n * Can be triggered programmatically via ref.startEditing()\n */\n\nimport { useState, useRef, useEffect, useImperativeHandle, forwardRef, memo } from 'react'\nimport { CircleNotch } from '@phosphor-icons/react'\n\nexport interface EditableTextProps {\n /** Current text value */\n value: string\n /** Callback when text is saved */\n onSave: (newValue: string) => void\n /** Maximum character length */\n maxLength?: number\n /** Whether the component is in loading state */\n isLoading?: boolean\n /** Placeholder text when empty */\n placeholder?: string\n /** Additional CSS classes for the text display */\n className?: string\n /** Additional CSS classes for the input */\n inputClassName?: string\n /** Font size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport interface EditableTextRef {\n /** Programmatically start editing mode */\n startEditing: () => void\n /** Programmatically cancel editing */\n cancelEditing: () => void\n}\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n}\n\nconst EditableText = forwardRef<EditableTextRef, EditableTextProps>(\n (\n {\n value,\n onSave,\n maxLength = 100,\n isLoading = false,\n placeholder = 'Untitled',\n className = '',\n inputClassName = '',\n size = 'sm',\n },\n ref\n ) => {\n const [isEditing, setIsEditing] = useState(false)\n const [editValue, setEditValue] = useState(value)\n const inputRef = useRef<HTMLInputElement>(null)\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n startEditing: () => {\n if (!isLoading) {\n setIsEditing(true)\n }\n },\n cancelEditing: () => {\n setEditValue(value)\n setIsEditing(false)\n },\n }))\n\n // Update edit value when value prop changes\n useEffect(() => {\n setEditValue(value)\n }, [value])\n\n // Auto-focus and select when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [isEditing])\n\n const handleSave = () => {\n const trimmed = editValue.trim()\n\n // Don't save if empty - revert to original\n if (!trimmed) {\n setEditValue(value)\n setIsEditing(false)\n return\n }\n\n // Only call onSave if value actually changed\n if (trimmed !== value) {\n onSave(trimmed)\n }\n\n setIsEditing(false)\n }\n\n const handleCancel = () => {\n setEditValue(value)\n setIsEditing(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleSave()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n handleCancel()\n }\n }\n\n const handleDoubleClick = () => {\n if (!isLoading) {\n setIsEditing(true)\n }\n }\n\n const handleBlur = () => {\n handleSave()\n }\n\n const sizeClass = sizeClasses[size]\n\n if (isEditing) {\n return (\n <div\n className=\"flex items-center gap-2 flex-1\"\n onClick={(e) => e.preventDefault()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n maxLength={maxLength}\n placeholder={placeholder}\n className={`flex-1 px-2 py-1 ${sizeClass} bg-white dark:bg-gray-700 border border-primary-500 dark:border-primary-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500/30 dark:focus:ring-primary-600/30 text-gray-900 dark:text-white ${inputClassName}`}\n aria-label=\"Edit text. Press Enter to save, Escape to cancel\"\n />\n </div>\n )\n }\n\n const displayValue = value || placeholder\n\n return (\n <span\n onDoubleClick={handleDoubleClick}\n className={`${sizeClass} font-medium truncate flex-1 cursor-pointer select-none hover:text-primary-600 dark:hover:text-primary-400 transition-colors ${className}`}\n title=\"Double-click to edit\"\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleDoubleClick()\n }\n }}\n >\n {isLoading ? (\n <span className=\"inline-flex items-center gap-2 text-gray-400 dark:text-gray-500\">\n <CircleNotch size={12} className=\"animate-spin\" />\n <span className=\"italic\">{displayValue}</span>\n </span>\n ) : (\n <span className={!value ? 'text-gray-400 dark:text-gray-500 italic' : ''}>\n {displayValue}\n </span>\n )}\n </span>\n )\n }\n)\n\nEditableText.displayName = 'EditableText'\n\nconst MemoizedEditableText = memo(EditableText)\n\nexport { MemoizedEditableText as EditableText }\nexport default MemoizedEditableText\n","/**\n * SearchInput Component\n * Reusable search input with icon, clear button, and keyboard shortcuts\n */\n\nimport { useEffect, useRef, memo, type KeyboardEvent } from 'react'\nimport { MagnifyingGlass, X } from '@phosphor-icons/react'\n\nexport interface SearchInputProps {\n /** Current search value */\n value: string\n /** Callback when value changes */\n onChange: (value: string) => void\n /** Placeholder text */\n placeholder?: string\n /** Auto-focus on mount */\n autoFocus?: boolean\n /** Callback when Enter is pressed */\n onSubmit?: (value: string) => void\n /** Callback when Escape is pressed */\n onEscape?: () => void\n /** Additional CSS classes for the container */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Disable the input */\n disabled?: boolean\n /** ARIA label for accessibility */\n ariaLabel?: string\n}\n\nconst sizeClasses = {\n sm: {\n container: 'py-1.5 pl-8 pr-8 text-xs',\n icon: 14,\n clearBtn: 'p-1',\n },\n md: {\n container: 'py-2.5 pl-10 pr-10 text-sm',\n icon: 16,\n clearBtn: 'p-1.5',\n },\n lg: {\n container: 'py-3 pl-12 pr-12 text-base',\n icon: 18,\n clearBtn: 'p-2',\n },\n}\n\nfunction SearchInput({\n value,\n onChange,\n placeholder = 'Search...',\n autoFocus = false,\n onSubmit,\n onEscape,\n className = '',\n size = 'md',\n disabled = false,\n ariaLabel = 'Search',\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const sizes = sizeClasses[size]\n\n useEffect(() => {\n if (autoFocus && inputRef.current) {\n inputRef.current.focus()\n }\n }, [autoFocus])\n\n const handleClear = () => {\n onChange('')\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onSubmit) {\n e.preventDefault()\n onSubmit(value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n if (value && !onEscape) {\n // Default behavior: clear on Escape if no handler provided\n handleClear()\n } else if (onEscape) {\n onEscape()\n }\n }\n }\n\n return (\n <div className={`relative w-full ${className}`} role=\"search\">\n {/* Search Icon */}\n <span className=\"absolute inset-y-0 left-3 flex items-center pointer-events-none\">\n <MagnifyingGlass\n size={sizes.icon}\n weight=\"bold\"\n className=\"text-gray-400 dark:text-gray-500\"\n aria-hidden=\"true\"\n />\n </span>\n\n {/* Input Field */}\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={`w-full ${sizes.container} bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700/50 rounded-xl focus:outline-none focus:ring-2 focus:ring-primary-500/30 dark:focus:ring-primary-500/20 focus:border-primary-400 dark:focus:border-primary-600 text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed`}\n aria-label={ariaLabel}\n />\n\n {/* Clear Button */}\n {value && !disabled && (\n <button\n type=\"button\"\n onClick={handleClear}\n className={`absolute inset-y-0 right-2 flex items-center ${sizes.clearBtn} rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700 transition-all duration-200 text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300`}\n aria-label=\"Clear search\"\n title=\"Clear search\"\n >\n <X size={sizes.icon - 2} weight=\"bold\" />\n </button>\n )}\n </div>\n )\n}\n\nconst MemoizedSearchInput = memo(SearchInput)\nMemoizedSearchInput.displayName = 'SearchInput'\n\nexport { MemoizedSearchInput as SearchInput }\nexport default MemoizedSearchInput\n","/**\n * Skeleton Component\n * Reusable loading skeleton with multiple variants\n */\n\nimport { memo } from 'react'\n\nexport interface SkeletonProps {\n /** Skeleton variant */\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded'\n /** Width (CSS value or number for pixels) */\n width?: string | number\n /** Height (CSS value or number for pixels) */\n height?: string | number\n /** Additional CSS classes */\n className?: string\n /** Enable animation */\n animate?: boolean\n}\n\nexport interface SkeletonGroupProps {\n /** Number of skeleton items to render */\n count?: number\n /** Gap between items */\n gap?: 'sm' | 'md' | 'lg'\n /** Additional CSS classes for the container */\n className?: string\n /** Render function for each skeleton item */\n children?: (index: number) => React.ReactNode\n}\n\nconst variantClasses = {\n text: 'rounded',\n circular: 'rounded-full',\n rectangular: 'rounded-none',\n rounded: 'rounded-lg',\n}\n\nconst gapClasses = {\n sm: 'space-y-1',\n md: 'space-y-2',\n lg: 'space-y-3',\n}\n\nfunction Skeleton({\n variant = 'text',\n width,\n height,\n className = '',\n animate = true,\n}: SkeletonProps) {\n const variantClass = variantClasses[variant]\n\n const style: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n }\n\n return (\n <div\n className={`bg-gray-200 dark:bg-gray-700 ${variantClass} ${animate ? 'animate-pulse' : ''} ${className}`}\n style={style}\n aria-hidden=\"true\"\n />\n )\n}\n\n/**\n * SkeletonGroup - Renders multiple skeleton items\n */\nexport function SkeletonGroup({\n count = 3,\n gap = 'md',\n className = '',\n children,\n}: SkeletonGroupProps) {\n const gapClass = gapClasses[gap]\n\n return (\n <div className={`${gapClass} ${className}`} aria-hidden=\"true\">\n {Array.from({ length: count }).map((_, index) =>\n children ? (\n <div key={index}>{children(index)}</div>\n ) : (\n <Skeleton key={index} variant=\"text\" height={16} />\n )\n )}\n </div>\n )\n}\n\n/**\n * SkeletonText - Text line skeleton with configurable width\n */\nexport function SkeletonText({\n lines = 1,\n className = '',\n}: {\n lines?: number\n className?: string\n}) {\n const widths = ['100%', '90%', '80%', '95%', '85%']\n\n return (\n <div className={`space-y-2 ${className}`} aria-hidden=\"true\">\n {Array.from({ length: lines }).map((_, index) => (\n <Skeleton\n key={index}\n variant=\"text\"\n width={widths[index % widths.length]}\n height={14}\n />\n ))}\n </div>\n )\n}\n\n/**\n * SkeletonAvatar - Circular avatar skeleton\n */\nexport function SkeletonAvatar({\n size = 40,\n className = '',\n}: {\n size?: number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"circular\"\n width={size}\n height={size}\n className={className}\n />\n )\n}\n\n/**\n * SkeletonCard - Card-shaped skeleton\n */\nexport function SkeletonCard({\n width,\n height = 120,\n className = '',\n}: {\n width?: string | number\n height?: string | number\n className?: string\n}) {\n return (\n <Skeleton\n variant=\"rounded\"\n width={width}\n height={height}\n className={className}\n />\n )\n}\n\n/**\n * ListItemSkeleton - Common list item skeleton with icon and text\n */\nexport function ListItemSkeleton({ className = '' }: { className?: string }) {\n return (\n <div className={`flex items-center gap-3 px-3 py-2 ${className}`}>\n <Skeleton variant=\"rounded\" width={20} height={20} />\n <Skeleton variant=\"text\" height={16} className=\"flex-1\" />\n </div>\n )\n}\n\nconst MemoizedSkeleton = memo(Skeleton)\nMemoizedSkeleton.displayName = 'Skeleton'\n\nexport { MemoizedSkeleton as Skeleton }\nexport default MemoizedSkeleton\n","/**\n * Toast Component\n * Individual toast notification with auto-dismiss and accessibility support\n */\n\nimport { useEffect } from 'react'\nimport { motion } from 'framer-motion'\nimport { CheckCircle, XCircle, Info, Warning, X } from '@phosphor-icons/react'\nimport type { ToastType } from '../hooks/useToast'\n\nexport interface ToastProps {\n id: string\n type: ToastType\n message: string\n duration?: number\n onDismiss: (id: string) => void\n /** Label for dismiss button (defaults to \"Dismiss\") */\n dismissLabel?: string\n}\n\nconst typeConfig = {\n success: {\n bgColor: 'bg-green-500',\n darkBgColor: 'dark:bg-green-600',\n icon: <CheckCircle size={20} className=\"w-5 h-5 flex-shrink-0\" weight=\"fill\" />,\n },\n error: {\n bgColor: 'bg-red-500',\n darkBgColor: 'dark:bg-red-600',\n icon: <XCircle size={20} className=\"w-5 h-5 flex-shrink-0\" weight=\"fill\" />,\n },\n info: {\n bgColor: 'bg-blue-500',\n darkBgColor: 'dark:bg-blue-600',\n icon: <Info size={20} className=\"w-5 h-5 flex-shrink-0\" weight=\"fill\" />,\n },\n warning: {\n bgColor: 'bg-yellow-500',\n darkBgColor: 'dark:bg-yellow-600',\n icon: <Warning size={20} className=\"w-5 h-5 flex-shrink-0\" weight=\"fill\" />,\n },\n}\n\nexport function Toast({\n id,\n type,\n message,\n duration = 5000,\n onDismiss,\n dismissLabel = 'Dismiss',\n}: ToastProps) {\n const config = typeConfig[type]\n\n // Use assertive for errors, polite for others\n const ariaLive = type === 'error' ? 'assertive' : 'polite'\n // Status for info/success, alert for errors/warnings\n const role = type === 'error' || type === 'warning' ? 'alert' : 'status'\n\n useEffect(() => {\n const timer = setTimeout(() => onDismiss(id), duration)\n return () => clearTimeout(timer)\n }, [id, duration, onDismiss])\n\n return (\n <motion.div\n initial={{ opacity: 0, y: -50, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.2 }}\n className={`flex items-center gap-3 px-4 py-3 rounded-lg shadow-lg backdrop-blur-sm min-w-[300px] max-w-[400px] text-white ${config.bgColor} ${config.darkBgColor}`}\n role={role}\n aria-live={ariaLive}\n aria-atomic=\"true\"\n >\n {config.icon}\n <p className=\"flex-1 text-sm font-medium\">{message}</p>\n <button\n onClick={() => onDismiss(id)}\n className=\"ml-2 text-white hover:bg-white/20 p-1 rounded transition-colors flex-shrink-0\"\n aria-label={dismissLabel}\n >\n <X size={16} className=\"w-4 h-4\" weight=\"bold\" />\n </button>\n </motion.div>\n )\n}\n\nexport default Toast\n","/**\n * ToastContainer Component\n * Container for rendering toast notifications with animations\n */\n\nimport { AnimatePresence } from 'framer-motion'\nimport { Toast } from './Toast'\nimport type { ToastItem } from '../hooks/useToast'\n\ninterface ToastContainerProps {\n toasts: ToastItem[]\n onDismiss: (id: string) => void\n /** Label for dismiss buttons */\n dismissLabel?: string\n}\n\nexport function ToastContainer({ toasts, onDismiss, dismissLabel }: ToastContainerProps) {\n return (\n <div className=\"fixed top-4 right-4 z-50 flex flex-col gap-2 pointer-events-none\">\n <AnimatePresence>\n {toasts.map((toast) => (\n <div key={toast.id} className=\"pointer-events-auto\">\n <Toast {...toast} onDismiss={onDismiss} dismissLabel={dismissLabel} />\n </div>\n ))}\n </AnimatePresence>\n </div>\n )\n}\n\nexport default ToastContainer\n","/**\n * ConfirmModal Component\n * Generic confirmation dialog with customizable title, message, and actions\n */\n\nimport { useEffect, useRef, memo } from 'react'\nimport { useFocusTrap } from '../hooks/useFocusTrap'\n\nexport interface ConfirmModalProps {\n /** Whether the modal is open */\n isOpen: boolean\n /** Modal title */\n title: string\n /** Modal message/description */\n message: string\n /** Callback when user confirms */\n onConfirm: () => void\n /** Callback when user cancels */\n onCancel: () => void\n /** Confirm button text (defaults to \"Confirm\") */\n confirmText?: string\n /** Cancel button text (defaults to \"Cancel\") */\n cancelText?: string\n /** Whether this is a danger/destructive action (red confirm button) */\n isDanger?: boolean\n}\n\nfunction ConfirmModalBase({\n isOpen,\n title,\n message,\n onConfirm,\n onCancel,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n isDanger = false,\n}: ConfirmModalProps) {\n const modalRef = useRef<HTMLDivElement>(null)\n const confirmButtonRef = useRef<HTMLButtonElement>(null)\n\n // Trap focus within modal when open\n useFocusTrap(modalRef, isOpen)\n\n useEffect(() => {\n if (!isOpen) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel()\n } else if (e.key === 'Enter') {\n // Only confirm via Enter if the confirm button is focused.\n // This prevents accidental confirmations from global Enter presses.\n if (document.activeElement === confirmButtonRef.current) {\n e.preventDefault()\n onConfirm()\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [isOpen, onConfirm, onCancel, confirmButtonRef])\n\n if (!isOpen) return null\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/40 dark:bg-black/60 backdrop-blur-sm transition-opacity z-40\"\n onClick={onCancel}\n aria-hidden=\"true\"\n />\n\n {/* Modal */}\n <div\n className=\"fixed inset-0 flex items-center justify-center z-50\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-modal-title\"\n aria-describedby=\"confirm-modal-description\"\n >\n <div\n ref={modalRef}\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-sm w-full mx-4\"\n >\n {/* Header */}\n <div className=\"px-6 py-4 border-b border-gray-200 dark:border-gray-700\">\n <h2\n id=\"confirm-modal-title\"\n className=\"text-lg font-semibold text-gray-900 dark:text-white\"\n >\n {title}\n </h2>\n </div>\n\n {/* Body */}\n <div className=\"px-6 py-4\">\n <p id=\"confirm-modal-description\" className=\"text-gray-600 dark:text-gray-300\">\n {message}\n </p>\n </div>\n\n {/* Footer - Actions */}\n <div className=\"px-6 py-4 border-t border-gray-200 dark:border-gray-700 flex justify-end gap-3\">\n <button\n onClick={onCancel}\n className=\"px-4 py-2 rounded-lg bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-gray-100 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors font-medium\"\n aria-label={`Cancel ${title.toLowerCase()}`}\n data-testid=\"confirm-modal-cancel\"\n >\n {cancelText}\n </button>\n <button\n ref={confirmButtonRef}\n onClick={onConfirm}\n className={`px-4 py-2 rounded-lg text-white font-medium transition-colors ${\n isDanger\n ? 'bg-red-600 dark:bg-red-700 hover:bg-red-700 dark:hover:bg-red-800'\n : 'bg-primary-600 dark:bg-primary-700 hover:bg-primary-700 dark:hover:bg-primary-800'\n }`}\n aria-label={`Confirm ${title.toLowerCase()}`}\n data-testid=\"confirm-modal-confirm\"\n >\n {confirmText}\n </button>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nconst ConfirmModal = memo(ConfirmModalBase)\nConfirmModal.displayName = 'ConfirmModal'\n\nexport { ConfirmModal }\nexport default ConfirmModal\n","/**\n * UserAvatar Component\n * Displays user initials with deterministic color from a color palette\n */\n\nimport { memo } from 'react'\n\nexport interface UserAvatarProps {\n /** User's first name */\n firstName: string\n /** User's last name */\n lastName: string\n /** Override initials (defaults to first letters of first and last name) */\n initials?: string\n /** Avatar size */\n size?: 'sm' | 'md' | 'lg'\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Generate a consistent color index from a string\n * Uses simple hash function for deterministic color selection\n */\nfunction hashString(str: string): number {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash // Convert to 32bit integer\n }\n return Math.abs(hash)\n}\n\n/**\n * Color palette using Tailwind colors\n * Selected for good contrast with white text\n */\nconst colorPalette = [\n { bg: 'bg-blue-500', text: 'text-white' },\n { bg: 'bg-green-500', text: 'text-white' },\n { bg: 'bg-purple-500', text: 'text-white' },\n { bg: 'bg-pink-500', text: 'text-white' },\n { bg: 'bg-indigo-500', text: 'text-white' },\n { bg: 'bg-teal-500', text: 'text-white' },\n { bg: 'bg-orange-500', text: 'text-white' },\n { bg: 'bg-cyan-500', text: 'text-white' },\n { bg: 'bg-amber-500', text: 'text-white' },\n { bg: 'bg-lime-500', text: 'text-white' },\n]\n\n/**\n * Size configurations\n */\nconst sizeClasses = {\n sm: 'w-8 h-8 text-xs',\n md: 'w-10 h-10 text-sm',\n lg: 'w-12 h-12 text-base',\n}\n\nfunction UserAvatar({\n firstName,\n lastName,\n initials: providedInitials,\n size = 'md',\n className = '',\n}: UserAvatarProps) {\n // Generate initials if not provided\n const derivedInitials = (() => {\n const firstChar = firstName?.trim()?.charAt(0) || ''\n const lastChar = lastName?.trim()?.charAt(0) || ''\n const combined = `${firstChar}${lastChar}`.trim()\n return combined || 'U'\n })()\n\n const initials = (providedInitials?.trim() || derivedInitials).toUpperCase()\n\n // Select color based on full name hash (deterministic)\n const fullName = `${firstName}${lastName}`\n const colorIndex = hashString(fullName) % colorPalette.length\n const colors = colorPalette[colorIndex]\n\n return (\n <div\n className={`\n ${sizeClasses[size]}\n ${colors.bg}\n ${colors.text}\n ${className}\n rounded-full\n flex\n items-center\n justify-center\n font-semibold\n flex-shrink-0\n select-none\n `}\n aria-label={`${firstName} ${lastName}`}\n title={`${firstName} ${lastName}`}\n >\n {initials}\n </div>\n )\n}\n\nconst MemoizedUserAvatar = memo(UserAvatar)\nMemoizedUserAvatar.displayName = 'UserAvatar'\n\nexport { MemoizedUserAvatar as UserAvatar }\nexport default MemoizedUserAvatar\n","/**\n * PermissionGuard Component\n * Conditionally renders children based on permission checks\n *\n * @example\n * // Single permission\n * <PermissionGuard permissions={['chat.read']} hasPermission={hasPermission}>\n * <ChatList />\n * </PermissionGuard>\n *\n * // Multiple permissions (AND logic - all required)\n * <PermissionGuard permissions={['chat.read', 'chat.write']} mode=\"all\">\n * <AdminPanel />\n * </PermissionGuard>\n *\n * // Multiple permissions (OR logic - any required)\n * <PermissionGuard permissions={['chat.read', 'chat.readOwn']} mode=\"any\">\n * <ChatList />\n * </PermissionGuard>\n *\n * // With custom fallback\n * <PermissionGuard\n * permissions={['chat.write']}\n * fallback={<div>You don't have permission</div>}\n * >\n * <CreateChatButton />\n * </PermissionGuard>\n */\n\nimport type { ReactNode } from 'react'\n\nexport interface PermissionGuardProps {\n /** Permission names to check */\n permissions: string[]\n /** Check mode: 'all' requires all permissions (AND), 'any' requires at least one (OR) */\n mode?: 'all' | 'any'\n /** Function to check if user has a specific permission */\n hasPermission: (permission: string) => boolean\n /** Fallback to render when permissions are not satisfied */\n fallback?: ReactNode\n /** Children to render when permissions are satisfied */\n children: ReactNode\n}\n\n/**\n * Permission guard component.\n * Conditionally renders children based on permission checks.\n */\nexport function PermissionGuard({\n permissions,\n mode = 'all',\n hasPermission,\n fallback = null,\n children,\n}: PermissionGuardProps) {\n // Handle empty permissions array (no permissions required, always render)\n if (permissions.length === 0) {\n return <>{children}</>\n }\n\n // Check permissions based on mode\n const permitted =\n mode === 'all'\n ? permissions.every((p) => hasPermission(p))\n : permissions.some((p) => hasPermission(p))\n\n return permitted ? <>{children}</> : <>{fallback}</>\n}\n\nexport default PermissionGuard\n","/**\n * ErrorBoundary Component\n * React error boundary for catching and displaying errors gracefully\n */\n\nimport { Component, ErrorInfo, ReactNode } from 'react'\nimport { WarningCircle, ArrowClockwise } from '@phosphor-icons/react'\n\ninterface ErrorBoundaryProps {\n children: ReactNode\n /** Optional custom error UI */\n fallback?: ReactNode | ((error: Error | null, reset: () => void) => ReactNode)\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\n/**\n * Default error UI component\n */\nfunction DefaultErrorContent({\n error,\n onReset,\n resetLabel = 'Try Again',\n errorTitle = 'Something went wrong',\n}: {\n error: Error | null\n onReset?: () => void\n resetLabel?: string\n errorTitle?: string\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center p-8 text-center min-h-[200px]\">\n <WarningCircle size={48} className=\"text-red-500 mb-4\" weight=\"fill\" />\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">{errorTitle}</h2>\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-4 max-w-md\">\n {error?.message || 'An unexpected error occurred. Please try again.'}\n </p>\n {onReset && (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"flex items-center gap-2 px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors\"\n >\n <ArrowClockwise size={16} weight=\"bold\" />\n {resetLabel}\n </button>\n )}\n </div>\n )\n}\n\nclass ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false, error: null }\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('React Error Boundary caught an error:', error, errorInfo)\n this.props.onError?.(error, errorInfo)\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null })\n }\n\n render() {\n if (this.state.hasError) {\n // Custom fallback\n if (this.props.fallback) {\n if (typeof this.props.fallback === 'function') {\n return this.props.fallback(this.state.error, this.handleReset)\n }\n return this.props.fallback\n }\n\n // Default error UI\n return <DefaultErrorContent error={this.state.error} onReset={this.handleReset} />\n }\n\n return this.props.children\n }\n}\n\nexport default ErrorBoundary\nexport { ErrorBoundary, DefaultErrorContent }\n","/**\n * TypingIndicator Component\n * Displays animated dots or rotating text to indicate AI is processing\n */\n\nimport { useState, useEffect, memo } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\n\nexport type TypingIndicatorVariant = 'dots' | 'text' | 'pulse'\n\nexport interface TypingIndicatorProps {\n /** Display variant */\n variant?: TypingIndicatorVariant\n /** Custom thinking messages (for text variant) */\n messages?: string[]\n /** Message rotation interval in ms (for text variant, defaults to 3000) */\n rotationInterval?: number\n /** Size */\n size?: 'sm' | 'md' | 'lg'\n /** Additional CSS classes */\n className?: string\n}\n\n// Default thinking messages\nconst DEFAULT_MESSAGES = [\n 'Thinking...',\n 'Processing...',\n 'Analyzing...',\n 'Computing...',\n 'Working on it...',\n]\n\n// Check if user prefers reduced motion\nconst prefersReducedMotion = () => {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n// Random selector without immediate repeat\nconst getRandomMessage = (messages: string[], current: string): string => {\n const available = messages.filter((m) => m !== current)\n if (available.length === 0) {\n return current || messages[0] || 'Thinking...'\n }\n return available[Math.floor(Math.random() * available.length)]\n}\n\nconst sizeConfig = {\n sm: { dot: 'w-1.5 h-1.5', gap: 'gap-1', text: 'text-sm' },\n md: { dot: 'w-2 h-2', gap: 'gap-1.5', text: 'text-base' },\n lg: { dot: 'w-2.5 h-2.5', gap: 'gap-2', text: 'text-lg' },\n}\n\nfunction DotsIndicator({ size = 'md' }: { size: 'sm' | 'md' | 'lg' }) {\n const config = sizeConfig[size]\n return (\n <div className={`flex ${config.gap}`} role=\"status\" aria-live=\"polite\">\n {[0, 1, 2].map((index) => (\n <div\n key={index}\n className={`${config.dot} bg-gray-400 dark:bg-gray-500 rounded-full animate-bounce`}\n style={{ animationDelay: `${index * 0.15}s` }}\n />\n ))}\n <span className=\"sr-only\">Loading...</span>\n </div>\n )\n}\n\nfunction PulseIndicator({ size = 'md' }: { size: 'sm' | 'md' | 'lg' }) {\n const config = sizeConfig[size]\n return (\n <div className=\"flex items-center\" role=\"status\" aria-live=\"polite\">\n <div className={`${config.dot} bg-primary-500 rounded-full animate-pulse`} />\n <span className=\"sr-only\">Loading...</span>\n </div>\n )\n}\n\nfunction TextIndicator({\n messages = DEFAULT_MESSAGES,\n rotationInterval = 3000,\n size = 'md',\n}: {\n messages: string[]\n rotationInterval: number\n size: 'sm' | 'md' | 'lg'\n}) {\n const config = sizeConfig[size]\n const [message, setMessage] = useState(() => messages[Math.floor(Math.random() * messages.length)])\n\n useEffect(() => {\n if (prefersReducedMotion()) return\n\n const interval = setInterval(() => {\n setMessage((prev) => getRandomMessage(messages, prev))\n }, rotationInterval)\n\n return () => clearInterval(interval)\n }, [messages, rotationInterval])\n\n return (\n <div role=\"status\" aria-live=\"polite\" className=\"overflow-hidden h-6 relative\">\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={message}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.2 }}\n className={`${config.text} text-gray-500 dark:text-gray-400 block`}\n >\n {message}\n </motion.span>\n </AnimatePresence>\n </div>\n )\n}\n\nfunction TypingIndicator({\n variant = 'dots',\n messages = DEFAULT_MESSAGES,\n rotationInterval = 3000,\n size = 'md',\n className = '',\n}: TypingIndicatorProps) {\n return (\n <div className={`flex items-center ${className}`}>\n {variant === 'dots' && <DotsIndicator size={size} />}\n {variant === 'pulse' && <PulseIndicator size={size} />}\n {variant === 'text' && (\n <TextIndicator messages={messages} rotationInterval={rotationInterval} size={size} />\n )}\n </div>\n )\n}\n\nconst MemoizedTypingIndicator = memo(TypingIndicator)\nMemoizedTypingIndicator.displayName = 'TypingIndicator'\n\nexport { MemoizedTypingIndicator as TypingIndicator }\nexport default MemoizedTypingIndicator\n","/**\n * Slot Primitive\n * Utility component for the asChild pattern (similar to @radix-ui/react-slot)\n */\n\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactNode,\n type ReactElement,\n} from 'react'\n\ntype AnyProps = Record<string, unknown>\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n const overrideProps: AnyProps = { ...childProps }\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName]\n const childPropValue = childProps[propName]\n\n const isHandler = /^on[A-Z]/.test(propName)\n if (isHandler) {\n // Merge event handlers\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args: unknown[]) => {\n ;(childPropValue as (...a: unknown[]) => void)(...args)\n ;(slotPropValue as (...a: unknown[]) => void)(...args)\n }\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue\n }\n } else if (propName === 'style') {\n // Merge styles\n overrideProps[propName] = { ...(slotPropValue as object), ...(childPropValue as object) }\n } else if (propName === 'className') {\n // Merge classNames\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' ')\n }\n }\n\n return { ...slotProps, ...overrideProps }\n}\n\nexport interface SlotProps extends HTMLAttributes<HTMLElement> {\n children?: ReactNode\n}\n\n/**\n * Slot component that merges its props with its child element's props\n * Used for the asChild pattern to allow consumers to customize the rendered element\n */\nexport const Slot = forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props\n\n if (!isValidElement(children)) {\n return null\n }\n\n const childrenRef = (children as ReactElement & { ref?: unknown }).ref\n\n return cloneElement(children as ReactElement, {\n ...mergeProps(slotProps, children.props as AnyProps),\n ref: forwardedRef\n ? composeRefs(forwardedRef, childrenRef as React.Ref<unknown>)\n : childrenRef,\n } as AnyProps)\n})\n\nSlot.displayName = 'Slot'\n\n/**\n * Compose multiple refs into one\n */\nfunction composeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref != null) {\n ;(ref as React.MutableRefObject<T | null>).current = node\n }\n })\n }\n}\n\n/**\n * Helper type for components that support asChild\n * Extends the HTML attributes while adding asChild option\n */\nexport type AsChildProps<T extends HTMLAttributes<HTMLElement> = HTMLAttributes<HTMLElement>> = T & {\n /** Merge props with child element instead of rendering wrapper */\n asChild?: boolean\n}\n\n/**\n * Get children count (flattens fragments)\n */\nexport function getValidChildren(children: ReactNode): ReactElement[] {\n return Children.toArray(children).filter(isValidElement) as ReactElement[]\n}\n","/**\n * Turn Primitive\n * Compound component for rendering a conversation turn (user + assistant)\n */\n\nimport {\n createContext,\n useContext,\n forwardRef,\n type HTMLAttributes,\n} from 'react'\nimport { Slot, type AsChildProps } from './Slot'\n\n/* -------------------------------------------------------------------------------------------------\n * TurnContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TurnContextValue {\n /** Turn identifier */\n turnId?: string\n}\n\nconst TurnContext = createContext<TurnContextValue | undefined>(undefined)\n\nfunction useTurnContext() {\n const context = useContext(TurnContext)\n if (!context) {\n throw new Error('Turn components must be used within Turn.Root')\n }\n return context\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnRootProps = AsChildProps<HTMLAttributes<HTMLDivElement>> & {\n /** Turn identifier for tracking */\n turnId?: string\n}\n\nconst TurnRoot = forwardRef<HTMLDivElement, TurnRootProps>((props, ref) => {\n const { asChild, turnId, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <TurnContext.Provider value={{ turnId }}>\n <Comp ref={ref} data-turn-id={turnId} {...domProps}>\n {children}\n </Comp>\n </TurnContext.Provider>\n )\n})\n\nTurnRoot.displayName = 'Turn.Root'\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.User\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnUserProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnUser = forwardRef<HTMLDivElement, TurnUserProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp ref={ref} data-turn-role=\"user\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nTurnUser.displayName = 'Turn.User'\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Assistant\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnAssistantProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnAssistant = forwardRef<HTMLDivElement, TurnAssistantProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp ref={ref} data-turn-role=\"assistant\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nTurnAssistant.displayName = 'Turn.Assistant'\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Timestamp\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnTimestampProps = AsChildProps<HTMLAttributes<HTMLTimeElement>> & {\n /** ISO date string or Date object */\n date?: string | Date\n /** Custom formatter */\n formatter?: (date: Date) => string\n}\n\nconst defaultFormatter = (date: Date) =>\n date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n\nconst TurnTimestamp = forwardRef<HTMLTimeElement, TurnTimestampProps>((props, ref) => {\n const { asChild, date, formatter = defaultFormatter, children, ...domProps } = props\n const Comp = asChild ? Slot : 'time'\n\n const dateObj = date ? (typeof date === 'string' ? new Date(date) : date) : null\n const formattedTime = dateObj ? formatter(dateObj) : ''\n const isoString = dateObj?.toISOString()\n\n return (\n <Comp ref={ref} dateTime={isoString} {...domProps}>\n {children ?? formattedTime}\n </Comp>\n )\n})\n\nTurnTimestamp.displayName = 'Turn.Timestamp'\n\n/* -------------------------------------------------------------------------------------------------\n * Turn.Actions\n * -----------------------------------------------------------------------------------------------*/\n\ntype TurnActionsProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst TurnActions = forwardRef<HTMLDivElement, TurnActionsProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp ref={ref} role=\"group\" aria-label=\"Message actions\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nTurnActions.displayName = 'Turn.Actions'\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Turn = {\n Root: TurnRoot,\n User: TurnUser,\n Assistant: TurnAssistant,\n Timestamp: TurnTimestamp,\n Actions: TurnActions,\n}\n\nexport { useTurnContext }\nexport type { TurnRootProps, TurnUserProps, TurnAssistantProps, TurnTimestampProps, TurnActionsProps }\n","/**\n * Avatar Primitive\n * Compound component for displaying user avatars with image and fallback\n */\n\nimport {\n createContext,\n useContext,\n useState,\n forwardRef,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n} from 'react'\nimport { Slot, type AsChildProps } from './Slot'\n\n/* -------------------------------------------------------------------------------------------------\n * AvatarContext\n * -----------------------------------------------------------------------------------------------*/\n\ntype ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\ninterface AvatarContextValue {\n imageLoadingStatus: ImageLoadingStatus\n setImageLoadingStatus: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarContext = createContext<AvatarContextValue | undefined>(undefined)\n\nfunction useAvatarContext() {\n const context = useContext(AvatarContext)\n if (!context) {\n throw new Error('Avatar components must be used within Avatar.Root')\n }\n return context\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarRootProps = AsChildProps<HTMLAttributes<HTMLSpanElement>>\n\nconst AvatarRoot = forwardRef<HTMLSpanElement, AvatarRootProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'span'\n const [imageLoadingStatus, setImageLoadingStatus] = useState<ImageLoadingStatus>('idle')\n\n return (\n <AvatarContext.Provider value={{ imageLoadingStatus, setImageLoadingStatus }}>\n <Comp ref={ref} {...domProps}>\n {children}\n </Comp>\n </AvatarContext.Provider>\n )\n})\n\nAvatarRoot.displayName = 'Avatar.Root'\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Image\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarImageProps = AsChildProps<ImgHTMLAttributes<HTMLImageElement>> & {\n /** Called when loading status changes */\n onLoadingStatusChange?: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarImage = forwardRef<HTMLImageElement, AvatarImageProps>((props, ref) => {\n const { asChild, src, alt, onLoadingStatusChange, onLoad, onError, ...domProps } = props\n const { setImageLoadingStatus } = useAvatarContext()\n const Comp = asChild ? Slot : 'img'\n\n const handleLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImageLoadingStatus('loaded')\n onLoadingStatusChange?.('loaded')\n onLoad?.(e)\n }\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n setImageLoadingStatus('error')\n onLoadingStatusChange?.('error')\n onError?.(e)\n }\n\n // Start loading when src is provided\n if (src) {\n return (\n <Comp\n ref={ref}\n src={src}\n alt={alt || ''}\n onLoad={handleLoad}\n onError={handleError}\n {...domProps}\n />\n )\n }\n\n return null\n})\n\nAvatarImage.displayName = 'Avatar.Image'\n\n/* -------------------------------------------------------------------------------------------------\n * Avatar.Fallback\n * -----------------------------------------------------------------------------------------------*/\n\ntype AvatarFallbackProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n /** Delay before showing fallback (in ms) */\n delayMs?: number\n}\n\nconst AvatarFallback = forwardRef<HTMLSpanElement, AvatarFallbackProps>((props, ref) => {\n const { asChild, delayMs = 0, children, ...domProps } = props\n const { imageLoadingStatus } = useAvatarContext()\n const Comp = asChild ? Slot : 'span'\n const [canRender, setCanRender] = useState(delayMs === 0)\n\n // Handle delay\n if (delayMs > 0 && !canRender) {\n setTimeout(() => setCanRender(true), delayMs)\n }\n\n // Only show fallback if image hasn't loaded\n if (imageLoadingStatus === 'loaded') {\n return null\n }\n\n if (!canRender) {\n return null\n }\n\n return (\n <Comp ref={ref} {...domProps}>\n {children}\n </Comp>\n )\n})\n\nAvatarFallback.displayName = 'Avatar.Fallback'\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Avatar = {\n Root: AvatarRoot,\n Image: AvatarImage,\n Fallback: AvatarFallback,\n}\n\nexport { useAvatarContext }\nexport type { AvatarRootProps, AvatarImageProps, AvatarFallbackProps, ImageLoadingStatus }\n","/**\n * Bubble Primitive\n * Compound component for message bubble containers\n */\n\nimport {\n createContext,\n useContext,\n forwardRef,\n type HTMLAttributes,\n} from 'react'\nimport { Slot, type AsChildProps } from './Slot'\n\n/* -------------------------------------------------------------------------------------------------\n * BubbleContext\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleVariant = 'user' | 'assistant' | 'system'\n\ninterface BubbleContextValue {\n variant?: BubbleVariant\n}\n\nconst BubbleContext = createContext<BubbleContextValue | undefined>(undefined)\n\nfunction useBubbleContext() {\n const context = useContext(BubbleContext)\n if (!context) {\n throw new Error('Bubble components must be used within Bubble.Root')\n }\n return context\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleRootProps = AsChildProps<HTMLAttributes<HTMLDivElement>> & {\n /** Bubble variant (affects data attribute for styling) */\n variant?: BubbleVariant\n}\n\nconst BubbleRoot = forwardRef<HTMLDivElement, BubbleRootProps>((props, ref) => {\n const { asChild, variant, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <BubbleContext.Provider value={{ variant }}>\n <Comp ref={ref} data-bubble-variant={variant} {...domProps}>\n {children}\n </Comp>\n </BubbleContext.Provider>\n )\n})\n\nBubbleRoot.displayName = 'Bubble.Root'\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Content\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleContentProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleContent = forwardRef<HTMLDivElement, BubbleContentProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp ref={ref} data-bubble-part=\"content\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nBubbleContent.displayName = 'Bubble.Content'\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Header\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleHeaderProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleHeader = forwardRef<HTMLDivElement, BubbleHeaderProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp ref={ref} data-bubble-part=\"header\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nBubbleHeader.displayName = 'Bubble.Header'\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Footer\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleFooterProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleFooter = forwardRef<HTMLDivElement, BubbleFooterProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp ref={ref} data-bubble-part=\"footer\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nBubbleFooter.displayName = 'Bubble.Footer'\n\n/* -------------------------------------------------------------------------------------------------\n * Bubble.Metadata\n * -----------------------------------------------------------------------------------------------*/\n\ntype BubbleMetadataProps = AsChildProps<HTMLAttributes<HTMLDivElement>>\n\nconst BubbleMetadata = forwardRef<HTMLDivElement, BubbleMetadataProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp ref={ref} data-bubble-part=\"metadata\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nBubbleMetadata.displayName = 'Bubble.Metadata'\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Bubble = {\n Root: BubbleRoot,\n Content: BubbleContent,\n Header: BubbleHeader,\n Footer: BubbleFooter,\n Metadata: BubbleMetadata,\n}\n\nexport { useBubbleContext }\nexport type {\n BubbleRootProps,\n BubbleContentProps,\n BubbleHeaderProps,\n BubbleFooterProps,\n BubbleMetadataProps,\n BubbleVariant,\n}\n","/**\n * ActionButton Primitive\n * Compound component for icon buttons with tooltips\n */\n\nimport {\n createContext,\n useContext,\n useState,\n forwardRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n} from 'react'\nimport { Slot, type AsChildProps } from './Slot'\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButtonContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ActionButtonContextValue {\n isHovered: boolean\n isFocused: boolean\n isPressed: boolean\n isDisabled: boolean\n}\n\nconst ActionButtonContext = createContext<ActionButtonContextValue | undefined>(undefined)\n\nfunction useActionButtonContext() {\n const context = useContext(ActionButtonContext)\n if (!context) {\n throw new Error('ActionButton components must be used within ActionButton.Root')\n }\n return context\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Root\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonRootProps = AsChildProps<ButtonHTMLAttributes<HTMLButtonElement>>\n\nconst ActionButtonRoot = forwardRef<HTMLButtonElement, ActionButtonRootProps>((props, ref) => {\n const { asChild, disabled, children, onMouseEnter, onMouseLeave, onFocus, onBlur, onMouseDown, onMouseUp, ...domProps } = props\n const Comp = asChild ? Slot : 'button'\n\n const [isHovered, setIsHovered] = useState(false)\n const [isFocused, setIsFocused] = useState(false)\n const [isPressed, setIsPressed] = useState(false)\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsHovered(true)\n onMouseEnter?.(e)\n }\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsHovered(false)\n setIsPressed(false)\n onMouseLeave?.(e)\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true)\n onFocus?.(e)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false)\n onBlur?.(e)\n }\n\n const handleMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsPressed(true)\n onMouseDown?.(e)\n }\n\n const handleMouseUp = (e: React.MouseEvent<HTMLButtonElement>) => {\n setIsPressed(false)\n onMouseUp?.(e)\n }\n\n return (\n <ActionButtonContext.Provider\n value={{\n isHovered,\n isFocused,\n isPressed,\n isDisabled: !!disabled,\n }}\n >\n <Comp\n ref={ref}\n type=\"button\"\n disabled={disabled}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n {...domProps}\n >\n {children}\n </Comp>\n </ActionButtonContext.Provider>\n )\n})\n\nActionButtonRoot.displayName = 'ActionButton.Root'\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Icon\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonIconProps = AsChildProps<HTMLAttributes<HTMLSpanElement>>\n\nconst ActionButtonIcon = forwardRef<HTMLSpanElement, ActionButtonIconProps>((props, ref) => {\n const { asChild, children, ...domProps } = props\n const Comp = asChild ? Slot : 'span'\n\n return (\n <Comp ref={ref} aria-hidden=\"true\" {...domProps}>\n {children}\n </Comp>\n )\n})\n\nActionButtonIcon.displayName = 'ActionButton.Icon'\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Label\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonLabelProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n /** Visually hidden but accessible to screen readers */\n srOnly?: boolean\n}\n\nconst ActionButtonLabel = forwardRef<HTMLSpanElement, ActionButtonLabelProps>((props, ref) => {\n const { asChild, srOnly = false, children, className, ...domProps } = props\n const Comp = asChild ? Slot : 'span'\n\n const srOnlyClass = srOnly\n ? 'absolute w-px h-px p-0 -m-px overflow-hidden whitespace-nowrap border-0'\n : ''\n\n return (\n <Comp ref={ref} className={[srOnlyClass, className].filter(Boolean).join(' ')} {...domProps}>\n {children}\n </Comp>\n )\n})\n\nActionButtonLabel.displayName = 'ActionButton.Label'\n\n/* -------------------------------------------------------------------------------------------------\n * ActionButton.Tooltip\n * -----------------------------------------------------------------------------------------------*/\n\ntype ActionButtonTooltipProps = AsChildProps<HTMLAttributes<HTMLSpanElement>> & {\n /** Position relative to button */\n position?: 'top' | 'bottom' | 'left' | 'right'\n /** Only show when hovered */\n showOnHover?: boolean\n}\n\nconst ActionButtonTooltip = forwardRef<HTMLSpanElement, ActionButtonTooltipProps>((props, ref) => {\n const { asChild, position = 'top', showOnHover = true, children, ...domProps } = props\n const context = useActionButtonContext()\n const Comp = asChild ? Slot : 'span'\n\n // If showOnHover is true, only render when hovered or focused\n if (showOnHover && !context.isHovered && !context.isFocused) {\n return null\n }\n\n return (\n <Comp ref={ref} role=\"tooltip\" data-tooltip-position={position} {...domProps}>\n {children}\n </Comp>\n )\n})\n\nActionButtonTooltip.displayName = 'ActionButton.Tooltip'\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nexport const ActionButton = {\n Root: ActionButtonRoot,\n Icon: ActionButtonIcon,\n Label: ActionButtonLabel,\n Tooltip: ActionButtonTooltip,\n}\n\nexport { useActionButtonContext }\nexport type {\n ActionButtonRootProps,\n ActionButtonIconProps,\n ActionButtonLabelProps,\n ActionButtonTooltipProps,\n}\n","/**\n * useStreaming hook\n * Handles AsyncGenerator streaming responses with cancellation support\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { StreamChunk } from '../types'\n\ninterface UseStreamingOptions {\n onChunk?: (content: string) => void\n onError?: (error: string) => void\n onDone?: () => void\n}\n\nexport function useStreaming(options: UseStreamingOptions = {}) {\n const [content, setContent] = useState('')\n const [isStreaming, setIsStreaming] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n const processStream = useCallback(\n async (stream: AsyncGenerator<StreamChunk>, signal?: AbortSignal) => {\n setIsStreaming(true)\n setError(null)\n setContent('')\n\n // Create abort controller for this stream\n abortControllerRef.current = new AbortController()\n\n // Link external signal if provided\n if (signal) {\n signal.addEventListener('abort', () => {\n abortControllerRef.current?.abort()\n })\n }\n\n try {\n for await (const chunk of stream) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break\n }\n\n if (chunk.type === 'chunk' && chunk.content) {\n setContent((prev) => {\n const newContent = prev + chunk.content\n options.onChunk?.(newContent)\n return newContent\n })\n } else if (chunk.type === 'error') {\n const errorMsg = chunk.error || 'Stream error'\n const err = new Error(errorMsg)\n setError(err)\n options.onError?.(errorMsg)\n break\n } else if (chunk.type === 'done') {\n options.onDone?.()\n break\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n // Stream was cancelled - this is expected\n return\n }\n\n const errorObj = err instanceof Error ? err : new Error('Unknown error')\n setError(errorObj)\n options.onError?.(errorObj.message)\n } finally {\n setIsStreaming(false)\n abortControllerRef.current = null\n }\n },\n [options]\n )\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n setIsStreaming(false)\n }\n }, [])\n\n const reset = useCallback(() => {\n setContent('')\n setError(null)\n setIsStreaming(false)\n }, [])\n\n return {\n content,\n isStreaming,\n error,\n processStream,\n cancel,\n reset,\n }\n}\n","/**\n * useToast Hook\n * Manages toast notification state\n */\n\nimport { useState, useCallback } from 'react'\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning'\n\nexport interface ToastItem {\n id: string\n type: ToastType\n message: string\n duration?: number\n}\n\nexport interface UseToastReturn {\n toasts: ToastItem[]\n success: (msg: string, duration?: number) => void\n error: (msg: string, duration?: number) => void\n info: (msg: string, duration?: number) => void\n warning: (msg: string, duration?: number) => void\n dismiss: (id: string) => void\n dismissAll: () => void\n}\n\n/**\n * Generate a unique ID for a toast\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(7)\n}\n\n/**\n * Hook for managing toast notifications\n *\n * @example\n * ```tsx\n * const { toasts, success, error, dismiss } = useToast()\n *\n * // Show a success toast\n * success('Operation completed!')\n *\n * // Show an error toast with custom duration\n * error('Something went wrong', 10000)\n *\n * // Render toasts\n * <ToastContainer toasts={toasts} onDismiss={dismiss} />\n * ```\n */\nexport function useToast(): UseToastReturn {\n const [toasts, setToasts] = useState<ToastItem[]>([])\n\n const showToast = useCallback(\n (type: ToastType, message: string, duration?: number) => {\n const id = generateId()\n setToasts((prev) => [...prev, { id, type, message, duration }])\n },\n []\n )\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n }, [])\n\n const dismissAll = useCallback(() => {\n setToasts([])\n }, [])\n\n return {\n toasts,\n success: (msg: string, duration?: number) => showToast('success', msg, duration),\n error: (msg: string, duration?: number) => showToast('error', msg, duration),\n info: (msg: string, duration?: number) => showToast('info', msg, duration),\n warning: (msg: string, duration?: number) => showToast('warning', msg, duration),\n dismiss,\n dismissAll,\n }\n}\n","/**\n * useImageGallery Hook\n * Manages image modal/gallery state and navigation\n */\n\nimport { useState, useCallback, useMemo } from 'react'\nimport type { ImageAttachment } from '../types'\n\nexport interface UseImageGalleryOptions {\n /** Initial images to display */\n images?: ImageAttachment[]\n /** Wrap navigation at boundaries (default: false) */\n wrap?: boolean\n /** Callback when modal opens */\n onOpen?: (index: number) => void\n /** Callback when modal closes */\n onClose?: () => void\n /** Callback when navigation occurs */\n onNavigate?: (index: number, direction: 'prev' | 'next') => void\n}\n\nexport interface UseImageGalleryReturn {\n /** Whether the gallery modal is open */\n isOpen: boolean\n /** Current image index */\n currentIndex: number\n /** Current image (or undefined if none) */\n currentImage: ImageAttachment | undefined\n /** All images in the gallery */\n images: ImageAttachment[]\n /** Whether there's a previous image */\n hasPrev: boolean\n /** Whether there's a next image */\n hasNext: boolean\n /** Open gallery at specific index */\n open: (index: number, newImages?: ImageAttachment[]) => void\n /** Close the gallery */\n close: () => void\n /** Navigate to previous image */\n prev: () => void\n /** Navigate to next image */\n next: () => void\n /** Navigate to specific index */\n goTo: (index: number) => void\n /** Set images without opening */\n setImages: (images: ImageAttachment[]) => void\n}\n\n/**\n * Hook for managing image gallery/modal state\n *\n * @example\n * ```tsx\n * const gallery = useImageGallery({ images: attachments })\n *\n * // Open gallery\n * <button onClick={() => gallery.open(0)}>View Images</button>\n *\n * // Render gallery\n * {gallery.isOpen && (\n * <ImageModal\n * image={gallery.currentImage}\n * onClose={gallery.close}\n * onPrev={gallery.prev}\n * onNext={gallery.next}\n * hasPrev={gallery.hasPrev}\n * hasNext={gallery.hasNext}\n * />\n * )}\n * ```\n */\nexport function useImageGallery(options: UseImageGalleryOptions = {}): UseImageGalleryReturn {\n const { images: initialImages = [], wrap = false, onOpen, onClose, onNavigate } = options\n\n const [isOpen, setIsOpen] = useState(false)\n const [currentIndex, setCurrentIndex] = useState(0)\n const [images, setImages] = useState<ImageAttachment[]>(initialImages)\n\n const currentImage = useMemo(() => images[currentIndex], [images, currentIndex])\n\n const hasPrev = useMemo(() => {\n if (wrap) return images.length > 1\n return currentIndex > 0\n }, [currentIndex, images.length, wrap])\n\n const hasNext = useMemo(() => {\n if (wrap) return images.length > 1\n return currentIndex < images.length - 1\n }, [currentIndex, images.length, wrap])\n\n const open = useCallback(\n (index: number, newImages?: ImageAttachment[]) => {\n if (newImages) {\n setImages(newImages)\n }\n const targetImages = newImages || images\n // Handle empty images array - don't compute negative index\n if (targetImages.length === 0) {\n setCurrentIndex(0)\n setIsOpen(true)\n return\n }\n const safeIndex = Math.max(0, Math.min(index, targetImages.length - 1))\n setCurrentIndex(safeIndex)\n setIsOpen(true)\n onOpen?.(safeIndex)\n },\n [images, onOpen]\n )\n\n const close = useCallback(() => {\n setIsOpen(false)\n onClose?.()\n }, [onClose])\n\n const prev = useCallback(() => {\n if (images.length < 2) return\n if (!hasPrev && !wrap) return\n\n setCurrentIndex((current) => {\n const newIndex = wrap\n ? (current - 1 + images.length) % images.length\n : Math.max(0, current - 1)\n onNavigate?.(newIndex, 'prev')\n return newIndex\n })\n }, [hasPrev, wrap, images.length, onNavigate])\n\n const next = useCallback(() => {\n if (images.length < 2) return\n if (!hasNext && !wrap) return\n\n setCurrentIndex((current) => {\n const newIndex = wrap ? (current + 1) % images.length : Math.min(images.length - 1, current + 1)\n onNavigate?.(newIndex, 'next')\n return newIndex\n })\n }, [hasNext, wrap, images.length, onNavigate])\n\n const goTo = useCallback(\n (index: number) => {\n const safeIndex = Math.max(0, Math.min(index, images.length - 1))\n setCurrentIndex(safeIndex)\n },\n [images.length]\n )\n\n const setImagesHandler = useCallback((newImages: ImageAttachment[]) => {\n setImages(newImages)\n // Reset index if it's out of bounds (handle empty array case)\n if (newImages.length === 0) {\n setCurrentIndex(0)\n } else {\n setCurrentIndex((current) => Math.min(current, newImages.length - 1))\n }\n }, [])\n\n return {\n isOpen,\n currentIndex,\n currentImage,\n images,\n hasPrev,\n hasNext,\n open,\n close,\n prev,\n next,\n goTo,\n setImages: setImagesHandler,\n }\n}\n","/**\n * useAutoScroll Hook\n * Manages auto-scroll behavior for chat containers\n */\n\nimport { useRef, useState, useCallback, useEffect } from 'react'\n\nexport interface UseAutoScrollOptions {\n /** Threshold in pixels from bottom to consider \"at bottom\" (default: 100) */\n threshold?: number\n /** Smooth scroll behavior (default: true) */\n smooth?: boolean\n /** Callback when scroll position changes */\n onScroll?: (isAtBottom: boolean) => void\n}\n\nexport interface UseAutoScrollReturn {\n /** Ref to attach to the scrollable container */\n containerRef: React.RefObject<HTMLDivElement>\n /** Whether the container is scrolled to the bottom */\n isAtBottom: boolean\n /** Whether auto-scroll should be active */\n shouldAutoScroll: boolean\n /** Manually scroll to bottom */\n scrollToBottom: (smooth?: boolean) => void\n /** Enable/disable auto-scroll */\n setAutoScroll: (enabled: boolean) => void\n /** Handle scroll event (attach to container if not using ref) */\n handleScroll: (e: React.UIEvent<HTMLDivElement>) => void\n}\n\n/**\n * Hook for managing auto-scroll behavior in chat containers\n *\n * @example\n * ```tsx\n * const scroll = useAutoScroll({ threshold: 50 })\n *\n * // Attach to container\n * <div ref={scroll.containerRef} onScroll={scroll.handleScroll}>\n * {messages.map(msg => <Message key={msg.id} />)}\n * </div>\n *\n * // Scroll button\n * {!scroll.isAtBottom && (\n * <button onClick={() => scroll.scrollToBottom()}>\n * Scroll to bottom\n * </button>\n * )}\n * ```\n */\nexport function useAutoScroll(options: UseAutoScrollOptions = {}): UseAutoScrollReturn {\n const { threshold = 100, smooth = true, onScroll } = options\n\n const containerRef = useRef<HTMLDivElement>(null)\n const [isAtBottom, setIsAtBottom] = useState(true)\n const [shouldAutoScroll, setShouldAutoScroll] = useState(true)\n\n const checkIsAtBottom = useCallback(\n (container: HTMLElement): boolean => {\n const { scrollTop, scrollHeight, clientHeight } = container\n return scrollHeight - scrollTop - clientHeight <= threshold\n },\n [threshold]\n )\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const container = e.currentTarget\n const atBottom = checkIsAtBottom(container)\n setIsAtBottom(atBottom)\n setShouldAutoScroll(atBottom)\n onScroll?.(atBottom)\n },\n [checkIsAtBottom, onScroll]\n )\n\n const scrollToBottom = useCallback(\n (useSmooth?: boolean) => {\n const container = containerRef.current\n if (!container) return\n\n const shouldSmooth = useSmooth ?? smooth\n container.scrollTo({\n top: container.scrollHeight,\n behavior: shouldSmooth ? 'smooth' : 'auto',\n })\n setIsAtBottom(true)\n setShouldAutoScroll(true)\n },\n [smooth]\n )\n\n const setAutoScroll = useCallback((enabled: boolean) => {\n setShouldAutoScroll(enabled)\n if (enabled) {\n // Scroll to bottom immediately when enabling\n const container = containerRef.current\n if (container) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'auto',\n })\n setIsAtBottom(true)\n }\n }\n }, [])\n\n // Auto-scroll when content changes (using MutationObserver)\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n let rafId: number | null = null\n const observer = new MutationObserver(() => {\n if (shouldAutoScroll) {\n if (rafId === null) {\n rafId = requestAnimationFrame(() => {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'instant',\n })\n rafId = null\n })\n }\n }\n })\n\n observer.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n\n return () => {\n observer.disconnect()\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n }\n }, [shouldAutoScroll])\n\n return {\n containerRef,\n isAtBottom,\n shouldAutoScroll,\n scrollToBottom,\n setAutoScroll,\n handleScroll,\n }\n}\n","/**\n * useMessageActions Hook\n * Provides copy, regenerate, and edit functionality for messages\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\n\nexport interface UseMessageActionsOptions {\n /** Callback when copy succeeds */\n onCopy?: (content: string) => void\n /** Callback when copy fails */\n onCopyError?: (error: Error) => void\n /** Callback when regenerate is triggered */\n onRegenerate?: () => void | Promise<void>\n /** Callback when edit is triggered */\n onEdit?: (content: string) => void | Promise<void>\n /** Duration to show \"copied\" state in ms (default: 2000) */\n copiedDuration?: number\n}\n\nexport interface UseMessageActionsReturn {\n /** Whether content was recently copied */\n isCopied: boolean\n /** Whether regenerate is in progress */\n isRegenerating: boolean\n /** Whether edit is in progress */\n isEditing: boolean\n /** Copy content to clipboard */\n copy: (content: string) => Promise<void>\n /** Trigger regenerate action */\n regenerate: () => Promise<void>\n /** Trigger edit action */\n edit: (content: string) => Promise<void>\n /** Reset all states */\n reset: () => void\n}\n\n/**\n * Hook for managing message actions (copy, regenerate, edit)\n *\n * @example\n * ```tsx\n * const actions = useMessageActions({\n * onRegenerate: () => chatContext.regenerateMessage(messageId),\n * onEdit: (content) => chatContext.editMessage(messageId, content),\n * onCopy: () => toast.success('Copied!'),\n * })\n *\n * <button onClick={() => actions.copy(message.content)}>\n * {actions.isCopied ? 'Copied!' : 'Copy'}\n * </button>\n *\n * <button onClick={actions.regenerate} disabled={actions.isRegenerating}>\n * {actions.isRegenerating ? 'Regenerating...' : 'Regenerate'}\n * </button>\n * ```\n */\nexport function useMessageActions(options: UseMessageActionsOptions = {}): UseMessageActionsReturn {\n const { onCopy, onCopyError, onRegenerate, onEdit, copiedDuration = 2000 } = options\n\n const [isCopied, setIsCopied] = useState(false)\n const [isRegenerating, setIsRegenerating] = useState(false)\n const [isEditing, setIsEditing] = useState(false)\n\n const copiedTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n return () => {\n if (copiedTimeoutRef.current) {\n clearTimeout(copiedTimeoutRef.current)\n copiedTimeoutRef.current = null\n }\n }\n }, [])\n\n const copy = useCallback(\n async (content: string) => {\n try {\n await navigator.clipboard.writeText(content)\n setIsCopied(true)\n onCopy?.(content)\n\n // Clear existing timeout\n if (copiedTimeoutRef.current) {\n clearTimeout(copiedTimeoutRef.current)\n }\n\n // Reset copied state after duration\n copiedTimeoutRef.current = setTimeout(() => {\n setIsCopied(false)\n copiedTimeoutRef.current = null\n }, copiedDuration)\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Failed to copy')\n onCopyError?.(err)\n throw err\n }\n },\n [onCopy, onCopyError, copiedDuration]\n )\n\n const regenerate = useCallback(async () => {\n if (!onRegenerate) return\n if (isRegenerating) return\n\n setIsRegenerating(true)\n try {\n await onRegenerate()\n } finally {\n setIsRegenerating(false)\n }\n }, [onRegenerate, isRegenerating])\n\n const edit = useCallback(\n async (content: string) => {\n if (!onEdit) return\n if (isEditing) return\n\n setIsEditing(true)\n try {\n await onEdit(content)\n } finally {\n setIsEditing(false)\n }\n },\n [onEdit, isEditing]\n )\n\n const reset = useCallback(() => {\n setIsCopied(false)\n setIsRegenerating(false)\n setIsEditing(false)\n if (copiedTimeoutRef.current) {\n clearTimeout(copiedTimeoutRef.current)\n copiedTimeoutRef.current = null\n }\n }, [])\n\n return {\n isCopied,\n isRegenerating,\n isEditing,\n copy,\n regenerate,\n edit,\n reset,\n }\n}\n","/**\n * useAttachments Hook\n * Manages file upload state, validation, and preview\n */\n\nimport { useState, useCallback, useMemo, useRef } from 'react'\nimport type { Attachment } from '../types'\n\nexport interface FileValidationError {\n file: File\n reason: 'size' | 'type' | 'count' | 'custom'\n message: string\n}\n\nexport interface UseAttachmentsOptions {\n /** Maximum number of files (default: 10) */\n maxFiles?: number\n /** Maximum file size in bytes (default: 10MB) */\n maxFileSize?: number\n /** Allowed MIME types (default: images only) */\n allowedTypes?: string[]\n /** Custom validation function */\n validate?: (file: File) => string | null\n /** Callback when files are added */\n onAdd?: (files: Attachment[]) => void\n /** Callback when a file is removed */\n onRemove?: (file: Attachment) => void\n /** Callback when validation fails */\n onError?: (errors: FileValidationError[]) => void\n}\n\nexport interface UseAttachmentsReturn {\n /** Current attachments */\n files: Attachment[]\n /** Validation errors from last operation */\n errors: FileValidationError[]\n /** Whether files are being processed */\n isProcessing: boolean\n /** Whether max file limit is reached */\n isMaxReached: boolean\n /** Number of remaining slots */\n remainingSlots: number\n /** Add files (validates and processes) */\n add: (files: FileList | File[]) => Promise<void>\n /** Remove a specific file */\n remove: (fileOrId: Attachment | string) => void\n /** Clear all files */\n clear: () => void\n /** Clear errors */\n clearErrors: () => void\n /** Set files directly (for controlled mode) */\n setFiles: (files: Attachment[]) => void\n}\n\nconst DEFAULT_MAX_FILES = 10\nconst DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024 // 10MB\nconst DEFAULT_ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']\n\n/**\n * Generate a unique ID for an attachment\n */\nfunction generateId(): string {\n return `attachment-${Date.now()}-${Math.random().toString(36).substring(7)}`\n}\n\n/**\n * Check if a file is an image\n */\nfunction isImageFile(file: File): boolean {\n return file.type.startsWith('image/')\n}\n\n/**\n * Create a data URL preview for an image file\n */\nasync function createImagePreview(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = () => reject(new Error('Failed to read file'))\n reader.readAsDataURL(file)\n })\n}\n\n/**\n * Hook for managing file attachments\n *\n * @example\n * ```tsx\n * const attachments = useAttachments({\n * maxFiles: 5,\n * maxFileSize: 5 * 1024 * 1024, // 5MB\n * onError: (errors) => errors.forEach(e => toast.error(e.message)),\n * })\n *\n * <input\n * type=\"file\"\n * multiple\n * accept=\"image/*\"\n * onChange={(e) => attachments.add(e.target.files)}\n * />\n *\n * {attachments.files.map(file => (\n * <AttachmentPreview\n * key={file.id}\n * attachment={file}\n * onRemove={() => attachments.remove(file)}\n * />\n * ))}\n *\n * {attachments.errors.length > 0 && (\n * <ErrorList errors={attachments.errors} />\n * )}\n * ```\n */\nexport function useAttachments(options: UseAttachmentsOptions = {}): UseAttachmentsReturn {\n const {\n maxFiles = DEFAULT_MAX_FILES,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n allowedTypes = DEFAULT_ALLOWED_TYPES,\n validate,\n onAdd,\n onRemove,\n onError,\n } = options\n\n const [files, setFiles] = useState<Attachment[]>([])\n const [errors, setErrors] = useState<FileValidationError[]>([])\n const [isProcessing, setIsProcessing] = useState(false)\n const removedRef = useRef<Attachment | null>(null)\n\n const isMaxReached = useMemo(() => files.length >= maxFiles, [files.length, maxFiles])\n const remainingSlots = useMemo(() => Math.max(0, maxFiles - files.length), [files.length, maxFiles])\n\n const validateFile = useCallback(\n (file: File, currentCount: number): FileValidationError | null => {\n // Check count\n if (currentCount >= maxFiles) {\n return {\n file,\n reason: 'count',\n message: `Maximum ${maxFiles} files allowed`,\n }\n }\n\n // Check file size\n if (file.size > maxFileSize) {\n const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(1)\n return {\n file,\n reason: 'size',\n message: `File \"${file.name}\" exceeds ${maxSizeMB}MB limit`,\n }\n }\n\n // Check file type\n if (allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\n return {\n file,\n reason: 'type',\n message: `File type \"${file.type || 'unknown'}\" not allowed`,\n }\n }\n\n // Custom validation\n if (validate) {\n const customError = validate(file)\n if (customError) {\n return {\n file,\n reason: 'custom',\n message: customError,\n }\n }\n }\n\n return null\n },\n [maxFiles, maxFileSize, allowedTypes, validate]\n )\n\n const add = useCallback(\n async (newFiles: FileList | File[]) => {\n if (isProcessing) {\n const fileArray = Array.from(newFiles)\n if (fileArray.length > 0) {\n const processingErrors = fileArray.map((file) => ({\n file,\n reason: 'custom' as const,\n message: 'Please wait for the current files to finish processing.',\n }))\n setErrors(processingErrors)\n onError?.(processingErrors)\n }\n return\n }\n\n setIsProcessing(true)\n const fileArray = Array.from(newFiles)\n const validationErrors: FileValidationError[] = []\n const validFiles: Attachment[] = []\n let currentCount = files.length\n\n for (const file of fileArray) {\n const error = validateFile(file, currentCount)\n if (error) {\n validationErrors.push(error)\n continue\n }\n\n // Create attachment object\n const attachment: Attachment = {\n id: generateId(),\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n }\n\n // Add preview URL for images\n if (isImageFile(file)) {\n try {\n const preview = await createImagePreview(file)\n attachment.base64Data = preview\n } catch {\n // Continue without preview if it fails\n }\n }\n\n validFiles.push(attachment)\n currentCount++\n }\n\n if (validationErrors.length > 0) {\n setErrors(validationErrors)\n onError?.(validationErrors)\n }\n\n if (validFiles.length > 0) {\n setFiles((prev) => [...prev, ...validFiles])\n onAdd?.(validFiles)\n }\n\n setIsProcessing(false)\n },\n [files.length, validateFile, onAdd, onError, isProcessing]\n )\n\n const remove = useCallback(\n (fileOrId: Attachment | string) => {\n const id = typeof fileOrId === 'string' ? fileOrId : fileOrId.id\n setFiles((prev) => {\n const removed = prev.find((f) => f.id === id) ?? null\n const next = prev.filter((f) => f.id !== id)\n removedRef.current = removed\n return next\n })\n\n const removed = removedRef.current\n if (removed) {\n onRemove?.(removed)\n removedRef.current = null\n }\n },\n [onRemove]\n )\n\n const clear = useCallback(() => {\n setFiles([])\n setErrors([])\n }, [])\n\n const clearErrors = useCallback(() => {\n setErrors([])\n }, [])\n\n const setFilesHandler = useCallback((newFiles: Attachment[]) => {\n setFiles(newFiles)\n }, [])\n\n return {\n files,\n errors,\n isProcessing,\n isMaxReached,\n remainingSlots,\n add,\n remove,\n clear,\n clearErrors,\n setFiles: setFilesHandler,\n }\n}\n","/**\n * useMarkdownCopy Hook\n * Manages copy-to-clipboard state for code blocks in markdown\n */\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\n\nexport interface UseMarkdownCopyOptions {\n /** Duration to show \"copied\" state in ms (default: 2000) */\n copiedDuration?: number\n /** Callback when copy succeeds */\n onCopy?: (content: string, language?: string) => void\n /** Callback when copy fails */\n onError?: (error: Error) => void\n}\n\nexport interface UseMarkdownCopyReturn {\n /** Map of copied states by block ID */\n copiedStates: Map<string, boolean>\n /** Check if a specific block is in copied state */\n isCopied: (blockId: string) => boolean\n /** Copy content with block ID tracking */\n copy: (blockId: string, content: string, language?: string) => Promise<void>\n /** Reset copied state for a specific block */\n reset: (blockId: string) => void\n /** Reset all copied states */\n resetAll: () => void\n}\n\n/**\n * Hook for managing copy states for multiple code blocks\n *\n * @example\n * ```tsx\n * const markdownCopy = useMarkdownCopy({\n * onCopy: (content, lang) => console.log(`Copied ${lang} code`),\n * })\n *\n * function CodeBlock({ id, code, language }) {\n * return (\n * <div>\n * <pre>{code}</pre>\n * <button onClick={() => markdownCopy.copy(id, code, language)}>\n * {markdownCopy.isCopied(id) ? 'Copied!' : 'Copy'}\n * </button>\n * </div>\n * )\n * }\n * ```\n */\nexport function useMarkdownCopy(options: UseMarkdownCopyOptions = {}): UseMarkdownCopyReturn {\n const { copiedDuration = 2000, onCopy, onError } = options\n\n const [copiedStates, setCopiedStates] = useState<Map<string, boolean>>(new Map())\n const timeoutsRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map())\n\n useEffect(() => {\n return () => {\n timeoutsRef.current.forEach((timeout) => clearTimeout(timeout))\n timeoutsRef.current.clear()\n }\n }, [])\n\n const isCopied = useCallback(\n (blockId: string): boolean => {\n return copiedStates.get(blockId) ?? false\n },\n [copiedStates]\n )\n\n const copy = useCallback(\n async (blockId: string, content: string, language?: string) => {\n try {\n await navigator.clipboard.writeText(content)\n\n // Set copied state\n setCopiedStates((prev) => {\n const next = new Map(prev)\n next.set(blockId, true)\n return next\n })\n\n onCopy?.(content, language)\n\n // Clear existing timeout for this block\n const existingTimeout = timeoutsRef.current.get(blockId)\n if (existingTimeout) {\n clearTimeout(existingTimeout)\n }\n\n // Set timeout to reset copied state\n const timeout = setTimeout(() => {\n setCopiedStates((prev) => {\n const next = new Map(prev)\n next.set(blockId, false)\n return next\n })\n timeoutsRef.current.delete(blockId)\n }, copiedDuration)\n\n timeoutsRef.current.set(blockId, timeout)\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Failed to copy')\n onError?.(err)\n throw err\n }\n },\n [copiedDuration, onCopy, onError]\n )\n\n const reset = useCallback((blockId: string) => {\n setCopiedStates((prev) => {\n const next = new Map(prev)\n next.set(blockId, false)\n return next\n })\n\n const timeout = timeoutsRef.current.get(blockId)\n if (timeout) {\n clearTimeout(timeout)\n timeoutsRef.current.delete(blockId)\n }\n }, [])\n\n const resetAll = useCallback(() => {\n setCopiedStates(new Map())\n\n // Clear all timeouts\n timeoutsRef.current.forEach((timeout) => clearTimeout(timeout))\n timeoutsRef.current.clear()\n }, [])\n\n return {\n copiedStates,\n isCopied,\n copy,\n reset,\n resetAll,\n }\n}\n","/**\n * Configuration context provider for BiChat\n * Provides props-based configuration with optional window global fallback\n */\n\nimport { createContext, useContext, ReactNode } from 'react'\n\nexport interface BiChatConfig {\n user: {\n id: string\n email: string\n firstName: string\n lastName: string\n permissions: string[]\n }\n tenant: {\n id: string\n name: string\n }\n locale: {\n language: string\n translations: Record<string, string>\n }\n endpoints: {\n graphQL: string\n stream: string\n }\n csrfToken?: string\n}\n\nconst ConfigContext = createContext<BiChatConfig | null>(null)\n\ninterface ConfigProviderProps {\n config?: BiChatConfig\n useGlobalConfig?: boolean\n children: ReactNode\n}\n\n/**\n * ConfigProvider component\n * Provides configuration to the BiChat library\n *\n * @param config - Configuration object (preferred method)\n * @param useGlobalConfig - If true, falls back to window.__BICHAT_CONTEXT__ when config is not provided\n * @param children - React children\n */\nexport function ConfigProvider({ config, useGlobalConfig = false, children }: ConfigProviderProps) {\n let resolvedConfig: BiChatConfig | null = null\n\n if (config) {\n resolvedConfig = config\n } else if (useGlobalConfig && typeof window !== 'undefined') {\n const globalContext = (window as any).__BICHAT_CONTEXT__\n const globalCSRF = (window as any).__CSRF_TOKEN__\n\n if (globalContext) {\n resolvedConfig = {\n user: {\n id: String(globalContext.user?.id || ''),\n email: globalContext.user?.email || '',\n firstName: globalContext.user?.firstName || '',\n lastName: globalContext.user?.lastName || '',\n permissions: globalContext.user?.permissions || [],\n },\n tenant: {\n id: globalContext.tenant?.id || '',\n name: globalContext.tenant?.name || '',\n },\n locale: {\n language: globalContext.locale?.language || 'en',\n translations: globalContext.locale?.translations || {},\n },\n endpoints: {\n graphQL: globalContext.config?.graphQLEndpoint || '/graphql',\n stream: globalContext.config?.streamEndpoint || '/stream',\n },\n csrfToken: globalCSRF,\n }\n }\n }\n\n return (\n <ConfigContext.Provider value={resolvedConfig}>\n {children}\n </ConfigContext.Provider>\n )\n}\n\n/**\n * Hook to access BiChat configuration\n * Returns null if no configuration is available\n */\nexport function useConfig(): BiChatConfig | null {\n return useContext(ConfigContext)\n}\n\n/**\n * Hook to access BiChat configuration (required)\n * Throws an error if configuration is not available\n */\nexport function useRequiredConfig(): BiChatConfig {\n const config = useContext(ConfigContext)\n if (!config) {\n throw new Error(\n 'BiChat configuration not found. ' +\n 'Wrap your app with <ConfigProvider config={...}> or use useGlobalConfig={true}.'\n )\n }\n return config\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function hasPermission(config: BiChatConfig | null, permission: string): boolean {\n if (!config) {\n return false\n }\n return config.user.permissions.includes(permission)\n}\n","/**\n * Predefined theme configurations\n */\n\nimport { Theme } from './types'\n\nexport const lightTheme: Theme = {\n name: 'light',\n colors: {\n background: '#ffffff',\n surface: '#f9fafb',\n primary: '#3b82f6',\n secondary: '#6b7280',\n text: '#111827',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n error: '#ef4444',\n success: '#10b981',\n warning: '#f59e0b',\n userBubble: '#3b82f6',\n assistantBubble: '#f3f4f6',\n userText: '#ffffff',\n assistantText: '#111827',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n}\n\nexport const darkTheme: Theme = {\n name: 'dark',\n colors: {\n background: '#111827',\n surface: '#1f2937',\n primary: '#60a5fa',\n secondary: '#9ca3af',\n text: '#f9fafb',\n textMuted: '#9ca3af',\n border: '#374151',\n error: '#f87171',\n success: '#34d399',\n warning: '#fbbf24',\n userBubble: '#2563eb',\n assistantBubble: '#1f2937',\n userText: '#f9fafb',\n assistantText: '#f9fafb',\n },\n spacing: {\n xs: '0.25rem',\n sm: '0.5rem',\n md: '1rem',\n lg: '1.5rem',\n xl: '2rem',\n },\n borderRadius: {\n sm: '0.25rem',\n md: '0.5rem',\n lg: '0.75rem',\n full: '9999px',\n },\n}\n","/**\n * Theme provider component and hook\n * Manages theme state and applies CSS variables to document root\n */\n\nimport { createContext, useContext, useEffect, useMemo, ReactNode } from 'react'\nimport { Theme } from './types'\nimport { lightTheme, darkTheme } from './themes'\n\ninterface ThemeContextValue {\n theme: Theme\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nexport interface ThemeProviderProps {\n theme?: Theme | 'light' | 'dark' | 'system'\n children: ReactNode\n}\n\n/**\n * Detect system theme preference\n */\nfunction getSystemTheme(): Theme {\n if (typeof window === 'undefined') {\n return lightTheme\n }\n\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\n return prefersDark ? darkTheme : lightTheme\n}\n\n/**\n * Resolve theme prop to Theme object\n */\nfunction resolveTheme(themeProp: Theme | 'light' | 'dark' | 'system'): Theme {\n if (typeof themeProp === 'object') {\n return themeProp\n }\n\n switch (themeProp) {\n case 'light':\n return lightTheme\n case 'dark':\n return darkTheme\n case 'system':\n return getSystemTheme()\n default:\n return lightTheme\n }\n}\n\n/**\n * Apply theme CSS variables to document root\n */\nfunction applyThemeVariables(theme: Theme): void {\n if (typeof document === 'undefined') {\n return\n }\n\n const root = document.documentElement\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-${key}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--bichat-radius-${key}`, value)\n })\n}\n\n/**\n * Theme provider component\n * Wraps the application and provides theme context\n */\nexport function ThemeProvider({ theme = 'system', children }: ThemeProviderProps) {\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme])\n\n useEffect(() => {\n applyThemeVariables(resolvedTheme)\n }, [resolvedTheme])\n\n // Listen for system theme changes when using 'system'\n useEffect(() => {\n if (theme !== 'system') {\n return\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = () => {\n const newTheme = getSystemTheme()\n applyThemeVariables(newTheme)\n }\n\n mediaQuery.addEventListener('change', handleChange)\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange)\n }\n }, [theme])\n\n const value: ThemeContextValue = {\n theme: resolvedTheme,\n }\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n\n/**\n * Hook to access current theme\n */\nexport function useTheme(): Theme {\n const context = useContext(ThemeContext)\n\n if (!context) {\n throw new Error('useTheme must be used within ThemeProvider')\n }\n\n return context.theme\n}\n","/**\n * CSRF token management for API requests\n */\n\n/**\n * Get CSRF token from window object\n * @returns CSRF token string\n */\nexport function getCSRFToken(): string {\n const token = window.__CSRF_TOKEN__\n if (!token) {\n console.warn('CSRF token not found in window object')\n return ''\n }\n return token\n}\n\n/**\n * Add CSRF token to request headers\n * @param headers - Headers object to modify\n * @returns Modified headers object\n */\nexport function addCSRFHeader(headers: Headers): Headers {\n const token = getCSRFToken()\n if (token) {\n headers.set('X-CSRF-Token', token)\n }\n return headers\n}\n\n/**\n * Create headers with CSRF token\n * @param init - Optional initial headers\n * @returns Headers object with CSRF token\n */\nexport function createHeadersWithCSRF(init?: HeadersInit): Headers {\n const headers = new Headers(init)\n return addCSRFHeader(headers)\n}\n","/**\n * Built-in HTTP data source with SSE streaming and AbortController\n * Implements ChatDataSource interface with real HTTP/GraphQL calls\n *\n * Uses turn-based architecture - fetches ConversationTurns instead of flat messages.\n */\n\nimport type {\n ChatDataSource,\n Session,\n ConversationTurn,\n PendingQuestion,\n Attachment,\n StreamChunk,\n QuestionAnswers,\n} from '../types'\n\nexport interface HttpDataSourceConfig {\n baseUrl: string\n graphQLEndpoint?: string\n streamEndpoint?: string\n csrfToken?: string | (() => string)\n headers?: Record<string, string>\n timeout?: number\n}\n\ninterface SessionState {\n session: Session\n turns: ConversationTurn[]\n pendingQuestion?: PendingQuestion | null\n}\n\ninterface Result<T> {\n success: boolean\n data?: T\n error?: string\n}\n\nexport class HttpDataSource implements ChatDataSource {\n private config: HttpDataSourceConfig\n private abortController: AbortController | null = null\n\n constructor(config: HttpDataSourceConfig) {\n this.config = {\n graphQLEndpoint: '/graphql',\n streamEndpoint: '/stream',\n timeout: 30000,\n ...config,\n }\n }\n\n /**\n * Get CSRF token from config\n */\n private getCSRFToken(): string {\n if (!this.config.csrfToken) {\n return ''\n }\n return typeof this.config.csrfToken === 'function'\n ? this.config.csrfToken()\n : this.config.csrfToken\n }\n\n /**\n * Create headers for HTTP requests\n */\n private createHeaders(additionalHeaders?: Record<string, string>): Headers {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...this.config.headers,\n ...additionalHeaders,\n })\n\n const csrfToken = this.getCSRFToken()\n if (csrfToken) {\n headers.set('X-CSRF-Token', csrfToken)\n }\n\n return headers\n }\n\n /**\n * Execute GraphQL query\n */\n private async graphql<T>(query: string, variables?: Record<string, any>): Promise<T> {\n const url = `${this.config.baseUrl}${this.config.graphQLEndpoint}`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.createHeaders(),\n body: JSON.stringify({ query, variables }),\n signal: this.abortController?.signal,\n })\n\n if (!response.ok) {\n throw new Error(`GraphQL request failed: ${response.statusText}`)\n }\n\n const result = await response.json()\n\n if (result.errors && result.errors.length > 0) {\n throw new Error(result.errors[0].message || 'GraphQL error')\n }\n\n return result.data\n }\n\n /**\n * Create a new chat session\n */\n async createSession(): Promise<Session> {\n const query = `\n mutation CreateChatSession {\n createChatSession {\n id\n title\n status\n pinned\n createdAt\n updatedAt\n }\n }\n `\n\n const data = await this.graphql<{ createChatSession: Session }>(query)\n return data.createChatSession\n }\n\n /**\n * Fetch an existing session with turns (turn-based architecture)\n */\n async fetchSession(id: string): Promise<SessionState | null> {\n const query = `\n query GetChatSession($id: ID!) {\n chatSession(id: $id) {\n session {\n id\n title\n status\n pinned\n createdAt\n updatedAt\n }\n turns {\n id\n sessionId\n createdAt\n userTurn {\n id\n content\n attachments {\n id\n filename\n mimeType\n sizeBytes\n base64Data\n }\n createdAt\n }\n assistantTurn {\n id\n content\n explanation\n citations {\n id\n type\n title\n url\n startIndex\n endIndex\n excerpt\n source\n }\n chartData {\n chartType\n title\n series {\n name\n data\n }\n labels\n colors\n height\n }\n artifacts {\n type\n filename\n url\n sizeReadable\n rowCount\n description\n }\n codeOutputs {\n type\n content\n filename\n mimeType\n sizeBytes\n }\n createdAt\n }\n }\n pendingQuestion {\n id\n turnId\n questions {\n id\n text\n type\n options {\n id\n label\n value\n }\n required\n }\n status\n }\n }\n }\n `\n\n try {\n const data = await this.graphql<{ chatSession: SessionState | null }>(query, { id })\n return data.chatSession\n } catch (err) {\n console.error('Failed to fetch session:', err)\n return null\n }\n }\n\n /**\n * Send a message and stream the response using SSE\n */\n async *sendMessage(\n sessionId: string,\n content: string,\n attachments: Attachment[] = [],\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk> {\n // Create new abort controller for this stream\n this.abortController = new AbortController()\n\n // Link external signal if provided\n if (signal) {\n signal.addEventListener('abort', () => {\n this.abortController?.abort()\n })\n }\n\n const url = `${this.config.baseUrl}${this.config.streamEndpoint}`\n\n const payload = {\n sessionId,\n content,\n attachments: attachments.map(a => ({\n id: a.id,\n filename: a.filename,\n mimeType: a.mimeType,\n sizeBytes: a.sizeBytes,\n base64Data: a.base64Data,\n })),\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: this.createHeaders(),\n body: JSON.stringify(payload),\n signal: this.abortController.signal,\n })\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`)\n }\n\n if (!response.body) {\n throw new Error('Response body is null')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n\n if (done) {\n break\n }\n\n buffer += decoder.decode(value, { stream: true })\n\n // Process SSE events in buffer\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) {\n continue\n }\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n\n try {\n const chunk = JSON.parse(data) as StreamChunk\n yield chunk\n\n // Stop if done or error\n if (chunk.type === 'done' || chunk.type === 'error') {\n return\n }\n } catch (parseErr) {\n console.error('Failed to parse SSE data:', parseErr)\n yield {\n type: 'error',\n error: 'Failed to parse stream data',\n }\n return\n }\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n } catch (err) {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n yield {\n type: 'error',\n error: 'Stream cancelled',\n }\n } else {\n yield {\n type: 'error',\n error: err.message,\n }\n }\n } else {\n yield {\n type: 'error',\n error: 'Unknown error',\n }\n }\n } finally {\n this.abortController = null\n }\n }\n\n /**\n * Cancel ongoing stream\n */\n cancelStream(): void {\n if (this.abortController) {\n this.abortController.abort()\n this.abortController = null\n }\n }\n\n /**\n * Submit answers to a pending question\n */\n async submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<Result<void>> {\n const query = `\n mutation SubmitQuestionAnswers($sessionId: ID!, $questionId: ID!, $answers: JSON!) {\n submitQuestionAnswers(sessionId: $sessionId, questionId: $questionId, answers: $answers) {\n success\n error\n }\n }\n `\n\n try {\n const data = await this.graphql<{\n submitQuestionAnswers: Result<void>\n }>(query, { sessionId, questionId, answers })\n\n return data.submitQuestionAnswers\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to submit answers',\n }\n }\n }\n\n /**\n * Cancel a pending question\n */\n async cancelPendingQuestion(questionId: string): Promise<Result<void>> {\n const query = `\n mutation CancelPendingQuestion($questionId: ID!) {\n cancelPendingQuestion(questionId: $questionId) {\n success\n error\n }\n }\n `\n\n try {\n const data = await this.graphql<{\n cancelPendingQuestion: Result<void>\n }>(query, { questionId })\n\n return data.cancelPendingQuestion\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Failed to cancel question',\n }\n }\n }\n\n /**\n * Navigate to a session (optional, for SPA routing)\n */\n navigateToSession?(sessionId: string): void {\n // Default implementation - can be overridden\n if (typeof window !== 'undefined') {\n window.location.href = `/chat/${sessionId}`\n }\n }\n}\n\n/**\n * Factory function to create HttpDataSource\n */\nexport function createHttpDataSource(config: HttpDataSourceConfig): ChatDataSource {\n return new HttpDataSource(config)\n}\n","/**\n * Type definitions for BI-Chat UI components\n */\n\n// ============================================================================\n// Session Types\n// ============================================================================\n\nexport interface Session {\n id: string\n title: string\n status: 'active' | 'archived'\n pinned: boolean\n createdAt: string\n updatedAt: string\n}\n\n// ============================================================================\n// Turn-Based Architecture Types\n// ============================================================================\n\n/**\n * A conversation turn groups a user message with its assistant response.\n * This provides a cleaner mental model than flat message lists.\n */\nexport interface ConversationTurn {\n id: string\n sessionId: string\n userTurn: UserTurn\n assistantTurn?: AssistantTurn\n createdAt: string\n}\n\n/**\n * Content of a user's message in a conversation turn\n */\nexport interface UserTurn {\n id: string\n content: string\n attachments: Attachment[]\n createdAt: string\n}\n\n/**\n * Content of an assistant's response in a conversation turn\n */\nexport interface AssistantTurn {\n id: string\n content: string\n explanation?: string\n citations: Citation[]\n chartData?: ChartData\n artifacts: Artifact[]\n codeOutputs: CodeOutput[]\n createdAt: string\n}\n\n// ============================================================================\n// Message Role Enum\n// ============================================================================\n\n/**\n * Role of a message in a conversation\n */\nexport enum MessageRole {\n User = 'user',\n Assistant = 'assistant',\n System = 'system',\n Tool = 'tool',\n}\n\n// ============================================================================\n// Tool Call Types\n// ============================================================================\n\n/**\n * A tool/function call made by the assistant\n */\nexport interface ToolCall {\n id: string\n name: string\n arguments: string\n}\n\n// ============================================================================\n// Citation Types\n// ============================================================================\n\n/**\n * Citation with position information for inline replacement\n */\nexport interface Citation {\n id: string\n /** Type of citation (e.g., \"url_citation\") */\n type: string\n /** Title of the cited source */\n title: string\n /** URL of the cited source */\n url: string\n /** Starting character index in the message content where this citation is referenced */\n startIndex: number\n /** Ending character index in the message content where this citation is referenced */\n endIndex: number\n /** Optional excerpt from the source */\n excerpt?: string\n /** Legacy: source name (for backward compatibility) */\n source?: string\n}\n\nexport interface Attachment {\n id: string\n filename: string\n mimeType: string\n sizeBytes: number\n base64Data?: string\n}\n\n// Image attachment with preview for MessageInput\nexport interface ImageAttachment {\n filename: string\n mimeType: string\n sizeBytes: number\n base64Data: string\n preview: string // data URL for img src\n}\n\n// ============================================================================\n// Code Interpreter Output Types\n// ============================================================================\n\n/**\n * Output from code interpreter tool\n */\nexport interface CodeOutput {\n type: 'image' | 'text' | 'error'\n content: string\n /** File metadata for downloadable outputs */\n filename?: string\n mimeType?: string\n sizeBytes?: number\n}\n\n// ============================================================================\n// Message Queue Types\n// ============================================================================\n\n/**\n * Queued message for offline/loading state\n */\nexport interface QueuedMessage {\n content: string\n attachments: ImageAttachment[]\n}\n\n// ============================================================================\n// Chart Types (ApexCharts format)\n// ============================================================================\n\n/**\n * Chart visualization data for ApexCharts\n */\nexport interface ChartData {\n /** Type of chart: line, bar, pie, area, or donut */\n chartType: 'line' | 'bar' | 'area' | 'pie' | 'donut'\n /** Chart title displayed above the chart */\n title: string\n /** Data series (multiple allowed for line/bar/area, single for pie/donut) */\n series: ChartSeries[]\n /** X-axis category labels or segment labels for pie/donut */\n labels?: string[]\n /** Hex color codes for series (e.g., '#4CAF50') */\n colors?: string[]\n /** Chart height in pixels */\n height?: number\n}\n\n/**\n * A single data series in a chart\n */\nexport interface ChartSeries {\n /** Display name for this series */\n name: string\n /** Numeric data values */\n data: number[]\n}\n\nexport interface Artifact {\n type: 'excel' | 'pdf'\n filename: string\n url: string\n sizeReadable?: string\n rowCount?: number\n description?: string\n}\n\n// ============================================================================\n// HITL (Human-in-the-Loop) Question Types\n// ============================================================================\n\nexport interface PendingQuestion {\n id: string\n turnId: string\n questions: Question[]\n status: 'PENDING' | 'ANSWERED' | 'CANCELLED'\n}\n\nexport interface Question {\n id: string\n text: string\n type: 'SINGLE_CHOICE' | 'MULTIPLE_CHOICE'\n options?: QuestionOption[]\n required?: boolean\n}\n\nexport interface QuestionOption {\n id: string\n label: string\n value: string\n}\n\n/**\n * Answer data for a single question, including predefined options and custom \"Other\" text.\n */\nexport interface QuestionAnswerData {\n /** Selected predefined options (labels) */\n options: string[]\n /** Custom text entered when user selects \"Other\" option */\n customText?: string\n}\n\n/**\n * Map of question IDs to answer data.\n * Supports both multi-select options and custom \"Other\" text input.\n */\nexport interface QuestionAnswers {\n [questionId: string]: QuestionAnswerData\n}\n\nexport interface StreamChunk {\n type: 'chunk' | 'error' | 'done' | 'user_message'\n content?: string\n error?: string\n sessionId?: string\n}\n\n// ============================================================================\n// Data Source Interface\n// ============================================================================\n\nexport interface ChatDataSource {\n createSession(): Promise<Session>\n fetchSession(id: string): Promise<{\n session: Session\n turns: ConversationTurn[]\n pendingQuestion?: PendingQuestion | null\n } | null>\n sendMessage(\n sessionId: string,\n content: string,\n attachments?: Attachment[],\n signal?: AbortSignal\n ): AsyncGenerator<StreamChunk>\n submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<{ success: boolean; error?: string }>\n cancelPendingQuestion(questionId: string): Promise<{ success: boolean; error?: string }>\n navigateToSession?(sessionId: string): void\n}\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\nexport interface ChatSessionContextValue {\n // State\n message: string\n turns: ConversationTurn[]\n loading: boolean\n error: string | null\n currentSessionId?: string\n pendingQuestion: PendingQuestion | null\n session: Session | null\n fetching: boolean\n streamingContent: string\n isStreaming: boolean\n messageQueue: QueuedMessage[]\n codeOutputs: CodeOutput[]\n\n // Setters\n setMessage: (message: string) => void\n setError: (error: string | null) => void\n setCodeOutputs: (outputs: CodeOutput[]) => void\n\n // Handlers\n handleSubmit: (e: React.FormEvent, attachments?: ImageAttachment[]) => void\n handleRegenerate?: (turnId: string) => Promise<void>\n handleEdit?: (turnId: string, newContent: string) => Promise<void>\n handleCopy: (text: string) => Promise<void>\n handleSubmitQuestionAnswers: (answers: QuestionAnswers) => void\n handleCancelPendingQuestion: () => Promise<void>\n handleRetry?: () => Promise<void>\n handleUnqueue: () => { content: string; attachments: ImageAttachment[] } | null\n sendMessage: (content: string, attachments?: Attachment[]) => Promise<void>\n cancel: () => void\n}\n\n// Translations\nexport type Translations = Record<string, string>\n\n// Branding\nexport interface ExamplePrompt {\n category: string\n text: string\n icon: string\n}\n\nexport interface BrandingConfig {\n appName: string\n logoUrl?: string\n theme?: {\n primary?: string\n secondary?: string\n accent?: string\n }\n welcome?: {\n title?: string\n description?: string\n examplePrompts?: ExamplePrompt[]\n }\n colors?: {\n primary?: string\n secondary?: string\n accent?: string\n }\n logo?: {\n src?: string\n alt?: string\n }\n}\n"]}
|