@iota-uz/sdk 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../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"]}
1
+ {"version":3,"sources":["../../ui/src/bichat/context/IotaContext.tsx","../../ui/src/bichat/locales/defaults.ts","../../ui/src/bichat/hooks/useTranslation.ts","../../ui/src/bichat/components/ChartCard.tsx","../../ui/src/bichat/utils/citationProcessor.ts","../../ui/src/bichat/utils/chartSpec.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/types/index.ts","../../ui/src/bichat/utils/RateLimiter.ts","../../ui/src/bichat/utils/debugTrace.ts","../../ui/src/bichat/utils/queueStorage.ts","../../ui/src/bichat/context/ChatContext.tsx","../../ui/src/bichat/components/ChatHeader.tsx","../../ui/src/bichat/hooks/useBranding.ts","../../ui/src/bichat/utils/fileUtils.ts","../../ui/src/bichat/components/AttachmentGrid.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/AssistantMessage.tsx","../../ui/src/bichat/components/SourcesPanel.tsx","../../ui/src/bichat/components/DownloadCard.tsx","../../ui/src/bichat/components/InlineQuestionForm.tsx","../../ui/src/bichat/utils/debugMetrics.ts","../../ui/src/bichat/components/DebugPanel.tsx","../../ui/src/bichat/components/SystemMessage.tsx","../../ui/src/bichat/components/AssistantTurnView.tsx","../../ui/src/bichat/components/TurnBubble.tsx","../../ui/src/bichat/animations/variants.ts","../../ui/src/bichat/components/TypingIndicator.tsx","../../ui/src/bichat/components/ScrollToBottomButton.tsx","../../ui/src/bichat/components/CompactionDoodle.tsx","../../ui/src/bichat/components/MessageList.tsx","../../ui/src/bichat/utils/markdownStream.ts","../../ui/src/bichat/components/MessageInput.tsx","../../ui/src/bichat/components/WelcomeContent.tsx","../../ui/src/bichat/components/ChatSession.tsx","../../ui/src/bichat/components/SessionArtifactsPanel.tsx","../../ui/src/bichat/components/SessionArtifactList.tsx","../../ui/src/bichat/components/SessionArtifactPreviewModal.tsx","../../ui/src/bichat/components/SessionArtifactPreview.tsx","../../ui/src/bichat/index.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/LoadingSpinner.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/SessionSkeleton.tsx","../../ui/src/bichat/hooks/useLongPress.ts","../../ui/src/bichat/components/TouchContextMenu.tsx","../../ui/src/bichat/components/SessionItem.tsx","../../ui/src/bichat/components/DateGroupHeader.tsx","../../ui/src/bichat/components/TabBar.tsx","../../ui/src/bichat/components/UserFilter.tsx","../../ui/src/bichat/components/AllChatsList.tsx","../../ui/src/bichat/components/Sidebar.tsx","../../ui/src/bichat/hooks/useToast.ts","../../ui/src/bichat/utils/sessionGrouping.ts","../../ui/src/bichat/components/ArchivedChatList.tsx","../../ui/src/bichat/components/Alert.tsx","../../ui/src/bichat/components/ArchiveBanner.tsx","../../ui/src/bichat/components/RetryActionArea.tsx","../../ui/src/bichat/components/StreamError.tsx","../../ui/src/bichat/components/MessageActions.tsx","../../ui/src/bichat/components/AttachmentPreview.tsx","../../ui/src/bichat/components/AttachmentUpload.tsx","../../ui/src/bichat/components/ScreenReaderAnnouncer.tsx","../../ui/src/bichat/components/SkipLink.tsx","../../ui/src/bichat/components/QuestionForm.tsx","../../ui/src/bichat/components/QuestionStep.tsx","../../ui/src/bichat/components/ConfirmationStep.tsx","../../ui/src/bichat/utils/questionFormUtils.ts","../../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/useModalLock.ts","../../ui/src/bichat/hooks/useFocusTrap.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/hooks/useScrollToBottom.ts","../../ui/src/bichat/hooks/useKeyboardShortcuts.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/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/bichat/data/HttpDataSource.ts","../../ui/src/bichat/utils/sseParser.ts","../../ui/src/bichat/utils/dateFormatting.ts"],"names":["key","useState","jsx","jsxs","Fragment","TableExportButton","FileXls","memo","TableWithExport","useCallback","useRef","useEffect","Check","Copy","SyntaxHighlighter","useMemo","CodeBlock","MessageRole","createContext","curSessionId","useContext","ImageIcon","X","DownloadSimple","isMultiSelect","MarkdownRenderer","lazy","COPY_FEEDBACK_MS","defaultClassNames","mergeClassNames","formatDistanceToNow","Suspense","CaretDown","prefersReducedMotion","AnimatePresence","motion","ArrowDown","Bug","ArrowUp","Stack","ChartBar","FileText","FileCsv","isImageArtifact","Dialog","DialogBackdrop","DialogPanel","PencilSimple","Paperclip","useReducedMotion","sizeClasses","forwardRef","useImperativeHandle","CircleNotch","gapClasses","CheckCircle","XCircle","WarningCircle","hasPermission","ArrowClockwise","ArrowsClockwise","Trash","Menu","MenuButton","MenuItems","MenuItem","Archive","sessions","Sidebar","ArrowLeft","Warning","Info","RetryActionArea","isValidElement","Children","focusableElements","generateId","fileArray","removed","differenceInDays"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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 'welcome.quickStart': 'Quick Start',\n 'welcome.disclaimer': 'BiChat is powered by AI. Mistakes are possible.',\n\n // Chat header\n 'chat.newChat': 'New Chat',\n 'chat.archived': 'Archived',\n 'chat.readOnly': 'Read-only',\n 'chat.pinned': 'Pinned',\n 'chat.goBack': 'Go back',\n\n // Artifacts panel\n 'artifacts.title': 'Artifacts',\n 'artifacts.loading': 'Loading artifacts...',\n 'artifacts.empty': 'No artifacts yet',\n 'artifacts.back': 'Back',\n 'artifacts.refresh': 'Refresh',\n 'artifacts.loadMore': 'Load more',\n 'artifacts.loadingMore': 'Loading more...',\n 'artifacts.toggleShow': 'Show artifacts',\n 'artifacts.toggleHide': 'Hide artifacts',\n 'artifacts.resize': 'Resize panel',\n 'artifacts.failedToLoad': 'Failed to load artifacts',\n 'artifacts.unsupported': 'Artifacts panel is not available for this data source.',\n 'artifacts.download': 'Download',\n 'artifacts.openInNewTab': 'Open in new tab',\n 'artifacts.downloadUnavailable': 'Download URL is not available for this artifact.',\n 'artifacts.imageUnavailable': 'Image URL is not available for this artifact.',\n 'artifacts.chartUnavailable': 'Chart metadata is not in a renderable format.',\n 'artifacts.previewLoading': 'Loading preview...',\n 'artifacts.previewUnavailable': 'Preview is unavailable for this artifact.',\n 'artifacts.previewNotSupported': 'This file type cannot be previewed inline.',\n 'artifacts.officePreviewUnavailable': 'Office preview is unavailable. Open or download the file.',\n 'artifacts.textPreviewFailed': 'Failed to load text preview.',\n 'artifacts.textPreviewTruncated': 'Preview is truncated. Open the file to view full content.',\n 'artifacts.rename': 'Rename artifact',\n 'artifacts.renameFailed': 'Failed to rename artifact',\n 'artifacts.delete': 'Delete artifact',\n 'artifacts.deleteConfirm': 'Delete this uploaded artifact? This action cannot be undone.',\n 'artifacts.deleteFailed': 'Failed to delete artifact',\n 'artifacts.metadata': 'Metadata',\n 'artifacts.typeLabel': 'Type',\n 'artifacts.mimeTypeLabel': 'MIME type',\n 'artifacts.sizeLabel': 'Size',\n 'artifacts.createdLabel': 'Created',\n 'artifacts.emptySubtitle': 'Artifacts will appear here as you chat',\n 'artifacts.groupCharts': 'Charts',\n 'artifacts.groupCodeOutputs': 'Code Outputs',\n 'artifacts.groupExports': 'Exports',\n 'artifacts.groupAttachments': 'Attachments',\n 'artifacts.groupOther': 'Other',\n\n // Message input\n 'input.placeholder': 'Type a message...',\n 'input.attachFiles': 'Attach files',\n 'input.attachImages': 'Attach files',\n 'input.dropImages': 'Drop files here',\n 'input.dropFiles': 'Drop files 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.filesAdded': 'Files added successfully',\n 'input.dismissError': 'Dismiss error',\n 'input.shiftEnterHint': 'Shift + Enter for new line',\n 'input.fileInput': 'File input',\n 'input.messageInput': 'Message input',\n 'slash.commandsList': 'Slash commands',\n 'slash.clearDescription': 'Clear current chat history in place',\n 'slash.debugDescription': 'Toggle developer debug mode for this session',\n 'slash.compactDescription': 'Compact history into a concise summary',\n 'slash.noMatches': 'No matching slash command',\n 'slash.debugBadge': 'Debug mode ON',\n 'slash.compactingTitle': 'Compacting history',\n 'slash.compactingSubtitle': 'Summarizing previous turns and pruning tool traces...',\n 'slash.compactedSummaryLabel': 'Compacted Summary',\n 'slash.debugPanelTitle': 'Debug Trace',\n 'slash.debugGeneration': 'Generation time',\n 'slash.debugTokensPerSecond': 'Tokens/sec',\n 'slash.debugUnavailable': 'No persisted debug trace is available for this turn.',\n 'slash.debugContextUsage': 'Current context usage',\n 'slash.debugContextWindow': 'Model context window',\n 'slash.debugPolicyMaxContextWindow': 'Policy Max',\n 'slash.debugModelMaxContextWindow': 'Model Max',\n 'slash.debugEffectiveContextWindow': 'Effective Max',\n 'slash.debugSessionUsageUnavailable': 'Session usage will appear after the first debug response.',\n 'slash.debugCopyTrace': 'Copy trace',\n 'slash.debugCopied': 'Copied!',\n 'slash.debugToolCalls': 'Tool calls',\n 'slash.debugArguments': 'Arguments',\n 'slash.debugResult': 'Result',\n 'slash.debugCachedTokens': 'Cached',\n 'slash.debugPromptTokens': 'Prompt',\n 'slash.debugCompletionTokens': 'Completion',\n 'slash.debugTotalTokens': 'Total',\n 'slash.debugError': 'Error',\n 'slash.error.noArguments': 'This slash command does not accept arguments yet.',\n 'slash.error.sessionRequired': 'Create or open a chat session before using this command.',\n 'slash.error.debugUnauthorized': 'You do not have permission to enable debug mode.',\n 'slash.error.unknownCommand': 'Unknown slash command.',\n 'slash.error.noAttachments': 'Slash commands cannot be used with attachments.',\n 'slash.error.clearFailed': 'Failed to clear session history.',\n 'slash.error.compactFailed': 'Failed to compact session history.',\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 'assistant.explanation': 'How I arrived at this',\n\n // System message\n 'system.conversationSummary': 'Conversation summary',\n 'system.loadingSummary': 'Loading summary...',\n 'system.showMore': 'Show more',\n 'system.showLess': 'Show less',\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.downloadPNG': 'Download PNG',\n 'chart.exporting': 'Exporting...',\n 'chart.fullscreen': 'View fullscreen',\n 'chart.noData': 'No data available for chart visualization.',\n\n // Example prompt categories\n 'category.analysis': 'Data Analysis',\n 'category.reports': 'Reports',\n 'category.insights': 'Insights',\n\n // Sidebar\n 'sidebar.chatSessions': 'Chat Sessions',\n 'sidebar.closeSidebar': 'Close sidebar',\n 'sidebar.searchChats': 'Search chats...',\n 'sidebar.createNewChat': 'Create new chat',\n 'sidebar.archivedChats': 'Archived Chats',\n 'sidebar.pinnedChats': 'Pinned Chats',\n 'sidebar.chatOptions': 'Chat options',\n 'sidebar.myChats': 'My Chats',\n 'sidebar.allChats': 'All Chats',\n 'sidebar.chatViewSelector': 'Chat view selector',\n 'sidebar.pinChat': 'Pin chat',\n 'sidebar.unpinChat': 'Unpin chat',\n 'sidebar.pin': 'Pin',\n 'sidebar.unpin': 'Unpin',\n 'sidebar.renameChat': 'Rename chat',\n 'sidebar.archiveChat': 'Archive chat',\n 'sidebar.deleteChat': 'Delete chat',\n 'sidebar.regenerateTitle': 'Regenerate title',\n 'sidebar.noChatsFound': 'No chats found for \"{query}\"',\n 'sidebar.noChatsYet': 'No chats yet',\n 'sidebar.createOneToGetStarted': 'Create one to get started',\n 'sidebar.failedToLoadSessions': 'Failed to load sessions',\n 'sidebar.chatRenamedSuccessfully': 'Chat renamed successfully',\n 'sidebar.failedToRenameChat': 'Failed to rename chat',\n 'sidebar.titleRegenerated': 'Title regenerated',\n 'sidebar.failedToRegenerateTitle': 'Failed to regenerate title',\n 'sidebar.chatPinned': 'Chat pinned',\n 'sidebar.chatUnpinned': 'Chat unpinned',\n 'sidebar.failedToTogglePin': 'Failed to toggle pin',\n 'sidebar.archiveChatSession': 'Archive Chat Session',\n 'sidebar.archiveChatMessage':\n 'Are you sure you want to archive this chat? You can restore it later from Archived Chats.',\n 'sidebar.archiveButton': 'Archive',\n 'sidebar.deleteChatSession': 'Delete Chat Session',\n 'sidebar.deleteChatMessage': 'Are you sure you want to delete this chat? This action cannot be undone.',\n 'sidebar.deleteButton': 'Delete',\n 'sidebar.chatArchived': 'Chat archived',\n 'sidebar.failedToArchiveChat': 'Failed to archive chat',\n 'sidebar.chatDeleted': 'Chat deleted',\n 'sidebar.failedToDeleteChat': 'Failed to delete chat',\n\n // Archived chats\n 'archived.title': 'Archived Chats',\n 'archived.backToChats': 'Back to chats',\n 'archived.searchArchivedChats': 'Search archived chats...',\n 'archived.noArchivedChats': 'No archived chats',\n 'archived.noArchivedChatsDescription': 'Archived chats will appear here',\n 'archived.noResults': 'No results found',\n 'archived.noResultsDescription': 'No chats match \"{query}\"',\n 'archived.restoreChat': 'Restore Chat',\n 'archived.restoreChatMessage': 'Are you sure you want to restore this chat?',\n 'archived.restoreButton': 'Restore',\n 'archived.chatRestoredSuccessfully': 'Chat restored successfully',\n 'archived.failedToRestoreChat': 'Failed to restore chat',\n\n // All chats (organization-wide)\n 'allChats.includeArchived': 'Include archived',\n 'allChats.chatFound': '{count} chat found',\n 'allChats.chatsFound': '{count} chats found',\n 'allChats.organizationChats': 'Organization chats',\n 'allChats.loadMore': 'Load more',\n 'allChats.noChatsFound': 'No chats found',\n 'allChats.noChatsFromUser': 'No chats from {firstName} {lastName}',\n 'allChats.noChatsInOrg': 'No chats in organization',\n 'allChats.noActiveChatsInOrg': 'No active chats in organization',\n 'allChats.failedToLoad': 'Failed to load chats',\n 'allChats.allUsers': 'All users',\n 'allChats.loadingUsers': 'Loading users...',\n\n // Alert component\n 'alert.retry': 'Retry',\n 'alert.dismiss': 'Dismiss',\n\n // Retry / stream errors\n 'retry.title': 'No response received',\n 'retry.description': 'The assistant did not respond. Try sending again.',\n 'retry.button': 'Retry',\n 'streamError.retry': 'Retry',\n 'streamError.regenerate': 'Regenerate',\n\n // Attachment upload\n 'attachment.selectFiles': 'Select files',\n 'attachment.uploading': 'Uploading...',\n 'attachment.maxReached': 'Maximum {max} attachments',\n 'attachment.fileAdded': '{count} file(s) added',\n 'attachment.invalidFile': 'Invalid file: {filename}',\n\n // Question form wizard\n 'questionForm.title': 'Questions',\n 'questionForm.step': 'Step {current} of {total}',\n 'questionForm.back': 'Back',\n 'questionForm.next': 'Next',\n 'questionForm.confirm': 'Confirm & Submit',\n 'questionForm.submitting': 'Submitting...',\n 'questionForm.reviewTitle': 'Review Your Answers',\n 'questionForm.reviewDescription': 'Please review your answers before submitting.',\n 'questionForm.skip': 'Skip',\n\n // Date grouping\n 'dateGroup.today': 'Today',\n 'dateGroup.yesterday': 'Yesterday',\n 'dateGroup.last7Days': 'Last 7 days',\n 'dateGroup.last30Days': 'Last 30 days',\n 'dateGroup.older': 'Older',\n\n // Relative time\n 'relativeTime.justNow': 'Just now',\n 'relativeTime.minutesAgo': '{count}m ago',\n 'relativeTime.hoursAgo': '{count}h ago',\n 'relativeTime.daysAgo': '{count}d ago',\n\n // Common\n 'common.pinned': 'Pinned',\n 'common.back': 'Back',\n 'common.clear': 'Clear',\n 'common.generating': 'Generating...',\n 'common.dismiss': 'Dismiss',\n 'common.close': 'Close',\n 'common.loading': 'Loading...',\n 'common.cancel': 'Cancel',\n 'common.untitled': 'Untitled',\n 'common.skipToContent': 'Skip to content',\n\n // Skip link\n 'skipLink.label': 'Skip to content',\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 * 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 { DownloadSimple } from '@phosphor-icons/react'\nimport type { ChartData } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface ChartCardProps {\n chartData: ChartData\n}\n\n// Default color palette if none provided\nconst DEFAULT_COLORS = ['#6366f1', '#06b6d4', '#f59e0b', '#ef4444', '#8b5cf6']\n\n/**\n * ChartCard renders a single chart visualization with optional PNG export.\n */\nexport function ChartCard({ chartData }: ChartCardProps) {\n const { t } = useTranslation()\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 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=\"rounded-xl border border-gray-200/80 bg-white p-4 shadow-sm dark:border-gray-700/60 dark:bg-gray-800\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {title && <span className=\"font-medium\">{title}: </span>}\n {t('chart.noData')}\n </p>\n </div>\n )\n }\n\n const apexSeries =\n chartType === 'pie' || chartType === 'donut'\n ? series[0]?.data ?? []\n : series.map((s) => ({ name: s.name, data: s.data }))\n\n const xaxisConfig =\n chartType !== 'pie' && chartType !== 'donut'\n ? { categories: (labels ?? []).filter((l): l is string => l !== null) }\n : {}\n\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 fontFamily: 'inherit',\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 grid: {\n borderColor: 'rgba(148, 163, 184, 0.15)',\n strokeDashArray: 3,\n },\n }\n\n const handleExportPNG = async () => {\n setIsExporting(true)\n\n try {\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 if (!('imgURI' in result)) {\n console.error('Unexpected dataURI result format')\n return\n }\n\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 return (\n <div className=\"group/chart rounded-xl border border-gray-200/80 bg-white p-4 shadow-sm transition-shadow duration-200 hover:shadow dark:border-gray-700/60 dark:bg-gray-800\">\n <div className=\"w-full min-w-0\">\n <ReactApexChart\n options={options}\n series={apexSeries}\n type={chartType}\n width=\"100%\"\n height={height}\n />\n </div>\n <div className=\"flex justify-end pt-2\">\n <button\n type=\"button\"\n onClick={handleExportPNG}\n disabled={isExporting}\n className=\"inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-gray-400 opacity-0 transition-all duration-150 hover:bg-gray-100 hover:text-gray-600 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 group-hover/chart:opacity-100 disabled:opacity-50 dark:text-gray-500 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n title={t('chart.download')}\n >\n {isExporting ? (\n <span className=\"text-gray-500 dark:text-gray-400\">{t('chart.exporting')}</span>\n ) : (\n <>\n <DownloadSimple className=\"h-3.5 w-3.5\" weight=\"bold\" />\n <span>{t('chart.downloadPNG')}</span>\n </>\n )}\n </button>\n </div>\n </div>\n )\n}\n","/**\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 * Shared chart spec parsing for draw_chart tool output and artifact metadata.\n * Used by SessionArtifactPreview, HttpDataSource (turn.chartData), and MarkdownRenderer (code blocks).\n */\n\nimport type { ChartData, ChartSeries } from '../types'\n\nexport const SUPPORTED_CHART_TYPES = new Set<ChartData['chartType']>([\n 'line',\n 'bar',\n 'area',\n 'pie',\n 'donut',\n])\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction toChartSeries(value: unknown): ChartSeries[] | null {\n if (!Array.isArray(value) || value.length === 0) {\n return null\n }\n\n const result: ChartSeries[] = []\n for (const item of value) {\n if (!isRecord(item) || typeof item.name !== 'string' || !Array.isArray(item.data)) {\n return null\n }\n\n const data: number[] = []\n for (const point of item.data) {\n if (typeof point !== 'number' || !Number.isFinite(point)) {\n return null\n }\n data.push(point)\n }\n\n result.push({\n name: item.name,\n data,\n })\n }\n\n return result.length > 0 ? result : null\n}\n\n/**\n * Parses a chart spec object (e.g. from artifact.metadata.spec or draw_chart tool output) into ChartData.\n */\nexport function parseChartDataFromSpec(\n spec: Record<string, unknown>,\n fallbackTitle = 'Chart'\n): ChartData | null {\n const chartTypeRaw = spec.chartType\n const titleRaw = spec.title\n const seriesRaw = spec.series\n\n if (\n typeof chartTypeRaw !== 'string' ||\n !SUPPORTED_CHART_TYPES.has(chartTypeRaw as ChartData['chartType'])\n ) {\n return null\n }\n\n const series = toChartSeries(seriesRaw)\n if (!series) {\n return null\n }\n\n const labels = Array.isArray(spec.labels)\n ? spec.labels.filter((label): label is string => typeof label === 'string')\n : undefined\n\n const colors = Array.isArray(spec.colors)\n ? spec.colors.filter((color): color is string => typeof color === 'string')\n : undefined\n\n const height =\n typeof spec.height === 'number' && Number.isFinite(spec.height) ? spec.height : undefined\n\n return {\n chartType: chartTypeRaw as ChartData['chartType'],\n title: typeof titleRaw === 'string' && titleRaw.trim() ? titleRaw : fallbackTitle,\n series,\n labels,\n colors,\n height,\n }\n}\n\n/**\n * Parses a JSON string as a chart spec (e.g. from a ```chart or ```json code block).\n */\nexport function parseChartDataFromJsonString(\n json: string,\n fallbackTitle = 'Chart'\n): ChartData | null {\n const trimmed = json.trim()\n if (!trimmed) return null\n\n let spec: unknown\n try {\n spec = JSON.parse(trimmed)\n } catch {\n return null\n }\n\n if (!isRecord(spec)) return null\n return parseChartDataFromSpec(spec, fallbackTitle)\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=\"cursor-pointer inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-green-700 dark:text-green-400 hover:text-green-800 dark:hover:text-green-300 disabled:text-gray-400 disabled:cursor-not-allowed transition-colors rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\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 [copyFailed, setCopyFailed] = useState(false)\n const [isDarkMode, setIsDarkMode] = useState(getInitialDarkMode)\n const [isLoaded, setIsLoaded] = useState(false)\n const copyTimeoutRef = useRef<number | null>(null)\n const copyFailedTimeoutRef = 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 via class attribute\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 // Also listen for system prefers-color-scheme changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handleMediaChange = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'))\n }\n mediaQuery.addEventListener('change', handleMediaChange)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', handleMediaChange)\n }\n }, [])\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n if (copyTimeoutRef.current !== null) {\n clearTimeout(copyTimeoutRef.current)\n }\n if (copyFailedTimeoutRef.current !== null) {\n clearTimeout(copyFailedTimeoutRef.current)\n }\n }\n }, [])\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value)\n setCopied(true)\n setCopyFailed(false)\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 setCopyFailed(true)\n if (copyFailedTimeoutRef.current !== null) {\n clearTimeout(copyFailedTimeoutRef.current)\n }\n copyFailedTimeoutRef.current = window.setTimeout(() => {\n setCopyFailed(false)\n copyFailedTimeoutRef.current = null\n }, 2000)\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-gray-800 dark:text-gray-200 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-100 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 transition-colors flex items-center gap-1.5 ${\n copyFailed\n ? 'text-red-500 dark:text-red-400'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white'\n }`}\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>{copyFailed ? 'Failed' : 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, Children, isValidElement, type ReactNode } from 'react'\nimport ReactMarkdown, { Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport { processCitations } from '../utils/citationProcessor'\nimport { parseChartDataFromJsonString } from '../utils/chartSpec'\nimport type { Citation } from '../types'\nimport { TableWithExport } from './TableWithExport'\nimport { ChartCard } from './ChartCard'\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 node?: {\n position?: {\n start?: { line?: number }\n end?: { line?: number }\n }\n }\n}\n\nconst INLINE_TAGS = new Set([\n 'a',\n 'abbr',\n 'b',\n 'br',\n 'code',\n 'em',\n 'i',\n 'img',\n 'kbd',\n 'mark',\n 's',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'u',\n])\n\nfunction hasBlockChildren(children: ReactNode): boolean {\n return Children.toArray(children).some((child) => {\n if (!isValidElement(child)) {\n return false\n }\n\n if (typeof child.type === 'string') {\n if (!INLINE_TAGS.has(child.type)) {\n return true\n }\n\n return hasBlockChildren((child.props as { children?: ReactNode }).children)\n }\n\n // Non-DOM React components can render block nodes (e.g. lazy CodeBlock).\n return true\n })\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, node }: CodeProps) {\n const match = /language-(\\w+)/.exec(className || '')\n const language = match ? match[1] : ''\n const value = String(children).replace(/\\n$/, '')\n\n // Some react-markdown versions may omit `inline`.\n // In that case, infer inline code conservatively from content shape.\n const hasLineBreak = value.includes('\\n')\n const startLine = node?.position?.start?.line\n const endLine = node?.position?.end?.line\n const spansSingleLine = startLine !== undefined && endLine !== undefined && startLine === endLine\n const inferredInline = !className && !hasLineBreak && (spansSingleLine || startLine === undefined || endLine === undefined)\n const isInline = inline === true || (inline !== false && inferredInline)\n\n if (isInline) {\n return (\n <code className=\"px-1.5 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 rounded text-sm font-mono\">\n {value}\n </code>\n )\n }\n\n const lang = language.toLowerCase()\n const chartData =\n lang === 'chart'\n ? parseChartDataFromJsonString(value, 'Chart')\n : lang === 'json' && value.includes('\"chartType\"')\n ? parseChartDataFromJsonString(value, 'Chart')\n : null\n\n if (chartData) {\n return (\n <div className=\"my-4\">\n <ChartCard chartData={chartData} />\n </div>\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 }) => {\n if (hasBlockChildren(children)) {\n return <div className=\"markdown-p my-2\">{children}</div>\n }\n\n return <p className=\"markdown-p my-2\">{children}</p>\n },\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"markdown-link text-[var(--bichat-color-accent)] underline decoration-[var(--bichat-color-accent)] decoration-from-font hover:text-[var(--bichat-color-accent-hover)] hover:decoration-[var(--bichat-color-accent-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--bichat-color-accent)] focus-visible:ring-offset-2 rounded\"\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 * 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 role?: MessageRole\n content: string\n explanation?: string\n citations: Citation[]\n toolCalls?: ToolCall[]\n chartData?: ChartData\n artifacts: Artifact[]\n codeOutputs: CodeOutput[]\n debug?: DebugTrace\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 result?: string\n error?: string\n durationMs?: number\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 url?: string\n preview?: string\n}\n\n// Image attachment with preview for MessageInput\nexport type ImageAttachment = Attachment & {\n base64Data: string\n preview: string\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: Attachment[]\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\nexport interface SessionArtifact {\n id: string\n sessionId: string\n messageId?: string\n type: string\n name: string\n description?: string\n mimeType?: string\n url?: string\n sizeBytes: number\n metadata?: Record<string, unknown>\n createdAt: 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' | 'content' | 'tool_start' | 'tool_end' | 'usage' | 'done' | 'error' | 'user_message' | 'interrupt'\n content?: string\n error?: string\n sessionId?: string\n usage?: DebugUsage\n tool?: StreamToolPayload\n interrupt?: StreamInterruptPayload\n generationMs?: number\n timestamp?: number\n}\n\nexport interface StreamInterruptPayload {\n checkpointId: string\n agentName?: string\n questions: StreamInterruptQuestion[]\n}\n\nexport interface StreamInterruptQuestion {\n id: string\n text: string\n type: string\n options: Array<{ id: string; label: string }>\n}\n\nexport interface DebugUsage {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n cachedTokens?: number\n cost?: number\n}\n\nexport interface StreamToolPayload {\n callId?: string\n name: string\n arguments?: string\n result?: string\n error?: string\n durationMs?: number\n}\n\nexport interface DebugTrace {\n generationMs?: number\n usage?: DebugUsage\n tools: StreamToolPayload[]\n}\n\nexport interface DebugLimits {\n policyMaxTokens: number\n modelMaxTokens: number\n effectiveMaxTokens: number\n completionReserveTokens: number\n}\n\nexport interface SessionDebugUsage {\n promptTokens: number\n completionTokens: number\n totalTokens: number\n turnsWithUsage: number\n latestPromptTokens: number\n latestCompletionTokens: number\n latestTotalTokens: number\n}\n\nexport interface SendMessageOptions {\n debugMode?: boolean\n replaceFromMessageID?: string\n}\n\n// ============================================================================\n// Data Source Interface\n// ============================================================================\n\nexport interface SessionListResult {\n sessions: Session[]\n total: number\n hasMore: boolean\n}\n\nexport interface SessionUser {\n id: string\n firstName: string\n lastName: string\n initials: string\n}\n\nexport interface SessionGroup {\n name: string\n sessions: Session[]\n}\n\nexport interface ChatDataSource {\n // Core operations\n createSession(): Promise<Session>\n fetchSession(id: string): Promise<{\n session: Session\n turns: ConversationTurn[]\n pendingQuestion?: PendingQuestion | null\n } | null>\n fetchSessionArtifacts?(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }>\n uploadSessionArtifacts?(\n sessionId: string,\n files: File[]\n ): Promise<{ artifacts: SessionArtifact[] }>\n renameSessionArtifact?(\n artifactId: string,\n name: string,\n description?: string\n ): Promise<SessionArtifact>\n deleteSessionArtifact?(artifactId: string): Promise<void>\n sendMessage(\n sessionId: string,\n content: string,\n attachments?: Attachment[],\n signal?: AbortSignal,\n options?: SendMessageOptions\n ): AsyncGenerator<StreamChunk>\n clearSessionHistory(sessionId: string): Promise<{\n success: boolean\n deletedMessages: number\n deletedArtifacts: number\n }>\n compactSessionHistory(sessionId: string): Promise<{\n success: boolean\n summary: string\n deletedMessages: number\n deletedArtifacts: number\n }>\n submitQuestionAnswers(\n sessionId: string,\n questionId: string,\n answers: QuestionAnswers\n ): Promise<{ success: boolean; error?: string }>\n rejectPendingQuestion(sessionId: string): Promise<{ success: boolean; error?: string }>\n navigateToSession?(sessionId: string): void\n\n // Session management\n listSessions(options?: {\n limit?: number\n offset?: number\n includeArchived?: boolean\n }): Promise<SessionListResult>\n archiveSession(sessionId: string): Promise<Session>\n unarchiveSession(sessionId: string): Promise<Session>\n pinSession(sessionId: string): Promise<Session>\n unpinSession(sessionId: string): Promise<Session>\n deleteSession(sessionId: string): Promise<void>\n renameSession(sessionId: string, title: string): Promise<Session>\n regenerateSessionTitle(sessionId: string): Promise<Session>\n\n // Organization-wide features (optional)\n listUsers?(): Promise<SessionUser[]>\n listAllSessions?(options?: {\n limit?: number\n offset?: number\n includeArchived?: boolean\n userId?: string | null\n }): Promise<{\n sessions: Array<Session & { owner: SessionUser }>\n total: number\n hasMore: boolean\n }>\n}\n\n// ============================================================================\n// Context Value Types\n// ============================================================================\n\n// ============================================================================\n// Split Context Value Types\n// ============================================================================\n\nexport interface ChatSessionStateValue {\n session: Session | null\n currentSessionId?: string\n fetching: boolean\n error: string | null\n debugMode: boolean\n sessionDebugUsage: SessionDebugUsage\n debugLimits: DebugLimits | null\n setError: (error: string | null) => void\n}\n\nexport interface ChatMessagingStateValue {\n turns: ConversationTurn[]\n streamingContent: string\n isStreaming: boolean\n loading: boolean\n pendingQuestion: PendingQuestion | null\n codeOutputs: CodeOutput[]\n isCompacting: boolean\n compactionSummary: string | null\n /** Bumped when artifacts should be refetched (e.g. tool_end for artifact-producing tools). */\n artifactsInvalidationTrigger: number\n sendMessage: (content: string, attachments?: Attachment[]) => Promise<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 handleRejectPendingQuestion: () => Promise<void>\n cancel: () => void\n setCodeOutputs: (outputs: CodeOutput[]) => void\n}\n\nexport interface ChatInputStateValue {\n message: string\n inputError: string | null\n messageQueue: QueuedMessage[]\n setMessage: (message: string) => void\n setInputError: (error: string | null) => void\n handleSubmit: (e: React.FormEvent, attachments?: Attachment[]) => void\n handleUnqueue: () => { content: string; attachments: Attachment[] } | null\n}\n\n// ============================================================================\n// Combined Context Value (backwards compatible)\n// ============================================================================\n\nexport interface ChatSessionContextValue\n extends ChatSessionStateValue, ChatMessagingStateValue, ChatInputStateValue {\n handleRetry?: () => Promise<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","import type { ConversationTurn, DebugTrace, SessionDebugUsage } from '../types'\n\nexport function hasMeaningfulUsage(trace?: DebugTrace['usage']): boolean {\n if (!trace) return false\n return (\n trace.promptTokens > 0 ||\n trace.completionTokens > 0 ||\n trace.totalTokens > 0 ||\n (trace.cachedTokens ?? 0) > 0 ||\n (trace.cost ?? 0) > 0\n )\n}\n\nexport function hasDebugTrace(trace: DebugTrace): boolean {\n return trace.tools.length > 0 || hasMeaningfulUsage(trace.usage) || !!trace.generationMs\n}\n\nexport function getSessionDebugUsage(turns: ConversationTurn[]): SessionDebugUsage {\n let promptTokens = 0\n let completionTokens = 0\n let totalTokens = 0\n let turnsWithUsage = 0\n let latestPromptTokens = 0\n let latestCompletionTokens = 0\n let latestTotalTokens = 0\n\n for (const turn of turns) {\n const usage = turn.assistantTurn?.debug?.usage\n if (!hasMeaningfulUsage(usage) || !usage) {\n continue\n }\n\n turnsWithUsage++\n promptTokens += usage.promptTokens\n completionTokens += usage.completionTokens\n totalTokens += usage.totalTokens\n latestPromptTokens = usage.promptTokens\n latestCompletionTokens = usage.completionTokens\n latestTotalTokens = usage.totalTokens\n }\n\n return {\n promptTokens,\n completionTokens,\n totalTokens,\n turnsWithUsage,\n latestPromptTokens,\n latestCompletionTokens,\n latestTotalTokens,\n }\n}\n\n","import type { QueuedMessage } from '../types'\n\nconst STORAGE_PREFIX = 'bichat.queue.'\nconst MAX_BYTES = 512 * 1024 // 512KB safety limit for sessionStorage payloads\n\nfunction key(sessionId: string): string {\n return `${STORAGE_PREFIX}${sessionId}`\n}\n\nfunction safeSerialize(queue: QueuedMessage[]): string | null {\n try {\n const json = JSON.stringify(queue)\n if (json.length > MAX_BYTES) return null\n return json\n } catch {\n return null\n }\n}\n\nexport function saveQueue(sessionId: string, queue: QueuedMessage[]) {\n if (typeof window === 'undefined') return\n if (!sessionId || sessionId === 'new') return\n\n try {\n if (!queue || queue.length === 0) {\n window.sessionStorage.removeItem(key(sessionId))\n return\n }\n\n const serialized = safeSerialize(queue)\n if (!serialized) return\n\n window.sessionStorage.setItem(key(sessionId), serialized)\n } catch {\n // ignore storage errors (quota, privacy mode)\n }\n}\n\nexport function loadQueue(sessionId: string): QueuedMessage[] {\n if (typeof window === 'undefined') return []\n if (!sessionId || sessionId === 'new') return []\n\n try {\n const raw = window.sessionStorage.getItem(key(sessionId))\n if (!raw) return []\n\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) return []\n\n // Minimal validation\n return parsed\n .map((item) => {\n const obj = item as any\n return {\n content: typeof obj?.content === 'string' ? obj.content : '',\n attachments: Array.isArray(obj?.attachments) ? obj.attachments : [],\n } satisfies QueuedMessage\n })\n .filter((m) => m.content.trim() !== '' || (m.attachments?.length ?? 0) > 0)\n } catch {\n return []\n }\n}\n\nexport function clearQueue(sessionId: string) {\n if (typeof window === 'undefined') return\n if (!sessionId || sessionId === 'new') return\n try {\n window.sessionStorage.removeItem(key(sessionId))\n } catch {\n // ignore\n }\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 * Split into 3 focused contexts to minimize re-renders:\n * - ChatSessionContext: session lifecycle (session, fetching, error, debug)\n * - ChatMessagingContext: turns + streaming + tool interactions\n * - ChatInputContext: input form state (message, inputError, queue)\n *\n * Cross-context reads use refs (no subscription = no re-render).\n */\n\nimport { createContext, useContext, useState, useCallback, useEffect, ReactNode, useRef, useMemo } from 'react'\nimport {\n MessageRole,\n type ChatDataSource,\n type Session,\n type ConversationTurn,\n type PendingQuestion,\n type QuestionAnswers,\n type Attachment,\n type QueuedMessage,\n type CodeOutput,\n type ChatSessionContextValue,\n type ChatSessionStateValue,\n type ChatMessagingStateValue,\n type ChatInputStateValue,\n type DebugLimits,\n type SendMessageOptions,\n} from '../types'\nimport { RateLimiter } from '../utils/RateLimiter'\nimport {\n getSessionDebugUsage,\n} from '../utils/debugTrace'\nimport { loadQueue, saveQueue } from '../utils/queueStorage'\nimport { hasPermission } from './IotaContext'\n\n// ---------------------------------------------------------------------------\n// Internal contexts\n// ---------------------------------------------------------------------------\n\nconst SessionCtx = createContext<ChatSessionStateValue | null>(null)\nconst MessagingCtx = createContext<ChatMessagingStateValue | null>(null)\nconst InputCtx = createContext<ChatInputStateValue | null>(null)\n\n// ---------------------------------------------------------------------------\n// Helpers (unchanged)\n// ---------------------------------------------------------------------------\n\ninterface ChatSessionProviderProps {\n dataSource: ChatDataSource\n sessionId?: string\n rateLimiter?: RateLimiter\n children: ReactNode\n}\n\nconst DEFAULT_RATE_LIMIT_CONFIG = {\n maxRequests: 20,\n windowMs: 60000,\n}\n\n/** Tool names that produce persisted artifacts; must match server ArtifactHandler. */\nconst ARTIFACT_TOOL_NAMES = new Set([\n 'code_interpreter',\n 'draw_chart',\n 'export_query_to_excel',\n 'export_data_to_excel',\n 'export_to_pdf',\n])\n\nfunction generateTempId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\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 createdAt: now,\n }\n}\n\nfunction createCompactedSystemTurn(sessionId: string, summary: string): 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 assistantTurn: {\n id: generateTempId('assistant'),\n role: MessageRole.System,\n content: summary,\n citations: [],\n artifacts: [],\n codeOutputs: [],\n createdAt: now,\n },\n createdAt: now,\n }\n}\n\ntype SlashCommandName = '/clear' | '/debug' | '/compact'\n\ninterface ParsedSlashCommand {\n name: SlashCommandName\n hasArgs: boolean\n}\n\nfunction parseSlashCommand(input: string): ParsedSlashCommand | null {\n const trimmed = input.trim()\n if (!trimmed.startsWith('/')) return null\n\n const parts = trimmed.split(/\\s+/).filter(Boolean)\n if (parts.length === 0) return null\n\n const candidate = parts[0].toLowerCase()\n if (candidate !== '/clear' && candidate !== '/debug' && candidate !== '/compact') {\n return null\n }\n\n return {\n name: candidate,\n hasArgs: parts.length > 1,\n }\n}\n\nfunction readDebugLimitsFromGlobalContext(): DebugLimits | null {\n if (typeof window === 'undefined') {\n return null\n }\n\n const limits = window.__BICHAT_CONTEXT__?.extensions?.debug?.limits\n if (!limits) {\n return null\n }\n\n const {\n policyMaxTokens,\n modelMaxTokens,\n effectiveMaxTokens,\n completionReserveTokens,\n } = limits\n\n if (\n typeof policyMaxTokens !== 'number' ||\n typeof modelMaxTokens !== 'number' ||\n typeof effectiveMaxTokens !== 'number' ||\n typeof completionReserveTokens !== 'number'\n ) {\n return null\n }\n\n return {\n policyMaxTokens,\n modelMaxTokens,\n effectiveMaxTokens,\n completionReserveTokens,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Composed Provider\n// ---------------------------------------------------------------------------\n\nexport function ChatSessionProvider({\n dataSource,\n sessionId,\n rateLimiter: externalRateLimiter,\n children\n}: ChatSessionProviderProps) {\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 const [error, setError] = useState<string | null>(null)\n const [debugModeBySession, setDebugModeBySession] = useState<Record<string, boolean>>({})\n\n const debugSessionKey = currentSessionId || 'new'\n const debugMode = debugModeBySession[debugSessionKey] ?? false\n const debugLimits = useMemo(() => readDebugLimitsFromGlobalContext(), [])\n\n // ── Messaging state ────────────────────────────────────────────────────\n const [turns, setTurns] = useState<ConversationTurn[]>([])\n const [loading, setLoading] = useState(false)\n const [streamingContent, setStreamingContent] = useState('')\n const [isStreaming, setIsStreaming] = useState(false)\n const [pendingQuestion, setPendingQuestion] = useState<PendingQuestion | null>(null)\n const [codeOutputs, setCodeOutputs] = useState<CodeOutput[]>([])\n const [isCompacting, setIsCompacting] = useState(false)\n const [compactionSummary, setCompactionSummary] = useState<string | null>(null)\n const [artifactsInvalidationTrigger, setArtifactsInvalidationTrigger] = useState(0)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n // ── Input state ────────────────────────────────────────────────────────\n const [message, setMessage] = useState('')\n const [inputError, setInputError] = useState<string | null>(null)\n const [messageQueue, setMessageQueue] = useState<QueuedMessage[]>([])\n\n // ── Rate limiter ───────────────────────────────────────────────────────\n const rateLimiterRef = useRef<RateLimiter>(\n externalRateLimiter || new RateLimiter(DEFAULT_RATE_LIMIT_CONFIG)\n )\n\n // ── Refs for cross-context reads (no re-render subscription) ───────────\n const sessionRef = useRef({ currentSessionId, debugMode, debugSessionKey })\n sessionRef.current = { currentSessionId, debugMode, debugSessionKey }\n\n const messagingRef = useRef({ turns, pendingQuestion, loading })\n messagingRef.current = { turns, pendingQuestion, loading }\n\n // ── Derived ────────────────────────────────────────────────────────────\n const sessionDebugUsage = useMemo(() => getSessionDebugUsage(turns), [turns])\n\n // ── Sync sessionId prop ────────────────────────────────────────────────\n useEffect(() => {\n setCurrentSessionId(sessionId)\n }, [sessionId])\n\n // ── Restore queued messages per session (sessionStorage) ───────────────\n useEffect(() => {\n const sid = currentSessionId\n if (!sid || sid === 'new') {\n setMessageQueue([])\n return\n }\n setMessageQueue(loadQueue(sid))\n }, [currentSessionId])\n\n // ── Persist queued messages per session (sessionStorage) ───────────────\n useEffect(() => {\n const sid = currentSessionId\n if (!sid || sid === 'new') return\n saveQueue(sid, messageQueue)\n }, [currentSessionId, messageQueue])\n\n // ── Fetch session ──────────────────────────────────────────────────────\n useEffect(() => {\n if (!currentSessionId || currentSessionId === 'new') {\n setSession(null)\n setTurns([])\n setPendingQuestion(null)\n setFetching(false)\n setInputError(null)\n return\n }\n\n let cancelled = false\n\n setFetching(true)\n setError(null)\n setInputError(null)\n\n dataSource\n .fetchSession(currentSessionId)\n .then((state) => {\n if (cancelled) return\n\n if (state) {\n setSession(state.session)\n setTurns((prev) => {\n const hasPendingUserOnly =\n prev.length > 0 && !prev[prev.length - 1].assistantTurn\n if (\n hasPendingUserOnly &&\n (!state.turns || state.turns.length === 0)\n ) {\n return prev\n }\n return state.turns ?? prev\n })\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 // ── Handlers ───────────────────────────────────────────────────────────\n\n const handleCopy = useCallback(async (text: string) => {\n await navigator.clipboard.writeText(text)\n }, [])\n\n const executeSlashCommand = useCallback(\n async (command: ParsedSlashCommand): Promise<boolean> => {\n if (command.hasArgs) {\n setInputError('slash.error.noArguments')\n return true\n }\n\n setError(null)\n setInputError(null)\n\n if (command.name === '/debug') {\n if (!hasPermission('bichat.export')) {\n setInputError('slash.error.debugUnauthorized')\n return true\n }\n\n const curDebugMode = sessionRef.current.debugMode\n const curDebugSessionKey = sessionRef.current.debugSessionKey\n const curSessionId = sessionRef.current.currentSessionId\n const nextDebugMode = !curDebugMode\n setDebugModeBySession((prev) => ({\n ...prev,\n [curDebugSessionKey]: nextDebugMode,\n }))\n\n if (nextDebugMode && curSessionId && curSessionId !== 'new') {\n try {\n const state = await dataSource.fetchSession(curSessionId)\n if (state) {\n setSession(state.session)\n setTurns(state.turns)\n setPendingQuestion(state.pendingQuestion || null)\n }\n } catch (err) {\n console.error('Failed to refresh session for debug mode:', err)\n }\n }\n\n setMessage('')\n return true\n }\n\n const curSessionId = sessionRef.current.currentSessionId\n if (!curSessionId || curSessionId === 'new') {\n setInputError('slash.error.sessionRequired')\n return true\n }\n\n if (command.name === '/clear') {\n setLoading(true)\n setStreamingContent('')\n\n try {\n await dataSource.clearSessionHistory(curSessionId)\n const state = await dataSource.fetchSession(curSessionId)\n if (state) {\n setSession(state.session)\n setTurns(state.turns)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setTurns([])\n }\n setCompactionSummary(null)\n setCodeOutputs([])\n setMessage('')\n } catch (err) {\n setInputError(err instanceof Error ? err.message : 'slash.error.clearFailed')\n } finally {\n setLoading(false)\n setIsStreaming(false)\n }\n return true\n }\n\n if (command.name === '/compact') {\n setLoading(true)\n setIsCompacting(true)\n setCompactionSummary(null)\n setStreamingContent('')\n\n try {\n const result = await dataSource.compactSessionHistory(curSessionId)\n const summary = result.summary || ''\n setTurns([createCompactedSystemTurn(curSessionId, summary)])\n setCompactionSummary(null)\n\n const state = await dataSource.fetchSession(curSessionId)\n if (state) {\n setSession(state.session)\n setTurns(state.turns)\n setPendingQuestion(state.pendingQuestion || null)\n } else {\n setTurns([])\n }\n\n setCodeOutputs([])\n setMessage('')\n } catch (err) {\n setInputError(err instanceof Error ? err.message : 'slash.error.compactFailed')\n } finally {\n setIsCompacting(false)\n setLoading(false)\n setIsStreaming(false)\n }\n return true\n }\n\n setInputError('slash.error.unknownCommand')\n return true\n },\n [dataSource]\n )\n\n const sendMessageDirect = useCallback(\n async (\n content: string,\n attachments: Attachment[] = [],\n options?: SendMessageOptions\n ): Promise<void> => {\n if (!content.trim() || messagingRef.current.loading) return\n\n const trimmedContent = content.trim()\n if (trimmedContent.startsWith('/')) {\n const maybeCommand = parseSlashCommand(content)\n if (!maybeCommand) {\n setInputError('slash.error.unknownCommand')\n return\n }\n if (attachments.length > 0) {\n setInputError('slash.error.noAttachments')\n return\n }\n await executeSlashCommand(maybeCommand)\n return\n }\n\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 setInputError(null)\n setStreamingContent('')\n setCompactionSummary(null)\n\n abortControllerRef.current = new AbortController()\n\n const curSessionId = sessionRef.current.currentSessionId\n const curDebugMode = sessionRef.current.debugMode\n const tempTurn = createPendingTurn(curSessionId || 'new', content, attachments)\n const replaceFromMessageID = options?.replaceFromMessageID\n setTurns((prev) => {\n if (!replaceFromMessageID) {\n return [...prev, tempTurn]\n }\n const replaceIndex = prev.findIndex((turn) => turn.userTurn.id === replaceFromMessageID)\n if (replaceIndex === -1) {\n return [...prev, tempTurn]\n }\n return [...prev.slice(0, replaceIndex), tempTurn]\n })\n\n try {\n let activeSessionId = curSessionId\n let shouldNavigateAfter = false\n\n if (!activeSessionId || activeSessionId === 'new') {\n const result = await dataSource.createSession()\n if (result) {\n const createdSessionID = result.id\n activeSessionId = createdSessionID\n setCurrentSessionId(createdSessionID)\n setDebugModeBySession((prev) => {\n if (!curDebugMode) return prev\n return { ...prev, [createdSessionID]: true }\n })\n shouldNavigateAfter = true\n }\n }\n\n let accumulatedContent = ''\n let createdSessionId: string | undefined\n let sessionFetched = false\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 debugMode: curDebugMode,\n replaceFromMessageID,\n }\n )) {\n if (abortControllerRef.current?.signal.aborted) {\n break\n }\n\n if ((chunk.type === 'chunk' || chunk.type === 'content') && 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 === 'interrupt' || chunk.type === 'done') {\n if (chunk.sessionId) {\n createdSessionId = chunk.sessionId\n }\n if (!sessionFetched) {\n sessionFetched = true\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((prev) => {\n const hasPendingUserOnly =\n prev.length > 0 && !prev[prev.length - 1].assistantTurn\n if (\n hasPendingUserOnly &&\n (!state.turns || state.turns.length === 0)\n ) {\n return prev\n }\n return state.turns ?? prev\n })\n setPendingQuestion(state.pendingQuestion || null)\n }\n }\n }\n } else if (chunk.type === 'user_message' && chunk.sessionId) {\n createdSessionId = chunk.sessionId\n } else if (chunk.type === 'tool_end' && chunk.tool?.name && ARTIFACT_TOOL_NAMES.has(chunk.tool.name)) {\n setArtifactsInvalidationTrigger((n) => n + 1)\n }\n }\n\n const targetSessionId = createdSessionId || activeSessionId\n if (shouldNavigateAfter && targetSessionId && targetSessionId !== 'new') {\n dataSource.navigateToSession?.(targetSessionId)\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n setMessage(content)\n return\n }\n\n setTurns((prev) => prev.filter((t) => t.id !== tempTurn.id))\n\n const errorMessage = err instanceof Error ? err.message : 'error.networkError'\n setInputError(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 [dataSource, executeSlashCommand]\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: Attachment[] = []) => {\n e.preventDefault()\n if (!message.trim() && attachments.length === 0) return\n setInputError(null)\n\n const convertedAttachments: Attachment[] = attachments.map(att => ({\n id: '',\n filename: att.filename,\n mimeType: att.mimeType,\n sizeBytes: att.sizeBytes,\n base64Data: att.base64Data,\n url: att.url,\n preview: att.preview,\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 const curSessionId = sessionRef.current.currentSessionId\n if (!curSessionId || curSessionId === 'new') return\n\n const turn = messagingRef.current.turns.find((t) => t.id === turnId)\n if (!turn) return\n\n setError(null)\n\n try {\n await sendMessageDirect(turn.userTurn.content, turn.userTurn.attachments, {\n replaceFromMessageID: turn.userTurn.id,\n })\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 }\n },\n [sendMessageDirect]\n )\n\n const handleEdit = useCallback(\n async (turnId: string, newContent: string) => {\n const curSessionId = sessionRef.current.currentSessionId\n if (!curSessionId || curSessionId === 'new') {\n setMessage(newContent)\n setTurns((prev) => prev.filter((t) => t.id !== turnId))\n return\n }\n\n const turn = messagingRef.current.turns.find((t) => t.id === turnId)\n if (!turn) {\n setError('Failed to edit message')\n return\n }\n\n setError(null)\n\n try {\n await sendMessageDirect(newContent, turn.userTurn.attachments, {\n replaceFromMessageID: turn.userTurn.id,\n })\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 }\n },\n [sendMessageDirect]\n )\n\n const handleSubmitQuestionAnswers = useCallback(\n (answers: QuestionAnswers) => {\n const curSessionId = sessionRef.current.currentSessionId\n const curPendingQuestion = messagingRef.current.pendingQuestion\n if (!curSessionId || !curPendingQuestion) return\n\n setLoading(true)\n setError(null)\n const previousPendingQuestion = curPendingQuestion\n setPendingQuestion(null)\n\n ;(async () => {\n try {\n const result = await dataSource.submitQuestionAnswers(\n curSessionId,\n previousPendingQuestion.id,\n answers\n )\n\n if (result.success) {\n if (curSessionId !== 'new') {\n try {\n const state = await dataSource.fetchSession(curSessionId)\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 [dataSource]\n )\n\n const handleRejectPendingQuestion = useCallback(async () => {\n const curSessionId = sessionRef.current.currentSessionId\n const curPendingQuestion = messagingRef.current.pendingQuestion\n if (!curSessionId || !curPendingQuestion) return\n\n try {\n const result = await dataSource.rejectPendingQuestion(curSessionId)\n if (result.success) {\n setPendingQuestion(null)\n // Re-fetch to get updated turns (agent may have resumed)\n if (curSessionId !== 'new') {\n const state = await dataSource.fetchSession(curSessionId)\n if (state) {\n setSession(state.session)\n setTurns((prev) => {\n const hasPendingUserOnly =\n prev.length > 0 && !prev[prev.length - 1].assistantTurn\n if (\n hasPendingUserOnly &&\n (!state.turns || state.turns.length === 0)\n ) {\n return prev\n }\n return state.turns ?? prev\n })\n setPendingQuestion(state.pendingQuestion || null)\n }\n }\n } else {\n setError(result.error || 'Failed to reject question')\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to reject question'\n setError(errorMessage)\n }\n }, [dataSource])\n\n // ── Context values (memoized per-context) ──────────────────────────────\n\n const sessionValue: ChatSessionStateValue = useMemo(() => ({\n session,\n currentSessionId,\n fetching,\n error,\n debugMode,\n sessionDebugUsage,\n debugLimits,\n setError,\n }), [session, currentSessionId, fetching, error, debugMode, sessionDebugUsage, debugLimits])\n\n const messagingValue: ChatMessagingStateValue = useMemo(() => ({\n turns,\n streamingContent,\n isStreaming,\n loading,\n pendingQuestion,\n codeOutputs,\n isCompacting,\n compactionSummary,\n artifactsInvalidationTrigger,\n sendMessage: sendMessageDirect,\n handleRegenerate,\n handleEdit,\n handleCopy,\n handleSubmitQuestionAnswers,\n handleRejectPendingQuestion,\n cancel: cancelStream,\n setCodeOutputs,\n }), [\n turns, streamingContent, isStreaming, loading, pendingQuestion,\n codeOutputs, isCompacting, compactionSummary, artifactsInvalidationTrigger,\n sendMessageDirect, handleRegenerate, handleEdit, handleCopy,\n handleSubmitQuestionAnswers, handleRejectPendingQuestion, cancelStream,\n ])\n\n const inputValue: ChatInputStateValue = useMemo(() => ({\n message,\n inputError,\n messageQueue,\n setMessage,\n setInputError,\n handleSubmit,\n handleUnqueue,\n }), [message, inputError, messageQueue, handleSubmit, handleUnqueue])\n\n return (\n <SessionCtx.Provider value={sessionValue}>\n <MessagingCtx.Provider value={messagingValue}>\n <InputCtx.Provider value={inputValue}>\n {children}\n </InputCtx.Provider>\n </MessagingCtx.Provider>\n </SessionCtx.Provider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Focused hooks\n// ---------------------------------------------------------------------------\n\nexport function useChatSession(): ChatSessionStateValue {\n const context = useContext(SessionCtx)\n if (!context) {\n throw new Error('useChatSession must be used within ChatSessionProvider')\n }\n return context\n}\n\nexport function useChatMessaging(): ChatMessagingStateValue {\n const context = useContext(MessagingCtx)\n if (!context) {\n throw new Error('useChatMessaging must be used within ChatSessionProvider')\n }\n return context\n}\n\n/** Returns messaging context or null when outside ChatSessionProvider. Use when component can receive values via props (e.g. SessionArtifactsPanel with artifactsInvalidationTrigger prop). */\nexport function useOptionalChatMessaging(): ChatMessagingStateValue | null {\n return useContext(MessagingCtx)\n}\n\nexport function useChatInput(): ChatInputStateValue {\n const context = useContext(InputCtx)\n if (!context) {\n throw new Error('useChatInput must be used within ChatSessionProvider')\n }\n return context\n}\n\n// ---------------------------------------------------------------------------\n// Backwards-compatible merged hook\n// ---------------------------------------------------------------------------\n\nexport function useChat(): ChatSessionContextValue {\n const s = useChatSession()\n const m = useChatMessaging()\n const i = useChatInput()\n\n return useMemo(() => ({\n ...s,\n ...m,\n ...i,\n }), [s, m, i])\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 readOnly?: boolean\n /** Custom logo component to display */\n logoSlot?: ReactNode\n /** Custom action buttons */\n actionsSlot?: ReactNode\n}\n\nexport function ChatHeader({ session, onBack, readOnly, logoSlot, actionsSlot }: ChatHeaderProps) {\n const { t } = useTranslation()\n const branding = useBranding()\n\n const BackButton = onBack ? (\n <button\n onClick={onBack}\n className=\"cursor-pointer 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-gray-200 dark:border-gray-700 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-gray-200 dark:border-gray-700 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 {readOnly && (\n <span className=\"px-2 py-1 text-xs bg-amber-100 dark:bg-amber-900/30 text-amber-800 dark:text-amber-200 rounded\">\n {t('chat.readOnly')}\n </span>\n )}\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 * 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 * File Utilities\n * Validation, conversion, and formatting for file attachments\n */\n\nconst MAX_FILE_SIZE_BYTES = 20 * 1024 * 1024 // 20MB\n\nconst ALLOWED_MIME_TYPES = new Set<string>([\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'text/csv',\n 'text/tab-separated-values',\n 'text/plain',\n 'text/markdown',\n 'application/json',\n 'application/xml',\n 'text/xml',\n 'application/yaml',\n 'text/yaml',\n 'application/x-yaml',\n 'text/x-yaml',\n 'text/log',\n])\n\nconst ALLOWED_EXTENSIONS = new Set<string>([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.csv',\n '.tsv',\n '.txt',\n '.md',\n '.json',\n '.xml',\n '.yaml',\n '.yml',\n '.log',\n])\n\nexport const ATTACHMENT_ACCEPT_ATTRIBUTE = Array.from(ALLOWED_EXTENSIONS).join(',')\n\nexport function isImageMimeType(mimeType: string): boolean {\n return mimeType.toLowerCase().startsWith('image/')\n}\n\n/**\n * Validates a file against size and type constraints\n * @throws Error if validation fails\n */\nexport function validateAttachmentFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n const mimeType = file.type.toLowerCase()\n const fileName = file.name || 'file'\n const extensionMatch = /\\.(\\w+)$/.exec(fileName.toLowerCase())\n const extension = extensionMatch ? `.${extensionMatch[1]}` : ''\n\n const mimeAllowed = mimeType !== '' && ALLOWED_MIME_TYPES.has(mimeType)\n const extensionAllowed = extension !== '' && ALLOWED_EXTENSIONS.has(extension)\n\n if (!mimeAllowed && !extensionAllowed) {\n throw new Error(`Invalid file type: ${mimeType || extension || 'unknown'}`)\n }\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 * Backward-compatible image validator used by older components/stories.\n */\nexport function validateImageFile(file: File, maxSizeBytes: number = MAX_FILE_SIZE_BYTES): void {\n validateAttachmentFile(file, maxSizeBytes)\n if (!isImageMimeType(file.type)) {\n throw new Error(`Invalid file type: ${file.type}. Only image files are allowed.`)\n }\n}\n\n/**\n * Encode an ArrayBuffer to a base64 string.\n */\nfunction encodeArrayBuffer(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n const chunkSize = 0x8000\n let binary = ''\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, i + chunkSize)\n binary += String.fromCharCode(...chunk)\n }\n return btoa(binary)\n}\n\nfunction readWithFileReaderArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n if (reader.result instanceof ArrayBuffer) {\n resolve(reader.result)\n return\n }\n reject(new Error('Unexpected reader result'))\n }\n reader.onerror = () => reject(reader.error ?? new Error('FileReader failed'))\n reader.onabort = () => reject(new Error('File read was aborted'))\n reader.readAsArrayBuffer(file)\n })\n}\n\nfunction readWithFileReaderDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result)\n return\n }\n reject(new Error('Unexpected reader result'))\n }\n reader.onerror = () => reject(reader.error ?? new Error('FileReader failed'))\n reader.onabort = () => reject(new Error('File read was aborted'))\n reader.readAsDataURL(file)\n })\n}\n\nasync function readFileBuffer(file: File): Promise<ArrayBuffer> {\n try {\n return await new Response(file).arrayBuffer()\n } catch {\n // Fall through to native/file-reader strategies for drag/drop edge cases.\n }\n\n try {\n return await file.arrayBuffer()\n } catch {\n return readWithFileReaderArrayBuffer(file)\n }\n}\n\nfunction extractBase64FromDataUrl(dataUrl: string): string {\n const commaIndex = dataUrl.indexOf(',')\n if (commaIndex < 0 || commaIndex === dataUrl.length - 1) {\n throw new Error('Invalid data URL')\n }\n return dataUrl.slice(commaIndex + 1)\n}\n\n/**\n * Converts a file to base64 string (without data URL prefix).\n * Prefers FileReader data URLs, then falls back to buffer-based encoding.\n */\nexport async function convertToBase64(file: File): Promise<string> {\n try {\n const dataUrl = await readWithFileReaderDataUrl(file)\n return extractBase64FromDataUrl(dataUrl)\n } catch {\n try {\n const buffer = await readFileBuffer(file)\n return encodeArrayBuffer(buffer)\n } catch (err) {\n const details = err instanceof Error ? ` (${err.message})` : ''\n throw new Error(`Failed to read file: ${file.name}${details}`)\n }\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// ─── Shared file visual metadata ──────────────────────────────────────────────\n\nimport {\n File,\n FileCode,\n FileCsv,\n FileDoc,\n FilePdf,\n FileText,\n FileXls,\n Image as ImageIcon,\n ChartBar,\n} from '@phosphor-icons/react'\n\nexport interface FileVisual {\n /** Phosphor icon component */\n icon: typeof File\n /** Tailwind text-color classes for the icon (light + dark) */\n iconColor: string\n /** Tailwind background classes for the icon container (light + dark) */\n bgColor: string\n /** Short label (PDF, CSV, XLS, etc.) */\n label: string\n}\n\n/**\n * Resolves visual metadata (icon, colors, label) for a file based on\n * its MIME type and/or filename. Single source of truth used by\n * AttachmentGrid, SessionArtifactList, DownloadCard, etc.\n */\nexport function getFileVisual(mimeType?: string, filename?: string): FileVisual {\n const mime = (mimeType || '').toLowerCase()\n const name = (filename || '').toLowerCase()\n\n // Images\n if (mime.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|bmp)$/.test(name)) {\n return {\n icon: ImageIcon,\n iconColor: 'text-violet-600 dark:text-violet-400',\n bgColor: 'bg-violet-100 dark:bg-violet-900/40',\n label: 'IMG',\n }\n }\n\n // PDF\n if (mime.includes('pdf') || name.endsWith('.pdf')) {\n return {\n icon: FilePdf,\n iconColor: 'text-red-500 dark:text-red-400',\n bgColor: 'bg-red-100 dark:bg-red-900/40',\n label: 'PDF',\n }\n }\n\n // Excel / spreadsheet\n if (\n mime === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||\n mime.includes('excel') ||\n mime.includes('spreadsheet') ||\n /\\.xlsx?$/.test(name)\n ) {\n return {\n icon: FileXls,\n iconColor: 'text-emerald-600 dark:text-emerald-400',\n bgColor: 'bg-emerald-100 dark:bg-emerald-900/40',\n label: 'XLS',\n }\n }\n\n // CSV / TSV\n if (mime.includes('csv') || mime.includes('tab-separated') || /\\.(csv|tsv)$/.test(name)) {\n return {\n icon: FileCsv,\n iconColor: 'text-emerald-600 dark:text-emerald-400',\n bgColor: 'bg-emerald-100 dark:bg-emerald-900/40',\n label: 'CSV',\n }\n }\n\n // Word documents\n if (mime.includes('wordprocessingml') || mime.includes('msword') || /\\.docx?$/.test(name)) {\n return {\n icon: FileDoc,\n iconColor: 'text-blue-600 dark:text-blue-400',\n bgColor: 'bg-blue-100 dark:bg-blue-900/40',\n label: 'DOC',\n }\n }\n\n // Code / structured data (JSON, XML, YAML, etc.)\n if (\n mime.includes('json') || mime.includes('xml') || mime.includes('yaml') ||\n mime.includes('javascript') || mime.includes('typescript') ||\n /\\.(json|xml|ya?ml|js|ts)$/.test(name)\n ) {\n const l = mime.includes('json') || name.endsWith('.json') ? 'JSON'\n : mime.includes('xml') || name.endsWith('.xml') ? 'XML'\n : mime.includes('yaml') || /\\.ya?ml$/.test(name) ? 'YAML'\n : 'CODE'\n return {\n icon: FileCode,\n iconColor: 'text-violet-500 dark:text-violet-400',\n bgColor: 'bg-violet-100 dark:bg-violet-900/40',\n label: l,\n }\n }\n\n // Plain text / markdown / log\n if (mime.startsWith('text/') || /\\.(txt|md|log)$/.test(name)) {\n return {\n icon: FileText,\n iconColor: 'text-gray-500 dark:text-gray-400',\n bgColor: 'bg-gray-100 dark:bg-gray-800',\n label: 'TEXT',\n }\n }\n\n // Fallback\n return {\n icon: File,\n iconColor: 'text-gray-400 dark:text-gray-500',\n bgColor: 'bg-gray-100 dark:bg-gray-800',\n label: (mime.split('/')[1] || 'FILE').toUpperCase().slice(0, 4),\n }\n}\n\n/** Chart-specific visual (not mime-based, used for artifact type = 'chart') */\nexport const CHART_VISUAL: FileVisual = {\n icon: ChartBar,\n iconColor: 'text-indigo-600 dark:text-indigo-400',\n bgColor: 'bg-indigo-100 dark:bg-indigo-900/40',\n label: 'CHART',\n}\n","/**\n * AttachmentGrid Component\n * Displays image and non-image attachments as compact horizontal cards.\n */\n\nimport React, { useMemo, useState } from 'react'\nimport { X, Image as ImageIcon } from '@phosphor-icons/react'\nimport { formatFileSize, getFileVisual } from '../utils/fileUtils'\nimport type { Attachment } from '../types'\n\ninterface AttachmentGridProps {\n attachments: Attachment[]\n onRemove?: (index: number) => void\n onView?: (index: number) => void\n className?: string\n readonly?: boolean\n maxDisplay?: number\n maxCapacity?: number\n emptyMessage?: string\n showCount?: boolean\n /** Number of files currently being processed (shows shimmer placeholders) */\n pendingCount?: number\n}\n\nfunction isImageAttachment(attachment: Attachment): boolean {\n return attachment.mimeType.toLowerCase().startsWith('image/')\n}\n\nfunction resolveImagePreview(attachment: Attachment): string {\n if (attachment.preview) {\n return attachment.preview\n }\n if (!isImageAttachment(attachment)) {\n return ''\n }\n if (attachment.base64Data) {\n if (attachment.base64Data.startsWith('data:')) {\n return attachment.base64Data\n }\n return `data:${attachment.mimeType};base64,${attachment.base64Data}`\n }\n return attachment.url || ''\n}\n\n/* ── Shared card styles ─────────────────────────────── */\n\nconst CARD_CLS = [\n 'group relative flex items-center gap-2.5 rounded-xl',\n 'border border-gray-200/80 dark:border-gray-700/60',\n 'bg-white dark:bg-gray-800/60',\n 'px-2.5 py-2',\n 'transition-all duration-150',\n].join(' ')\n\nfunction RemoveButton({ index, onRemove, filename }: { index: number; onRemove: (i: number) => void; filename: string }) {\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); onRemove(index) }}\n className=\"flex-shrink-0 p-1 text-gray-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-md opacity-0 group-hover:opacity-100 transition-all duration-150 cursor-pointer focus-visible:outline-none focus-visible:opacity-100\"\n aria-label={`Remove ${filename}`}\n >\n <X size={14} weight=\"bold\" />\n </button>\n )\n}\n\n/* ── Shimmer placeholder ───────────────────────────── */\n\nfunction ShimmerCard() {\n const shimmerStyle = {\n background: 'linear-gradient(110deg, transparent 30%, rgba(255,255,255,0.4) 50%, transparent 70%)',\n backgroundSize: '250% 100%',\n animation: 'attachmentShimmer 1.5s ease-in-out infinite',\n }\n\n return (\n <div className={CARD_CLS} style={{ pointerEvents: 'none' }}>\n <div className=\"flex-shrink-0 w-10 h-10 rounded-lg bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n <div className=\"w-full h-full\" style={shimmerStyle} />\n </div>\n <div className=\"flex-1 space-y-1.5\">\n <div className=\"h-3.5 w-28 rounded bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n <div className=\"w-full h-full\" style={shimmerStyle} />\n </div>\n <div className=\"h-3 w-16 rounded bg-gray-100 dark:bg-gray-700 overflow-hidden\">\n <div className=\"w-full h-full\" style={shimmerStyle} />\n </div>\n </div>\n <style>{`\n @keyframes attachmentShimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -60% 0; }\n }\n `}</style>\n </div>\n )\n}\n\n/* ── Image card ──────────────────────────────────────── */\n\ninterface ImageItemProps {\n attachment: Attachment\n index: number\n onRemove?: (index: number) => void\n onView?: (index: number) => void\n}\n\nfunction ImageItem({ attachment, index, onRemove, onView }: ImageItemProps) {\n const previewSrc = resolveImagePreview(attachment)\n const hasPreview = previewSrc !== ''\n const [imgFailed, setImgFailed] = useState(false)\n\n const thumbnail =\n hasPreview && !imgFailed ? (\n <img\n src={previewSrc}\n alt={attachment.filename}\n onError={() => setImgFailed(true)}\n className=\"w-10 h-10 rounded-lg object-cover bg-gray-100 dark:bg-gray-700\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-10 h-10 rounded-lg bg-violet-100 dark:bg-violet-900/40\">\n <ImageIcon size={20} weight=\"duotone\" className=\"text-violet-600 dark:text-violet-400\" />\n </div>\n )\n\n return (\n <div className={CARD_CLS}>\n {hasPreview && !imgFailed && onView ? (\n <button\n type=\"button\"\n onClick={() => onView(index)}\n className=\"flex-shrink-0 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 rounded-lg hover:opacity-80 transition-opacity\"\n aria-label={`View ${attachment.filename}`}\n >\n {thumbnail}\n </button>\n ) : (\n <div className=\"flex-shrink-0\">{thumbnail}</div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <span className=\"block text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n {attachment.filename}\n </span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n {formatFileSize(attachment.sizeBytes)}\n </span>\n </div>\n\n {onRemove && <RemoveButton index={index} onRemove={onRemove} filename={attachment.filename} />}\n </div>\n )\n}\n\n/* ── File card (non-image) ──────────────────────────── */\n\ninterface FileCardProps {\n attachment: Attachment\n index: number\n onRemove?: (index: number) => void\n}\n\nfunction FileCard({ attachment, index, onRemove }: FileCardProps) {\n const visual = getFileVisual(attachment.mimeType, attachment.filename)\n const Icon = visual.icon\n\n return (\n <div className={CARD_CLS}>\n <div className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor}`}>\n <Icon size={20} weight=\"duotone\" className={visual.iconColor} />\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <span className=\"block text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n {attachment.filename}\n </span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n {formatFileSize(attachment.sizeBytes)}\n </span>\n </div>\n\n {onRemove && <RemoveButton index={index} onRemove={onRemove} filename={attachment.filename} />}\n </div>\n )\n}\n\n/* ── Memoization ───────────────────────────────────── */\n\nconst attachmentEq = (a: Attachment, b: Attachment) =>\n a.id === b.id &&\n a.filename === b.filename &&\n a.preview === b.preview &&\n a.base64Data === b.base64Data &&\n a.url === b.url\n\nconst MemoizedImageItem = React.memo(ImageItem, (prev, next) =>\n attachmentEq(prev.attachment, next.attachment) &&\n prev.index === next.index &&\n prev.onRemove === next.onRemove &&\n prev.onView === next.onView\n)\n\nconst MemoizedFileCard = React.memo(FileCard, (prev, next) =>\n attachmentEq(prev.attachment, next.attachment) &&\n prev.index === next.index &&\n prev.onRemove === next.onRemove\n)\n\n/* ── Grid ──────────────────────────────────────────── */\n\nfunction AttachmentGrid({\n attachments,\n onRemove,\n onView,\n className = '',\n readonly = false,\n maxDisplay,\n maxCapacity = 10,\n emptyMessage = 'No files attached',\n showCount = false,\n pendingCount = 0,\n}: AttachmentGridProps) {\n const displayedAttachments = useMemo(\n () =>\n maxDisplay && attachments.length > maxDisplay\n ? attachments.slice(0, maxDisplay)\n : attachments,\n [attachments, maxDisplay]\n )\n\n const isAtMaxCapacity = attachments.length >= maxCapacity\n const hasContent = displayedAttachments.length > 0 || pendingCount > 0\n\n if (!hasContent) {\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\n return (\n <div className={`space-y-2 ${className}`}>\n {showCount && (\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n {displayedAttachments.length} file{displayedAttachments.length !== 1 ? 's' : ''} attached\n </div>\n )}\n\n <div className=\"grid gap-2\">\n {displayedAttachments.map((attachment, index) => {\n const isImage = isImageAttachment(attachment) && resolveImagePreview(attachment)\n return isImage ? (\n <MemoizedImageItem\n key={`${attachment.id || attachment.filename}-${index}`}\n attachment={attachment}\n index={index}\n onRemove={isEditable ? onRemove : undefined}\n onView={onView}\n />\n ) : (\n <MemoizedFileCard\n key={`${attachment.id || attachment.filename}-${index}`}\n attachment={attachment}\n index={index}\n onRemove={isEditable ? onRemove : undefined}\n />\n )\n })}\n\n {/* Shimmer placeholders for files being processed */}\n {Array.from({ length: pendingCount }).map((_, i) => (\n <ShimmerCard key={`pending-${i}`} />\n ))}\n </div>\n\n {maxDisplay && attachments.length > maxDisplay && (\n <div className=\"text-xs text-gray-500 dark:text-gray-400\">\n +{attachments.length - maxDisplay} more\n </div>\n )}\n\n {isAtMaxCapacity && isEditable && (\n <div className=\"text-xs text-amber-600 dark:text-amber-400\">\n Maximum {maxCapacity} files\n </div>\n )}\n </div>\n )\n}\n\nconst MemoizedAttachmentGrid = React.memo(AttachmentGrid)\nMemoizedAttachmentGrid.displayName = 'AttachmentGrid'\n\nexport { MemoizedAttachmentGrid as AttachmentGrid }\nexport default MemoizedAttachmentGrid\n","/**\n * ImageModal Component\n * Full-screen image viewer with gallery navigation.\n * Uses @headlessui/react Dialog for accessible modal behavior.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'\nimport { X, CaretLeft, CaretRight, ArrowClockwise, ImageBroken } from '@phosphor-icons/react'\nimport type { ImageAttachment } from '../types'\nimport { createDataUrl, formatFileSize } from '../utils/fileUtils'\n\ninterface ImageModalProps {\n isOpen: boolean\n onClose: () => void\n attachment: ImageAttachment\n allAttachments?: ImageAttachment[]\n currentIndex?: number\n onNavigate?: (direction: 'prev' | 'next') => void\n}\n\nfunction ImageModal({\n isOpen,\n onClose,\n attachment,\n allAttachments,\n currentIndex = 0,\n onNavigate,\n}: ImageModalProps) {\n const [isImageLoaded, setIsImageLoaded] = useState(false)\n const [imageError, setImageError] = useState(false)\n const [retryKey, setRetryKey] = useState(0)\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 useEffect(() => {\n if (!isOpen) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n 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, onNavigate, canNavigatePrev, canNavigateNext])\n\n useEffect(() => {\n setIsImageLoaded(false)\n setImageError(false)\n }, [attachment])\n\n const handleRetry = useCallback(() => {\n setImageError(false)\n setIsImageLoaded(false)\n setRetryKey((k) => k + 1)\n }, [])\n\n const previewUrl =\n attachment.preview || createDataUrl(attachment.base64Data, attachment.mimeType)\n\n return (\n <Dialog open={isOpen} onClose={onClose} className=\"relative\" style={{ zIndex: 99999 }}>\n <DialogBackdrop\n className=\"fixed inset-0\"\n style={{ zIndex: 99999, backgroundColor: 'rgba(0, 0, 0, 0.85)' }}\n />\n\n <DialogPanel className=\"fixed inset-0 flex flex-col\" style={{ zIndex: 100000 }}>\n {/* ── Top bar ── */}\n <div className=\"flex items-center justify-between px-4 py-3 shrink-0 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800\">\n <div className=\"flex items-center gap-3 min-w-0\">\n {hasMultipleImages && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400 tabular-nums whitespace-nowrap\">\n {currentIndex + 1} / {allAttachments?.length}\n </span>\n )}\n <span className=\"text-sm text-gray-900 dark:text-gray-200 truncate\">{attachment.filename}</span>\n <span className=\"text-xs text-gray-400 dark:text-gray-500 whitespace-nowrap\">\n {formatFileSize(attachment.sizeBytes)}\n </span>\n </div>\n\n <button\n onClick={onClose}\n className=\"cursor-pointer flex items-center justify-center w-8 h-8 rounded-md bg-gray-100 hover:bg-gray-200 dark:bg-gray-800 dark:hover:bg-gray-700 text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400\"\n aria-label=\"Close modal\"\n type=\"button\"\n >\n <X size={18} weight=\"bold\" />\n </button>\n </div>\n\n {/* ── Image area (click outside image to close) ── */}\n <div\n className=\"relative flex-1 flex items-center justify-center min-h-0\"\n onClick={(e) => { if (e.target === e.currentTarget) onClose() }}\n >\n {/* Loading spinner */}\n {!isImageLoaded && !imageError && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-8 h-8 border-2 border-gray-300 dark:border-gray-700 border-t-gray-500 dark:border-t-gray-400 rounded-full animate-spin\" />\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">Loading</span>\n </div>\n </div>\n )}\n\n {/* Error state */}\n {imageError && (\n <div role=\"alert\" className=\"flex flex-col items-center justify-center text-center max-w-xs\">\n <div className=\"flex items-center justify-center w-16 h-16 rounded-2xl bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 mb-5\">\n <ImageBroken size={28} className=\"text-gray-400 dark:text-gray-500\" weight=\"duotone\" />\n </div>\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">Failed to load image</p>\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mb-5 truncate max-w-full\">{attachment.filename}</p>\n <button\n type=\"button\"\n onClick={handleRetry}\n className=\"cursor-pointer inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 border border-gray-200 dark:border-gray-700 rounded-lg transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400\"\n aria-label=\"Retry loading image\"\n >\n <ArrowClockwise size={16} weight=\"bold\" />\n Retry\n </button>\n </div>\n )}\n\n {/* Image */}\n <img\n key={retryKey}\n src={previewUrl}\n alt={attachment.filename}\n className={[\n 'max-w-[90vw] max-h-[calc(100vh-120px)] object-contain select-none',\n 'transition-opacity duration-300 ease-out',\n isImageLoaded ? 'opacity-100' : 'opacity-0',\n ].join(' ')}\n onLoad={() => setIsImageLoaded(true)}\n onError={() => setImageError(true)}\n loading=\"lazy\"\n draggable={false}\n />\n\n {/* ── Navigation arrows ── */}\n {hasMultipleImages && (\n <>\n <button\n onClick={() => onNavigate?.('prev')}\n disabled={!canNavigatePrev || !isImageLoaded || imageError}\n className={[\n 'absolute left-3 top-1/2 -translate-y-1/2',\n 'flex items-center justify-center w-10 h-10 rounded-md',\n 'transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400',\n canNavigatePrev && isImageLoaded && !imageError\n ? 'cursor-pointer bg-white/90 hover:bg-white dark:bg-gray-800/90 dark:hover:bg-gray-700 text-gray-700 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white shadow-sm'\n : 'bg-white/40 dark:bg-gray-800/40 text-gray-300 dark:text-gray-700 cursor-not-allowed',\n ].join(' ')}\n aria-label=\"Previous image\"\n type=\"button\"\n >\n <CaretLeft size={20} weight=\"bold\" />\n </button>\n\n <button\n onClick={() => onNavigate?.('next')}\n disabled={!canNavigateNext || !isImageLoaded || imageError}\n className={[\n 'absolute right-3 top-1/2 -translate-y-1/2',\n 'flex items-center justify-center w-10 h-10 rounded-md',\n 'transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-400',\n canNavigateNext && isImageLoaded && !imageError\n ? 'cursor-pointer bg-white/90 hover:bg-white dark:bg-gray-800/90 dark:hover:bg-gray-700 text-gray-700 hover:text-gray-900 dark:text-gray-300 dark:hover:text-white shadow-sm'\n : 'bg-white/40 dark:bg-gray-800/40 text-gray-300 dark:text-gray-700 cursor-not-allowed',\n ].join(' ')}\n aria-label=\"Next image\"\n type=\"button\"\n >\n <CaretRight size={20} weight=\"bold\" />\n </button>\n </>\n )}\n </div>\n </DialogPanel>\n </Dialog>\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, useRef, useEffect, type ReactNode } from 'react'\nimport { Check, Copy, PencilSimple } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport AttachmentGrid from './AttachmentGrid'\nimport ImageModal from './ImageModal'\nimport type { Attachment, ImageAttachment, UserTurn } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\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 /** Message attachments */\n attachments: Attachment[]\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 /** Whether edit action should be available */\n allowEdit?: boolean\n}\n\nconst COPY_FEEDBACK_MS = 2000\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 shadow-sm',\n content: 'text-sm 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: 'cursor-pointer p-2 text-gray-500 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 allowEdit = true,\n}: UserMessageProps) {\n const { t } = useTranslation()\n const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(null)\n const [isEditing, setIsEditing] = useState(false)\n const [draftContent, setDraftContent] = useState('')\n const [isCopied, setIsCopied] = useState(false)\n const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const classes = mergeClassNames(defaultClassNames, classNameOverrides)\n\n useEffect(() => {\n return () => {\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current)\n copyFeedbackTimeoutRef.current = null\n }\n }\n }, [])\n\n const normalizedAttachments: Attachment[] = turn.attachments.map((attachment) => {\n if (!attachment.mimeType.startsWith('image/')) {\n return attachment\n }\n\n if (attachment.preview) {\n return attachment\n }\n if (attachment.base64Data) {\n if (attachment.base64Data.startsWith('data:')) {\n return {\n ...attachment,\n preview: attachment.base64Data,\n }\n }\n return {\n ...attachment,\n preview: `data:${attachment.mimeType};base64,${attachment.base64Data}`,\n }\n }\n if (attachment.url) {\n return {\n ...attachment,\n preview: attachment.url,\n }\n }\n return attachment\n })\n\n const imageAttachments: ImageAttachment[] = []\n const imageIndexByAttachmentIndex = new Map<number, number>()\n normalizedAttachments.forEach((attachment, index) => {\n if (!attachment.mimeType.startsWith('image/')) {\n return\n }\n if (!attachment.preview && !attachment.url) {\n return\n }\n imageIndexByAttachmentIndex.set(index, imageAttachments.length)\n imageAttachments.push({\n ...attachment,\n base64Data: attachment.base64Data || '',\n preview: attachment.preview || attachment.url || '',\n })\n })\n\n const handleCopyClick = useCallback(async () => {\n try {\n if (onCopy) {\n await onCopy(turn.content)\n } else {\n await navigator.clipboard.writeText(turn.content)\n }\n\n setIsCopied(true)\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current)\n }\n copyFeedbackTimeoutRef.current = setTimeout(() => {\n setIsCopied(false)\n copyFeedbackTimeoutRef.current = null\n }, COPY_FEEDBACK_MS)\n } catch (err) {\n setIsCopied(false)\n console.error('Failed to copy:', err)\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: normalizedAttachments,\n onView: (index) => {\n const imageIndex = imageIndexByAttachmentIndex.get(index)\n if (imageIndex === undefined) {\n return\n }\n setSelectedImageIndex(imageIndex)\n },\n }\n const actionsSlotProps: UserMessageActionsSlotProps = {\n onCopy: handleCopyClick,\n onEdit: onEdit && turnId && allowEdit ? handleEditClick : undefined,\n timestamp,\n canCopy: true,\n canEdit: !!onEdit && !!turnId && allowEdit,\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 {normalizedAttachments.length > 0 && (\n <div className={classes.attachments}>\n {renderSlot(\n slots?.attachments,\n attachmentsSlotProps,\n <AttachmentGrid\n attachments={normalizedAttachments}\n onView={attachmentsSlotProps.onView}\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=\"cursor-pointer 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=\"cursor-pointer 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} ${isCopied ? 'opacity-100' : ''}`}>\n {renderSlot(\n slots?.actions,\n actionsSlotProps,\n <>\n {!hideTimestamp && <span className={classes.timestamp}>{timestamp}</span>}\n\n <button\n onClick={handleCopyClick}\n className={`cursor-pointer ${classes.actionButton} ${isCopied ? 'text-green-600 dark:text-green-400' : ''}`}\n aria-label=\"Copy message\"\n title={isCopied ? t('message.copied') : t('message.copy')}\n >\n {isCopied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} weight=\"regular\" />}\n </button>\n\n {onEdit && turnId && allowEdit && (\n <button\n onClick={handleEditClick}\n className={`cursor-pointer ${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 /** Whether edit action should be available */\n allowEdit?: boolean\n}\n\nexport function UserTurnView({\n turn,\n slots,\n classNames,\n initials = 'U',\n hideAvatar,\n hideActions,\n hideTimestamp,\n allowEdit,\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 allowEdit={allowEdit}\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 * AssistantMessage Component (Layer 3 Composite)\n * Styled component with slot-based customization for assistant messages\n */\n\nimport { useState, useCallback, lazy, Suspense, useRef, useEffect, type ReactNode } from 'react'\nimport { Check, 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'\nimport { DebugPanel } from './DebugPanel'\nimport { useTranslation } from '../hooks/useTranslation'\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 /** When true, this is the last turn (Regenerate button shown only on last assistant message) */\n isLastTurn?: boolean\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 /** Show debug panel */\n showDebug?: boolean\n}\n\nconst COPY_FEEDBACK_MS = 2000\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 rounded-2xl rounded-bl-sm px-4 py-3 shadow-sm',\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: 'cursor-pointer p-2 text-gray-500 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 isLastTurn = false,\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 showDebug = false,\n}: AssistantMessageProps) {\n const { t } = useTranslation()\n const [explanationExpanded, setExplanationExpanded] = useState(false)\n const [isCopied, setIsCopied] = useState(false)\n const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const classes = mergeClassNames(defaultClassNames, classNameOverrides)\n const isSystemMessage = turn.role === 'system'\n const avatarClassName = isSystemMessage\n ? 'flex-shrink-0 w-8 h-8 rounded-full bg-gray-500 dark:bg-gray-600 flex items-center justify-center text-white font-medium text-xs'\n : classes.avatar\n const bubbleClassName = isSystemMessage\n ? 'bg-gray-50 dark:bg-gray-900/40 rounded-2xl px-4 py-3 shadow-sm'\n : classes.bubble\n\n useEffect(() => {\n return () => {\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current)\n copyFeedbackTimeoutRef.current = null\n }\n }\n }, [])\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 try {\n if (onCopy) {\n await onCopy(turn.content)\n } else {\n await navigator.clipboard.writeText(turn.content)\n }\n\n setIsCopied(true)\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current)\n }\n copyFeedbackTimeoutRef.current = setTimeout(() => {\n setIsCopied(false)\n copyFeedbackTimeoutRef.current = null\n }, COPY_FEEDBACK_MS)\n } catch (err) {\n setIsCopied(false)\n console.error('Failed to copy:', err)\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: isSystemMessage ? 'SYS' : '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 && !isSystemMessage && isLastTurn ? handleRegenerateClick : undefined,\n timestamp,\n canCopy: hasContent,\n canRegenerate: !!onRegenerate && !!turnId && !isSystemMessage && isLastTurn,\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={avatarClassName}>\n {renderSlot(slots?.avatar, avatarSlotProps, isSystemMessage ? 'SYS' : '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 {/* Message bubble */}\n {hasContent && (\n <div className={bubbleClassName}>\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=\"cursor-pointer 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\">{t('assistant.explanation')}</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\n {showDebug && <DebugPanel trace={turn.debug} />}\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 {/* Inline Question Form */}\n {hasPendingQuestion && pendingQuestion && (\n <InlineQuestionForm pendingQuestion={pendingQuestion} />\n )}\n\n {/* Actions */}\n {hasContent && !hideActions && (\n <div className={`${classes.actions} ${isCopied ? 'opacity-100' : ''}`}>\n {renderSlot(\n slots?.actions,\n actionsSlotProps,\n <>\n {!hideTimestamp && <span className={classes.timestamp}>{timestamp}</span>}\n\n <button\n onClick={handleCopyClick}\n className={`cursor-pointer ${classes.actionButton} ${isCopied ? 'text-green-600 dark:text-green-400' : ''}`}\n aria-label=\"Copy message\"\n title={isCopied ? t('message.copied') : t('message.copy')}\n >\n {isCopied ? <Check size={14} weight=\"bold\" /> : <Copy size={14} weight=\"regular\" />}\n </button>\n\n {onRegenerate && turnId && !isSystemMessage && isLastTurn && (\n <button\n onClick={handleRegenerateClick}\n className={`cursor-pointer ${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 * SourcesPanel component\n * Displays citations and sources\n * Uses @headlessui/react Disclosure for accessible expand/collapse\n */\n\nimport { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/react'\nimport { Citation } from '../types'\n\ninterface SourcesPanelProps {\n citations: Citation[]\n}\n\nexport function SourcesPanel({ citations }: SourcesPanelProps) {\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 <Disclosure>\n {({ open }) => (\n <>\n <DisclosureButton className=\"cursor-pointer 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 <svg\n className={`w-4 h-4 transition-transform duration-150 ${open ? '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 </DisclosureButton>\n <DisclosurePanel 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 </DisclosurePanel>\n </>\n )}\n </Disclosure>\n </div>\n )\n}\n","/**\n * DownloadCard component\n * File-download card for artifacts (Excel, PDF)\n * with type-specific icon, metadata, and download action.\n */\n\nimport { DownloadSimple } from '@phosphor-icons/react'\nimport type { Artifact } from '../types'\nimport { getFileVisual } from '../utils/fileUtils'\n\ninterface DownloadCardProps {\n artifact: Artifact\n}\n\nconst MIME_BY_TYPE: Record<string, string> = {\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n pdf: 'application/pdf',\n}\n\nexport function DownloadCard({ artifact }: DownloadCardProps) {\n const { type, filename, url, sizeReadable, rowCount, description } = artifact\n const visual = getFileVisual(MIME_BY_TYPE[type], filename)\n const Icon = visual.icon\n\n return (\n <a\n href={url}\n download={filename}\n className={[\n 'group/dl flex items-center gap-2.5 rounded-xl',\n 'border border-gray-200/80 dark:border-gray-700/60',\n 'bg-white dark:bg-gray-800/60',\n 'px-2.5 py-2',\n 'transition-all duration-150',\n 'hover:border-gray-300 dark:hover:border-gray-600',\n 'hover:shadow-sm',\n 'hover:-translate-y-px active:translate-y-0',\n ].join(' ')}\n >\n {/* File type icon */}\n <div className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor}`}>\n <Icon size={20} weight=\"duotone\" className={visual.iconColor} />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-[13px] font-medium text-gray-900 dark:text-gray-100 truncate\">\n {filename}\n </span>\n <span className=\"flex-shrink-0 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider rounded bg-gray-100 dark:bg-gray-700 text-gray-500 dark:text-gray-400\">\n {visual.label}\n </span>\n </div>\n {(sizeReadable || rowCount !== undefined) && (\n <div className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n {sizeReadable && <span>{sizeReadable}</span>}\n {sizeReadable && rowCount !== undefined && (\n <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n )}\n {rowCount !== undefined && (\n <span>{rowCount.toLocaleString()} rows</span>\n )}\n </div>\n )}\n {description && (\n <p className=\"mt-0.5 text-[11px] text-gray-400 dark:text-gray-500 line-clamp-1\">\n {description}\n </p>\n )}\n </div>\n\n {/* Download arrow */}\n <div className=\"flex-shrink-0 p-1 text-gray-400 dark:text-gray-500 group-hover/dl:text-gray-600 dark:group-hover/dl:text-gray-300 transition-colors duration-150\">\n <DownloadSimple\n size={16}\n weight=\"bold\"\n className=\"transition-transform duration-200 group-hover/dl:translate-y-0.5\"\n />\n </div>\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: Clickable option cards (radio) + always-present \"Other\" text input\n * - MULTIPLE_CHOICE: Clickable option cards (checkbox) + always-present \"Other\" text input\n */\n\nimport { useState, useCallback } from 'react'\nimport {\n ArrowLeft,\n ArrowRight,\n Check,\n ChatCircleDots,\n PencilSimpleLine,\n PaperPlaneTilt,\n X,\n} 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, handleRejectPendingQuestion, 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 const canProceed = isCurrentAnswerValid()\n\n return (\n <div className=\"animate-slide-up rounded-2xl border border-primary-200 dark:border-primary-800/50 bg-gradient-to-b from-primary-50/80 to-white dark:from-primary-950/30 dark:to-gray-900/80 shadow-sm overflow-hidden\">\n <form onSubmit={handleSubmit}>\n {/* Header bar */}\n <div className=\"flex items-center gap-2.5 px-4 pt-4 pb-3\">\n <div className=\"flex items-center justify-center w-7 h-7 rounded-lg bg-primary-100 dark:bg-primary-900/40\">\n <ChatCircleDots className=\"w-4 h-4 text-primary-600 dark:text-primary-400\" weight=\"fill\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-primary-600 dark:text-primary-400\">\n Input needed\n </span>\n {totalSteps > 1 && (\n <span className=\"text-[11px] tabular-nums text-gray-400 dark:text-gray-500\">\n {currentStep + 1}/{totalSteps}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleRejectPendingQuestion}\n disabled={loading}\n className=\"cursor-pointer p-1 rounded-md text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors disabled:opacity-40\"\n aria-label=\"Dismiss\"\n >\n <X size={16} weight=\"bold\" />\n </button>\n </div>\n\n {/* Progress dots for multi-step */}\n {totalSteps > 1 && (\n <div className=\"flex items-center gap-1.5 px-4 pb-3\">\n {questions.map((_, index) => {\n const isCompleted = index < currentStep\n const isCurrent = index === currentStep\n return (\n <div\n key={index}\n className={[\n 'h-1 rounded-full transition-all duration-300',\n isCurrent ? 'flex-[2] bg-primary-500 dark:bg-primary-400' : 'flex-1',\n isCompleted\n ? 'bg-primary-400 dark:bg-primary-500'\n : !isCurrent\n ? 'bg-gray-200 dark:bg-gray-700'\n : '',\n ].join(' ')}\n />\n )\n })}\n </div>\n )}\n\n {/* Question text */}\n <div className=\"px-4 pb-3\">\n <p className=\"text-[15px] leading-relaxed text-gray-800 dark:text-gray-200\">\n {currentQuestion.text}\n </p>\n {isMultiSelect && (\n <p className=\"mt-1 text-xs text-gray-400 dark:text-gray-500\">\n Select all that apply\n </p>\n )}\n </div>\n\n {/* Options as clickable cards */}\n <div className=\"px-4 pb-2 space-y-1.5\">\n {options.map((option) => {\n const isSelected = currentAnswer?.options.includes(option.label) || false\n return (\n <label\n key={option.id}\n className={[\n 'group/opt flex items-center gap-3 px-3 py-2.5 rounded-xl cursor-pointer',\n 'border transition-all duration-150',\n isSelected\n ? 'border-primary-300 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/30 shadow-sm'\n : 'border-transparent hover:border-gray-200 dark:hover:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800/50',\n ].join(' ')}\n >\n {/* Custom indicator */}\n <span\n className={[\n 'flex-shrink-0 flex items-center justify-center w-5 h-5 transition-all duration-150',\n isMultiSelect ? 'rounded-md' : 'rounded-full',\n isSelected\n ? 'bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 text-white shadow-sm'\n : 'border-2 border-gray-300 dark:border-gray-600 group-hover/opt:border-gray-400 dark:group-hover/opt:border-gray-500',\n ].join(' ')}\n >\n {isSelected && <Check size={12} weight=\"bold\" />}\n </span>\n <input\n type={isMultiSelect ? 'checkbox' : 'radio'}\n name={`question-${currentQuestion.id}`}\n value={option.value}\n checked={isSelected}\n onChange={(e) => handleOptionChange(option.label, e.target.checked)}\n className=\"sr-only\"\n />\n <span className={[\n 'text-sm transition-colors duration-150',\n isSelected\n ? 'text-gray-900 dark:text-gray-100 font-medium'\n : 'text-gray-700 dark:text-gray-300',\n ].join(' ')}>\n {option.label}\n </span>\n </label>\n )\n })}\n\n {/* \"Other\" option */}\n <label\n className={[\n 'group/opt flex items-center gap-3 px-3 py-2.5 rounded-xl cursor-pointer',\n 'border transition-all duration-150',\n isOtherSelected\n ? 'border-primary-300 dark:border-primary-600 bg-primary-50 dark:bg-primary-900/30 shadow-sm'\n : 'border-transparent hover:border-gray-200 dark:hover:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800/50',\n ].join(' ')}\n >\n <span\n className={[\n 'flex-shrink-0 flex items-center justify-center w-5 h-5 transition-all duration-150',\n isMultiSelect ? 'rounded-md' : 'rounded-full',\n isOtherSelected\n ? 'bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 text-white shadow-sm'\n : 'border-2 border-gray-300 dark:border-gray-600 group-hover/opt:border-gray-400 dark:group-hover/opt:border-gray-500',\n ].join(' ')}\n >\n {isOtherSelected && <PencilSimpleLine size={11} weight=\"bold\" />}\n </span>\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=\"sr-only\"\n />\n <span className={[\n 'text-sm transition-colors duration-150',\n isOtherSelected\n ? 'text-gray-900 dark:text-gray-100 font-medium'\n : 'text-gray-700 dark:text-gray-300',\n ].join(' ')}>\n Other\n </span>\n </label>\n\n {/* Other text input — slides open */}\n {isOtherSelected && (\n <div className=\"pl-8 pr-1 pb-1 animate-slide-up\">\n <input\n type=\"text\"\n value={currentOtherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n placeholder=\"Type your answer...\"\n autoFocus\n className=\"w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 dark:placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-primary-500/40 focus:border-primary-400 dark:focus:border-primary-600 transition-shadow\"\n />\n </div>\n )}\n </div>\n\n {/* Footer with navigation */}\n <div className=\"flex items-center justify-between gap-2 px-4 pt-2 pb-4\">\n <div>\n {!isFirstStep && (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"cursor-pointer flex items-center gap-1 px-2.5 py-1.5 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\"\n >\n <ArrowLeft size={14} weight=\"bold\" />\n Back\n </button>\n )}\n </div>\n\n <button\n type=\"submit\"\n disabled={loading || !canProceed}\n className={[\n 'flex items-center gap-1.5 px-4 py-2 text-sm font-medium rounded-xl transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2',\n canProceed\n ? 'cursor-pointer bg-primary-600 hover:bg-primary-700 active:bg-primary-800 text-white shadow-sm hover:shadow'\n : 'bg-gray-100 dark:bg-gray-800 text-gray-400 dark:text-gray-600 cursor-not-allowed',\n ].join(' ')}\n >\n {isLastStep ? (\n <>\n Submit\n <PaperPlaneTilt size={14} weight=\"fill\" />\n </>\n ) : (\n <>\n Next\n <ArrowRight size={14} weight=\"bold\" />\n </>\n )}\n </button>\n </div>\n </form>\n </div>\n )\n}\n","import type { DebugUsage } from '../types'\n\nexport function formatGenerationDuration(generationMs: number): string {\n return generationMs > 1000 ? `${(generationMs / 1000).toFixed(2)}s` : `${generationMs}ms`\n}\n\nexport function formatDuration(durationMs: number): string {\n return durationMs > 1000 ? `${(durationMs / 1000).toFixed(2)}s` : `${durationMs}ms`\n}\n\nexport function calculateCompletionTokensPerSecond(\n usage?: DebugUsage,\n generationMs?: number\n): number | null {\n if (!usage || !generationMs || generationMs <= 0 || usage.completionTokens <= 0) {\n return null\n }\n\n return usage.completionTokens / (generationMs / 1000)\n}\n\nexport function calculateContextUsagePercent(\n promptTokens: number,\n effectiveMaxTokens?: number\n): number | null {\n if (!effectiveMaxTokens || effectiveMaxTokens <= 0 || promptTokens <= 0) {\n return null\n }\n\n return (promptTokens / effectiveMaxTokens) * 100\n}\n","/**\n * DebugPanel Component\n * Beautiful debug trace viewer with metric cards, expandable tool calls,\n * and terminal-inspired code blocks.\n */\n\nimport { useState, useRef, useEffect, type ReactNode } from 'react'\nimport {\n Bug,\n Timer,\n Lightning,\n Wrench,\n CaretDown,\n CheckCircle,\n XCircle,\n Copy,\n Check,\n CircleNotch,\n ArrowUp,\n ArrowDown,\n Stack,\n Database,\n} from '@phosphor-icons/react'\nimport type { DebugTrace, StreamToolPayload } from '../types'\nimport { hasMeaningfulUsage, hasDebugTrace } from '../utils/debugTrace'\nimport {\n calculateCompletionTokensPerSecond,\n formatDuration,\n formatGenerationDuration,\n} from '../utils/debugMetrics'\nimport { useTranslation } from '../hooks/useTranslation'\n\nexport interface DebugPanelProps {\n trace?: DebugTrace\n}\n\n// ─── CopyPill ───────────────────────────────────────────────\n\nfunction CopyPill({ text, label, copiedLabel }: { text: string; label: string; copiedLabel: string }) {\n const [copied, setCopied] = useState(false)\n const timerRef = useRef<number | null>(null)\n\n useEffect(() => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }, [])\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation()\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n timerRef.current = window.setTimeout(() => {\n setCopied(false)\n timerRef.current = null\n }, 2000)\n } catch (err) {\n console.error('Copy failed:', err)\n }\n }\n\n return (\n <button\n onClick={handleCopy}\n className={[\n 'flex items-center gap-1 px-2 py-0.5 rounded-md text-[10px] font-medium',\n 'transition-all duration-200',\n copied\n ? 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-600 dark:text-emerald-400'\n : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700/50',\n ].join(' ')}\n >\n {copied ? <Check size={10} weight=\"bold\" /> : <Copy size={10} />}\n <span>{copied ? copiedLabel : label}</span>\n </button>\n )\n}\n\n// ─── MetricCard ─────────────────────────────────────────────\n\ninterface MetricCardProps {\n icon: ReactNode\n value: string\n label: string\n accentBorder: string\n accentBg: string\n}\n\nfunction MetricCard({ icon, value, label, accentBorder, accentBg }: MetricCardProps) {\n return (\n <div\n className={[\n 'flex items-center gap-2.5 p-2.5 rounded-lg',\n 'border border-gray-200/60 dark:border-gray-700/40',\n 'border-l-2', accentBorder,\n 'bg-gray-50/40 dark:bg-gray-800/30',\n 'hover:bg-white dark:hover:bg-gray-800/60',\n 'hover:shadow-[0_1px_3px_rgba(0,0,0,0.04)] dark:hover:shadow-[0_1px_3px_rgba(0,0,0,0.2)]',\n 'transition-all duration-150',\n ].join(' ')}\n >\n <div\n className={[\n 'flex-shrink-0 flex items-center justify-center w-7 h-7 rounded-lg',\n accentBg,\n ].join(' ')}\n >\n {icon}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-mono font-semibold text-sm text-gray-900 dark:text-gray-50 tabular-nums leading-none\">\n {value}\n </div>\n <div className=\"text-[10px] uppercase tracking-wider text-gray-400 dark:text-gray-500 mt-1 leading-none\">\n {label}\n </div>\n </div>\n </div>\n )\n}\n\n// ─── ToolCard ───────────────────────────────────────────────\n\nfunction ToolCard({ tool }: { tool: StreamToolPayload }) {\n const [expanded, setExpanded] = useState(false)\n const { t } = useTranslation()\n\n const hasResult = !!tool.result && !tool.error\n const hasError = !!tool.error\n\n const status = hasError\n ? {\n icon: <XCircle size={12} weight=\"fill\" />,\n pillBg: 'bg-red-50 dark:bg-red-950/30',\n pillText: 'text-red-500 dark:text-red-400',\n borderColor: 'border-l-red-400 dark:border-l-red-500',\n }\n : hasResult\n ? {\n icon: <CheckCircle size={12} weight=\"fill\" />,\n pillBg: 'bg-emerald-50 dark:bg-emerald-950/30',\n pillText: 'text-emerald-500 dark:text-emerald-400',\n borderColor: 'border-l-emerald-400 dark:border-l-emerald-500',\n }\n : {\n icon: <CircleNotch size={12} weight=\"bold\" className=\"animate-spin\" />,\n pillBg: 'bg-gray-100 dark:bg-gray-800',\n pillText: 'text-gray-400 dark:text-gray-500',\n borderColor: 'border-l-gray-300 dark:border-l-gray-600',\n }\n\n return (\n <div\n className={[\n 'rounded-lg overflow-hidden',\n 'border border-gray-200/60 dark:border-gray-700/40',\n 'border-l-2', status.borderColor,\n 'bg-white dark:bg-gray-800/50',\n 'transition-all duration-150',\n ].join(' ')}\n >\n {/* Header */}\n <button\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n aria-label={`${tool.name} — ${hasError ? 'error' : hasResult ? 'success' : 'pending'}`}\n className=\"w-full flex items-center gap-2.5 px-3 py-2.5 hover:bg-gray-50/60 dark:hover:bg-gray-700/20 transition-colors cursor-pointer\"\n >\n {/* Status pill */}\n <span className={`flex items-center justify-center w-5 h-5 rounded-full ${status.pillBg} ${status.pillText}`}>\n {status.icon}\n </span>\n\n {/* Tool name */}\n <span className=\"flex-1 min-w-0 text-left font-mono text-xs font-medium text-gray-800 dark:text-gray-200 truncate\">\n {tool.name}\n </span>\n\n {/* Duration chip */}\n {tool.durationMs !== undefined && (\n <span className=\"flex-shrink-0 px-2 py-0.5 rounded-full bg-gray-100 dark:bg-gray-700/60 text-[10px] font-mono font-medium text-gray-500 dark:text-gray-400 tabular-nums\">\n {formatDuration(tool.durationMs)}\n </span>\n )}\n\n {/* Chevron */}\n <CaretDown\n size={12}\n weight=\"bold\"\n className={[\n 'flex-shrink-0 text-gray-300 dark:text-gray-600',\n 'transition-transform duration-200',\n expanded ? 'rotate-180' : '',\n ].join(' ')}\n />\n </button>\n\n {/* Expandable content — CSS grid animation for smooth height */}\n <div\n className={[\n 'grid transition-[grid-template-rows] duration-200 ease-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n ].join(' ')}\n >\n <div className=\"overflow-hidden min-h-0\">\n <div className=\"px-3 pb-3 pt-1 space-y-2\">\n {/* Arguments — terminal-style dark code block */}\n {tool.arguments && (\n <div className=\"rounded-lg bg-[#1a1b26] dark:bg-gray-950 overflow-hidden ring-1 ring-gray-800/10 dark:ring-white/5\">\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-[#1e1f2e] dark:bg-gray-900/80 border-b border-white/5\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-gray-500\">\n {t('slash.debugArguments')}\n </span>\n <CopyPill\n text={tool.arguments}\n label={t('slash.debugCopyTrace')}\n copiedLabel={t('slash.debugCopied')}\n />\n </div>\n <pre className=\"p-3 text-[11px] font-mono text-gray-300 overflow-x-auto max-h-60 overflow-y-auto whitespace-pre-wrap break-all leading-relaxed\">\n {tool.arguments}\n </pre>\n </div>\n )}\n\n {/* Result — terminal-style dark code block */}\n {tool.result && (\n <div className=\"rounded-lg bg-[#1a1b26] dark:bg-gray-950 overflow-hidden ring-1 ring-gray-800/10 dark:ring-white/5\">\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-[#1e1f2e] dark:bg-gray-900/80 border-b border-white/5\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-gray-500\">\n {t('slash.debugResult')}\n </span>\n <CopyPill\n text={tool.result}\n label={t('slash.debugCopyTrace')}\n copiedLabel={t('slash.debugCopied')}\n />\n </div>\n <pre className=\"p-3 text-[11px] font-mono text-gray-300 overflow-x-auto max-h-60 overflow-y-auto whitespace-pre-wrap break-all leading-relaxed\">\n {tool.result}\n </pre>\n </div>\n )}\n\n {/* Error — red-tinted dark block */}\n {tool.error && (\n <div className=\"rounded-lg bg-red-950/80 dark:bg-red-950/40 overflow-hidden ring-1 ring-red-800/20\">\n <div className=\"px-3 py-1.5 border-b border-red-800/20\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-red-400\">\n {t('slash.debugError')}\n </span>\n </div>\n <pre className=\"p-3 text-[11px] font-mono text-red-300 overflow-x-auto whitespace-pre-wrap break-all leading-relaxed\">\n {tool.error}\n </pre>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ─── DebugPanel ─────────────────────────────────────────────\n\nexport function DebugPanel({ trace }: DebugPanelProps) {\n const { t } = useTranslation()\n const hasData = !!trace && hasDebugTrace(trace)\n\n const tokensPerSecond = calculateCompletionTokensPerSecond(trace?.usage, trace?.generationMs)\n\n // Build metric list from available data\n const metrics: MetricCardProps[] = []\n\n if (hasData && trace) {\n if (trace.generationMs !== undefined) {\n metrics.push({\n icon: <Timer size={14} weight=\"duotone\" className=\"text-amber-600 dark:text-amber-400\" />,\n value: formatGenerationDuration(trace.generationMs),\n label: t('slash.debugGeneration'),\n accentBorder: 'border-l-amber-400 dark:border-l-amber-500',\n accentBg: 'bg-amber-50 dark:bg-amber-950/30',\n })\n }\n if (tokensPerSecond !== null) {\n metrics.push({\n icon: <Lightning size={14} weight=\"fill\" className=\"text-orange-500 dark:text-orange-400\" />,\n value: `${tokensPerSecond.toFixed(1)}/s`,\n label: t('slash.debugTokensPerSecond'),\n accentBorder: 'border-l-orange-400 dark:border-l-orange-500',\n accentBg: 'bg-orange-50 dark:bg-orange-950/30',\n })\n }\n if (hasMeaningfulUsage(trace.usage) && trace.usage) {\n metrics.push(\n {\n icon: <Stack size={14} weight=\"duotone\" className=\"text-violet-600 dark:text-violet-400\" />,\n value: trace.usage.totalTokens.toLocaleString(),\n label: t('slash.debugTotalTokens'),\n accentBorder: 'border-l-violet-400 dark:border-l-violet-500',\n accentBg: 'bg-violet-50 dark:bg-violet-950/30',\n },\n {\n icon: <ArrowUp size={14} weight=\"bold\" className=\"text-blue-600 dark:text-blue-400\" />,\n value: trace.usage.promptTokens.toLocaleString(),\n label: t('slash.debugPromptTokens'),\n accentBorder: 'border-l-blue-400 dark:border-l-blue-500',\n accentBg: 'bg-blue-50 dark:bg-blue-950/30',\n },\n {\n icon: <ArrowDown size={14} weight=\"bold\" className=\"text-indigo-600 dark:text-indigo-400\" />,\n value: trace.usage.completionTokens.toLocaleString(),\n label: t('slash.debugCompletionTokens'),\n accentBorder: 'border-l-indigo-400 dark:border-l-indigo-500',\n accentBg: 'bg-indigo-50 dark:bg-indigo-950/30',\n },\n )\n if (trace.usage.cachedTokens !== undefined && trace.usage.cachedTokens > 0) {\n metrics.push({\n icon: <Database size={14} weight=\"duotone\" className=\"text-pink-600 dark:text-pink-400\" />,\n value: trace.usage.cachedTokens.toLocaleString(),\n label: t('slash.debugCachedTokens'),\n accentBorder: 'border-l-pink-400 dark:border-l-pink-500',\n accentBg: 'bg-pink-50 dark:bg-pink-950/30',\n })\n }\n }\n }\n\n return (\n <div className=\"mt-4 pt-4 border-t border-gray-100 dark:border-gray-700/50\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2.5\">\n <div className=\"flex items-center justify-center w-6 h-6 rounded-lg bg-gray-100 dark:bg-gray-800\">\n <Bug size={14} weight=\"duotone\" className=\"text-gray-500 dark:text-gray-400\" />\n </div>\n <h3 className=\"text-[11px] uppercase tracking-widest font-semibold text-gray-400 dark:text-gray-500\">\n {t('slash.debugPanelTitle')}\n </h3>\n </div>\n {hasData && trace && (\n <CopyPill\n text={JSON.stringify(trace, null, 2)}\n label={t('slash.debugCopyTrace')}\n copiedLabel={t('slash.debugCopied')}\n />\n )}\n </div>\n\n {hasData && trace ? (\n <div className=\"space-y-4\">\n {/* Metric cards */}\n {metrics.length > 0 && (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-2\">\n {metrics.map((m, i) => (\n <MetricCard key={i} {...m} />\n ))}\n </div>\n )}\n\n {/* Tool calls */}\n {trace.tools.length > 0 && (\n <div>\n <div className=\"flex items-center gap-2 mb-2.5\">\n <Wrench size={13} weight=\"duotone\" className=\"text-gray-400 dark:text-gray-500\" />\n <span className=\"text-[11px] font-medium text-gray-500 dark:text-gray-400\">\n {t('slash.debugToolCalls')}\n </span>\n <span className=\"px-1.5 py-0.5 rounded-full bg-gray-100 dark:bg-gray-800 text-[10px] font-mono font-medium text-gray-500 dark:text-gray-400 tabular-nums\">\n {trace.tools.length}\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {trace.tools.map((tool, idx) => (\n <ToolCard key={`${tool.callId || tool.name}-${idx}`} tool={tool} />\n ))}\n </div>\n </div>\n )}\n </div>\n ) : (\n <p className=\"text-xs text-gray-400 dark:text-gray-500 italic\">\n {t('slash.debugUnavailable')}\n </p>\n )}\n </div>\n )\n}\n\nexport default DebugPanel\n","import { useCallback, useEffect, useRef, useState, lazy, Suspense } from 'react'\nimport { CaretDown, Check, Copy, ClockCounterClockwise } from '@phosphor-icons/react'\nimport { formatDistanceToNow } from 'date-fns'\nimport { useTranslation } from '../hooks/useTranslation'\n\nconst MarkdownRenderer = lazy(() =>\n import('./MarkdownRenderer').then((module) => ({ default: module.MarkdownRenderer }))\n)\n\nconst COPY_FEEDBACK_MS = 2000\nconst COLLAPSED_HEIGHT = 160\n\ninterface SystemMessageProps {\n content: string\n createdAt: string\n onCopy?: (content: string) => Promise<void> | void\n hideActions?: boolean\n hideTimestamp?: boolean\n}\n\nexport function SystemMessage({\n content,\n createdAt,\n onCopy,\n hideActions = false,\n hideTimestamp = false,\n}: SystemMessageProps) {\n const { t } = useTranslation()\n const [isCopied, setIsCopied] = useState(false)\n const [isExpanded, setIsExpanded] = useState(false)\n const [isExpandable, setIsExpandable] = useState(false)\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined)\n const copyFeedbackTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n return () => {\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current)\n copyFeedbackTimeoutRef.current = null\n }\n }\n }, [])\n\n useEffect(() => {\n const node = contentRef.current\n if (!node) return\n\n const measure = () => {\n const scrollH = node.scrollHeight\n setContentHeight(scrollH)\n if (!isExpanded) {\n setIsExpandable(scrollH > COLLAPSED_HEIGHT + 1)\n }\n }\n\n measure()\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(measure)\n observer.observe(node)\n return () => observer.disconnect()\n }\n\n window.addEventListener('resize', measure)\n return () => window.removeEventListener('resize', measure)\n }, [content, isExpanded])\n\n const handleCopyClick = useCallback(async () => {\n try {\n if (onCopy) {\n await onCopy(content)\n } else {\n await navigator.clipboard.writeText(content)\n }\n\n setIsCopied(true)\n if (copyFeedbackTimeoutRef.current) {\n clearTimeout(copyFeedbackTimeoutRef.current)\n }\n copyFeedbackTimeoutRef.current = setTimeout(() => {\n setIsCopied(false)\n copyFeedbackTimeoutRef.current = null\n }, COPY_FEEDBACK_MS)\n } catch {\n setIsCopied(false)\n }\n }, [content, onCopy])\n\n const timestamp = formatDistanceToNow(new Date(createdAt), { addSuffix: true })\n\n const resolvedHeight = isExpanded ? contentHeight : COLLAPSED_HEIGHT\n\n return (\n <div className=\"flex justify-center\">\n <div className=\"w-full max-w-3xl px-2 sm:px-4\">\n <div className=\"relative overflow-hidden rounded-xl border border-gray-200/80 dark:border-gray-700/60 bg-gradient-to-b from-gray-50/80 to-gray-100/40 dark:from-gray-800/40 dark:to-gray-900/30 shadow-[0_1px_3px_rgba(0,0,0,0.04)] dark:shadow-[0_1px_3px_rgba(0,0,0,0.2)]\">\n {/* Top accent line */}\n <div className=\"absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-gray-300/40 dark:via-gray-600/20 to-transparent\" />\n\n {/* Header */}\n <div className=\"flex items-center gap-2 px-4 pt-3 pb-2\">\n <div className=\"flex items-center gap-1.5 text-gray-400 dark:text-gray-500\">\n <ClockCounterClockwise size={13} weight=\"bold\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-wider\">\n {t('system.conversationSummary')}\n </span>\n </div>\n\n <div className=\"flex-1\" />\n\n {!hideActions && !hideTimestamp && (\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500 tabular-nums\">\n {timestamp}\n </span>\n )}\n\n {!hideActions && (\n <button\n onClick={handleCopyClick}\n className={`\n cursor-pointer -mr-1 p-1 rounded-md transition-all duration-150\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n ${isCopied\n ? 'text-green-600 dark:text-green-400'\n : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-200/50 dark:hover:bg-gray-700/40'\n }\n `}\n aria-label=\"Copy message\"\n title={isCopied ? t('message.copied') : t('message.copy')}\n >\n {isCopied ? <Check size={13} weight=\"bold\" /> : <Copy size={13} weight=\"regular\" />}\n </button>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"mx-4 border-t border-gray-200/60 dark:border-gray-700/40\" />\n\n {/* Content area */}\n <div className=\"relative\">\n <div\n ref={contentRef}\n className=\"px-4 pt-3 text-[13px] leading-relaxed text-gray-600 dark:text-gray-400 overflow-hidden transition-[max-height] duration-300 ease-in-out\"\n style={{ maxHeight: resolvedHeight ? `${resolvedHeight}px` : undefined }}\n >\n <Suspense\n fallback={\n <div className=\"flex items-center gap-2 text-sm text-gray-400 dark:text-gray-500 py-2\">\n <div className=\"w-3.5 h-3.5 border-[1.5px] border-gray-300 dark:border-gray-600 border-t-transparent rounded-full animate-spin\" />\n <span className=\"text-xs\">{t('system.loadingSummary')}</span>\n </div>\n }\n >\n <MarkdownRenderer content={content} sendDisabled />\n </Suspense>\n </div>\n\n {/* Fade overlay when collapsed */}\n {isExpandable && !isExpanded && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-20 bg-gradient-to-t from-gray-100/95 via-gray-100/60 to-transparent dark:from-gray-900/95 dark:via-gray-900/50\" />\n )}\n </div>\n\n {/* Expand/collapse toggle */}\n {isExpandable && (\n <div className=\"relative px-4 pb-3 pt-1 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded((prev) => !prev)}\n aria-expanded={isExpanded}\n className=\"cursor-pointer group/toggle inline-flex items-center gap-1 px-3 py-1 rounded-full text-[11px] font-medium text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 hover:bg-gray-200/60 dark:hover:bg-gray-700/50 transition-colors duration-150\"\n >\n <span>{isExpanded ? t('system.showLess') : t('system.showMore')}</span>\n <CaretDown\n size={11}\n weight=\"bold\"\n className={`transition-transform duration-300 ${isExpanded ? 'rotate-180' : ''}`}\n />\n </button>\n </div>\n )}\n\n {/* Bottom spacing when not expandable */}\n {!isExpandable && <div className=\"pb-3\" />}\n </div>\n </div>\n </div>\n )\n}\n\nexport default SystemMessage\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 { SystemMessage } from './SystemMessage'\nimport type { ConversationTurn } from '../types'\n\nexport interface AssistantTurnViewProps {\n /** The conversation turn containing the assistant response */\n turn: ConversationTurn\n /** When true, this is the last turn in the list (Regenerate button shown only on last assistant message) */\n isLastTurn?: boolean\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 isLastTurn = false,\n isStreaming = false,\n slots,\n classNames,\n hideAvatar,\n hideActions,\n hideTimestamp,\n}: AssistantTurnViewProps) {\n const { handleCopy, handleRegenerate, pendingQuestion, sendMessage, loading, debugMode } = useChat()\n\n const assistantTurn = turn.assistantTurn\n if (!assistantTurn) return null\n\n if (assistantTurn.role === 'system') {\n return (\n <SystemMessage\n content={assistantTurn.content}\n createdAt={assistantTurn.createdAt}\n onCopy={handleCopy}\n hideActions={hideActions}\n hideTimestamp={hideTimestamp}\n />\n )\n }\n\n return (\n <AssistantMessage\n turn={assistantTurn}\n turnId={turn.id}\n isLastTurn={isLastTurn}\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 showDebug={debugMode}\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 /** When true, this turn is the last in the list (e.g. Regenerate shows only on last assistant message) */\n isLastTurn?: boolean\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 isLastTurn = false,\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 const isSystemSummaryTurn =\n turn.userTurn.content.trim() === '' && turn.assistantTurn?.role === 'system'\n\n return (\n <div className={classes.root} data-turn-id={turn.id}>\n {/* User message */}\n {!isSystemSummaryTurn && (\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\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 isLastTurn={isLastTurn}\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 * 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 * Verb transition for typing indicator\n * Smooth slide-up animation for rotating text\n */\nexport const verbTransitionVariants = {\n initial: {\n y: 16,\n opacity: 0,\n },\n animate: {\n y: 0,\n opacity: 1,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n ease: 'easeOut',\n },\n },\n exit: {\n y: -16,\n opacity: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.15,\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/**\n * Session item with subtle slide-right on hover\n */\nexport const sessionItemVariants = {\n initial: { opacity: 0, x: -20 },\n animate: {\n opacity: 1,\n x: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.3,\n },\n },\n hover: {\n x: 4,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n exit: {\n opacity: 0,\n x: -20,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n}\n\n/**\n * Error/alert message slide-in\n */\nexport const errorMessageVariants = {\n initial: { opacity: 0, y: -10, height: 0 },\n animate: {\n opacity: 1,\n y: 0,\n height: 'auto',\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.3,\n ease: [0.4, 0, 0.2, 1],\n },\n },\n exit: {\n opacity: 0,\n y: -10,\n height: 0,\n transition: {\n duration: prefersReducedMotion() ? 0 : 0.2,\n },\n },\n}\n","/**\n * TypingIndicator Component\n * Displays rotating verbs with shimmer animation to show AI is thinking/processing.\n * Verbs are configurable via props.\n */\n\nimport { useState, useEffect, memo } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { verbTransitionVariants } from '../animations/variants'\n\nexport interface TypingIndicatorProps {\n /** Custom thinking verbs to rotate through */\n verbs?: string[]\n /** Verb rotation interval in ms (defaults to 3000) */\n rotationInterval?: number\n /** Additional CSS classes */\n className?: string\n}\n\n// Default thinking verbs\nconst DEFAULT_VERBS = [\n 'Thinking',\n 'Processing',\n 'Analyzing',\n 'Synthesizing',\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 getRandomVerb = (verbs: string[], current: string): string => {\n const available = verbs.filter((v) => v !== current)\n if (available.length === 0) {\n return current || verbs[0] || 'Thinking'\n }\n return available[Math.floor(Math.random() * available.length)]\n}\n\nfunction TypingIndicator({\n verbs = DEFAULT_VERBS,\n rotationInterval = 3000,\n className = '',\n}: TypingIndicatorProps) {\n const [verb, setVerb] = useState(() => verbs[Math.floor(Math.random() * verbs.length)])\n\n useEffect(() => {\n if (prefersReducedMotion()) return\n\n const interval = setInterval(() => {\n setVerb((prev) => getRandomVerb(verbs, prev))\n }, rotationInterval)\n\n return () => clearInterval(interval)\n }, [verbs, rotationInterval])\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={`flex items-center gap-2.5 text-gray-500 dark:text-gray-400 ${className}`}\n >\n <div className=\"flex items-center gap-1\" aria-hidden=\"true\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:0ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:150ms]\" />\n <span className=\"w-1.5 h-1.5 rounded-full bg-gray-400 dark:bg-gray-500 animate-bounce motion-reduce:animate-none [animation-delay:300ms]\" />\n </div>\n <div className=\"overflow-hidden h-6 relative\">\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={verb}\n variants={verbTransitionVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n className=\"text-sm bichat-thinking-shimmer block\"\n aria-label={`AI is ${verb}`}\n >\n {verb}...\n </motion.span>\n </AnimatePresence>\n </div>\n </div>\n )\n}\n\nconst MemoizedTypingIndicator = memo(TypingIndicator)\nMemoizedTypingIndicator.displayName = 'TypingIndicator'\n\nexport { MemoizedTypingIndicator as TypingIndicator }\nexport default MemoizedTypingIndicator\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 disabled?: boolean\n /** When set, renders a pill-style button with this label (e.g. \"New messages\") */\n label?: string\n}\n\nfunction ScrollToBottomButton({\n show,\n onClick,\n unreadCount = 0,\n disabled = false,\n label,\n}: ScrollToBottomButtonProps) {\n return (\n <AnimatePresence>\n {show && (\n <div\n className=\"absolute bottom-8 z-10 pointer-events-none\"\n style={{ left: '50%', transform: 'translateX(-50%)' }}\n >\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={disabled ? undefined : onClick}\n disabled={disabled}\n className={`pointer-events-auto cursor-pointer 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 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 disabled:opacity-40 disabled:cursor-not-allowed ${\n label\n ? 'flex items-center gap-1.5 px-4 py-2 rounded-full bg-primary-600 dark:bg-primary-500 border-primary-600 dark:border-primary-500 hover:bg-primary-700 dark:hover:bg-primary-600 active:bg-primary-800 dark:active:bg-primary-700'\n : 'p-2.5 rounded-full bg-white dark:bg-gray-800'\n }`}\n aria-label={label || 'Scroll to bottom'}\n >\n {label ? (\n <>\n <span className=\"text-sm font-medium text-white\">{label}</span>\n <ArrowDown size={16} weight=\"bold\" className=\"text-white\" />\n </>\n ) : (\n <div className=\"relative\">\n <ArrowDown size={18} 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 )}\n </motion.button>\n </div>\n )}\n </AnimatePresence>\n )\n}\n\nexport { ScrollToBottomButton }\nexport default ScrollToBottomButton\n","interface CompactionDoodleProps {\n title: string\n subtitle: string\n}\n\nexport function CompactionDoodle({ title, subtitle }: CompactionDoodleProps) {\n return (\n <div className=\"rounded-2xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-4 shadow-sm\">\n <div className=\"flex items-center gap-3\">\n <div className=\"relative w-10 h-10\">\n <div className=\"absolute inset-0 rounded-full bg-primary-500/20 animate-pulse motion-reduce:animate-none\" />\n <div className=\"absolute inset-1 rounded-full bg-primary-500/40 animate-pulse motion-reduce:animate-none\" />\n <div className=\"absolute inset-3 rounded-full bg-primary-600\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-gray-100\">{title}</p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{subtitle}</p>\n </div>\n </div>\n </div>\n )\n}\n\nexport default CompactionDoodle\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 { useCallback, useEffect, useRef, useMemo, ReactNode, useState, lazy, Suspense } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { useChat } from '../context/ChatContext'\nimport { ConversationTurn } from '../types'\nimport { TurnBubble } from './TurnBubble'\nimport { TypingIndicator } from './TypingIndicator'\nimport StreamingCursor from './StreamingCursor'\nimport ScrollToBottomButton from './ScrollToBottomButton'\nimport CompactionDoodle from './CompactionDoodle'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { normalizeStreamingMarkdown } from '../utils/markdownStream'\n\nconst MarkdownRenderer = lazy(() =>\n import('./MarkdownRenderer').then((m) => ({ default: m.MarkdownRenderer }))\n)\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 /** Custom verbs for the typing indicator (e.g. ['Thinking', 'Analyzing', ...]) */\n thinkingVerbs?: string[]\n /** When true, hides edit/regenerate actions */\n readOnly?: boolean\n}\n\nexport function MessageList({ renderUserTurn, renderAssistantTurn, thinkingVerbs, readOnly }: MessageListProps) {\n const { t } = useTranslation()\n const {\n turns,\n streamingContent,\n isStreaming,\n loading,\n isCompacting,\n currentSessionId,\n fetching,\n } = useChat()\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const initialScrollSessionRef = useRef<string | undefined>(undefined)\n const [showScrollButton, setShowScrollButton] = useState(false)\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior = 'smooth') => {\n const container = containerRef.current\n if (container) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior,\n })\n return\n }\n messagesEndRef.current?.scrollIntoView({ behavior })\n }, [])\n\n // Auto-scroll to bottom on new turns or streaming content\n useEffect(() => {\n scrollToBottom('smooth')\n }, [turns.length, streamingContent, scrollToBottom])\n\n // On first open of a session, jump to latest message immediately.\n useEffect(() => {\n if (fetching || !currentSessionId || currentSessionId === 'new') return\n if (initialScrollSessionRef.current === currentSessionId) return\n\n const runInitialScroll = () => {\n scrollToBottom('auto')\n setShowScrollButton(false)\n }\n\n requestAnimationFrame(() => {\n requestAnimationFrame(runInitialScroll)\n })\n const timeoutOne = setTimeout(runInitialScroll, 80)\n const timeoutTwo = setTimeout(runInitialScroll, 200)\n const timeoutThree = setTimeout(runInitialScroll, 400)\n\n initialScrollSessionRef.current = currentSessionId\n return () => {\n clearTimeout(timeoutOne)\n clearTimeout(timeoutTwo)\n clearTimeout(timeoutThree)\n }\n }, [currentSessionId, fetching, turns.length, scrollToBottom])\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 normalizedStreaming = useMemo(\n () => (streamingContent ? normalizeStreamingMarkdown(streamingContent) : ''),\n [streamingContent]\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=\"mx-auto space-y-6\">\n {isCompacting && (\n <CompactionDoodle\n title={t('slash.compactingTitle')}\n subtitle={t('slash.compactingSubtitle')}\n />\n )}\n {/* Loading skeleton when no turns yet */}\n {fetching && turns.length === 0 && (\n <div className=\"space-y-6\" aria-hidden=\"true\">\n {/* User message skeleton */}\n <div className=\"flex justify-end\">\n <div className=\"w-3/5 max-w-md rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n {/* Assistant message skeleton */}\n <div className=\"flex gap-3\">\n <div className=\"w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse shrink-0\" />\n <div className=\"w-4/5 max-w-lg rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-5/6 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-3/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n {/* Second user message skeleton */}\n <div className=\"flex justify-end\">\n <div className=\"w-2/5 max-w-xs rounded-2xl bg-gray-100 dark:bg-gray-800 p-4 space-y-2\">\n <div className=\"h-3 w-full rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n </div>\n )}\n {turns.map((turn, index) => (\n <TurnBubble\n key={turn.id}\n turn={turn}\n isLastTurn={index === turns.length - 1}\n renderUserTurn={renderUserTurn}\n renderAssistantTurn={renderAssistantTurn}\n userTurnProps={\n readOnly\n ? { hideActions: true, allowEdit: false }\n : { allowEdit: index === turns.length - 1 }\n }\n assistantTurnProps={readOnly ? { hideActions: true } : undefined}\n />\n ))}\n {/* Typing Indicator — shown while waiting for first token */}\n <AnimatePresence>\n {loading && !streamingContent && !isCompacting && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.2 }}\n >\n <TypingIndicator verbs={thinkingVerbs} />\n </motion.div>\n )}\n </AnimatePresence>\n {/* Streaming content — shown once tokens arrive */}\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 font-medium text-xs\">\n AI\n </div>\n <div className=\"flex-1 max-w-[85%] bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-2xl rounded-bl-sm px-4 py-3 text-gray-900 dark:text-gray-100\">\n <Suspense\n fallback={\n <div className=\"prose prose-sm max-w-none dark:prose-invert whitespace-pre-wrap\">\n {streamingContent}\n </div>\n }\n >\n <MarkdownRenderer content={normalizedStreaming} sendDisabled />\n </Suspense>\n <StreamingCursor />\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </div>\n </div>\n <ScrollToBottomButton\n show={showScrollButton}\n onClick={() => scrollToBottom('smooth')}\n label={isStreaming && showScrollButton ? 'New messages' : undefined}\n />\n </div>\n )\n}\n","/**\n * Normalizes partially-streamed markdown so that react-markdown\n * can render it without layout artifacts (e.g. an unclosed code fence\n * turning the rest of the message into a code block).\n *\n * Called on every streaming content update — kept intentionally cheap (O(lines)).\n */\nexport function normalizeStreamingMarkdown(text: string): string {\n // Track unclosed code fences.\n // A code fence opens with ≥3 backticks at line start and closes with\n // the same (or more) backticks on its own line.\n const lines = text.split('\\n')\n let inCodeBlock = false\n let fenceTicks = ''\n\n for (const line of lines) {\n const trimmed = line.trimStart()\n const fenceMatch = trimmed.match(/^(`{3,})/)\n if (fenceMatch) {\n if (!inCodeBlock) {\n inCodeBlock = true\n fenceTicks = fenceMatch[1]\n } else if (trimmed.startsWith(fenceTicks) && trimmed.slice(fenceTicks.length).trim() === '') {\n inCodeBlock = false\n fenceTicks = ''\n }\n }\n }\n\n if (inCodeBlock) {\n text += '\\n' + fenceTicks\n }\n\n return text\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, useCallback, forwardRef, useImperativeHandle, useMemo } from 'react'\nimport { Paperclip, PaperPlaneRight, X, Bug, ArrowUp, ArrowDown, Stack } from '@phosphor-icons/react'\nimport AttachmentGrid from './AttachmentGrid'\nimport ImageModal from './ImageModal'\nimport {\n ATTACHMENT_ACCEPT_ATTRIBUTE,\n convertToBase64,\n createDataUrl,\n isImageMimeType,\n validateAttachmentFile,\n validateFileCount,\n} from '../utils/fileUtils'\nimport { calculateContextUsagePercent } from '../utils/debugMetrics'\nimport type { Attachment, ImageAttachment, DebugLimits, QueuedMessage, SessionDebugUsage } 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 commandError?: string | null\n debugMode?: boolean\n debugSessionUsage?: SessionDebugUsage\n debugLimits?: DebugLimits | null\n messageQueue?: QueuedMessage[]\n onClearCommandError?: () => void\n onMessageChange: (value: string) => void\n onSubmit: (e: React.FormEvent, attachments: Attachment[]) => void\n onUnqueue?: () => { content: string; attachments: Attachment[] } | null\n placeholder?: string\n maxFiles?: number\n maxFileSize?: number\n containerClassName?: string\n formClassName?: 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 commandError = null,\n debugMode = false,\n debugSessionUsage,\n debugLimits = null,\n messageQueue = [],\n onClearCommandError,\n onMessageChange,\n onSubmit,\n onUnqueue,\n placeholder: placeholderOverride,\n maxFiles = MAX_FILES_DEFAULT,\n maxFileSize = MAX_FILE_SIZE_DEFAULT,\n containerClassName,\n formClassName,\n },\n ref\n ) => {\n const { t } = useTranslation()\n const [attachments, setAttachments] = useState<Attachment[]>([])\n const [isDragging, setIsDragging] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [isFocused, setIsFocused] = useState(false)\n const [commandListDismissed, setCommandListDismissed] = useState(false)\n const [activeCommandIndex, setActiveCommandIndex] = useState(0)\n const [isComposing, setIsComposing] = useState(false)\n const [dropSuccess, setDropSuccess] = useState(false)\n const [pendingFileCount, setPendingFileCount] = useState(0)\n const [viewingImageIndex, setViewingImageIndex] = useState<number | null>(null)\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 const formRef = useRef<HTMLFormElement>(null)\n const commandItemRefs = useRef<Array<HTMLLIElement | null>>([])\n const didAutoFocusRef = useRef(false)\n const isSlashMode = message.trimStart().startsWith('/')\n const commandQuery = message.trimStart().slice(1).split(/\\s+/)[0]?.toLowerCase() || ''\n\n const slashCommands = useMemo(\n () => [\n { name: '/clear', description: t('slash.clearDescription') },\n { name: '/debug', description: t('slash.debugDescription') },\n { name: '/compact', description: t('slash.compactDescription') },\n ],\n [t]\n )\n const filteredCommands = useMemo(\n () =>\n slashCommands.filter((cmd) =>\n cmd.name.slice(1).startsWith(commandQuery)\n ),\n [commandQuery, slashCommands]\n )\n const isCommandListVisible = isSlashMode && !commandListDismissed && !loading && !disabled\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 (didAutoFocusRef.current || loading || disabled || fetching) return\n\n const frame = requestAnimationFrame(() => {\n textareaRef.current?.focus()\n didAutoFocusRef.current = true\n })\n\n return () => cancelAnimationFrame(frame)\n }, [loading, disabled, fetching])\n\n useEffect(() => {\n if (!error) return\n const timer = setTimeout(() => setError(null), 5000)\n return () => clearTimeout(timer)\n }, [error])\n\n useEffect(() => {\n if (isSlashMode) {\n setCommandListDismissed(false)\n }\n }, [isSlashMode, message])\n\n useEffect(() => {\n if (!isCommandListVisible) return\n\n const handleOutsideClick = (event: MouseEvent) => {\n if (!containerRef.current) return\n if (event.target instanceof Node && !containerRef.current.contains(event.target)) {\n setCommandListDismissed(true)\n }\n }\n\n document.addEventListener('mousedown', handleOutsideClick)\n return () => document.removeEventListener('mousedown', handleOutsideClick)\n }, [isCommandListVisible])\n\n useEffect(() => {\n setActiveCommandIndex(0)\n }, [commandQuery])\n\n useEffect(() => {\n if (filteredCommands.length === 0) {\n setActiveCommandIndex(0)\n return\n }\n\n setActiveCommandIndex((prev) => {\n if (prev < 0) return 0\n if (prev >= filteredCommands.length) return filteredCommands.length - 1\n return prev\n })\n }, [filteredCommands.length])\n\n useEffect(() => {\n if (!isCommandListVisible || filteredCommands.length === 0) return\n commandItemRefs.current[activeCommandIndex]?.scrollIntoView({\n block: 'nearest',\n })\n }, [activeCommandIndex, filteredCommands.length, isCommandListVisible])\n\n const handleFileSelect = async (files: FileList | File[] | null): Promise<boolean> => {\n if (!files) return false\n const selectedFiles = Array.isArray(files) ? files : Array.from(files)\n if (selectedFiles.length === 0) return false\n\n try {\n validateFileCount(attachments.length, selectedFiles.length, maxFiles)\n\n // Extract and validate all files synchronously before any async work.\n // This ensures File objects are captured while the DataTransfer is still valid.\n const fileArray: File[] = []\n for (let i = 0; i < selectedFiles.length; i++) {\n const file = selectedFiles[i]\n validateAttachmentFile(file, maxFileSize)\n fileArray.push(file)\n }\n\n // Show shimmer placeholders while processing\n setPendingFileCount(fileArray.length)\n\n // Read all files in parallel\n const base64Results = await Promise.all(fileArray.map(convertToBase64))\n\n const newAttachments: Attachment[] = fileArray.map((file, i) => {\n const attachment: Attachment = {\n id: '',\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data: base64Results[i],\n }\n if (isImageMimeType(file.type)) {\n attachment.preview = createDataUrl(base64Results[i], file.type)\n }\n return attachment\n })\n\n setAttachments((prev) => [...prev, ...newAttachments])\n setPendingFileCount(0)\n setError(null)\n return true\n } catch (err) {\n setPendingFileCount(0)\n setError(err instanceof Error ? err.message : 'Failed to process attachments')\n return false\n }\n }\n\n const handleFileInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFileSelect(e.target.files)\n e.target.value = ''\n }\n\n useImperativeHandle(ref, () => ({\n focus: () => textareaRef.current?.focus(),\n clear: () => {\n onMessageChange('')\n setAttachments([])\n setError(null)\n },\n }))\n\n const handleRemoveAttachment = (index: number) => {\n setAttachments((prev) => prev.filter((_, i) => i !== index))\n setError(null)\n }\n\n // ── Image lightbox ──────────────────────────────────\n const imageAttachments = useMemo(\n () => attachments.filter((a): a is ImageAttachment =>\n a.mimeType.startsWith('image/') && !!(a.base64Data && a.preview)\n ),\n [attachments]\n )\n\n const handleViewAttachment = useCallback((index: number) => {\n const attachment = attachments[index]\n if (!attachment || !attachment.mimeType.startsWith('image/')) return\n const imgIdx = imageAttachments.findIndex((a) => a.filename === attachment.filename && a.preview === attachment.preview)\n if (imgIdx >= 0) setViewingImageIndex(imgIdx)\n }, [attachments, imageAttachments])\n\n const handleImageNavigate = useCallback((direction: 'prev' | 'next') => {\n setViewingImageIndex((prev) => {\n if (prev === null) return null\n const len = imageAttachments.length\n if (len <= 0) return null\n const newIndex = Math.max(0, Math.min(len - 1, prev + (direction === 'prev' ? -1 : 1)))\n return newIndex\n })\n }, [imageAttachments.length])\n\n useEffect(() => {\n setViewingImageIndex((prev) => {\n if (imageAttachments.length === 0) return null\n if (prev != null && (prev < 0 || prev >= imageAttachments.length)) {\n return Math.max(0, Math.min(prev, imageAttachments.length - 1))\n }\n return prev\n })\n }, [imageAttachments.length])\n\n // ── Paste-to-attach ─────────────────────────────────\n const handlePaste = useCallback((e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n const items = Array.from(e.clipboardData.items)\n const imageFiles = items\n .filter((item) => item.kind === 'file' && item.type.startsWith('image/'))\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null)\n\n if (imageFiles.length > 0) {\n e.preventDefault()\n handleFileSelect(imageFiles)\n }\n }, [attachments.length, maxFiles, maxFileSize]) // eslint-disable-line react-hooks/exhaustive-deps\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 const itemFiles = Array.from(e.dataTransfer.items || [])\n .filter((item) => item.kind === 'file')\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null)\n const droppedFiles = itemFiles.length > 0 ? itemFiles : Array.from(e.dataTransfer.files || [])\n const ok = await handleFileSelect(droppedFiles)\n if (ok) {\n setDropSuccess(true)\n setTimeout(() => setDropSuccess(false), 1500)\n }\n }\n\n const submitCommandSelection = (command: string) => {\n onMessageChange(command)\n setCommandListDismissed(true)\n setActiveCommandIndex(0)\n requestAnimationFrame(() => {\n formRef.current?.requestSubmit()\n })\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (isComposing || e.nativeEvent.isComposing) {\n return\n }\n\n if (isCommandListVisible) {\n if (e.key === 'ArrowDown' || (e.key === 'Tab' && !e.shiftKey)) {\n e.preventDefault()\n if (filteredCommands.length > 0) {\n setActiveCommandIndex((prev) => (prev + 1) % filteredCommands.length)\n }\n return\n }\n\n if (e.key === 'ArrowUp' || (e.key === 'Tab' && e.shiftKey)) {\n e.preventDefault()\n if (filteredCommands.length > 0) {\n setActiveCommandIndex((prev) =>\n prev === 0 ? filteredCommands.length - 1 : prev - 1\n )\n }\n return\n }\n\n if (e.key === 'Escape') {\n e.preventDefault()\n setCommandListDismissed(true)\n return\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (filteredCommands.length > 0) {\n submitCommandSelection(filteredCommands[activeCommandIndex].name)\n return\n }\n handleFormSubmit(e as unknown as React.FormEvent)\n return\n }\n }\n\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 if (isSlashMode) {\n setCommandListDismissed(true)\n } else {\n onMessageChange('')\n setAttachments([])\n setError(null)\n }\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 (isComposing) return\n if (loading || disabled || (!message.trim() && attachments.length === 0)) {\n return\n }\n\n setCommandListDismissed(true)\n onSubmit(e, attachments)\n setAttachments([])\n setError(null)\n }\n\n const canSubmit = !loading && !disabled && (message.trim() || attachments.length > 0)\n const visibleError = error || commandError\n const visibleErrorText = visibleError ? t(visibleError) : ''\n const defaultContainerClassName = \"shrink-0 px-4 pt-4 pb-6\"\n const formatTokens = (value: number): string => new Intl.NumberFormat().format(value)\n const latestPromptTokens = debugSessionUsage?.latestPromptTokens ?? 0\n const sessionTotalTokens = debugSessionUsage?.totalTokens ?? 0\n const sessionPromptTokens = debugSessionUsage?.promptTokens ?? 0\n const sessionCompletionTokens = debugSessionUsage?.completionTokens ?? 0\n const hasUsage = (debugSessionUsage?.turnsWithUsage ?? 0) > 0\n const policyMaxTokens = debugLimits?.policyMaxTokens ?? 0\n const modelMaxTokens = debugLimits?.modelMaxTokens ?? 0\n const effectiveMaxTokens = debugLimits?.effectiveMaxTokens ?? 0\n const contextPercentValue = calculateContextUsagePercent(latestPromptTokens, effectiveMaxTokens)\n const contextPercent = contextPercentValue !== null ? contextPercentValue.toFixed(1) : null\n\n return (\n <div\n ref={containerRef}\n className={containerClassName ?? defaultContainerClassName}\n >\n <form ref={formRef} onSubmit={handleFormSubmit} className={formClassName ?? \"mx-auto\"}>\n {/* Error display */}\n {visibleError && (\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>{visibleErrorText}</span>\n <button\n type=\"button\"\n onClick={() => {\n setError(null)\n onClearCommandError?.()\n }}\n className=\"cursor-pointer 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 {debugMode && (\n <div className=\"mb-3 space-y-2 text-xs\">\n {/* Debug badge with animated pulse indicator */}\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 bg-amber-100 dark:bg-amber-900/40 text-amber-700 dark:text-amber-300 rounded-full font-medium text-[11px]\">\n <span className=\"relative flex h-1.5 w-1.5\" aria-hidden=\"true\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-amber-400 opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-1.5 w-1.5 bg-amber-500\" />\n </span>\n <Bug size={12} />\n {t('slash.debugBadge')}\n </span>\n\n {/* Stats container */}\n <div className=\"rounded-xl border border-gray-200/60 dark:border-gray-700/40 bg-gray-50/50 dark:bg-gray-800/30 p-3 space-y-3\">\n {hasUsage ? (\n <div className=\"grid grid-cols-3 gap-1.5\">\n <div className=\"flex flex-col items-center gap-1 py-2 rounded-lg bg-white dark:bg-gray-800/60 border border-gray-100 dark:border-gray-700/30\">\n <div className=\"flex items-center gap-1 text-[10px] text-gray-400 dark:text-gray-500\">\n <ArrowUp size={10} weight=\"bold\" className=\"text-blue-500 dark:text-blue-400\" />\n {t('slash.debugPromptTokens')}\n </div>\n <span className=\"font-mono font-semibold text-xs text-gray-900 dark:text-gray-100 tabular-nums\">\n {formatTokens(sessionPromptTokens)}\n </span>\n </div>\n <div className=\"flex flex-col items-center gap-1 py-2 rounded-lg bg-white dark:bg-gray-800/60 border border-gray-100 dark:border-gray-700/30\">\n <div className=\"flex items-center gap-1 text-[10px] text-gray-400 dark:text-gray-500\">\n <ArrowDown size={10} weight=\"bold\" className=\"text-indigo-500 dark:text-indigo-400\" />\n {t('slash.debugCompletionTokens')}\n </div>\n <span className=\"font-mono font-semibold text-xs text-gray-900 dark:text-gray-100 tabular-nums\">\n {formatTokens(sessionCompletionTokens)}\n </span>\n </div>\n <div className=\"flex flex-col items-center gap-1 py-2 rounded-lg bg-white dark:bg-gray-800/60 border border-gray-100 dark:border-gray-700/30\">\n <div className=\"flex items-center gap-1 text-[10px] text-gray-400 dark:text-gray-500\">\n <Stack size={10} weight=\"bold\" className=\"text-violet-500 dark:text-violet-400\" />\n {t('slash.debugTotalTokens')}\n </div>\n <span className=\"font-mono font-semibold text-xs text-gray-900 dark:text-gray-100 tabular-nums\">\n {formatTokens(sessionTotalTokens)}\n </span>\n </div>\n </div>\n ) : (\n <p className=\"text-[11px] text-gray-400 dark:text-gray-500 text-center py-1\">\n {t('slash.debugSessionUsageUnavailable')}\n </p>\n )}\n\n {debugLimits && (\n <div className=\"grid grid-cols-3 gap-1.5\">\n <div className=\"flex flex-col gap-1 py-2 px-2 rounded-lg bg-white dark:bg-gray-800/60 border border-gray-100 dark:border-gray-700/30\">\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {t('slash.debugPolicyMaxContextWindow')}\n </span>\n <span className=\"font-mono font-semibold text-xs text-gray-900 dark:text-gray-100 tabular-nums\">\n {formatTokens(policyMaxTokens)}\n </span>\n </div>\n <div className=\"flex flex-col gap-1 py-2 px-2 rounded-lg bg-white dark:bg-gray-800/60 border border-gray-100 dark:border-gray-700/30\">\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {t('slash.debugModelMaxContextWindow')}\n </span>\n <span className=\"font-mono font-semibold text-xs text-gray-900 dark:text-gray-100 tabular-nums\">\n {formatTokens(modelMaxTokens)}\n </span>\n </div>\n <div className=\"flex flex-col gap-1 py-2 px-2 rounded-lg bg-white dark:bg-gray-800/60 border border-gray-100 dark:border-gray-700/30\">\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {t('slash.debugEffectiveContextWindow')}\n </span>\n <span className=\"font-mono font-semibold text-xs text-gray-900 dark:text-gray-100 tabular-nums\">\n {formatTokens(effectiveMaxTokens)}\n </span>\n </div>\n </div>\n )}\n\n {effectiveMaxTokens > 0 && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {t('slash.debugContextUsage')}\n </span>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-[10px] text-gray-400 dark:text-gray-500 tabular-nums\">\n {formatTokens(latestPromptTokens)} / {formatTokens(effectiveMaxTokens)}\n </span>\n {contextPercent && (\n <span className={[\n 'px-1.5 py-0.5 rounded-full text-[10px] font-semibold tabular-nums',\n parseFloat(contextPercent) > 75\n ? 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400'\n : parseFloat(contextPercent) > 50\n ? 'bg-amber-100 dark:bg-amber-900/30 text-amber-600 dark:text-amber-400'\n : 'bg-emerald-100 dark:bg-emerald-900/30 text-emerald-600 dark:text-emerald-400',\n ].join(' ')}>\n {contextPercent}%\n </span>\n )}\n </div>\n </div>\n <div className=\"h-1.5 rounded-full bg-gray-200/80 dark:bg-gray-700/50 overflow-hidden\">\n <div\n className={[\n 'h-full rounded-full transition-all duration-700 ease-out',\n parseFloat(contextPercent || '0') > 75\n ? 'bg-gradient-to-r from-red-400 to-red-500'\n : parseFloat(contextPercent || '0') > 50\n ? 'bg-gradient-to-r from-amber-400 to-amber-500'\n : 'bg-gradient-to-r from-emerald-400 to-emerald-500',\n ].join(' ')}\n style={{\n width: contextPercent ? `${Math.min(parseFloat(contextPercent), 100)}%` : '0%',\n }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Attachment preview */}\n {(attachments.length > 0 || pendingFileCount > 0) && (\n <div className=\"mb-3\">\n <AttachmentGrid\n attachments={attachments}\n onRemove={handleRemoveAttachment}\n onView={handleViewAttachment}\n pendingCount={pendingFileCount}\n />\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.dropFiles')}\n </span>\n </div>\n </div>\n )}\n\n {/* Drop success feedback */}\n {dropSuccess && (\n <div className=\"absolute inset-0 z-10 bg-green-50/95 dark:bg-green-900/90 border-2 border-green-400 rounded-2xl flex items-center justify-center animate-pulse pointer-events-none\">\n <span className=\"text-sm text-green-700 dark:text-green-300 font-medium\">\n {t('input.filesAdded')}\n </span>\n </div>\n )}\n\n {/* Input container - using inline Tailwind classes */}\n <div\n className={`flex items-center gap-2 rounded-2xl p-2 sm:p-3 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/20 dark:ring-primary-500/25 shadow-[0_0_0_3px_rgba(37,99,235,0.08)]'\n : 'border-gray-300 dark:border-gray-600 hover:border-gray-300 dark:hover:border-gray-600 hover:shadow-md'\n }`}\n >\n {/* Attach button */}\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={loading || disabled || attachments.length >= maxFiles}\n className=\"cursor-pointer flex-shrink-0 self-center p-2 text-gray-500 dark:text-gray-400 hover:text-gray-600 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.attachFiles')}\n >\n <Paperclip size={20} />\n </button>\n\n {/* Hidden file input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={ATTACHMENT_ACCEPT_ATTRIBUTE}\n multiple\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-label={t('input.fileInput')}\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) => {\n onMessageChange(e.target.value)\n onClearCommandError?.()\n }}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n onFocus={() => setIsFocused(true)}\n onBlur={(e) => {\n setIsFocused(false)\n if (!containerRef.current) return\n if (!e.relatedTarget || !containerRef.current.contains(e.relatedTarget)) {\n setCommandListDismissed(true)\n }\n }}\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-sm leading-relaxed\"\n style={{ maxHeight: `${MAX_HEIGHT}px` }}\n rows={1}\n disabled={loading || disabled}\n aria-busy={loading}\n aria-label={t('input.messageInput')}\n />\n </div>\n\n {/* Send button - using inline Tailwind classes */}\n <button\n type=\"submit\"\n disabled={!canSubmit}\n className=\"cursor-pointer flex-shrink-0 self-center p-2 rounded-lg bg-primary-600 hover:bg-primary-700 active:bg-primary-800 active:scale-95 text-white shadow-sm transition-all disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-primary-600\"\n aria-label={loading ? t('input.processing') : 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\n {/* Keyboard hint */}\n {isFocused && !message && !loading && (\n <span className=\"hidden sm:block absolute -bottom-5 left-14 text-[10px] text-gray-400 dark:text-gray-500 select-none animate-fade-in\">\n {t('input.shiftEnterHint')}\n </span>\n )}\n\n {isCommandListVisible && (\n <div className=\"absolute left-0 right-0 bottom-full mb-1.5 z-20 overflow-hidden rounded-lg border border-gray-200/70 bg-white/98 shadow-md backdrop-blur-xl dark:border-gray-700/70 dark:bg-gray-900/98 dark:shadow-black/20\">\n {filteredCommands.length > 0 ? (\n <ul role=\"listbox\" aria-label={t('slash.commandsList')} className=\"py-1 px-1\">\n {filteredCommands.map((command, index) => {\n const isActive = index === activeCommandIndex\n return (\n <li\n key={command.name}\n role=\"option\"\n aria-selected={isActive}\n ref={(node) => {\n commandItemRefs.current[index] = node\n }}\n onMouseEnter={() => setActiveCommandIndex(index)}\n onMouseDown={(e) => {\n e.preventDefault()\n submitCommandSelection(command.name)\n }}\n className={`cursor-pointer flex items-baseline gap-2 rounded-md px-2 py-1.5 transition-colors duration-75 ${\n isActive\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n >\n <span className=\"text-xs font-medium font-mono text-gray-800 dark:text-gray-200 shrink-0\">\n <span className=\"text-gray-400 dark:text-gray-500\">/</span>{command.name.slice(1)}\n </span>\n <span className=\"text-[11px] text-gray-400 dark:text-gray-500 truncate\">\n {command.description}\n </span>\n </li>\n )\n })}\n </ul>\n ) : (\n <div className=\"px-3 py-2.5 text-center\">\n <p className=\"text-[11px] text-gray-400 dark:text-gray-500\">\n {t('slash.noMatches')}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Image lightbox */}\n {viewingImageIndex !== null &&\n viewingImageIndex >= 0 &&\n viewingImageIndex < imageAttachments.length && (\n <ImageModal\n isOpen\n onClose={() => setViewingImageIndex(null)}\n attachment={imageAttachments[viewingImageIndex]}\n allAttachments={imageAttachments}\n currentIndex={viewingImageIndex}\n onNavigate={handleImageNavigate}\n />\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, useReducedMotion } from 'framer-motion'\nimport { ChartBar, FileText, Lightbulb, type Icon } from '@phosphor-icons/react'\nimport { useTranslation } from '../hooks/useTranslation'\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 CATEGORY_STYLES: Record<string, { badge: string; icon: string }> = {\n 'Data Analysis': {\n badge: 'bg-sky-50 text-sky-600 ring-sky-600/10 dark:bg-sky-400/10 dark:text-sky-400 dark:ring-sky-400/20',\n icon: 'text-sky-500 dark:text-sky-400',\n },\n Reports: {\n badge: 'bg-teal-50 text-teal-600 ring-teal-600/10 dark:bg-teal-400/10 dark:text-teal-400 dark:ring-teal-400/20',\n icon: 'text-teal-500 dark:text-teal-400',\n },\n Insights: {\n badge: 'bg-amber-50 text-amber-600 ring-amber-600/10 dark:bg-amber-400/10 dark:text-amber-400 dark:ring-amber-400/20',\n icon: 'text-amber-500 dark:text-amber-400',\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 reducedContainerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0,\n delayChildren: 0\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\nconst reducedItemVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0\n }\n }\n}\n\nfunction WelcomeContent({\n onPromptSelect,\n title,\n description,\n disabled = false\n}: WelcomeContentProps) {\n const { t } = useTranslation()\n const shouldReduceMotion = useReducedMotion()\n const resolvedTitle = title || t('welcome.title')\n const resolvedDescription = description || t('welcome.description')\n\n const handlePromptClick = (prompt: string) => {\n if (onPromptSelect && !disabled) {\n onPromptSelect(prompt)\n }\n }\n\n const activeContainerVariants = shouldReduceMotion ? reducedContainerVariants : containerVariants\n const activeItemVariants = shouldReduceMotion ? reducedItemVariants : itemVariants\n\n return (\n <motion.div\n className=\"relative w-full max-w-5xl mx-auto px-6 text-center\"\n variants={activeContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {/* Ambient glow */}\n <div\n className=\"pointer-events-none absolute inset-x-0 -top-8 flex justify-center overflow-hidden h-56\"\n aria-hidden\n >\n <div className=\"w-[420px] h-[260px] -mt-16 rounded-full bg-primary-300/[0.08] blur-[80px] dark:bg-primary-400/[0.05]\" />\n </div>\n\n {/* Title */}\n <motion.h1\n className=\"relative text-2xl sm:text-3xl font-semibold text-gray-900 dark:text-white mb-4\"\n variants={activeItemVariants}\n >\n {resolvedTitle}\n </motion.h1>\n\n {/* Description */}\n <motion.p\n className=\"text-base text-gray-500 dark:text-gray-400 mb-10 max-w-2xl mx-auto leading-relaxed\"\n variants={activeItemVariants}\n >\n {resolvedDescription}\n </motion.p>\n\n {/* Example prompts */}\n <motion.div variants={activeItemVariants}>\n <div className=\"flex items-center gap-4 mb-5\">\n <div className=\"h-px flex-1 bg-gradient-to-r from-transparent to-gray-200 dark:to-gray-700/70\" />\n <span className=\"text-[11px] font-semibold uppercase tracking-[0.12em] text-gray-400 dark:text-gray-500 select-none\">\n {t('welcome.quickStart')}\n </span>\n <div className=\"h-px flex-1 bg-gradient-to-l from-transparent to-gray-200 dark:to-gray-700/70\" />\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {EXAMPLE_PROMPTS.map((prompt, index) => {\n const style = CATEGORY_STYLES[prompt.category]\n return (\n <motion.button\n key={index}\n onClick={() => handlePromptClick(prompt.text)}\n disabled={disabled}\n className=\"cursor-pointer group flex flex-col items-start text-left p-4 rounded-xl bg-white dark:bg-gray-800/80 border border-gray-200/80 dark:border-gray-700/60 hover:border-gray-300 dark:hover:border-gray-600 hover:bg-gray-50/80 dark:hover:bg-gray-700/30 shadow-sm hover:shadow-md transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-primary-500/40 focus:ring-offset-2 dark:focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed\"\n variants={activeItemVariants}\n whileHover={disabled || shouldReduceMotion ? {} : { y: -3 }}\n whileTap={disabled || shouldReduceMotion ? {} : { scale: 0.98 }}\n aria-label={`${prompt.category}: ${prompt.text}`}\n >\n <div className=\"mb-3 flex items-center gap-2\">\n <prompt.icon\n size={16}\n weight=\"duotone\"\n className={style?.icon ?? 'text-gray-500'}\n />\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-[11px] font-medium ring-1 ring-inset ${style?.badge ?? 'bg-gray-100 text-gray-600 ring-gray-500/10'}`}\n >\n {prompt.category}\n </span>\n </div>\n\n <p className=\"text-[13px] text-gray-700 dark:text-gray-200 leading-relaxed group-hover:text-gray-900 dark:group-hover:text-white transition-colors duration-200\">\n {prompt.text}\n </p>\n </motion.button>\n )\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, useCallback, useEffect, useRef, useState } from 'react'\nimport { AnimatePresence, motion } from 'framer-motion'\nimport { Sidebar } from '@phosphor-icons/react'\nimport { ChatSessionProvider, useChat } from '../context/ChatContext'\nimport { ChatDataSource, ConversationTurn } from '../types'\nimport { RateLimiter } from '../utils/RateLimiter'\nimport { ChatHeader } from './ChatHeader'\nimport { MessageList } from './MessageList'\nimport { MessageInput } from './MessageInput'\nimport WelcomeContent from './WelcomeContent'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { SessionArtifactsPanel } from './SessionArtifactsPanel'\n\ninterface ChatSessionProps {\n dataSource: ChatDataSource\n sessionId?: string\n /** Optional rate limiter to throttle sendMessage */\n rateLimiter?: RateLimiter\n /** Alias for isReadOnly (preferred) */\n readOnly?: boolean\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 /** Custom verbs for the typing indicator (e.g. ['Thinking', 'Analyzing', ...]) */\n thinkingVerbs?: string[]\n /** Enables the built-in right-side artifacts panel for persisted session artifacts */\n showArtifactsPanel?: boolean\n /** Initial expanded state for artifacts panel when no persisted preference exists */\n artifactsPanelDefaultExpanded?: boolean\n /** localStorage key for artifacts panel expanded/collapsed state */\n artifactsPanelStorageKey?: string\n}\n\nconst ARTIFACTS_PANEL_WIDTH_DEFAULT = 352\nconst ARTIFACTS_PANEL_WIDTH_MIN = 280\nconst ARTIFACTS_PANEL_WIDTH_MAX = 560\n\nfunction ChatSessionCore({\n dataSource,\n readOnly,\n isReadOnly,\n renderUserTurn,\n renderAssistantTurn,\n className = '',\n headerSlot,\n welcomeSlot,\n logoSlot,\n actionsSlot,\n onBack,\n thinkingVerbs,\n showArtifactsPanel = false,\n artifactsPanelDefaultExpanded = false,\n artifactsPanelStorageKey = 'bichat.artifacts-panel.expanded',\n}: Omit<ChatSessionProps, 'sessionId'>) {\n const { t } = useTranslation()\n const {\n session,\n turns,\n fetching,\n error,\n inputError,\n message,\n setMessage,\n setInputError,\n loading,\n handleSubmit,\n messageQueue,\n handleUnqueue,\n debugMode,\n sessionDebugUsage,\n debugLimits,\n currentSessionId,\n isStreaming,\n } = useChat()\n\n const effectiveReadOnly = Boolean(readOnly ?? isReadOnly)\n\n const [artifactsPanelExpanded, setArtifactsPanelExpanded] = useState(\n artifactsPanelDefaultExpanded\n )\n const [artifactsPanelWidth, setArtifactsPanelWidth] = useState(ARTIFACTS_PANEL_WIDTH_DEFAULT)\n const [isResizingArtifactsPanel, setIsResizingArtifactsPanel] = useState(false)\n const layoutContainerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!showArtifactsPanel) {\n return\n }\n\n let nextValue = artifactsPanelDefaultExpanded\n if (typeof window !== 'undefined') {\n const stored = window.localStorage.getItem(artifactsPanelStorageKey)\n if (stored !== null) {\n nextValue = stored === 'true'\n }\n }\n\n setArtifactsPanelExpanded(nextValue)\n }, [artifactsPanelDefaultExpanded, artifactsPanelStorageKey, showArtifactsPanel])\n\n useEffect(() => {\n if (!showArtifactsPanel) return\n if (typeof window === 'undefined') return\n try {\n const raw = window.localStorage.getItem(`${artifactsPanelStorageKey}.width`)\n if (raw !== null) {\n const n = Number.parseInt(raw, 10)\n if (Number.isFinite(n) && n >= ARTIFACTS_PANEL_WIDTH_MIN && n <= ARTIFACTS_PANEL_WIDTH_MAX) {\n setArtifactsPanelWidth(n)\n }\n }\n } catch {\n // ignore\n }\n }, [artifactsPanelStorageKey, showArtifactsPanel])\n\n const handleArtifactsResizeStart = useCallback(() => {\n setIsResizingArtifactsPanel(true)\n }, [])\n\n const lastPanelWidthRef = useRef(artifactsPanelWidth)\n lastPanelWidthRef.current = artifactsPanelWidth\n\n useEffect(() => {\n if (!isResizingArtifactsPanel) return\n\n const move = (e: MouseEvent) => {\n const el = layoutContainerRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n const w = rect.right - e.clientX\n const clamped = Math.min(ARTIFACTS_PANEL_WIDTH_MAX, Math.max(ARTIFACTS_PANEL_WIDTH_MIN, w))\n setArtifactsPanelWidth(clamped)\n }\n\n const up = () => {\n setIsResizingArtifactsPanel(false)\n try {\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(\n `${artifactsPanelStorageKey}.width`,\n String(lastPanelWidthRef.current)\n )\n }\n } catch {\n // ignore\n }\n }\n\n document.addEventListener('mousemove', move, { passive: true })\n document.addEventListener('mouseup', up)\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n return () => {\n document.removeEventListener('mousemove', move)\n document.removeEventListener('mouseup', up)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n }, [isResizingArtifactsPanel, artifactsPanelStorageKey])\n\n if (fetching) {\n return (\n <div className=\"flex h-full items-center justify-center\">\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 h-full items-center justify-center\">\n <div className=\"text-red-500 dark:text-red-400\">\n {t('error.generic')}: {error}\n </div>\n </div>\n )\n }\n\n // Show welcome screen for new sessions with no turns\n const showWelcome = !session && turns.length === 0\n const activeSessionId =\n session?.id ||\n (currentSessionId && currentSessionId !== 'new'\n ? currentSessionId\n : undefined)\n\n const supportsArtifactsPanel = typeof dataSource.fetchSessionArtifacts === 'function'\n const showArtifactsControls = Boolean(showArtifactsPanel && supportsArtifactsPanel && activeSessionId)\n const shouldRenderArtifactsPanel = Boolean(\n showArtifactsControls && artifactsPanelExpanded && !showWelcome && activeSessionId\n )\n\n const handlePromptSelect = (prompt: string) => {\n setMessage(prompt)\n }\n\n const handleToggleArtifactsPanel = () => {\n const nextValue = !artifactsPanelExpanded\n setArtifactsPanelExpanded(nextValue)\n\n if (typeof window !== 'undefined') {\n window.localStorage.setItem(artifactsPanelStorageKey, nextValue ? 'true' : 'false')\n if (nextValue) {\n window.dispatchEvent(new CustomEvent('bichat:artifacts-panel-expanded', { detail: { expanded: true } }))\n }\n }\n }\n\n const headerActions = showArtifactsControls ? (\n <>\n <button\n type=\"button\"\n onClick={handleToggleArtifactsPanel}\n className={[\n 'inline-flex cursor-pointer items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50',\n artifactsPanelExpanded\n ? 'bg-primary-50 text-primary-700 hover:bg-primary-100 dark:bg-primary-950/30 dark:text-primary-300 dark:hover:bg-primary-900/40'\n : 'text-gray-500 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-gray-200',\n ].join(' ')}\n aria-label={artifactsPanelExpanded ? t('artifacts.toggleHide') : t('artifacts.toggleShow')}\n title={artifactsPanelExpanded ? t('artifacts.toggleHide') : t('artifacts.toggleShow')}\n >\n <Sidebar className=\"h-4 w-4\" weight={artifactsPanelExpanded ? 'duotone' : 'regular'} />\n {t('artifacts.title')}\n </button>\n {actionsSlot}\n </>\n ) : (\n actionsSlot\n )\n\n return (\n <main\n className={`flex min-h-0 flex-1 flex-col overflow-hidden bg-gray-50 dark:bg-gray-900 ${className}`}\n >\n {headerSlot || (\n <ChatHeader\n session={session}\n onBack={onBack}\n readOnly={effectiveReadOnly}\n logoSlot={logoSlot}\n actionsSlot={headerActions}\n />\n )}\n\n <div\n ref={layoutContainerRef}\n className=\"relative flex min-h-0 flex-1 overflow-hidden\"\n >\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {showWelcome ? (\n <div className=\"flex flex-1 flex-col overflow-auto\">\n <div className=\"flex flex-1 items-center justify-center px-4 py-8\">\n <div className=\"w-full max-w-5xl\">\n {welcomeSlot || (\n <WelcomeContent onPromptSelect={handlePromptSelect} disabled={loading} />\n )}\n {!effectiveReadOnly && (\n <MessageInput\n message={message}\n loading={loading}\n fetching={fetching}\n commandError={inputError}\n onClearCommandError={() => setInputError(null)}\n debugMode={debugMode}\n debugSessionUsage={sessionDebugUsage}\n debugLimits={debugLimits}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n messageQueue={messageQueue}\n onUnqueue={handleUnqueue}\n containerClassName=\"pt-6 px-6\"\n formClassName=\"mx-auto\"\n />\n )}\n <p className=\"mt-4 pb-1 text-center text-xs text-gray-500 dark:text-gray-400\">\n {t('welcome.disclaimer')}\n </p>\n </div>\n </div>\n </div>\n ) : (\n <>\n <MessageList\n renderUserTurn={renderUserTurn}\n renderAssistantTurn={renderAssistantTurn}\n thinkingVerbs={thinkingVerbs}\n readOnly={effectiveReadOnly}\n />\n {!effectiveReadOnly && (\n <MessageInput\n message={message}\n loading={loading}\n fetching={fetching}\n commandError={inputError}\n onClearCommandError={() => setInputError(null)}\n debugMode={debugMode}\n debugSessionUsage={sessionDebugUsage}\n debugLimits={debugLimits}\n onMessageChange={setMessage}\n onSubmit={handleSubmit}\n messageQueue={messageQueue}\n onUnqueue={handleUnqueue}\n />\n )}\n </>\n )}\n </div>\n\n {/* Desktop: persistent slot with animated width so main content expands in sync */}\n <motion.div\n className=\"hidden lg:flex lg:min-h-0 shrink-0 overflow-hidden\"\n animate={{\n width: shouldRenderArtifactsPanel && activeSessionId ? artifactsPanelWidth : 0,\n }}\n transition={\n isResizingArtifactsPanel\n ? { duration: 0 }\n : { type: 'spring', stiffness: 320, damping: 32 }\n }\n >\n {shouldRenderArtifactsPanel && activeSessionId && (\n <motion.div\n className=\"flex min-h-0\"\n style={{ width: artifactsPanelWidth }}\n initial={{ x: '100%' }}\n animate={{ x: 0 }}\n transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n >\n <div\n role=\"separator\"\n aria-label={t('artifacts.resize')}\n onMouseDown={handleArtifactsResizeStart}\n className=\"relative flex shrink-0 cursor-col-resize touch-none items-center justify-center w-2 transition-colors lg:flex group/resize after:absolute after:inset-y-0 after:left-0 after:w-0.5 after:bg-gray-300 dark:after:bg-gray-600 after:transition-colors group-hover/resize:after:bg-primary-400 dark:group-hover/resize:after:bg-primary-500\"\n >\n <span className=\"absolute h-10 w-1.5 cursor-col-resize rounded-full bg-gray-400 transition-colors group-hover/resize:bg-primary-400 dark:bg-gray-500 dark:group-hover/resize:bg-primary-500\" />\n </div>\n <SessionArtifactsPanel\n dataSource={dataSource}\n sessionId={activeSessionId}\n isStreaming={isStreaming}\n allowDrop={!effectiveReadOnly}\n className=\"min-h-0 min-w-0 flex-1\"\n />\n </motion.div>\n )}\n </motion.div>\n\n <AnimatePresence>\n {shouldRenderArtifactsPanel && activeSessionId && (\n <motion.div\n key=\"artifacts-mobile\"\n className=\"fixed inset-0 z-40 flex lg:hidden\"\n initial={{ x: '100%' }}\n animate={{ x: 0 }}\n exit={{ x: '100%' }}\n transition={{ type: 'spring', stiffness: 320, damping: 32 }}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <motion.button\n type=\"button\"\n className=\"cursor-pointer flex-1 bg-black/40\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={handleToggleArtifactsPanel}\n aria-label={t('common.close')}\n />\n <SessionArtifactsPanel\n dataSource={dataSource}\n sessionId={activeSessionId}\n isStreaming={isStreaming}\n allowDrop={!effectiveReadOnly}\n className=\"flex h-full w-full max-w-sm min-h-0\"\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </main>\n )\n}\n\nexport function ChatSession(props: ChatSessionProps) {\n const { dataSource, sessionId, rateLimiter, ...coreProps } = props\n\n return (\n <ChatSessionProvider dataSource={dataSource} sessionId={sessionId} rateLimiter={rateLimiter}>\n <ChatSessionCore dataSource={dataSource} {...coreProps} />\n </ChatSessionProvider>\n )\n}\n\nexport type { ChatSessionProps }\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Paperclip } from '@phosphor-icons/react'\nimport type { ChatDataSource, SessionArtifact } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { useOptionalChatMessaging } from '../context/ChatContext'\nimport { SessionArtifactList } from './SessionArtifactList'\nimport { SessionArtifactPreviewModal } from './SessionArtifactPreviewModal'\n\ninterface SessionArtifactsPanelProps {\n dataSource: ChatDataSource\n sessionId: string\n isStreaming: boolean\n allowDrop?: boolean\n className?: string\n /** When provided, used instead of useChatMessaging().artifactsInvalidationTrigger (allows use outside SDK ChatSessionProvider). */\n artifactsInvalidationTrigger?: number\n}\n\nconst PAGE_SIZE = 50\n\nfunction mergeArtifacts(existing: SessionArtifact[], incoming: SessionArtifact[]): SessionArtifact[] {\n const merged = [...existing]\n const existingIds = new Set(existing.map((artifact) => artifact.id))\n\n for (const artifact of incoming) {\n if (existingIds.has(artifact.id)) {\n continue\n }\n merged.push(artifact)\n existingIds.add(artifact.id)\n }\n\n return merged\n}\n\nexport function SessionArtifactsPanel({\n dataSource,\n sessionId,\n isStreaming,\n allowDrop = true,\n className = '',\n artifactsInvalidationTrigger: artifactsInvalidationTriggerProp,\n}: SessionArtifactsPanelProps) {\n const { t } = useTranslation()\n const messaging = useOptionalChatMessaging()\n const artifactsInvalidationTrigger =\n typeof artifactsInvalidationTriggerProp === 'number'\n ? artifactsInvalidationTriggerProp\n : messaging?.artifactsInvalidationTrigger ?? 0\n\n const [fetching, setFetching] = useState(true)\n const [refreshing, setRefreshing] = useState(false)\n const [loadingMore, setLoadingMore] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [artifacts, setArtifacts] = useState<SessionArtifact[]>([])\n const [previewArtifactID, setPreviewArtifactID] = useState<string | null>(null)\n const [hasMore, setHasMore] = useState(false)\n const [isDragging, setIsDragging] = useState(false)\n const [dropSuccess, setDropSuccess] = useState(false)\n\n const requestSeq = useRef(0)\n const hasLoadedRef = useRef(false)\n const prevStreamingRef = useRef(isStreaming)\n const artifactsRef = useRef<SessionArtifact[]>([])\n const nextOffsetRef = useRef(0)\n const dragDepthRef = useRef(0)\n const dropSuccessTimerRef = useRef<number | null>(null)\n\n const canFetchArtifacts = typeof dataSource.fetchSessionArtifacts === 'function'\n const canDropFiles = allowDrop && typeof dataSource.uploadSessionArtifacts === 'function'\n\n const tRef = useRef(t)\n tRef.current = t\n\n const fetchArtifacts = useCallback(\n async (opts: { reset: boolean; manual: boolean }) => {\n if (!canFetchArtifacts || !dataSource.fetchSessionArtifacts) {\n setFetching(false)\n setRefreshing(false)\n setLoadingMore(false)\n setArtifacts([])\n setError(null)\n setHasMore(false)\n nextOffsetRef.current = 0\n return\n }\n\n const requestID = ++requestSeq.current\n const offset = opts.reset ? 0 : nextOffsetRef.current\n\n if (!hasLoadedRef.current || opts.reset) {\n if (opts.manual && hasLoadedRef.current) {\n setRefreshing(true)\n } else {\n setFetching(true)\n }\n } else {\n setLoadingMore(true)\n }\n setError(null)\n\n try {\n const response = await dataSource.fetchSessionArtifacts(sessionId, {\n limit: PAGE_SIZE,\n offset,\n })\n if (requestID !== requestSeq.current) {\n return\n }\n\n const page = [...(response.artifacts || [])].sort(\n (a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt)\n )\n\n const nextList = opts.reset ? page : mergeArtifacts(artifactsRef.current, page)\n\n setArtifacts(nextList)\n artifactsRef.current = nextList\n hasLoadedRef.current = true\n\n const resolvedHasMore = Boolean(response.hasMore)\n const resolvedNextOffset =\n typeof response.nextOffset === 'number'\n ? response.nextOffset\n : offset + page.length\n\n setHasMore(resolvedHasMore)\n nextOffsetRef.current = resolvedNextOffset\n } catch (err) {\n if (requestID !== requestSeq.current) {\n return\n }\n setError(err instanceof Error ? err.message : tRef.current('artifacts.failedToLoad'))\n } finally {\n if (requestID === requestSeq.current) {\n setFetching(false)\n setRefreshing(false)\n setLoadingMore(false)\n }\n }\n },\n [canFetchArtifacts, dataSource, sessionId]\n )\n\n useEffect(() => {\n hasLoadedRef.current = false\n setFetching(true)\n setRefreshing(false)\n setLoadingMore(false)\n setError(null)\n setArtifacts([])\n artifactsRef.current = []\n setPreviewArtifactID(null)\n setHasMore(false)\n nextOffsetRef.current = 0\n void fetchArtifacts({ reset: true, manual: false })\n }, [fetchArtifacts, sessionId])\n\n useEffect(() => {\n const wasStreaming = prevStreamingRef.current\n if (wasStreaming && !isStreaming) {\n void fetchArtifacts({ reset: true, manual: false })\n }\n prevStreamingRef.current = isStreaming\n }, [fetchArtifacts, isStreaming])\n\n useEffect(() => {\n if (artifactsInvalidationTrigger > 0 && sessionId && canFetchArtifacts) {\n void fetchArtifacts({ reset: true, manual: false })\n }\n }, [artifactsInvalidationTrigger, sessionId, canFetchArtifacts, fetchArtifacts])\n\n const visibilityFetchRef = useRef(fetchArtifacts)\n visibilityFetchRef.current = fetchArtifacts\n const sessionIdRef = useRef(sessionId)\n sessionIdRef.current = sessionId\n const canFetchRef = useRef(canFetchArtifacts)\n canFetchRef.current = canFetchArtifacts\n\n useEffect(() => {\n const handler = () => {\n if (\n document.visibilityState === 'visible' &&\n sessionIdRef.current &&\n canFetchRef.current\n ) {\n void visibilityFetchRef.current({ reset: true, manual: false })\n }\n }\n document.addEventListener('visibilitychange', handler)\n return () => document.removeEventListener('visibilitychange', handler)\n }, [])\n\n const previewArtifact = useMemo(\n () => artifacts.find((artifact) => artifact.id === previewArtifactID) ?? null,\n [artifacts, previewArtifactID]\n )\n\n const clearDropSuccessTimer = useCallback(() => {\n if (dropSuccessTimerRef.current === null) return\n window.clearTimeout(dropSuccessTimerRef.current)\n dropSuccessTimerRef.current = null\n }, [])\n\n useEffect(() => {\n return () => {\n clearDropSuccessTimer()\n }\n }, [clearDropSuccessTimer])\n\n const setDropSuccessState = useCallback(() => {\n setDropSuccess(true)\n clearDropSuccessTimer()\n dropSuccessTimerRef.current = window.setTimeout(() => {\n setDropSuccess(false)\n dropSuccessTimerRef.current = null\n }, 1400)\n }, [clearDropSuccessTimer])\n\n const hasDragFiles = useCallback((e: React.DragEvent): boolean => {\n return Array.from(e.dataTransfer.types || []).includes('Files')\n }, [])\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (!canDropFiles || !hasDragFiles(e)) return\n e.preventDefault()\n e.stopPropagation()\n dragDepthRef.current += 1\n setIsDragging(true)\n }, [canDropFiles, hasDragFiles])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n if (!canDropFiles || !hasDragFiles(e)) return\n e.preventDefault()\n e.stopPropagation()\n e.dataTransfer.dropEffect = 'copy'\n }, [canDropFiles, hasDragFiles])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n if (!canDropFiles || !hasDragFiles(e)) return\n e.preventDefault()\n e.stopPropagation()\n dragDepthRef.current = Math.max(0, dragDepthRef.current - 1)\n if (dragDepthRef.current === 0) {\n setIsDragging(false)\n }\n }, [canDropFiles, hasDragFiles])\n\n const handleDrop = useCallback(async (e: React.DragEvent) => {\n if (!canDropFiles || !dataSource.uploadSessionArtifacts || !hasDragFiles(e)) return\n e.preventDefault()\n e.stopPropagation()\n dragDepthRef.current = 0\n setIsDragging(false)\n\n const itemFiles = Array.from(e.dataTransfer.items || [])\n .filter((item) => item.kind === 'file')\n .map((item) => item.getAsFile())\n .filter((file): file is File => file !== null)\n const droppedFiles = itemFiles.length > 0 ? itemFiles : Array.from(e.dataTransfer.files || [])\n\n if (droppedFiles.length === 0) return\n try {\n const result = await dataSource.uploadSessionArtifacts(sessionId, droppedFiles)\n if ((result.artifacts || []).length > 0) {\n setDropSuccessState()\n void fetchArtifacts({ reset: true, manual: false })\n }\n setError(null)\n } catch (err) {\n setError(err instanceof Error ? err.message : tRef.current('artifacts.failedToLoad'))\n }\n }, [canDropFiles, dataSource, fetchArtifacts, hasDragFiles, sessionId, setDropSuccessState])\n\n const canRenameArtifacts = typeof dataSource.renameSessionArtifact === 'function'\n const canDeleteArtifacts = typeof dataSource.deleteSessionArtifact === 'function'\n\n const handleRenameArtifact = useCallback(\n async (artifact: SessionArtifact, name: string) => {\n if (!dataSource.renameSessionArtifact) {\n return\n }\n const updatedArtifact = await dataSource.renameSessionArtifact(\n artifact.id,\n name,\n artifact.description || ''\n )\n setArtifacts((prev) => {\n const next = prev.map((item) => (item.id === updatedArtifact.id ? updatedArtifact : item))\n artifactsRef.current = next\n return next\n })\n },\n [dataSource]\n )\n\n const canDeleteArtifact = useCallback((artifact: SessionArtifact): boolean => {\n return artifact.type === 'attachment' && !artifact.messageId\n }, [])\n\n const handleDeleteArtifact = useCallback(\n async (artifact: SessionArtifact) => {\n if (!dataSource.deleteSessionArtifact || !canDeleteArtifact(artifact)) {\n return\n }\n await dataSource.deleteSessionArtifact(artifact.id)\n setArtifacts((prev) => {\n const next = prev.filter((item) => item.id !== artifact.id)\n artifactsRef.current = next\n return next\n })\n setPreviewArtifactID((current) => (current === artifact.id ? null : current))\n },\n [canDeleteArtifact, dataSource]\n )\n\n return (\n <aside\n className={[\n 'relative flex min-w-0 flex-1 flex-col border-l border-gray-200 bg-white dark:border-gray-700/80 dark:bg-gray-900',\n isDragging ? 'bg-primary-50/40 dark:bg-primary-950/20' : '',\n className,\n ].join(' ')}\n aria-label={t('artifacts.title')}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {(isDragging || dropSuccess) && (\n <div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center bg-white/85 dark:bg-gray-900/85\">\n <div\n className={[\n 'mx-4 flex w-full max-w-xs flex-col items-center gap-2 rounded-xl border-2 border-dashed px-4 py-6 text-center',\n dropSuccess\n ? 'border-emerald-400 bg-emerald-50 text-emerald-700 dark:border-emerald-500 dark:bg-emerald-950/30 dark:text-emerald-300'\n : 'border-primary-400 bg-primary-50 text-primary-700 dark:border-primary-500 dark:bg-primary-950/30 dark:text-primary-300',\n ].join(' ')}\n >\n <Paperclip className=\"h-5 w-5\" weight=\"bold\" />\n <span className=\"text-sm font-medium\">\n {dropSuccess ? t('input.filesAdded') : t('input.dropFiles')}\n </span>\n </div>\n </div>\n )}\n\n <header className=\"flex items-center justify-between border-b border-gray-200 px-3 py-2 dark:border-gray-700/80\">\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-semibold text-gray-900 dark:text-gray-100\">\n {t('artifacts.title')} ({artifacts.length})\n </h2>\n </div>\n </header>\n\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 py-3\">\n {fetching ? (\n <div className=\"flex h-full items-center justify-center text-sm text-gray-500 dark:text-gray-400\">\n {t('artifacts.loading')}\n </div>\n ) : error ? (\n <div className=\"space-y-3 rounded-lg border border-red-200 bg-red-50 p-3 dark:border-red-900/70 dark:bg-red-950/30\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-300\">{t('artifacts.failedToLoad')}</p>\n <p className=\"text-xs text-red-700 dark:text-red-400\">{error}</p>\n <button\n type=\"button\"\n onClick={() => {\n void fetchArtifacts({ reset: true, manual: true })\n }}\n className=\"cursor-pointer rounded-md border border-red-300 px-2 py-1 text-xs font-medium text-red-700 hover:bg-red-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400/50 dark:border-red-800 dark:text-red-300 dark:hover:bg-red-900/40\"\n >\n {t('alert.retry')}\n </button>\n </div>\n ) : !canFetchArtifacts ? (\n <div className=\"rounded-lg border border-amber-200 bg-amber-50 p-3 text-sm text-amber-800 dark:border-amber-900/70 dark:bg-amber-950/30 dark:text-amber-200\">\n {t('artifacts.unsupported')}\n </div>\n ) : (\n <>\n <SessionArtifactList\n artifacts={artifacts}\n selectedArtifactId={previewArtifactID || undefined}\n onSelect={(artifact) => setPreviewArtifactID(artifact.id)}\n />\n\n {hasMore && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => {\n void fetchArtifacts({ reset: false, manual: true })\n }}\n disabled={loadingMore || refreshing || fetching}\n className=\"cursor-pointer rounded-md border border-gray-200 px-3 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n >\n {loadingMore ? t('artifacts.loadingMore') : t('artifacts.loadMore')}\n </button>\n </div>\n )}\n </>\n )}\n </div>\n\n <SessionArtifactPreviewModal\n isOpen={previewArtifact !== null}\n artifact={previewArtifact}\n onClose={() => setPreviewArtifactID(null)}\n canRename={canRenameArtifacts}\n canDelete={Boolean(previewArtifact && canDeleteArtifacts && canDeleteArtifact(previewArtifact))}\n onRename={canRenameArtifacts ? handleRenameArtifact : undefined}\n onDelete={canDeleteArtifacts ? handleDeleteArtifact : undefined}\n />\n </aside>\n )\n}\n","import { type ReactNode, useState } from 'react'\nimport {\n ChartBar,\n Code,\n FileCsv,\n Image as ImageIcon,\n Package,\n} from '@phosphor-icons/react'\nimport type { SessionArtifact } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { formatFileSize, getFileVisual, CHART_VISUAL, type FileVisual } from '../utils/fileUtils'\n\ninterface SessionArtifactListProps {\n artifacts: SessionArtifact[]\n selectedArtifactId?: string\n onSelect: (artifact: SessionArtifact) => void\n}\n\nconst TYPE_LABEL_KEYS: Record<string, string> = {\n chart: 'artifacts.groupCharts',\n code_output: 'artifacts.groupCodeOutputs',\n export: 'artifacts.groupExports',\n attachment: 'artifacts.groupAttachments',\n other: 'artifacts.groupOther',\n}\n\nfunction getGroupIcon(type: string): ReactNode {\n const cls = 'h-3.5 w-3.5'\n switch (type) {\n case 'chart':\n return <ChartBar className={cls} weight=\"bold\" />\n case 'code_output':\n return <Code className={cls} weight=\"bold\" />\n case 'export':\n return <FileCsv className={cls} weight=\"bold\" />\n case 'attachment':\n return <ImageIcon className={cls} weight=\"bold\" />\n default:\n return <Package className={cls} weight=\"bold\" />\n }\n}\n\nfunction isImageArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || ''\n const name = artifact.name.toLowerCase()\n return mime.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|bmp)$/.test(name)\n}\n\nfunction ImageThumbnail({ src, alt }: { src: string; alt: string }) {\n const [failed, setFailed] = useState(false)\n if (failed) {\n return (\n <div className=\"w-full aspect-video rounded-lg bg-violet-50 dark:bg-violet-900/30 flex items-center justify-center\">\n <ImageIcon className=\"h-6 w-6 text-violet-400 dark:text-violet-500\" weight=\"duotone\" />\n </div>\n )\n }\n return (\n <img\n src={src}\n alt={alt}\n onError={() => setFailed(true)}\n className=\"w-full rounded-lg object-cover max-h-32 bg-gray-100 dark:bg-gray-800\"\n />\n )\n}\n\nfunction getArtifactFileVisual(artifact: SessionArtifact): FileVisual {\n if (artifact.type === 'chart') return CHART_VISUAL\n if (artifact.type === 'code_output') {\n const v = getFileVisual(artifact.mimeType, artifact.name)\n // Code outputs get a sky accent unless they resolve to something specific (image, etc.)\n if (v.label === 'TEXT' || v.label === 'FILE') {\n return { ...v, iconColor: 'text-sky-600 dark:text-sky-400', bgColor: 'bg-sky-100 dark:bg-sky-900/40' }\n }\n return v\n }\n return getFileVisual(artifact.mimeType, artifact.name)\n}\n\nfunction groupArtifactsByType(artifacts: SessionArtifact[]): Array<{ type: string; items: SessionArtifact[] }> {\n const grouped = new Map<string, SessionArtifact[]>()\n\n for (const artifact of artifacts) {\n const type = artifact.type || 'other'\n const existing = grouped.get(type)\n if (existing) {\n existing.push(artifact)\n continue\n }\n grouped.set(type, [artifact])\n }\n\n return Array.from(grouped.entries())\n .map(([type, items]) => ({\n type,\n items: items.sort((a, b) => Date.parse(b.createdAt) - Date.parse(a.createdAt)),\n }))\n .sort((a, b) => a.type.localeCompare(b.type))\n}\n\nexport function SessionArtifactList({\n artifacts,\n selectedArtifactId,\n onSelect,\n}: SessionArtifactListProps) {\n const { t } = useTranslation()\n const grouped = groupArtifactsByType(artifacts)\n\n if (artifacts.length === 0) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 px-4 py-12 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-gray-100 dark:bg-gray-800\">\n <Package className=\"h-6 w-6 text-gray-400 dark:text-gray-500\" weight=\"duotone\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\n {t('artifacts.empty')}\n </p>\n <p className=\"mt-0.5 text-xs text-gray-400 dark:text-gray-500\">\n {t('artifacts.emptySubtitle')}\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-5\">\n {grouped.map((group) => (\n <section key={group.type}>\n <div className=\"mb-2 flex items-center gap-1.5 px-0.5\">\n <span className=\"text-gray-400 dark:text-gray-500\">{getGroupIcon(group.type)}</span>\n <h3 className=\"text-[11px] font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {TYPE_LABEL_KEYS[group.type] ? t(TYPE_LABEL_KEYS[group.type]) : group.type.replace(/_/g, ' ')}\n </h3>\n <span className=\"ml-auto text-[10px] tabular-nums text-gray-400 dark:text-gray-500\">\n {group.items.length}\n </span>\n </div>\n <div className=\"space-y-1\">\n {group.items.map((artifact) => {\n const isSelected = artifact.id === selectedArtifactId\n const visual = getArtifactFileVisual(artifact)\n const Icon = visual.icon\n return (\n <button\n key={artifact.id}\n type=\"button\"\n onClick={() => onSelect(artifact)}\n className={`cursor-pointer group/item w-full rounded-lg border px-3 py-2 text-left transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 ${\n isSelected\n ? 'border-primary-200 bg-primary-50/80 shadow-sm dark:border-primary-800/60 dark:bg-primary-950/40'\n : 'border-transparent bg-white hover:border-gray-200 hover:bg-gray-50 hover:shadow-sm dark:bg-gray-900 dark:hover:border-gray-700/80 dark:hover:bg-gray-800/60'\n }`}\n >\n {isImageArtifact(artifact) && artifact.url ? (\n <div>\n <ImageThumbnail src={artifact.url} alt={artifact.name} />\n <div className=\"mt-2\">\n <span className=\"block truncate text-[13px] font-medium text-gray-900 dark:text-gray-100\">\n {artifact.name}\n </span>\n <span className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n <span>{formatFileSize(artifact.sizeBytes)}</span>\n {artifact.description && (\n <>\n <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n <span className=\"truncate\">{artifact.description}</span>\n </>\n )}\n </span>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center gap-2.5\">\n <span className={`flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-lg ${visual.bgColor} ${visual.iconColor}`}>\n <Icon size={20} weight=\"duotone\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[13px] font-medium text-gray-900 dark:text-gray-100\">\n {artifact.name}\n </span>\n <span className=\"flex items-center gap-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n <span>{formatFileSize(artifact.sizeBytes)}</span>\n {artifact.description && (\n <>\n <span className=\"w-0.5 h-0.5 rounded-full bg-gray-300 dark:bg-gray-600\" />\n <span className=\"truncate\">{artifact.description}</span>\n </>\n )}\n </span>\n </span>\n </div>\n )}\n </button>\n )\n })}\n </div>\n </section>\n ))}\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'\nimport { FloppyDisk, PencilSimple, Trash, X } from '@phosphor-icons/react'\nimport type { SessionArtifact } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { SessionArtifactPreview } from './SessionArtifactPreview'\n\ninterface SessionArtifactPreviewModalProps {\n isOpen: boolean\n artifact: SessionArtifact | null\n canRename?: boolean\n canDelete?: boolean\n onClose: () => void\n onRename?: (artifact: SessionArtifact, name: string) => Promise<void>\n onDelete?: (artifact: SessionArtifact) => Promise<void>\n}\n\nexport function SessionArtifactPreviewModal({\n isOpen,\n artifact,\n canRename = false,\n canDelete = false,\n onClose,\n onRename,\n onDelete,\n}: SessionArtifactPreviewModalProps) {\n const { t } = useTranslation()\n const [isEditingName, setIsEditingName] = useState(false)\n const [nameDraft, setNameDraft] = useState('')\n const [submittingRename, setSubmittingRename] = useState(false)\n const [submittingDelete, setSubmittingDelete] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n setIsEditingName(false)\n setSubmittingRename(false)\n setSubmittingDelete(false)\n setError(null)\n setNameDraft(artifact?.name || '')\n }, [artifact])\n\n const handleClose = () => {\n if (submittingRename || submittingDelete) {\n return\n }\n onClose()\n }\n\n const handleRename = async () => {\n if (!artifact || !onRename) {\n return\n }\n\n const nextName = nameDraft.trim()\n if (!nextName || nextName === artifact.name) {\n setIsEditingName(false)\n setNameDraft(artifact.name)\n return\n }\n\n setSubmittingRename(true)\n setError(null)\n try {\n await onRename(artifact, nextName)\n setIsEditingName(false)\n } catch (err) {\n setError(err instanceof Error ? err.message : t('artifacts.renameFailed'))\n } finally {\n setSubmittingRename(false)\n }\n }\n\n const handleDelete = async () => {\n if (!artifact || !onDelete) {\n return\n }\n if (!window.confirm(t('artifacts.deleteConfirm'))) {\n return\n }\n\n setSubmittingDelete(true)\n setError(null)\n try {\n await onDelete(artifact)\n onClose()\n } catch (err) {\n setError(err instanceof Error ? err.message : t('artifacts.deleteFailed'))\n } finally {\n setSubmittingDelete(false)\n }\n }\n\n if (!artifact) {\n return null\n }\n\n return (\n <Dialog open={isOpen} onClose={handleClose} className=\"relative z-50\">\n <DialogBackdrop className=\"fixed inset-0 bg-black/50 backdrop-blur-sm\" />\n\n <div className=\"fixed inset-0 overflow-y-auto p-4 lg:p-6\">\n <div className=\"mx-auto flex min-h-full w-full max-w-6xl items-center justify-center\">\n <DialogPanel className=\"flex max-h-[92vh] w-full flex-col overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\">\n <div className=\"flex items-start justify-between gap-3 border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"min-w-0 flex-1\">\n {isEditingName ? (\n <div className=\"flex items-center gap-2\">\n <input\n value={nameDraft}\n onChange={(e) => setNameDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n void handleRename()\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n setIsEditingName(false)\n setNameDraft(artifact.name)\n }\n }}\n className=\"w-full rounded-lg border border-gray-300 px-3 py-1.5 text-sm text-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\"\n aria-label={t('artifacts.rename')}\n autoFocus\n />\n <button\n type=\"button\"\n onClick={() => {\n void handleRename()\n }}\n disabled={submittingRename}\n className=\"cursor-pointer inline-flex items-center gap-1 rounded-lg bg-primary-600 px-2.5 py-1.5 text-xs font-medium text-white transition-colors hover:bg-primary-700 disabled:cursor-not-allowed disabled:opacity-60\"\n >\n <FloppyDisk className=\"h-3.5 w-3.5\" weight=\"bold\" />\n {t('message.save')}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setIsEditingName(false)\n setNameDraft(artifact.name)\n }}\n disabled={submittingRename}\n className=\"cursor-pointer rounded-lg border border-gray-200 px-2.5 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-60 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n >\n {t('message.cancel')}\n </button>\n </div>\n ) : (\n <h2 className=\"truncate text-base font-semibold text-gray-900 dark:text-gray-100\">\n {artifact.name}\n </h2>\n )}\n {artifact.description && (\n <p className=\"mt-1 truncate text-xs text-gray-500 dark:text-gray-400\">\n {artifact.description}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n {canRename && onRename && !isEditingName && (\n <button\n type=\"button\"\n onClick={() => {\n setError(null)\n setIsEditingName(true)\n }}\n className=\"cursor-pointer rounded-lg border border-gray-200 p-2 text-gray-600 transition-colors hover:bg-gray-50 hover:text-gray-900 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n aria-label={t('artifacts.rename')}\n title={t('artifacts.rename')}\n >\n <PencilSimple className=\"h-4 w-4\" weight=\"regular\" />\n </button>\n )}\n {canDelete && onDelete && (\n <button\n type=\"button\"\n onClick={() => {\n void handleDelete()\n }}\n disabled={submittingDelete}\n className=\"cursor-pointer rounded-lg border border-red-200 p-2 text-red-600 transition-colors hover:bg-red-50 hover:text-red-700 disabled:cursor-not-allowed disabled:opacity-60 dark:border-red-900/60 dark:text-red-400 dark:hover:bg-red-950/30 dark:hover:text-red-300\"\n aria-label={t('artifacts.delete')}\n title={t('artifacts.delete')}\n >\n <Trash className=\"h-4 w-4\" weight=\"regular\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"cursor-pointer rounded-lg border border-gray-200 p-2 text-gray-600 transition-colors hover:bg-gray-50 hover:text-gray-900 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n aria-label={t('common.close')}\n title={t('common.close')}\n >\n <X className=\"h-4 w-4\" weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-auto p-4 lg:p-5\">\n {error && (\n <div className=\"mb-3 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900/70 dark:bg-red-950/30 dark:text-red-300\">\n {error}\n </div>\n )}\n <SessionArtifactPreview artifact={artifact} />\n </div>\n </DialogPanel>\n </div>\n </div>\n </Dialog>\n )\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport { ArrowSquareOut, DownloadSimple, FileText, SpinnerGap, WarningCircle } from '@phosphor-icons/react'\nimport type { SessionArtifact } from '../types'\nimport { parseChartDataFromSpec, isRecord } from '../utils/chartSpec'\nimport { ChartCard } from './ChartCard'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface SessionArtifactPreviewProps {\n artifact: SessionArtifact\n}\n\nconst TEXT_PREVIEW_MAX_CHARS = 24000\n\nfunction parseChartDataFromArtifact(artifact: SessionArtifact) {\n const metadata = artifact.metadata\n if (!metadata || !isRecord(metadata)) {\n return null\n }\n\n const spec = isRecord(metadata.spec) ? metadata.spec : metadata\n if (!isRecord(spec)) {\n return null\n }\n\n return parseChartDataFromSpec(spec, artifact.name)\n}\n\nfunction isImageArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || ''\n const name = artifact.name.toLowerCase()\n return mime.startsWith('image/') || /\\.(png|jpe?g|gif|webp|svg|bmp)$/.test(name)\n}\n\nfunction isPDFArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || ''\n const name = artifact.name.toLowerCase()\n return mime.includes('pdf') || name.endsWith('.pdf')\n}\n\nfunction isOfficeDocumentArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || ''\n const name = artifact.name.toLowerCase()\n return (\n mime.includes('wordprocessingml') ||\n mime.includes('msword') ||\n mime.includes('excel') ||\n mime.includes('spreadsheet') ||\n /\\.(docx?|xlsx?|xlsm|xlsb)$/.test(name)\n )\n}\n\nfunction isTextArtifact(artifact: SessionArtifact): boolean {\n const mime = artifact.mimeType?.toLowerCase() || ''\n const name = artifact.name.toLowerCase()\n return (\n mime.startsWith('text/') ||\n mime.includes('json') ||\n mime.includes('xml') ||\n mime.includes('yaml') ||\n mime.includes('csv') ||\n mime.includes('tab-separated') ||\n /\\.(txt|md|json|xml|ya?ml|csv|tsv|log|sql)$/.test(name)\n )\n}\n\nfunction isAbsoluteHTTPURL(url: string): boolean {\n return /^https?:\\/\\//i.test(url)\n}\n\nfunction WarningBox({ message }: { message: string }) {\n return (\n <div className=\"flex items-start gap-2.5 rounded-xl border border-amber-200/80 bg-amber-50 p-3 text-sm text-amber-800 dark:border-amber-800/40 dark:bg-amber-950/20 dark:text-amber-200\">\n <WarningCircle className=\"mt-0.5 h-4 w-4 shrink-0\" weight=\"duotone\" />\n <span className=\"leading-relaxed\">{message}</span>\n </div>\n )\n}\n\nfunction ArtifactActions({ url }: { url: string }) {\n const { t } = useTranslation()\n\n return (\n <div className=\"flex items-center gap-2\">\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-2 rounded-lg border border-gray-200 px-3 py-1.5 text-xs font-medium text-gray-700 transition-colors hover:bg-gray-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800\"\n >\n <ArrowSquareOut className=\"h-3.5 w-3.5\" weight=\"bold\" />\n {t('artifacts.openInNewTab')}\n </a>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noreferrer\"\n download\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary-600 px-3 py-1.5 text-xs font-medium text-white shadow-sm transition-colors hover:bg-primary-700\"\n >\n <DownloadSimple className=\"h-3.5 w-3.5\" weight=\"bold\" />\n {t('artifacts.download')}\n </a>\n </div>\n )\n}\n\nfunction TextArtifactPreview({ artifact }: { artifact: SessionArtifact }) {\n const { t } = useTranslation()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [content, setContent] = useState('')\n const [truncated, setTruncated] = useState(false)\n\n useEffect(() => {\n if (!artifact.url) {\n setLoading(false)\n setError(t('artifacts.textPreviewFailed'))\n return\n }\n\n const controller = new AbortController()\n setLoading(true)\n setError(null)\n setContent('')\n setTruncated(false)\n\n fetch(artifact.url, { signal: controller.signal, credentials: 'include' })\n .then(async (response) => {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`)\n }\n const text = await response.text()\n if (text.length > TEXT_PREVIEW_MAX_CHARS) {\n setContent(text.slice(0, TEXT_PREVIEW_MAX_CHARS))\n setTruncated(true)\n return\n }\n setContent(text)\n })\n .catch((err) => {\n if (err instanceof Error && err.name === 'AbortError') {\n return\n }\n setError(t('artifacts.textPreviewFailed'))\n })\n .finally(() => {\n setLoading(false)\n })\n\n return () => {\n controller.abort()\n }\n }, [artifact.url, t])\n\n if (loading) {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center rounded-xl border border-gray-200 bg-gray-50 text-sm text-gray-500 dark:border-gray-700/60 dark:bg-gray-800/30 dark:text-gray-400\">\n <SpinnerGap className=\"mr-2 h-4 w-4 animate-spin\" />\n {t('artifacts.previewLoading')}\n </div>\n )\n }\n\n if (error) {\n return <WarningBox message={error} />\n }\n\n return (\n <div className=\"space-y-2\">\n <pre className=\"max-h-[70vh] overflow-auto rounded-xl border border-gray-200 bg-gray-50 p-3 text-xs leading-relaxed text-gray-800 dark:border-gray-700/60 dark:bg-gray-900 dark:text-gray-100\">\n {content || t('artifacts.previewUnavailable')}\n </pre>\n {truncated && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{t('artifacts.textPreviewTruncated')}</p>\n )}\n </div>\n )\n}\n\nexport function SessionArtifactPreview({ artifact }: SessionArtifactPreviewProps) {\n const { t } = useTranslation()\n\n const officeViewerURL = useMemo(() => {\n if (!artifact.url || !isAbsoluteHTTPURL(artifact.url)) {\n return null\n }\n return `https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(artifact.url)}`\n }, [artifact.url])\n\n if (artifact.type === 'chart') {\n const chartData = parseChartDataFromArtifact(artifact)\n if (chartData) {\n return <ChartCard chartData={chartData} />\n }\n return <WarningBox message={t('artifacts.chartUnavailable')} />\n }\n\n if (isImageArtifact(artifact)) {\n if (!artifact.url) {\n return <WarningBox message={t('artifacts.imageUnavailable')} />\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50/50 dark:border-gray-700/60 dark:bg-gray-800/30\">\n <img\n src={artifact.url}\n alt={artifact.name}\n className=\"h-auto max-h-[72vh] w-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n <ArtifactActions url={artifact.url} />\n </div>\n )\n }\n\n if (isPDFArtifact(artifact)) {\n if (!artifact.url) {\n return <WarningBox message={t('artifacts.downloadUnavailable')} />\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50 dark:border-gray-700/60 dark:bg-gray-900\">\n <iframe\n src={artifact.url}\n title={artifact.name}\n className=\"h-[72vh] w-full\"\n />\n </div>\n <ArtifactActions url={artifact.url} />\n </div>\n )\n }\n\n if (isOfficeDocumentArtifact(artifact)) {\n if (!artifact.url) {\n return <WarningBox message={t('artifacts.downloadUnavailable')} />\n }\n\n return (\n <div className=\"space-y-3\">\n {officeViewerURL ? (\n <div className=\"overflow-hidden rounded-xl border border-gray-200/80 bg-gray-50 dark:border-gray-700/60 dark:bg-gray-900\">\n <iframe\n src={officeViewerURL}\n title={artifact.name}\n className=\"h-[72vh] w-full\"\n />\n </div>\n ) : (\n <WarningBox message={t('artifacts.officePreviewUnavailable')} />\n )}\n <ArtifactActions url={artifact.url} />\n </div>\n )\n }\n\n if (isTextArtifact(artifact)) {\n return (\n <div className=\"space-y-3\">\n <TextArtifactPreview artifact={artifact} />\n {artifact.url && <ArtifactActions url={artifact.url} />}\n </div>\n )\n }\n\n if (artifact.url) {\n return (\n <div className=\"space-y-3\">\n <div className=\"flex min-h-[240px] flex-col items-center justify-center rounded-xl border border-gray-200/80 bg-gray-50/60 p-6 text-center dark:border-gray-700/60 dark:bg-gray-900\">\n <FileText className=\"h-8 w-8 text-gray-400 dark:text-gray-500\" weight=\"duotone\" />\n <p className=\"mt-3 text-sm font-medium text-gray-800 dark:text-gray-100\">{t('artifacts.previewUnavailable')}</p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">{t('artifacts.previewNotSupported')}</p>\n </div>\n <ArtifactActions url={artifact.url} />\n </div>\n )\n }\n\n return <WarningBox message={t('artifacts.downloadUnavailable')} />\n}\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 { SessionArtifactsPanel } from './components/SessionArtifactsPanel'\nexport { SessionArtifactList } from './components/SessionArtifactList'\nexport { SessionArtifactPreview } from './components/SessionArtifactPreview'\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 { CompactionDoodle } from './components/CompactionDoodle'\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 } from './components/TypingIndicator'\n\n// Session management components\nexport { default as Sidebar } from './components/Sidebar'\nexport { default as SessionItem } from './components/SessionItem'\nexport { default as ArchivedChatList } from './components/ArchivedChatList'\nexport { default as AllChatsList } from './components/AllChatsList'\nexport { TabBar } from './components/TabBar'\nexport { UserFilter } from './components/UserFilter'\nexport { default as DateGroupHeader } from './components/DateGroupHeader'\nexport { default as SessionSkeleton } from './components/SessionSkeleton'\n\n// Specialized message components\nexport { SystemMessage } from './components/SystemMessage'\nexport { DebugPanel, type DebugPanelProps } from './components/DebugPanel'\n\n// Generic UI components\nexport { default as Alert } from './components/Alert'\nexport { default as ArchiveBanner } from './components/ArchiveBanner'\nexport { RetryActionArea } from './components/RetryActionArea'\nexport { StreamError } from './components/StreamError'\nexport { MessageActions } from './components/MessageActions'\nexport { default as AttachmentPreview } from './components/AttachmentPreview'\nexport { default as AttachmentUpload } from './components/AttachmentUpload'\nexport { default as ScreenReaderAnnouncer } from './components/ScreenReaderAnnouncer'\nexport { default as SkipLink } from './components/SkipLink'\nexport { TouchContextMenu } from './components/TouchContextMenu'\n\n// Question form wizard\nexport { default as QuestionForm } from './components/QuestionForm'\nexport { default as QuestionStep } from './components/QuestionStep'\nexport { default as ConfirmationStep } from './components/ConfirmationStep'\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// Session & interaction hooks\nexport { useScrollToBottom } from './hooks/useScrollToBottom'\nexport { useKeyboardShortcuts, type ShortcutConfig } from './hooks/useKeyboardShortcuts'\nexport { useLongPress } from './hooks/useLongPress'\n\n// =============================================================================\n// Animations\n// =============================================================================\n\nexport * from './animations'\n\n// =============================================================================\n// Context\n// =============================================================================\n\nexport { ChatSessionProvider, useChat, useChatSession, useChatMessaging, useOptionalChatMessaging, useChatInput } 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'\nexport type { BichatRPC } from './data/rpc.generated'\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport { RateLimiter } from './utils/RateLimiter'\nexport * from './utils/fileUtils'\nexport { processCitations, type ProcessedContent } from './utils/citationProcessor'\nexport { normalizeStreamingMarkdown } from './utils/markdownStream'\nexport { parseSSEStream, type SSEEvent } from './utils/sseParser'\nexport { groupSessionsByDate } from './utils/sessionGrouping'\nexport { formatRelativeTime } from './utils/dateFormatting'\nexport { isQuestionAnswered, validateAnswers } from './utils/questionFormUtils'\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 SessionArtifact,\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 ChatSessionStateValue,\n ChatMessagingStateValue,\n ChatInputStateValue,\n // Session management types\n SessionListResult,\n SessionUser,\n SessionGroup,\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 * EmptyState Component\n * Reusable empty state display with icon, title, description, and action\n */\n\nimport { memo, type ReactNode } from 'react'\nimport { motion, useReducedMotion } 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 const prefersReducedMotion = useReducedMotion()\n const duration = prefersReducedMotion ? 0 : 0.4\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, delay: prefersReducedMotion ? 0 : 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, delay: prefersReducedMotion ? 0 : 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, delay: prefersReducedMotion ? 0 : 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, delay: prefersReducedMotion ? 0 : 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-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 dark:focus-visible: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-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:border-primary-400 dark:focus-visible: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={`cursor-pointer 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 * 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 motion-reduce:animate-none 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 motion-reduce:animate-none`}\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 motion-reduce:animate-none`} />\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 * 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\n// Bumped to *-700 / dark:*-800 for WCAG AA contrast (4.5:1) with white text at text-sm\nconst typeConfig = {\n success: {\n bgColor: 'bg-green-700',\n darkBgColor: 'dark:bg-green-800',\n icon: <CheckCircle size={20} className=\"w-5 h-5 flex-shrink-0\" weight=\"fill\" />,\n },\n error: {\n bgColor: 'bg-red-700',\n darkBgColor: 'dark:bg-red-800',\n icon: <XCircle size={20} className=\"w-5 h-5 flex-shrink-0\" weight=\"fill\" />,\n },\n info: {\n bgColor: 'bg-blue-700',\n darkBgColor: 'dark:bg-blue-800',\n icon: <Info size={20} className=\"w-5 h-5 flex-shrink-0\" weight=\"fill\" />,\n },\n warning: {\n bgColor: 'bg-amber-700',\n darkBgColor: 'dark:bg-amber-800',\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 notification',\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=\"cursor-pointer 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 sm:top-6 sm:right-6 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 * Polished confirmation dialog with contextual icon, refined typography,\n * and smooth micro-interactions.\n * Uses @headlessui/react Dialog for accessible modal behavior.\n */\n\nimport { memo } from 'react'\nimport { Dialog, DialogBackdrop, DialogPanel, DialogTitle, Description } from '@headlessui/react'\nimport { WarningCircle } from '@phosphor-icons/react'\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 return (\n <Dialog open={isOpen} onClose={onCancel} className=\"relative z-40\">\n {/* Backdrop */}\n <DialogBackdrop className=\"fixed inset-0 bg-black/40 dark:bg-black/60 backdrop-blur-sm transition-opacity duration-200\" />\n\n {/* Modal */}\n <div className=\"fixed inset-0 flex items-center justify-center z-50 p-4\">\n <DialogPanel className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl dark:shadow-2xl dark:shadow-black/30 max-w-sm w-full overflow-hidden\">\n <div className=\"px-6 pt-6 pb-5\">\n {/* Icon + Title */}\n <div className=\"flex items-start gap-3.5\">\n {isDanger && (\n <div className=\"flex-shrink-0 flex items-center justify-center w-10 h-10 rounded-xl bg-red-50 dark:bg-red-950/40 border border-red-200/60 dark:border-red-800/40\">\n <WarningCircle size={22} weight=\"duotone\" className=\"text-red-600 dark:text-red-400\" />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <DialogTitle className=\"text-base font-semibold text-gray-900 dark:text-gray-100 leading-snug\">\n {title}\n </DialogTitle>\n <Description className=\"mt-2 text-sm text-gray-600 dark:text-gray-400 leading-relaxed\">\n {message}\n </Description>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-2.5 px-6 pb-5\">\n <button\n onClick={onCancel}\n className=\"cursor-pointer px-4 py-2 text-sm font-medium rounded-xl text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700/60 hover:bg-gray-200 dark:hover:bg-gray-700 active:bg-gray-250 dark:active:bg-gray-600 transition-colors 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-800\"\n aria-label={`Cancel ${title.toLowerCase()}`}\n data-testid=\"confirm-modal-cancel\"\n >\n {cancelText}\n </button>\n <button\n onClick={onConfirm}\n className={[\n 'cursor-pointer px-4 py-2 text-sm font-medium rounded-xl text-white',\n 'transition-all duration-150 shadow-sm hover:shadow',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-gray-800',\n isDanger\n ? 'bg-red-600 hover:bg-red-700 active:bg-red-800 focus-visible:ring-red-500/50'\n : 'bg-primary-600 hover:bg-primary-700 active:bg-primary-800 focus-visible:ring-primary-500/50',\n ].join(' ')}\n aria-label={`Confirm ${title.toLowerCase()}`}\n data-testid=\"confirm-modal-confirm\"\n >\n {confirmText}\n </button>\n </div>\n </DialogPanel>\n </div>\n </Dialog>\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","interface SessionSkeletonProps {\n count?: number\n}\n\nexport default function SessionSkeleton({ count = 5 }: SessionSkeletonProps) {\n return (\n <div className=\"space-y-1 px-2\">\n {Array.from({ length: count }).map((_, index) => (\n <div\n key={index}\n className=\"animate-pulse px-3 py-2 rounded-lg\"\n >\n <div className=\"flex items-center gap-2\">\n {/* Icon placeholder */}\n <div className=\"w-5 h-5 bg-gray-300 dark:bg-gray-700 rounded\" />\n {/* Text placeholder */}\n <div className=\"flex-1\">\n <div className=\"h-4 bg-gray-300 dark:bg-gray-700 rounded w-3/4\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n )\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\n\ninterface LongPressOptions {\n delay?: number; // Default: 500ms\n onLongPress: (e: React.TouchEvent | React.MouseEvent) => void;\n onPressStart?: () => void;\n onPressCancel?: () => void;\n moveThreshold?: number; // Default: 10px - cancel if moved more\n hapticFeedback?: boolean; // Default: true\n}\n\ninterface LongPressEventHandlers {\n onTouchStart: (e: React.TouchEvent) => void;\n onTouchEnd: (e: React.TouchEvent) => void;\n onTouchMove: (e: React.TouchEvent) => void;\n onMouseDown?: (e: React.MouseEvent) => void; // For desktop testing\n onMouseUp?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n}\n\ninterface LongPressResult {\n handlers: LongPressEventHandlers;\n isPressed: boolean;\n}\n\nexport function useLongPress(options: LongPressOptions): LongPressResult {\n const {\n delay = 500,\n onLongPress,\n onPressStart,\n onPressCancel,\n moveThreshold = 10,\n hapticFeedback = true,\n } = options;\n\n const [isPressed, setIsPressed] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const startPosRef = useRef<{ x: number; y: number } | null>(null);\n const eventRef = useRef<React.TouchEvent | React.MouseEvent | null>(null);\n\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const handlePressStart = useCallback(\n (e: React.TouchEvent | React.MouseEvent) => {\n // Note: Do NOT call preventDefault() on touchstart - it breaks long-press on iPadOS Safari\n // Text selection is prevented via CSS user-select: none on .touch-tap class instead\n\n setIsPressed(true);\n eventRef.current = e;\n\n // Store starting position\n const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\n const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n startPosRef.current = { x: clientX, y: clientY };\n\n onPressStart?.();\n\n clearTimer();\n timerRef.current = setTimeout(() => {\n if (hapticFeedback && navigator.vibrate) {\n navigator.vibrate(10);\n }\n onLongPress(eventRef.current!);\n }, delay);\n },\n [delay, onLongPress, onPressStart, hapticFeedback, clearTimer]\n );\n\n const handlePressEnd = useCallback(() => {\n clearTimer();\n setIsPressed(false);\n startPosRef.current = null;\n eventRef.current = null;\n }, [clearTimer]);\n\n const handlePressCancel = useCallback(() => {\n clearTimer();\n setIsPressed(false);\n startPosRef.current = null;\n eventRef.current = null;\n onPressCancel?.();\n }, [clearTimer, onPressCancel]);\n\n const handleMove = useCallback(\n (e: React.TouchEvent | React.MouseEvent) => {\n if (!startPosRef.current || !isPressed) return;\n\n const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX;\n const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY;\n\n const deltaX = Math.abs(clientX - startPosRef.current.x);\n const deltaY = Math.abs(clientY - startPosRef.current.y);\n\n if (deltaX > moveThreshold || deltaY > moveThreshold) {\n handlePressCancel();\n }\n },\n [isPressed, moveThreshold, handlePressCancel]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearTimer();\n };\n }, [clearTimer]);\n\n return {\n handlers: {\n onTouchStart: handlePressStart,\n onTouchEnd: handlePressEnd,\n onTouchMove: handleMove,\n onMouseDown: handlePressStart,\n onMouseUp: handlePressEnd,\n onMouseLeave: handlePressCancel,\n },\n isPressed,\n };\n}\n","import { useEffect, useRef, useState, useCallback, FC, ReactNode, CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon?: ReactNode;\n onClick: () => void;\n variant?: 'default' | 'danger';\n disabled?: boolean;\n}\n\ninterface TouchContextMenuProps {\n items: ContextMenuItem[];\n isOpen: boolean;\n onClose: () => void;\n anchorRect: DOMRect | null;\n}\n\nexport const TouchContextMenu: FC<TouchContextMenuProps> = ({\n items,\n isOpen,\n onClose,\n anchorRect,\n}) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const enabledIndices = items.reduce<number[]>((acc, item, i) => {\n if (!item.disabled) acc.push(i);\n return acc;\n }, []);\n\n const focusItem = useCallback((index: number) => {\n setFocusedIndex(index);\n itemRefs.current[index]?.focus();\n }, []);\n\n // Auto-focus first enabled item on open\n useEffect(() => {\n if (!isOpen) {\n setFocusedIndex(-1);\n return;\n }\n\n // Small delay to let the menu render\n const timer = requestAnimationFrame(() => {\n if (enabledIndices.length > 0) {\n focusItem(enabledIndices[0]);\n }\n });\n return () => cancelAnimationFrame(timer);\n }, [isOpen, enabledIndices.length, focusItem]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const currentEnabledPos = enabledIndices.indexOf(focusedIndex);\n\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n case 'ArrowDown': {\n e.preventDefault();\n const nextPos = currentEnabledPos < enabledIndices.length - 1\n ? currentEnabledPos + 1\n : 0;\n focusItem(enabledIndices[nextPos]);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prevPos = currentEnabledPos > 0\n ? currentEnabledPos - 1\n : enabledIndices.length - 1;\n focusItem(enabledIndices[prevPos]);\n break;\n }\n case 'Home':\n e.preventDefault();\n if (enabledIndices.length > 0) focusItem(enabledIndices[0]);\n break;\n case 'End':\n e.preventDefault();\n if (enabledIndices.length > 0) focusItem(enabledIndices[enabledIndices.length - 1]);\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose, focusedIndex, enabledIndices, focusItem]);\n\n if (!isOpen || !anchorRect) return null;\n\n const viewportHeight = window.innerHeight;\n const menuEstimatedHeight = items.length * 44 + 16;\n const spaceBelow = viewportHeight - anchorRect.bottom;\n const shouldShowAbove = spaceBelow < menuEstimatedHeight && anchorRect.top > spaceBelow;\n\n const style: CSSProperties = {\n position: 'fixed',\n left: `${anchorRect.left}px`,\n width: `${anchorRect.width}px`,\n zIndex: 9999,\n ...(shouldShowAbove\n ? { bottom: `${viewportHeight - anchorRect.top}px` }\n : { top: `${anchorRect.bottom}px` }),\n };\n\n return createPortal(\n <AnimatePresence>\n {isOpen && (\n <>\n <div\n className=\"fixed inset-0 z-[9998]\"\n onClick={onClose}\n />\n\n <motion.div\n ref={menuRef}\n role=\"menu\"\n aria-label=\"Context menu\"\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.15 }}\n style={style}\n className=\"rounded-xl shadow-xl backdrop-blur bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 overflow-hidden\"\n >\n <div className=\"py-2\">\n {items.map((item, index) => (\n <button\n key={item.id}\n ref={(el) => { itemRefs.current[index] = el; }}\n role=\"menuitem\"\n tabIndex={focusedIndex === index ? 0 : -1}\n onClick={() => {\n if (!item.disabled) {\n item.onClick();\n onClose();\n }\n }}\n disabled={item.disabled}\n className={`\n w-full flex items-center gap-3 px-4 py-2.5 min-h-[44px]\n text-left text-sm font-medium transition-colors\n ${item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700 active:bg-gray-200 dark:active:bg-gray-600'}\n ${item.variant === 'danger'\n ? 'text-red-600 dark:text-red-400'\n : 'text-gray-900 dark:text-gray-100'}\n `}\n >\n {item.icon && (\n <span className=\"flex-shrink-0 w-5 h-5 flex items-center justify-center\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1\">{item.label}</span>\n </button>\n ))}\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>,\n document.body\n );\n};\n","/**\n * SessionItem Component\n * Individual chat session item in the sidebar with actions menu\n * Router-agnostic: uses onSelect callback instead of Link\n */\n\nimport React, { useRef, memo, useState, useEffect } from 'react'\nimport { motion } from 'framer-motion'\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'\nimport { DotsThree, Check, Bookmark, PencilSimple, Archive, ArrowsClockwise, ArrowUUpLeft, Trash } from '@phosphor-icons/react'\nimport { EditableText, type EditableTextRef } from './EditableText'\nimport { sessionItemVariants } from '../animations/variants'\nimport type { Session } from '../types'\nimport { useLongPress } from '../hooks/useLongPress'\nimport { TouchContextMenu, type ContextMenuItem } from './TouchContextMenu'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface SessionItemProps {\n session: Session\n isActive: boolean\n mode?: 'active' | 'archived'\n onSelect: (sessionId: string) => void\n onArchive?: () => void\n onRestore?: () => void\n onPin?: () => void\n onRename?: (newTitle: string) => void\n onRegenerateTitle?: () => void\n onDelete?: () => void\n testIdPrefix?: string\n className?: string\n}\n\nconst SessionItem = memo<SessionItemProps>(\n ({\n session,\n isActive,\n mode = 'active',\n onSelect,\n onArchive,\n onRestore,\n onPin,\n onRename,\n onRegenerateTitle,\n onDelete,\n testIdPrefix = 'sidebar',\n className = '',\n }) => {\n const editableTitleRef = useRef<EditableTextRef>(null)\n const itemRef = useRef<HTMLButtonElement>(null)\n const [menuOpen, setMenuOpen] = useState(false)\n const [menuAnchor, setMenuAnchor] = useState<DOMRect | null>(null)\n const [isTouch, setIsTouch] = useState(false)\n const { t } = useTranslation()\n\n // Detect touch device\n useEffect(() => {\n setIsTouch('ontouchend' in document)\n }, [])\n\n // Check if title is being generated (null, empty, or \"New Chat\")\n const isTitleGenerating = !session.title || session.title === t('chat.newChat')\n\n // Generate title from session (use existing title or show generating state)\n const displayTitle = isTitleGenerating ? t('common.generating') : (session.title ?? t('common.untitled'))\n\n // Long press handlers for touch devices\n const { handlers: longPressHandlers } = useLongPress({\n delay: 500,\n onLongPress: (e) => {\n const target = e.currentTarget as HTMLElement\n setMenuAnchor(target.getBoundingClientRect())\n setMenuOpen(true)\n },\n hapticFeedback: true,\n })\n\n // Add contextmenu event listener as fallback for iPadOS\n useEffect(() => {\n const element = itemRef.current\n if (!element) return\n\n const isIPad = /iPad|Macintosh/i.test(navigator.userAgent) && 'ontouchend' in document\n\n if (isIPad) {\n const handleContextMenu = (e: Event) => {\n e.preventDefault()\n const target = e.currentTarget as HTMLElement\n setMenuAnchor(target.getBoundingClientRect())\n setMenuOpen(true)\n }\n\n element.addEventListener('contextmenu', handleContextMenu)\n return () => element.removeEventListener('contextmenu', handleContextMenu)\n }\n return undefined\n }, [itemRef])\n\n const contextMenuItems: ContextMenuItem[] = mode === 'archived'\n ? [\n ...(onRestore ? [{\n id: 'restore',\n label: t('archived.restoreButton'),\n icon: <ArrowUUpLeft size={20} />,\n onClick: () => onRestore(),\n }] : []),\n ...(onRename ? [{\n id: 'rename',\n label: t('sidebar.renameChat'),\n icon: <PencilSimple size={20} />,\n onClick: () => editableTitleRef.current?.startEditing(),\n }] : []),\n ]\n : [\n ...(onPin ? [{\n id: 'pin',\n label: session.pinned ? t('sidebar.unpinChat') : t('sidebar.pinChat'),\n icon: session.pinned ? <Check size={20} /> : <Bookmark size={20} />,\n onClick: () => onPin(),\n }] : []),\n ...(onRename ? [{\n id: 'rename',\n label: t('sidebar.renameChat'),\n icon: <PencilSimple size={20} />,\n onClick: () => editableTitleRef.current?.startEditing(),\n }] : []),\n ...(onRegenerateTitle ? [{\n id: 'regenerate',\n label: t('sidebar.regenerateTitle'),\n icon: <ArrowsClockwise size={20} />,\n onClick: () => onRegenerateTitle(),\n }] : []),\n ...(onArchive ? [{\n id: 'archive',\n label: t('sidebar.archiveChat'),\n icon: <Archive size={20} />,\n onClick: () => onArchive(),\n variant: 'danger' as const,\n }] : []),\n ...(onDelete ? [{\n id: 'delete',\n label: t('sidebar.deleteChat'),\n icon: <Trash size={20} />,\n onClick: () => onDelete(),\n variant: 'danger' as const,\n }] : []),\n ]\n\n const hasContextMenu = contextMenuItems.length > 0\n\n return (\n <>\n <motion.div\n variants={sessionItemVariants}\n initial=\"initial\"\n animate=\"animate\"\n whileHover=\"hover\"\n exit=\"exit\"\n >\n <button\n type=\"button\"\n ref={itemRef}\n onClick={() => onSelect(session.id)}\n className={`block w-full text-left px-3 py-2 rounded-lg transition-smooth group relative touch-tap cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 ${\n isActive\n ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 border-l-4 border-transparent'\n } ${className}`}\n aria-current={isActive ? 'page' : undefined}\n data-session-item\n data-testid={`${testIdPrefix}-session-${session.id}`}\n {...longPressHandlers}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <EditableText\n ref={editableTitleRef}\n value={displayTitle}\n onSave={(newTitle) => onRename?.(newTitle)}\n isLoading={isTitleGenerating}\n />\n </div>\n {!isTouch && hasContextMenu && (\n <Menu>\n <MenuButton\n onClick={(e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n className=\"opacity-0 group-hover:opacity-100 p-1.5 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-smooth flex-shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={t('sidebar.chatOptions')}\n data-testid={`${testIdPrefix}-session-options-${session.id}`}\n >\n <DotsThree size={16} className=\"w-4 h-4\" weight=\"bold\" />\n </MenuButton>\n <MenuItems\n anchor=\"bottom start\"\n className=\"w-52 bg-white/95 dark:bg-gray-900/95 backdrop-blur rounded-xl shadow-xl border border-gray-200 dark:border-gray-700 z-30 [--anchor-gap:8px] mt-1 p-2 space-y-1\"\n >\n {mode !== 'archived' && onPin && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onPin()\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n focus\n ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n aria-label={session.pinned ? t('sidebar.unpinChat') : t('sidebar.pinChat')}\n data-testid={`${testIdPrefix}-session-pin-${session.id}`}\n >\n {session.pinned ? (\n <Check size={16} className=\"w-4 h-4\" />\n ) : (\n <Bookmark size={16} className=\"w-4 h-4\" />\n )}\n {session.pinned ? t('sidebar.unpinChat') : t('sidebar.pinChat')}\n </button>\n )}\n </MenuItem>\n )}\n {onRename && (\n <MenuItem>\n {({ focus, close }) => (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n editableTitleRef.current?.startEditing()\n close()\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n focus\n ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n aria-label={t('sidebar.renameChat')}\n data-testid={`${testIdPrefix}-session-rename-${session.id}`}\n >\n <PencilSimple size={16} className=\"w-4 h-4\" />\n {t('sidebar.renameChat')}\n </button>\n )}\n </MenuItem>\n )}\n {mode !== 'archived' && onRegenerateTitle && (\n <MenuItem>\n {({ focus, close }) => (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onRegenerateTitle()\n close()\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 transition-smooth ${\n focus\n ? 'bg-gray-100 dark:bg-gray-800/70 ring-1 ring-gray-200/80 dark:ring-gray-700/80'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n aria-label={t('sidebar.regenerateTitle')}\n data-testid={`${testIdPrefix}-session-regenerate-${session.id}`}\n >\n <ArrowsClockwise size={16} className=\"w-4 h-4\" />\n {t('sidebar.regenerateTitle')}\n </button>\n )}\n </MenuItem>\n )}\n {mode === 'archived' && onRestore && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onRestore()\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n focus\n ? 'text-green-700 dark:text-green-300 bg-green-50 dark:bg-green-900/20 ring-1 ring-green-200/70 dark:ring-green-500/30'\n : 'text-green-700 dark:text-green-300 hover:bg-green-50/70 dark:hover:bg-green-900/10'\n }`}\n aria-label={t('archived.restoreButton')}\n data-testid={`${testIdPrefix}-session-restore-${session.id}`}\n >\n <ArrowUUpLeft size={16} className=\"w-4 h-4\" />\n {t('archived.restoreButton')}\n </button>\n )}\n </MenuItem>\n )}\n {mode !== 'archived' && onArchive && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onArchive()\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n focus\n ? 'text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 ring-1 ring-amber-200/70 dark:ring-amber-500/30'\n : 'text-amber-600 dark:text-amber-400 hover:bg-amber-50/70 dark:hover:bg-amber-900/10'\n }`}\n aria-label={t('sidebar.archiveChat')}\n data-testid={`${testIdPrefix}-session-archive-${session.id}`}\n >\n <Archive size={16} className=\"w-4 h-4\" />\n {t('sidebar.archiveChat')}\n </button>\n )}\n </MenuItem>\n )}\n {onDelete && (\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onDelete()\n }}\n className={`cursor-pointer flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-smooth ${\n focus\n ? 'text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 ring-1 ring-red-200/70 dark:ring-red-500/30'\n : 'text-red-600 dark:text-red-400 hover:bg-red-50/70 dark:hover:bg-red-900/10'\n }`}\n aria-label={t('sidebar.deleteChat')}\n data-testid={`${testIdPrefix}-session-delete-${session.id}`}\n >\n <Trash size={16} className=\"w-4 h-4\" />\n {t('sidebar.deleteChat')}\n </button>\n )}\n </MenuItem>\n )}\n </MenuItems>\n </Menu>\n )}\n </div>\n </button>\n </motion.div>\n <TouchContextMenu\n items={contextMenuItems}\n isOpen={menuOpen}\n onClose={() => setMenuOpen(false)}\n anchorRect={menuAnchor}\n />\n </>\n )\n }\n)\n\nSessionItem.displayName = 'SessionItem'\n\nexport default SessionItem\n","interface DateGroupHeaderProps {\n groupName: string\n count: number\n}\n\n/**\n * Sticky header for date-based session groups\n * Displays group name and session count\n */\nexport default function DateGroupHeader({ groupName, count }: DateGroupHeaderProps) {\n return (\n <div className=\"sticky top-0 bg-surface-300 dark:bg-gray-900 px-4 py-2 text-sm font-medium z-10 border-b border-gray-100 dark:border-gray-800\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-gray-700 dark:text-gray-300 font-semibold\">{groupName}</span>\n <span className=\"text-xs text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 px-2 py-0.5 rounded-full\">\n {count}\n </span>\n </div>\n </div>\n )\n}\n","/**\n * TabBar Component\n * Horizontal tabs with animated indicator for switching between views\n * Generic: accepts any set of tabs via props\n */\n\nimport { memo, useRef, useCallback } from 'react'\nimport { motion } from 'framer-motion'\n\ninterface TabBarProps {\n tabs: Array<{ id: string; label: string }>\n activeTab: string\n onTabChange: (tabId: string) => void\n}\n\nfunction TabBar({ tabs, activeTab, onTabChange }: TabBarProps) {\n const tablistRef = useRef<HTMLDivElement>(null)\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const currentIndex = tabs.findIndex((tab) => tab.id === activeTab)\n if (currentIndex < 0) return\n\n let nextIndex: number | null = null\n\n switch (e.key) {\n case 'ArrowRight':\n e.preventDefault()\n nextIndex = (currentIndex + 1) % tabs.length\n break\n case 'ArrowLeft':\n e.preventDefault()\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length\n break\n case 'Home':\n e.preventDefault()\n nextIndex = 0\n break\n case 'End':\n e.preventDefault()\n nextIndex = tabs.length - 1\n break\n }\n\n if (nextIndex !== null) {\n onTabChange(tabs[nextIndex].id)\n // Focus the newly activated tab button\n const tablist = tablistRef.current\n if (tablist) {\n const buttons = tablist.querySelectorAll<HTMLElement>('[role=\"tab\"]')\n buttons[nextIndex]?.focus()\n }\n }\n },\n [tabs, activeTab, onTabChange]\n )\n\n if (tabs.length === 0) {\n return null\n }\n\n return (\n <div\n ref={tablistRef}\n className=\"flex gap-1 px-4 pt-4 pb-2 border-b border-gray-200 dark:border-gray-700\"\n role=\"tablist\"\n onKeyDown={handleKeyDown}\n >\n {tabs.map((tab) => (\n <TabButton\n key={tab.id}\n id={tab.id}\n label={tab.label}\n isActive={activeTab === tab.id}\n onClick={() => onTabChange(tab.id)}\n />\n ))}\n </div>\n )\n}\n\ninterface TabButtonProps {\n id: string\n label: string\n isActive: boolean\n onClick: () => void\n}\n\nfunction TabButton({ id, label, isActive, onClick }: TabButtonProps) {\n return (\n <button\n id={id}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`${id}-panel`}\n tabIndex={isActive ? 0 : -1}\n onClick={onClick}\n className={`\n cursor-pointer relative px-4 py-2 rounded-t-lg text-sm font-medium transition-smooth focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n ${\n isActive\n ? 'text-primary-700 dark:text-primary-400'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200'\n }\n `}\n >\n {label}\n\n {/* Active indicator */}\n {isActive && (\n <motion.div\n layoutId=\"activeTab\"\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-primary-600 dark:bg-primary-500\"\n transition={{ duration: 0.2, ease: [0.4, 0, 0.2, 1] }}\n />\n )}\n </button>\n )\n}\n\nconst MemoizedTabBar = memo(TabBar)\nMemoizedTabBar.displayName = 'TabBar'\n\nexport { MemoizedTabBar as TabBar }\nexport default MemoizedTabBar\n","/**\n * UserFilter Component\n * Dropdown to filter chats by user\n * Uses @headlessui/react Menu for accessible dropdown\n */\n\nimport { memo } from 'react'\nimport { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'\nimport { CaretDown, X } from '@phosphor-icons/react'\nimport { UserAvatar } from './UserAvatar'\nimport { useTranslation } from '../hooks/useTranslation'\nimport type { SessionUser } from '../types'\n\ninterface UserFilterProps {\n users: SessionUser[]\n selectedUser: SessionUser | null\n onUserChange: (user: SessionUser | null) => void\n loading?: boolean\n}\n\nfunction UserFilter({ users, selectedUser, onUserChange, loading }: UserFilterProps) {\n const { t } = useTranslation()\n\n return (\n <div className=\"relative\">\n <Menu>\n {({ open }) => (\n <>\n <MenuButton\n disabled={loading}\n className={`\n cursor-pointer w-full px-3 py-2 bg-white dark:bg-gray-800\n border border-gray-300 dark:border-gray-600\n rounded-lg text-sm text-left\n hover:bg-gray-50 dark:hover:bg-gray-700\n focus:outline-none focus:ring-2 focus:ring-primary-500\n transition-smooth\n disabled:opacity-50 disabled:cursor-not-allowed\n flex items-center justify-between gap-2\n `}\n aria-label={t('allChats.allUsers')}\n >\n {selectedUser ? (\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <UserAvatar\n firstName={selectedUser.firstName}\n lastName={selectedUser.lastName}\n initials={selectedUser.initials}\n size=\"sm\"\n />\n <span className=\"truncate text-gray-900 dark:text-gray-100\">\n {selectedUser.firstName} {selectedUser.lastName}\n </span>\n </div>\n ) : (\n <span className=\"text-gray-500 dark:text-gray-400\">\n {loading ? t('allChats.loadingUsers') : t('allChats.allUsers')}\n </span>\n )}\n\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {selectedUser && (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onUserChange(null)\n }}\n className=\"cursor-pointer p-1 rounded hover:bg-gray-200 dark:hover:bg-gray-600 transition-smooth\"\n aria-label={t('common.clear')}\n >\n <X size={14} className=\"w-3.5 h-3.5 text-gray-600 dark:text-gray-400\" />\n </button>\n )}\n <CaretDown\n size={16}\n className={`w-4 h-4 text-gray-600 dark:text-gray-400 transition-transform ${\n open ? 'rotate-180' : ''\n }`}\n />\n </div>\n </MenuButton>\n\n <MenuItems\n anchor=\"bottom start\"\n className=\"\n w-[var(--button-width)]\n max-h-64 overflow-y-auto\n bg-white dark:bg-gray-800\n border border-gray-200 dark:border-gray-700\n rounded-lg shadow-lg\n z-50\n [--anchor-gap:4px]\n mt-1 p-1\n \"\n >\n {/* \"All users\" option */}\n <MenuItem>\n {({ focus }) => (\n <button\n onClick={() => onUserChange(null)}\n className={`\n cursor-pointer w-full text-left px-3 py-2 rounded-lg text-sm\n transition-smooth\n ${\n focus\n ? 'bg-gray-100 dark:bg-gray-700'\n : 'hover:bg-gray-50 dark:hover:bg-gray-750'\n }\n ${\n !selectedUser\n ? 'text-primary-700 dark:text-primary-400 font-medium'\n : 'text-gray-900 dark:text-gray-100'\n }\n `}\n >\n {t('allChats.allUsers')}\n </button>\n )}\n </MenuItem>\n\n {/* Divider */}\n {users.length > 0 && (\n <div className=\"border-t border-gray-200 dark:border-gray-700 my-1\" />\n )}\n\n {/* User options */}\n {users.map((user) => (\n <MenuItem key={user.id}>\n {({ focus }) => (\n <button\n onClick={() => onUserChange(user)}\n className={`\n cursor-pointer w-full text-left px-3 py-2 rounded-lg text-sm\n transition-smooth\n flex items-center gap-2\n ${\n focus\n ? 'bg-gray-100 dark:bg-gray-700'\n : 'hover:bg-gray-50 dark:hover:bg-gray-750'\n }\n ${\n selectedUser?.id === user.id\n ? 'text-primary-700 dark:text-primary-400 font-medium'\n : 'text-gray-900 dark:text-gray-100'\n }\n `}\n >\n <UserAvatar\n firstName={user.firstName}\n lastName={user.lastName}\n initials={user.initials}\n size=\"sm\"\n />\n <span className=\"truncate\">\n {user.firstName} {user.lastName}\n </span>\n </button>\n )}\n </MenuItem>\n ))}\n\n {/* Empty state */}\n {users.length === 0 && (\n <div className=\"px-3 py-6 text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('allChats.noUsersFound')}</p>\n </div>\n )}\n </MenuItems>\n </>\n )}\n </Menu>\n </div>\n )\n}\n\nconst MemoizedUserFilter = memo(UserFilter)\nMemoizedUserFilter.displayName = 'UserFilter'\n\nexport { MemoizedUserFilter as UserFilter }\nexport default MemoizedUserFilter\n","/**\n * AllChatsList Component\n * Displays organization-wide chat sessions with infinite scroll\n * Uses ChatDataSource for data fetching (no GraphQL dependency)\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react'\nimport { motion } from 'framer-motion'\nimport { Archive } from '@phosphor-icons/react'\nimport { UserAvatar } from './UserAvatar'\nimport { UserFilter } from './UserFilter'\nimport SessionSkeleton from './SessionSkeleton'\nimport { EmptyState } from './EmptyState'\nimport { staggerContainerVariants } from '../animations/variants'\nimport { useTranslation } from '../hooks/useTranslation'\nimport type { ChatDataSource, Session, SessionUser } from '../types'\n\ninterface AllChatsListProps {\n dataSource: ChatDataSource\n onSessionSelect: (sessionId: string) => void\n activeSessionId?: string\n}\n\nexport default function AllChatsList({ dataSource, onSessionSelect, activeSessionId }: AllChatsListProps) {\n const { t } = useTranslation()\n\n // State\n const [includeArchived, setIncludeArchived] = useState(false)\n const [selectedUser, setSelectedUser] = useState<SessionUser | null>(null)\n const [offset, setOffset] = useState(0)\n const [fetching, setFetching] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [chats, setChats] = useState<Array<Session & { owner: SessionUser }>>([])\n const [totalCount, setTotalCount] = useState(0)\n const [hasMore, setHasMore] = useState(false)\n const [users, setUsers] = useState<SessionUser[]>([])\n const [usersLoading, setUsersLoading] = useState(false)\n\n const limit = 20\n\n // Fetch users list\n useEffect(() => {\n if (!dataSource.listUsers) return\n\n let cancelled = false\n setUsersLoading(true)\n\n dataSource.listUsers().then((result) => {\n if (!cancelled) {\n setUsers(result)\n setUsersLoading(false)\n }\n }).catch(() => {\n if (!cancelled) {\n setUsersLoading(false)\n }\n })\n\n return () => { cancelled = true }\n }, [dataSource])\n\n // Fetch chats\n useEffect(() => {\n if (!dataSource.listAllSessions) return\n\n let cancelled = false\n setFetching(true)\n setError(null)\n\n dataSource.listAllSessions({\n limit,\n offset,\n includeArchived,\n userId: selectedUser?.id || null,\n }).then((result) => {\n if (!cancelled) {\n if (offset === 0) {\n setChats(result.sessions)\n } else {\n setChats((prev) => [...prev, ...result.sessions])\n }\n setTotalCount(result.total)\n setHasMore(result.hasMore)\n setFetching(false)\n }\n }).catch(() => {\n if (!cancelled) {\n setError(t('allChats.failedToLoad'))\n setFetching(false)\n }\n })\n\n return () => { cancelled = true }\n }, [dataSource, offset, includeArchived, selectedUser, t])\n\n // Reset offset when filter changes\n useEffect(() => {\n setOffset(0)\n setChats([])\n }, [includeArchived, selectedUser])\n\n // Load more handler\n const handleLoadMore = useCallback(() => {\n if (!fetching && hasMore) {\n setOffset((prev) => prev + limit)\n }\n }, [fetching, hasMore])\n\n // Infinite scroll observer\n const loadMoreRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (!node || fetching || !hasMore) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n handleLoadMore()\n }\n },\n { threshold: 0.1 }\n )\n\n observer.observe(node)\n return () => observer.disconnect()\n },\n [fetching, hasMore, handleLoadMore]\n )\n\n // Derive unique users from chat data if listUsers is not available\n const derivedUsers = useMemo(() => {\n if (dataSource.listUsers) return users\n const userMap = new Map<string, SessionUser>()\n chats.forEach((chat) => {\n if (chat.owner && !userMap.has(chat.owner.id)) {\n userMap.set(chat.owner.id, chat.owner)\n }\n })\n return Array.from(userMap.values())\n }, [chats, users, dataSource.listUsers])\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Filter Controls */}\n <div className=\"px-4 py-3 space-y-3 border-b border-gray-200 dark:border-gray-700 flex-shrink-0\">\n {/* User filter */}\n <UserFilter\n users={derivedUsers}\n selectedUser={selectedUser}\n onUserChange={setSelectedUser}\n loading={usersLoading || (fetching && chats.length === 0)}\n />\n\n {/* Include archived toggle */}\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={includeArchived}\n onChange={(e) => setIncludeArchived(e.target.checked)}\n className=\"\n w-4 h-4 rounded border-gray-300 dark:border-gray-600\n text-primary-600 focus:ring-primary-500 focus:ring-offset-0\n bg-white dark:bg-gray-800\n cursor-pointer\n \"\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300 flex items-center gap-1.5\">\n <Archive size={16} className=\"w-4 h-4\" />\n {t('allChats.includeArchived')}\n </span>\n </label>\n\n {/* Results count */}\n {totalCount > 0 && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {totalCount === 1\n ? t('allChats.chatFound', { count: totalCount })\n : t('allChats.chatsFound', { count: totalCount })}\n </p>\n )}\n </div>\n\n {/* Chat List */}\n <nav className=\"flex-1 overflow-y-auto px-2 pb-4 hide-scrollbar\" aria-label={t('allChats.organizationChats')}>\n {fetching && chats.length === 0 ? (\n <SessionSkeleton count={5} />\n ) : (\n <>\n {chats.length > 0 ? (\n <motion.div\n className=\"space-y-1 mt-2\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n role=\"list\"\n aria-label={t('allChats.organizationChatSessions')}\n >\n {chats.map((chat) => (\n <motion.div\n key={chat.id}\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n >\n <div\n role=\"link\"\n tabIndex={0}\n onClick={() => onSessionSelect(chat.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSessionSelect(chat.id)\n }\n }}\n className={`\n block px-3 py-2 rounded-lg transition-smooth group cursor-pointer\n ${\n chat.id === activeSessionId\n ? 'bg-primary-50/50 dark:bg-primary-900/30 text-primary-700 dark:text-primary-400 border-l-4 border-primary-400 dark:border-primary-600'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 border-l-4 border-transparent'\n }\n `}\n aria-current={chat.id === activeSessionId ? 'page' : undefined}\n >\n <div className=\"flex items-start gap-2\">\n {/* Owner avatar */}\n <UserAvatar\n firstName={chat.owner.firstName}\n lastName={chat.owner.lastName}\n initials={chat.owner.initials}\n size=\"sm\"\n />\n\n {/* Chat info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {chat.title || t('common.untitled')}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 truncate\">\n {chat.owner.firstName} {chat.owner.lastName}\n </p>\n {chat.status === 'archived' && (\n <span className=\"inline-flex items-center gap-1 mt-1 px-2 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 rounded-full text-xs\">\n <Archive size={12} className=\"w-3 h-3\" />\n {t('chat.archived')}\n </span>\n )}\n </div>\n </div>\n </div>\n </motion.div>\n ))}\n\n {/* Load more trigger */}\n {hasMore && (\n <div ref={loadMoreRef} className=\"py-4 text-center\">\n {fetching ? (\n <SessionSkeleton count={2} />\n ) : (\n <button\n onClick={handleLoadMore}\n className=\"text-sm text-primary-600 dark:text-primary-400 hover:underline\"\n >\n {t('allChats.loadMore')}\n </button>\n )}\n </div>\n )}\n </motion.div>\n ) : (\n <EmptyState\n title={t('allChats.noChatsFound')}\n description={\n selectedUser\n ? t('allChats.noChatsFromUser', { firstName: selectedUser.firstName, lastName: selectedUser.lastName })\n : includeArchived\n ? t('allChats.noChatsInOrg')\n : t('allChats.noActiveChatsInOrg')\n }\n />\n )}\n </>\n )}\n\n {error && (\n <div className=\"mx-2 mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-xs text-red-600 dark:text-red-400\">\n {error}\n </p>\n </div>\n )}\n </nav>\n </div>\n )\n}\n","/**\n * Sidebar Component\n * Main chat sidebar with session list, search, tabs, and session management.\n * Router-agnostic: uses callbacks for navigation instead of react-router-dom.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { X, Plus, Archive } from '@phosphor-icons/react'\nimport SessionSkeleton from './SessionSkeleton'\nimport SessionItem from './SessionItem'\nimport ConfirmModal from './ConfirmModal'\nimport SearchInput from './SearchInput'\nimport DateGroupHeader from './DateGroupHeader'\nimport { EmptyState } from './EmptyState'\nimport LoadingSpinner from './LoadingSpinner'\nimport TabBar from './TabBar'\nimport AllChatsList from './AllChatsList'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { useToast } from '../hooks/useToast'\nimport { groupSessionsByDate } from '../utils/sessionGrouping'\nimport {\n staggerContainerVariants,\n buttonVariants,\n} from '../animations/variants'\nimport type { Session, ChatDataSource } from '../types'\nimport { ToastContainer } from './ToastContainer'\n\ntype ActiveTab = 'my-chats' | 'all-chats'\n\nexport interface SidebarProps {\n dataSource: ChatDataSource\n onSessionSelect: (sessionId: string) => void\n onNewChat: () => void\n onArchivedView?: () => void\n activeSessionId?: string\n creating?: boolean\n showAllChatsTab?: boolean\n isOpen?: boolean\n onClose?: () => void\n headerSlot?: React.ReactNode\n footerSlot?: React.ReactNode\n className?: string\n}\n\nexport default function Sidebar({\n dataSource,\n onSessionSelect,\n onNewChat,\n onArchivedView,\n activeSessionId,\n creating,\n showAllChatsTab,\n isOpen: _isOpen,\n onClose,\n headerSlot,\n footerSlot,\n className = '',\n}: SidebarProps) {\n const { t } = useTranslation()\n const toast = useToast()\n const shouldReduceMotion = useReducedMotion()\n const sessionListRef = useRef<HTMLElement>(null)\n\n // Tab state\n const [activeTab, setActiveTab] = useState<ActiveTab>('my-chats')\n\n // Search state\n const [searchQuery, setSearchQuery] = useState('')\n\n // Session data\n const [sessions, setSessions] = useState<Session[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n // Refresh key — bump to re-fetch sessions\n const [refreshKey, setRefreshKey] = useState(0)\n\n // Confirm modal state\n const [showConfirm, setShowConfirm] = useState(false)\n const [sessionToArchive, setSessionToArchive] = useState<string | null>(null)\n\n // Build tab items\n const tabs = useMemo(() => {\n const items = [{ id: 'my-chats', label: t('sidebar.myChats') }]\n if (showAllChatsTab) {\n items.push({ id: 'all-chats', label: t('sidebar.allChats') })\n }\n return items\n }, [showAllChatsTab, t])\n\n // Fetch sessions\n const fetchSessions = useCallback(async () => {\n try {\n setLoading(true)\n setError(null)\n const result = await dataSource.listSessions({ limit: 50 })\n setSessions(result.sessions)\n } catch (err) {\n console.error('Failed to load sessions:', err)\n setError(t('sidebar.failedToLoadSessions'))\n } finally {\n setLoading(false)\n }\n }, [dataSource, t])\n\n useEffect(() => {\n fetchSessions()\n }, [fetchSessions, refreshKey])\n\n // Poll for title updates on sessions with placeholder titles\n const sessionsKey = useMemo(\n () => sessions.map((s) => `${s.id}:${s.title || ''}`).join(','),\n [sessions]\n )\n\n useEffect(() => {\n if (!Array.isArray(sessions) || sessions.length === 0) return\n\n const newChatLabel = t('chat.newChat')\n\n const sessionsWithPlaceholderTitles = sessions.filter(\n (s) => s && (!s.title || s.title === newChatLabel)\n )\n\n if (sessionsWithPlaceholderTitles.length === 0) return\n\n const pollInterval = 2000\n const maxPolls = 5\n let pollCount = 0\n\n const intervalId = setInterval(async () => {\n pollCount++\n try {\n const result = await dataSource.listSessions({ limit: 50 })\n setSessions(result.sessions)\n } catch {\n // ignore poll errors\n }\n if (pollCount >= maxPolls) {\n clearInterval(intervalId)\n }\n }, pollInterval)\n\n return () => clearInterval(intervalId)\n }, [sessionsKey, dataSource, sessions, t])\n\n const handleArchiveRequest = (sessionId: string) => {\n setSessionToArchive(sessionId)\n setShowConfirm(true)\n }\n\n const confirmArchive = async () => {\n if (!sessionToArchive) return\n\n const wasCurrentSession = activeSessionId === sessionToArchive\n\n try {\n await dataSource.archiveSession(sessionToArchive)\n setRefreshKey((k) => k + 1)\n\n if (wasCurrentSession) {\n onSessionSelect('')\n }\n } catch (err) {\n console.error('Failed to archive session:', err)\n toast.error(t('sidebar.failedToArchiveChat'))\n } finally {\n setShowConfirm(false)\n setSessionToArchive(null)\n }\n }\n\n const handleTogglePin = async (\n sessionId: string,\n currentlyPinned: boolean\n ) => {\n try {\n if (currentlyPinned) {\n await dataSource.unpinSession(sessionId)\n } else {\n await dataSource.pinSession(sessionId)\n }\n setRefreshKey((k) => k + 1)\n } catch (err) {\n console.error('Failed to toggle pin:', err)\n toast.error(t('sidebar.failedToTogglePin'))\n }\n }\n\n const handleRenameSession = async (sessionId: string, newTitle: string) => {\n try {\n await dataSource.renameSession(sessionId, newTitle)\n toast.success(t('sidebar.chatRenamedSuccessfully'))\n setRefreshKey((k) => k + 1)\n } catch (err) {\n console.error('Failed to update session title:', err)\n toast.error(t('sidebar.failedToRenameChat'))\n }\n }\n\n const handleRegenerateTitle = async (sessionId: string) => {\n try {\n await dataSource.regenerateSessionTitle(sessionId)\n toast.success(t('sidebar.titleRegenerated'))\n setRefreshKey((k) => k + 1)\n } catch (err) {\n console.error('Failed to regenerate title:', err)\n toast.error(t('sidebar.failedToRegenerateTitle'))\n }\n }\n\n // Filter sessions by search\n const filteredSessions = useMemo(() => {\n if (!searchQuery.trim()) return sessions\n const q = searchQuery.toLowerCase()\n return sessions.filter((s) => s.title?.toLowerCase().includes(q))\n }, [sessions, searchQuery])\n\n // Separate pinned and unpinned\n const pinnedSessions = useMemo(\n () => filteredSessions.filter((s) => s.pinned),\n [filteredSessions]\n )\n const unpinnedSessions = useMemo(\n () => filteredSessions.filter((s) => !s.pinned),\n [filteredSessions]\n )\n\n // Group unpinned sessions by date\n const sessionGroups = useMemo(() => {\n const groups = groupSessionsByDate(unpinnedSessions, t)\n return Array.isArray(groups)\n ? groups.map((group) => ({\n ...group,\n sessions: Array.isArray(group.sessions) ? group.sessions : [],\n }))\n : []\n }, [unpinnedSessions, t])\n\n // Keyboard navigation for session list (WAI-ARIA listbox pattern)\n const handleSessionListKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLElement>) => {\n const nav = sessionListRef.current\n if (!nav) return\n\n const focusableItems = Array.from(\n nav.querySelectorAll<HTMLElement>('button[data-session-item]')\n )\n if (focusableItems.length === 0) return\n\n const currentIndex = focusableItems.indexOf(\n document.activeElement as HTMLElement\n )\n\n let nextIndex: number | null = null\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n nextIndex =\n currentIndex < 0 ? 0 : Math.min(currentIndex + 1, focusableItems.length - 1)\n break\n case 'ArrowUp':\n e.preventDefault()\n nextIndex =\n currentIndex < 0\n ? focusableItems.length - 1\n : Math.max(currentIndex - 1, 0)\n break\n case 'Home':\n e.preventDefault()\n nextIndex = 0\n break\n case 'End':\n e.preventDefault()\n nextIndex = focusableItems.length - 1\n break\n }\n\n if (nextIndex !== null) {\n focusableItems[nextIndex].focus()\n }\n },\n []\n )\n\n return (\n <>\n <aside\n className={`w-64 bg-surface-300 dark:bg-gray-900 border-r border-gray-200 dark:border-gray-700 h-full min-h-0 flex flex-col overflow-hidden ${className}`}\n role=\"navigation\"\n aria-label={t('sidebar.chatSessions')}\n >\n {/* Header */}\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n {headerSlot}\n {onClose && (\n <motion.button\n onClick={onClose}\n className=\"cursor-pointer p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-smooth text-gray-600 dark:text-gray-400\"\n title={t('sidebar.closeSidebar')}\n aria-label={t('sidebar.closeSidebar')}\n whileHover=\"hover\"\n whileTap=\"tap\"\n variants={buttonVariants}\n >\n <X size={20} className=\"w-5 h-5\" />\n </motion.button>\n )}\n </div>\n\n {/* TabBar - Only visible if consumer passes showAllChatsTab */}\n {showAllChatsTab && (\n <TabBar\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={(id) => setActiveTab(id as ActiveTab)}\n />\n )}\n\n {/* Conditional content based on active tab */}\n {activeTab === 'all-chats' && showAllChatsTab ? (\n <AllChatsList\n dataSource={dataSource}\n onSessionSelect={onSessionSelect}\n activeSessionId={activeSessionId}\n />\n ) : (\n <>\n {/* Search Input */}\n <div className=\"mt-3\">\n <SearchInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder={t('sidebar.searchChats')}\n />\n </div>\n\n {/* New Chat Button */}\n <div className=\"p-4\">\n <motion.button\n onClick={onNewChat}\n disabled={creating || loading}\n className=\"cursor-pointer w-full px-4 py-3 bg-primary-600 dark:bg-primary-700 text-white rounded-lg hover:bg-primary-700 dark:hover:bg-primary-800 transition-smooth font-medium disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center\"\n title={t('chat.newChat')}\n aria-label={t('sidebar.createNewChat')}\n whileHover={shouldReduceMotion ? {} : { scale: 1.02 }}\n whileTap={shouldReduceMotion ? {} : { scale: 0.95 }}\n >\n {creating ? (\n <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n ) : (\n <>\n <Plus size={20} className=\"w-5 h-5\" />\n <span className=\"ml-2\">{t('chat.newChat')}</span>\n </>\n )}\n </motion.button>\n </div>\n\n {/* Archived Chats Link */}\n {onArchivedView && (\n <div className=\"px-4 pb-2\">\n <button\n onClick={onArchivedView}\n className=\"cursor-pointer flex items-center gap-2 px-3 py-2 rounded-lg text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 transition-smooth text-sm font-medium w-full\"\n title={t('sidebar.archivedChats')}\n >\n <Archive size={18} className=\"w-4.5 h-4.5\" />\n <span>{t('sidebar.archivedChats')}</span>\n </button>\n </div>\n )}\n\n {/* Chat History */}\n <nav\n ref={sessionListRef}\n className=\"flex-1 overflow-y-auto px-2 pb-4 hide-scrollbar\"\n aria-label=\"Chat history\"\n onKeyDown={handleSessionListKeyDown}\n >\n {loading && sessions.length === 0 ? (\n <SessionSkeleton count={5} />\n ) : (\n <>\n {/* Pinned Sessions */}\n {pinnedSessions.length > 0 && (\n <div className=\"mb-4\">\n <DateGroupHeader\n groupName={t('common.pinned')}\n count={pinnedSessions.length}\n />\n <motion.div\n className=\"space-y-1 mt-2\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n role=\"list\"\n aria-label={t('sidebar.pinnedChats')}\n >\n {pinnedSessions.map((session) => (\n <SessionItem\n key={session.id}\n session={session}\n isActive={session.id === activeSessionId}\n onSelect={() => onSessionSelect(session.id)}\n onArchive={() =>\n handleArchiveRequest(session.id)\n }\n onPin={() =>\n handleTogglePin(session.id, session.pinned)\n }\n onRename={(newTitle) =>\n handleRenameSession(session.id, newTitle)\n }\n onRegenerateTitle={() =>\n handleRegenerateTitle(session.id)\n }\n />\n ))}\n </motion.div>\n <div className=\"border-b border-gray-200 dark:border-gray-700 my-3\" />\n </div>\n )}\n\n {/* Grouped Sessions by Date */}\n {sessionGroups.map((group) => (\n <div key={group.name} className=\"mb-4\">\n <DateGroupHeader\n groupName={group.name}\n count={group.sessions.length}\n />\n <motion.div\n className=\"space-y-1 mt-2\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n role=\"list\"\n aria-label={`${group.name} chats`}\n >\n {group.sessions.map((session) => (\n <SessionItem\n key={session.id}\n session={session}\n isActive={session.id === activeSessionId}\n onSelect={() => onSessionSelect(session.id)}\n onArchive={() =>\n handleArchiveRequest(session.id)\n }\n onPin={() =>\n handleTogglePin(session.id, session.pinned)\n }\n onRename={(newTitle) =>\n handleRenameSession(session.id, newTitle)\n }\n onRegenerateTitle={() =>\n handleRegenerateTitle(session.id)\n }\n />\n ))}\n </motion.div>\n </div>\n ))}\n\n {/* Empty State */}\n {filteredSessions.length === 0 && !loading && (\n <EmptyState\n title={\n searchQuery\n ? t('sidebar.noChatsFound', { query: searchQuery })\n : t('sidebar.noChatsYet')\n }\n description={\n searchQuery\n ? undefined\n : t('sidebar.createOneToGetStarted')\n }\n action={\n searchQuery ? (\n <button\n onClick={() => setSearchQuery('')}\n className=\"cursor-pointer text-sm text-primary-600 dark:text-primary-400 hover:underline\"\n >\n {t('common.clear')}\n </button>\n ) : undefined\n }\n />\n )}\n </>\n )}\n\n {error && (\n <div className=\"mx-2 mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-xs text-red-600 dark:text-red-400\">\n {error}\n </p>\n </div>\n )}\n </nav>\n\n {/* Footer slot */}\n {footerSlot}\n </>\n )}\n </aside>\n\n {/* Confirm Archive Modal */}\n <ConfirmModal\n isOpen={showConfirm}\n title={t('sidebar.archiveChatSession')}\n message={t('sidebar.archiveChatMessage')}\n confirmText={t('sidebar.archiveButton')}\n cancelText={t('common.cancel')}\n isDanger={false}\n onConfirm={confirmArchive}\n onCancel={() => {\n setShowConfirm(false)\n setSessionToArchive(null)\n }}\n />\n\n {/* Toast notifications */}\n <ToastContainer toasts={toast.toasts} onDismiss={toast.dismiss} />\n </>\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","import { differenceInDays, startOfDay } from 'date-fns'\nimport type { Session, SessionGroup } from '../types'\n\n/**\n * Groups chat sessions by date relative to today\n * Categories: Today, Yesterday, Last 7 Days, Last 30 Days, Older\n * Sessions within each group are sorted by updatedAt (most recent first)\n */\nexport function groupSessionsByDate(sessions: Session[], t?: (key: string) => string): SessionGroup[] {\n // Ensure sessions is always an array\n const safeSessions = Array.isArray(sessions) ? sessions : []\n\n const now = new Date()\n const today = startOfDay(now)\n\n // Use translation function if provided, otherwise use key as fallback\n const translate = t || ((key: string) => key)\n\n // Map internal keys to translation keys\n const dateLabels: Record<string, string> = {\n 'Today': translate('dateGroup.today'),\n 'Yesterday': translate('dateGroup.yesterday'),\n 'Last 7 Days': translate('dateGroup.last7Days'),\n 'Last 30 Days': translate('dateGroup.last30Days'),\n 'Older': translate('dateGroup.older'),\n }\n\n // Initialize all groups in the desired order\n const groupMap = new Map<string, Session[]>([\n ['Today', []],\n ['Yesterday', []],\n ['Last 7 Days', []],\n ['Last 30 Days', []],\n ['Older', []],\n ])\n\n // Categorize each session\n safeSessions.forEach((session) => {\n const sessionDate = new Date(session.updatedAt)\n const daysDiff = differenceInDays(today, startOfDay(sessionDate))\n\n if (daysDiff === 0) {\n groupMap.get('Today')!.push(session)\n } else if (daysDiff === 1) {\n groupMap.get('Yesterday')!.push(session)\n } else if (daysDiff <= 7) {\n groupMap.get('Last 7 Days')!.push(session)\n } else if (daysDiff <= 30) {\n groupMap.get('Last 30 Days')!.push(session)\n } else {\n groupMap.get('Older')!.push(session)\n }\n })\n\n // Sort sessions within each group by updatedAt (most recent first)\n groupMap.forEach((sessions) => {\n sessions.sort((a, b) => {\n return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()\n })\n })\n\n // Convert to array and filter out empty groups, translating names\n const groups: SessionGroup[] = []\n groupMap.forEach((sessions, internalName) => {\n if (sessions.length > 0) {\n groups.push({ name: dateLabels[internalName] || internalName, sessions })\n }\n })\n\n return groups\n}\n","/**\n * ArchivedChatList Component\n * Displays archived chat sessions with restore functionality.\n * Router-agnostic: uses callbacks for navigation instead of react-router-dom.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react'\nimport { motion } from 'framer-motion'\nimport { Archive, ArrowLeft } from '@phosphor-icons/react'\nimport SessionItem from './SessionItem'\nimport SearchInput from './SearchInput'\nimport DateGroupHeader from './DateGroupHeader'\nimport LoadingSpinner from './LoadingSpinner'\nimport ConfirmModal from './ConfirmModal'\nimport { EmptyState } from './EmptyState'\nimport { ToastContainer } from './ToastContainer'\nimport { useTranslation } from '../hooks/useTranslation'\nimport { useToast, type UseToastReturn } from '../hooks/useToast'\nimport { groupSessionsByDate } from '../utils/sessionGrouping'\nimport { staggerContainerVariants } from '../animations/variants'\nimport type { Session, ChatDataSource } from '../types'\n\nexport interface ArchivedChatListProps {\n dataSource: ChatDataSource\n onBack: () => void\n onSessionSelect: (sessionId: string) => void\n activeSessionId?: string\n className?: string\n toast?: UseToastReturn\n}\n\nexport default function ArchivedChatList({\n dataSource,\n onBack,\n onSessionSelect,\n activeSessionId,\n className = '',\n toast: toastFromProps,\n}: ArchivedChatListProps) {\n const { t } = useTranslation()\n const localToast = useToast()\n const toast = toastFromProps ?? localToast\n const shouldRenderToastContainer = !toastFromProps\n\n // Search state\n const [searchQuery, setSearchQuery] = useState('')\n\n // Session data\n const [sessions, setSessions] = useState<Session[]>([])\n const [loading, setLoading] = useState(true)\n\n // Refresh key\n const [refreshKey, setRefreshKey] = useState(0)\n\n // Confirm modal state for restore action\n const [showConfirm, setShowConfirm] = useState(false)\n const [sessionToRestore, setSessionToRestore] = useState<string | null>(null)\n\n // Fetch archived sessions\n const fetchSessions = useCallback(async () => {\n try {\n setLoading(true)\n const result = await dataSource.listSessions({\n limit: 100,\n includeArchived: true,\n })\n setSessions(result.sessions.filter((s) => s.status === 'archived'))\n } catch (err) {\n console.error('Failed to load archived sessions:', err)\n } finally {\n setLoading(false)\n }\n }, [dataSource])\n\n useEffect(() => {\n fetchSessions()\n }, [fetchSessions, refreshKey])\n\n const handleRestoreRequest = (sessionId: string) => {\n setSessionToRestore(sessionId)\n setShowConfirm(true)\n }\n\n const confirmRestore = async () => {\n if (!sessionToRestore) return\n\n try {\n await dataSource.unarchiveSession(sessionToRestore)\n setRefreshKey((k) => k + 1)\n toast.success(t('archived.chatRestoredSuccessfully'))\n } catch (err) {\n console.error('Failed to restore session:', err)\n toast.error(t('archived.failedToRestoreChat'))\n } finally {\n setShowConfirm(false)\n setSessionToRestore(null)\n }\n }\n\n const handleRenameSession = async (sessionId: string, newTitle: string) => {\n try {\n await dataSource.renameSession(sessionId, newTitle)\n toast.success(t('sidebar.chatRenamedSuccessfully'))\n setRefreshKey((k) => k + 1)\n } catch (err) {\n console.error('Failed to update session title:', err)\n toast.error(t('sidebar.failedToRenameChat'))\n }\n }\n\n // Filter by search query\n const filteredSessions = useMemo(() => {\n if (!searchQuery.trim()) return sessions\n const q = searchQuery.toLowerCase()\n return sessions.filter((s) => s.title?.toLowerCase().includes(q))\n }, [sessions, searchQuery])\n\n // Group sessions by date\n const sessionGroups = useMemo(() => {\n const groups = groupSessionsByDate(filteredSessions, t)\n return Array.isArray(groups)\n ? groups.map((group) => ({\n ...group,\n sessions: Array.isArray(group.sessions) ? group.sessions : [],\n }))\n : []\n }, [filteredSessions, t])\n\n const isEmpty = sessions.length === 0\n const isEmptyAfterSearch = filteredSessions.length === 0 && !!searchQuery\n\n return (\n <div\n className={`flex-1 flex flex-col bg-gray-50 dark:bg-gray-900 ${className}`}\n >\n {/* Header */}\n <div className=\"border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 px-6 py-4\">\n <div className=\"flex items-center gap-3 mb-4\">\n <button\n onClick={onBack}\n className=\"inline-flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors text-gray-600 dark:text-gray-400\"\n aria-label={t('archived.backToChats')}\n >\n <ArrowLeft size={20} className=\"w-5 h-5\" />\n {t('common.back')}\n </button>\n </div>\n\n <div className=\"flex items-center gap-2 mb-4\">\n <Archive\n size={24}\n className=\"w-6 h-6 text-gray-600 dark:text-gray-400\"\n />\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('archived.title')}\n </h1>\n </div>\n\n {/* Search */}\n <SearchInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder={t('archived.searchArchivedChats')}\n />\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {loading && sessions.length === 0 ? (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n ) : isEmpty ? (\n <div className=\"flex items-center justify-center h-full px-6\">\n <EmptyState\n icon={\n <Archive\n size={48}\n className=\"text-gray-400 dark:text-gray-500\"\n />\n }\n title={t('archived.noArchivedChats')}\n description={t('archived.noArchivedChatsDescription')}\n />\n </div>\n ) : isEmptyAfterSearch ? (\n <div className=\"flex items-center justify-center h-full px-6\">\n <EmptyState\n icon={\n <Archive\n size={48}\n className=\"text-gray-400 dark:text-gray-500\"\n />\n }\n title={t('archived.noResults')}\n description={t('archived.noResultsDescription', {\n query: searchQuery,\n })}\n />\n </div>\n ) : (\n <motion.div\n className=\"px-4 py-4 space-y-4\"\n variants={staggerContainerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {sessionGroups.map((group) => (\n <div key={group.name}>\n <DateGroupHeader\n groupName={group.name}\n count={group.sessions.length}\n />\n <motion.ul className=\"space-y-1 mt-3 mb-4\" role=\"list\">\n {group.sessions.map((session) => (\n <motion.li key={session.id} className=\"opacity-70\">\n <SessionItem\n session={session}\n isActive={session.id === activeSessionId}\n mode=\"archived\"\n testIdPrefix=\"archived\"\n onSelect={() => onSessionSelect(session.id)}\n onRestore={() => handleRestoreRequest(session.id)}\n onRename={(newTitle) =>\n handleRenameSession(session.id, newTitle)\n }\n />\n </motion.li>\n ))}\n </motion.ul>\n </div>\n ))}\n </motion.div>\n )}\n </div>\n\n {/* Confirm Restore Modal */}\n <ConfirmModal\n isOpen={showConfirm}\n title={t('archived.restoreChat')}\n message={t('archived.restoreChatMessage')}\n confirmText={t('archived.restoreButton')}\n cancelText={t('common.cancel')}\n isDanger={false}\n onConfirm={confirmRestore}\n onCancel={() => {\n setShowConfirm(false)\n setSessionToRestore(null)\n }}\n />\n\n {/* Toast notifications */}\n {shouldRenderToastContainer && (\n <ToastContainer toasts={toast.toasts} onDismiss={toast.dismiss} />\n )}\n </div>\n )\n}\n","/**\n * Alert Component\n * Standardized error/success/warning/info messages with retry capability\n */\n\nimport { memo } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { X, Warning, CheckCircle, Info, XCircle } from '@phosphor-icons/react'\nimport { errorMessageVariants } from '../animations/variants'\nimport { useTranslation } from '../hooks/useTranslation'\n\nexport type AlertVariant = 'error' | 'success' | 'warning' | 'info'\n\ninterface AlertProps {\n variant?: AlertVariant\n message: string\n title?: string\n onDismiss?: () => void\n onRetry?: () => void\n show?: boolean\n dismissible?: boolean\n}\n\nconst variantStyles = {\n error: {\n container: 'border-red-200 bg-red-50 dark:bg-red-900/20',\n title: 'text-red-800 dark:text-red-300',\n message: 'text-red-700 dark:text-red-400',\n icon: 'text-red-600 dark:text-red-400',\n button: 'text-red-400 hover:text-red-600 dark:hover:text-red-300',\n retryButton: 'bg-red-600 dark:bg-red-700 hover:bg-red-700 dark:hover:bg-red-800 text-white',\n Icon: XCircle,\n },\n success: {\n container: 'border-green-200 bg-green-50 dark:bg-green-900/20',\n title: 'text-green-800 dark:text-green-300',\n message: 'text-green-700 dark:text-green-400',\n icon: 'text-green-600 dark:text-green-400',\n button: 'text-green-400 hover:text-green-600 dark:hover:text-green-300',\n retryButton: 'bg-green-600 dark:bg-green-700 hover:bg-green-700 dark:hover:bg-green-800 text-white',\n Icon: CheckCircle,\n },\n warning: {\n container: 'border-yellow-200 bg-yellow-50 dark:bg-yellow-900/20',\n title: 'text-yellow-800 dark:text-yellow-300',\n message: 'text-yellow-700 dark:text-yellow-400',\n icon: 'text-yellow-600 dark:text-yellow-400',\n button: 'text-yellow-400 hover:text-yellow-600 dark:hover:text-yellow-300',\n retryButton: 'bg-yellow-600 dark:bg-yellow-700 hover:bg-yellow-700 dark:hover:bg-yellow-800 text-white',\n Icon: Warning,\n },\n info: {\n container: 'border-blue-200 bg-blue-50 dark:bg-blue-900/20',\n title: 'text-blue-800 dark:text-blue-300',\n message: 'text-blue-700 dark:text-blue-400',\n icon: 'text-blue-600 dark:text-blue-400',\n button: 'text-blue-400 hover:text-blue-600 dark:hover:text-blue-300',\n retryButton: 'bg-blue-600 dark:bg-blue-700 hover:bg-blue-700 dark:hover:bg-blue-800 text-white',\n Icon: Info,\n },\n}\n\nfunction Alert({\n variant = 'info',\n message,\n title,\n onDismiss,\n onRetry,\n show = true,\n dismissible = true,\n}: AlertProps) {\n const { t } = useTranslation()\n const styles = variantStyles[variant]\n const IconComponent = styles.Icon\n\n return (\n <AnimatePresence>\n {show && (\n <motion.div\n variants={errorMessageVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n className={`border-t border ${styles.container} px-4 py-3`}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <div className=\"w-full flex items-start justify-between px-4\">\n <div className=\"flex items-start gap-3 flex-1\">\n {/* Icon */}\n <IconComponent size={20} className={`w-5 h-5 ${styles.icon} flex-shrink-0 mt-0.5`} />\n\n {/* Content */}\n <div className=\"flex-1\">\n {title && <p className={`text-sm ${styles.title} font-medium`}>{title}</p>}\n <p className={`text-sm ${styles.message} ${title ? 'mt-1' : ''}`}>{message}</p>\n\n {/* Retry Button */}\n {onRetry && (\n <button\n onClick={onRetry}\n className={`mt-2 text-xs px-3 py-1.5 rounded ${styles.retryButton} transition-colors font-medium`}\n >\n {t('chat.retry')}\n </button>\n )}\n </div>\n </div>\n\n {/* Dismiss Button */}\n {dismissible && onDismiss && (\n <button\n onClick={onDismiss}\n className={`${styles.button} transition-colors flex-shrink-0`}\n aria-label={t('chat.dismissNotification')}\n >\n <X size={20} className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n\nexport default memo(Alert)\n","/**\n * Archive Banner Component\n * Displays when a chat session is archived and provides a restore button\n */\n\nimport { memo, useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Archive, Spinner } from '@phosphor-icons/react'\nimport { errorMessageVariants } from '../animations/variants'\nimport Alert from './Alert'\n\ninterface ArchiveBannerProps {\n show?: boolean\n onRestore?: () => Promise<void>\n restoring?: boolean\n onRestoreComplete?: () => void\n}\n\nfunction ArchiveBanner({\n show = true,\n onRestore,\n restoring = false,\n onRestoreComplete,\n}: ArchiveBannerProps) {\n const [error, setError] = useState<string | null>(null)\n\n const handleRestore = async () => {\n try {\n setError(null)\n if (onRestore) {\n await onRestore()\n }\n if (onRestoreComplete) {\n onRestoreComplete()\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to restore session'\n setError(message)\n }\n }\n\n return (\n <>\n <AnimatePresence>\n {show && (\n <motion.div\n variants={errorMessageVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n className=\"border-t border border-blue-200 bg-blue-50 dark:bg-blue-900/20 px-4 py-3\"\n role=\"region\"\n aria-label=\"Archive banner\"\n >\n <div className=\"w-full flex items-start justify-between px-4\">\n <div className=\"flex items-start gap-3 flex-1\">\n {/* Icon */}\n <Archive size={20} className=\"w-5 h-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5\" />\n\n {/* Content */}\n <div className=\"flex-1\">\n <p className=\"text-sm text-blue-700 dark:text-blue-400\">\n This chat session has been archived\n </p>\n </div>\n </div>\n\n {/* Restore Button */}\n <button\n onClick={handleRestore}\n disabled={restoring}\n className=\"ml-2 flex-shrink-0 px-3 py-1.5 text-xs font-medium bg-blue-600 dark:bg-blue-700 hover:bg-blue-700 dark:hover:bg-blue-800 text-white rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1.5\"\n aria-label=\"Restore session\"\n >\n {restoring ? (\n <>\n <Spinner size={16} className=\"w-4 h-4 animate-spin\" />\n Restoring...\n </>\n ) : (\n 'Restore'\n )}\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Error Alert */}\n {error && (\n <Alert\n variant=\"error\"\n message={error}\n title=\"Restore Failed\"\n onDismiss={() => setError(null)}\n dismissible\n />\n )}\n </>\n )\n}\n\nexport default memo(ArchiveBanner)\n","/**\n * RetryActionArea Component\n * Displays a retry action area inline where the assistant message would appear\n * (typically after an interrupted request or connection loss)\n *\n * Styled to match assistant message positioning (left-aligned) so users see\n * the retry button contextually in the conversation flow.\n */\n\nimport { memo } from 'react'\nimport { motion } from 'framer-motion'\nimport { ArrowClockwise, Warning } from '@phosphor-icons/react'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface RetryActionAreaProps {\n /** Callback when retry button is clicked */\n onRetry: () => void\n}\n\nexport const RetryActionArea = memo(function RetryActionArea({\n onRetry,\n}: RetryActionAreaProps) {\n const { t } = useTranslation()\n\n return (\n // Wrapper matches TurnBubble layout for assistant messages (justify-start = left-aligned)\n <motion.div\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=\"flex justify-start\"\n >\n {/* Bubble styled like AssistantTurnView message bubble */}\n <div\n className=\"flex flex-col gap-3 max-w-2xl rounded-2xl px-5 py-3 shadow-sm bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <div className=\"flex items-center gap-3\">\n <Warning\n className=\"w-5 h-5 text-amber-500 dark:text-amber-400 flex-shrink-0\"\n weight=\"fill\"\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">\n {t('retry.description')}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={onRetry}\n className=\"cursor-pointer inline-flex items-center gap-1.5 px-4 py-2 text-sm font-medium text-white bg-primary-600 hover:bg-primary-700 dark:bg-primary-700 dark:hover:bg-primary-600 rounded-lg transition-colors 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-800\"\n aria-label={t('retry.title')}\n >\n <ArrowClockwise size={16} className=\"w-4 h-4\" />\n {t('retry.button')}\n </button>\n </div>\n </div>\n </motion.div>\n )\n})\n\nexport default RetryActionArea\n","/**\n * StreamError Component\n * Error recovery UI for streaming failures\n */\n\nimport { motion } from 'framer-motion'\nimport { Warning, ArrowClockwise, ArrowsCounterClockwise } from '@phosphor-icons/react'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface StreamErrorProps {\n /** Error message to display */\n error: string\n /** Callback to retry the failed operation */\n onRetry?: () => void\n /** Callback to regenerate the message */\n onRegenerate?: () => void\n /** Whether to show compact mode (less padding) */\n compact?: boolean\n}\n\nexport function StreamError({\n error,\n onRetry,\n onRegenerate,\n compact = false,\n}: StreamErrorProps) {\n const { t } = useTranslation()\n\n return (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n className={`flex items-center gap-3 ${compact ? 'p-3' : 'p-4'} bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg`}\n role=\"alert\"\n >\n <Warning\n className=\"w-5 h-5 text-red-500 dark:text-red-400 flex-shrink-0\"\n weight=\"fill\"\n />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-red-800 dark:text-red-200\">\n {t('error.generic')}\n </p>\n <p className=\"text-sm text-red-600 dark:text-red-300 break-words\">\n {error}\n </p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {onRetry && (\n <button\n onClick={onRetry}\n className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-red-700 dark:text-red-200 bg-red-100 dark:bg-red-800/50 hover:bg-red-200 dark:hover:bg-red-800 rounded-md transition-colors\"\n type=\"button\"\n >\n <ArrowClockwise className=\"w-4 h-4\" />\n {t('streamError.retry')}\n </button>\n )}\n {onRegenerate && (\n <button\n onClick={onRegenerate}\n className=\"cursor-pointer inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-gray-700 dark:text-gray-200 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-md transition-colors\"\n type=\"button\"\n >\n <ArrowsCounterClockwise className=\"w-4 h-4\" />\n {t('streamError.regenerate')}\n </button>\n )}\n </div>\n </motion.div>\n )\n}\n","import { useState, memo } from 'react'\nimport { Copy, ArrowClockwise, PencilSimple } from '@phosphor-icons/react'\nimport { MessageRole } from '../types'\nimport { useToast } from '../hooks/useToast'\nimport LoadingSpinner from './LoadingSpinner'\n\ninterface ActionableMessage {\n id: string\n role: MessageRole\n content: string\n}\n\ninterface MessageActionsProps {\n message: ActionableMessage\n onCopy: (text: string) => Promise<void>\n onRegenerate?: (messageId: string) => Promise<void>\n onEdit?: (message: ActionableMessage) => void\n}\n\nfunction MessageActions({\n message,\n onCopy,\n onRegenerate,\n onEdit,\n}: MessageActionsProps) {\n const [copying, setCopying] = useState(false)\n const [regenerating, setRegenerating] = useState(false)\n const toast = useToast()\n\n const isUser = message.role === MessageRole.User\n\n const handleCopy = async () => {\n setCopying(true)\n try {\n await onCopy(message.content)\n toast.success('Copied to clipboard')\n } catch {\n toast.error('Failed to copy message')\n } finally {\n setCopying(false)\n }\n }\n\n const handleRegenerate = async () => {\n if (!onRegenerate) return\n setRegenerating(true)\n try {\n await onRegenerate(message.id)\n } finally {\n setRegenerating(false)\n }\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Copy button */}\n <button\n onClick={handleCopy}\n disabled={copying}\n title={copying ? 'Copying...' : 'Copy message (Cmd/Ctrl+C on selection)'}\n className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors disabled:opacity-50 p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={copying ? 'Copying message' : 'Copy message'}\n >\n {copying ? (\n <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n ) : (\n <Copy size={16} className=\"w-4 h-4\" />\n )}\n </button>\n\n {/* Regenerate button (AI messages only) */}\n {!isUser && onRegenerate && (\n <button\n onClick={handleRegenerate}\n disabled={regenerating}\n title={regenerating ? 'Regenerating...' : 'Regenerate response'}\n className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors disabled:opacity-50 p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label={regenerating ? 'Regenerating response' : 'Regenerate response'}\n >\n {regenerating ? (\n <LoadingSpinner variant=\"spinner\" size=\"sm\" />\n ) : (\n <ArrowClockwise size={16} className=\"w-4 h-4\" />\n )}\n </button>\n )}\n\n {/* Edit button (user messages only) */}\n {isUser && onEdit && (\n <button\n onClick={() => onEdit(message)}\n title=\"Edit message\"\n className=\"cursor-pointer text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-700 dark:hover:text-gray-300 rounded-md transition-colors p-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\"\n aria-label=\"Edit message\"\n >\n <PencilSimple size={16} className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n )\n}\n\nexport default memo(MessageActions)\nexport { MessageActions }\nexport type { ActionableMessage }\n","/**\n * AttachmentPreview Component\n * Displays thumbnail preview of an image attachment\n * Shows filename, size, remove button, and supports click-to-enlarge\n */\n\nimport { memo, useState } from 'react'\nimport { X } from '@phosphor-icons/react'\nimport { ImageAttachment } from '../types'\nimport { formatFileSize, createDataUrl } from '../utils/fileUtils'\n\ninterface AttachmentPreviewProps {\n /** The attachment to display */\n attachment: ImageAttachment\n /** Optional callback when remove button is clicked */\n onRemove?: () => void\n /** Optional callback when thumbnail is clicked (for enlargement) */\n onClick?: () => void\n /** If true, hide remove button and disable click interactions */\n readonly?: boolean\n}\n\nconst AttachmentPreview = memo<AttachmentPreviewProps>(({ attachment, onRemove, onClick, readonly = false }) => {\n const [isImageLoaded, setIsImageLoaded] = useState(false)\n const [imageError, setImageError] = useState(false)\n\n const previewUrl = attachment.preview || createDataUrl(attachment.base64Data, attachment.mimeType)\n const isClickable = onClick !== undefined && !readonly\n const showRemoveButton = onRemove !== undefined && !readonly\n\n return (\n <div\n className={`\n relative\n rounded-lg\n border border-gray-200 dark:border-gray-700\n bg-white dark:bg-gray-800\n p-2\n transition-all\n duration-200\n ${isClickable ? 'cursor-pointer hover:shadow-md hover:border-primary-400 dark:hover:border-primary-500' : ''}\n ${!isClickable ? 'hover:shadow-sm' : ''}\n `}\n onClick={isClickable ? onClick : undefined}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick?.()\n }\n }\n : undefined\n }\n >\n {/* Thumbnail Container */}\n <div className=\"relative mb-2 overflow-hidden rounded-md bg-gray-100 dark:bg-gray-700 aspect-square\">\n {/* Loading Skeleton */}\n {!isImageLoaded && !imageError && (\n <div className=\"absolute inset-0 animate-pulse bg-gray-200 dark:bg-gray-600\" />\n )}\n\n {/* Error State */}\n {imageError && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-gray-100 dark:bg-gray-700\">\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">Preview unavailable</span>\n </div>\n )}\n\n {/* Image */}\n <img\n src={previewUrl}\n alt={attachment.filename}\n className={`\n w-full h-full object-cover\n transition-opacity duration-200\n ${isImageLoaded ? 'opacity-100' : 'opacity-0'}\n ${isClickable ? 'group-hover:scale-105' : ''}\n `}\n onLoad={() => setIsImageLoaded(true)}\n onError={() => setImageError(true)}\n />\n </div>\n\n {/* Filename */}\n {!isImageLoaded && !imageError ? (\n <div className=\"h-3 w-3/4 bg-gray-200 dark:bg-gray-600 rounded animate-pulse mb-1\" />\n ) : (\n <p\n className=\"text-xs font-medium text-gray-700 dark:text-gray-300 truncate\"\n title={attachment.filename}\n >\n {attachment.filename}\n </p>\n )}\n\n {/* File Size */}\n {!isImageLoaded && !imageError ? (\n <div className=\"h-3 w-1/2 bg-gray-200 dark:bg-gray-600 rounded animate-pulse mb-1\" />\n ) : (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mb-1\">\n {formatFileSize(attachment.sizeBytes)}\n </p>\n )}\n\n {/* Remove Button */}\n {showRemoveButton && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove?.()\n }}\n className=\"absolute top-1 right-1 flex items-center justify-center bg-red-500 hover:bg-red-600 dark:bg-red-600 dark:hover:bg-red-700 text-white rounded-full transition-all duration-200 shadow-sm hover:shadow-md active:scale-90 w-6 h-6\"\n aria-label={`Remove ${attachment.filename}`}\n title=\"Remove attachment\"\n >\n <X size={14} className=\"w-3.5 h-3.5\" weight=\"bold\" />\n </button>\n )}\n </div>\n )\n})\n\nAttachmentPreview.displayName = 'AttachmentPreview'\n\nexport default AttachmentPreview\n","/**\n * AttachmentUpload Component\n * Handles file selection and base64 encoding for chat attachments\n * Provides loading states, validation, and error handling\n */\n\nimport { memo, useRef, useCallback, useState } from 'react'\nimport { Paperclip, CircleNotch } from '@phosphor-icons/react'\nimport { Attachment } from '../types'\nimport {\n ATTACHMENT_ACCEPT_ATTRIBUTE,\n convertToBase64,\n createDataUrl,\n formatFileSize,\n isImageMimeType,\n validateAttachmentFile,\n} from '../utils/fileUtils'\nimport { useToast } from '../hooks/useToast'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface AttachmentError {\n filename: string\n error: string\n}\n\ninterface AttachmentUploadProps {\n /** Callback fired when files are successfully converted and validated */\n onAttachmentsSelected: (attachments: Attachment[]) => void\n /** Maximum number of attachments allowed (default: 10) */\n maxAttachments?: number\n /** Maximum file size in bytes (default: 20 MB) */\n maxSizeBytes?: number\n /** Whether the component is disabled */\n disabled?: boolean\n}\n\nconst AttachmentUpload = memo<AttachmentUploadProps>(\n ({ onAttachmentsSelected, maxAttachments = 10, maxSizeBytes = 20 * 1024 * 1024, disabled = false }) => {\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [isLoading, setIsLoading] = useState(false)\n const toast = useToast()\n const { t } = useTranslation()\n\n /**\n * Handles file selection from the input element\n * Validates, converts to base64, and calls onAttachmentsSelected\n */\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || [])\n\n // Reset input so same file selection can be processed again\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n\n if (files.length === 0) {\n return\n }\n\n setIsLoading(true)\n\n try {\n // Validate file count\n if (files.length > maxAttachments) {\n toast.error(t('error.maxFiles', { max: maxAttachments, selected: files.length }))\n setIsLoading(false)\n return\n }\n\n const attachments: Attachment[] = []\n const errors: AttachmentError[] = []\n\n // Process each file\n for (const file of files) {\n // Validate file\n try {\n validateAttachmentFile(file, maxSizeBytes)\n } catch (validationErr) {\n errors.push({ filename: file.name, error: validationErr instanceof Error ? validationErr.message : String(validationErr) })\n continue\n }\n\n try {\n // Convert to base64\n const base64Data = await convertToBase64(file)\n const attachment: Attachment = {\n id: '',\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data,\n }\n if (isImageMimeType(file.type)) {\n attachment.preview = createDataUrl(base64Data, file.type)\n }\n\n attachments.push(attachment)\n } catch (err) {\n errors.push({\n filename: file.name,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n // Show error toasts for failed files\n if (errors.length > 0) {\n errors.forEach((err) => {\n toast.error(`${err.filename}: ${err.error}`)\n })\n }\n\n // Call parent callback with successful attachments\n if (attachments.length > 0) {\n onAttachmentsSelected(attachments)\n const message =\n attachments.length === 1\n ? t('attachment.fileAdded', { size: formatFileSize(attachments[0].sizeBytes) })\n : t('attachment.fileAdded', { size: `${attachments.length} files` })\n toast.success(message)\n } else if (errors.length > 0) {\n toast.error(t('attachment.invalidFile'))\n }\n } finally {\n setIsLoading(false)\n }\n },\n [maxAttachments, maxSizeBytes, onAttachmentsSelected, toast, t]\n )\n\n /**\n * Triggers the hidden file input\n */\n const handleClick = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const isDisabled = disabled || isLoading\n\n return (\n <div className=\"relative\">\n {/* Hidden File Input */}\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={ATTACHMENT_ACCEPT_ATTRIBUTE}\n onChange={handleFileSelect}\n disabled={isDisabled}\n className=\"sr-only\"\n aria-label={t('attachment.selectFiles')}\n />\n\n {/* Trigger Button */}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled}\n className=\"\n flex items-center justify-center\n w-8 h-8\n text-gray-600 dark:text-gray-400\n hover:text-gray-800 dark:hover:text-gray-200\n hover:bg-gray-100 dark:hover:bg-gray-700\n disabled:text-gray-400 dark:disabled:text-gray-600\n disabled:opacity-50 disabled:cursor-not-allowed\n rounded-lg\n transition-all\n duration-200\n active:scale-95\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50\n \"\n aria-label={t('attachment.selectFiles')}\n aria-busy={isLoading}\n >\n {isLoading ? (\n <CircleNotch size={20} className=\"w-5 h-5 animate-spin\" weight=\"fill\" />\n ) : (\n <Paperclip size={20} className=\"w-5 h-5\" weight=\"fill\" />\n )}\n </button>\n </div>\n )\n }\n)\n\nAttachmentUpload.displayName = 'AttachmentUpload'\n\nexport default AttachmentUpload\n","import { useEffect, useState } from 'react'\n\ninterface ScreenReaderAnnouncerProps {\n message: string\n politeness?: 'polite' | 'assertive'\n clearAfter?: number\n}\n\n/**\n * Screen reader announcer component for live region updates\n * Uses ARIA live regions to announce dynamic content changes\n *\n * @param message - The message to announce\n * @param politeness - 'polite' (wait for pause) or 'assertive' (immediate)\n * @param clearAfter - Optional milliseconds to clear message after announcement\n *\n * @example\n * <ScreenReaderAnnouncer\n * message=\"New message received\"\n * politeness=\"polite\"\n * />\n */\nexport default function ScreenReaderAnnouncer({\n message,\n politeness = 'polite',\n clearAfter,\n}: ScreenReaderAnnouncerProps) {\n const [announcement, setAnnouncement] = useState(message)\n\n useEffect(() => {\n setAnnouncement(message)\n\n if (clearAfter && message) {\n const timer = setTimeout(() => {\n setAnnouncement('')\n }, clearAfter)\n return () => clearTimeout(timer)\n }\n return undefined\n }, [message, clearAfter])\n\n return (\n <div\n role=\"status\"\n aria-live={politeness}\n aria-atomic=\"true\"\n className=\"sr-only\"\n >\n {announcement}\n </div>\n )\n}\n","/**\n * Skip to main content link for keyboard navigation\n * Hidden by default, visible on keyboard focus\n * Allows users to skip navigation and go directly to main content\n */\n\nimport { useTranslation } from '../hooks/useTranslation'\n\nexport default function SkipLink() {\n const { t } = useTranslation()\n\n return (\n <a\n href=\"#main-content\"\n className=\"sr-only focus-visible:not-sr-only focus-visible:absolute focus-visible:top-4 focus-visible:left-4 focus-visible:z-50 focus-visible:bg-primary-600 focus-visible:text-white focus-visible:px-4 focus-visible:py-2 focus-visible:rounded-lg focus-visible:shadow-lg\"\n >\n {t('skipLink.label')}\n </a>\n )\n}\n","/**\n * QuestionForm Component\n * Multi-step modal wizard for answering pending questions\n * Includes question steps and confirmation step with progress indicator\n * Supports custom \"Other\" text input for all questions\n */\n\nimport { useState } from 'react'\nimport { X } from '@phosphor-icons/react'\nimport { type PendingQuestion, type QuestionAnswers, type QuestionAnswerData } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\nimport QuestionStep from './QuestionStep'\nimport ConfirmationStep from './ConfirmationStep'\nimport { LoadingSpinner } from './LoadingSpinner'\nimport { isQuestionAnswered, validateAnswers } from '../utils/questionFormUtils'\n\ninterface QuestionFormProps {\n pendingQuestion: PendingQuestion\n sessionId: string\n onSubmit: (answers: QuestionAnswers) => Promise<void>\n onCancel: () => void\n}\n\nexport default function QuestionForm({\n pendingQuestion,\n onSubmit,\n onCancel,\n}: QuestionFormProps) {\n const { t } = useTranslation()\n const [currentStep, setCurrentStep] = useState(0)\n const [answers, setAnswers] = useState<QuestionAnswers>({})\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const questions = pendingQuestion.questions\n const isConfirmationStep = currentStep === questions.length\n const isFirstStep = currentStep === 0\n const isLastStep = currentStep === questions.length - 1\n\n // Check if current question is answered\n const currentQuestionAnswered =\n isConfirmationStep ||\n (questions[currentStep]?.id &&\n isQuestionAnswered(answers[questions[currentStep].id]))\n\n const handleAnswer = (answerData: QuestionAnswerData) => {\n const currentQuestion = questions[currentStep]\n if (currentQuestion) {\n setAnswers((prev) => ({\n ...prev,\n [currentQuestion.id]: answerData,\n }))\n }\n }\n\n const handleNext = () => {\n if (!currentQuestionAnswered) return\n if (isLastStep) {\n setCurrentStep(isConfirmationStep ? currentStep : currentStep + 1)\n } else {\n setCurrentStep(currentStep + 1)\n }\n }\n\n const handleBack = () => {\n if (currentStep > 0) {\n setCurrentStep(currentStep - 1)\n }\n }\n\n const handleSubmitAnswers = async () => {\n const validationError = validateAnswers(questions, answers, t)\n if (validationError) {\n setError(validationError)\n return\n }\n\n setIsSubmitting(true)\n setError(null)\n\n try {\n await onSubmit(answers)\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : t('error.generic')\n setError(errorMessage)\n setIsSubmitting(false)\n }\n }\n\n // Calculate progress text\n const totalSteps = questions.length + 1\n const progressText = isConfirmationStep\n ? t('questionForm.step', { current: totalSteps, total: totalSteps })\n : t('questionForm.step', { current: currentStep + 1, total: totalSteps })\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 p-4\">\n {/* Modal Container */}\n <div className=\"bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-2xl w-full max-h-[90vh] overflow-y-auto\">\n {/* Header */}\n <div className=\"border-b border-gray-200 dark:border-gray-700 p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {t('questionForm.title')}\n </h2>\n <button\n onClick={onCancel}\n disabled={isSubmitting}\n className=\"cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 disabled:opacity-50\"\n aria-label={t('common.close')}\n >\n <X className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* Progress Indicator */}\n <div className=\"text-sm text-gray-600 dark:text-gray-400\">\n {progressText}\n </div>\n\n {/* Progress Bar */}\n <div className=\"mt-3 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary-600 transition-all duration-300\"\n style={{\n width: `${((currentStep + 1) / totalSteps) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"p-6\">\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p className=\"text-red-700 dark:text-red-400 text-sm\">{error}</p>\n </div>\n )}\n\n {isConfirmationStep ? (\n <ConfirmationStep questions={questions} answers={answers} />\n ) : (\n <QuestionStep\n question={questions[currentStep]!}\n selectedAnswers={answers}\n onAnswer={handleAnswer}\n />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"border-t border-gray-200 dark:border-gray-700 p-6 flex gap-3 justify-between\">\n {/* Back Button */}\n {!isFirstStep && (\n <button\n onClick={handleBack}\n disabled={isSubmitting}\n className=\"cursor-pointer px-6 py-2 text-gray-700 dark:text-gray-300 bg-gray-100 dark:bg-gray-700 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 disabled:opacity-50 font-medium transition-colors\"\n >\n {t('questionForm.back')}\n </button>\n )}\n\n <div className=\"flex-1\" />\n\n {isConfirmationStep ? (\n <>\n {/* Cancel Button */}\n <button\n onClick={onCancel}\n disabled={isSubmitting}\n className=\"cursor-pointer px-6 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 disabled:opacity-50 font-medium transition-colors\"\n >\n {t('message.cancel')}\n </button>\n\n {/* Submit Button */}\n <button\n onClick={handleSubmitAnswers}\n disabled={isSubmitting}\n className=\"cursor-pointer px-6 py-2 bg-primary-600 hover:bg-primary-700 disabled:opacity-50 text-white rounded-lg font-medium transition-colors flex items-center gap-2\"\n >\n {isSubmitting && <LoadingSpinner size=\"sm\" />}\n {isSubmitting ? t('questionForm.submitting') : t('questionForm.confirm')}\n </button>\n </>\n ) : (\n /* Next Button */\n <button\n onClick={handleNext}\n disabled={!currentQuestionAnswered || isSubmitting}\n className=\"cursor-pointer px-6 py-2 bg-primary-600 hover:bg-primary-700 disabled:opacity-50 text-white rounded-lg font-medium transition-colors\"\n >\n {t('questionForm.next')}\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * QuestionStep Component\n * Displays a single question with options to select from\n * Supports both single-select (radio) and multi-select (checkboxes)\n * Includes automatic \"Other\" option for custom text input\n */\n\nimport { useState, useEffect } from 'react'\nimport { type Question, type QuestionAnswers, type QuestionAnswerData } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface QuestionStepProps {\n question: Question\n selectedAnswers: QuestionAnswers\n onAnswer: (answerData: QuestionAnswerData) => void\n}\n\nexport default function QuestionStep({\n question,\n selectedAnswers,\n onAnswer,\n}: QuestionStepProps) {\n const { t } = useTranslation()\n const answerData = selectedAnswers[question.id] || { options: [] }\n const selectedOptions = answerData.options || []\n const isMultiSelect = question.type === 'MULTIPLE_CHOICE'\n\n // Local state for \"Other\" text input\n const [otherText, setOtherText] = useState(answerData.customText || '')\n\n // Sync local state with props when switching questions\n useEffect(() => {\n const data = selectedAnswers[question.id] || { options: [] }\n setOtherText(data.customText || '')\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [question.id])\n\n const handleOptionClick = (optionLabel: string) => {\n if (isMultiSelect) {\n // Multi-select: toggle the option\n const newOptions = selectedOptions.includes(optionLabel)\n ? selectedOptions.filter((a) => a !== optionLabel)\n : [...selectedOptions, optionLabel]\n onAnswer({ options: newOptions, customText: otherText || undefined })\n } else {\n // Single-select: replace with new selection, preserve custom text\n onAnswer({ options: [optionLabel], customText: otherText || undefined })\n }\n }\n\n const handleOtherTextChange = (text: string) => {\n setOtherText(text)\n onAnswer({\n options: selectedOptions,\n customText: text || undefined\n })\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Question Header */}\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-2\">\n {question.text}\n </h3>\n </div>\n\n {/* Multi-select hint */}\n {isMultiSelect && (\n <p className=\"text-sm text-gray-500 dark:text-gray-500 italic\">\n {t('question.selectMulti')}\n </p>\n )}\n\n {/* Options Grid */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {(question.options || []).map((option) => {\n const isSelected = selectedOptions.includes(option.label)\n\n return (\n <button\n key={option.id}\n onClick={() => handleOptionClick(option.label)}\n className={`\n cursor-pointer relative p-4 text-left border-2 rounded-lg transition-all\n ${\n isSelected\n ? 'border-primary-500 bg-white dark:bg-gray-800'\n : 'border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 hover:border-gray-300 dark:hover:border-gray-600'\n }\n focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900\n `}\n type=\"button\"\n aria-pressed={isSelected}\n >\n <div className=\"flex items-start gap-3\">\n {/* Radio or Checkbox */}\n <div className=\"flex-shrink-0 mt-1\">\n {isMultiSelect ? (\n <input\n type=\"checkbox\"\n checked={isSelected}\n readOnly\n className=\"w-5 h-5 text-primary-600 border-gray-300 rounded focus:ring-0 dark:bg-gray-700 dark:border-gray-600\"\n />\n ) : (\n <input\n type=\"radio\"\n checked={isSelected}\n readOnly\n className=\"w-5 h-5 text-primary-600 border-gray-300 focus:ring-0 dark:bg-gray-700 dark:border-gray-600\"\n />\n )}\n </div>\n\n {/* Label */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-900 dark:text-white\">\n {option.label}\n </p>\n </div>\n </div>\n </button>\n )\n })}\n </div>\n\n {/* \"Other\" Text Input - always shown */}\n <div>\n <label htmlFor=\"other-input\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n {t('question.specifyOther')}:\n </label>\n <textarea\n id=\"other-input\"\n value={otherText}\n onChange={(e) => handleOtherTextChange(e.target.value)}\n placeholder={t('question.other')}\n rows={3}\n className=\"w-full px-4 py-3 border-2 border-gray-200 dark:border-gray-700 rounded-lg\n bg-white dark:bg-gray-800 text-gray-900 dark:text-white\n placeholder-gray-400 dark:placeholder-gray-500\n focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-primary-500\n resize-none\"\n />\n </div>\n </div>\n )\n}\n","/**\n * ConfirmationStep Component\n * Displays a summary of all questions and selected answers for review before submission\n * Supports both predefined options and custom \"Other\" text\n */\n\nimport { type Question, type QuestionAnswers } from '../types'\nimport { useTranslation } from '../hooks/useTranslation'\n\ninterface ConfirmationStepProps {\n questions: Question[]\n answers: QuestionAnswers\n}\n\nexport default function ConfirmationStep({\n questions,\n answers,\n}: ConfirmationStepProps) {\n const { t } = useTranslation()\n\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {t('questionForm.reviewTitle')}\n </h3>\n <p className=\"text-gray-600 dark:text-gray-400 mt-1\">\n {t('questionForm.reviewDescription')}\n </p>\n </div>\n\n {/* Questions Summary */}\n <div className=\"space-y-4\">\n {questions.map((question) => {\n const answerData = answers[question.id] || { options: [] }\n const selectedOptions = answerData.options || []\n const customText = answerData.customText\n\n const hasAnswer = selectedOptions.length > 0 || !!customText\n\n return (\n <div\n key={question.id}\n className=\"p-4 border border-gray-200 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800\"\n >\n {/* Question Text */}\n <h4 className=\"font-medium text-gray-900 dark:text-white mb-2\">\n {question.text}\n </h4>\n\n {/* Selected Answers as Tags */}\n {hasAnswer ? (\n <div className=\"flex flex-wrap gap-2\">\n {/* Predefined options */}\n {selectedOptions.map((option) => (\n <span\n key={option}\n className=\"inline-flex items-center px-3 py-1 rounded-lg text-sm font-medium border border-primary-500 bg-primary-500/10 text-primary-600 dark:border-primary-400 dark:bg-primary-400/10 dark:text-primary-400\"\n >\n {option}\n </span>\n ))}\n\n {/* Custom \"Other\" text - displayed with distinct styling */}\n {customText && (\n <span className=\"inline-flex items-center px-3 py-1 rounded-lg text-sm font-medium border border-amber-500 bg-amber-500/10 text-amber-600 dark:border-amber-400 dark:bg-amber-400/10 dark:text-amber-400\">\n <span className=\"font-semibold mr-1\">{t('question.other')}:</span>\n <span className=\"italic\">{customText}</span>\n </span>\n )}\n </div>\n ) : (\n <p className=\"text-sm text-gray-400 dark:text-gray-500 italic\">\n {t('questionForm.skip')}\n </p>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n","/**\n * Shared validation utilities for QuestionForm components\n */\n\nimport type { Question, QuestionAnswerData, QuestionAnswers } from '../types'\n\n/**\n * Checks if a question has been answered.\n * A question is answered if it has at least one selected option OR custom text.\n */\nexport function isQuestionAnswered(data: QuestionAnswerData | undefined): boolean {\n if (!data) return false\n return (data.options?.length ?? 0) > 0 || !!data.customText\n}\n\n/**\n * Validates that all questions are answered and custom text is valid.\n * Returns null if valid, or an error message string if invalid.\n *\n * @param questions - Array of questions to validate\n * @param answers - Map of question IDs to answer data\n * @param t - Optional translation function for error messages\n */\nexport function validateAnswers(\n questions: Question[],\n answers: QuestionAnswers,\n t?: (key: string, params?: Record<string, any>) => string\n): string | null {\n const allAnswered = questions.every((q) => isQuestionAnswered(answers[q.id]))\n if (!allAnswered) {\n return t ? t('error.allQuestionsRequired') : 'Please answer all questions before submitting'\n }\n\n for (const q of questions) {\n const data = answers[q.id]\n if (data && (data.options?.length ?? 0) === 0 && data.customText === '') {\n return t\n ? t('error.customTextRequired', { question: q.text })\n : `Please enter custom text for question: ${q.text}`\n }\n }\n\n return null\n}\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.type === 'content') && 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","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 * 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'\nimport { convertToBase64, createDataUrl, validateAttachmentFile } from '../utils/fileUtils'\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: 20MB) */\n maxFileSize?: number\n /** Allowed MIME types (default: attachment allowlist) */\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 = 20 * 1024 * 1024 // 20MB\nconst DEFAULT_ALLOWED_TYPES: string[] = []\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 * 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 if (allowedTypes.length > 0) {\n if (!allowedTypes.includes(file.type)) {\n return {\n file,\n reason: 'type',\n message: `File type \"${file.type || 'unknown'}\" not allowed`,\n }\n }\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 } else {\n try {\n validateAttachmentFile(file, maxFileSize)\n } catch (err) {\n const message = err instanceof Error ? err.message : `File \"${file.name}\" is not allowed`\n const reason: FileValidationError['reason'] = message.includes('large') ? 'size' : 'type'\n return {\n file,\n reason,\n message,\n }\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 try {\n const base64Data = await convertToBase64(file)\n attachment.base64Data = base64Data\n if (file.type.startsWith('image/')) {\n attachment.preview = createDataUrl(base64Data, file.type)\n }\n } catch {\n // Continue without content if conversion fails.\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 * useScrollToBottom Hook\n * Manages scroll-to-bottom functionality with smart auto-scroll\n * Only scrolls if user is near the bottom (within threshold)\n */\n\nimport { useRef, useCallback, useState, useEffect } from 'react'\n\nconst SCROLL_THRESHOLD = 100 // pixels from bottom to consider \"near bottom\"\n\nexport interface UseScrollToBottomReturn {\n /**\n * Ref to attach to the messages container\n */\n containerRef: React.RefObject<HTMLDivElement>\n\n /**\n * Whether to show the scroll-to-bottom button\n */\n showScrollButton: boolean\n\n /**\n * Function to scroll to bottom\n */\n scrollToBottom: () => void\n}\n\n/**\n * Hook for managing scroll-to-bottom behavior\n * Automatically scrolls if user is near the bottom\n * Shows button only when scrolled up significantly\n */\nexport function useScrollToBottom(items: unknown[]): UseScrollToBottomReturn {\n const containerRef = useRef<HTMLDivElement>(null)\n const [showScrollButton, setShowScrollButton] = useState(false)\n const isNearBottomRef = useRef(true)\n\n /**\n * Scroll to bottom smoothly\n */\n const scrollToBottom = useCallback(() => {\n if (containerRef.current) {\n containerRef.current.scroll({\n top: containerRef.current.scrollHeight,\n behavior: 'smooth',\n })\n isNearBottomRef.current = true\n setShowScrollButton(false)\n }\n }, [])\n\n /**\n * Handle scroll events to detect when user is near bottom\n */\n const handleScroll = useCallback(() => {\n if (!containerRef.current) return\n\n const element = containerRef.current\n const { scrollTop, scrollHeight, clientHeight } = element\n\n // Calculate how far from bottom\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight\n const isNearBottom = distanceFromBottom < SCROLL_THRESHOLD\n\n isNearBottomRef.current = isNearBottom\n setShowScrollButton(!isNearBottom && scrollHeight > clientHeight)\n }, [])\n\n /**\n * Auto-scroll when new items arrive (if near bottom)\n */\n useEffect(() => {\n if (isNearBottomRef.current) {\n // Use requestAnimationFrame for smooth scrolling\n const timer = setTimeout(() => {\n scrollToBottom()\n }, 0)\n return () => clearTimeout(timer)\n }\n return undefined\n }, [items, scrollToBottom])\n\n /**\n * Add scroll listener to container\n */\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n container.addEventListener('scroll', handleScroll, { passive: true })\n\n // Initial check - defer to avoid synchronous setState in effect\n const timerId = setTimeout(handleScroll, 0)\n\n return () => {\n container.removeEventListener('scroll', handleScroll)\n clearTimeout(timerId)\n }\n }, [handleScroll])\n\n return {\n containerRef,\n showScrollButton,\n scrollToBottom,\n }\n}\n","import { useEffect } from 'react'\n\nexport interface ShortcutConfig {\n key: string\n ctrl?: boolean\n shift?: boolean\n alt?: boolean\n meta?: boolean\n callback: () => void\n preventDefault?: boolean\n description?: string\n}\n\n/**\n * Hook for managing global keyboard shortcuts\n * Automatically handles modifier keys and input field exclusion\n *\n * @param shortcuts - Array of keyboard shortcut configurations\n *\n * @example\n * useKeyboardShortcuts([\n * { key: 'k', ctrl: true, callback: () => focusSearch(), description: 'Focus search' },\n * { key: '?', callback: () => setShowHelp(true), description: 'Show keyboard shortcuts' },\n * ])\n */\nexport function useKeyboardShortcuts(shortcuts: ShortcutConfig[]) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ignore if user is typing in input/textarea/contenteditable\n const target = e.target as HTMLElement\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target.isContentEditable\n ) {\n // Allow some shortcuts even in inputs (like Escape)\n const allowInInput = shortcuts.find(s =>\n s.key.toLowerCase() === e.key.toLowerCase() &&\n s.key.toLowerCase() === 'escape'\n )\n if (!allowInInput) {\n return\n }\n }\n\n // Find matching shortcut\n const matchingShortcut = shortcuts.find((s) => {\n const keyMatches = e.key.toLowerCase() === s.key.toLowerCase()\n const modMatches = s.meta\n ? e.metaKey && !e.ctrlKey\n : s.ctrl\n ? e.ctrlKey || e.metaKey\n : !e.ctrlKey && !e.metaKey\n const shiftMatches = s.shift ? e.shiftKey : !e.shiftKey\n const altMatches = s.alt ? e.altKey : !e.altKey\n\n return keyMatches && modMatches && shiftMatches && altMatches\n })\n\n if (matchingShortcut) {\n if (matchingShortcut.preventDefault !== false) {\n e.preventDefault()\n }\n matchingShortcut.callback()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [shortcuts])\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 rpc: 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 rpc: globalContext.config?.rpcUIEndpoint || '/rpc',\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","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: err,\n })\n throw err\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","/**\n * Built-in HTTP data source with SSE streaming and AbortController\n * Implements ChatDataSource interface with real HTTP/RPC calls\n *\n * Uses turn-based architecture - fetches ConversationTurns instead of flat messages.\n */\n\nimport { createAppletRPCClient } from '../../applet-host'\nimport type { BichatRPC, Session as RPCSession } from './rpc.generated'\nimport type {\n ChatDataSource,\n Session,\n SessionListResult,\n ConversationTurn,\n Artifact as DownloadArtifact,\n SessionArtifact,\n PendingQuestion,\n Question,\n Attachment,\n StreamChunk,\n QuestionAnswers,\n SendMessageOptions,\n} from '../types'\nimport { parseChartDataFromSpec } from '../utils/chartSpec'\nimport { convertToBase64, validateAttachmentFile, validateFileCount } from '../utils/fileUtils'\nimport type { PendingQuestion as RPCPendingQuestion } from './rpc.generated'\n\nexport interface HttpDataSourceConfig {\n baseUrl: string\n rpcEndpoint: string\n streamEndpoint?: string\n csrfToken?: string | (() => string)\n headers?: Record<string, string>\n timeout?: number\n /** Optional: called when a new session is created so the host app can navigate (e.g. SPA router) */\n navigateToSession?: (sessionId: string) => void\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\ninterface RPCArtifact {\n id: string\n sessionId: string\n messageId?: string\n type: string\n name: string\n description?: string\n mimeType?: string\n url?: string\n sizeBytes: number\n metadata?: Record<string, unknown>\n createdAt: string\n}\n\nfunction toSession(session: RPCSession): Session {\n return {\n ...session,\n status: session.status === 'archived' ? 'archived' : 'active',\n }\n}\n\nfunction toSessionArtifact(artifact: RPCArtifact): SessionArtifact {\n return {\n id: artifact.id,\n sessionId: artifact.sessionId,\n messageId: artifact.messageId,\n type: artifact.type,\n name: artifact.name,\n description: artifact.description,\n mimeType: artifact.mimeType,\n url: artifact.url,\n sizeBytes: artifact.sizeBytes,\n metadata: artifact.metadata,\n createdAt: artifact.createdAt,\n }\n}\n\nfunction toPendingQuestion(\n rpc: RPCPendingQuestion | null | undefined\n): PendingQuestion | null {\n if (!rpc) return null\n\n const questions: Question[] = (rpc.questions || []).map((q) => ({\n id: q.id,\n text: q.text,\n type: q.type as 'SINGLE_CHOICE' | 'MULTIPLE_CHOICE',\n options: (q.options || []).map((o) => ({\n id: o.id,\n label: o.label,\n value: o.label,\n })),\n }))\n\n return {\n id: rpc.checkpointId,\n turnId: rpc.turnId || '',\n questions,\n status: 'PENDING',\n }\n}\n\nfunction formatSizeReadable(bytes: number): string | undefined {\n if (!Number.isFinite(bytes) || bytes <= 0) return undefined\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n let value = bytes\n let idx = 0\n while (value >= 1024 && idx < units.length - 1) {\n value /= 1024\n idx++\n }\n const precision = idx === 0 ? 0 : value >= 10 ? 1 : 2\n return `${value.toFixed(precision)} ${units[idx]}`\n}\n\nfunction parseRowCount(metadata?: Record<string, unknown>): number | undefined {\n if (!metadata) return undefined\n const raw = metadata.row_count ?? metadata.rowCount\n if (typeof raw === 'number' && Number.isFinite(raw)) {\n return raw\n }\n if (typeof raw === 'string') {\n const parsed = Number.parseInt(raw, 10)\n if (Number.isFinite(parsed)) {\n return parsed\n }\n }\n return undefined\n}\n\nfunction inferDownloadType(artifact: SessionArtifact): DownloadArtifact['type'] | null {\n const mime = artifact.mimeType?.toLowerCase() || ''\n const name = artifact.name?.toLowerCase() || ''\n const cleanURL = artifact.url?.split('?')[0].toLowerCase() || ''\n\n const isPDF = mime.includes('pdf') || name.endsWith('.pdf') || cleanURL.endsWith('.pdf')\n if (isPDF) return 'pdf'\n\n const isExcel =\n mime.includes('spreadsheet') ||\n mime.includes('excel') ||\n name.endsWith('.xlsx') ||\n name.endsWith('.xls') ||\n cleanURL.endsWith('.xlsx') ||\n cleanURL.endsWith('.xls')\n if (isExcel) return 'excel'\n\n return null\n}\n\nfunction extractFilename(artifact: SessionArtifact): string {\n const name = artifact.name?.trim()\n if (name) return name\n\n const urlPath = artifact.url?.split('?')[0] || ''\n const fromURL = urlPath.split('/').filter(Boolean).pop()\n if (fromURL) return fromURL\n\n return 'download'\n}\n\nfunction toDownloadArtifact(artifact: SessionArtifact): DownloadArtifact | null {\n if (!artifact.url) return null\n const type = inferDownloadType(artifact)\n if (!type) return null\n\n return {\n type,\n filename: extractFilename(artifact),\n url: artifact.url,\n sizeReadable: formatSizeReadable(artifact.sizeBytes),\n rowCount: parseRowCount(artifact.metadata),\n description: artifact.description,\n }\n}\n\nfunction toMillis(value: string): number {\n const parsed = Date.parse(value)\n return Number.isFinite(parsed) ? parsed : Number.NaN\n}\n\nfunction attachArtifactsToTurns(\n turns: ConversationTurn[],\n artifacts: SessionArtifact[]\n): ConversationTurn[] {\n if (artifacts.length === 0) return turns\n\n const downloadArtifacts = artifacts\n .map((raw) => ({ raw, mapped: toDownloadArtifact(raw) }))\n .filter((entry): entry is { raw: SessionArtifact; mapped: DownloadArtifact } => entry.mapped !== null)\n .sort((a, b) => toMillis(a.raw.createdAt) - toMillis(b.raw.createdAt))\n\n const chartArtifacts = artifacts\n .filter((a) => a.type === 'chart')\n .sort((a, b) => toMillis(a.createdAt) - toMillis(b.createdAt))\n\n if (downloadArtifacts.length === 0 && chartArtifacts.length === 0) return turns\n\n const nextTurns = turns.map((turn) => {\n if (!turn.assistantTurn) {\n return turn\n }\n return {\n ...turn,\n assistantTurn: {\n ...turn.assistantTurn,\n artifacts: [...(turn.assistantTurn.artifacts || [])],\n },\n }\n })\n\n const assistantPositions: Array<{ index: number; createdAtMs: number }> = []\n const turnIndexByMessageID = new Map<string, number>()\n\n nextTurns.forEach((turn, index) => {\n turnIndexByMessageID.set(turn.userTurn.id, index)\n\n const assistantTurn = turn.assistantTurn\n if (!assistantTurn) return\n turnIndexByMessageID.set(assistantTurn.id, index)\n assistantPositions.push({\n index,\n createdAtMs: toMillis(assistantTurn.createdAt || turn.createdAt),\n })\n })\n\n if (assistantPositions.length === 0) return turns\n\n const findFallbackAssistantIndex = (artifactCreatedAt: string): number => {\n const artifactMs = toMillis(artifactCreatedAt)\n if (!Number.isFinite(artifactMs)) {\n return assistantPositions[assistantPositions.length - 1].index\n }\n for (const pos of assistantPositions) {\n if (Number.isFinite(pos.createdAtMs) && pos.createdAtMs >= artifactMs) {\n return pos.index\n }\n }\n return assistantPositions[assistantPositions.length - 1].index\n }\n\n for (const entry of downloadArtifacts) {\n const messageID = entry.raw.messageId\n const targetIndex =\n (messageID ? turnIndexByMessageID.get(messageID) : undefined) ??\n findFallbackAssistantIndex(entry.raw.createdAt)\n\n const assistantTurn = nextTurns[targetIndex]?.assistantTurn\n if (!assistantTurn) continue\n\n const exists = assistantTurn.artifacts.some(\n (existing) =>\n existing.url === entry.mapped.url && existing.filename === entry.mapped.filename\n )\n if (!exists) {\n assistantTurn.artifacts.push(entry.mapped)\n }\n }\n\n for (const raw of chartArtifacts) {\n const messageID = raw.messageId\n const targetIndex =\n (messageID ? turnIndexByMessageID.get(messageID) : undefined) ??\n findFallbackAssistantIndex(raw.createdAt)\n\n const assistantTurn = nextTurns[targetIndex]?.assistantTurn\n if (!assistantTurn) continue\n\n if (assistantTurn.chartData) continue\n\n const metadata = raw.metadata\n if (!metadata || typeof metadata !== 'object' || metadata === null) continue\n const spec =\n metadata.spec && typeof metadata.spec === 'object' && metadata.spec !== null\n ? (metadata.spec as Record<string, unknown>)\n : (metadata as Record<string, unknown>)\n\n const chartData = parseChartDataFromSpec(spec, raw.name)\n if (chartData) {\n assistantTurn.chartData = chartData\n }\n }\n\n return nextTurns\n}\n\nexport class HttpDataSource implements ChatDataSource {\n private config: HttpDataSourceConfig\n private abortController: AbortController | null = null\n private rpc: ReturnType<typeof createAppletRPCClient>\n\n constructor(config: HttpDataSourceConfig) {\n this.config = {\n streamEndpoint: '/stream',\n timeout: 30000,\n ...config,\n }\n if (config.navigateToSession) {\n this.navigateToSession = config.navigateToSession\n }\n this.rpc = createAppletRPCClient({\n endpoint: `${this.config.baseUrl}${this.config.rpcEndpoint}`,\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 private async callRPC<TMethod extends keyof BichatRPC & string>(\n method: TMethod,\n params: BichatRPC[TMethod]['params']\n ): Promise<BichatRPC[TMethod]['result']> {\n return this.rpc.callTyped<BichatRPC, TMethod>(method, params)\n }\n\n /**\n * Create a new chat session\n */\n async createSession(): Promise<Session> {\n const data = await this.callRPC('bichat.session.create', { title: '' })\n return toSession(data.session)\n }\n\n /**\n * Fetch an existing session with turns (turn-based architecture)\n */\n async fetchSession(id: string): Promise<SessionState | null> {\n try {\n const [data, artifactsData] = await Promise.all([\n this.callRPC('bichat.session.get', { id }),\n this.fetchSessionArtifacts(id, { limit: 200, offset: 0 }).catch((err) => {\n console.warn('Failed to fetch session artifacts:', err)\n return { artifacts: [] as SessionArtifact[], hasMore: false, nextOffset: 0 }\n }),\n ])\n\n const turns = attachArtifactsToTurns(data.turns as ConversationTurn[], artifactsData.artifacts || [])\n\n return {\n session: toSession(data.session),\n turns,\n pendingQuestion: toPendingQuestion(data.pendingQuestion),\n }\n } catch (err) {\n console.error('Failed to fetch session:', err)\n return null\n }\n }\n\n async fetchSessionArtifacts(\n sessionId: string,\n options?: { limit?: number; offset?: number }\n ): Promise<{ artifacts: SessionArtifact[]; hasMore?: boolean; nextOffset?: number }> {\n const limit = options?.limit ?? 50\n const offset = options?.offset ?? 0\n const data = await this.callRPC('bichat.session.artifacts', {\n sessionId,\n limit,\n offset,\n })\n\n const artifacts = (data.artifacts || []).map((artifact) => toSessionArtifact(artifact))\n const hasMore =\n typeof data.hasMore === 'boolean'\n ? data.hasMore\n : artifacts.length >= limit\n const nextOffset =\n typeof data.nextOffset === 'number'\n ? data.nextOffset\n : offset + artifacts.length\n\n return {\n artifacts,\n hasMore,\n nextOffset,\n }\n }\n\n async uploadSessionArtifacts(\n sessionId: string,\n files: File[]\n ): Promise<{ artifacts: SessionArtifact[] }> {\n if (!Array.isArray(files) || files.length === 0) {\n return { artifacts: [] }\n }\n\n validateFileCount(0, files.length, 10)\n const attachments: Attachment[] = []\n for (const file of files) {\n validateAttachmentFile(file)\n const base64Data = await convertToBase64(file)\n attachments.push({\n filename: file.name,\n mimeType: file.type,\n sizeBytes: file.size,\n base64Data,\n })\n }\n\n const data = await this.callRPC('bichat.session.uploadArtifacts', {\n sessionId,\n attachments: attachments.map((a) => ({\n id: '',\n filename: a.filename,\n mimeType: a.mimeType,\n sizeBytes: a.sizeBytes,\n base64Data: a.base64Data,\n })),\n })\n\n return {\n artifacts: (data.artifacts || []).map((artifact) => toSessionArtifact(artifact)),\n }\n }\n\n async renameSessionArtifact(\n artifactId: string,\n name: string,\n description: string = ''\n ): Promise<SessionArtifact> {\n const data = await this.callRPC('bichat.artifact.update', {\n id: artifactId,\n name,\n description,\n })\n return toSessionArtifact(data.artifact as RPCArtifact)\n }\n\n async deleteSessionArtifact(artifactId: string): Promise<void> {\n await this.callRPC('bichat.artifact.delete', { id: artifactId })\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 options?: SendMessageOptions\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 debugMode: options?.debugMode ?? false,\n replaceFromMessageId: options?.replaceFromMessageID,\n attachments: attachments.map(a => ({\n filename: a.filename,\n mimeType: a.mimeType,\n sizeBytes: a.sizeBytes,\n base64Data: a.base64Data,\n url: a.url,\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 parsed = JSON.parse(data) as StreamChunk & { chunk?: string }\n const inferredType =\n parsed.type || (parsed.content || parsed.chunk ? 'content' : 'error')\n const normalized: StreamChunk = {\n ...parsed,\n type: inferredType,\n content: parsed.content ?? parsed.chunk,\n }\n yield normalized\n\n // Stop if done or error\n if (normalized.type === 'done' || normalized.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 * Clear session history in-place.\n */\n async clearSessionHistory(sessionId: string): Promise<{\n success: boolean\n deletedMessages: number\n deletedArtifacts: number\n }> {\n return this.callRPC('bichat.session.clear', { id: sessionId })\n }\n\n /**\n * Compact session history into summarized turn.\n */\n async compactSessionHistory(sessionId: string): Promise<{\n success: boolean\n summary: string\n deletedMessages: number\n deletedArtifacts: number\n }> {\n return this.callRPC('bichat.session.compact', { id: sessionId })\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 try {\n // Convert QuestionAnswers to flat map[string]string for RPC\n const flatAnswers: Record<string, string> = {}\n for (const [qId, answerData] of Object.entries(answers)) {\n if (answerData.customText) {\n flatAnswers[qId] = answerData.customText\n } else if (answerData.options.length > 0) {\n flatAnswers[qId] = answerData.options.join(', ')\n }\n }\n await this.callRPC('bichat.question.submit', {\n sessionId,\n checkpointId: questionId,\n answers: flatAnswers,\n })\n return { success: true }\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : 'Unknown error' }\n }\n }\n\n /**\n * Reject a pending question\n */\n async rejectPendingQuestion(sessionId: string): Promise<Result<void>> {\n try {\n await this.callRPC('bichat.question.reject', { sessionId })\n return { success: true }\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : 'Unknown error' }\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 // Session management\n async listSessions(options?: {\n limit?: number\n offset?: number\n includeArchived?: boolean\n }): Promise<SessionListResult> {\n const data = await this.callRPC('bichat.session.list', {\n limit: options?.limit ?? 200,\n offset: options?.offset ?? 0,\n includeArchived: options?.includeArchived ?? false,\n })\n return {\n sessions: data.sessions.map(toSession),\n total: typeof data.total === 'number' ? data.total : data.sessions.length,\n hasMore: typeof data.hasMore === 'boolean' ? data.hasMore : false,\n }\n }\n async archiveSession(sessionId: string): Promise<Session> {\n const data = await this.callRPC('bichat.session.archive', { id: sessionId })\n return toSession(data.session)\n }\n async unarchiveSession(sessionId: string): Promise<Session> {\n const data = await this.callRPC('bichat.session.unarchive', { id: sessionId })\n return toSession(data.session)\n }\n async pinSession(sessionId: string): Promise<Session> {\n const data = await this.callRPC('bichat.session.pin', { id: sessionId })\n return toSession(data.session)\n }\n async unpinSession(sessionId: string): Promise<Session> {\n const data = await this.callRPC('bichat.session.unpin', { id: sessionId })\n return toSession(data.session)\n }\n async deleteSession(sessionId: string): Promise<void> {\n await this.callRPC('bichat.session.delete', { id: sessionId })\n }\n async renameSession(sessionId: string, title: string): Promise<Session> {\n const data = await this.callRPC('bichat.session.updateTitle', { id: sessionId, title })\n return toSession(data.session)\n }\n async regenerateSessionTitle(sessionId: string): Promise<Session> {\n const data = await this.callRPC('bichat.session.regenerateTitle', { id: sessionId })\n return toSession(data.session)\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 * SSE stream parser for consuming Server-Sent Events.\n */\n\nexport interface SSEEvent {\n type: string\n content?: string\n error?: string\n sessionId?: string\n toolName?: string\n toolCallId?: string\n durationMs?: number\n success?: boolean\n [key: string]: unknown\n}\n\n/**\n * Helper function to process SSE data lines and parse JSON events.\n */\nfunction* processDataLines(lines: string[]): Generator<SSEEvent, void, unknown> {\n for (const line of lines) {\n if (line.startsWith(':')) continue\n\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6)\n if (jsonStr === '[DONE]') continue\n\n try {\n const parsed = JSON.parse(jsonStr) as SSEEvent\n yield parsed\n } catch (err) {\n console.error('SSE parse error:', err, 'Data:', jsonStr)\n // Yield error event so consumer can react appropriately\n yield {\n type: 'error',\n error: 'Failed to parse SSE event',\n }\n }\n }\n }\n}\n\n/**\n * Parses an SSE stream and yields parsed JSON events.\n */\nexport async function* parseSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<SSEEvent, void, unknown> {\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const events = buffer.split('\\n\\n')\n buffer = events.pop() || ''\n\n for (const event of events) {\n if (!event.trim()) continue\n yield* processDataLines(event.split('\\n'))\n }\n }\n\n // Process any remaining data in buffer\n if (buffer.trim()) {\n yield* processDataLines(buffer.split('\\n'))\n }\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * Date formatting utilities using date-fns\n */\n\nimport { differenceInMinutes, differenceInHours, differenceInDays, format } from 'date-fns'\n\n/**\n * Format a date as relative time (e.g., \"5m ago\", \"2h ago\")\n * Falls back to HH:mm format for dates older than 24 hours\n *\n * Accepts an optional `t` function for i18n. Translation keys used:\n * - relativeTime.justNow\n * - relativeTime.minutesAgo (receives `{count}`)\n * - relativeTime.hoursAgo (receives `{count}`)\n * - relativeTime.daysAgo (receives `{count}`)\n *\n * If no `t` function is provided, falls back to English defaults.\n */\nexport function formatRelativeTime(\n date: string | Date,\n t?: (key: string, params?: Record<string, string | number>) => string\n): string {\n const messageDate = new Date(date)\n const now = new Date()\n\n const diffMins = differenceInMinutes(now, messageDate)\n const diffHours = differenceInHours(now, messageDate)\n const diffDays = differenceInDays(now, messageDate)\n\n if (diffMins < 1) {\n return t ? t('relativeTime.justNow') : 'Just now'\n }\n if (diffMins < 60) {\n return t ? t('relativeTime.minutesAgo', { count: diffMins }) : `${diffMins}m ago`\n }\n if (diffHours < 24) {\n return t ? t('relativeTime.hoursAgo', { count: diffHours }) : `${diffHours}h ago`\n }\n if (diffDays <= 7) {\n return t ? t('relativeTime.daysAgo', { count: diffDays }) : `${diffDays}d ago`\n }\n\n return format(messageDate, 'HH:mm')\n}\n"]}